Skip to content

fix: finish the 1.0.0 receipt migration the registry alone was enforcing - #37

Merged
MCKRUZ merged 2 commits into
masterfrom
fix/complete-fix-3-receipts
Aug 1, 2026
Merged

fix: finish the 1.0.0 receipt migration the registry alone was enforcing#37
MCKRUZ merged 2 commits into
masterfrom
fix/complete-fix-3-receipts

Conversation

@MCKRUZ

@MCKRUZ MCKRUZ commented Aug 1, 2026

Copy link
Copy Markdown
Owner

Closes #31, closes #33, closes #34, closes #35.

The one root cause behind four issues

1.0.0's "Fix 3" added twelve required receipts to phases/phase-registry.yaml and updated almost none of the prose around them. check_gates.py blocks on artifacts.required and nothing else — so the registry was the only thing telling the truth, and it was telling it to nobody.

FIX-3-TRIAGE.md shows the gaps were known at the time and simply left open: A1 decision-list.md — "Nothing writes it"; A3 threat-model.md — "spec + Step 7 exist as RECOMMENDED"; A11 drill-record.md — "optional; no step runs the drill". Filing them separately made them look like four bugs. They are one unfinished migration.

What changed

Two receipts were required by the gate and described nowhere — no spec, no step, no template. A team meets these as a blocked phase with no instruction anywhere for what the file should contain.

Artifact Was Now
drill-record.md (#35) required; zero mentions in 09-monitoring.md Step 4: Alert Drill + artifact spec + template. Steps 4–6 renumbered 5–7
go-no-go-record.md (found while fixing #35) required; no spec anywhere Spec + template + a line in Step 0 to record the decision as the ceremony happens

The drill is placed after the playbook deliberately — it tests incident-response.md as much as it tests the alert.

docs/phase-lifecycle.md had been skipped entirely by the migration. It was missing eleven of the twelve receipts from its Required Artifacts tables and listed go-no-go-record.md and drill-record.md as optional — the direct contradiction that makes a team skip an artifact and then fail the gate on it.

threat-model.md (#31) was documented RECOMMENDED — required for any system handling auth, payments or PII while the gate blocked on it for every project. The registry is right and the promotion was deliberate: the phase body's own note asked for promotion "on a major version with a migration note", which is exactly what 1.0.0 was. Prose now says REQUIRED, with the WAIVED: escape spelled out.

decision-list.md (#33) is dropped, not built. Six independent sources show the work it named is already done twice over — the phase-spanning .sdlc/decision-log.md (DL-NN, read by track_decisions.py) and a spec's own ## Decision List section (enforced by check_spec.py at Definition of Ready). Three places in the repo already warn against confusing those two; a third file would have been the confusion. The Phase 1 exit gate gains a prose check instead, since the log lives outside the phase's artifact directory where the gate cannot see it — the same pattern the close phase uses for its off-gate receipts.

The runaway fence (#34) in phases/01-requirements.md swallowed 59 lines, rendering three artifact specs and a section heading as sample code. It was this migration's insertion landing inside an existing fence. The fence now wraps only the AQ-NN example it was meant to.

The rail that catches the next one

scripts/tests/test_registry_docs_consistency.py asserts every registry-required artifact:

  1. has a ### <name> spec in its phase definition,
  2. appears in docs/phase-lifecycle.md's Required Artifacts table,
  3. is not simultaneously listed as optional.

Test plan

  • Full suite: 537 passed, 6 skipped (was 532/6 — the five new checks)
  • Registry parses; Phase 1 required drops to 4 artifacts with 5 prose checks
  • Registry-vs-docs drift measured at 0 across all phases
  • Mutation-tested — each defect reintroduced in turn, each matching check confirmed to fail, all files verified restored. A guard that has never failed is a configuration, not a control
  • WAIVED: escape verified real before documenting it (check_gates.py:81, applied before completeness at :438)
  • Human read-through of the two new templates

Notes for review

🤖 Generated with Claude Code

1.0.0 added twelve required receipts to phase-registry.yaml and updated
almost none of the prose. check_gates.py blocks on artifacts.required and
nothing else, so the registry was the only source telling the truth — and
it was telling it to nobody. Issues #31, #33, #34 and #35 were four
separate reports of that one unfinished migration.

drill-record.md and go-no-go-record.md were required by the gate and
described nowhere: no spec, no step, no template. Both now have all three.
Phase 9 gains a real alert drill step; Phase 8's go/no-go ceremony already
existed and only ever lacked its receipt.

docs/phase-lifecycle.md was missing eleven of the twelve and listed two of
them as optional — the contradiction that makes a team skip an artifact and
then fail the gate on it.

threat-model.md said RECOMMENDED while the gate blocked unconditionally.
The phase body asked for promotion "on a major version with a migration
note"; 1.0.0 was exactly that, so the prose was simply left behind.

decision-list.md is dropped rather than built. The phase-spanning
.sdlc/decision-log.md and a spec's own ## Decision List section already do
that work, and three places in the repo warn against confusing them — a
third file would have been the confusion. The Phase 1 exit gate gains a
prose check instead, since the log sits where the gate cannot see it.

A runaway fence in 01-requirements.md had swallowed 59 lines, rendering
three artifact specs as sample code. That was this migration's insertion
landing inside an existing fence.

Adds test_registry_docs_consistency.py so the next migration fails here
rather than at a client's gate. Proven by reintroducing each defect and
confirming the matching check fails. 537 passed, 6 skipped.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FEA6GZUG9NKNQYrJKyDGdb
Confirmed by Matt. A patch release rather than folding into 1.1.0: every
change in the stack is corrective, reconciling prose with what 1.0.0
already made the gates enforce.

Nothing becomes stricter. One requirement is removed — Phase 1 no longer
blocks on decision-list.md, a file nothing ever produced — so no passing
gate regresses. The receipts that already blocked still block; the plugin
now tells you what to write and ships templates.

Bumps plugin.json and marketplace.json, which both carry the version.

This releases from 1.0.0 and must land BEFORE the 1.1.0 kit sync (#28),
which is based on the same 1.0.0 tree.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FEA6GZUG9NKNQYrJKyDGdb
@MCKRUZ
MCKRUZ merged commit d8cd62c into master Aug 1, 2026
3 checks passed
@MCKRUZ
MCKRUZ deleted the fix/complete-fix-3-receipts branch August 1, 2026 20:59
@MCKRUZ
MCKRUZ restored the fix/complete-fix-3-receipts branch August 1, 2026 21:00
MCKRUZ added a commit that referenced this pull request Aug 1, 2026
The 1.0.1 corrective stack (#37-#40) landed on master first, so this branch
takes its version and changelog. Resolution: 1.1.0 is the shipped version and
supersedes 1.0.1; both changelog sections are kept, newest first.

Two corrections made while resolving:

- marketplace.json auto-merged to 1.0.1 because this branch bumped plugin.json
  and never touched the marketplace manifest. Both now read 1.1.0; shipping
  them disagreeing is how a marketplace serves a stale version.
- 1.1.0 was dated 2026-07-31, the day the branch was cut. It ships today, so
  it carries today's date rather than sitting above 1.0.1 with an earlier one.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FEA6GZUG9NKNQYrJKyDGdb
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant