Supervisor and Subagents

Role-scoped delegation on models chosen per risk.

Why we use a supervisor and role-scoped subagents, and what our August 30, 2026 review of model-choice evidence found. Two checks challenged a reviewer metric and a security-refusal rationale; neither established which model was best.

View as Markdown llms.txt

Paper 03

Branching judgment connects to a gate: decisions about the work meet conditions for proceeding.
Judgment / Gate
Reading time
26 min read
Diagrams
01
Last revised
2026-09-13

Published 2026-09-01 · Revised 2026-09-13 · Revision history

Technical verification: 2026-08-30; scope and evidence are described in the article.

By Yianna Kokalas & Claude

How this paper was written. This is a working paper from a production side project: software built for the Magic: The Gathering community, with real users, built and operated by one engineer (an enterprise engineer by day) together with Claude, Anthropic’s AI model. Every mechanism claim was fact-checked against the running code before publication. Checking the code and skill definitions revealed nine places where our documentation had drifted, and two claims we had repeated were challenged by measurement before this went out. The consequential findings appear beside the claims they qualify, with a visible record of discrepancies after the argument.

Position: the working unit of serious agentic engineering is not one strong agent with a long leash. It is a supervisor delegating to role-scoped subagents, each with its own context window, its own permissions, and a model chosen for the risk of its specific job. The supervisor holds the plan, evaluates the subagents’ results, and decides what happens next; the subagents do the work. This is the same trust arc the previous paper in this series walked (The Drain): autonomy is extended only as far as verification allows, and role boundaries are what make verification tractable. A reviewer with a fresh context does not inherit the implementer’s conversation, though it can still make the same mistake. A fix agent that may not merge must return its work for review.

Correction · 2026-09-13

Fresh contexts do not prevent shared mistakes, and role instructions are not necessarily access controls. The implementation guide permits an in-review transition on a documented push-failure path. The supervisor handles merge eligibility; the drain marks the ticket done after deployment verification. The prose and diagram now distinguish these responsibilities.

View revision →
Corrected · 2026-09-13
Correction · 2026-09-13

Fresh contexts do not prevent shared mistakes, and role instructions are not necessarily access controls. The implementation guide permits an in-review transition on a documented push-failure path. The supervisor handles merge eligibility; the drain marks the ticket done after deployment verification. The prose and diagram now distinguish these responsibilities.

View revision →

To assess the system, we checked its code and skill definitions, reviewed the records behind its model choices, and examined two separate empirical checks: a reviewer-log analysis and a security-refusal test. These activities address different parts of the same question:

Do role-scoped subagents on deliberately different models beat one strong agent, and is each of our model assignments still evidence-justified, or a habit nobody re-measured?

The honest answer, argued in section 6: the role-scoping is incident-justified and we would rebuild it; the model assignments mostly are not. The source review found many assignments without comparative evidence. The measurement-backed choices it identified were local classifiers; other choices rested on decisions, incidents, or precedent. Section 5 gives the reported inventory and its counting limitations. A failed swarm also challenged one delegation pattern, and the skill records that incident in its own body. The public account focuses on the assignments that explain the architecture and its limits. The paper’s response to the unevidenced rows is not backfilled justification: section 6.1 uses the security-refusal test to show how a model-choice rationale can be tested, and what its result can support. Two empirical checks were completed before publication. One killed a number from the previous paper in this series. The other left the repeated security-refusal rationale unsupported: 0 refusals in 12 selected diffs, for thirteen dollars. That test measured engagement, not review quality or the behavior of the full tool-using reviewer.

The model assignments, relative prices, ticket status, and uses of “now” or “current” below describe the system as documented on August 30, 2026, unless another date is given. They are not a current model catalog or a new verification of the running system. Fable, Opus, Sonnet, and Haiku are the model names used in those records; descriptions such as “strongest” state the assignment rationale, not a measured ranking on these tasks.


1. The shape of the unit

The system is a planning vault: a git repository of Markdown ticket specs, plus skills (versioned prompt programs a session can invoke) and a headless dispatcher called the drain that turns approved tickets into merged pull requests with no human in the loop. A “supervisor” here is the one session that owns a run: it reads the ticket, spawns every worker agent itself, scores their results, and decides whether the run can advance. A “subagent” is a worker spawned for exactly one role, with a fresh context containing only what the role needs.

Three properties define the unit, and none of them is stylistic:

  1. The supervisor spawns everything. The harness blocks subagents from spawning subagents, so delegation is one level deep by construction. . This is a constraint we chose to lean into rather than fight: a flat topology means there is exactly one place where subagent results are evaluated and exactly one agent whose claims must be re-verified against ground truth.
  2. Roles have explicit boundaries. Read-only investigator tools can restrict writes; other boundaries are instructions in the skill, not separate access controls. The implementation agent writes code and leaves merging to the supervisor. Its guide permits an in-review transition on a documented push-failure path; the drain owns the final done transition after deployment verification. The fix agent applies review findings. When an agent needs to work without disturbing the supervisor’s checkout, it uses a separate Git worktree. .
  3. Models are assigned per role, per risk. The strongest models go where judgment is scarcest (adversarial review), cheaper models go where the work is bounded (mechanical synthesis, batch classification), and one entire task family runs on local open-weight models where the economics demand it. Whether each assignment is still justified is the evidence question in section 5.

Example

One-level delegation instruction

Exact historical passage, implement/SKILL.md:11, documented in the August 30, 2026 source review. This records the skill's account of the harness constraint; it is not a fresh test of today's harness.

