Documentation/Tutorials/ Decision panel

Ready example · Claude skill + MCP

Turn one decision into a multi-model debate.

The /decision-panel Claude skill gathers a question and source material. Knodr runs discovery, competing concepts, critique, arbitration, and a bounded rework loop, then writes a final decision document and a complete audit trail.

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.

Claude/decision-panel skillquestion · materials · paths
Control planeKnodr MCPvalidate · bind · start · observe
Runtime63-node flow13 agents · 116 connections
Initialize dossier4× discoveryDigestDebate loopArbiterFinal document

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.

Why a file-backed dossier? Every later participant reads the full append-only record from disk. The panel is not relying on one model’s hidden chat state, and a partial run still leaves useful evidence behind.

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.

Node IDValuePurpose
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

Final decision

finalPath contains the recommendation, rationale, rollout, trade-offs, risks, and unresolved dissent.

Audit trail

dossierPath records every iteration’s two concepts, four critiques, and arbiter verdict.

Research record

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.

PARALLEL2 architectsClaude concept A · Grok concept B
PARALLEL4 criticscompleteness · cost · complexity · security
GATECodex arbiterpass → break · rework → feedback
  1. 01
    Increment and unpack context

    A script increments i; json.text nodes extract the dossier, working directory, and iteration number for the body.

  2. 02
    Author competing concepts

    Claude and Grok run in parallel. From iteration two onward, both must address the previous verdict’s directives explicitly.

  3. 03
    Append before critique

    The concepts are written to the dossier. The resulting file.write.path output activates all four critics, enforcing disk write order.

  4. 04
    Critique through independent lenses

    Two DeepSeek roles cover completeness and delivery cost; MiniMax tests complexity and trade-offs; Gemini applies security and domain risk.

  5. 05
    Arbitrate with a safe parser

    Codex emits strict JSON. A parser accepts only pass or rework; missing or malformed output is forced to rework.

  6. 06
    Break or feed back

    control.gate routes pass to loop.break and rework to loop.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

  1. Download the flow and save it as C:\work\knodr-examples\flows\decision-panel.knodrflow.
  2. Download the Claude skill and save it as ~/.claude/skills/decision-panel/SKILL.md.
  3. Register knodr mcp --project C:\work\knodr-examples in Claude’s MCP configuration, then restart Claude.
  4. Authenticate the local claude and codex CLIs.
  5. Add Knodr secrets named gemini, grok, deepseek, and minimax, or provide the matching KNODR_CREDENTIAL_* environment variables.
Claude MCP configuration · JSON
{
  "mcpServers": {
    "knodr": {
      "command": "C:\\Users\\you\\AppData\\Local\\Knodr\\current\\knodr.exe",
      "args": [
        "mcp",
        "--project",
        "C:\\work\\knodr-examples"
      ]
    }
  }
}
Plan the run: a passing first iteration uses 13 agent invocations; the worst case uses 27 across six vendors. A run commonly takes 40–90 minutes, and the example reserves up to 12,000 seconds.

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.

~/.claude/skills/decision-panel/SKILL.md · core procedure
---
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`.
Literal request to Claude

/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.

1 · validate_flow arguments
{
  "path": "flows/decision-panel.knodrflow"
}
1 · example result
{
  "ok": true,
  "nodes": 63,
  "connections": 116,
  "diagnostics": []
}

Claude then allocates the run files and binds the six Manual Input nodes by ID.

2 · start_run arguments
{
  "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
}
2 · example result
{
  "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.”

3 · get_run_status arguments
{
  "runId": "run_01KYA1EXAMPLE8YJ7Q2"
}
3 · abbreviated result while iteration 1 is running
{
  "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" }
  ]
}
1validate_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.

Do not call 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.
Example handoff

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.