feat(routing): W1 no-inherit — fable skill-runners, opus review dispatches, dispatch-tier doctrine (BDR-077)
No dispatched agent inherits the session model anymore: - client-handover-writer's 7 general-purpose skill-runner dispatch sites carry model: "fable" (+ normative rule; spike-verified alias — resolves claude-fable-5, enum-validated, loud failure, never silent fallback) - ship-feature STEP 6 + init-project STEP 10 code-review dispatches carry model: "opus" (was: inherit — the leak the maps exposed) - model-gate.md §4: dispatch-tier doctrine (typed = frontmatter pin, built-ins = explicit model= at every call site) - census §12 (66 pass), make test green
This commit is contained in:
@@ -257,7 +257,12 @@ pipeline is reduced: only run /cso (single audit, single fix loop), skip
|
|||||||
STEP 6 deploy pause and STEP 7 /web-validate. Treat /cso as the only score for
|
STEP 6 deploy pause and STEP 7 /web-validate. Treat /cso as the only score for
|
||||||
the gate.
|
the gate.
|
||||||
|
|
||||||
For web projects, dispatch in **a single message with two parallel Agent calls**:
|
**Model routing (BDR-077):** EVERY `general-purpose` skill-runner dispatch in
|
||||||
|
this pipeline (initial audits, fix-loop re-dispatches, commit-change,
|
||||||
|
web-validate) carries `model: "fable"` — the child hosts gated orchestration
|
||||||
|
on the pipeline's behalf; it must never inherit the session model.
|
||||||
|
|
||||||
|
For web projects, dispatch in **a single message with two parallel Agent calls** (each with `model: "fable"`):
|
||||||
|
|
||||||
| Audit (web) | Subagent | Prompt template |
|
| Audit (web) | Subagent | Prompt template |
|
||||||
|---------------|-------------------|-----------------|
|
|---------------|-------------------|-----------------|
|
||||||
@@ -383,7 +388,7 @@ console). If no projected line is parseable, treat projected = 17
|
|||||||
|
|
||||||
### Re-dispatch prompt template (SEO + GEO loop)
|
### Re-dispatch prompt template (SEO + GEO loop)
|
||||||
|
|
||||||
Send to `general-purpose` subagent:
|
Send to `general-purpose` subagent (`model: "fable"`):
|
||||||
|
|
||||||
> Read `~/.claude/skills/seo/SKILL.md` and re-run it on this project.
|
> Read `~/.claude/skills/seo/SKILL.md` and re-run it on this project.
|
||||||
> Previous scores:
|
> Previous scores:
|
||||||
@@ -413,7 +418,7 @@ Send to `general-purpose` subagent:
|
|||||||
|
|
||||||
### Re-dispatch prompt template (HARDEN loop)
|
### Re-dispatch prompt template (HARDEN loop)
|
||||||
|
|
||||||
Send to `general-purpose` subagent:
|
Send to `general-purpose` subagent (`model: "fable"`):
|
||||||
|
|
||||||
> Read `~/.claude/skills/harden/SKILL.md` and re-run it. Previous score:
|
> Read `~/.claude/skills/harden/SKILL.md` and re-run it. Previous score:
|
||||||
> **`<SCORE_HARDEN_PREVIOUS>`/20** — below threshold. Iteration `<N>` of
|
> **`<SCORE_HARDEN_PREVIOUS>`/20** — below threshold. Iteration `<N>` of
|
||||||
@@ -424,7 +429,7 @@ Send to `general-purpose` subagent:
|
|||||||
|
|
||||||
### Re-dispatch prompt template (CSO loop — non-web only)
|
### Re-dispatch prompt template (CSO loop — non-web only)
|
||||||
|
|
||||||
Send to `general-purpose` subagent:
|
Send to `general-purpose` subagent (`model: "fable"`):
|
||||||
|
|
||||||
> Read `~/.claude/skills/cso/SKILL.md` and re-run it in **daily mode**.
|
> Read `~/.claude/skills/cso/SKILL.md` and re-run it in **daily mode**.
|
||||||
> Previous score: **`<SCORE_CSO_PREVIOUS>`/20** — below threshold.
|
> Previous score: **`<SCORE_CSO_PREVIOUS>`/20** — below threshold.
|
||||||
@@ -510,7 +515,7 @@ listed changes manually before deploy." Continue to STEP 6.
|
|||||||
|
|
||||||
If `PENDING_CHANGES` non-empty → invoke /commit-change skill via subagent:
|
If `PENDING_CHANGES` non-empty → invoke /commit-change skill via subagent:
|
||||||
|
|
||||||
> Dispatch `general-purpose` subagent. Prompt:
|
> Dispatch `general-purpose` subagent (`model: "fable"`). Prompt:
|
||||||
>
|
>
|
||||||
> "Read `~/.claude/skills/commit-change/SKILL.md` and execute. All pending
|
> "Read `~/.claude/skills/commit-change/SKILL.md` and execute. All pending
|
||||||
> changes were produced by the client-handover ship pipeline during the
|
> changes were produced by the client-handover ship pipeline during the
|
||||||
@@ -617,7 +622,7 @@ Skip if `VALIDATE_SKIPPED=true` or `PROJECT_TYPE != web` (in either case
|
|||||||
ensure `VALIDATE_SKIPPED=true` is set so the gate logic in STEP 8 treats
|
ensure `VALIDATE_SKIPPED=true` is set so the gate logic in STEP 8 treats
|
||||||
VALIDATE as not-applicable rather than failed).
|
VALIDATE as not-applicable rather than failed).
|
||||||
|
|
||||||
Dispatch `general-purpose` subagent:
|
Dispatch `general-purpose` subagent (`model: "fable"`):
|
||||||
|
|
||||||
> Read `~/.claude/skills/web-validate/SKILL.md` and execute against the
|
> Read `~/.claude/skills/web-validate/SKILL.md` and execute against the
|
||||||
> deployed URL: `<DEPLOYED_URL>`. Audit W3C HTML validity (validator.nu),
|
> deployed URL: `<DEPLOYED_URL>`. Audit W3C HTML validity (validator.nu),
|
||||||
|
|||||||
@@ -35,3 +35,13 @@ yet rewritten) — that is why the self-check exists alongside it.
|
|||||||
|
|
||||||
then end the turn. No later step runs, no agent is dispatched, nothing is
|
then end the turn. No later step runs, no agent is dispatched, nothing is
|
||||||
edited.
|
edited.
|
||||||
|
|
||||||
|
## 4. Dispatch tiers (BDR-077 — no inherit)
|
||||||
|
|
||||||
|
The gate guards the MAIN loop only. Dispatched work NEVER inherits the
|
||||||
|
session model: typed agents run on their frontmatter pin; built-ins
|
||||||
|
(general-purpose / Explore / Plan) carry an explicit `model=` at every call
|
||||||
|
site — `model: "fable"` when the child performs reflection/orchestration on
|
||||||
|
the main loop's behalf (skill-runners), otherwise its complexity tier
|
||||||
|
(opus = dispatched judgment, sonnet = execution/collection, haiku = short
|
||||||
|
mechanical probes).
|
||||||
|
|||||||
@@ -72,6 +72,15 @@ fm_lacks "agents/interviewer.md" 'model:'
|
|||||||
has "skills/onboard/SKILL.md" 'model="opus"'
|
has "skills/onboard/SKILL.md" 'model="opus"'
|
||||||
has "skills/tour/SKILL.md" 'model="opus"'
|
has "skills/tour/SKILL.md" 'model="opus"'
|
||||||
has "lib/challenge-plan.md" 'BDR-076'
|
has "lib/challenge-plan.md" 'BDR-076'
|
||||||
|
# 12) BDR-077 W1 — no-inherit: skill-runner children pinned fable at every
|
||||||
|
# call site; code-review dispatches carry opus; doctrine in model-gate.
|
||||||
|
# (fable dispatch alias spike-verified 2026-07-19: resolves
|
||||||
|
# claude-fable-5, enum-validated, loud failure — never silent fallback)
|
||||||
|
has "agents/client-handover-writer.md" 'model: "fable"'
|
||||||
|
has "skills/ship-feature/SKILL.md" 'model: "opus"'
|
||||||
|
has "skills/init-project/SKILL.md" 'model: "opus"'
|
||||||
|
has "lib/model-gate.md" 'model: "fable"'
|
||||||
|
lacks "lib/model-gate.md" 'model: "sonnet" in the Agent call'
|
||||||
|
|
||||||
printf 'model-routing census: %d pass, %d fail\n' "$pass" "$fail"
|
printf 'model-routing census: %d pass, %d fail\n' "$pass" "$fail"
|
||||||
[ "$fail" -eq 0 ]
|
[ "$fail" -eq 0 ]
|
||||||
|
|||||||
@@ -223,7 +223,10 @@ against the founding contract. Distinct axis from STEP 10 code review
|
|||||||
([[LRN-095]]) — both run.
|
([[LRN-095]]) — both run.
|
||||||
|
|
||||||
## STEP 10 — CODE REVIEW
|
## STEP 10 — CODE REVIEW
|
||||||
Invoke `superpowers:requesting-code-review`. Fix all CRITICAL before proceeding.
|
Invoke `superpowers:requesting-code-review`. **Model routing (BDR-077):** the
|
||||||
|
review subagent it dispatches MUST carry `model: "opus"` in the Agent call —
|
||||||
|
craft review is dispatched judgment, never inherited from the session. Fix
|
||||||
|
all CRITICAL before proceeding.
|
||||||
|
|
||||||
## STEP 10b — CAPITALIZE FOUNDING DECISIONS (memory registries)
|
## STEP 10b — CAPITALIZE FOUNDING DECISIONS (memory registries)
|
||||||
A greenfield's founding architecture decisions are the highest-value BDRs — the
|
A greenfield's founding architecture decisions are the highest-value BDRs — the
|
||||||
|
|||||||
@@ -222,7 +222,10 @@ conformity + security vs. craft/design) — both run, neither subsumes the
|
|||||||
other ([[LRN-095]]).
|
other ([[LRN-095]]).
|
||||||
|
|
||||||
## STEP 6 — CODE REVIEW
|
## STEP 6 — CODE REVIEW
|
||||||
Invoke `superpowers:requesting-code-review`. Fix all CRITICAL before proceeding.
|
Invoke `superpowers:requesting-code-review`. **Model routing (BDR-077):** the
|
||||||
|
review subagent it dispatches MUST carry `model: "opus"` in the Agent call —
|
||||||
|
craft review is dispatched judgment, never inherited from the session. Fix
|
||||||
|
all CRITICAL before proceeding.
|
||||||
|
|
||||||
## STEP 7 — CAPITALIZE (memory registries)
|
## STEP 7 — CAPITALIZE (memory registries)
|
||||||
Feature shipped implies at least one design decision worth capturing. Run this BEFORE STEP 9 FINISH — the implementation commits (STEP 4) already exist, so the entries' hash references are valid, and the memory commit lands on the branch that FINISH integrates (otherwise it strands outside the PR):
|
Feature shipped implies at least one design decision worth capturing. Run this BEFORE STEP 9 FINISH — the implementation commits (STEP 4) already exist, so the entries' hash references are valid, and the memory commit lands on the branch that FINISH integrates (otherwise it strands outside the PR):
|
||||||
|
|||||||
Reference in New Issue
Block a user