Spec-Driven Development Orchestration Plugin for Claude Code
Conductor coordinates software construction by managing the full lifecycle of development tracks — from specification and planning through TDD implementation, code review, documentation sync, and archival. It enforces quality gates, state consistency, and workflow discipline through an extensive system of hooks, subagents, and a state machine CLI.
- Track-based project management — Work is organized into tracks (feature / bugfix / chore / docs), each with spec, plan, state, and handoff files
- TDD enforcement — Mandatory test-driven development with an 80 % coverage gate (server-side verification, not agent self-report)
- Registry-driven workflow — The tag/shape vocabulary that drives routing, gating, and topology is data, resolved as plugin baseline ⊕ project overlay (one JSON row to add a task type or a workflow shape — zero plugin edits). A full bespoke workflow is one docfile in the steps library + one registry row; each dispatch pins the resolved gates + workflow path in a code-composed dispatch manifest (
WORKFLOW_FILEin the executor's envelope) - Subagent orchestration — A main orchestrator dispatches 24 specialized AI agents for isolated, focused work
- State machine CLI —
track-statemanages all state mutations atomically;plan.mdstays in sync as the human-readable mirror - Execution firewall — Six mandatory pre-action checks (F1–F6) and eleven anti-patterns (V1–V11) prevent workflow violations
- Resumable recovery — Handoff files, state recovery on resume, name-keyed plan reconciliation, and SubagentStop result-block recovery — an agent that crashes before emitting its result block earns a recovery turn instead of being silently lost
- Git integration — Conventional commits, git notes for audit trail, checkpoint commits per phase, SHA tracking on every task
- Python 3 (standard library only — no pip dependencies)
- Claude Code CLI
- Git
Place this project inside your Claude Code plugins directory. The plugin root is identified by the CLAUDE_PLUGIN_ROOT environment variable.
All interaction happens through Claude Code slash commands:
| Command | Description |
|---|---|
/conductor:adopt-skill |
Adopt an outside skill into the conductor — two roads. Road A adopts it as a project TASK TYPE (tag row + workflow docfile; [] tasks run the skill's procedure inside task-executor). Road B adopts it as a WRAPPER AGENT (.claude/agents/.md + agent-roster row). Each road is one validated command. |
/conductor:brief |
Grill the user (frontier rounds of up to 4 questions per call) to reach shared understanding of a track, then write a brief.md that /conductor:new-track consumes as authoritative planning input |
/conductor:dashboard |
Live resolved-workflow dashboard — renders the track's resolved shape (nodes, checkpoint verifier fan-out, gates) with the current position, the task tree, and quality gauges. Read-only in-chat snapshot. |
/conductor:discover |
Find recurring dev frictions worth making tracks for (read git log + dispatch-lifecycle.log + .conductor/ signals first), grill-triage them with the user, then write a proposals.md the user feeds to /conductor:brief one proposal at a time |
/conductor:grilling |
Grill any task request to shared understanding before work begins — classify the intake, materiality-test whether a grill is owed at all, run the depth-matched grill loop, then persist adaptively (brief chain or stated assumptions) |
/conductor:implement |
Execute a planned track task-by-task — dispatches each task to a subagent, tracks results and retries through track-state.json, and runs the loop to archive |
/conductor:implement-step |
Rail B-min dispatch loop — a teleoperator that runs track-state step and relays exactly the leaf action it emits (dispatch one subagent / ask / done). Thin alternative to /conductor:implement for small-window models. |
/conductor:new-track |
Create a new track — writes spec.md, plan.md, and track-state.json for orchestrator-driven execution; consumes a brief.md when present (skipping its own Q&A) |
/conductor:parallel |
Parallelize opt-in within-track worktree waves — fans out file-disjoint, deps-declared tasks concurrently, then serially integrates each member's commit back |
/conductor:parallel-step |
Rail B-min wave loop — a teleoperator that runs track-state wave-step and relays exactly the leaf action it emits (fan out a batch / integrate one member / ask / done). Thin alternative to /conductor:parallel for small-window models. |
/conductor:post-loop-step |
Rail B-min post-loop teleoperator — runs track-state post-loop-step and relays exactly the leaf action it emits (resolve deferred / finalize / dispatch a doc-sync or review agent / digest / archive / done). Thin alternative to the prose post-loop template (§5.0–§8.0) for small-window models. |
/conductor:re-spec |
Edit a spec mid-track (AC/constraint/workflow in spec.md) — surface which completed SHAs a changed AC puts at risk, re-validate, commit, then hand off to /conductor:reconcile |
/conductor:reconcile |
Re-sync track-state.json after a hand-edit of plan.md (git reset + tag/split/reorder), preserving commit SHAs |
/conductor:revert |
Reverts work with track-state.json state synchronization |
/conductor:review |
Reviews completed track work using track-state.json for context and commit tracking |
/conductor:route |
Route a described goal to the one /conductor: command that starts it — a thin intent-to-command lookup table ("find work", "plan a track", "implement", "review", "undo", "check progress") that prints the command to run; does not execute it |
/conductor:setup |
Scaffolds the project with Conductor environment, creates initial track with track-state.json |
/conductor:status |
Project status overview — renders the code-owned track-state status backend (authoritative statuses, summary, issues, deferred). Read-only. |
/conductor:wiki |
Reads and builds the Conductor documentation wiki — health/status, topic search with citations, directional intent, single-source ingest, and bulk organize-and-file (build) |
/conductor:wiki-doctor |
Diagnoses wiki health — lint audits and diff against codebase reality |
The bin/track-state command provides direct state management. Run bin/track-state help for the full, current list (107 subcommands across 21 groups) — it is grouped and self-describing. The complete surface, straight from track_state/commands.py (the same single source the pre-command guard derives its sanctioned set from):
| Group | Subcommands |
|---|---|
| Lifecycle | init-from-plan, start, set-mode, set-recovery-policy, set-workflow-shape, finalize, archive |
| Navigation | next, dispatch-next, recover, indices |
| State Mutations | lock, complete, fail, skip, defer, block, reset, set-max-retries, split, amend-task |
| Sync & Registry | sync-plan, reconcile-plan, sync-handoff, registry-update, registry-add, registry-doc, index-sweep |
| Handoff | get-handoff, append-handoff, harvest-candidates, compile-track-findings |
| Result Processing | write-result, process-result |
| Dispatch Composites | dispatch-prepare, dispatch-finalize, record-summary |
| Rail B-min Spines | step, post-loop-step, post-loop-review, phase-verdict, phase-checkpoint-review, skip-analyst-verdict, skip-refute-review, plan-refute-prompt, grounding-prompt, failure-analyst-verdict, phase-failure-analyst-verdict, amend-apply, amend-clear, review-attest |
| Wave Parallelism | dispatch-wave, wave-status, wave-finalize, wave-abort, wave-step |
| Naming | derive-name, propose-shape, propose-grounding, grounding-compile, grounding-status, resolve-track, check |
| New-Track Resume | new-track-resume, new-track-init, new-track-step, new-track-set-mode, new-track-set-shape, new-track-finalize |
| Brief | brief-resume, pending-briefs, brief-init, brief-finalize, brief-grill-done, lookup-prompt |
| Grill | grill-log |
| Discover | discover-init, discover-grill-done, discover-finalize |
| Spec Truth | spec-delta-stage, spec-truth-list |
| Diagnostics | validate, gc, shas, post-loop-status, checklist-verify, deferred-report, phase-done, add-checkpoint, replan, preflight, quality-snapshot, spec-integrity, spec-anchors, plan-card, spec-delta, task-context, view, status |
| Workflow Studio | shape-studio, registry-json, registry-save |
| Roster | roster |
| Task Types | tag |
| Probes | probe |
| Logs | log-path, subagent-log |
setupsurvives as a hidden alias ofcheckfor back-compat.reconcile-planis dry-run by default (writes only with--apply);validateis diagnostic by default (--fixmutates).
The conductor's routing vocabulary is data, not code. Four registries, each an ordered JSON document, drive what was previously hardcoded Python sets and agent-prose if/elif ladders. Each resolves as plugin baseline ⊕ project overlay — a project drops any subset of the JSON files at conductor/workflow/ to add or override entries with zero plugin edits (opt-in by file presence; the project wins conflicts).
| Axis | What it declares | Source of the name | Mutable? |
|---|---|---|---|
Task-type (task-type-profiles.json) |
What a tag means — route, gates + grounding (the class's positive declaration of what "done, verified" means), optional executor agent (persona binding), when-to-use hint, optional executor workflow (workflow_doc docfile — preferred — or legacy inline workflow), optional refactor: true (tactical-refactor opt-in) |
Re-derived from the task name's leading tag | No (re-parsed at every read; task_type is a typed cache) |
Workflow shape (workflow-shapes.json) |
The topology — which dispatch agents run, in what order, its stop condition | The workflow_shape field on track-state.json |
Yes — the one declaration/knob axis (set-workflow-shape). Advisory today: declares intended topology and surfaces shape_violation drift, but does not reorder dispatch (both built-in shapes plan-first) |
Agent roster (agent-roster.json) |
The dispatch scaffold per agent — class (executor / verifier / reviewer / advisory), result fence, [Conductor Registry] injection, retry context, single-writer guard, stop-hook recovery |
The agent name a skill dispatches | No (re-read per dispatch; changed only by editing the file) |
Probes (probes.json) |
The dynamic-context vocabulary — named, read-only, side-effect-free snapshot commands an agent fetches on demand (track-state probe <name>): builtins (test-state, label-accuracy, skill-fires, gate-outcomes) or bounded project commands |
The probe name an agent or skill asks for | No (re-read per fetch) |
Adding a task type, workflow shape, agent, or probe is one row in a registry. Tag extraction, gate derivation, dispatch routing, the [Conductor Registry] block injected into agents, the SubagentStart/Stop scaffold, and the registry-doc render all derive from it automatically.
- Integrating an agent is one row —
"<name>": {class, fence, recovery, recovery_instruction}in the overlay. The dispatch hooks read the merged roster: an executor-class row derives the single-writer guard; astdout-blockrecovery row gets a recovery turn instruction; unrostered names stay fail-open (no scaffold, no deny —track-state checkflags them instead). - Integrating a skill is a wrapper agent + one row — the conductor dispatches agents, not skills. Write a thin
.claude/agents/<name>.mdwrapper whoseskills:frontmatter preloads the skill (procedure up front, reference on fetch), add its roster row, and the skill rides with conductor's full scaffold: safety floor, result fence, and recovery — zero plugin edits.track-state roster add <name> --skill <skill>(front-doored by/conductor:adopt-skill) generates both files validated — defaults mirror the task-executor scaffold, so most adoptions need just the two names. - Inspect the resolved registry —
track-state registry-docprints the full resolved tables (baseline + your overlay);registry-doc --tag <Name>/--shape <s>/--roster <agent>prints one row plus its prompt-shaping prose verbatim. - Project overlay — drop
conductor/workflow/task-type-profiles.json(or the workflow-shape equivalent) next to the filessetupscaffolds there. Absent = plugin defaults, no behavior change. A project's own workflow docfiles live atconductor/workflow/steps/<name>.mdand win over the plugin'stemplates/workflow/steps/— a full custom workflow is one docfile + one registry row. - Unknown values — an unknown task tag is a hard error at
init-from-plan(a wrong tag means wrong executor behavior).workflow_shapereads fail-open todefaultbut a deliberate declaration hard-rejects an unknown shape —set-workflow-shape, andinit-from-plan --shape <name>(which writes the §2.1-confirmed shape at state creation) — so a deliberate set never silently no-ops. - Guardrails — every cap is disclosed rather than silently enforced, the "definition of done" is read-only to the executing agent, and a drift-killer lint (
scripts/check-contract-registry-sync.py) forbids a second hand-maintained vocabulary home in the contract.
The authoritative grammar and invariants live in runtime/contracts/plan-format-contract.md (the registries own the vocabulary; the contract owns the rules).
"I want conductor to do X — which seam?" Every extension is data (one registry row, one docfile, or one wrapper agent); zero plugin edits.
| You want… | The seam |
|---|---|
| A new kind of work — a deliverable class with its own definition of done | One overlay row in task-type-profiles.json (gates + grounding) + one steps docfile declaring what its witness attests |
| A class to run through a skill | A .claude/agents/<name>.md wrapper + an agent-roster.json row + agent: <name> on the class row (/conductor:adopt-skill generates all three) |
| A different topology for a track | One row in workflow-shapes.json (plus a planning docfile if it plans differently) |
| Different step prose for one class | One docfile at conductor/workflow/steps/<name>.md (project wins over the plugin's library) |
| Different planning doctrine for one shape | One docfile at conductor/planning/<name>.md |
| A measurement (a context snapshot or a cross-track aggregate) | One row in probes.json — builtin or a bounded read-only command |
| The plan to adapt mid-track | Nothing to extend — phase-gate replanning is built in (track-state replan after each PASSED checkpoint; see runtime/contracts/phase-gate-replanning.md) |
| A guardrail on tool use or session behavior | A hook (hooks/hooks.json) — the frozen anchor points |
When a divergent run is undone with git reset, two name-keyed paths bring state back in sync without losing the commit_sha records on work that survived:
plan.mdside —track-state reconcile-plan(driven by/conductor:reconcile) matches by phase number + task name, not position, so a SHA stays on its named task across reorders and inserts. It is dry-run by default, bucketing the diff (unchanged/tag_or_status/split/unmatched/dangling_sha) and refusing ambiguous nodes until you pass--rename/--drop/--clear-dangling. Contrastsync-plan(positional — reorders silently rebind SHAs) andinit-from-plan --force(wipes every SHA — a fresh start, never mid-track).spec.mdside —/conductor:re-spec(driven bytrack-state spec-delta) edits an Acceptance Criterion, commits it as a scopeddocs(spec):, then surfaces the completed tasks whosecommit_shathe changed AC may have invalidated (at_risk_tasks) and halts for your keep-vs-reset decision — it never auto-resets. The two commands compose; they do not overlap.
conductor-plugin/
├── agents/ 24 specialised agent definitions (.md)
├── bin/track-state Shell wrapper for the state CLI
├── conductor/design/ Decision records (serial-execution, loop-heartbeat, rail-b step/wave …)
├── hooks/hooks.json 9 hook event types, 21 hook entries
├── runtime/ System prompt material injected into sessions
│ ├── core-contract.md Main-session contract (F1–F6, V1–V11)
│ ├── subagent-firewall.md Subagent safety floor (dispatch injection)
│ └── contracts/ Per-role contracts (plan-format, review schema, refactor, doc conventions …)
├── schemas/ JSON Schema for track-state.json
├── scripts/
│ ├── lib/ Shared library (env, dispatch_inflight, hook_io, logging, recovery, validation …)
│ ├── track_state/ State machine CLI package (cli + cmd_* modules + *_profiles.py registries)
│ └── *.py Hook scripts (session start/end, subagent-start, dispatch-dedupe, tripwire …)
├── skills/ 20 slash-command skills (implement, new-track, reconcile, re-spec, parallel, wiki …)
├── templates/
│ ├── workflow/ The two registries: task-type / workflow-shape profiles (.json) + steps/ docfile library
│ ├── code-styleguides/ 10 language style guides
│ ├── dev-commands/ 8 language dev-command templates
│ └── testing/ Testing strategy template
└── tests/ pytest suite (run from repo root: PYTHONPATH=. python3 -m pytest tests/)
| Agent | Model | Purpose |
|---|---|---|
ac-tracer |
sonnet | The AC-evidence-trace tier of phase verification (read-only). Runs track-state spec-integrity, parses the result, and returns the per-AC grounding verdict. Fanned out in parallel with conductor:build-runner and conductor:test-runner before conductor:phase-checker (the synthesizer) consumes the fleet. |
apply-fixes |
sonnet | Bounded remediation patcher — applies ONE chunk of post-review findings (Critical/High severity, one file) committed-by-commit, runs the suite, returns a compact block. Dispatched ONLY by the post-loop-step spine (§7.0 step 4). NOT a plan task — no PHASE/TASK, no result.json, no state mutation. Replaces the prior open-ended free-form patch agent (the "unguarded chimney"). |
build-runner |
haiku | The L0 compile/build tier of phase verification (read-only). Resolves the project's build/compile command and runs it ONCE — no fix, no edit. Fanned out in parallel with conductor:ac-tracer and conductor:test-runner before conductor:phase-checker (the synthesizer) consumes the fleet. A compile failure here fails the checkpoint before the more expensive test tier is spent — the cheapest-first graduated gate. |
code-probe |
sonnet | Read-only repo-question answerer — answers ONE bounded codebase question and returns an anchored digest to the dispatching conversation. Dispatched by the orchestrator during a grill (grill-discipline §3 rule 2) via track-state lookup-prompt; writes NOTHING (no handoffs, no result.json) so grill-time lookups never touch task slots. |
code-reviewer |
sonnet | Performs deep code analysis on a track's implementation. Dispatched by conductor:review to analyze diffs, verify plan compliance, check style, run tests, and produce structured findings. |
command-digester |
haiku | Read-only command digester — runs ONE bounded command class (test/coverage run OR git-history log verification), parses the result, returns a compact block. Dispatched ONLY nested (task-executor PURPOSE=red |
corpus-writer |
sonnet | Phase 1 of the doc-sync pipeline. Analyzes the source (track spec + handoffs, or an ad-hoc source) against the project's documentation corpus, proposes targeted updates for each affected document, applies user-confirmed edits, and commits them. The interactive, divergence-curing half of doc sync; wiki-synthesizer runs Phase 2 after. |
doc-linter |
sonnet | Health-checks the Conductor documentation wiki for broken cross-references, stale claims, coverage gaps, and consistency issues. Read-only analysis agent. |
doc-probe |
haiku | Read-only corpus-doc digester — reads ONE scoped design doc against a task scope, returns a compact relevance + anchors digest. Dispatched ONLY by task-executor (nested, opt-in) for Layer 0(b) so N full docs never enter the parent's context; the parent assembles N digests instead. |
explorer |
sonnet | Read-only code exploration agent. Records findings to the task handoff (Exploration Notes) as the Layer-0 map for the downstream task-executor. Dispatched by conductor:implement for [Explore] tagged tasks. |
failure-analyst |
haiku | Diagnoses why a repeatedly failed track task (TASK mode) OR a failed phase checkpoint (PHASE mode) keeps failing and recommends the next action (retry differently / replan / decompose / escalate). TASK mode: dispatched before the final retry attempt and on skip-analyst retry_with_modification. PHASE mode: dispatched when a phase checkpoint FAILED on an auto-routing track, before halting. |
phase-checker |
sonnet | The synthesizer for the phase checkpoint. conductor:build-runner (L0 compile/build), conductor:test-runner (L1 verify-only), and conductor:ac-tracer (AC-evidence) are fanned out first; this agent consumes their verdicts (cheapest-first graduated gate — a build failure fails the checkpoint before the test tier is spent), owns the L1 fix-and-retry pass when tests fail, runs L2 browser-E2E (when a browser-automation MCP is available) and the L4 manual plan, then makes the checkpoint commit. |
project-analyzer |
sonnet | Analyzes a brownfield project to detect tech stack, architecture, and structure. Dispatched by conductor:setup during brownfield project discovery. |
refactorer |
sonnet | Bounded tactical-refactor patcher — ONE behavior-preserving refactor pass on a task's commit, runs the suite, returns a compact block. Dispatched ONLY by conductor:implement at the opt-in [Refactor] seam (§3.6c). NOT a plan task — no PHASE/TASK, no result.json, no state mutation. The tactical tier; task-executor's inline Step 5 is the mechanical tier. |
refuter |
sonnet | Adversarial read-only verifier — re-examines a single claim/verdict/finding-set against ground truth, defaulting to SUSTAINED when uncertain. Dispatched by skills to challenge consequential one-shot decisions (plan, skip, cross-member seam). |
skip-analyst |
haiku | Analyzes whether a repeatedly failed track task can be safely skipped. Dispatched by the conductor:implement orchestrator when retry count is exhausted. |
spec-planner |
opus | Generates spec.md and plan.md from user requirements and project context. Writes files directly, returns compact summary to minimize parent context pressure. Dispatched by conductor:setup and conductor:newTrack. |
spec-reviewer |
sonnet | Read-only auditor for spec.md and plan.md. Runs EARS-conformance + plan-tag audits, returns a compact verdict + findings list. Non-interactive — the orchestrator owns the human review loop. Keeps full file contents out of the orchestrator context. |
strategy-writer |
sonnet | Inspects a brownfield project's real test layout and writes a project-specific conductor/workflow/testing/strategy.md, asking the user questions interactively. Dispatched by conductor:setup when the user opts out of the default filtered template. |
task-executor |
sonnet | Executes a single track task (or a batchable consecutive task run) via TDD workflow (Steps 3-8). Self-loads all context from files. Dispatched by conductor:implement. |
test-runner |
haiku | The L1 verify-only tier of phase verification (read-only). Resolves the project's test command and runs it ONCE — no fix, no edit. Fanned out in parallel with conductor:ac-tracer before conductor:phase-checker (the synthesizer) consumes the fleet. phase-checker owns the fix-and-retry pass if this agent reports failure. |
wiki-differ |
haiku | Compares the Conductor documentation wiki against the actual codebase to surface drift — stale references (files/modules/functions the wiki names that no longer exist), moved references (renamed or relocated), and coverage gaps (code areas with no wiki mention). Analysis subagent that extracts verifiable claims from wiki docs and checks each against the code via Glob/Grep (writes only its own diff report). |
wiki-researcher |
haiku | Searches the Conductor documentation wiki for a topic and synthesizes a cited answer. Read-only retrieval subagent — orients via overview/index, routes to scoped docs, greps + graph-expands [[wikilinks]], ranks by signal density, returns a synthesized answer with [[wikilink]] citations and a source list. |
wiki-synthesizer |
sonnet | Phase 2 of the doc-sync pipeline. Regenerates conductor/overview.md from the loaded corpus, co-edits conductor/purpose.md (LLM-maintained sections only), appends the change log, runs the inline drift gate with auto-repair of auto-owned files, and commits. Runs after corpus-writer (Phase 1). Automatic — no user confirmation. |
Before every code-modifying action, Conductor enforces six checks (authoritative source: runtime/core-contract.md):
- F1 — Global State Lock: at most one active
[~]task at a time (wave-lock relaxation under/conductor:parallel) - F2 — TDD Gate: no implementation before a failing test
- F3 — Coverage Gate: test coverage ≥ 80 % before commit
- F4 — SHA Must Exist: every non-transient marker carries a
[sha] - F5 — Checkpoint Integrity: phase checkpoint is mandatory
- F6 — Context Guard: never skip workflow steps
PYTHONPATH=. python3 -m pytest tests/The scripts/ tree also hosts a family of drift gates (lint-*.py / check-*.py) — each is wired through a tests/test_<gate>.py wrapper that runs it over the live tree, so pytest tests/ sweeps them too. Three examples: lint-prose-impl-leak.py flags rotting file.ext:NN line-number citations in markdown prose (a :NN goes stale the moment a line is inserted above it); check-contract-registry-sync.py forbids a second hand-maintained vocabulary home in the contract; and lint-grill-contract-drift.py flags prompt prose that restates the grill discipline (the four-quadrant stance / one question at a time loop) without citing its single home (runtime/contracts/grill-discipline.md) — a restated discipline drifts the moment a second surface adopts it. The full prompt-prose keep/cut rules live in runtime/contracts/prose-style.md.
Conductor verifies work across a ladder — L0 static, L1 unit/integration, L2 browser-E2E (opportunistic, when a browser-automation MCP is connected), L4 human manual plan. It does not cover L3 (production logs/metrics/traces): that rung is project-specific infrastructure a generic plugin cannot provision and is left to the host project.
Scripts and dev commands belong in the target project, not under conductor/. Put run/build helpers (start.sh, run.sh) at the project root in ./scripts/ or a Makefile/package.json script; tests go in the test root setup resolves (detected from conductor/.conductor/analysis.json, else tests/); one-off CLIs go in ./bin/. The conductor/ tree is the spec/wiki/planning map that Conductor agents route on — it is not a home for executable code, so it intentionally has no scripts/ slot and no row in conductor/index.md. (The conductor/workflow/ overlay JSON is the one exception — it is declarative data the registries read, not executable code.) See templates/testing/strategy.md → Scripts & Dev Commands for the full placement table.
Tool preferences belong in the project's CLAUDE.md, not in dispatch envelopes. Conductor dispatch prompts name no tools (a codegraph index, an MCP, a formatter) — they carry task facts only, so an envelope stays valid in any project. If your project wants agents to prefer a specific tool (e.g. codegraph explore when .codegraph/ exists), say so in the project's CLAUDE.md; subagents inherit it from their own context loading.