feat: the kit half of Fix 3 — risk-signoff, and the triage that shaped it - #32
Merged
Conversation
Proposal, not implementation. Fix 3's instruction was "add an artifact spec and a registry entry for each of the 42". Reading all 42 against what they actually are, that is wrong for 24 of them. Four dispositions: 11 required receipts with a HITL gate, 14 optional receipts surfaced at sign-off, 6 states of the world to verify rather than file, 6 that are already recorded inside a parent artifact or would be ceremony. Plus one CI mechanism (the risk:high sign-off belongs at the merge, not in a file) and one already fixed in the defect sweep. Six of the eleven required already exist as optional or recommended, so most of the work is promotion plus a gate, not new authorship. Four open questions for Matt at the end, including the two entries I am least sure about (the PO decision and tooling records, which are commercial artifacts that may belong in the contract rather than in .sdlc/). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014aesqvsMqJpzEdpDXDTjvF
…d it
The risk:high named sign-off has always been required by the standard and enforced by
nothing: convention in a PR comment that nothing templated and nothing checked. It is now
a required status check that fails any risk:high PR carrying no
SIGNED-OFF-BY: <name> — <sentence>
in the body or a comment. The sentence is required; a bare name is the thumbs-up the rung
exists to reject. A check rather than a committed receipt, because a file under .sdlc/
would describe a merge that already happened.
FIX-3-TRIAGE.md records why the 42 unreceipted rituals were split rather than mechanically
converted, including the three things the triage got wrong and how they were caught.
One bug worth noting: the sign-off pattern originally used [^—–\n] in a POSIX bracket
expression, where \n is a literal backslash and the letter n — so it excluded every name
containing an "n". "Wes Carter" passed the gate and "Dan Ruiz" did not.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014aesqvsMqJpzEdpDXDTjvF
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.
The kit half. The plugin PR carries the twelve required receipts, the eleven optional ones, the
waiver mechanism and the 1.0.0 release.
Merges before the plugin PR — its generated-copy invariant reads the kit from
main.risk-signoffThe standard has always required a named human to accept the risk on a
risk:highchange — "aperson, by name, accepting the risk. Not a thumbs-up." It was enforced by nothing: convention in a
PR comment that nothing templated and nothing checked.
Now a required status check fails any
risk:highPR with no line of the form:The sentence is required. A bare name is exactly the thumbs-up this rung exists to reject.
It is a check rather than a committed receipt on purpose: a file under
.sdlc/would describe amerge that already happened, and the acceptance has to exist before the merge. Added to
branch-protection.json; existing repos must re-apply the ruleset.One bug worth reading
The pattern originally used
[^—–\n]in a POSIX bracket expression — where\nis a literalbackslash and the letter n, not a newline. It silently excluded every name containing an "n":
Wes Carter passed the gate, Dan Ruiz did not.
Caught by testing eight cases rather than one. grep is line-based, so the newline never needed
excluding in the first place. Now verified against five should-match and three should-not-match
inputs, including a quoted comment, a bullet, lowercase, and both dash forms.
FIX-3-TRIAGE.mdThe record of why the 42 were split rather than mechanically converted — and of three things the
triage itself got wrong, caught while building:
walking-skeleton-spec.mdis the evidence the skeletonwas built; the ledger item is Phase 2's definition of what to build. Conflating them would have
left Phase 3's checkpoint with nothing to verify against. It shipped as a new Phase 2 artifact,
walking-skeleton-definition.md.spikes/would force a spike on engagementswith no unknowns, and a directory cannot carry a waiver. It shipped as
spike-findings.md— afile that can honestly say "no unverified assumptions, confirmed by ⟨name⟩", which is what the
punch list's own worked example proposed in the first place.
runbook-walkthrough.mdis required only forservice/app, because requiring it of a librarywould have re-created D-3 for the receipt.
Also here
PLUGIN-SYNC.mdmarks Fix 3 done and records what deliberately remains: the second half of X-7.Raising cross-reference checks above
SHOULDhas the same gate-behaviour property, and was heldback rather than bundled — 1.0.0 already asks every mid-flight engagement for twelve new receipts,
and adding newly-blocking consistency failures the same day would make one migration
indistinguishable from the other when something breaks.
docs/build-loop.mddocuments the new rung where the merge bar is described.Verification
sync_kit --checkin sync at 121 files. The drift check reports 8 required contexts and 8declared gate jobs, matching — the consistency checker built two sessions ago catching this new
gate's wiring in both directions, which is the first time it has been exercised on genuinely new
work. 531 plugin tests pass; 37 drift-check tests pass.
Approval
Self-approved under the solo-maintainer carve-out, named here per its terms: internal repo, no
client-identifying content, checks green.
🤖 Generated with Claude Code
https://claude.ai/code/session_014aesqvsMqJpzEdpDXDTjvF