v5.5.6
Auto-released from merge of PR #940 (trigger: pull_request).
- Lock-step tightened: per-model prompt variants get a single source of truth, a bake gate, and doctor coverage (dario#lock-step). Three loosenesses in the mechanism that keeps dario's per-model system prompts (fable / opus-5 / sonnet-5) byte-aligned with CC's:
- One table drives everything. The variant families lived in two hand-maintained lists —
VARIANT_MODELSinscripts/capture-and-bake.mjsand the hardcoded selection arms insystemPromptForModel— the exact divergence class that shippedtool_names≠toolstwice. Both now derive fromVARIANT_FAMILIES(src/live-fingerprint.ts, next toTEMPLATE_BASE_MODELfor the same reason): key, capture model, and matcher in one place, matcher-precedence order preserved (fable before the bounded-5arms).test/template-invariants.mjsasserts the shipped bundle against the table — every family carried and distinct from the base, no orphan variant keys — so a divergence can no longer ship quietly. - The bake refuses to ship silent variant loss. A variant capture that failed with no previous variant to keep used to log a warning and bake anyway — the bundle would then serve that family the shared base prompt with no other symptom, and in
--checkthe absence masqueraded as "N → 0 chars" variant drift, handing the watch workflow a rebake PR that strips the variant. That outcome is now exit 1 (infra failure, same philosophy as the older-CC guard from #635), with--allow-missing-variantas the deliberate bypass. Captured-and-matches-base still passes — that's a measured result, and a genuine variant retirement remains reportable drift. Kept-previous variants now log a note that the kept text may lag the freshly captured base. - Degraded lock-step is visible at runtime.
describeTemplate(doctor's Template row + the proxy startup line) now appends variant coverage (variants: fable+opus-5+sonnet-5/variants: none), anddario doctorgains a "Prompt variants" row: ok when every family in the table is carried by the loaded template, warn naming the missing families — the state a variant-less bundle or a pre-variants live cache shadowing the bundle used to reach invisibly (requests still 200, wrong prompt).
- One table drives everything. The variant families lived in two hand-maintained lists —
Built + tested + npm-published inline by cc-drift-auto-release.yml on this run — tokenless via OIDC trusted publishing, provenance-attested. See the workflow log for the publish output.