Faber spawns coders with configured model + bounce protocol (#111) - #114
Conversation
Codex reviewer (cross-vendor, read-only)Reviewed-head: 64e279f Posted verbatim by No actionable findings were identified. |
Deploying fabrica with
|
| Latest commit: |
32d8110
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://70079bb8.fabrica-6yx.pages.dev |
| Branch Preview URL: | https://coder-111-coder-spawn-tier.fabrica-6yx.pages.dev |
|
Addressed the P2 on bounce-exit (b): follow-up-issue "strict subset" was previously judged only by Faber's prompt-level reading, which let scope-creep dressed as decomposition slip past the approval gate via code review + auto-merge. Tightened in both Minimal/surgical — only the decomposition passages touched. |
|
Addressed the LOW consistency finding: reworded the target |
Coder subagents currently inherit Faber's frontier session model, the dominant usage-throttle driver. Wire in the config/models.conf foundation (#109): before every coder spawn (round-0 or fix-mode), Faber reads config/models.conf then the target's committed .fabrica/models.conf override, and passes an explicit model parameter = FABRICA_CODER_MODEL — a fixed ceiling, never escalated at runtime, not for a bounced round, not for risk:high, not because a task looks hard. Replace any notion of model escalation with a bounce protocol: on a bounced review round Faber diagnoses (a) spec gap -> amend the revision brief with a Faber-authored diagnosis, respawn at the same tier, (b) scope too big/genuinely hard -> decompose, filing and linking the follow-up issue BEFORE merging the independently-green mergeable core (follow-up inherits the parent's approval only as a strict subset), or (c) stuck/reviewer disagreement -> unchanged rounds cap -> needs-human; decomposition happens within the cap, never extends it. Also adds a Faber persona note: Faber's own session is expected to run frontier-tier, and it should warn the user once if it detects otherwise. Mirrored in manager/CLAUDE.md and templates/faber-command.md; README's Model policy section updated to reflect the coder spawn is now wired (hands policy and gate routing remain follow-up work, #112). Sync: prompt-only change — inert until scripts/install.sh is re-run to regenerate the live /faber command. Merging does not change live behavior. Closes #111 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
A follow-up issue's "strict subset" of the parent's approved scope was judged only by Faber's prompt-level judgment, letting scope-creep dressed as decomposition reach merge via code review + auto-merge without re-touching the approval gate. Now the follow-up issue body must link the parent, quote the parent's approved scope verbatim, and state which subset it carries — Faber verifies against the quote before treating any of it as pre-approved; anything outside the quote goes through the normal front gate as new work. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… shell-sourced A verifier flagged that "sourced after" wording could read as license for Faber to `.`-source the target repo's committed override in its own operator-credentialed session. Reword in both manager/CLAUDE.md and templates/faber-command.md: the target override is parsed as FABRICA_<KEY>=<value> data, never shell-sourced/executed — only the control-plane's own config/models.conf may be sourced. Resolution semantics (override still wins on any key it sets) are unchanged. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
b9c04a2 to
32d8110
Compare
|
Rebased onto current `main` (post-#115) to resolve a conflict in the README "Model policy" section — both this PR and #115 had edited the same wiring-status paragraph. Conflict: #115 (already on main) updated the paragraph to say the review/manager-debate gates now read `config/models.conf`, removing the stale "gates don't read this yet" wording — but at that point main still described the coder spawn as unwired follow-up. This branch's commit had also rewritten that same paragraph, to say the coder spawn (#111) now reads the config, but (written before #115 merged) it still said "hands + gates remain follow-up," which is now stale re: gates. Resolution: merged both intents into one accurate paragraph — gates wired (#115) and coder spawn wired (#111), with only the hands-work ceiling (`FABRICA_HANDS_MODEL`, #112) left as follow-up. No "gates unwired" claim remains. New heading/lead-in:
`manager/CLAUDE.md` and `templates/faber-command.md` rebased cleanly (no conflicts) — this branch's coder-spawn tiering, bounce protocol, and parse-not-source content are unchanged on top of main. Force-pushed the rebase (new head `32d8110`). Not merging — leaving that to the normal gate. |
What
Wires up the
config/models.conffoundation (#109) into the coder-spawn path, inmanager/CLAUDE.mdand mirrored intemplates/faber-command.md:config/models.conffrom the control-plane repo, then the target repo's committed.fabrica/models.confoverride if present (override wins). Every coder spawn passes an explicitmodelparameter =FABRICA_CODER_MODEL. The tier is a fixed ceiling — never escalated at runtime, not for bounced rounds, not forrisk:highissues. Per-target overrides are static per-repo commitments, never per-task rescues.needs-human, unchanged. Decomposition happens WITHIN the cap and never extends it.Also updates README's "Model policy" section (
## Model policy) to note the coder spawn is now wired via Faber's own instructions — the hands-work ceiling (FABRICA_HANDS_MODEL) and gate model/effort routing remain unwired, follow-up work for #112.Why
Coder subagents currently inherit Faber's frontier session model — the dominant usage-throttle driver. Capability ceilings are load-bearing: they force scope discipline upstream instead of reaching for a bigger model mid-task.
Scope
This PR touches only the coder-spawn/model/bounce-protocol concern (#111). The hands/delegation policy is out of scope — that's #112, a separate PR.
Closes #111
Sync
Sync: prompt-only change — inert until
scripts/install.shis re-run to regenerate the live /faber command. Merging does not change live behavior.