chore(release): v0.5.0 — ratify ADR-0022 and ADR-0023, retire ADR-0021 - #110
Merged
Conversation
There was a problem hiding this comment.
Pull request overview
Prepares v0.5.0, ratifying inbound-marker governance decisions and retiring ADR-0021.
Changes:
- Bumps all lockstep package and runtime versions to 0.5.0.
- Accepts ADR-0022/0023 and supersedes ADR-0021.
- Promotes the unreleased changelog entries to v0.5.0.
Reviewed changes
Copilot reviewed 12 out of 13 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
package.json |
Bumps repository version. |
bun.lock |
Synchronizes workspace versions. |
CHANGELOG.md |
Publishes v0.5.0 release notes. |
packages/core/package.json |
Bumps core package version. |
packages/evaluator/package.json |
Bumps evaluator package version. |
packages/cli/package.json |
Bumps CLI package version. |
packages/cli/src/index.ts |
Updates the CLI runtime version. |
packages/mcp/package.json |
Bumps MCP package version. |
packages/mcp/src/server.ts |
Updates MCP server information. |
packages/mcp/server.json |
Updates MCP registry versions. |
docs/adr/0021-resolve-inbound-source-annotations-without-changing-the-schema.md |
Marks ADR-0021 superseded. |
docs/adr/0022-scan-inbound-markers-in-check-and-ci-without-giving-them-exit-code-authority.md |
Ratifies ADR-0022. |
docs/adr/0023-read-a-marker-only-where-the-format-hides-it-fences-and-markdown-prose.md |
Ratifies ADR-0023. |
💡 Add a code-review agent skill for context-aware, tailored reviews. Learn more in the docs.
| id: "0023" | ||
| title: "Read a marker only where the format hides it: fences and markdown prose" | ||
| status: proposed | ||
| status: accepted |
Cuts the release that takes inbound `@adr` markers from a single local command to CI, and narrows what counts as a marker in the same version so no adopter ever sees the loose grammar in a pull-request comment. Ratifies ADR-0022 (markers reach `check` and the Action, without exit-code authority) and ADR-0023 (a marker is read only where the format hides it), and retires ADR-0021 as `superseded` by 0022. ADR-0021's argument is unedited; only `status` and `supersededBy` moved. ADR-0022 takes the `arb` review tier. Every other component-scope record in the corpus is `async`, but 0022 is the only record carrying a cross-team blast radius at component scope, and it is the first to have `@adrkit/core` read untrusted input in an automated context. The reason is recorded in the record rather than inferred from the pair of axes that disagree. Bumps the four lockstep packages to 0.5.0 with their two hardcoded version constants and the four `bun.lock` workspace `version` lines, which nothing refreshes automatically. Minor rather than patch: three additive runtime exports, and `scanSourceMarkers` now varies with its `path` argument. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Signed-off-by: Mark Beacom <m@beacom.dev>
mbeacom
force-pushed
the
mbeacom-release-v0-5-0
branch
from
August 10, 2026 13:06
aa21b2f to
56d7b88
Compare
This was referenced Aug 10, 2026
mbeacom
added a commit
that referenced
this pull request
Aug 12, 2026
The corpus had been building on five records that were never ratified. Nine accepted ADRs relied on ADR-0007 and six on ADR-0009, and two of them narrowed clauses of a proposed record: ADR-0013 amends both, ADR-0012 refines ADR-0009. Accepted decisions were resting on a proposed foundation. Each record was verified against the tree rather than trusting its own checkboxes. ADR-0007's two assertions run as the clean-clone-builds CI job and scripts/check-deps.ts, both required status checks on main. ADR-0009's five deliverables all exist: core/src/affects/, the purity test, test/conformance/, the catalog port with catalog-backstage, and adr explain. ADR-0006 is irreversible in fact because the repository is public, and its schema id already resolved to the namespace-independent adrkit.dev. Ratification is recorded as review.decidedAt and review.approvals, the first use of either field here, so the audit trail carries when and by whom rather than leaving status to imply it. Stale action items were corrected to verified reality; genuinely open ones stay unchecked, including ADR-0006's DCO bot, which CONTRIBUTING.md requires but which no ruleset check enforces, and ADR-0008's re-import pull request, unbuilt because non-MADR re-import is unbuilt. Ratifying several records together follows existing practice (#74 ratified ADR-0016 and ADR-0017; #110 ratified ADR-0022 and ADR-0023). The CONTRIBUTING rule requiring a superseding record rather than a status flip is scoped to changes that contradict an accepted record; ratifying a proposed record contradicts nothing and completes its intended lifecycle. ADR-0005 deliberately stays proposed. Only Pass 0 of its four passes exists, by design (spec 005 scoped itself to Pass 0), and the record carries a SOC2 CC8.1 control plus a standing commitment to publish escalation precision and recall each release. Ratifying it would assert an obligation the project cannot yet compute; its reviewBy of 2027-01-18 leaves room to ship Passes 1-3 first. ARB queue depth drops from 6 to 1, which the queue-depth badge reads. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
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.
What and why
Cuts v0.5.0 and ratifies the three records behind it.
This is the release where inbound
@adrmarkers stop being a single localcommand and start appearing in pull-request comments. ADR-0023 rides along
deliberately: the window in which the loose marker grammar is visible in CI is
exactly the window between two releases, so shipping #106 and #109 together means
no adopter ever sees
* @adr 0012in aNOTES.mdproduce a governing decisionand then watch it disappear on upgrade.
Governance
acceptedsuperseded,supersededBy: "0022"proposedaccepted,deciders: ["@mbeacom"],provenance.ratifiedBy,review.tier: arbproposedaccepted,deciders: ["@mbeacom"],provenance.ratifiedByADR-0021's argument is untouched — only
statusandsupersededBymoved, so therecord of the explain-only scope shipped in v0.4.0 still reads as written.
Nothing mechanical enforces the retirement:
corpus-invariants.tsonly checksreference resolvability, and the schema only couples
status: supersededwithsupersededByin both directions. Verified functionally rather than assumed —adr check packages/core/src/markers/read.tsnow reports:Why ADR-0022 takes the
arbtier0022 shipped without a
reviewblock at all, which made it the only ratifiedrecord in the corpus carrying no routing tier. Filling that in turned out to need
an actual judgment rather than a copied value, because the corpus's two signals
disagree here.
Surveying all 24 records:
arbtracksscope: org(17 records),asynctracksthe narrower ones (0016, 0017, 0018, 0021, 0023). 0022 is the only record in
the corpus with
blastRadius: cross-teamatscope: component— by scope itlooks like
async, by blast radius it looks likearb.Resolved toward
arb, and the reason is now in the record: ADR-0021 reachedadr explain, a command run against a file the caller owns. 0022 points the samereader at content a fork pull request authored, inside CI, and renders strings
derived from it into a comment signed by
github-actions[bot]. That is a changeof kind — the first time
@adrkit/coreopens untrusted input in an automatedcontext — and it is precisely why 0022's blast radius is cross-team where its
predecessor's was component. Its failure modes are all quiet: an existence oracle
handed to a fork, a live link in a trusted comment, a
422turning authoredcontent into a failed check. Two of those three were closed by review rather than
by design, which argues for the higher tier rather than against it.
Held to the corpus's actual convention on shape:
tier+tierReasononly,matching 0016/0017/0018/0021/0023.
queuedAt/slaDaysappear only on the sixrecords from the original 2026-07-28 queueing batch, and
approvals,decidedAt,quorum, andobjectionsare used nowhere in the corpus — so nonewere invented here.
If you read the scope axis as decisive instead, this is a one-word change to
async; the tierReason explains the call either way.Why minor, not patch
Two things exceed the patch rule in
docs/RELEASING.md:@adrkit/core—readSourceMarkersBatch,MARKER_SCAN_FILE_CAP,MARKER_SCAN_CONCURRENCY— all pinned bypackages/core/test/surface.test.ts. Nothing removed or renamed.scanSourceMarkers(source, path)now varies withpath. Same signature,different semantics: the extension selects the introducer set, so two files with
identical bytes scan differently. TypeScript will not catch this for an existing
caller, which is why it is called out here and in the changelog. It is fail-safe
— it only ever removes a declaration, plus the one addition of
{/*.Version surfaces touched
The four lockstep manifests, plus the three places a version is duplicated
outside them:
CLI_VERSION,SERVER_INFO, and both fields inpackages/mcp/server.json. Also the fourbun.lockworkspaceversionlines —edited by hand per
docs/RELEASING.md, because neitherbun installnorbun install --forcerefreshes them, and regenerating the lockfile pullstransitive
@octokit/*drift into the release commit (confirmed: it did, and wasreverted).
Changelog
[Unreleased]promoted to[0.5.0], link refs added. Three corrections whilepromoting:
its frontmatter once ratified here. Reworded rather than left to imply the
record was untouched.
localeCompare→ code-unit sort from feat(core,ci): wire inbound @adr markers into check #106's revisions was not recorded,including that it decides which paths survive the cap and which ten appear in
the
marker-scan-cappedwarning.Verification
Run on this branch:
bun testbun run typecheckbun run lintbun run adr lintbun run build→git status packages/ci/distbun run schema:emitbun run check:depsbun run check:freeze-hashesbun run audit:gatebun run release:pack -- --tag v0.5.0git statusclean afterwardsbun install --frozen-lockfileadr queueproposedonly.release/npm/containsadrkit-{core,evaluator,cli,mcp}-0.5.0.tgzplusadrkit-spec-kit-0.1.2.tgzriding along unchanged.Not done here — needs you
versions in one shell; not something to fake.
bun run release:publish -- --dry-run. Expected to fail on the adapter(The publish dry-run skips the idempotency check, so it tries to republish a released adapter #104) — the idempotency skip is gated behind
!dryRun, so it tries torepublish
@adrkit/spec-kitat its current version. The four lockstep packagesdry-run cleanly first.
v0.5.0and movev0(bun run release:action-tag) after npm succeeds.Follow-ups, not blockers
Post-release docs sync (matching #105):
README.md:228,234,site/src/components/Hero.astro:17,ci.mdx:42,79,index.mdx:21,quickstart.mdx:13, anddocs/RELEASING.md:12,17. Plus the four open items fromthe #106 review — marker-per-scan cap, scan health in the rendered comment,
toForwardSlashdivergence, and the remaininguniqueSortedlocaleCompare.One structural note worth its own issue:
adr queueemitsitem.tier-absentonly when a
reviewblock exists but omitstier. A record with noreviewblock at all — which is what 0022 was — produces no finding, so it can be
ratified carrying no routing tier without anything noticing. That is the gap that
let this one through.