The release now tags itself. release-publish.yml reads the CHANGELOG version
on a push to main and creates the tag on the commit that carries it, so a tag
can no longer name a commit whose version sites disagree with it. That is the
failure that burned v0.55.0. Nothing to do on upgrade.
Two lifecycle defects are fixed that both ended in a decision silently not
reaching your agents, with exit code 0 throughout.
Added
release-publish.ymlcreates the release tag from the mergedmaincommit
and publishes in the same run, and its job summary now carries the npm
approval steps, the staged-packages URL, and the warning that npm sets
latestto the version published last. The instruction used to live only in
docs/RELEASING.md, which is why three staged versions sat unapproved for a
week. Recorded in
ADR-042,
which amends ADR-012's automation boundary.scripts/check-release-version.py --print-canonicalprints the canonical
CHANGELOG version and nothing else, so the workflow derives the tag from the
same registry entry the gate compares against.tests/test_docs_claims.pyholds four documentation claims that nothing read
before: the counts the README advertises, no version literal in
SECURITY.md's supported-versions section, no current-version assertion in
ROADMAP.md's status section, and every action pin in a file users copy must
be a declared version site.adr_format.section_span()returns the offsetssection_text()already
computed, so a writer can place content inside the bounds the reader parses.
Fixed
- Lifecycle commands no longer write
status_historyentries outside the
## Status Historysection.append_status_historylocated its insertion
point withbody.find("```")over the whole remaining document, so on a
record whose history block carries no fence - the shape the shipped agent
template emits - the entry landed in the next fenced block, in this project
the## EnforcementJSON. The frontmatter readAcceptedwhile
ADR-INDEX.jsonwent on reportingProposed, and only Accepted ADRs are
injected, so a decision the maintainer had just signed stopped reaching any
agent. A second shape, no later fence at all, appended a second
## Status Historysection and inverted chronology. Affectsaccept,
reject,propose,supersedeanddocument, which share one mutation
path. (#119) - Frontmatter inference reads the status instead of defaulting to
Proposed.
It recognised exactly one Status shape and guessed on every other, including
any line starting with**,[or-.adr-migratewrote that guess and
exited 0. Measured over a real 169-record corpus, 79 records were affected:
60 readProposedwhile the body saidAccepted, 12 while it said
Superseded, oneAmended. The reader that handles those shapes already
existed and called itself the single cross-tool status reader; the function
that writes the field never used it. It now does, and an unreadable status
stays undetermined rather than becoming a confident wrong answer - both
callers already had an honest path for that and neither was being used.
(#118) superseded_bysurvives the link-wrapped form real bodies use,
Superseded by [ADR-124](ADR-124-title.md), and the date and successor are
now recovered from the same line the status word was read from rather than
from a## Statussection the record may not have.- Lifecycle commands no longer feed the generated
ADR-INDEX.mdto the
frontmatter loader.glob("ADR-*.md")matches it, which was only ever
harmless because inference invented a status for it. SECURITY.mdno longer names a supported version line that goes stale; it
states the policy and points at the latest release. It had claimedv0.33.x
was current, twenty-two minor versions behind, and contradicted the sentence
directly above it.- The README described the MCP server as five-tool in five places while saying
"Seven tools" further down, claimed 15 workflows against 17 and six bounded
hooks against eight, and pointed OpenCode users at a superseded package
version.ROADMAP.mdasserted a version number and omitted the OpenCode
distribution. templates/github-workflows/adr-readiness.ymlpinned its action eighteen
minor versions back because the pin was declared in no registry. It and the
README OpenCode package pin are now sites in
packaging/version-sites.json, soscripts/bump-version.pywrites them.
Changed
- The Claude Code marketplace listing no longer advertises "v0.33 local
governance tools" as if that set were new. - The reviewed migration baseline for the bundled corpus moves from 81
deterministic and 88 guided to 79 and 90, and the metadata dry run from 154
changed and 15 failed to 152 and 17. Two records now need human judgement
instead of receiving an invented status, and two more report an actionable
issue instead of being rewritten with one. The retrieval probe for PS=1
summary parsing now expects ADR-046 rather than its superseded predecessor
ADR-045, which ranked as the governing answer only because its status was
misread.