feat(agents): pin dispatched judgment agents to opus — Fable = inline reflection only (BDR-076)

Reverses the BDR-066 rejected alternative (opus pins on audit agents):
session default is now Fable, so inherit burned Fable quota on every
dispatched audit/challenge. analyzer, plan-challenger, seo/geo/
validator-analyzer pinned model: opus; onboard's 6 general-purpose
audit dispatches carry model="opus"; tour Phase B repointed.
interviewer + client-handover-writer stay unpinned (inline-load only,
a pin there is inert). settings.json default: claude-fable-5[1m].
Census flipped: model-routing §3 + new §11 (61 pass), loops-light 35,
full make test green.
This commit is contained in:
Bastien Chanot
2026-07-19 17:38:55 +02:00
parent 9bc6ab7e07
commit 354ff2644f
10 changed files with 41 additions and 19 deletions
+5 -3
View File
@@ -42,9 +42,11 @@ Agent(subagent_type="plan-challenger", description="challenge:<lens>", prompt=""
""")
```
**MODEL (BDR-066):** plan critique is AUDIT JUDGMENT — do NOT pin
`model: "sonnet"`; the challengers inherit the big session model. (The executor
gates stay sonnet; the challenger does not.)
**MODEL (BDR-076, supersedes the BDR-066 inherit):** plan critique is AUDIT
JUDGMENT — the challengers are `model: opus`-pinned in their frontmatter: a big
tier, session-independent, off the session model. The session model (Fable)
keeps only this loop — synthesis, RE-THINK, gate. Never sonnet: that would
silently downgrade the judgment. (The executor gates stay sonnet.)
**Lens framing by `KIND`** (the agent's three lenses, read against the artifact):
- `build-plan` — will it WORK / will it BREAK / is it needlessly COMPLEX.
+15 -8
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env bash
# lib/tests/model-routing.test.sh — census: gate wiring + pins + executor shape (BDR-066)
# lib/tests/model-routing.test.sh — census: gate wiring + pins + executor shape (BDR-066, BDR-076)
set -u
R="$(cd "$(dirname "$0")/../.." && pwd)"
pass=0; fail=0
@@ -22,7 +22,7 @@ has "agents/feater.md" 'model: sonnet'
has "agents/hotfixer.md" 'model: sonnet'
has "agents/verifier.md" 'model: sonnet'
has "agents/security-auditor.md" 'model: sonnet'
fm_lacks "agents/analyzer.md" 'model:'
has "agents/analyzer.md" 'model: opus'
# 4) /feat executor shape
has "skills/feat/SKILL.md" 'subagent_type="feater"'
has "skills/feat/SKILL.md" 'verify-secure-loop.md'
@@ -54,17 +54,24 @@ lacks "agents/handover-doc-writer.md" 'AskUserQuestion'
lacks "agents/handover-doc-writer.md" 'Agent('
has "agents/client-handover-writer.md" 'subagent_type="handover-doc-writer"'
# 10) post-merge edge fixes (ronde): F1 feater applier carve-out, F2 /refactor
# dispatch + pin, F3 /analyze gated (in loop 1), F4 interviewer un-pinned,
# F5 audit agents' ABSENT pin locked (a stray sonnet pin would silently
# downgrade a live audit even though the skill's gate passed)
# dispatch + pin, F3 /analyze gated (in loop 1)
has "agents/feater.md" 'Applier path'
has "skills/refactor/SKILL.md" 'subagent_type="refactorer"'
has "agents/refactorer.md" 'model: sonnet'
fm_lacks "agents/seo-analyzer.md" 'model:'
fm_lacks "agents/geo-analyzer.md" 'model:'
fm_lacks "agents/validator-analyzer.md" 'model:'
# 11) BDR-076 — session model (Fable) = orchestration + inline reflection ONLY.
# Dispatched judgment agents pinned OPUS (big tier, session-independent;
# never sonnet — that would silently downgrade a live audit). Inline-load-
# only agents (interviewer, client-handover-writer) STAY unpinned: they run
# IN the main loop, a frontmatter pin there is inert and misleads.
has "agents/seo-analyzer.md" 'model: opus'
has "agents/geo-analyzer.md" 'model: opus'
has "agents/validator-analyzer.md" 'model: opus'
has "agents/plan-challenger.md" 'model: opus'
fm_lacks "agents/client-handover-writer.md" 'model:'
fm_lacks "agents/interviewer.md" 'model:'
has "skills/onboard/SKILL.md" 'model="opus"'
has "skills/tour/SKILL.md" 'model="opus"'
has "lib/challenge-plan.md" 'BDR-076'
printf 'model-routing census: %d pass, %d fail\n' "$pass" "$fail"
[ "$fail" -eq 0 ]