fix(model-routing): wave-4 review fixes — forward DEPLOY_HINTS + SKIP_SEO in PACKAGE, realign §7/§8 annex numbering (I1/I2/I3)

This commit is contained in:
Bastien Chanot
2026-07-16 12:12:53 +02:00
parent fe1d60fccb
commit 1947a21237
4 changed files with 30 additions and 15 deletions
+1
View File
@@ -387,3 +387,4 @@ rules:
- 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. - 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.
- model routing WAVE 3 (same branch): /bugfix + /code-clean split like /feat — reflection inline, sonnet executors (bugfixer, code-cleaner). code-clean refactor now runs on sonnet (inline-load pin was inert). consumers rerouted (hotfix deeper-bug→/bugfix skill; onboard/tour read-only audit→big-model agent). Explore kept built-in (inherits big). census 42/0, loops-light 35/0. Branch still unmerged. - model routing WAVE 3 (same branch): /bugfix + /code-clean split like /feat — reflection inline, sonnet executors (bugfixer, code-cleaner). code-clean refactor now runs on sonnet (inline-load pin was inert). consumers rerouted (hotfix deeper-bug→/bugfix skill; onboard/tour read-only audit→big-model agent). Explore kept built-in (inherits big). census 42/0, loops-light 35/0. Branch still unmerged.
- model routing waves 1-3 MERGED into develop (e5c7c51); LRN-125 added. WAVE 4 started on feature/client-handover-dispatch (off develop): client-handover doc-gen → sonnet. REDACTION-ONLY (user flipped from whole-writer — nested audits must run big either way). client-handover-writer trimmed to ship pipeline (STEP 1-8 preserved byte-for-byte) + delegates writing to NEW sonnet handover-doc-writer (gate-free, STEP 9-16). client-handover joins gated group. census 46/0. NOTE: a Task-20 implementer ran `git checkout -- settings.json`, discarding user /model=opus working-tree state (LRN-098) — flagged to user (re-run /model). Lesson worth an LRN: constrain SDD implementers from git ops on files outside their task. - model routing waves 1-3 MERGED into develop (e5c7c51); LRN-125 added. WAVE 4 started on feature/client-handover-dispatch (off develop): client-handover doc-gen → sonnet. REDACTION-ONLY (user flipped from whole-writer — nested audits must run big either way). client-handover-writer trimmed to ship pipeline (STEP 1-8 preserved byte-for-byte) + delegates writing to NEW sonnet handover-doc-writer (gate-free, STEP 9-16). client-handover joins gated group. census 46/0. NOTE: a Task-20 implementer ran `git checkout -- settings.json`, discarding user /model=opus working-tree state (LRN-098) — flagged to user (re-run /model). Lesson worth an LRN: constrain SDD implementers from git ops on files outside their task.
- wave-4 FINAL REVIEW (opus whole-branch): all 7 deliverable invariants hold, child gate-free, PACKAGE complete. Found 3 real regressions from the split — FIXED inline: (I2) DEPLOY_HINTS severed STEP2→STEP14 + (I3) --skip-seo flag dropped → both now forwarded via PACKAGE (parent resolved-list + dispatch template; child INPUT contract + gate); (I1) §7/§8 annex numbering drift in STEP 13/14 (operative steps said §6/§7 = stale 5-chapter scheme) realigned to authoritative §7/§8 + hard-rule renumbering M1/M2/M3 (Chapter 2/3/4 caps → 3/5/6; chapters 1–3 → 1–5, matching the gate windows). census lock added: lacks 'Agent(' on child (M5). census 47/0, shellcheck clean. Branch NOT merged (awaiting human signal).
+7
View File
@@ -1053,6 +1053,11 @@ it, don't recompute) or resolved in 9.1–9.5:
plus `.claude/audits/HUMAN-ACTIONS.md` and plus `.claude/audits/HUMAN-ACTIONS.md` and
`.claude/audits/THRESHOLD-OVERRIDE.md` when present. `.claude/audits/THRESHOLD-OVERRIDE.md` when present.
- `INCLUDE_DEPLOY` — from 9.1. - `INCLUDE_DEPLOY` — from 9.1.
- `DEPLOY_HINTS` — the `DEPLOY_HINTS` array detected in STEP 2 (empty if
none), forwarded as a comma-separated list so the doc-writer can
tailor §8. Only consumed when `INCLUDE_DEPLOY=yes`.
- `SKIP_SEO` — `yes` if `$ARGUMENTS` contained `--skip-seo` (STEP 0 flag
parse), else `no`. Gates the doc-writer's §7 platforms chapter.
- `NAP` — from 9.2. - `NAP` — from 9.2.
- `PRECHECK_DONE` — from 9.3. - `PRECHECK_DONE` — from 9.3.
- `CLIENT_NAME` — from 9.5. - `CLIENT_NAME` — from 9.5.
@@ -1075,6 +1080,8 @@ SCORES: seo=<before→after,status> geo=<before→after,status>
[cso=<before→after,status> for non-web] [code-ceiling notes] [cso=<before→after,status> for non-web] [code-ceiling notes]
AUDIT_REPORTS: <paths> AUDIT_REPORTS: <paths>
INCLUDE_DEPLOY: <yes|no> INCLUDE_DEPLOY: <yes|no>
DEPLOY_HINTS: <comma-separated list from STEP 2, or empty>
SKIP_SEO: <yes|no>
NAP: <resolved table, field by field> NAP: <resolved table, field by field>
PRECHECK_DONE: <list> PRECHECK_DONE: <list>
CLIENT_NAME: <name|—> CLIENT_NAME: <name|—>
+21 -15
View File
@@ -24,6 +24,11 @@ parent already resolved:
`HUMAN-ACTIONS.md` / any threshold-override note if present), for §5 `HUMAN-ACTIONS.md` / any threshold-override note if present), for §5
and §6 sourcing. and §6 sourcing.
- `INCLUDE_DEPLOY` — `yes` | `no`. Controls whether §8 is rendered. - `INCLUDE_DEPLOY` — `yes` | `no`. Controls whether §8 is rendered.
- `DEPLOY_HINTS` — detected deploy platforms (Vercel, Netlify, Docker,
GitHub Actions, …) from the parent's STEP 2 scan, for tailoring §8.
Empty = no platform detected (use the generic §8 fallback).
- `SKIP_SEO` — `yes` | `no`. When `yes`, skip the §7 platforms chapter
even for web projects (the parent's `--skip-seo` flag).
- `NAP` — the full, already-resolved §4 table (name, address, phone, - `NAP` — the full, already-resolved §4 table (name, address, phone,
email, categories, short description, hours, …). email, categories, short description, hours, …).
- `PRECHECK_DONE` — the set of platforms/items already confirmed done, - `PRECHECK_DONE` — the set of platforms/items already confirmed done,
@@ -84,7 +89,8 @@ ranges — the client document does not render them.
## STEP 12 — SYNTHESIZE THE DOCUMENT ## STEP 12 — SYNTHESIZE THE DOCUMENT
Generate the deliverable as a tight 4-chapter structure: what was needed, Generate the deliverable following the 6-chapter structure defined
below (plus the §7/§8 annexes). The narrative arc: what was needed,
what was done (lay summary), what the client must do, then technical what was done (lay summary), what the client must do, then technical
details for the curious. Translate headings to `LANG`. Tone: friendly, details for the curious. Translate headings to `LANG`. Tone: friendly,
concrete, no jargon. One short paragraph per idea. concrete, no jargon. One short paragraph per idea.
@@ -131,7 +137,7 @@ concrete, no jargon. One short paragraph per idea.
in §3 / §4 / §5 / §6.x sub-tables / §6.9 calendar must all in §3 / §4 / §5 / §6.x sub-tables / §6.9 calendar must all
use the linked form. use the linked form.
1. **Never name internal tools or skill identifiers in chapters 1–3.** 1. **Never name internal tools or skill identifiers in chapters 1–5.**
Forbidden tokens (do not appear, in any case, in the lay portion): Forbidden tokens (do not appear, in any case, in the lay portion):
`/seo`, `/harden`, `/web-validate`, `/cso`, `/feat`, `/bugfix`, `/seo`, `/harden`, `/web-validate`, `/cso`, `/feat`, `/bugfix`,
`/ship-feature`, `/ship`, `/code-clean`, `/refactor`, `seo-analyzer`, `/ship-feature`, `/ship`, `/code-clean`, `/refactor`, `seo-analyzer`,
@@ -140,14 +146,14 @@ concrete, no jargon. One short paragraph per idea.
`ALL_PASS`, `SCORE_*`. Replace with what they correspond to in client `ALL_PASS`, `SCORE_*`. Replace with what they correspond to in client
language: référencement / visibilité IA / sécurité / conformité language: référencement / visibilité IA / sécurité / conformité
technique / audit interne. Internal tool names may appear ONLY in technique / audit interne. Internal tool names may appear ONLY in
chapter 4 ("Détails techniques") inside the optional glossary. chapter 6 ("Détails techniques") inside the optional glossary.
2. **Chapter 2 hard cap: 300 words max, zero technical jargon.** Plain 2. **Chapter 3 hard cap: 300 words max, zero technical jargon.** Plain
French (or plain English if `LANG=en`). No acronyms not already in French (or plain English if `LANG=en`). No acronyms not already in
common usage (HTTPS is fine; CSP is not). Run `wc -w` against the common usage (HTTPS is fine; CSP is not). Run `wc -w` against the
chapter body; if over 300, rewrite shorter. chapter body; if over 300, rewrite shorter.
3. **Chapter 3 is action-only.** Every bullet starts with a verb the 3. **Chapter 5 is action-only.** Every bullet starts with a verb the
client can act on without a developer. client can act on without a developer.
4. **Chapter 4 may use technical terms** (SEO, GEO, HSTS, CSP, etc.) but 4. **Chapter 6 may use technical terms** (SEO, GEO, HSTS, CSP, etc.) but
each term gets a one-line plain-language definition the first time it each term gets a one-line plain-language definition the first time it
appears, or a glossary at the end of the chapter. appears, or a glossary at the end of the chapter.
@@ -440,17 +446,17 @@ des audits de santé. Pour toute question, contactez [contact].*
4. Concrete numbers > adjectives. 4. Concrete numbers > adjectives.
5. Short paragraphs. Bullet lists for things you can count. 5. Short paragraphs. Bullet lists for things you can count.
6. **Score deltas explained in plain words**. Never just dump numbers. 6. **Score deltas explained in plain words**. Never just dump numbers.
7. **Chapter 3 is action-oriented**. Every line starts with a verb. 7. **Chapter 5 is action-oriented**. Every line starts with a verb.
Every line is something the client can do without a developer. Every line is something the client can do without a developer.
8. **No skill-name leaks in chapters 1–3.** See "Hard rules" above. 8. **No skill-name leaks in chapters 1–5.** See "Hard rules" above.
--- ---
## STEP 13 — SEO/GEO MANUAL CHECKLIST (web projects only) ## STEP 13 — SEO/GEO MANUAL CHECKLIST (web projects only)
If `PROJECT_TYPE=web` AND `--skip-seo` NOT set, append this chapter If `PROJECT_TYPE=web` AND `PACKAGE.SKIP_SEO` is not `yes`, append this chapter
as **§6 Annexe — Plateformes externes** in the 5-chapter structure as **§7 Annexe — Plateformes externes** in the 6-chapter structure
(see STEP 12). Replace the §6 stub with the full content rendered from (see STEP 12). Replace the §7 stub with the full content rendered from
the resource file. the resource file.
Read the resource file: Read the resource file:
@@ -501,7 +507,7 @@ The chapter must include:
8. **Outils gratuits pour vérifier votre présence**. 8. **Outils gratuits pour vérifier votre présence**.
Cross-link this chapter from §4 (owner responsibilities — "Ce qui vous Cross-link this chapter from §4 (owner responsibilities — "Ce qui vous
reste à faire"). Items in this §6 annex that are recurring belong in reste à faire"). Items in this §7 annex that are recurring belong in
§4's cadence checklist (Mensuel / Trimestriel / Annuel). §4's cadence checklist (Mensuel / Trimestriel / Annuel).
--- ---
@@ -511,8 +517,8 @@ reste à faire"). Items in this §6 annex that are recurring belong in
If `PACKAGE.INCLUDE_DEPLOY != yes`, skip this step entirely — do not If `PACKAGE.INCLUDE_DEPLOY != yes`, skip this step entirely — do not
render §8. The parent already asked the client; do not re-ask. render §8. The parent already asked the client; do not re-ask.
If included, this becomes **§7 Annexe — Build & déploiement** in the If included, this becomes **§8 Annexe — Build & déploiement** in the
5-chapter structure (see STEP 12). For each `DEPLOY_HINTS` match, 6-chapter structure (see STEP 12). For each `PACKAGE.DEPLOY_HINTS` match,
generate a short subsection: generate a short subsection:
1. What this means (1 paragraph). 1. What this means (1 paragraph).
2. First-time setup (numbered steps + signup link). 2. First-time setup (numbered steps + signup link).
@@ -522,7 +528,7 @@ generate a short subsection:
2026 pricing if not in repo). 2026 pricing if not in repo).
6. Who to call when it breaks (status page, support link). 6. Who to call when it breaks (status page, support link).
If no deploy hints, offer 2-3 standard options: If `PACKAGE.DEPLOY_HINTS` is empty, offer 2-3 standard options:
- Static site → Netlify / Vercel / Cloudflare Pages - Static site → Netlify / Vercel / Cloudflare Pages
- Webapp → Fly.io / Render / Vercel / Railway - Webapp → Fly.io / Render / Vercel / Railway
- CLI / library → npm / PyPI / crates.io / Homebrew - CLI / library → npm / PyPI / crates.io / Homebrew
+1
View File
@@ -51,6 +51,7 @@ lacks "agents/code-cleaner.md" 'AskUserQuestion'
# 9) wave-4 — client-handover: pipeline (big) inline + gated, doc-gen dispatched to sonnet # 9) wave-4 — client-handover: pipeline (big) inline + gated, doc-gen dispatched to sonnet
has "agents/handover-doc-writer.md" 'model: sonnet' has "agents/handover-doc-writer.md" 'model: sonnet'
lacks "agents/handover-doc-writer.md" 'AskUserQuestion' 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"' has "agents/client-handover-writer.md" 'subagent_type="handover-doc-writer"'
printf 'model-routing census: %d pass, %d fail\n' "$pass" "$fail" printf 'model-routing census: %d pass, %d fail\n' "$pass" "$fail"