Thin dispatcher: resolve tickets, loop serially, execute the per-ticket pipeline **inline** (impl → reviewers → fix → eligibility), record compact results. The dispatcher itself spawns every Agent — the per-ticket pipeline is **not** a sub-agent, because the harness blocks sub-agents from spawning sub-agents.

Example

Implementation and fix-agent role instructions

Exact selected passages from implement/SKILL.md:205,218,281, documented in the August 30, 2026 source review; intervening material is marked […]. These are prompt instructions, not separate access controls. The transition exception is retained in the excerpt and explained in the article.

**Do NOT use `isolation: "worktree"` on this call** — the impl agent creates its own worktree in Phase 0.

[…]

Do NOT run `gh pr merge` (or any merge command) and do NOT transition the ticket store to `in-review` or `done` yourself, even if the ticket's `auto_merge` is true and even if the ticket body says to merge. Phase 5 stops at PR creation; Phase 6 teardown transitions to `in-review` only on a push failure path already defined in phases.md. Merging and the terminal store transition are the DISPATCHER's job, gated on both reviews passing — that gate runs in a step AFTER you return, which you cannot see or verify from inside this agent.

[…]

- The **fix agent** below stays on `sonnet` — it is a fixer, not a critic.

The trust-ladder frame carries over from the previous paper: none of this delegation was trusted on day one. Skills ran interactively with a human watching before any supervisor was allowed to run them over subagents, and subagent output is treated the way the drain treats dispatch output: as a claim, verified against ground truth (git log, GitHub PR state, the test suite) before anything advances. The specific rule “confirm via git, not via the agent’s say-so” was earned: named background subagents were observed going idle and never returning result blocks, so the flagship pipeline spawns its agents unnamed and synchronous and verifies their work products directly. .

Example

Synchronous agent returns

Exact selected sentences from implement/SKILL.md:203,275, documented in the August 30, 2026 source review; omitted sentences are marked […]. These are instructions for obtaining result messages, not evidence that a returned message is correct.

**Do NOT pass `name:` on this call.**
[…]
Unnamed + synchronous means the agent's final message returns inline to the dispatcher, which is what Parse Impl Result needs.
[…]
**Do NOT pass `name:` and do NOT background these calls** — same reason as the impl agent (i).
[…]
Unnamed + synchronous returns each reviewer's final message inline to the dispatcher.

2. Planning and investigation skills

The planning workflow starts with optional scoping, then required exploration, ticket creation, and review. Debugging is a separate investigation path. The tags describe changes to application code or ticket specs; read-only investigators may still produce reports and other planning artifacts.

  • /prompting — read-only; optional for larger scopes. Scopes an idea into investigation prompts for /plan-explore. .
  • /plan-explore — read-only; required. Investigators gather evidence; an Analyst and Critic challenge the discovery draft before the lead decides. .
  • /plan-create — write: ticket specs. Creators draft tickets, then separate reviewers and fixers check them. . Structural lint runs only when its executable is present. . Human approval is required before execution. .
  • /plan-review-swarm — read-only. Five specialist perspectives supplement the sequential review, each limited to three findings. .
  • /debug-swarm — read-only. Investigates unbounded bugs through independent evidence gathering; unsupported conclusions remain hypotheses. . Bounded bugs stay inline: a July 20 swarm returned no results from four investigators. This incident motivated the default; it was not a controlled comparison. .

Example

Scoping before exploration

Exact historical passage from prompting/SKILL.md:11–13 at the August 29, 2026 source revision used for this paper's code and skill checks. The command is still named `/prompting`; “scoping” describes its purpose.

You take a raw idea or feature description and decompose it into the minimum set of problem domains that need investigation. For each domain you produce a focused, self-contained subagent prompt designed for `/plan-explore`.

**This skill does NOT run exploration itself.** It produces a decomposition plan the user reviews before launching agents.

Correction · 2026-09-13

The historical planning skill ran structural lint only when the executable was present. The earlier account omitted that exception.

View revision →
Corrected · 2026-09-13
Correction · 2026-09-13

The historical planning skill ran structural lint only when the executable was present. The earlier account omitted that exception.

View revision →

Example

Ticket creation and discovery instructions

Exact selected passages from plan-create/SKILL.md:211–224,248,261–265, documented in the August 30, 2026 source review. Omitted lines are marked […]. The lead decides which additional tickets to create; creator agents write them. This is a prompt-directed workflow.

5. **Spawn creator teammates** in dependency waves:
   - **Wave 1**: All unblocked tickets (typically BE tickets)
   - **Wave 2**: Tickets blocked by Wave 1 (typically FE/EXT)
[…]
     model="opus",
