Skip to content

docs(adr): ratify ADR-0003, 0006, 0007, 0008, and 0009 - #129

Merged
mbeacom merged 2 commits into
mainfrom
mbeacom-ratify-pending-adrs
Aug 12, 2026
Merged

docs(adr): ratify ADR-0003, 0006, 0007, 0008, and 0009#129
mbeacom merged 2 commits into
mainfrom
mbeacom-ratify-pending-adrs

Conversation

@mbeacom

@mbeacom mbeacom commented Aug 12, 2026

Copy link
Copy Markdown
Owner

What and why

Five foundational ADRs — 0003, 0006, 0007, 0008, 0009 — move from proposed to accepted. This is hygiene catch-up: the work these records authorize shipped long ago (the Spec Kit extension, adapter isolation, affects resolution, MADR migration), but the records themselves were never ratified.

This closed a governance inversion, not a formality. Nine accepted records already relied on ADR-0007 and six on ADR-0009 — and two of them narrow clauses of a record that was never ratified: ADR-0013 amends both, ADR-0012 refines ADR-0009. Accepted decisions were resting on a proposed foundation.

Pending Depended on by accepted ADRs
0007 9 — 0004, 0010, 0012, 0013, 0014, 0017, 0018, 0019, 0020
0009 6 — 0012, 0013, 0014, 0015, 0020, 0022
0006 2 — 0010, 0011
0003 1 — 0019

Verified, not assumed

Each record was checked against the tree rather than trusting its own checkboxes — which turned out to matter, since the boxes were stale in both directions:

  • 0007 — both assertions are live and are required status checks on main (clean-clone-builds, plus scripts/check-deps.ts, observed failing per ADR-0016).
  • 0009 — four of five deliverables exist: core/src/affects/, the purity test, test/conformance/, and adr explain. The catalog-port item is left unchecked — the port type exists, but no adapter implementation ships (catalog-backstage is placement only and generates nothing).
  • 0006 — Apache-2.0 on all five packages, schema/LICENSE (CC0), and $id already on the namespace-independent adrkit.dev. The repo is public, so this one-way door is irreversible in fact.
  • 0008adr migrate --from madr, import-incomplete, and the fingerprint + four-bucket classifier all ship.
  • 0003@adrkit/spec-kit 0.1.2 and the standalone CLI both ship; ADR-0019 already resolved the spike no-go.

Ratification is recorded as review.decidedAt and review.approvals — the first use of either field in this corpus — so the audit trail carries when and by whom instead of leaving status to imply it.

Left honestly unchecked

Action items that are genuinely open were not ticked:

Why several records in one PR

This follows existing practice: #74 ratified ADR-0016 and ADR-0017 together; #110 ratified ADR-0022 and ADR-0023 and retired ADR-0021. The CONTRIBUTING rule requiring a superseding record "with the argument, not just the status flip" is scoped to changes that contradict an accepted record — ratifying a proposed record contradicts nothing and completes its intended lifecycle. (Contrast e45335a, where changing ADR-0021's substance correctly produced ADR-0022 rather than an edit.) All five share one rationale, so they belong together.

ADR-0005 deliberately stays proposed

Only Pass 0 of its four passes exists — by design, since spec 005 scoped itself to Pass 0. But the record carries a SOC2 CC8.1 control plus a standing commitment to publish escalation precision and recall each release, including the false-negative rate. Ratifying it would assert a compliance obligation the project cannot yet compute. Its reviewBy of 2027-01-18 leaves room to ship Passes 1–3 first.

ARB queue depth drops 6 → 1, which the queue-depth badge reads from $.totalItems (regenerated at site build; nothing committed goes stale).

Checklist

  • Commits are DCO signed off (git commit -s). No CLA is required.
  • If this changes a recorded decision in docs/adr/, an ADR is added or
    supersedes
    the affected record — with the argument, not just a status flip.
    (N/A — no accepted record is contradicted; see "Why several records in one PR".)
  • If the schema changed, I edited the Zod source — N/A, no schema change.
  • If packages/ci/src or @adrkit/core changed, I regenerated
    packages/ci/distN/A, docs-only change.
  • New or changed behavior is covered by tests — N/A, no behavior change;
    the corpus is covered by existing lint/check/conformance gates.
  • bun run typecheck && bun run build && bun test && bun run lint pass from a
    clean clone with no credentials configured
    (ADR-0007).

