chore(model-routing): wave-2 census + docs + BDR-066 update
This commit is contained in:
@@ -988,4 +988,5 @@ rules:
|
||||
- **Alternatives rejected**: opus pins on audit agents (session-independent) — rejected: session assumed big + blocking gate as backstop, one tier fewer; advisory gate — rejected by user, blocking; split bugfix/hotfix too — rejected: bugfix investigation interleaved w/ fix, hotfix gain marginal vs dispatch overhead.
|
||||
- **Caveats**: client-handover-writer conversion (inline-load → sonnet dispatch, 11 human-gate sites to relocate) DEFERRED to own plan — its opus pin stays inert meanwhile; feater cannot ask → NEED-DECISION report = escalation valve, plan must close decisions; witness reads settings.json — lags `--model`-launched sessions (self-check compensates).
|
||||
- **Caveat (execution)**: /feat re-arch broke 5 stale assertions in lib/tests/loops-light.test.sh (locked OLD feater architecture) — repointed to skills/feat/SKILL.md (FSK, mirrors HOT/HSK split) + new dispatch lock + 1-line reflow in feat SKILL for single-line grep lock (LRN-093 class).
|
||||
- **Wave 2 (2026-07-15, user directive)**: wave-1 exclusion list left execution running on the big session model = the waste this split kills. REVERSES the "split hotfix rejected" alternative above (reason held for bugfix — investigation interleaved w/ fix — but NOT hotfix: LOCATE→apply is linear/separable). Changes: /hotfix split like /feat (LOCATE reflection inline + MODEL GATE, hotfixer sonnet EXECUTOR — rewritten dual-use: also the seo/geo/web-validate L1 applier; revert-not-loop preserved) → hotfix JOINS gated group, census 12→13. /commit-change dispatches sonnet commit-changer (propose→dispatcher gates→apply; grouping ON sonnet so NO model gate; AskUserQuestion dropped from agent). /release-candidate dispatches new sonnet release-executor (2 spans prep/finish; when-to-release + push + version-number decision STAY in dispatcher). /doc → doc-syncer (sonnet) dispatch; /status → status-reporter (kept HAIKU — right tier for read-only collection; win = off big model, not the tier). Gate exclusion list now = commit-change/doc/status/release-candidate. Consumer-staleness swept (LRN-113): feat Rule 1 DOWNGRADE + feat commit-split both repointed off the bare executor agents to the /hotfix + /commit-change skills.
|
||||
- **Reference**: spec `docs/superpowers/specs/2026-07-15-model-routing-design.md` + plan `docs/superpowers/plans/2026-07-15-model-routing.md` (transient, BDR-065 lifecycle), branch `feature/model-routing`.
|
||||
|
||||
@@ -384,3 +384,4 @@ rules:
|
||||
|
||||
## 2026-07-15
|
||||
- model routing shipped on feature/model-routing: BDR-066 (reflection inline big / executors sonnet / blocking gate), /feat re-arch, census guard. client-handover conversion deferred to plan 2.
|
||||
- model routing WAVE 2 (same branch, user directive): doc/status dispatch their agent (sonnet/haiku pins effective); /hotfix split like /feat (joins gated group 12→13, hotfixer dual-use executor); /commit-change → sonnet commit-changer (propose/apply, gates relocated); /release-candidate → sonnet release-executor (human gates + version decision kept in dispatcher). Consumer-staleness swept (feat Rule 1 + commit-split). census 36/0, make test green. Branch still unmerged.
|
||||
|
||||
@@ -8,9 +8,16 @@ unmerged — human gate.
|
||||
web-validate → hotfixer L1; census guard model-routing.test.sh
|
||||
- [x] /feat re-arch: reflection inline → feater sonnet executor (partial
|
||||
supersede BDR-050)
|
||||
- [x] WAVE 2 (user directive): doc/status dispatch (sonnet/haiku pins
|
||||
effective); /hotfix split like /feat (joins gated 12→13, hotfixer
|
||||
dual-use executor); /commit-change → sonnet commit-changer
|
||||
(propose/apply, gates relocated); /release-candidate → sonnet
|
||||
release-executor (human gates + version decision kept in dispatcher);
|
||||
census 36/0. Exclusion list now commit-change/doc/status/release-candidate.
|
||||
- [ ] DOGFOOD (manual, next sessions): /feat live run — plan closes
|
||||
decisions, dispatch carries sonnet, verify loop in main loop; gate
|
||||
STOP on a sonnet session (LRN-079 class, not automatable here)
|
||||
STOP on a sonnet session (LRN-079 class, not automatable here). Also
|
||||
dogfood /hotfix split + /commit-change propose/apply + /release-candidate spans.
|
||||
- [ ] PLAN 2 — client-handover conversion (spec §5): inline-load → sonnet
|
||||
dispatch, relocate 11 human-gate sites to dispatcher (inventory in
|
||||
plan-1 session), or lighter variant: dispatch only the redaction
|
||||
|
||||
@@ -15,6 +15,7 @@ Format follows [Keep a Changelog](https://keepachangelog.com/).
|
||||
- `hotfixer` pinned `model: sonnet` (seo/geo/web-validate L1 applier); `analyzer` haiku pin removed (inherits the session model).
|
||||
- ship-feature / init-project: SDD implementation + review subagents dispatched with `model: "sonnet"`.
|
||||
- web-validate `--fix`: bundle applied via `hotfixer` at L1 instead of inline Edit (BDR-061 alignment).
|
||||
- Model routing wave 2 — the pure-execution + reflection-split skills stop running execution on the big session model. `/doc` and `/status` now **dispatch** their agent (doc-syncer sonnet, status-reporter haiku) instead of inline-loading it, so the pin takes effect. `/hotfix` split like `/feat`: reflection (LOCATE root cause) inline behind the model gate, the fix applied by a `hotfixer` sonnet executor (rewritten dual-use — it is also the seo/geo/web-validate L1 applier); revert-not-loop preserved; hotfix joins the gated group (13th). `/commit-change` dispatches a sonnet `commit-changer` (propose → dispatcher-owned approval gates → apply; grouping runs on sonnet, `AskUserQuestion` removed from the agent). `/release-candidate` dispatches a new sonnet `release-executor` for the mechanical spans (prep / finish+tag), the two human gates (when-to-release, push) and the version-number decision staying in the dispatcher.
|
||||
|
||||
### Security
|
||||
- **Magic MCP fully ask-gated** — all four `mcp__magic__*` tools (builder, refiner, inspiration, logo_search) moved to `permissions.ask` in `settings.json`; no magic call can auto-execute. The builder opens an unauthenticated local callback server (`127.0.0.1:9221+`, `Access-Control-Allow-Origin: *`, no token check) whose POST body is injected verbatim into the tool result the model consumes — the ask-gate is the mitigation on our side (BDR-059).
|
||||
|
||||
@@ -41,17 +41,24 @@ claude-config/
|
||||
|
||||
Reflection (brainstorm, plan, contract, audit judgment, loop decisions) runs
|
||||
INLINE on the session model — assumed Fable/Opus, enforced by a blocking
|
||||
gate (`lib/model-gate.md` + `lib/model-check.sh`) at the entry of the 12
|
||||
gate (`lib/model-gate.md` + `lib/model-check.sh`) at the entry of the 13
|
||||
reflection orchestrators. Execution runs on pinned subagents:
|
||||
|
||||
| Agent | Model | Tier |
|
||||
|---|---|---|
|
||||
| feater, hotfixer | sonnet (pinned) | executors — code from a closed plan, fix-bundle appliers |
|
||||
| verifier, security-auditor | sonnet (pinned) | fresh gates (≤3×/loop) |
|
||||
| commit-changer, release-executor | sonnet (pinned) | dispatched execution — grouping+commit / release spans (approval + human gates stay in the dispatcher) |
|
||||
| doc-syncer, onboarder, scaffolder, refactorer, interviewer, plugin-advisor | sonnet (pinned) | workers |
|
||||
| status-reporter | haiku (pinned) | mechanical collector |
|
||||
| client-handover-writer | opus (pinned, currently inert — inline-loaded; sonnet conversion planned) | deliverable writer |
|
||||
| analyzer, seo-analyzer, geo-analyzer, validator-analyzer, code-cleaner, bugfixer, commit-changer | inherit session (Fable/Opus) | reflection / audit / inline playbooks |
|
||||
| analyzer, seo-analyzer, geo-analyzer, validator-analyzer, code-cleaner, bugfixer | inherit session (Fable/Opus) | reflection / audit / inline playbooks |
|
||||
|
||||
The pure-execution skills `/doc`, `/status`, `/commit-change`,
|
||||
`/release-candidate` **dispatch** their agent (instead of inline-loading it)
|
||||
so the pin takes effect and the work leaves the big session model; `/hotfix`
|
||||
was split like `/feat` (reflection inline + gate, `hotfixer` executor) and so
|
||||
joins the gated group (13th).
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -32,6 +32,15 @@ has "skills/ship-feature/SKILL.md" 'model: "sonnet"'
|
||||
has "skills/init-project/SKILL.md" 'model: "sonnet"'
|
||||
# 6) web-validate applies via L1 applier
|
||||
has "skills/web-validate/SKILL.md" 'subagent_type="hotfixer"'
|
||||
# 7) wave-2 — pure-execution skills dispatch their agent (pin takes effect, off the big session model)
|
||||
has "skills/doc/SKILL.md" 'subagent_type="doc-syncer"'
|
||||
has "skills/status/SKILL.md" 'subagent_type="status-reporter"'
|
||||
has "skills/commit-change/SKILL.md" 'subagent_type="commit-changer"'
|
||||
has "skills/release-candidate/SKILL.md" 'subagent_type="release-executor"'
|
||||
has "skills/hotfix/SKILL.md" 'subagent_type="hotfixer"'
|
||||
has "agents/commit-changer.md" 'model: sonnet'
|
||||
has "agents/release-executor.md" 'model: sonnet'
|
||||
lacks "agents/commit-changer.md" 'AskUserQuestion'
|
||||
|
||||
printf 'model-routing census: %d pass, %d fail\n' "$pass" "$fail"
|
||||
[ "$fail" -eq 0 ]
|
||||
|
||||
Reference in New Issue
Block a user