forked from bchanot/claude
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:
@@ -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).
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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) |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -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 ]
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user