Also green locally: adr lint (25 records, 0 errors/0 warnings), adr check on the changed files (0 changed-record errors), check:deps, check:changelog, check:doc-pins, check:freeze-hashes, and 1997 tests.

Review feedback addressed (fe4363a)

All three review comments were correct.

  1. ADR-0009 item 4 unticked. I had ticked it on the reasoning that the port type plus a committed adapter package was the deliverable. The package disagrees: it exports only PACKAGE_NAME and states "No generator has run. No envelope exists." The item now says exactly what exists and points at ADR-0013/ADR-0020.
  2. Changelog corrected from "all five deliverables" to "four of five", dropping catalog-backstage as a claimed reference implementation.
  3. MANIFEST.md refreshed — and it was worse than reported. Beyond listing the five as proposed, it stopped at ADR-0019 and claimed "19 records, 13 accepted" against an actual 25. Now carries 0020–0025, the real counts (23 accepted, 1 proposed, 1 superseded), and a catalog note consistent with the unticked item.

Also closed the two follow-ups this decision satisfies: ADR-0012 item 4 (open the ratification decision for 0007/0009) and ADR-0013 item 1 (fold the amendments in on accept — both records already carry them inline). ADR-0012 items 2 and 3 stay open; they gate the persisted envelope and the generator, which no ratified clause asserts.

None of this disturbs the ratification: ADR-0009's decision is the pinned resolution semantics, which are implemented, pure, and conformance-tested.

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>
Signed-off-by: Mark Beacom <m@beacom.dev>
Copilot AI balanced review requested due to automatic review settings August 12, 2026 12:18
@mbeacom mbeacom self-assigned this Aug 12, 2026

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Ratifies five foundational ADRs and records their implementation status and approval metadata.

Changes:

  • Moves ADRs 0003, 0006–0009 from proposed to accepted.
  • Updates completed action items.
  • Documents the ratifications in the changelog.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
CHANGELOG.md Records the ratifications and queue impact.
docs/adr/0003-ship-as-spec-kit-extension.md Accepts ADR-0003.
docs/adr/0006-license-apache-2-and-single-monorepo.md Accepts ADR-0006 and updates actions.
docs/adr/0007-adapter-isolation-and-public-surface-build.md Accepts ADR-0007 and updates actions.
docs/adr/0008-import-and-migration-semantics.md Accepts ADR-0008 and updates actions.
docs/adr/0009-affects-resolution-and-catalog-binding.md Accepts ADR-0009 and updates actions.

💡 Add a code-review agent skill for context-aware, tailored reviews. Learn more in the docs.

Comment thread docs/adr/0007-adapter-isolation-and-public-surface-build.md
Comment thread docs/adr/0009-affects-resolution-and-catalog-binding.md Outdated
Comment thread CHANGELOG.md Outdated
Addresses review feedback on #129. Three findings, all correct.

Untick ADR-0009 action item 4. The catalog port *type* exists in
packages/core/src/affects/catalog.ts, but no adapter implementation ships:
packages/adapters/catalog-backstage is placement and dependency boundary only,
exports nothing but PACKAGE_NAME, and says of itself "No generator has run. No
envelope exists." Calling it the reference implementation overstated it. The
changelog claim that all five ADR-0009 deliverables exist is corrected to four
of five for the same reason.

This does not disturb the ratification. ADR-0009's decision is the pinned
resolution semantics, which are implemented, pure, and conformance-tested; the
catalog adapter is separately governed by ADR-0013 and ADR-0020 and is deferred
by the Decision itself.

Refresh MANIFEST.md, which published contradictory governance state. It listed
the five newly ratified records as proposed and said six remain queued. It was
also six records behind independently -- it stopped at 0019 and reported "19
records, 13 accepted" against an actual 25 records. The inventory now carries
0020-0025, the real counts (23 accepted, 1 proposed, 1 superseded), and a
catalog-binding note that matches the unticked action item rather than implying
an adapter exists.

Close the two follow-ups this decision satisfies: ADR-0012 item 4, which asked
for the ratification decision on ADR-0007 and ADR-0009 to be opened, and
ADR-0013 item 1, which asked for its amendments to be folded in when each record
was taken to an explicit accept decision -- both carry the amendment inline.
ADR-0012 items 2 and 3 stay open and still gate the persisted envelope and the
generator, neither of which any ratified clause asserts.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Signed-off-by: Mark Beacom <m@beacom.dev>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants