release: 0.3.0 #165

Closed
claude-bot-andresmgsl wants to merge 4 commits from build/160-release-0-3-0 into main
claude-bot-andresmgsl commented 2026-07-24 17:08:47 +00:00 (Migrated from github.com)

Refs #160not Closes: the issue's acceptance criteria are post-merge, so triage owns the close (#151's rule).

The second assembled tag. Three stamps plus the drill record:

  • VERSION: 0.2.1-dev0.3.0 (minor — #157 D5: #159 changes the contract a consumer's CI runs against).
  • bin/changelog-assemble 0.3.0 — consumed all twelve fragments in the directory (130 131 134 135 137 139 144 145 149 151 154 159); section and fragment deletions in one commit.
  • CEREMONY_SELF_REF0.3.0 in both carriers (release.yml, labels.yml); self-ref-check green locally.
  • drills/0.3.0.md — live rehearsal of both doors on a disposable private repo, per drills/README.md: all six probes as specified, every refusal creating nothing; scratch repo archived, delete is the operator's (#135).

No changelog.d/ fragment for this PR — the release PR's structural exemption.

Acceptance criteria (from #160)

Post-merge criteria are triage's to verify on main; listed here for completeness, unchecked by design.

  • (post-merge) Tag 0.3.0 on the merge commit; release body is ## 0.3.0's section verbatim.
  • (post-merge) main re-arms to 0.3.1-dev; changelog.d/ holds only its README.md.
  • Section produced by the assembler, flat (#157 D1); changelog-assembled green on this PR.
  • (post-merge) changelog-armed green on the bare tree and on main after the -dev bump.
  • drills/0.3.0.md exists, non-blank; names the fork ref and the rewritten pin under their own heading; names the scratch repo owner/name with the disposal state its author observed.
  • No branch named 0.3.0 on heavy-duty/ceremony at any point — git ls-remote --heads origin 0.3.0 empty before and after the drill.
  • self-ref-check green: no carrier still pins 0.2.0.
  • (post-merge) actions/changelog-armed@0.3.0 and actions/changelog-assembled@0.3.0 resolve at the tag.

Worklog

  • Claim #160; worktree off a7aedfd
  • VERSION0.3.0
  • bin/changelog-assemble 0.3.0 — section + twelve fragment deletions, one commit
  • CEREMONY_SELF_REF0.3.0 in both carriers; self-ref-check green
  • Full local test suite green (785 tests)
  • Open draft PR with release label
  • Verify no 0.3.0 branch exists on heavy-duty/ceremony (before drill)
  • Push drill/0.3.0 scaffold to fork: candidate tree + both pins rewritten to candidate SHA (64af424, candidate 5f0686b)
  • Create scratch private repo with CONSUMERS.md caller stub pinned to the fork ref; armed fixture (baseline run green NOTICE)
  • Probe: mislabeled ordinary PR → green NOTICE no-op (run 30112073479)
  • Probe: bare-version PR without release → refuses, creates nothing (run 30112112006; no tag, no release; merge reverted, restore ran green)
  • Probe: merge-door ceremony → one release, tag = merge commit (78586bc), main re-armed to 0.3.1-dev (run 30112209127)
  • Probe: re-run completed ceremony → refuses (attempt 2, "tag already exists"; release count stayed one)
  • Probe: manual matching tag → publishes (0.4.0 from a side-branch tree, run 30112294804; main untouched at 0.3.1-dev)
  • Probe: mismatched tag → refuses (run 30112327723, "tag '9.9.9' does not match the tree's version '0.4.0'"; no 9.9.9 release)
  • Verify no 0.3.0 branch on heavy-duty/ceremony (after drill)
  • Archive scratch repo (observed archived: true); write drills/0.3.0.md with observed disposal state (30b49c4)
  • Ready-for-review; request the panel (codex, grok, kimi — bench minus author)
Refs #160 — **not** `Closes`: the issue's acceptance criteria are post-merge, so triage owns the close (#151's rule). The second assembled tag. Three stamps plus the drill record: - `VERSION`: `0.2.1-dev` → `0.3.0` (minor — #157 D5: #159 changes the contract a consumer's CI runs against). - `bin/changelog-assemble 0.3.0` — consumed all twelve fragments in the directory (`130 131 134 135 137 139 144 145 149 151 154 159`); section and fragment deletions in one commit. - `CEREMONY_SELF_REF` → `0.3.0` in both carriers (`release.yml`, `labels.yml`); `self-ref-check` green locally. - `drills/0.3.0.md` — live rehearsal of both doors on a disposable private repo, per drills/README.md: all six probes as specified, every refusal creating nothing; scratch repo archived, delete is the operator's (#135). No `changelog.d/` fragment for this PR — the release PR's structural exemption. ## Acceptance criteria (from #160) Post-merge criteria are triage's to verify on `main`; listed here for completeness, unchecked by design. - [ ] *(post-merge)* Tag `0.3.0` on the merge commit; release body is `## 0.3.0`'s section verbatim. - [ ] *(post-merge)* `main` re-arms to `0.3.1-dev`; `changelog.d/` holds only its `README.md`. - [ ] Section produced by the assembler, flat (#157 D1); `changelog-assembled` green on this PR. - [ ] *(post-merge)* `changelog-armed` green on the bare tree and on `main` after the `-dev` bump. - [ ] `drills/0.3.0.md` exists, non-blank; names the fork ref and the rewritten pin under their own heading; names the scratch repo `owner/name` with the disposal state its author observed. - [ ] No branch named `0.3.0` on `heavy-duty/ceremony` at any point — `git ls-remote --heads origin 0.3.0` empty before and after the drill. - [ ] `self-ref-check` green: no carrier still pins `0.2.0`. - [ ] *(post-merge)* `actions/changelog-armed@0.3.0` and `actions/changelog-assembled@0.3.0` resolve at the tag. ## Worklog - [x] Claim #160; worktree off `a7aedfd` - [x] `VERSION` → `0.3.0` - [x] `bin/changelog-assemble 0.3.0` — section + twelve fragment deletions, one commit - [x] `CEREMONY_SELF_REF` → `0.3.0` in both carriers; `self-ref-check` green - [x] Full local test suite green (785 tests) - [x] Open draft PR with `release` label - [x] Verify no `0.3.0` branch exists on `heavy-duty/ceremony` (before drill) - [x] Push `drill/0.3.0` scaffold to fork: candidate tree + both pins rewritten to candidate SHA (`64af424`, candidate `5f0686b`) - [x] Create scratch private repo with CONSUMERS.md caller stub pinned to the fork ref; armed fixture (baseline run green NOTICE) - [x] Probe: mislabeled ordinary PR → green NOTICE no-op (run 30112073479) - [x] Probe: bare-version PR without `release` → refuses, creates nothing (run 30112112006; no tag, no release; merge reverted, restore ran green) - [x] Probe: merge-door ceremony → one release, tag = merge commit (`78586bc`), main re-armed to `0.3.1-dev` (run 30112209127) - [x] Probe: re-run completed ceremony → refuses (attempt 2, "tag already exists"; release count stayed one) - [x] Probe: manual matching tag → publishes (`0.4.0` from a side-branch tree, run 30112294804; main untouched at `0.3.1-dev`) - [x] Probe: mismatched tag → refuses (run 30112327723, "tag '9.9.9' does not match the tree's version '0.4.0'"; no 9.9.9 release) - [x] Verify no `0.3.0` branch on `heavy-duty/ceremony` (after drill) - [x] Archive scratch repo (observed `archived: true`); write `drills/0.3.0.md` with observed disposal state (`30b49c4`) - [x] Ready-for-review; request the panel (codex, grok, kimi — bench minus author)
danmt (Migrated from github.com) reviewed 2026-07-24 17:08:47 +00:00
codex-bot-andresmgsl commented 2026-07-24 17:20:47 +00:00 (Migrated from github.com)

🔎 reviewing head 30b49c4ade

🔎 reviewing head 30b49c4ade4cdb64d3440566fa526284a6461fa8
grok-bot-andresmgsl commented 2026-07-24 17:20:54 +00:00 (Migrated from github.com)

🔎 reviewing head 30b49c4ade

🔎 reviewing head 30b49c4ade4cdb64d3440566fa526284a6461fa8
codex-bot-andresmgsl (Migrated from github.com) approved these changes 2026-07-24 17:22:08 +00:00
codex-bot-andresmgsl (Migrated from github.com) left a comment

The 0.3.0 release tree satisfies #160's pre-merge criteria. I verified both self-reference carriers and the bare VERSION, confirmed changelog-assembled replays all 12 base fragments byte-for-byte into the flat 0.3.0 section, confirmed changelog-armed and drill-recorded, and verified refs/heads/0.3.0 is absent on origin.

bash test/run.sh passed all 18 test files locally. The exact head's CI is also green, including the self-guards, release exercise, shellcheck/actionlint, and the yq-required cases that skipped locally because yq is unavailable.

I could not independently query the archived private scratch repository with this credential (the repository endpoint returns 404), so I relied on the committed drill record for the six live probe results and observed archive state. The post-merge tag, release-body, re-arm, guard, and action-ref checks remain triage-owned as #160 specifies.

The 0.3.0 release tree satisfies #160's pre-merge criteria. I verified both self-reference carriers and the bare VERSION, confirmed `changelog-assembled` replays all 12 base fragments byte-for-byte into the flat 0.3.0 section, confirmed `changelog-armed` and `drill-recorded`, and verified `refs/heads/0.3.0` is absent on origin. `bash test/run.sh` passed all 18 test files locally. The exact head's CI is also green, including the self-guards, release exercise, shellcheck/actionlint, and the yq-required cases that skipped locally because yq is unavailable. I could not independently query the archived private scratch repository with this credential (the repository endpoint returns 404), so I relied on the committed drill record for the six live probe results and observed archive state. The post-merge tag, release-body, re-arm, guard, and action-ref checks remain triage-owned as #160 specifies.
grok-bot-andresmgsl (Migrated from github.com) approved these changes 2026-07-24 17:23:27 +00:00
grok-bot-andresmgsl (Migrated from github.com) left a comment

Verdict: approve

Head 30b49c4ade4cdb64d3440566fa526284a6461fa8 against #160 (Refs, not Closes — correct for post-merge AC).

Spec / acceptance (pre-merge)

Criterion Evidence
VERSION0.3.0 (minor) 0.2.1-dev0.3.0
Assemble all fragments; section + deletions one commit d6b175f: 12 fragments consumed (130 131 134 135 137 139 144 145 149 151 154 159); only changelog.d/README.md remains
Flat section (#157 D1) No ### headings under ## 0.3.0; 12 bullets
Assembler fidelity Local re-run of bin/changelog-assemble 0.3.0 from d6b175f^ matches the PR section byte-for-byte; CI changelog-assembled: "section '0.3.0' … assembly of the 12 fragment(s) consumed at the merge base (a7aedfd)"
CEREMONY_SELF_REF0.3.0 both carriers release.yml L132, labels.yml L28; local self-ref-check green; CI self-guards green
drills/0.3.0.md live record Non-blank; fork ref claude-bot-andresmgsl/ceremony@drill/0.3.0 + pin rewrite to 5f0686b… under Candidate-ref deviation; scratch claude-bot-andresmgsl/ceremony-drill-0.3.0 with observed archived: true; all six probes with run ids; refusals create nothing
No 0.3.0 branch on ceremony git ls-remote --heads empty for 0.3.0 (fork drill branch only, as doctrine requires)
No fragment for the release PR Structural exemption; body uses Refs #160
release label Present

Post-merge criteria (tag, re-arm, action pins) are triage's after merge — correctly not claimed here.

Verify

  • CI on head: test, self-guards (armed / monotonic / assembled / drill-recorded / runner-isolated), action-exercise, docs-sync-exercise, release-exercise step-replay + fixture-chain — all success.
  • Local on throwaway worktree at head: self-ref-check, changelog-assembled (base origin/main), drill-recorded, changelog-armed — all exit 0. Related unit suites via test/run.sh green (incl. self-ref / assemble / assembled / armed / drill-recorded).
  • Fork evidence I could read: drill/0.3.0 at 64af424 rewrites both carriers to candidate 5f0686b. Scratch repo is private to the author — 404 from this identity; record's disposal claim matches #135 doctrine and prior 0.2.0 shape.

Non-blocking

  • Banked fragment 159.md still omits (#159) in the bullet text, so the published section has no #159 cite. Faithful assembly of what was already on main — not a release-PR defect. Worth a follow-up fragment style note, not a block.

Nothing blocking. Approve.

## Verdict: approve Head `30b49c4ade4cdb64d3440566fa526284a6461fa8` against #160 (Refs, not Closes — correct for post-merge AC). ### Spec / acceptance (pre-merge) | Criterion | Evidence | |---|---| | `VERSION` → `0.3.0` (minor) | `0.2.1-dev` → `0.3.0` | | Assemble all fragments; section + deletions one commit | `d6b175f`: 12 fragments consumed (`130 131 134 135 137 139 144 145 149 151 154 159`); only `changelog.d/README.md` remains | | Flat section (#157 D1) | No `###` headings under `## 0.3.0`; 12 bullets | | Assembler fidelity | Local re-run of `bin/changelog-assemble 0.3.0` from `d6b175f^` matches the PR section byte-for-byte; CI `changelog-assembled`: "section '0.3.0' … assembly of the 12 fragment(s) consumed at the merge base (a7aedfd)" | | `CEREMONY_SELF_REF` → `0.3.0` both carriers | `release.yml` L132, `labels.yml` L28; local `self-ref-check` green; CI self-guards green | | `drills/0.3.0.md` live record | Non-blank; fork ref `claude-bot-andresmgsl/ceremony@drill/0.3.0` + pin rewrite to `5f0686b…` under **Candidate-ref deviation**; scratch `claude-bot-andresmgsl/ceremony-drill-0.3.0` with observed `archived: true`; all six probes with run ids; refusals create nothing | | No `0.3.0` branch on ceremony | `git ls-remote --heads` empty for `0.3.0` (fork drill branch only, as doctrine requires) | | No fragment for the release PR | Structural exemption; body uses `Refs #160` | | `release` label | Present | Post-merge criteria (tag, re-arm, action pins) are triage's after merge — correctly not claimed here. ### Verify - **CI on head:** `test`, `self-guards` (armed / monotonic / assembled / drill-recorded / runner-isolated), `action-exercise`, `docs-sync-exercise`, release-exercise step-replay + fixture-chain — all success. - **Local on throwaway worktree at head:** `self-ref-check`, `changelog-assembled` (base `origin/main`), `drill-recorded`, `changelog-armed` — all exit 0. Related unit suites via `test/run.sh` green (incl. self-ref / assemble / assembled / armed / drill-recorded). - **Fork evidence I could read:** `drill/0.3.0` at `64af424` rewrites both carriers to candidate `5f0686b`. Scratch repo is private to the author — 404 from this identity; record's disposal claim matches #135 doctrine and prior 0.2.0 shape. ### Non-blocking - Banked fragment `159.md` still omits `(#159)` in the bullet text, so the published section has no `#159` cite. Faithful assembly of what was already on main — not a release-PR defect. Worth a follow-up fragment style note, not a block. Nothing blocking. Approve.
kimi-bot-andresmgsl commented 2026-07-24 17:26:13 +00:00 (Migrated from github.com)

🔎 reviewing head 30b49c4ade

🔎 reviewing head 30b49c4ade4cdb64d3440566fa526284a6461fa8
kimi-bot-andresmgsl (Migrated from github.com) approved these changes 2026-07-24 17:31:38 +00:00
kimi-bot-andresmgsl (Migrated from github.com) left a comment

Approve head 30b49c4ade4cdb64d3440566fa526284a6461fa8.

Reviewed against #160's acceptance criteria (post-merge ones are triage's by design — Refs #160 is the correct shape here, per #151's rule):

Verified locally in a detached worktree at head:

  • VERSION = 0.3.0; changelog.d/ holds only README.md — all twelve fragments consumed, deletions and section in the assemble commit d6b175f.
  • changelog-assembled replayed by hand (CHANGELOG_ASSEMBLED_BASE=origin/main): section 0.3.0 is byte-for-byte the assembly of the 12 fragments at merge base a7aedfd. Section is flat (#157 D1) — all entries top-level bullets.
  • CEREMONY_SELF_REF = 0.3.0 in both carriers (release.yml:132, labels.yml:28); no 0.2.0 pin remains anywhere in either workflow. test/self-ref.test.sh: 12/12 green, including the real-tree guard.
  • drills/0.3.0.md non-blank; names the fork ref and rewritten pin under their own heading ("Candidate-ref deviation": claude-bot-andresmgsl/ceremony@drill/0.3.0 at 64af424, pin 5f0686b), names the scratch repo claude-bot-andresmgsl/ceremony-drill-0.3.0 with the disposal its author observed (archived, delete operator's per #135). All six probes recorded, every refusal creating nothing.
  • No branch 0.3.0 on heavy-duty/ceremonygit ls-remote --heads origin 0.3.0 empty as of this review.
  • release label present; no changelog.d/ fragment for this PR (structural exemption).

Fork evidence read firsthand: drill/0.3.0 = 64af424063741737b26bebe2c620b50aa585b690, sole parent exactly the candidate 5f0686b3950d6adc699e750ef5858a20eb084f6f, single commit rewriting both carriers from 0.3.0 to that SHA — matches the record's claim.

CI green on this head: test, self-guards, action-exercise, docs-sync-exercise, labels, both release-exercise step-replays and fixture-chain.

What I could not verify (environment gaps, named per REVIEWER.md): this box has no node/npm, so the package-json cases in the unit suites fail here. I ran the full test/run.sh on both head and an origin/main baseline worktree: identical 63-case failure sets — pre-existing env gaps, zero regression from this PR; CI's green test job covers them. The drill's scratch repo is private to the author (404 from this identity); I relied on the record's disposal claim (consistent with #135 doctrine and the 0.2.0 shape) plus firsthand verification of the fork ref above.

Non-blocking: banked 159.md had no (#159) cite in its bullet, so the published section lacks one — faithful assembly of what was on main, not a release-PR defect (grok flagged the same). A fragment-style follow-up, not a block.

Nothing blocking. Approve.

Approve head `30b49c4ade4cdb64d3440566fa526284a6461fa8`. Reviewed against #160's acceptance criteria (post-merge ones are triage's by design — `Refs #160` is the correct shape here, per #151's rule): **Verified locally in a detached worktree at head:** - `VERSION` = `0.3.0`; `changelog.d/` holds only `README.md` — all twelve fragments consumed, deletions and section in the assemble commit `d6b175f`. - `changelog-assembled` replayed by hand (`CHANGELOG_ASSEMBLED_BASE=origin/main`): section `0.3.0` is byte-for-byte the assembly of the 12 fragments at merge base `a7aedfd`. Section is flat (#157 D1) — all entries top-level bullets. - `CEREMONY_SELF_REF` = `0.3.0` in both carriers (`release.yml:132`, `labels.yml:28`); no `0.2.0` pin remains anywhere in either workflow. `test/self-ref.test.sh`: 12/12 green, including the real-tree guard. - `drills/0.3.0.md` non-blank; names the fork ref and rewritten pin under their own heading ("Candidate-ref deviation": `claude-bot-andresmgsl/ceremony@drill/0.3.0` at `64af424`, pin `5f0686b`), names the scratch repo `claude-bot-andresmgsl/ceremony-drill-0.3.0` with the disposal its author observed (archived, delete operator's per #135). All six probes recorded, every refusal creating nothing. - No branch `0.3.0` on `heavy-duty/ceremony` — `git ls-remote --heads origin 0.3.0` empty as of this review. - `release` label present; no `changelog.d/` fragment for this PR (structural exemption). **Fork evidence read firsthand:** `drill/0.3.0` = `64af424063741737b26bebe2c620b50aa585b690`, sole parent exactly the candidate `5f0686b3950d6adc699e750ef5858a20eb084f6f`, single commit rewriting both carriers from `0.3.0` to that SHA — matches the record's claim. **CI green** on this head: `test`, `self-guards`, `action-exercise`, `docs-sync-exercise`, `labels`, both `release-exercise` step-replays and `fixture-chain`. **What I could not verify (environment gaps, named per REVIEWER.md):** this box has no `node`/`npm`, so the `package-json` cases in the unit suites fail here. I ran the full `test/run.sh` on both head and an `origin/main` baseline worktree: **identical 63-case failure sets** — pre-existing env gaps, zero regression from this PR; CI's green `test` job covers them. The drill's scratch repo is private to the author (404 from this identity); I relied on the record's disposal claim (consistent with #135 doctrine and the 0.2.0 shape) plus firsthand verification of the fork ref above. **Non-blocking:** banked `159.md` had no `(#159)` cite in its bullet, so the published section lacks one — faithful assembly of what was on main, not a release-PR defect (grok flagged the same). A fragment-style follow-up, not a block. Nothing blocking. Approve.
claude-bot-andresmgsl commented 2026-07-24 17:37:15 +00:00 (Migrated from github.com)

Round summary — handing off

What shipped — the 0.3.0 release tree, four commits: 60e4f09 bumps VERSION from 0.2.1-dev to 0.3.0 (minor per #157 D5 — #159 changes the contract a consumer's CI runs against); d6b175f assembles the ## 0.3.0 section from all twelve banked fragments (130 131 134 135 137 139 144 145 149 151 154 159) and deletes them in the same commit, leaving changelog.d/ with only its README.md; 5f0686b stamps CEREMONY_SELF_REF to 0.3.0 in both carriers (release.yml, labels.yml); 30b49c4 records the live drill in drills/0.3.0.md. No changelog.d/ fragment for this PR — the release PR's structural exemption. Refs #160, not Closes: the post-merge criteria are triage's to verify, so triage owns the close (#151's rule).

Rounds — one. The panel (codex, grok, kimi) reviewed head 30b49c4 and all three approved with no changes requested, so the approved head is the only head this PR has ever had. Two reviewers noted the same non-blocking point: banked 159.md's bullet carries no (#159) cite, so the published section lacks one — faithful assembly of what was already on main, a fragment-style follow-up for triage, not a release-PR defect.

Verified

  • Assembly fidelity: the ## 0.3.0 section is byte-for-byte the assembler's output over the twelve fragments at merge base a7aedfd, and flat (#157 D1) — replayed by me and independently by all three reviewers; changelog-assembled green in CI.
  • Self-reference: CEREMONY_SELF_REF = 0.3.0 in both carriers, no 0.2.0 pin remains; self-ref-check green locally and in CI's self-guards.
  • Tests: full local suite green (785 tests, 18 files); CI green on 30b49c4test, self-guards (armed / monotonic / assembled / drill-recorded / runner-isolated), action-exercise, docs-sync-exercise, both release-exercise step-replays and fixture-chain, labels / reconcile.
  • Live drill (drills/0.3.0.md): all six probes on a disposable private scratch repo (claude-bot-andresmgsl/ceremony-drill-0.3.0), each with its run id — mislabeled ordinary PR no-ops green; bare-version PR without release refuses creating nothing; merge-door ceremony produces one release with tag = merge commit and re-arms main to 0.3.1-dev; re-running the completed ceremony refuses; a manual matching tag publishes; a mismatched tag refuses. The candidate-ref deviation (fork ref claude-bot-andresmgsl/ceremony@drill/0.3.0 at 64af424, pins rewritten to candidate 5f0686b) is recorded under its own heading; kimi verified the fork ref firsthand. Scratch repo archived (observed archived: true); the delete is the operator's (#135).
  • No branch 0.3.0 ever existed on heavy-duty/ceremonygit ls-remote --heads origin 0.3.0 empty before and after the drill, re-checked by the reviewers.

Post-merge residue#160's post-merge criteria, triage's to verify on main after the merge: tag 0.3.0 on the merge commit with the release body ## 0.3.0's section verbatim; main re-armed to 0.3.1-dev with changelog.d/ holding only README.md; changelog-armed green on the bare tree and after the -dev bump; actions/changelog-armed@0.3.0 and actions/changelog-assembled@0.3.0 resolving at the tag. Plus the non-blocking fragment-style note above (issue cites in banked bullets), which is triage's to queue or drop.

Round converged: whole panel approved the current head, zero blockers, CI green, drill recorded. Handing off — requesting @danmt's review and setting state:needs-human. The remaining move is the human's merge.

## Round summary — handing off **What shipped** — the 0.3.0 release tree, four commits: `60e4f09` bumps `VERSION` from `0.2.1-dev` to `0.3.0` (minor per #157 D5 — #159 changes the contract a consumer's CI runs against); `d6b175f` assembles the `## 0.3.0` section from all twelve banked fragments (`130 131 134 135 137 139 144 145 149 151 154 159`) and deletes them in the same commit, leaving `changelog.d/` with only its `README.md`; `5f0686b` stamps `CEREMONY_SELF_REF` to `0.3.0` in both carriers (`release.yml`, `labels.yml`); `30b49c4` records the live drill in `drills/0.3.0.md`. No `changelog.d/` fragment for this PR — the release PR's structural exemption. `Refs #160`, not `Closes`: the post-merge criteria are triage's to verify, so triage owns the close (#151's rule). **Rounds** — one. The panel (codex, grok, kimi) reviewed head `30b49c4` and all three approved with no changes requested, so the approved head is the only head this PR has ever had. Two reviewers noted the same non-blocking point: banked `159.md`'s bullet carries no `(#159)` cite, so the published section lacks one — faithful assembly of what was already on `main`, a fragment-style follow-up for triage, not a release-PR defect. **Verified** - Assembly fidelity: the `## 0.3.0` section is byte-for-byte the assembler's output over the twelve fragments at merge base `a7aedfd`, and flat (#157 D1) — replayed by me and independently by all three reviewers; `changelog-assembled` green in CI. - Self-reference: `CEREMONY_SELF_REF` = `0.3.0` in both carriers, no `0.2.0` pin remains; `self-ref-check` green locally and in CI's `self-guards`. - Tests: full local suite green (785 tests, 18 files); CI green on `30b49c4` — `test`, `self-guards` (armed / monotonic / assembled / drill-recorded / runner-isolated), `action-exercise`, `docs-sync-exercise`, both `release-exercise` step-replays and `fixture-chain`, `labels / reconcile`. - Live drill (`drills/0.3.0.md`): all six probes on a disposable private scratch repo (`claude-bot-andresmgsl/ceremony-drill-0.3.0`), each with its run id — mislabeled ordinary PR no-ops green; bare-version PR without `release` refuses creating nothing; merge-door ceremony produces one release with tag = merge commit and re-arms `main` to `0.3.1-dev`; re-running the completed ceremony refuses; a manual matching tag publishes; a mismatched tag refuses. The candidate-ref deviation (fork ref `claude-bot-andresmgsl/ceremony@drill/0.3.0` at `64af424`, pins rewritten to candidate `5f0686b`) is recorded under its own heading; kimi verified the fork ref firsthand. Scratch repo archived (observed `archived: true`); the delete is the operator's (#135). - No branch `0.3.0` ever existed on `heavy-duty/ceremony` — `git ls-remote --heads origin 0.3.0` empty before and after the drill, re-checked by the reviewers. **Post-merge residue** — #160's post-merge criteria, triage's to verify on `main` after the merge: tag `0.3.0` on the merge commit with the release body `## 0.3.0`'s section verbatim; `main` re-armed to `0.3.1-dev` with `changelog.d/` holding only `README.md`; `changelog-armed` green on the bare tree and after the `-dev` bump; `actions/changelog-armed@0.3.0` and `actions/changelog-assembled@0.3.0` resolving at the tag. Plus the non-blocking fragment-style note above (issue cites in banked bullets), which is triage's to queue or drop. Round converged: whole panel approved the current head, zero blockers, CI green, drill recorded. Handing off — requesting @danmt's review and setting `state:needs-human`. The remaining move is the human's merge.
danmt commented 2026-07-24 17:39:59 +00:00 (Migrated from github.com)

closed on behalf of #164

closed on behalf of #164

Pull request closed

Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: heavy-duty/ceremony#165
No description provided.