Dev Orchestration Harness — how we work — Design Spec (#TBD)
Milestone: dev-orchestration-harness Manual: TBD — the contributor manual has no “how the agent team works” page. It needs one: the manager/worker split, how a lane is dispatched, which model each role runs, and how work is claimed so two lanes never take the same issue.
AGENTS.mdholds the rules today.Design-led. Status: DRAFT — model RATIFIED by the design lead 2026-09-12 (Fabel manager, sonnet/opus workers). Stays DRAFT until its enforcement lands — a guardrail asserting the routing policy is in
AGENTS.md— because a governance spec has no code surface to bind a test to. How the agent team is structured to get work done without wasting tokens. Grounded in what this session showed.
The model — roles, and a swappable model list
Work is one layer deep: a MANAGER dispatches WORKERS. Roles are stable; the model bound to each role is config — swap a model by editing its row; add/remove a model without touching the prose.
| Role | Current model | Purpose |
|---|---|---|
| manager | fabel |
always-on driver: coordinate, fast design/routing/review, own the verify gate. Does not grind implementation when a worker can. |
| worker — default | sonnet |
implement a specced feature + its tests, bulk/mechanical edits, doc sweeps. Most writing. |
| worker — deep | opus |
escalation only: hard root-cause debugging, tricky design, deep review. One or two at a time. |
This inverts the usual tree — the manager is cheaper than the deep worker, which is correct:
spend the expensive model only on hard reasoning, keep the always-on coordinator fast and cheap.
The Current model column is the only thing that changes when the model roster changes.
The question
Proposal: the design lead → several opus area-managers (KG, testing, backend, frontend), each in its own tmux window, each managing sonnet workers that implement+test a feature; everyone uses jCodemunch. Is a two-layer (opus-manager → sonnet-worker) tree the right shape, and how do we do it token-efficiently with fabel/opus?
What this session taught us (the evidence to design from)
- The expensive work was THINKING, not writing. The KG-readable pipeline (writing) was cheap and fast. The costly parts were root-causing the UI harness (4 hidden layers) and reviewing drifted tests vs code — judgement, not typing. → Spend opus on reasoning (design, debug, review); spend cheap models on mechanical implementation.
- Verification is the bottleneck. Once the CLI build path was unblocked, a full unit run is
~2 min and a UI run ~2.5 min, serialized. More writers don’t help if every change waits on
one slow verify. → Optimize the verify loop (targeted
-only-testing, the isolated-derivedDataPath, headless pytest) before adding parallel writers. - A layer that only coordinates is the waste. An opus manager whose job is dispatch reads context and hands off — high token cost, low reasoning value.
Ruling proposal (the design)
- Keep it FLAT by default. the design lead → me (Fabel) → sonnet workers for implementation (opus workers only for hard reasoning). Me = fast design + routing + review + the verify gate. Workers = write to a spec, run their own area tests, report. No standing middle layer.
- Add a dedicated opus “area lead” ONLY for a large, long-running milestone whose context is
too big to hold alongside everything else (e.g. a whole KG or testing milestone). It owns that
milestone, dispatches its own sonnet workers, and reports up. One or two at a time — not one per
area on principle. This is the existing
session-start-milestone-workerpattern; reuse it. - Routing (the token policy): the manager does design/review/routing + the verify gate; the default worker does the writing (features, tests, bulk edits, doc sweeps); the deep worker is escalation-only (hard debugging, tricky design, deep review). Route DOWN for writing, escalate UP only for hard reasoning, and never spend any model on what a guardrail/script already does. (Which model fills each role: the table above.)
- tmux windows vs subagents: subagents (the
Agenttool) for bounded parallel tasks that report back within a turn (context-isolated, no plumbing). Persistent tmux lanes only for long-lived autonomous work that must survive across turns (an overnight milestone). Don’t spin tmux windows for tasks a subagent finishes in one pass. - jCodemunch for all navigation (already the rule) — it’s the shared, token-cheap index.
- The verify gate is mine, non-negotiable. Workers write + run their area tests; I run the
cross-cutting build/test before anything lands (this session’s
-testPlan fichero+ isolated-DD CLI path is the recipe). Unverified worker output does not merge.
Behaviors
orch.flat-default[PROPOSED] — routine work is design lead → manager → default worker, no middle layer.orch.area-lead-on-demand[PROPOSED] — an opus area-lead only for a large milestone; ≤2 at once.orch.model-routing[PROPOSED] — the routing table above; route down.orch.verify-gate— [CONVENTION] (retagged 2026-09-18 — previously tagged OK-and-keep) I own the cross-cutting verify; unverified worker output blocks. This is a manager discipline about WHO runs the gate and WHEN a merge is allowed — the sameverify_all.shruns identically no matter who invokes it, so there is no code path that could regress independently of a human/ agent choosing to skip this step. Challenged (2026-09-18, per creative-director instruction — is it really untestable?): close to testable in ONE narrow sense — proposed, not built: a guardrail could grep every merge/release/land script (scripts/*merge*.sh,release-all.sh) for averify_all.shinvocation appearing before anygit push origin main, catching a NEW script that lands code without gating. That would pin “no script bypasses the gate”, not “I personally ran it” (still a human/agent choice this repo can’t observe). Stays CONVENTION. Seegit-worktree-workflow.md’s “Marking a convention” section for the tag’s real, rule-h-guarded semantics inspec_pipeline.py.orch.subagent-vs-tmux[PROPOSED] — subagents for bounded tasks, tmux only for cross-turn lanes.orch.small-guardrails-stay-green-after-landing— [BROKEN] (#4902) a commit that lands should not leave a small, mechanical guardrail red — a missing tooltip, a missing#Preview, an un-declared scene environment contract, and the like are cheap to catch and cheap to fix at landing time, and expensive to notice later once nine of them have accumulated. Verified live, 2026-09-19: ninescripts/check_*.pyguardrails are red from this week’s own commits, each traced to the specific commit that introduced it (check_capability_scrapes,check_comment_hygiene,check_dead_files,check_mainactor_view_statics,check_native_controls,check_preview_coverage,check_scene_environment_injection,check_tooltips,check_test_assertions) — filed as one issue, #4902, since the pattern (not the specific rule) is the shared root cause:gate unit/targeted pytest runs don’t include the full--fastguardrail sweep, so a small violation ships unnoticed until a release- readiness pass finds it. Test: the guardrails themselves; the real fix is including the full--fastsweep (or the specific guardrails a change’s file paths touch) in whatever gate actually runs before a commit lands, not only at release time.orch.docs-paths-stay-accurate— [BROKEN] (#4908) a doc that names a file path should name one that exists.scripts/check_docs_paths.pyis currently RED: 5 of 14 named absent paths are unaccounted (9 already allowlisted). This class has been repeatedly flagged this session as pre-existing, unrelated baseline noise, never independently root-caused before now — filed so it has a real owner. Test: the guardrail itself.
Open questions for the design lead
- Is a standing opus area-lead per area worth its coordination cost, or is on-demand (per big milestone) enough? (I lean on-demand — this session was all done flat + fast.)
- fabel’s role: reserve it for visible Xcode UI iteration, or also for cheap bulk writing?
- Agents/skills audit: there are ~31 agents and ~138 skills loaded. Many overlap (multiple code-reviewers, multiple session-start variants, several planning skills). Worth a pass to cut the ones we never invoke — separate short task, listed as a follow-up below.
- For the maintainer (#4911):
check_docs_publicationfinds new pages underdocs/user_manual/(a “Getting Started”/”About this Manual”/”About this Book” cluster) not linked from the nav and not allowlisted — his own in-progress writing, not a defect. Should these be linked into the nav now even in draft form, moved out of the publisheddocs/tree while still being drafted, or explicitly allowlisted as in-progress? Not decided here.
Follow-ups (do when the token budget resets — not now)
- Audit agents + skills; propose a trimmed set (the overlapping reviewers/planners especially).
- Create the
dev-orchestration-harnessGitHub milestone + issues for the routing policy. - Fold the routing table into
AGENTS.md(the operational manual) so every lane obeys it. - User manual: the design lead documents “how we work” for the guide once the policy is settled.