ddflow
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| ddflow_abandonA | Stop work on an item without completing it, with a reason. Use when a task turns out to be unnecessary or impossible. DIFFERENT from blocking: a blocked item is waiting and will resume; an abandoned one will not, and so it stops holding its phase open — which an unfinished task otherwise does forever, since nothing can ever finish it. |
| ddflow_blockA | Mark an item blocked on something outside the queue — a missing decision, an upstream outage, a question for the operator. Better than silently leaving it claimed: a blocked item states its reason, while a claimed one that nobody is working just looks busy until the lease expires. |
| ddflow_boardB | The whole work queue as a readable board, with the critical path. |
| ddflow_briefA | START HERE every session. Returns a budgeted pack: work recoverable after a crash, the current item, what is ready to start now, why everything else is blocked, and the past lessons ranked as relevant to this task. Use this INSTEAD of reading the project's lesson or rule files — it is the same information retrieved for the task at hand, at a fraction of the tokens. |
| ddflow_bug_fixedA | Close a bug. Requires the name of the regression test that would catch it again — write the test, watch it FAIL against the unfixed code, then close. |
| ddflow_bug_foundA | Report a bug the moment you find it, BEFORE fixing it. Recording it first is what makes the fix accountable: |
| ddflow_cadenceB | Which periodic whole-repo passes are due — integration tests, architecture review, mutation testing, dedupe sweep, lessons compression. Derived from completed work, so there is no state file to drift. |
| ddflow_claimA | Lease an item and create its isolated git worktree. Refuses (exit 3) if another agent holds it or holds an item whose file globs overlap, and names what you could take instead. NEVER steals an expired lease: a crashed agent's worktree often holds finished work. |
| ddflow_cleanupA | Classify every ddflow worktree and branch: merged (safe to remove), unmerged (carries commits nobody landed), dirty (uncommitted edits — a human looks), orphan, or stale branch. Reports by default; with apply=true it removes merged worktrees and branches and lands commits for items the queue already considers done. A dirty tree is NEVER touched automatically, whatever you pass — it is the only thing here that exists nowhere else. |
| ddflow_companionsA | Which companion MCP servers serve this project's gates, which are installed on this machine, and which are wired into an agent's config. ddflow imposes the pipeline; it does not perform the judgement inside most gates — |
| ddflow_companions_addA | Register companion MCP servers that are ALREADY installed into an agent's MCP config, merging rather than overwriting what is there. Refuses (exit 3) to register one that is not installed, because that writes a launch command which fails mid-task, at the moment a gate told the agent to reach for it. |
| ddflow_completeA | Finish an item. Refuses (exit 3) when a required gate has not passed, when a phase still has open tasks, or when no reviewer came from a different model family than the author. Pass your own model as 'model'. |
| ddflow_configureA | Read or write .ddflow/config.toml. With no arguments it prints every knob, its value, its source and what it does. With |
| ddflow_decision_addA | Record an architectural decision so the project stays consistent and the reasoning survives. Use when you or the operator settle a question about HOW the software is built — a data representation, a boundary, a library choice, an invariant. ALWAYS set |
| ddflow_decision_applicableA | The architectural decisions that govern a specific item's declared files. CALL THIS BEFORE IMPLEMENTING: it is how a decision reaches the person writing the code, without them having to know it exists. Returns project-wide decisions too. |
| ddflow_decision_listA | Every architectural decision in force. Superseded ones are hidden unless you ask for them — they are kept, never deleted, because how the architecture got here is what a rebuild needs. |
| ddflow_decision_showA | Read ONE architectural decision in full — its context, what was decided, the consequences, and what was rejected. |
| ddflow_decision_supersedeA | Mark a decision replaced by a newer one. Decisions are never edited or deleted; a reversal is a new decision that names the old one. |
| ddflow_doctorB | Integrity and health check: log corruption, dependency cycles, unknown dependencies, orphaned worktrees, stale index. |
| ddflow_gate_recordA | Record the outcome of a gate you performed (research, a review, a bug hunt). outcome is one of passed/failed/unavailable/partial/skipped. IMPORTANT: if a reviewer or tool could not run, record 'unavailable' with a reason — recording it as 'passed' is how an entire review silently vanishes. Pass the reviewer's model so family independence can be checked. |
| ddflow_gate_runA | Execute a command gate (tests, linters) and record the result with its evidence. Agent gates cannot be run this way; they are recorded with ddflow_gate_record. |
| ddflow_gate_skipA | Skip a gate ON THE RECORD, with a mandatory reason. This is the auditable escape hatch, and it is the one to reach for: |
| ddflow_gate_statusA | Where an item stands in its quality pipeline, which gate is next, and the instruction for that gate. Gates marked '?' did not run — that is a coverage gap, never a pass. |
| ddflow_gate_verifyA | Break what a gate guards and require it to NOTICE. Applies each mutation registered on the gate, runs it, requires a non-zero exit, and restores the file. This is the anti-vacuous-pass check turned on the checks themselves. A gate that cannot fail is worse than no gate: it reports success on every change and everyone downstream reads that as evidence. Exit 1 means the gate did NOT catch its mutation — or that nobody has registered one, which is the same problem earlier. A mutation whose |
| ddflow_heartbeatA | Renew the lease on an item. Call periodically during long work, or the lease expires and another agent may take the item. |
| ddflow_helpA | What ddflow IS, what it can do, and what the workflow is. Call this first if you have not used it before — the other tool descriptions explain one tool each to someone who already knows which to pick, and the connection instructions describe THIS repository right now. Neither answers 'how am I meant to work here'. With no argument: the loop from picking work to landing it, what the exit codes mean, and every capability grouped by what it is for. With a Read-only. The pages are templates a project can override, so what this returns may be this project's own instructions rather than the defaults. |
| ddflow_historyA | ONE timeline of everything that happened, in the order it happened: claims, releases, gates, bugs, decisions, lessons, completions. The other views answer 'what is true now'; this one answers 'how did it get like this', which is the question you have when something looks wrong. Filter with |
| ddflow_hooksA | Inspect or install the enforcement git hook — the one layer of this workflow that does not depend on the agent agreeing. It refuses a commit touching paths no live lease of yours covers. |
| ddflow_importA | For a project that ALREADY HAS HISTORY and is adopting ddflow now: read its todo checklists, lessons corpus, ADR files and unmerged branches, and propose them as queue items. Reports by default and writes NOTHING until Call this right after The proposal is a GUESS about structure — headings became phases, checkboxes became tasks, and almost nothing has globs. Use the |
| ddflow_import_verifyA | Was this project's history imported, is that import still true, and did anyone FINISH it? Read-only; writes nothing. Three answers in one call. STATUS: how many phases, tasks, branches, lessons, decisions, research notes, journal entries and memories carry import provenance, and when. STILL TRUE: whether the source files have moved on since (and what a re-run would add), and whether any imported item names a source file that no longer exists. FINISHED: the half the Call it after any import, and whenever you are about to hand out imported work. Exit 1 means findings you should put to the operator; exit 2 means nothing was ever imported, which is an answer, not a failure. It does not repeat what |
| ddflow_lesson_addA | Record a lesson so it is never re-learned. Use after any bug, any operator correction, any surprise. Make the rule transferable — a future agent on a different task must be able to apply it. |
| ddflow_lesson_searchA | Search past lessons by relevance (BM25). Use before starting work, and whenever something surprises you. |
| ddflow_loopsA | Detect circular references and runtime loops: dependency cycles, an item claimed and given up over and over, a gate whose verdict keeps flipping, work completed and reopened repeatedly, duplicate items writing the same files, and a queue where events keep arriving but nothing advances. CALL THIS WHEN WORK FEELS REPETITIVE — it is the check that tells you to stop and re-plan rather than trying the same thing again. Returns [] when there is nothing wrong. |
| ddflow_mergeA | Merge an item's branch into the base branch from the primary checkout, without ever switching its branch. |
| ddflow_nextA | What may be started RIGHT NOW, and for everything that may not, the reason. Independent items in the ready set can be run in parallel worktrees by separate agents. Returns ready=[] when nothing is actionable — that is a result, not an error, and it never means 'pick something anyway'. |
| ddflow_phase_addA | Add a phase to the queue. A phase is a unit of REVIEW: it gets its own research, its own whole-phase test pass and live smoke run, and it merges as one coherent feature. Group tasks into a phase when they only make sense shipped together. |
| ddflow_progressA | What work has ACTUALLY been done, aggregated from the event log: attempts per item, wall-clock held, gate runs, commits produced, and who did them. Use it to answer 'how much effort has gone into this' and to see an item's full gate history including the outcomes that were not passes. |
| ddflow_promptsA | Inspect the prompt templates this project uses, and where each comes from (shipped default, project override, or an explicit config path). Use |
| ddflow_rebuildA | Re-derive the search index from the event log. The index is a disposable cache; this is never a data-loss operation. |
| ddflow_recallA | 'HAVE WE BEEN HERE BEFORE?' — one search across everything this project remembers: architectural decisions, lessons learned, research verdicts, past bugs, similar tasks, and the operator's own earlier prompts. CALL THIS BEFORE STARTING ANY NON-TRIVIAL WORK. It exists so the operator does not have to say the same thing twice and you do not have to learn the same thing twice. Results are labelled by kind, because a binding decision, a transferable lesson and a prompt from three weeks ago should change what you do in different ways. A decision marked superseded names its replacement — follow the replacement. |
| ddflow_recoverA | Find work left behind by a crashed agent: expired leases, orphaned worktrees, items stuck running. Reports what each worktree contains and never deletes anything. Run this at the start of any session that follows an interruption. |
| ddflow_releaseA | Give up a lease without completing the item — when you are handing off, stopping, or recovering someone else's abandoned work after inspecting it. The note is recorded in the log and is often the only lasting explanation of why a claim was broken. |
| ddflow_removeA | Take an item out of the queue. The log is append-only, so this RECORDS a removal rather than erasing anything — the item stays in the history and in replay, which keeps the record honest about work that was planned and then dropped. Refuses if another item depends on it. |
| ddflow_renderB | Regenerate the human-readable markdown views (queue, lessons, research) under docs/ddflow/. |
| ddflow_replayA | Reconstruct the project's whole decision history from the log: every operator prompt in order, every architectural decision, every research verdict, every lesson, and the shape of the queue. This is what rebuilds the project if the code is lost — it reproduces the DECISIONS, not the bytes. |
| ddflow_research_addA | Record a research finding. verdict MUST be CONFIRMED, REFUTED or THEORETICAL, and CONFIRMED/REFUTED require a probe — a verdict with no probe behind it is an opinion. A REFUTED entry is as valuable as an adopted one: it stops the next session re-researching it. |
| ddflow_reviewA | Run the configured cross-family reviewer over an item's diff and record the result. This is the critic gate performed by ddflow rather than claimed by you — it calls a real endpoint, parses the verdict, and records the evidence. If no reviewer is configured, or the endpoint is unreachable, or the model returns no verdict, it records UNAVAILABLE and never a pass. |
| ddflow_reviewers_detectA | Probe well-known local ports for an OpenAI-compatible model server (ollama, vLLM, LM Studio, llama.cpp, sglang) and report what is serving, with each model's pretraining family. Use this to find a reviewer from a DIFFERENT family than yourself — which the critic gate requires. Pass write=true to add what it finds to .ddflow/config.toml. |
| ddflow_reviewers_listA | Show the configured reviewers, their families and which gates they serve. |
| ddflow_session_endA | Close a session with a summary of what it achieved. The summary is what a later reader sees before deciding whether to open the whole transcript, so write it for someone who was not there. |
| ddflow_session_noteA | Record something that happened during a session which is neither an operator prompt nor a decision — a surprise, a dead end, why you changed approach. It goes into the reconstruction alongside the prompts, and a dead end recorded is a dead end nobody walks down twice. |
| ddflow_session_promptA | Record the operator's prompt verbatim. This is what makes the project reconstructible from the log alone if everything else is lost. Secrets are redacted before anything touches disk. Call it once per operator turn. |
| ddflow_session_startB | Open a session for provenance logging. Returns the session id. |
| ddflow_setupA | Install ddflow into this repository: creates .ddflow/, writes the driver and the AGENTS.md section, and registers nothing else. Run this ONCE per project, then set your test command with ddflow_configure. Safe to re-run — it updates a managed block and leaves your own prose alone. |
| ddflow_showA | Everything known about one phase or task: state, dependencies, declared globs, the lease and who holds it, the worktree path you can cd to, and every gate's outcome with its evidence. Use it to check your own work before calling ddflow_complete. |
| ddflow_splitA | Split an item into sub-tasks IN PLACE when the work turns out to be two things. Use this the moment you discover it — mid-task discovery is the normal case, not an exception. The original keeps its id and history and becomes an umbrella that completes when its children do; closing it and opening two new ones instead would lose the thread between what was planned and what happened. Children inherit the parent's globs, so give each its own afterwards if they write different files — until then they cannot run in parallel. |
| ddflow_statusA | The state of the whole project in one answer: how many tasks are done and which, what is in flight and who holds it, what is ready to start, what is blocked, how many agent-hours and commits went in, and whether anything is looping or waiting to be recovered. This is the tool for 'what is the status of this project?' and 'what has been completed?'. |
| ddflow_task_addA | Add a task to a phase. ALWAYS set globs to the paths this task will write: they are what lets two agents work in parallel safely, and an unset glob means the conflict detector cannot protect you. |
| ddflow_updateA | Change an item's fields. MOST IMPORTANT USE: widening |
| ddflow_workflowA | The rules THIS project runs by, in one answer: the gates every task and phase passes through in order, which are commands and which you perform yourself, which are required, which need evidence, which need a different-family reviewer, which have been PROVEN able to fail — plus the completion rules, the parallelism caps, the reviewers, and where each value came from (a default, this project's config, or the environment). Call it before your first Exit 1 means the workflow does not hang together — most importantly a pipeline naming a gate that has no definition, which blocks every item that reaches it forever. Read-only. |
| ddflow_workflow_dropA | Take a gate out of both pipelines, and out of The gate's DEFINITION is left in place, so putting it back is one call. Exit 2 means it was in neither pipeline. Ask the operator first: a gate in a pipeline is a check somebody added on purpose, and removing it weakens every future item. |
| ddflow_workflow_gateA | Define or change one gate, and optionally put it in a pipeline. WRITES to this project's config.
Ask the operator first, and prefer dry_run to show them the change. |
| ddflow_workflow_pipelineA | Set the ordered list of gates a task or a phase must pass. WRITES to this project's config. Validated before anything is written: a gate id with no definition is REFUSED and the error names the near miss, because an undefined gate in a pipeline blocks every item that reaches it and cannot be recorded or skipped. Define the gate first with Ask the operator before changing a pipeline. It governs every future item, not the one you are working on, and removing a gate removes a check somebody added deliberately. Use dry_run to show them what it would do. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| all-tests | Clean first, then run every configured suite (unit, integration, UI, e2e) in full, and fix failures under the bug-hunt rule. An unconfigured suite is absent, not passing. |
| bug-hunt | Bounded bug hunt under the empirical-repro rule: a finding may not change source unless a runnable probe demonstrates it and ships as the regression test, mutation-verified. |
| code-clean | Classify every worktree and branch, deal with dirty trees by hand, land the unmerged work through its gates, remove what is finished, then bug-hunt, deduplicate and commit. |
| code-deduplication | Mechanical clone report first, then grep by OPERATION. Second occurrence: reuse or extract. Third: extraction is mandatory. Prefer eliminating a duplicate over guarding it twice. |
| import-existing-project | For a project that adopts ddflow mid-stream. Reads its todo checklists, lessons, ADRs, research log, engineering journal, memory store and unmerged branches, then walks the agent through the half that needs judgement — globs, dependencies, what is actually live — WITH the operator. A queue that starts empty tells the next agent nothing is in flight. Safe and useful to re-run at any time: it starts by checking what is already imported and switches to finishing and refreshing it rather than repeating it. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| Work queue | The full queue with the critical path. |
| Session brief | Budgeted session-start pack. |
| Lessons | Everything learned so far. |
| Research log | Findings with verdicts and probes. |
TDQS
Scored across 63 tools
The tools are grouped by domain and the descriptions are unusually explicit about boundaries, but at 63 tools several close pairs exist (release/abandon/remove/block, status/progress/board/next, recall/lesson_search/history/replay) whose distinctions are clear only after reading long descriptions. Some overlap remains and the descriptions do the disambiguating work.
All names share the ddflow_ prefix and many use a noun_verb compound (task_add, gate_skip, session_start), but there is a large set of bare verbs (release, abandon, update, claim, complete, import) and bare nouns (status, board, workflow, history) that do not follow that pattern. The convention is readable but mixed.
Sixty-three tools is far beyond even the 16–25 heavy range and would be difficult for an agent to navigate in one namespace. The domain is genuinely broad, so the tools are not redundant, but the surface is still too large for practical selection.
The surface covers the full lifecycle: task/phase creation through claim, gate execution, completion, and removal; plus sessions, bugs, decisions, lessons, research, history, recovery, import, and configuration. I can identify no dead-end operations or significant missing capabilities for this workflow domain.