From 1947a212373c845a4eff28cbe712e4b8e8069193 Mon Sep 17 00:00:00 2001 From: Bastien Chanot Date: Thu, 16 Jul 2026 12:12:53 +0200 Subject: [PATCH] =?UTF-8?q?fix(model-routing):=20wave-4=20review=20fixes?= =?UTF-8?q?=20=E2=80=94=20forward=20DEPLOY=5FHINTS=20+=20SKIP=5FSEO=20in?= =?UTF-8?q?=20PACKAGE,=20realign=20=C2=A77/=C2=A78=20annex=20numbering=20(?= =?UTF-8?q?I1/I2/I3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .claude/memory/journal.md | 1 + agents/client-handover-writer.md | 7 +++++++ agents/handover-doc-writer.md | 36 +++++++++++++++++++------------- lib/tests/model-routing.test.sh | 1 + 4 files changed, 30 insertions(+), 15 deletions(-) diff --git a/.claude/memory/journal.md b/.claude/memory/journal.md index a524f22..3cdf920 100644 --- a/.claude/memory/journal.md +++ b/.claude/memory/journal.md @@ -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 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. +- 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). diff --git a/agents/client-handover-writer.md b/agents/client-handover-writer.md index a704c67..5e5af96 100644 --- a/agents/client-handover-writer.md +++ b/agents/client-handover-writer.md @@ -1053,6 +1053,11 @@ it, don't recompute) or resolved in 9.1–9.5: plus `.claude/audits/HUMAN-ACTIONS.md` and `.claude/audits/THRESHOLD-OVERRIDE.md` when present. - `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. - `PRECHECK_DONE` — from 9.3. - `CLIENT_NAME` — from 9.5. @@ -1075,6 +1080,8 @@ SCORES: seo= geo= [cso= for non-web] [code-ceiling notes] AUDIT_REPORTS: INCLUDE_DEPLOY: +DEPLOY_HINTS: +SKIP_SEO: NAP: PRECHECK_DONE: CLIENT_NAME: diff --git a/agents/handover-doc-writer.md b/agents/handover-doc-writer.md index 8269733..a2a1da3 100644 --- a/agents/handover-doc-writer.md +++ b/agents/handover-doc-writer.md @@ -24,6 +24,11 @@ parent already resolved: `HUMAN-ACTIONS.md` / any threshold-override note if present), for §5 and §6 sourcing. - `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, email, categories, short description, hours, …). - `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 -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 details for the curious. Translate headings to `LANG`. Tone: friendly, 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 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): `/seo`, `/harden`, `/web-validate`, `/cso`, `/feat`, `/bugfix`, `/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 language: référencement / visibilité IA / sécurité / conformité technique / audit interne. Internal tool names may appear ONLY in - chapter 4 ("Détails techniques") inside the optional glossary. -2. **Chapter 2 hard cap: 300 words max, zero technical jargon.** Plain + chapter 6 ("Détails techniques") inside the optional glossary. +2. **Chapter 3 hard cap: 300 words max, zero technical jargon.** Plain 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 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. -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 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. 5. Short paragraphs. Bullet lists for things you can count. 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. -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) -If `PROJECT_TYPE=web` AND `--skip-seo` NOT set, append this chapter -as **§6 Annexe — Plateformes externes** in the 5-chapter structure -(see STEP 12). Replace the §6 stub with the full content rendered from +If `PROJECT_TYPE=web` AND `PACKAGE.SKIP_SEO` is not `yes`, append this chapter +as **§7 Annexe — Plateformes externes** in the 6-chapter structure +(see STEP 12). Replace the §7 stub with the full content rendered from the resource file. Read the resource file: @@ -501,7 +507,7 @@ The chapter must include: 8. **Outils gratuits pour vérifier votre présence**. 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). --- @@ -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 render §8. The parent already asked the client; do not re-ask. -If included, this becomes **§7 Annexe — Build & déploiement** in the -5-chapter structure (see STEP 12). For each `DEPLOY_HINTS` match, +If included, this becomes **§8 Annexe — Build & déploiement** in the +6-chapter structure (see STEP 12). For each `PACKAGE.DEPLOY_HINTS` match, generate a short subsection: 1. What this means (1 paragraph). 2. First-time setup (numbered steps + signup link). @@ -522,7 +528,7 @@ generate a short subsection: 2026 pricing if not in repo). 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 - Webapp → Fly.io / Render / Vercel / Railway - CLI / library → npm / PyPI / crates.io / Homebrew diff --git a/lib/tests/model-routing.test.sh b/lib/tests/model-routing.test.sh index b1b9c77..c72347b 100755 --- a/lib/tests/model-routing.test.sh +++ b/lib/tests/model-routing.test.sh @@ -51,6 +51,7 @@ lacks "agents/code-cleaner.md" 'AskUserQuestion' # 9) wave-4 — client-handover: pipeline (big) inline + gated, doc-gen dispatched to sonnet has "agents/handover-doc-writer.md" 'model: sonnet' 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"' printf 'model-routing census: %d pass, %d fail\n' "$pass" "$fail"