[…]
**The creator never writes a second ticket file** — one writer per file, no races on dedup. The lead decides and spawns.
[…]
   6. **Cap the surviving set at 3 per run.** Keep the first 3 in collection order (after step 5's drops); report the rest as suppressed in Phase 7 and drop them.
[…]
**Spawn one final creator wave** for the survivors
[…]

Example

Structural lint gate

Exact command block and concluding explanation from plan-create/SKILL.md:273–293, documented in the August 30, 2026 source review; intervening instructions are marked […]. The shell conditional explicitly skips lint when the executable is missing, as qualified in the article.

```bash
if test -x bin/ticket-lint; then
  bin/ticket-lint --json <slug>
else
  echo "bin/ticket-lint not found — skipping pre-review lint gate."
fi
```

[…]

This catches missing required sections, invalid enum values, and malformed frontmatter before they consume a full LLM review round. When the engine is absent the gate is skipped (fallback note above) and Phase 4 proceeds for all tickets.

Example

Planning approval boundary

Exact historical passage, plan-create/SKILL.md:434, documented in the August 30, 2026 source review. The same boundary is stated for discovered tickets at line 265. This is a skill instruction describing the human promotion step.

   b. **Halt boundary**: created tickets land at `status: todo`, **NOT** `execution-ready`. `/plan-create` does **not** auto-promote — promotion stays a deliberate human/`/promote` step (the firewall between machine-drafted and machine-executed). `todo` ≠ `execution-ready` keeps `NEEDS_FIXES` tickets out of drain until a human fixes and promotes them.

Example

Exploration model assignments

Exact historical passages from plan-explore/SKILL.md:85,283, documented in the August 30, 2026 source review; intervening material is marked […]. “Highest-judgment” records an assignment rationale, not a comparative model-quality result.

**Always spawn subagents in parallel** to maximize coverage and speed. Use `model: "sonnet"` for all subagents — complex codebases require analytical capability.

[…]

The **Analyst** runs on the default model; the **Critic** is escalated to **Claude Fable 5** (`claude-fable-5`) because adversarial validation is the highest-judgment step here. If Fable is unavailable or the Critic returns a safety refusal / empty output, re-spawn the Critic on Opus 4.8 so the draft is never shipped unchallenged.

Example

Reviewer persona model and finding limit

Exact historical passages from plan-review-swarm/SKILL.md:63,99, documented in the August 30, 2026 source review; intervening material is marked […]. The model comparison is the recorded rationale, not a benchmark. The limit applies to each persona's response.

- `model: "sonnet"` (Haiku is too thin for adversarial-with-grep; Opus is overkill per persona)

[…]

Follow your persona instructions exactly. Your final message MUST be ONLY the JSON blob defined in your persona's Output Format section, wrapped in a ```json code fence — no prose before or after the fence. Cap at 3 findings.

Example

Debugging evidence rules

Exact selected passages from debug-swarm/SKILL.md:12,121,244, documented in the August 30, 2026 source review; omitted material is marked […]. These instructions constrain what investigators may report; their existence does not establish compliance in every run.

**Prime directive (non-negotiable): a conclusion without evidence is a hypothesis.** No investigator, and not you, may declare a bug "not reproducible", a script "read-only", or a fix "working" without runtime evidence: console output, prod/dev data, logs, or an executed command result. If evidence could not be gathered, the verdict is `INCONCLUSIVE`, never `NOT_REPRODUCED`.

[…]

For each returned blob, check the evidence rule: any `conclusion` whose `evidence` array is empty gets demoted to a hypothesis in your synthesis, regardless of the investigator's stated confidence.

[…]

2. **`NOT_REPRODUCED` requires proof of the attempt**: the exact commands run, environment, account, and captured output. "I couldn't see it" without an executed attempt is `INCONCLUSIVE`.

Example

The recorded debug-swarm failure

Exact historical passage from debug-swarm/SKILL.md:55–58, documented in the August 30, 2026 source review. It reports a July 20 incident and a separate inline investigation, not a controlled topology comparison or newly reproduced result.

**Spawn four investigators only when the bug is genuinely unbounded.** Measured reality in this vault
(2026-07-20): a four-investigator swarm returned **0 of 4** result blocks, all four going idle without
delivering, and the entire RCA was produced by working the angles inline. A second bug, investigated
inline from the start, reached a sharper answer in ~15 minutes.

3. The flagship: the /implement pipeline

/implement executes one ticket end to end: implementation, two independent reviews, a bounded fix loop, then merge eligibility. It is the pipeline the drain dispatches headlessly, which means every role boundary in it must hold with nobody watching.

The diagram shows the August 30 configuration. On September 13, 2026, we changed the implementation-agent assignment from inheritance to an explicit Sonnet pin.

                          supervisor (thin dispatcher)
                          reads ticket, spawns all agents, scores verdicts,
                          checks merge eligibility
                               |
            +------------------+
            |
            v
  IMPLEMENTATION AGENT
  fresh context, builds its own
  git worktree, implements the
  ticket, runs the tests
  model: inherits the dispatcher
  may NOT merge or mark done
            |
            |  work product verified via git, not via self-report
            v
  +---------------------------+---------------------------+
  |                                                       |
  v                                                       v
  CRITICAL REVIEWER                          SECURITY REVIEWER
  correctness, design, tests                 auth, injection, secrets
  model: Fable interactively,                model: Opus in ALL modes,
  Opus under headless drain                  deliberately never Fable
  (cost); on refusal or death,               (recorded refusal rationale
  re-spawned on Opus; a missing              unsupported by the 12-diff
  review is NEVER scored PASS                test; see section 6.1)
  |                                                       |
  +---------------------------+---------------------------+
                              |
              both PASS?      |      findings?
                              v
                     FIX AGENT (model: sonnet)
                     applies review findings only;
                     merge-state gate runs first so a fix
                     never lands on an already-merged PR
                              |
                              v
                     BOTH REVIEWERS RE-RUN, FRESH CONTEXTS
                     (max 2 fix cycles, then verdicts decide)
                              |
                              v
                     merge eligibility: human opt-in flag AND
                     validation PASS AND tree-integrity PASS
                     (missing = fail closed) AND both reviews PASS
                              |
                              v
                     gh pr merge --auto --squash
                     (the pipeline never writes "done";
                     the drain does, after deploy verification)

The texture is in the gates, and each gate has a scar:

  • Fresh re-reviews. After a fix cycle, both reviewers re-run with fresh contexts rather than being asked “is it fixed now?” A reviewer that carries the prior conversation has already committed to a framing; a fresh one has not. .
  • The merge-state gate. Before every fix cycle the supervisor checks actual PR state, because in June 2026 a fix was committed to a branch whose PR had already merged. Findings against a merged PR become a follow-up ticket, never a commit. .
  • PASS-with-warnings is PASS. An operator ruling dated 2026-08-19, made after a green PR sat unmerged for a day over advisory nits. Only an explicit FAIL blocks. .
  • A missing review is never a pass. If the critical reviewer’s model refuses or dies, the same prompt re-runs on Opus; the absence of a verdict is treated as the most suspicious outcome, not the cleanest. .
  • The self-collision ban. Once preflight passes, re-deriving “is another implement running” from process listings is forbidden: on 2026-08-18 three headless dispatches found their own process with ps, concluded a collision, and self-aborted with zero work done. .

Example

Fresh re-review instruction

Exact historical Markdown instruction, implement/SKILL.md:401, documented in the August 30, 2026 source review. “Back to ii” means returning to the step that spawns both reviewers. This is a prompt instruction, not executable enforcement code.

- `status: FIXED` + `tests_pass: true` → re-run reviewers (back to ii — fresh contexts), increment `fix_cycles`.

Example

Merge-state gate instructions

Selected exact passages from the historical Markdown instructions, implement/SKILL.md:339–348, documented in the August 30, 2026 source review; omissions are marked […]. The prompt tells the supervisor to run a PR-state lookup and act on its result. The omitted explanation and follow-up procedure do not turn these instructions into an executable prohibition on commits.

**Merge-state gate (run BEFORE spawning any fix agent, every cycle)**:

```bash
bin/pr-status <alias> $PR_NUMBER
```

[…]

- `state=MERGED` → **do NOT spawn a fix agent on `$BRANCH`** — commits there create an orphan branch (2026-06 incident: dispatcher spun on review/fix agents while the PR had already auto-merged).
[…]
- `state=OPEN` → proceed with the fix cycle below.

Example

PASS-with-warnings instruction

Exact opening sentences of the historical Markdown instruction, implement/SKILL.md:402, documented in the August 30, 2026 source review. The following incident attribution is omitted here; its date and consequence remain in the article. This is the supervisor's decision rule after the two-cycle limit.

- After 2 cycles, judge by the **verdicts alone**: if either review's latest verdict is `FAIL`, set `ticket_status = NEEDS_ATTENTION` and proceed to v. If both verdicts are `PASS` — **including PASS with open warning-severity findings** — that is a clean exit, NOT NEEDS_ATTENTION: warnings are reported (Follow-up / Human Steps, `[warning]`-tagged), never merge-blocking.

Example

Missing-review instruction

Exact concluding sentence of the historical fallback instruction, implement/SKILL.md:279, documented in the August 30, 2026 source review. The preceding sentence directs the supervisor to rerun the critical-review prompt on Opus after refusal, failure, or a missing result block. This rule does not establish that a particular model actually refused; the paper discusses that evidence separately.

A missing review must never be scored as PASS — a refused/empty critical review is "not yet reviewed," not clean.

Example

Self-collision instruction

Exact opening sentences of the historical Markdown instruction, implement/SKILL.md:126, documented in the August 30, 2026 source review. Exit 0 means the preflight check succeeded. The remaining paragraph explains why process inspection can mistake the current dispatch for a competing run; this excerpt is an instruction to the supervisor, not a tool restriction.

**A passing preflight is binding — never re-derive collision state yourself.** Exit 0 means proceed, full stop.

The two reviewers cover different questions: correctness, design, and tests in one seat; security in the other. That division does not establish that two reviewers beat one. The recorded reason for keeping Fable out of the security seat was a claimed false-refusal risk on authentication and credential code. . No dated refusal artifact supported it. On August 30, Fable reviewed all 12 selected authentication-related diffs without refusing. The test supplied diffs as text and disabled tools; it did not exercise the complete reviewer workflow or validate its findings. Cost remained a reason to retain Opus, but the test did not establish the better reviewer model. Section 6.1 gives the scope and result.

Example

Recorded security-review rationale

Exact historical instruction, implement/SKILL.md:280, explaining the Opus spawn at line 269; documented in the August 30, 2026 source review. Its false-refusal rationale was unsupported by the August 30 inline-diff test. Its capability rankings and “no refusal risk” wording are recorded assertions, not findings this paper establishes.

- **Security review → `opus`** (Claude Opus 4.8) in ALL modes, deliberately NOT Fable: Fable's bug-finding gains exclude security analysis and its classifiers false-refuse on exactly the auth/JWT/credential code this reviewer reads, so Opus 4.8 (SOTA for security, no refusal risk) is the correct gate. This is an upgrade from the previous `sonnet`.

4. Models chosen per risk: how assignment actually works

Model assignment in this system is distributed across many choices, made in skill definitions, agent frontmatter, and dispatcher code. The mechanisms worth naming:

  • The dispatch pin. Every headless dispatch passes an explicit --model (default sonnet). This exists because on 2026-08-19 a bare dispatch inherited the operator’s interactive model selection and silently ran the drain on the most expensive model available, at roughly twice Opus cost, until the round errored out. The planning pipeline pins its phase dispatches identically. . The pin is evidence-backed. The choice of sonnet specifically is precedent (“every prior healthy dispatch had run on sonnet”), not measurement.
  • The implementation-agent pin. On August 30, the agent inherited the supervisor’s model. On September 13, 2026, we explicitly pinned it to Sonnet in interactive and headless runs. This removes a configuration dependency; comparative implementation quality remains unmeasured. .
  • The mode gate. Fable was expensive, so we configured drain runs to use Opus for critical review while we tried it as a lower-cost alternative. Interactive reviews kept Fable. We had not yet measured the difference in review quality. .
  • The security exception. The strongest model is excluded from the security seat in all modes, as described in section 3.
  • The local family. The backlog-hygiene classifiers (freshness, dedup, dispatch triage) run on local open-weight models via Ollama, pinned in a code registry with the benchmark table reproduced beside the pin. . This is the only corner of the system where model choice was measured properly: a 2026-06-01 benchmark of six models on 20 hand-labeled tickets, and a 2026-08-21 re-benchmark on a 70-entry hand-verified corpus. It is also where measurement delivered the most consequential result: on August 21, the deployed freshness classifier missed all 40 non-fresh tickets in the 70-ticket corpus. Valid output was not enough: a classifier that labels everything fresh cannot perform the intended filtering. Check the failures the classifier must detect, not just whether its output is valid.

Example

Implementation spawn without a model assignment

Exact historical spawn expression, implement/SKILL.md:194–201, documented in the August 30, 2026 source review. No model argument is supplied. This is the skill's prompt-level spawn expression, not executable application code; the historical account identifies model inheritance as its consequence.

Agent(
  subagent_type: "general-purpose",
  description: "Implement $NAME", mode: "bypassPermissions",
  run_in_background: false,
  prompt: <impl prompt below>
)

Verify model attribution before comparing results. In the August 30 source, dispatch defaulted to Sonnet while telemetry defaulted to an Opus label when DRAIN_DISPATCH_MODEL was unset. Grouping cost or outcomes by that label would misattribute runs. . The implementation agent’s inheritance was established separately by its spawn instruction; the telemetry mismatch alone does not prove which model ran.

Assignments can also conflict before execution: the user-scenario agent declared Opus while its exploration caller requested Sonnet. . The source establishes the conflict, not runtime precedence. The inventory below reports the caller’s Sonnet assignment for exploration; it does not resolve that agent’s executed model.

Example

Conflicting dispatch and telemetry defaults

Exact selected Ruby expressions from bin/drain:1257–1269,2282, documented in the August 30, 2026 source review. Omitted material is marked […]. With the environment variable unset, dispatch selects Sonnet while the telemetry constant selects an Opus label. These defaults establish a labeling mismatch, not the model used by an individual historical run.

def dispatch_model
  raw = ENV['DRAIN_DISPATCH_MODEL'].to_s.strip
  raw.empty? ? 'sonnet' : raw
end
# […]
DRAIN_DISPATCH_MODEL = ENV.fetch('DRAIN_DISPATCH_MODEL', 'claude-opus-4-8[1m]').freeze

Example

Agent model versus caller model

Exact selected historical lines from agents/user-scenario-researcher.md:4 and plan-explore/SKILL.md:85,230–233, documented in the August 30, 2026 source review. Markers separate the agent frontmatter, the caller's blanket rule, and its spawn expression. The snippets document the conflict; they do not demonstrate runtime precedence.

model: opus

[…]

**Always spawn subagents in parallel** to maximize coverage and speed. Use `model: "sonnet"` for all subagents — complex codebases require analytical capability.

[…]

Agent(
  subagent_type="user-scenario-researcher",
  model="sonnet",
  description="User scenarios: [topic]",

Example

Explicit dispatch model selection

Exact historical Ruby excerpts: bin/drain:1257–1269 and pipeline_runner.rb:235–239, documented in the August 30, 2026 source review. The first block is a complete helper; the second is one argument-list entry from the planning runner. The intervening marker separates files. Neither excerpt establishes that Sonnet outperforms another model.

def dispatch_model
  raw = ENV['DRAIN_DISPATCH_MODEL'].to_s.strip
  raw.empty? ? 'sonnet' : raw
end

# […]

     '--model', (ENV['DRAIN_DISPATCH_MODEL'].to_s.strip.then { |m| m.empty? ? 'sonnet' : m }),

Example

Interactive and headless reviewer assignments

Exact selected historical passages from implement/SKILL.md:264–265 and fixer-agent/SKILL.md:91–94, documented in the August 30, 2026 source review. The marker separates files. These are prompt-level assignments; the paper does not establish a measured quality advantage for the interactive model.

# $CRITIC_MODEL = "fable" when DRAIN_MODE is unset (interactive); "opus" when DRAIN_MODE=1 (headless)
Agent(subagent_type: "general-purpose", model: $CRITIC_MODEL,

[…]

**Reviewer models mirror `/implement`'s gated rule.** `/implement` runs the critical
review on Fable when interactive and Opus when `DRAIN_MODE=1`; the fixer is dispatched
by `run_fixer` which **always** sets `DRAIN_MODE=1`, so that rule resolves to **`opus`**
for the critical review here — never Fable.
[…]

Example

Historical classifier registry and benchmark comments

Exact selected Ruby lines and comments from hygiene_models.rb:18–73, documented in the August 30, 2026 source review; omitted code is marked with comment separators. The benchmark used 70 entries on August 21. These comments record that historical sample, not a new benchmark or proof of present performance. Registry entries are shown without the surrounding mapping.

#   gemma4:e4b       42.9% acc, non-fresh recall  0/40, 0 false-cancels, 20.8 tix/min
#   qwen3:30b-a3b    41.4% acc, non-fresh recall  3/40, 0 false-cancels,  3.6 tix/min
#   qwen3.8:27b-mlx  38.6% acc, non-fresh recall  2/40, 2 false-cancels,  5.3 tix/min
# […]
# The result is a DISPROOF, not a selection: no local model from 9.6 GB to 18.6 GB classifies
# freshness usefully, and prompt-tuning was already ruled out by
# […]
#   - gemma4:e4b emitted `fresh` on all 70 tickets. Its 42.9% IS 30/70, the corpus fresh
#     fraction. Ranking these models on headline accuracy selects the no-op, because the
#     models that attempt non-fresh verdicts score lower for trying. Judge on non-fresh
#     recall + false-cancels instead.
# […]
    triage:    ['TRIAGE_MODEL',  'gemma4:e4b'],
    freshness: ['HYGIENE_MODEL', 'gemma4:e4b'],
# […]
    freshness_escalation: ['HYGIENE_ESCALATION_MODEL', 'qwen3:30b-a3b'],
# […]
    dedup: ['DEDUP_MODEL', 'gemma4:e4b'],

5. The model-assignment inventory

The roles below explain the central tradeoff: delegation creates reviewable boundaries, but a model assignment needs evidence of its own. These are selected roles from the August 30 model-assignment inventory, not the complete operational inventory. The September 13 implementation-agent pin is described in section 4.

Role Model at the time of review Evidence for the choice
Implementation Inherits the dispatcher; Sonnet under the drain The dispatch pin followed a cost incident. Inheritance and the choice of Sonnet were not benchmarked.
Critical review Fable interactively; Opus under the drain Opus was a lower-cost trial. Review quality had not been compared.
Security review Opus The recorded Fable-refusal rationale was unsupported by the 12-diff test; finding quality remained untested.
Fixes Sonnet Bounded work was the rationale; no comparative measurement.
Ticket creation and review Opus No recorded comparative evidence.
Exploration and plan-review investigators Sonnet Recorded reasoning, without comparative measurement. Exploration also used a separate Analyst and Critic.
Local backlog classifiers Gemma and Qwen variants Benchmarked on labeled data. Measurement exposed a major failure in the deployed freshness classifier.

The August 30 internal inventory reported 33 assignment slots: 18 without recorded evidence and four backed by measurements, all involving local models. We cannot reproduce those exact totals from its grouped rows without making assumptions about how assignments were separated and evidence categories were counted. They remain a historical tally, not verified counts. The supported observation is narrower: several frontier-model assignments lacked comparative tests, while the local classifiers had been benchmarked. A recorded rationale or incident can explain a choice without establishing that it is the best model for the role.

Correction · 2026-09-13

The earlier article presented 33 assignments, 18 without evidence, and four measured choices as settled counts. Those historical totals cannot be reproduced from the grouped inventory without unstated counting and classification assumptions. They are now attributed and qualified rather than presented as verified totals.

View revision →
Corrected · 2026-09-13
Correction · 2026-09-13

The earlier article presented 33 assignments, 18 without evidence, and four measured choices as settled counts. Those historical totals cannot be reproduced from the grouped inventory without unstated counting and classification assumptions. They are now attributed and qualified rather than presented as verified totals.

View revision →

The pattern is worth stating plainly: the cheaper the model, the better its evidence. The local classifiers were benchmarked twice on hand-labeled corpora because they were suspected of being weak. The frontier-model assignments were never benchmarked because they were assumed to be strong. Suspicion produced measurement; confidence produced habit. One caveat on the word: “habit” in the evidence review describes the state of the record, not necessarily the state of the reasoning. Section 6 returns to the distinction.

6. What the evidence supports

Use role boundaries to make consequential steps inspectable. Fresh-context re-reviews, checking PR state before a fix, one writer per file, read-only investigators, and never counting a missing review as PASS address observed failures. They give the supervisor specific things to verify before work advances. That is the supported reason to adopt these safeguards. We have not compared the same tickets with a single strong agent, so neither better output nor a net benefit from parallel delegation has been established.

Correction · 2026-09-13

The failed swarm and separate inline investigation are incident evidence, not a controlled comparison. They support specific safeguards but do not establish that delegation produces better output than one strong agent.

View revision →
Corrected · 2026-09-13
Correction · 2026-09-13

The failed swarm and separate inline investigation are incident evidence, not a controlled comparison. They support specific safeguards but do not establish that delegation produces better output than one strong agent.

View revision →

Preserve what happened before the final PASS. Our August 30, 2026 analysis found a completed fix cycle in 26.8% of 347 dispatches. A final PASS can conceal an earlier failure and repair. . For a similar system, record initial findings, attempted repairs, and re-review outcomes separately. Then validate the findings before using those records to claim reviewer quality: warnings can trigger fixes, failed repairs can go uncounted, and this study did not measure false positives.

Correction · 2026-09-13

The reviewer study measured completed fix activity, not confirmed bugs or comparative reviewer quality. The revision corrects the verdict and cost-sample descriptions and removes causal and value claims the study did not establish.

View revision →
Corrected · 2026-09-13
Correction · 2026-09-13

The reviewer study measured completed fix activity, not confirmed bugs or comparative reviewer quality. The revision corrects the verdict and cost-sample descriptions and removes causal and value claims the study did not establish.

View revision →

Example

Review verdicts before and after a fix

Illustrative sequence, not a measured dispatch. Both reviewers run again with fresh contexts after the fix; the final verdict field records their latest results.

Initial review:  critical FAIL, security PASS
Fix:             implementation changed in response to the finding
Fresh review:    critical PASS, security PASS
Recorded final:  critical:PASS security:PASS

The same final value could come from a dispatch that passed on its first review.
Final PASS alone does not reveal what reviewers initially found.

6.1 Test the reason for a model choice

A model assignment becomes testable when its rationale predicts something observable. Our security-reviewer policy excluded Fable partly because of a claimed refusal risk on authentication code. On August 30, we tested that claim on 12 selected authentication-related diffs from two repositories: Fable engaged with all 12 without refusing.

That result left the refusal rationale unsupported in the tested setting. It did not select the better security reviewer: the test supplied inline diffs without tools, covered one day, and did not validate the findings. The practical lesson is to match the decision to the measurement. A refusal test can challenge an exclusion rule; choosing between reviewers requires comparing independently validated findings on the same inputs, alongside cost and consequential misses. That comparison remains open.

Correction · 2026-09-13

The 12-diff refusal test measured engagement with inline text on one day. It did not test July behavior, validate the findings, compare reviewer quality, or reproduce the full tool-using workflow.

View revision →
Corrected · 2026-09-13
Correction · 2026-09-13

The 12-diff refusal test measured engagement with inline text on one day. It did not test July behavior, validate the findings, compare reviewer quality, or reproduce the full tool-using workflow.

View revision →

Source details

Fable security-refusal corpus test

Summary of the internal test run on August 30, 2026 and written up on September 1.

The corpus deliberately selected authentication and credential-related changes from two repositories. Each diff received a separate model call using the security-reviewer guide, with its setup changed to supply the diff as text and disallow tools and repository access.

The recorded classification was 12 full engagements, no refusals, no partial hedges, and no errors. Fable calls cost $12.97. A separate single-diff Opus control cost $0.62; it was illustrative, not a model-quality comparison. The original write-up reports checking raw JSON outputs. This editorial review read that write-up, not those raw outputs.

Four outputs contained critical findings that were still unvalidated in the study. The test cannot establish how the model behaved in July or how it would behave with tools.

7. Open problems

  • Comparative reviewer quality remains unmeasured. The August 30 log analysis corrected the previous paper’s zero-fix claim, which used the wrong counter, and established repair activity. It did not establish which reviewer finds more consequential bugs. Initial findings, repair outcomes, and independent validation are prerequisites for that comparison.
  • A rationale can outlive its evidence by two months and be repeated in three places without anyone checking. The false-refusal claim was recorded on 2026-07-01, copied into two skill definitions and a memory note, and cited as settled in the fact-gather for this paper. Thirteen dollars left it unsupported in the tested setting. The open problem is not that one claim was wrong; it is that nothing in the system flags a rationale that has never been tested. Recording a testable rationale is a manual safeguard, not a guarantee that it will be checked.
  • Something moved the fix-cycle rate five-fold at the end of July, and we do not know what. 14.9% of dispatches ran a fix cycle before 2026-08-01; 77.3% after, with the 2-cycle cap now the modal outcome. Reviewer models were constant across the boundary. The step localizes to roughly 07-29 through 08-01, a window holding both a pipeline hardening batch (including the stalled-reviewer enforcement gate) and the start of a harder feature batch, and the four dispatches that could separate those explanations cannot carry an attribution. Until this is understood, no fix-cycle trend is interpretable as reviewer behavior alone.
  • The freshness classifier’s future is an open decision: move the task to a frontier model, retire automated stamping, or accept the no-op as a cheap TTL refresher. The 2026-08-21 decision records the question; nothing has answered it.
  • Fan-out ergonomics remain the weakest harness surface. The 0-of-4 idle failure, the stall alarms, the unnamed-synchronous workaround: all compensate for background agents that fail quiet. The system’s topology choices are partly downstream of that reliability gap, and would deserve another check against harness behavior if it closes. This paper’s own fact-gathering and refusal-corpus agents both went idle after finishing their work and before writing it up; the supervisor re-derived the results from their artifacts. The pattern the paper describes happened to the paper.

Discrepancies found while checking the paper

These findings from the August 30, 2026 source review are a public record to revisit, not a history of revisions to this article. Follow-up actions below are reminders; the current resolution of historical tickets has not been reverified. The September 13 implementation-model pin is a separately verified change. Filing a ticket alone does not establish that a discrepancy was resolved.

  1. Dispatch and telemetry used different model defaults. With the environment variable unset, dispatch selected Sonnet while telemetry labeled it Opus, invalidating model-based attribution of costs or outcomes. Align the defaults and check affected reports. .
  2. The two-skill Fable reservation was stale. A comment and memory note limited Fable to two skills, while assignments also included implementation review, exploration critique, copy review, and support. The historical review recorded a memory correction; the remaining descriptions need checking against the actual assignments. .
  3. The scenario agent and its caller requested different models. The agent declared Opus; the exploration caller requested Sonnet. This proves a source conflict, not which model executed. Resolve the intended assignment and verify runtime selection. .
  4. The agent index listed two missing agents. Both belonged to retired integrations. Remove or mark obsolete entries so the index does not direct work to unavailable agents; the historical review filed a documentation follow-up.
  5. Exploration instructions referenced retired sources. They requested a deprecated wiki and told synthesis to consult a tracker another step said to skip. Remove those paths or replace them with supported sources. .
  6. The documentation skill’s model requirement was only prose. It named “Opus 4.6,” identified as stale in the historical review, without enforcing the selection. Choose an explicit assignment or describe it as guidance rather than a runtime guarantee. .
  7. Freshness-filter documentation overstated the measured behavior. The deployed classifier missed all 40 non-fresh tickets in the 70-ticket benchmark described in section 4. Correct the filter’s description and revisit whether to replace it, retire automated classification, or retain only time-based refresh.
  8. The debug-swarm description advertised a path its body restricted. The headline offered four investigators; after a run returned zero of four results, the instructions favored inline work for bounded bugs. Align the description with that default so callers choose the appropriate path. .
  9. The implementation agent inherited its supervisor’s model. The spawn omitted a model argument, making interactive selection depend on the parent. On September 13, 2026, we pinned it to Sonnet in both modes (section 4). That resolves the configuration dependency; comparative implementation quality remains unmeasured. .

Example

Historical two-skill model reservation

Exact selected comment from bin/drain:1257–1269, documented in the August 30, 2026 source review. The comment records a convention that other assignments had outgrown; it does not restrict model selection at runtime.

# 2026-08-19 that silently switched the whole drain to claude-fable-5 (~2x Opus
# cost, reserved by convention for /fable-review + /drain-select, and the round
# 500'd out), when every prior healthy dispatch had run on sonnet. Override with

Example

Conflicting instructions about retired sources

Historical passages from plan-explore/SKILL.md:198,207–208,308, documented in the August 30, 2026 source review. Retired service names are explicitly redacted to preserve the public edition's existing scope; omitted intervening text is marked […]. These are conflicting prompt instructions, not evidence that either service was actually queried.

#### Subagent 2: [redacted tracker name] Search (skip — no [redacted tracker name] in vault)

[…]

    Search [redacted wiki service name] wiki and documentation for: [topic]

[…]

2. **Cross-reference** with [redacted tracker name] history

Example

Historical documentation-model requirement

Exact historical passage from doc-gen/SKILL.md:14, documented in the August 30, 2026 source review; the same model string also appeared in its description at line 3. This is a prose mandate and rationale, not executable enforcement or evidence that the named model is currently available.

**Model requirement**: This skill MUST run on Opus 4.6 for prose quality. The agent generates documentation prose directly — the quality of the model IS the quality of the docs.

8. References

  • Original research notes, August 30, 2026 (internal): workflow descriptions, model assignments, discrepancies, and source citations gathered before drafting. Later checks and corrections are documented separately.
  • Internal measurement notes: the reviewer catch-rate measurement (2026-08-30, 347 dispatches from forensic logs, fixture-validated) and the Fable security-refusal corpus test (2026-08-30, 12 diffs, every output verified from raw JSON), both quoted with their sample sizes and limits in section 6.
  • Internal decision records: the two local-model benchmarks (2026-06-01 and 2026-08-21) behind the only measured rows in the inventory.
  • The Drain: the dispatch layer under this paper, and the trust-ladder frame it borrows.
  • Files as Prose, Store as Truth: the substrate both run on.
  • The machine itself: the implement, plan-create, plan-explore, debug-swarm, and plan-review-swarm skills, the agent definitions, the dispatcher, the pipeline runner, and the model registry, private, at HEAD 2026-08-30.

This is a paper in the Yianna & Claude Whitepapers series: working papers on running a production side project at the output of a team, with a fleet of AI agents, alongside a full-time engineering job, written from the system’s own measurements and incident reports. Evidence citations reference our internal decision records and postmortems; where a claim could not be traced to a measurement, the text says so.

Revision history

2026-09-13 · Editorial

Clarified the original collaboration with Claude and ongoing editing with Astra. Yianna retains final editorial and publishing decisions.

2026-09-13 · Editorial, Correction, System update

Reorganized the workflow and evidence discussion, added inspectable historical excerpts, and kept all nine discrepancies visible for follow-up. Corrected overstatements about role boundaries, inventory counts, and what the studies establish. Recorded the explicit Sonnet implementation-agent pin and introduced publication history.

  • Correction · Important: Fresh contexts do not prevent shared mistakes, and role instructions are not necessarily access controls. The implementation guide permits an in-review transition on a documented push-failure path. The supervisor handles merge eligibility; the drain marks the ticket done after deployment verification. The prose and diagram now distinguish these responsibilities. Affected claim

  • Correction · Important: The historical planning skill ran structural lint only when the executable was present. The earlier account omitted that exception. Affected claim

  • Correction · Routine: Clarified that the planning lead approves discoveries and spawns creators to write additional tickets, rather than writing every ticket itself.

  • Correction · Important: The failed swarm and separate inline investigation are incident evidence, not a controlled comparison. They support specific safeguards but do not establish that delegation produces better output than one strong agent. Affected claim

  • Correction · Important: The reviewer study measured completed fix activity, not confirmed bugs or comparative reviewer quality. The revision corrects the verdict and cost-sample descriptions and removes causal and value claims the study did not establish. Affected claim

  • Correction · Important: The 12-diff refusal test measured engagement with inline text on one day. It did not test July behavior, validate the findings, compare reviewer quality, or reproduce the full tool-using workflow. Affected claim

  • Correction · Important: The earlier article presented 33 assignments, 18 without evidence, and four measured choices as settled counts. Those historical totals cannot be reproduced from the grouped inventory without unstated counting and classification assumptions. They are now attributed and qualified rather than presented as verified totals. Affected claim

  • Correction · Routine: Removed unsupported duration and seat-count details; qualified model attribution where declarations conflict; clarified that interactive tiering depends on the parent model and that Opus critical review was a lower-cost trial without measured quality differences. The internal research notes are now described as original research, not a complete current fact sheet.

  • System update · Important: On September 13, 2026, the implementation agent was explicitly pinned to Sonnet in interactive and headless runs. Previously it inherited the supervisor’s model. This removes a configuration dependency; comparative implementation quality remains unmeasured. Affected claim