fix: finish the 1.0.0 receipt migration the registry alone was enforcing - #37
Merged
Conversation
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
This was referenced Aug 1, 2026
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
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.yamland updated almost none of the prose around them.check_gates.pyblocks onartifacts.requiredand nothing else — so the registry was the only thing telling the truth, and it was telling it to nobody.FIX-3-TRIAGE.mdshows the gaps were known at the time and simply left open: A1decision-list.md— "Nothing writes it"; A3threat-model.md— "spec + Step 7 exist as RECOMMENDED"; A11drill-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.
drill-record.md(#35)09-monitoring.mdgo-no-go-record.md(found while fixing #35)The drill is placed after the playbook deliberately — it tests
incident-response.mdas much as it tests the alert.docs/phase-lifecycle.mdhad been skipped entirely by the migration. It was missing eleven of the twelve receipts from its Required Artifacts tables and listedgo-no-go-record.mdanddrill-record.mdas optional — the direct contradiction that makes a team skip an artifact and then fail the gate on it.threat-model.md(#31) was documentedRECOMMENDED — required for any system handling auth, payments or PIIwhile 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 theWAIVED: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 bytrack_decisions.py) and a spec's own## Decision Listsection (enforced bycheck_spec.pyat 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 theclosephase uses for its off-gate receipts.The runaway fence (#34) in
phases/01-requirements.mdswallowed 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 theAQ-NNexample it was meant to.The rail that catches the next one
scripts/tests/test_registry_docs_consistency.pyasserts every registry-required artifact:### <name>spec in its phase definition,docs/phase-lifecycle.md's Required Artifacts table,Test plan
WAIVED:escape verified real before documenting it (check_gates.py:81, applied before completeness at :438)Notes for review
plugin.jsonandmarketplace.jsonare both bumped on this branch and merged forward through the stack. This stack must merge before PR feat: sync the kit — deploy promotion, dependency position, fleet telemetry (1.1.0) #28, which bumps to 1.1.0 from the same 1.0.0 tree — landing feat: sync the kit — deploy promotion, dependency position, fleet telemetry (1.1.0) #28 first would make 1.0.1 a version regression.decision-list.md(a file nothing produced, so no passing gate regresses). Phases 8 and 9 still block on their receipts — unchanged — but now tell you what to write.PLUGIN-SYNC.mdpunch-list item 9-2, which recorded the drill gap independently.docs/phase-9-example.mdanddocs/companion/phase-9.htmlin the standard repo still describedrill-record.mdas optional. Cross-repo follow-up, tracked separately.🤖 Generated with Claude Code