01 / ARCHITECTURE
Keep intent, control, and execution in separate layers
The Claude skill is a thin operating procedure: it resolves the question, source paths, and output paths. Knodr MCP is the control plane that validates and starts the graph. The .knodrflow owns all orchestration, including concurrency, write ordering, failure policy, and the three-iteration cap.
Four discovery agents inspect the same basis from different angles: Codex for code and implementation constraints, Claude for documents and decision history, Gemini for alternatives and prior art, and Grok for contradictions and risk. Claude compresses their raw briefs into the dossier before the debate begins.
02 / INPUTS & OUTPUTS
Six explicit inputs, three durable artifacts
start_run.inputs binds values by Manual Input node ID. The IDs below are part of the example’s public contract.
questionDecidable questionThe architecture or design decision the panel must make.materialsMarkdown bullet listAbsolute document or repository paths, each with a short focus hint.workdirAbsolute directoryDeepest safe common ancestor that every read-only agent can inspect.dossierPathAbsolute .md pathAppend-only digest, concepts, critiques, and verdict history.rawPathAbsolute .md pathThe four uncompressed discovery briefs.finalPathAbsolute .md pathThe consolidated final decision document.What comes out
finalPath contains the recommendation, rationale, rollout, trade-offs, risks, and unresolved dissent.
dossierPath records every iteration’s two concepts, four critiques, and arbiter verdict.
rawPath preserves the four discovery briefs that were compressed into the digest.
03 / INSIDE THE LOOP
Rework is a graph edge, not a promise in a prompt
A control.loop node enforces n=3. Its payload is JSON—{ "i", "dossier", "workdir", "final" }—so the complete iteration context travels through the back edge. The body never depends on a Manual Input firing again.
- 01Increment and unpack context
A script increments
i;json.textnodes extract the dossier, working directory, and iteration number for the body. - 02Author competing concepts
Claude and Grok run in parallel. From iteration two onward, both must address the previous verdict’s directives explicitly.
- 03Append before critique
The concepts are written to the dossier. The resulting
file.write.pathoutput activates all four critics, enforcing disk write order. - 04Critique through independent lenses
Two DeepSeek roles cover completeness and delivery cost; MiniMax tests complexity and trade-offs; Gemini applies security and domain risk.
- 05Arbitrate with a safe parser
Codex emits strict JSON. A parser accepts only
passorrework; missing or malformed output is forced torework. - 06Break or feed back
control.gateroutespasstoloop.breakandreworktoloop.feedback. After a pass or the third iteration, Claude writes the final document.
Every agent uses a non-fatal error policy. One unavailable vendor leaves an empty section instead of destroying the run; the dossier and final summary make the gap visible.
04 / SET UP THE EXAMPLE
Put the flow under the MCP project root
- Download the flow and save it as
C:\work\knodr-examples\flows\decision-panel.knodrflow. - Download the Claude skill and save it as
~/.claude/skills/decision-panel/SKILL.md. - Register
knodr mcp --project C:\work\knodr-examplesin Claude’s MCP configuration, then restart Claude. - Authenticate the local
claudeandcodexCLIs. - Add Knodr secrets named
gemini,grok,deepseek, andminimax, or provide the matchingKNODR_CREDENTIAL_*environment variables.
{
"mcpServers": {
"knodr": {
"command": "C:\\Users\\you\\AppData\\Local\\Knodr\\current\\knodr.exe",
"args": [
"mcp",
"--project",
"C:\\work\\knodr-examples"
]
}
}
}
05 / THE CLAUDE REQUEST
Give the skill a decision, not a topic
Install a Claude skill named decision-panel. Its procedure should resolve material paths, choose a safe common working directory, allocate the three output files, call Knodr MCP, poll to a terminal state, and present the final file plus the dossier path.
--- name: decision-panel description: Run a bounded multi-model architecture decision panel through Knodr. --- 1. Require the Knodr MCP tools and the decision-panel flow. 2. Turn the argument into one decidable question. 3. Resolve every material to an absolute path. 4. Use their deepest safe common ancestor as `workdir`. 5. Allocate dossier, raw-discovery, and final Markdown paths. 6. Call `validate_flow`, then `start_run` with all six inputs. 7. Poll `get_run_status` at intervals of at least 60 seconds. 8. Never call `get_run_snapshot` for this flow. 9. Read `finalPath`; report the decision, unresolved risks, final path, dossier path, and runId. 10. On failure, read the partial dossier and call `get_run_logs`.
/decision-panel Decide whether Atlas should keep one modular monolith or split billing into a service before the EU launch. Basis: C:\work\atlas\docs\architecture.md, C:\work\atlas\docs\eu-launch.md, and C:\work\atlas\src. Constraints: six engineers, launch in four months, GDPR, zero-downtime migration.
This text is not sent directly to the MCP server. Claude interprets it under the skill, resolves the file contract, and turns it into typed MCP tool arguments.
06 / MCP PROCESSING TRACE
See the prompt become a running graph
For the request above, Claude first checks the downloaded graph. Knodr loads the JSON, resolves installed node definitions, and returns every structural diagnostic.
{
"path": "flows/decision-panel.knodrflow"
}
{
"ok": true,
"nodes": 63,
"connections": 116,
"diagnostics": []
}
Claude then allocates the run files and binds the six Manual Input nodes by ID.
{
"path": "flows/decision-panel.knodrflow",
"inputs": {
"question": "Should Atlas keep one modular monolith or split billing into a service before the EU launch, given a six-person team, a four-month deadline, GDPR, and a zero-downtime requirement?",
"materials": "- doc: C:\\work\\atlas\\docs\\architecture.md — current boundaries and known coupling\n- doc: C:\\work\\atlas\\docs\\eu-launch.md — launch constraints and GDPR requirements\n- repo: C:\\work\\atlas\\src — implementation; inspect billing, identity, and data access",
"workdir": "C:\\work\\atlas",
"dossierPath": "C:\\work\\atlas\\.panel-tmp\\dossier-20260723-1430.md",
"rawPath": "C:\\work\\atlas\\.panel-tmp\\discovery-20260723-1430.md",
"finalPath": "C:\\work\\atlas\\.panel-tmp\\final-20260723-1430.md"
},
"timeoutSeconds": 12000
}
{
"runId": "run_01KYA1EXAMPLE8YJ7Q2",
"state": "running"
}
start_run validates again, binds the inputs to a fresh in-memory graph, applies the timeout, starts the eager scheduler, and returns immediately. The returned run ID means “accepted and running,” not “finished.”
{
"runId": "run_01KYA1EXAMPLE8YJ7Q2"
}
{
"runId": "run_01KYA1EXAMPLE8YJ7Q2",
"state": "running",
"flowName": "decision-panel",
"startedAt": "2026-07-23T14:30:00Z",
"elapsedMs": 512438,
"error": null,
"cancelReason": null,
"nodes": [
{ "nodeId": "d-codex", "status": "completed" },
{ "nodeId": "archA", "status": "running" },
{ "nodeId": "archB", "status": "running" }
]
}
validate_flow63 nodes · no errors
→
2start_runcapture runId
→
3get_run_statuspoll every 60s+
07 / READ THE RESULT
Return the decision and its evidence
When status becomes success, Claude reads finalPath with its filesystem tool and searches the dossier for ### Arbiter verdict. It reports whether the panel passed at iteration 1, 2, or 3—or reached the cap without convergence—then summarizes the recommendation and unresolved risk.
get_run_snapshot here: this graph can accumulate very large agent stdout and stderr values. Use get_run_status for progress, the append-only dossier for detail, and get_run_logs only when diagnosing a failed or cancelled run.The panel passed on iteration 2 and chose a merge: keep the modular monolith for the launch, isolate billing behind an internal boundary now, and defer service extraction until measured scaling or team-ownership triggers are met. The final document records the migration seams, GDPR controls, and rollback plan. Final: C:\work\atlas\.panel-tmp\final-20260723-1430.md. Audit trail: C:\work\atlas\.panel-tmp\dossier-20260723-1430.md. Run: run_01KYA1EXAMPLE8YJ7Q2.