fix(routing): W6 ronde — 6 findings closed (README bootstrap path, 2 census gaps, 3 stale refs)

Fresh-opus whole-chantier ronde (17fbe51..HEAD, EVAL-023 style): axes
severed-wires / gate-regressions / fail-open PROVEN CLEAN (all 7 new
handoffs traced end-to-end both sides). Fixed: init 5b now dispatches the
FULL-AUDIT path (auto-mode gated a missing README as SIGNIFICANT →
[CREATE-AUTO] unconditional restored, sole greenfield README path);
census locks added for /geo ERROR CONTRACT + never-re-derive (deleting
the fail-closed handler would have stayed green), doc-audit
model=opus override x5 flows, SYNTH REPORT grammar; doc-syncer ex-STEP-8
prose repointed to the dispatcher gate; plugin-advisor anim rows read
the PROBE REPORT ANIM field (no Bash anymore); client-handover 9.7
cleans the transient draft. Census caught one more line-wrapped lock
before it shipped vacuous. 133 pass / 0 fail, make test exit 0.
This commit is contained in:
Bastien Chanot
2026-07-19 23:56:58 +02:00
parent 07253e093c
commit 444c79acb2
5 changed files with 29 additions and 16 deletions
+4
View File
@@ -1130,3 +1130,7 @@ Parse the returned `HANDOVER-DOC REPORT`:
- `STATUS: BLOCKED` → surface the report verbatim (including which - `STATUS: BLOCKED` → surface the report verbatim (including which
PACKAGE field the doc-writer flagged) and stop — do not retry or PACKAGE field the doc-writer flagged) and stop — do not retry or
patch the PACKAGE silently. patch the PACKAGE silently.
In BOTH branches, then clean the transient draft:
`rm -f ".audit/handover-draft-${RUNID}.md"` (run-scoped, gitignored —
cleanup keeps `.audit/` from accumulating stranded drafts).
+8 -6
View File
@@ -380,9 +380,10 @@ Omit any section whose delegated target does not exist and is not being
proposed this run (e.g. drop "Deploy" entirely when `DEPLOY_COMPLEXITY` proposed this run (e.g. drop "Deploy" entirely when `DEPLOY_COMPLEXITY`
is `NONE`/`TRIVIAL`; drop "Configuration" when there is no config schema). is `NONE`/`TRIVIAL`; drop "Configuration" when there is no config schema).
Tag as **AUTO** — create on first audit. Surface the rendered README in Tag as **AUTO** — create on first audit. The rendered README is a DRAFT
the validation gate before writing so the user can `edit` if needed, but inside the audit report (`[CREATE-AUTO]` in the PATCH PLAN); the
do NOT skip creation; "skip" is not an offered option on README bootstrap. DISPATCHER's gate surfaces it so the user can `edit`, but do NOT skip
creation; "skip" is not an offered option on README bootstrap.
### STEP 6 — DEPLOY.md GATE ### STEP 6 — DEPLOY.md GATE
@@ -669,9 +670,10 @@ Last updated: <date> (<N commits since>)
CHANGELOG entries always HUMAN. DEPLOY.md creation always HUMAN. CHANGELOG entries always HUMAN. DEPLOY.md creation always HUMAN.
CLEAN removals always HUMAN. CLEAN removals always HUMAN.
**README.md creation is AUTO** — always render and write, never gate on **README.md creation is AUTO** — always render (audit mode: as a draft
user input. The validation gate (STEP 8) still surfaces the rendered in the report) and write (patch mode), never gate on user input. The
file so the user can edit before write, but "skip" is not an option for DISPATCHER's validation gate still surfaces the rendered draft so the
user can edit before the patch dispatch, but "skip" is not an option for
README bootstrap; it is mandatory. README bootstrap; it is mandatory.
If no drift in any doc and no missing required doc (and, in CLEAN MODE, If no drift in any doc and no missing required doc (and, in CLEAN MODE,
+2 -2
View File
@@ -46,8 +46,8 @@ Detect signals from REQUEST + the PROBE REPORT fields:
| `skill-creation` | "create a skill", "new skill", "custom skill", `/plugin-dev:create-plugin` in description | | `skill-creation` | "create a skill", "new skill", "custom skill", `/plugin-dev:create-plugin` in description |
| `embedded` | "firmware", "bare-metal", "microcontroller", "STM32", "ESP32", "RTOS", "driver", "kernel", "bootloader" in description; **or** `platformio.ini` present; **or** linker script (`*.ld`, `*.lds`) present; **or** `Makefile` + `src/*.c` + no `package.json`/`Cargo.toml`/`go.mod`/`setup.py`/`pyproject.toml` (C project without standard ecosystems). Note: `.c` files with a Rust/Node/Go manifest = FFI binding, NOT embedded. | | `embedded` | "firmware", "bare-metal", "microcontroller", "STM32", "ESP32", "RTOS", "driver", "kernel", "bootloader" in description; **or** `platformio.ini` present; **or** linker script (`*.ld`, `*.lds`) present; **or** `Makefile` + `src/*.c` + no `package.json`/`Cargo.toml`/`go.mod`/`setup.py`/`pyproject.toml` (C project without standard ecosystems). Note: `.c` files with a Rust/Node/Go manifest = FFI binding, NOT embedded. |
| `simple` | single file, hotfix, quick script, no frontend, no deploy | | `simple` | single file, hotfix, quick script, no frontend, no deploy |
| `anim-lib-eligible` | output of `detect_anim_eligibility` starts with `eligible|` (React/Vue/Svelte stack) | | `anim-lib-eligible` | PROBE REPORT `ANIM` field: `eligibility=eligible|…` (React/Vue/Svelte stack) |
| `anim-lib-installed` | `is_anim_lib_installed` returns 0 (any of motion / motion-v / framer-motion / gsap / lottie-react / react-spring / popmotion / auto-animate present) | | `anim-lib-installed` | PROBE REPORT `ANIM` field: `installed=<lib>` (any of motion / motion-v / framer-motion / gsap / lottie-react / react-spring / popmotion / auto-animate) |
--- ---
+4
View File
@@ -114,6 +114,7 @@ has "skills/doc/SKILL.md" 'MODE: patch'
lacks "agents/scaffolder.md" 'INLINE-LOAD' lacks "agents/scaffolder.md" 'INLINE-LOAD'
for s in bugfix hotfix feat ship-feature init-project; do for s in bugfix hotfix feat ship-feature init-project; do
has "skills/$s/SKILL.md" 'MODE: audit' has "skills/$s/SKILL.md" 'MODE: audit'
has "skills/$s/SKILL.md" 'doc-syncer", model="opus"'
# shellcheck disable=SC2016 # literal $HOME wanted: matching the exact inline-load string # shellcheck disable=SC2016 # literal $HOME wanted: matching the exact inline-load string
lacks "skills/$s/SKILL.md" 'Load `$HOME/.claude/agents/doc-syncer.md`' lacks "skills/$s/SKILL.md" 'Load `$HOME/.claude/agents/doc-syncer.md`'
done done
@@ -160,6 +161,9 @@ has "skills/seo/SKILL.md" 'never re-derive a score'
has "skills/seo/SKILL.md" 'DISPATCHER ERROR CONTRACT' has "skills/seo/SKILL.md" 'DISPATCHER ERROR CONTRACT'
has "skills/geo/SKILL.md" 'MODE: collect' has "skills/geo/SKILL.md" 'MODE: collect'
has "skills/geo/SKILL.md" 'geo-analyzer", model="sonnet"' has "skills/geo/SKILL.md" 'geo-analyzer", model="sonnet"'
has "skills/geo/SKILL.md" 'ERROR CONTRACT'
has "skills/geo/SKILL.md" 'never re-derive a score'
has "agents/handover-doc-writer.md" 'SYNTH REPORT'
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 ]
+11 -8
View File
@@ -104,12 +104,14 @@ Creates: CLAUDE.md, `.claude/settings.json`, `.claudeignore`, `.gitignore`, `.en
Verify: `git init` + build passes. Verify: `git init` + build passes.
## STEP 5b — CREATE README ## STEP 5b — CREATE README
Dispatch the doc pipeline (BDR-077): `Agent(subagent_type="doc-syncer", Dispatch the doc pipeline (BDR-077):
model="opus")` — `MODE: audit`, `auto-mode scope: full project`. README.md `Agent(subagent_type="doc-syncer", model="opus")`
missing → the report carries the rendered README draft as `[CREATE-AUTO]`; — `MODE: audit` (FULL-AUDIT path, NOT `auto-mode scope:` —
re-dispatch `Agent(subagent_type="doc-syncer")` (sonnet pin) with auto-mode gates a missing README as SIGNIFICANT; the full audit's STEP 5
`MODE: patch` + that plan to write it. No stop (README bootstrap is renders it `[CREATE-AUTO]`, unconditional). README.md missing → the
unconditional). report carries the rendered README draft as `[CREATE-AUTO]`; re-dispatch
`Agent(subagent_type="doc-syncer")` (sonnet pin) with `MODE: patch` +
that plan to write it. No stop (README bootstrap is unconditional).
## STEP 5c — CTX7 PRE-FETCH (if fast-libs detected) ## STEP 5c — CTX7 PRE-FETCH (if fast-libs detected)
If `fast-libs` signal was detected in STEP 0 (Next.js, React 18+, Prisma, Supabase, Drizzle, etc.): If `fast-libs` signal was detected in STEP 0 (Next.js, React 18+, Prisma, Supabase, Drizzle, etc.):
@@ -298,8 +300,9 @@ does NOT commit them, and `gitflow finish` integrates only COMMITTED history
— so a patch left uncommitted never reaches the merge/PR. Same PR-stranding class as the — so a patch left uncommitted never reaches the merge/PR. Same PR-stranding class as the
STEP 10b capitalize fix (BDR-034). STEP 10b capitalize fix (BDR-034).
Dispatch the doc pipeline (BDR-077): `Agent(subagent_type="doc-syncer", Dispatch the doc pipeline (BDR-077):
model="opus")` — `MODE: audit` + `auto-mode scope: <files changed this `Agent(subagent_type="doc-syncer", model="opus")`
— `MODE: audit` + `auto-mode scope: <files changed this
session>`; NONE → done; `[MINOR]` plan → `MODE: patch` re-dispatch (sonnet session>`; NONE → done; `[MINOR]` plan → `MODE: patch` re-dispatch (sonnet
pin, no gate; SHAPE ESCALATION comes back gated); SIGNIFICANT → gate here, pin, no gate; SHAPE ESCALATION comes back gated); SIGNIFICANT → gate here,
then `MODE: patch` with the approved subset. then `MODE: patch` with the approved subset.