Orchestration
Routing doctrine for the architect-as-orchestrator pattern — how a session running the smartest model delegates implementation to cheaper cross-vendor lanes to minimize cost. USE WHEN delegating implementation work, choosing between grok-implementer/codex-implementer lanes, writing a spec for a subagent, deciding whether to consult fable-advisor, managing session cost or token spend, or running any multi-task build where the session is the architect.From its SKILL.md
npx -y skills add mar3co/fable-orchestrator --skill orchestrationAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 4 stars4 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
49.0 KB, as published. Nobody here has run it
Orchestration — the architect's routing doctrine
The session is the architect: it owns requirements, architecture, decomposition, specs, routing, and verification. It types implementation code only in the two classes named in "What the architect implements itself" below — trivial edits, and small spec-saturated correctness-critical diffs where the spec would cost as much as the code; everything else is delegated, and architect-authored diffs enter the same review tiers as lane diffs. Implementation routing follows the session's configured mode — grok (fixed, the unconfigured default), codex (fixed), or mix, where the architect routes each task by kind (see "Choosing your implementation routing"). The unconfigured default is fixed-grok: cheap typing with assurance from verification and the review tiers, and a fixed binding cannot drift.
The checklist
Every delegation, no exceptions. Spec-saturated diffs the architect implements itself (trivial edits keep their exemption) are governed by item 2's premise-verification duty (more binding, if anything — no downstream implementer will dissent against a bad premise), items 4–5 and 7, and item 3's verification-evidence core (the architect runs the verification bundle and captures the output; the report mechanics are lane-only). Details in the sections below:
- Mode — grok (unconfigured default) | codex | mix, per the session's CLAUDE.md declaration.
- Spec — premises verified first, in both directions (consumers traced for anything the change emits, AND payload provenance: what fills each emitted value — see "Cost discipline"); all seven parts (commit ownership and the
PREMISESblock included), outcome and invariants over mechanism, an honestTIMEOUT:when it differs from the default (plusFAST MODE: onon codex-lane delegations when fast mode is configured on, andEFFORT: <level>on codex- or grok-lane delegations when the matching family's effort is configured and not high), the smallest verification bundle that proves the change. On specs that emit (telemetry, errors, events) or touch security/concurrency/migration paths, thePREMISESblock goes topremise-verifierbefore dispatch — on the initial spec and again on every corrected/respec revision's new or changed rows — and the dispatch then carries thePREMISES-VERIFIED:attestation the gates enforce (see "The spec contract"). - Report back — read the diff; demand the report's evidence grade — a machine-captured log is evidence, a claim is not, and wrappers never re-run (a
claim-onlygrade means you decide whether a re-run happens before integration) — and the report'sCOMMIT:field — a hash, or one of the templates' explicit non-hash states (the caller-commit handback, captured-fail left uncommitted, a dissent or artifact-abort stop, or a run that ended before a committable state) — never empty. A completion without a structured report is an error state, not a success — settle the lane (see "A completion without a report is not a success") before touching the branch. - Review tier — caller-declared spike or mechanical diff: verify only (spikes are declared, never inferred). Behavior-bearing: one cold review from the model family that did NOT implement it (fallbacks per "Review tiers": the other CLI first where it qualifies, Opus cold announced last) — architect-authored diffs included, never self-certified. Security/auth/concurrency: add the silent-failure completeness read.
- Findings — refutation pass, cited-first in severity order; max two respec rounds, then surface residuals to the user.
- Load-bearing research — verified by a strong Claude lane that fetches the sources itself, before anything rests on it.
- Commitment boundary / declaring done — consult
fable-advisorwith exact files and pasted evidence.
Every fallback is announced; verification and review never relax under fallback.
Cost discipline — the prime directive
The session model is the most expensive lane in the system, on both input and output tokens. The economic case for this pattern is spending those tokens on judgment and not on volume — and the two must never be confused. Volume — typing implementation code, pasting long files, re-deriving settled decisions — is waste at architect prices. Reasoning — reading the seams, tracing consumers, verifying the premises a spec rests on — is the opposite: pre-spec thinking tokens are the cheapest tokens in the whole loop, because a premise skipped there surfaces as a review finding one full lane run and one review round later. Under-thinking to save tokens is the costliest mistake this doctrine can produce. Four rules follow.
Verify premises before speccing. Every factual premise a spec rests on — "consumers treat this status as transient", "the redirect target is inert", "this call clears the callback state" — is either read from the current code or it is a guess. Before writing any spec that touches status propagation, telemetry, lifecycle, or any value another layer consumes, tracing the consumers and callsites of what the change emits is mandatory, not optional: grep the consumers, read what they do with the value, and only then pin the spec. Delegate the sweep when it's big (see the verifiability routing below), but the premise gets verified before the spec rests on it. A mechanism pinned from memory is how a faithful implementer ships the architect's bug. The trace runs in BOTH directions: consumers of what the change emits, and provenance of what fills it — for every value the change emits, stores, or reports, what produces it and what can be inside it (an error object whose message is built from raw native text is a payload fact exactly as load-bearing as any consumer's behavior). And the test is per-premise, not per-session: substantial tracing elsewhere in the task buys nothing for the one claim that went unread — partial tracing is worse than none, because it launders guesses in among verified facts until the whole spec reads as diligent. Field-measured on a single branch: five unread premises cost three heavy respec rounds, against roughly four file reads at spec time. The PREMISES block (part 7 of the spec contract) is where this duty stops being an intention and becomes an artifact.
Emit judgment, not volume. The architect's output is decomposition, specs, routing decisions, verdicts on diffs, and short reports. Outside the two inline classes below ("What the architect implements itself"), it does not type implementation code, test bodies, boilerplate, or config files — a code block longer than an interface signature or a few illustrative lines is a spec that hasn't been delegated yet. Fixing a lane's bug by hand is the same failure in disguise: send a corrected spec back to the cheap lane instead.
Keep the context lean. Everything in the architect's context is re-read at architect prices on every turn. Delegate exploration and log-grepping, keep only the conclusions, and route the supporting lanes — exploration, research, review — by how their output can fail — by VERIFIABILITY, not task label: bounded, checkable lookups — where is X defined, list the callers, inventory the endpoints — go to a cheap read-only agent, because a wrong answer is visible and cheap to re-check; completeness-critical sweeps — "what else can touch this resource?", "are there other write paths?" — go to the strongest Claude model available (Agent tool, model: "opus"), because their failure mode is an invisible omission that never appears in the report and silently poisons the architecture built on it. Lean means free of BULK, not of understanding: read every line the decision depends on — the seams, the consumers, the premises above — while keeping raw dumps out; don't paste long files, full diffs, or verbose command output into the conversation when an excerpt will do — filter at the tool call (--jq, grep, tail) so they never enter context at all. This rule caps what the architect retains and retypes; it never licenses skipping a trace.
Reason once, fully, then hand off. Do the hard thinking — the architecture, the interface design, the consumer traces, the debugging hypothesis — in one complete pass, capture the conclusions in the spec, and let the cheap lane carry it from there. Re-deriving decisions across turns burns the premium twice — but the loop's real budget killer is the opposite failure: a spec written before the thinking was done, which burns a lane run plus a review round to discover what a pre-spec trace would have caught. Convergence is the observable metric: with premises verified and outcomes specced, most diffs settle within zero or one respec round, comfortably inside the two-round bound (see "Review tiers") — routinely hitting the bound is the signal that premises are going unverified.
What stays with the architect regardless of cost: decomposition, interface design, premise verification, hypothesis selection when debugging, spec writing, lane routing, and judging verification evidence. Any load-bearing exploration claim ("nothing else touches X") gets a session-level spot-check before an architectural decision rests on it. Those tokens are what the premium is for — everything else is a candidate for delegation.
What the architect implements itself
Two classes stay inline; everything else is delegated:
- Trivial edits — few-line fixes, renames, doc/comment tweaks. If it needs a verification command to trust, it isn't trivial.
- Spec-saturated correctness-critical work — small, surgical diffs (entitlement gates, lifecycle races, concurrency fixes — often tens to ~150 changed lines) where writing a correct spec IS most of the intellectual work: by the time the spec pins every line, it approaches the size and effort of the diff itself, and delegating adds a lossy hop plus a lane-and-review cycle for code the architect has already designed line by line. Key the call on the spec-to-code ratio and the stakes together: spec ≈ code and correctness-critical → implement directly. Spec ≈ code but mechanical → still a lane (a short spec fully determines it — the ratio only looks high because the task is small). Code dwarfs spec — test suites, wiring, boilerplate, large mechanical features, well-bounded CRUD — always a lane; that volume is what the lanes are for.
The hard invariant that makes the second class safe: architect-authored diffs get the same treatment as lane diffs — verification evidence (the architect runs the same smallest verification bundle it would have specced and the captured output is the evidence; the cross-vendor eyes come from the review), the full review tiers, cold cross-family review, the refutation pass. The architect never self-certifies. And for these diffs the architect IS the implementation lane: a confirmed review finding is fixed by the architect inline — the hand-fix ban protects lane diffs from silent architect patches, not the architect's own diffs — and the fix re-enters cold review like any respec round, under the same two-round bound. The only thing that changes is who typed the diff; see "Review tiers" for the reviewer-family rule on architect-authored diffs.
The lanes
| Lane | Producer | Invoke | Route here when |
|---|---|---|---|
| Implementation | Grok 4.6 | grok-implementer agent | All delegated implementation in grok mode (the unconfigured default). In mix mode: mechanical work the spec fully determines — wiring, CRUD, boilerplate, make-the-types-match. Requires the Grok CLI. |
| Implementation | GPT-5.6 Sol (high reasoning by default) | codex-implementer agent | All delegated implementation in codex mode. In mix mode: correctness-critical work — concurrency, auth/security, migrations, subtle state, anything the spec can't fully pin. Requires the codex CLI. |
| Research | Grok 4.6 | grok-researcher agent | Not an implementation lane: breadth-first live-web/X research. Codebase lookups (where-is-X-defined, list-callers, inventories) go to a cheap in-process read-only agent instead — faster and more accurate for file:line work than an external CLI hop. |
| Review | Grok 4.6 / GPT-5.6 Sol | grok-reviewer / codex-reviewer agents | Cold second review lens on a behavior-bearing diff — pick the family the implementer ISN'T: grok implemented → codex-reviewer; codex implemented → grok-reviewer; a Claude fallback lane implemented → either. |
| Judgment | Fable 5 | fable-advisor agent | Not an implementation lane. See "Commitment boundaries" below. |
The session may drive the grok CLI directly only for short single-answer web lookups; anything with long output (breadth research, review) runs inside the researcher/reviewer lanes so raw transcripts never enter the architect's context.
Research leads are breadth, not truth. Before anything load-bearing rests on the researcher's findings, verification-grade synthesis — fetching and reading the sources themselves (open the URLs; never judge from the researcher's summaries alone), adversarially fact-checking, labeling confirmed vs anecdotal — goes to the strongest Claude model available (Agent tool, model: "opus"): mislabeling an anecdote as confirmed is another invisible-omission failure, so it gets the strongest model, not the cheapest.
Implementation goes to ONE lane — never race the CLI lanes on the same spec, even for correctness-critical work. Assurance comes from reviewing the diff (see "Review tiers"), not from duplicate implementations; the architect judging two diffs pays twice for typing and once more for the judging.
The fallback chain is the same in every mode and every step is announced explicitly, never silently absorbed: if the chosen lane is unavailable (service offline, auth failure, usage limit, CLI missing, timeout), re-route the same spec to the other CLI lane if it is installed — re-stamping the lane-config lines for the destination family (EFFORT: levels are family-specific enums, FAST MODE: is codex-only; translate to the nearest level the destination accepts, or drop the line — either way announced with the re-route, like every fallback) — cross-vendor separation survives the outage. If both CLI lanes are unavailable, the final fallback is ALWAYS a Claude Opus subagent (Agent tool, model: "opus"). Availability is discovered at run time, not declared in config — a user with only one CLI needs no special mode; the chain routes around the gap loudly. Verification and review do not relax under fallback — a substitute lane makes them matter more.
Choosing your implementation routing
Three modes, declared with one line in any CLAUDE.md that applies to the session. All three route what is DELEGATED: the two inline classes ("What the architect implements itself") never reach a lane in any mode — a small concurrency fix that is spec-saturated stays with the architect even in codex or mix mode. Canonical forms:
fable-orchestrator: implementation lane = grok (the unconfigured default)
fable-orchestrator: implementation lane = codex
fable-orchestrator: implementation lane = mix
- grok — every delegated implementation task goes to
grok-implementer. Fixed; cheap typing when specs are strong, with assurance from verification and the review tiers. - codex — every delegated implementation task goes to
codex-implementer. Fixed; maximum reasoning on every diff, for shops that want fewer subtle bugs over token savings. - mix — the architect routes each task by kind: mechanical work the spec fully determines (wiring, CRUD, boilerplate, make-the-types-match) → grok; correctness-critical work (concurrency, auth/security, migrations, subtle state, anything the spec can't fully pin) → codex at its configured reasoning effort (high by default). When in doubt, codex. State the chosen lane and why in one line when delegating.
Honor the intent, not the exact string — any clear statement of implementation-lane preference in the user's instructions counts (e.g. "grok is my default implementation lane", "let the orchestrator pick the implementation model"). Mode changes routing only: the fallback chain, spec contract, verification, and review rules apply identically in all three.
Codex fast mode
One more optional line opts the codex lanes into the Codex CLI's fast service tier — canonical form:
fable-orchestrator: codex fast mode = on
Absent or off means off. When on, add a FAST MODE: on line to every codex-lane delegation — implementer and reviewer, in every lane mode (codex-reviewer cold-reviews grok diffs even in grok mode); the lane wrappers translate it into the supervisor's fast-tier flags. Fast is a speed trade, not a saving: ~1.5x output speed for ~2–2.5x credit burn, and it requires ChatGPT sign-in (API-key auth cannot use it). If the fast launch fails, the lane retries once at standard tier and reports the downgrade — a loud degrade, never a blocked task. Grok lanes are unaffected. As with the lane mode, honor the intent, not the exact string.
Codex effort
A second optional line sets the codex lanes' reasoning effort — canonical form:
fable-orchestrator: codex effort = <none|low|medium|high|xhigh|max>
Absent or high means high — the standing default. When configured and not high, add an EFFORT: <level> line to every codex-lane delegation — implementer and reviewer, in every lane mode; the lane wrappers translate it into the supervisor's env var, and the supervisor validates the level and refuses anything outside the set. The six values are what gpt-5.6-sol accepts (verified live on codex-cli 0.147.0; the API's generic enum also lists minimal, which this model rejects). Know the trade in both directions: above high buys deeper reasoning at more wall clock and more tokens; below high cheapens BOTH the implementation and the cold-review gate, since one knob moves both lanes. If a launch at a non-default level dies early, the lane relaunches once at high and reports the downgrade — a loud degrade, never a blocked task. Grok lanes are unaffected. As with the lane mode, honor the intent, not the exact string.
Grok effort
A third optional line sets the grok lanes' reasoning effort — canonical form:
fable-orchestrator: grok effort = <low|medium|high|xhigh>
Absent or high means high — the standing default, and the supervisor always passes the flag explicitly: an omitted flag would fall through to the machine's ~/.grok/config.toml default, varying lane behavior invisibly per machine. When configured and not high, add an EFFORT: <level> line to every grok-lane delegation — implementer, reviewer, AND researcher, in every lane mode; the wrappers translate it into the supervisor's env var, and the supervisor validates the level and refuses anything outside the set. The four values are what grok-4.6 accepts (verified live on grok CLI 1.0.3; the enum is model-dependent — grok-4.5 rejects xhigh). One knob moves all three grok lanes: above high buys deeper reasoning at more wall clock and tokens on implementation, cold review, and research alike; below high cheapens all three, the cold-review gate included. If a launch at a non-default level dies early, the lane relaunches once at high and reports the downgrade — a loud degrade, never a blocked task. Codex lanes are unaffected. As with the lane mode, honor the intent, not the exact string.
The spec contract
Implementers share none of your conversation context. And the implementers are high-reasoning models: a spec that states the outcome, the invariants, and the failure scenario being prevented lets the implementer catch what the architect missed; a spec that dictates only keystrokes converts that intelligence into transcription and makes the architect's blind spots load-bearing — the implementer will faithfully build the architect's bug. So specs state WHAT must become true and WHY, and prescribe a mechanism only when a ratified ruling pins one — citing the ruling, so the lane knows it's pinned rather than guessed. Every delegation carries all seven parts — inline in the dispatch prompt, or via the marked spec file per the Delivery paragraph below:
- Objective — the outcome to achieve and the failure scenario it prevents, one paragraph. Outcome, not keystrokes: "this terminal state must not read as a failure to any status consumer" over "publish status X".
- Files — exact paths to create or modify
- Interfaces — signatures, types, or API shapes the code must match
- Constraints and invariants — project conventions, things not to touch, the invariants that must hold with their known consumers named, and pointers to context the lane cannot infer: ratified rulings, sacred paths, consumer maps. A pinned mechanism belongs here only with its ruling cited. Any artifact the spec tells the CLI to read (a findings report, a plan, a design doc) is cited by absolute path and must exist at dispatch: the wrapper stats it at preflight — never reads it — and reports a missing or empty one as a dissent-shaped stop, not a lane outage. The remedy is a corrected spec (the right path, or a regenerated artifact), so a dangling path costs a round.
- Verification — the command(s) that prove it works: the smallest bundle that exercises the change, not the full suite (full suites run at integration points; the command belongs to the producer's dev loop — the wrapper grades its captured output and never re-runs it — and its cost still matters: the producer iterates on it)
- Commit — who commits:
lane(the default when unstated) orcaller. Underlane, the wrapper records the starting HEAD before launch, the work is committed on the current branch at settlement (by the CLI or by the wrapper as backstop, scoped to the files the task actually changed — acaptured-failgrade leaves the tree uncommitted instead, or reports the hash of a commit the CLI made before failing, grade flagged), and the report carries the evidence grade and the commit state. Committing is not shipping: cold review runs on the committed diff by ref, respec rounds land follow-up commits, and the architect owns squash/merge at integration points. A spec that saysCOMMIT: callergets the working tree back uncommitted instead, its evidence grade stated — but say it explicitly; a constraint line about commit style is a message convention, never a transfer of ownership. Lane-owned commits also sharpen the parallelism rule: concurrent lanes committing in one shared checkout contend on the git index and can sweep each other's staged work, so parallel implementation lanes get separate worktrees (see "Parallelism") — full stop. A batch spec sayingCOMMIT: calleravoids the index contention but does not buy shared-checkout parallelism: the one-live-lane checkout ownership rule still applies, because branch switches and foreign edits corrupt a non-committing lane's tree just as surely as a committing one's. - Premises — a block headed
PREMISES(decoration on the heading is fine —## PREMISES,**Premises**,- PREMISES,=== PREMISES ===; the gates tolerate it), closing the spec: one row per factual claim the spec rests on, each citing where it was read THIS session. Five row types:Lliteral/constant (name = value — file:line);Iinterface (signature — file:line);Pprecedent (citation — file:line, plus a one-line DATA-level match: why the cited case's inputs and payloads match this one, not merely its API shape);Eemission (for every value the change emits, stores, or reports: field ← what fills it, what can be inside it, bounded or not, PII class);Aassumption (an explicitly marked assumption: the claim, and why it is held without a code read — no citation required; the honest form for a genuine design assumption, never a substitute for a read the architect could cheaply run). A row verified in a different context than it will run in (a bare-Dart probe standing in for a zone-wrapped test harness, a debug-only path standing in for a release invariant) names that context and counts as unverified until verified in-context — the verifier reports such rows UNVERIFIABLE (ASSUMED is the verdict reserved for explicitArows). The rule is mechanical: no citation, no row (Arows excepted — their content is the declared absence of a read); no row, the claim comes out of the spec or the read happens now. Provenance is part of the rule: a citation is a code location the architect read fresh THIS session — never a review report, a reviewer finding, or another agent's output. A fact learned from a report is re-read in the code (cite the code, not the report) or markedA; the premise-verifier fails report-sourced rows on provenance: contradicted by the code → REFUTED; unsettleable → UNVERIFIABLE with the provenance failure named; confirmed by the code →CONFIRMED (provenance corrected)— feedback on the sourcing, not a pass for the habit. Rows are facts, not instructions — the block never restricts the implementer's own exploration or reasoning, and licensed dissent applies to premise rows exactly as to the rest of the spec: an implementer whose reading of the code contradicts a row stops and reports. On specs that emit (telemetry, errors, events) or touch security/concurrency/migration paths, the block goes pre-dispatch to thepremise-verifieragent — a cold read-only lens that confirms or refutes each row against the code and hunts the premises the architect didn't recognize as premises (self-audit structurally cannot find those); the architect corrects the spec before any implementation lane sees it. Two mechanical companions ride with that trigger, both in the dispatch prompt because the gates scan prompt text only. The marker: a spec that triggers by path (security/auth/concurrency/migration) carries aSECURITY TIERline — a bare control line likeTIMEOUT:, canonical formsSECURITY TIERorSECURITY TIER: <detail>, no decoration; without it, a path-triggered spec is invisible to the gates (emission-triggered specs need no marker; theirErows are visible). Detection escalates rather than guesses: any line BEGINNING with the words security tier — decorated, reworded, prose, or oddly separated (underscore, doubled spacing) — triggers the attestation demand, so a malformed marker bounces loudly with the canonical form named in the gate's message instead of silently not counting; plurals ("SECURITY TIERS") and mid-prose mentions are exempt, while an underscore terminates the word — a quotedSECURITY_TIER_*constant line bounces, deliberately. Keep spec prose from starting a line with those words. The E-row trigger is deliberately UNSCOPED: an E-shaped line anywhere in the dispatch prompt (first alphabetic text a capitalE,E1/E1a/E1ab-numbered with lowercase suffixes, or the word Emission — title case or ALL CAPS; uppercase-spelledE2Eprose is exempt, mixed-caseE2eis not) triggers — every scoping anchor tried was defeated by a rendering combination that cut real rows out of scope, and a bounce is recoverable where a dark gate is not. Keep quoted logs and lint output (pytestE assert,E: …,E501 …) out of dispatch prompts — log output is not spec content — otherwise expect a recoverable bounce. The attestation: the architect saves the verifier's returned report to an on-disk file (absolute path, scratchpad) and the dispatch carriesPREMISES-VERIFIED: <that path>. Enforcement is layered and mechanical: a plugin PreToolUse hook refuses implementer-lane dispatches whose prompt lacks the block (presence-only — it cannot judge row quality), and the implementer wrappers abort at preflight with a dissent-shaped report when the block is missing — initial spec or follow-up round alike, which the hook cannot see. Both layers enforce the attestation the same way: the hook refuses a triggering dispatch (anE-shaped line anywhere in the prompt, or aSECURITY TIERline) without thePREMISES-VERIFIED:line — bare at column 0, its value an unquoted absolute path starting with/and continuing with a non-space; pathless, relative,~, bare-slash, quoted, or placeholder values count as missing — and the wrappers stat the named file exactly like part 4's referenced artifacts — never reading it — with a missing or empty file a dissent-shaped stop whose remedy is a corrected dispatch. All of it is presence-based by design: it cannot judge truth, and an architect could defeat it by fabricating an attestation — accepted deliberately, because it converts silent skipping into active fabrication. Corrected specs for respec rounds carry their own block covering the newly verified facts — and a corrected spec is a NEW spec: rows added or changed since the last verified revision are unverified (a review round verifies the diff, never the new rows), so a triggering spec re-enterspremise-verifierfor them and carries a fresh attestation; both field-observed provenance failures entered exactly there, respec rounds with rows sourced from review findings. The gates cannot police freshness — last round's attestation line still names a file that exists, so a stale attestation passes both layers mechanically; re-verification on respec is this doctrine's duty, not the gate's. When the terminal Claude-fallback lane implements (no wrapper, no hook coverage), the architect appends the block — and honors the verification trigger and attestation — by the same rule as the two standing clauses below; that lane is covered by this doctrine text alone, stated plainly rather than papered over. Architect-inline spec-saturated diffs state the same block in-conversation before the diff is written — the duty produces the same artifact even with no dispatch to carry it (and per the checklist, it binds the inline class more, not less). Reviewer, researcher, and advisor lanes are exempt: they receive no implementation spec.
Delivery: short specs travel inline in the dispatch prompt; a long spec is written to an on-disk file (absolute path, scratchpad) and dispatched as a pointer, explicitly marked — a SPEC FILE: <absolute path> line, or words naming it the authoritative spec, so the wrapper can tell it from part 4's referenced artifacts. The wrapper cats the file into its prompt file: verbatim by construction, cheaper than any re-emission, and clear of the worktree-isolation Bash guard in one command (field- and probe-pinned 2026-08-10: the guard refuses oversized one-shot heredocs and any compound mixing command substitution with a redirect; chunked re-typing clears it too, at many calls plus transcription-drift risk). The file carries all seven parts, PREMISES included; the dispatch prompt ADDITIONALLY restates the PREMISES block verbatim (the premise hook reads prompts, not files), and the lane-config lines stay dispatch-side as always, never in the file. Mark any prompt text reproduced from the file as a reproduction, so the wrapper doesn't append a duplicate — and keep task content outside the file exceptional: anything premise-bearing belongs in the file, under its PREMISES block. Wrapper-consumed control fields also stay in the dispatch prompt itself — the lane-config lines, whenever it is not the default the COMMIT: ownership, and the PREMISES-VERIFIED: attestation whenever the spec triggers premise verification — because the wrapper reads them from the dispatch, never from inside the file. The SECURITY TIER marker is different in kind: it is spec content the implementer should see (the wrappers pass it through, unlike the attestation they strip), but it too must appear in the dispatch prompt, like the restated PREMISES block, because the gates scan prompt text only. Route a file-delivered spec to premise-verifier the same way: pass the marked path (it has Read; it reads the file fresh) alongside the dispatch's restated block. File delivery changes assembly, not consumption: the wrapper still reads the marked file for the spec fields it consumes downstream — the verification command it grades against, and any per-machine files part 4 names for worktree provisioning.
Two standing clauses ride with every spec via the lane wrappers' fixed closing block, so the architect never retypes them: licensed dissent — an implementer whose reading of the code contradicts the spec's approach or a premise it rests on stops and reports the conflict instead of implementing it (a dissent report is a successful outcome: it costs one round, where a faithfully implemented wrong spec costs a lane run plus a review cycle) — and test craft — tests use isolated state (never production defaults, real user directories, or live timers), every assertion must fail if the change is reverted, and nothing depends on wall-clock timing. When the terminal Claude-fallback lane implements (a plain subagent, no wrapper template), the architect appends both clauses to the delegation prompt itself — they are part of the spec contract, not a CLI-wrapper nicety. The architect acts on a dissent like a review finding: re-verify the disputed premise against the code, then either send a corrected spec (saying what changed) or overrule it with the pinned ruling cited; a dissent-triggered respec counts toward the two-round bound.
One grok-lane duty belongs to the architect, not the wrapper: the grok CLI auto-loads the repo's AGENTS.md and the user's global ~/.claude/CLAUDE.md as project instructions on every run, so any spec constraint that could conflict with what those files plausibly say must be restated explicitly in the spec by the architect — the wrapper passes the spec through verbatim and is forbidden to add it.
Estimate the task's wall clock honestly in every spec and include a TIMEOUT: <seconds> line whenever the estimate differs meaningfully from the implementation lanes' 1800-second default (the research/review lanes default to 600). An undersized budget kills a legitimate run mid-flight; an oversized one delays detection of a genuinely hung lane — accuracy beats generosity in both directions. When codex fast mode or a non-default effort is configured (see "Codex fast mode", "Codex effort", and "Grok effort" above), the matching lane's delegations also carry the corresponding FAST MODE: on / EFFORT: <level> line — like TIMEOUT:, lane configuration alongside the spec, not part of it.
A spec you can't finish writing is a signal the decision isn't made yet — that's architect work, not a reason to hand the ambiguity to a cheaper model.
Parallelism
Independent specs (no shared files, no ordering dependency) launch as parallel agents in a single message. Sequential chains and single-file surgery stay serial. One writer per module or package; schema and migration work is always serial — "no shared files" is necessary but not sufficient, because adjacent files, generated code, and lockfiles collide too. For heavy fan-out where parallel implementers must touch adjacent areas anyway, isolate each lane in its own git worktree (the Agent tool supports isolation: "worktree") and merge serially, verifying after each merge rather than only per lane. A shared checkout is owned by exactly one live lane from dispatch to settled report: the architect neither dispatches a second writer to it nor switches branches in it while a lane is live — a lane's git operations resolve against whatever is checked out at execution time, not dispatch time.
Worktree lanes start from a clean checkout: gitignored per-machine config (local.properties, .env, keystore files, …) does not follow into the new worktree, so every lane's first verification fails on missing machine config unless the spec provisions it. Name the needed file(s) in the spec — the wrapper copies exactly what the spec names at preflight, sourced from the main worktree or from an absolute path the spec supplies (git records no worktree parentage, so name the source when it isn't the main checkout; copies kept unstaged), and nothing else: per-machine config can carry secrets the vendor CLI can read, so which files cross into the lane is the architect's call, never the wrapper's. With wrapper re-runs abolished, a run that dies on unprovisioned config comes back captured-fail and costs a relaunch — one line in the spec is cheaper than a failed build per lane.
Past roughly four parallel lanes, raw agent calls stop scaling — every report lands in the architect's context. Where the harness's Workflow tool is available, propose orchestrating the fan-out through it instead: lane transcripts never enter the architect's context and the control flow is deterministic. It requires the user's explicit opt-in — ask, don't assume.
Waiting on lanes — background by default
Run every lane — implementation, review, research, advisor — in the background. That is already the Agent tool's default, and SendMessage continuations have no foreground mode at all — so the failure this section bans is explicitly passing run_in_background: false to wait in-turn. End the turn with a one-line status and act on the completion notification. A sequential dependency is not a reason to wait synchronously: the notification resumes the architect with full context either way, at the same near-fully-cached re-read cost, while a synchronous wait holds the turn open for the lane's whole wall clock — the user can't interject, re-prioritize, or stop the work until it closes. (The lane's CLI already runs detached inside the agent; this is about the architect's own Agent call, which is what blocks the session.) Invoke synchronously only when the result must compose with in-context state within the same turn — rare — and say so in one line. Keep wake-up status messages to a line or two so notification re-invocations stay cheap. This makes the single-lane case consistent with the parallel fan-out above instead of a different, turn-blocking mode.
A completion without a report is not a success
The lane wrappers launch their CLI detached; the wrapper's structured report (GROK REPORT, CODEX REPORT, …) — including its PROCESS: reap evidence on implementation lanes — is the architect's only signal that the lane is settled. If a lane task completes with anything else as its result (a "waiting" message, a narration fragment, silence), treat the working tree as UNSETTLED: an orphaned CLI process may still be alive, editing, committing, or pushing minutes after the task "completed". Before dispatching anything else to that tree or trusting your own verification of it: check git status / git log for surprises, check for surviving lane processes (pgrep -f 'grok --prompt-file', pgrep -f 'codex exec'), and group-kill anything found via its process GROUP, not its PID — PG=$(ps -o pgid= -p <pid> | tr -d ' '); kill -- "-$PG"; sleep 2; kill -9 -- "-$PG" (a pgrep hit is not necessarily the group leader, so kill -- -<pid> can miss or hit the wrong group). These checks are best-effort — an escaped process can detach from its group or not match the argv patterns — so the tree is the final authority: verification performed while a detached process was alive is void; re-run it once git status / git log are confirmed quiet and stay quiet. On git-mutating lanes this re-check applies to EVERY settlement, clean reports included: reap: group dead is necessary but insufficient — glance at git log / git status after settlement, before dispatching the next writer to the same checkout.
Related discipline: reuse a lane wrapper via SendMessage only for follow-ups on the SAME task (a respec round, a clarification on its diff). A SendMessage-resumed wrapper is a LIVE WRITER even when its previous report looked final — never dispatch a second writer for work already sent to it; settle it (structured report plus reap evidence) or explicitly abandon it (verify process death AND re-check the tree) first. Do not run many tasks through one long-lived wrapper — the observed failure mode is end-of-task discipline (waiting, reaping, reporting) degrading as the wrapper's transcript grows — field-observed as early as ~144k tokens (dropped spec items a fresh wrapper then executed first try), while its judgment still looks fine. A fresh wrapper per task costs one preflight and sidesteps it. Reuse within a task is bounded too: respec rounds accumulate transcript, degradation has been field-observed from ~144k tokens, and ~200k is the working ceiling — settle the wrapper and dispatch a fresh one for the next round before its transcript reaches that range; the corrected spec and the diff ref travel to the new wrapper, the degraded end-of-task discipline does not. If the settled — or explicitly abandoned, per the procedure above — lane ran in a worktree, deal with that worktree before dispatching the replacement: a branch checked out in one worktree cannot be checked out in another, so a same-branch replacement fails at the Agent-tool launch itself (field-observed 2026-08-08) — no wrapper ever exists and no report follows; that failure is a launch error naming the holding worktree, never the unsettled-tree signal above, so skip the orphan-hunt procedure for it. A clean tree is simply removed (git worktree remove). A dirty tree is uncommitted lane work awaiting the caller's arbitration — a captured-fail, a COMMIT: caller handback, a dissent that stopped after touching files, or a run that ended before a committable state — so never --force-remove it: arbitrate first — commit what's wanted (the tree becomes clean), or preserve everything for later arbitration with git stash push --include-untracked from inside the worktree (one step: it captures tracked AND untracked work into the shared repo, where it survives the removal, and leaves the tree clean — a bare git diff does neither, missing untracked files and leaving the tree dirty) — and then git worktree remove succeeds unforced. The lock is per-branch, so no alternative worktree name clears it for a same-branch replacement — arbitration-then-removal is the only path that preserves the work.
Commitment boundaries
Consult fable-advisor (read-only, verdict in under 300 words) at the moments that decide whether the next hour is wasted:
- Before committing to an architecture, data migration, API shape, or refactor strategy
- Whenever the same problem has resisted two distinct attempts
- Once before declaring a multi-step deliverable done
Pass it the decision, the constraints, the options considered, the exact file paths to read, and the decisive evidence pasted in (failing test output, traces, the numbers) — the advisor cannot run commands, and a verdict on unstated evidence is a guess. Act on the verdict or surface the disagreement — never silently ignore it. (If the session itself already runs on Fable, the advisor still earns its keep as a context-clean skeptic reading the actual code.)
Review tiers
Verification (below) is not review. Verification asks "did it do what the spec said, and do the checks pass?" Cold review asks "what is wrong that the author — and the architect's own framing — didn't see?" The architect reading a lane's diff is verification with cross-vendor eyes, not cold review: the architect wrote the spec and is primed by it. Tier by the diff:
- Mechanical diffs (renames, literal moves, no behavior change): verification only.
- Declared spikes (the caller explicitly marks the task throwaway/prototype, not headed to main): verification only, with the spike status restated in the report. A spike is DECLARED by the caller, never inferred — silently downgrading real work to spike treatment under pressure is exactly the failure this named tier exists to prevent. Spike status lasts only while the code is throwaway: if spike code is later promoted toward main, the promoted diff re-enters these tiers as normal behavior-bearing work (cold review, plus the security pass where it applies) before merge. A spike declaration on security/auth paths is a smell worth one explicit confirmation that the work is genuinely throwaway.
- Behavior-bearing diffs: add one cold review pass — diff only, no intent framing — from a model family DIFFERENT from the implementer's: grok implemented →
codex-reviewer; codex implemented →grok-reviewer; a Claude fallback lane implemented → either. Hand the reviewer a REF — a commit SHA or a base branch (the reviewer resolves and reports concrete SHAs) — never a diff file: resolved refs are immutable content addresses, while a diff file in a shared directory can be overwritten by a concurrent lane between write and read, and a clean review of the wrong bytes is indistinguishable from a real clean review. (The lane-commits default above exists partly for this: a committed diff always has a ref.) Reviewing the uncommitted working tree is allowed for pre-commit checks but is NOT immutable — prefer committed refs. A reviewer from the author's own family shares the author's blind spots and is not a second lens. Architect-authored diffs (the spec-saturated inline class) enter this tier identically: the architect is a Claude-family author, so either CLI reviewer qualifies as cross-family — if one CLI is unavailable, use the other before any Claude fallback; the architect never self-certifies its own diff. When BOTH CLI reviewers are down, the Opus cold pass on an architect-authored diff is SAME-family: run it, but announce it as a degraded cold read (a context-clean different model, shared vendor lineage) — never present it as the cross-family gate. A tier settled on the degraded read is settled only by surfacing it: the ship decision states that no cross-family lens ran, and the user owns that residual. If the opposite-family CLI reviewer is unavailable, the cold pass falls back to the strongest Claude model available (Agent tool,model: "opus", diff-only and cold — Claude is a third family versus both CLI implementers), announced like every substitution. Review is never silently skipped and never silently same-family. A reviewer report ofSTATUS: partial— a refused launch or a half-covered diff — does not satisfy this tier: fix what stopped it (the config, the ref, the batch split) and re-dispatch until a complete cold read exists, or fall back per the chain above. - Security / auth / concurrency / migration paths: additionally have a strong Claude model read every error / nil / empty / timeout branch for silent failure (a read-only session pass or an Opus subagent — on architect-authored diffs the session pass is disallowed: the author reading its own error branches is self-certification, so this read runs as an Opus subagent). Omission-type misses never appear in any reviewer's report, so this tier is about completeness, not a second opinion.
If in doubt whether a diff is mechanical, it isn't.
Reviewer findings are claims, not verdicts — the architect runs the refutation pass before acting. For each finding: read the cited file:line against the actual code and try to refute it. Refuted → drop it, with a one-line reason. Confirmed → a corrected spec goes back to the implementation lane, never a hand-fix — and on an architect-authored diff the architect is that lane: it fixes its own diff inline and the fix re-enters cold review as the respec round. Cold lenses trade precision for recall, so false positives are expected — each costs one refutation, while every unique true positive is pure gain. On security-tier diffs, also refute the clean report: "no findings" is itself a claim, so spot-check the diff's riskiest branch yourself before accepting it — the unchallenged "it's fine" is where bugs hide.
Refute in severity order — the wrapper has flagged citation problems (UNCITED), not pre-cleared them: refute cited findings first, and take UNCITED items last as cheap skims rather than full refutations. The top of the queue decides ship/no-ship. And bound the loop: after two respec → re-implement → re-review rounds on the same diff, stop and surface the residual findings to the user with your recommendation instead of thrashing.
Verification
Reports are claims, not evidence — but machine-captured logs are. At lane level the only verification runs are the producer's own: the wrapper grades the captured log — the verification command executing and passing as the run's final act is captured; executing and failing is captured-fail (cited; no backstop commit — a commit the CLI made before failing is reported with the grade flagged); no captured execution is claim-only — and never re-runs it. Re-run authority sits with the architect: a claim-only grade on work headed for a deliverable earns the architect's re-run at an integration point (merging, declaring a deliverable done), never a wrapper re-run after every lane report. The architect reads the diff and spot-checks the report's evidence. "Should work", "tests should pass", or a report with no execution evidence means the task is not done. A lane that reports a spec gap gets a corrected spec, not a "use your judgment".