release: forge 0.6.2 #250

Merged
andres merged 4 commits from build/231-release-0-6-2 into main 2026-08-24 15:55:13 +00:00

Refs #231

Acceptance criteria

  • 0.6.2 tag exists here; release published; guards green. (operator-owned after merge)
  • Main re-armed to 0.6.3-dev after the release. (operator-owned after merge)
  • docs/UPSTREAM-SYNC.md names content baseline upstream-0.6.3 and unchanged ancestry baseline 8c3a4d1; .upstream-ref remains byte-identical; the changelog provenance header records the port.
  • The 0.6.2 section is exactly fragment-assembled in canonical order, carries #246 verbatim, and release guards are green.
  • drills/0.6.2.md records the candidate-head doors-unchanged measurements and drill-recorded is green.
  • !250 carries the hand-set release label and uses Refs #231.
  • The crew pin-bump follow-up issue is minted and linked. (triage-owned after release)

Worklog

  • Claim #231 and record the design on the issue before creating the branch.
  • Cut a fresh worktree from origin/main; verify all 31 baseline test files pass.
  • Stamp VERSION and the three CEREMONY_SELF_REF pins at 0.6.2; run version/self-ref guards; push checkpoint.
  • Assemble the 0.6.2 changelog section with bin/changelog-assemble, consuming the six landed fragments.
  • Update upstream sync and provenance records while preserving .upstream-ref byte-for-byte.
  • Run release guards, full suite, sanctioned chunked shellcheck, and diff hygiene.
  • Prepare the initial complete draft head for the required signal→ready handoff with no intervening commit.
  • Reproduce the amended-contract failure: drill-recorded refuses the missing drills/0.6.2.md.
  • Measure all three doors-unchanged conditions at the candidate tree against rehearsed tag 0.6.1.
  • Add the measured drills/0.6.2.md record and turn the targeted guard green.
  • Run the full required verification on the repaired release tree.
  • Push the complete fix at 809b7e907a8fb05136b268ed22ed9c92b1346c21 and finish with exact-head signal→ready, with no intervening commit.

Test record

  • Baseline at 7bdae45: bash test/run.sh — 31/31 test files passed.
  • Stamp checkpoint 05f182f: test/version.test.sh 22/22; test/self-ref.test.sh 12/12.
  • Assembly checkpoint aa818d5: changelog assembler 48/48, replay 37/37, armed 50/50.
  • Provenance checkpoint fdb7d75: upstream delta 28/28, replay 37/37, monotonic 20/20; .upstream-ref byte-identical to origin/main.
  • Final at fdb7d7577b4b30c11f2db9b47f278e2a16783c8c: runner-required full suite 31/31; shellcheck 64 scripts; actionlint 9 workflows; self-ref, marker, vendored, and changelog-armed guards green; git diff --check clean.
  • Internal read-only review of 7bdae45..fdb7d75: no critical or important findings; canonical 1,973-byte section replay matched exactly.
  • Round fix at 809b7e907a8fb05136b268ed22ed9c92b1346c21: drill-recorded and its 18-case suite green; all three doors-unchanged measurements recorded; fresh full suite 31/31; shellcheck 64 scripts; actionlint 9 workflows; strict changelog guards and all real-tree self-guards green; worktree and git diff --check clean.

Round log

Round at 809b7e90

Round passed with no written reply.

Refs #231 ## Acceptance criteria - [ ] `0.6.2` tag exists here; release published; guards green. *(operator-owned after merge)* - [ ] Main re-armed to `0.6.3-dev` after the release. *(operator-owned after merge)* - [x] `docs/UPSTREAM-SYNC.md` names content baseline `upstream-0.6.3` and unchanged ancestry baseline `8c3a4d1`; `.upstream-ref` remains byte-identical; the changelog provenance header records the port. - [x] The 0.6.2 section is exactly fragment-assembled in canonical order, carries #246 verbatim, and release guards are green. - [x] `drills/0.6.2.md` records the candidate-head doors-unchanged measurements and `drill-recorded` is green. - [x] !250 carries the hand-set `release` label and uses `Refs #231`. - [ ] The crew pin-bump follow-up issue is minted and linked. *(triage-owned after release)* ## Worklog - [x] Claim #231 and record the design on the issue before creating the branch. - [x] Cut a fresh worktree from `origin/main`; verify all 31 baseline test files pass. - [x] Stamp `VERSION` and the three `CEREMONY_SELF_REF` pins at `0.6.2`; run version/self-ref guards; push checkpoint. - [x] Assemble the 0.6.2 changelog section with `bin/changelog-assemble`, consuming the six landed fragments. - [x] Update upstream sync and provenance records while preserving `.upstream-ref` byte-for-byte. - [x] Run release guards, full suite, sanctioned chunked shellcheck, and diff hygiene. - [x] Prepare the initial complete draft head for the required signal→ready handoff with no intervening commit. - [x] Reproduce the amended-contract failure: `drill-recorded` refuses the missing `drills/0.6.2.md`. - [x] Measure all three doors-unchanged conditions at the candidate tree against rehearsed tag `0.6.1`. - [x] Add the measured `drills/0.6.2.md` record and turn the targeted guard green. - [x] Run the full required verification on the repaired release tree. - [x] Push the complete fix at `809b7e907a8fb05136b268ed22ed9c92b1346c21` and finish with exact-head signal→ready, with no intervening commit. ## Test record - Baseline at `7bdae45`: `bash test/run.sh` — 31/31 test files passed. - Stamp checkpoint `05f182f`: `test/version.test.sh` 22/22; `test/self-ref.test.sh` 12/12. - Assembly checkpoint `aa818d5`: changelog assembler 48/48, replay 37/37, armed 50/50. - Provenance checkpoint `fdb7d75`: upstream delta 28/28, replay 37/37, monotonic 20/20; `.upstream-ref` byte-identical to `origin/main`. - Final at `fdb7d7577b4b30c11f2db9b47f278e2a16783c8c`: runner-required full suite 31/31; shellcheck 64 scripts; actionlint 9 workflows; self-ref, marker, vendored, and changelog-armed guards green; `git diff --check` clean. - Internal read-only review of `7bdae45..fdb7d75`: no critical or important findings; canonical 1,973-byte section replay matched exactly. - Round fix at `809b7e907a8fb05136b268ed22ed9c92b1346c21`: `drill-recorded` and its 18-case suite green; all three doors-unchanged measurements recorded; fresh full suite 31/31; shellcheck 64 scripts; actionlint 9 workflows; strict changelog guards and all real-tree self-guards green; worktree and `git diff --check` clean. ## Round log <!-- round:809b7e907a8fb05136b268ed22ed9c92b1346c21 --> **Round at 809b7e90** _Round passed with no written reply._
codex-bot-andresmgsl added 1 commit 2026-08-24 13:22:29 +00:00
release: stamp forge 0.6.2 refs and version
Some checks failed
CI / test (pull_request) Successful in 3m43s
CI / release-exercise (pull_request) Successful in 23s
CI / self-guards (pull_request) Failing after 19s
CI / action-exercise (pull_request) Successful in 19s
CI / docs-sync-exercise (pull_request) Successful in 19s
labels / labels (pull_request) Successful in 21s
Refs guard / refs-not-closing (pull_request) Successful in 19s
05f182fe29
codex-bot-andresmgsl changed title from release: forge 0.6.2 to WIP: release: forge 0.6.2 2026-08-24 13:22:37 +00:00
codex-bot-andresmgsl added 1 commit 2026-08-24 13:22:58 +00:00
release: assemble 0.6.2 changelog
Some checks failed
CI / test (pull_request) Successful in 3m41s
CI / release-exercise (pull_request) Successful in 23s
CI / self-guards (pull_request) Failing after 21s
CI / action-exercise (pull_request) Successful in 19s
CI / docs-sync-exercise (pull_request) Successful in 19s
labels / labels (pull_request) Successful in 21s
Refs guard / refs-not-closing (pull_request) Successful in 19s
aa818d5a93
codex-bot-andresmgsl added 1 commit 2026-08-24 13:24:06 +00:00
docs: record 0.6.2 upstream port provenance
Some checks failed
CI / test (pull_request) Successful in 3m41s
CI / release-exercise (pull_request) Successful in 24s
CI / self-guards (pull_request) Failing after 20s
CI / action-exercise (pull_request) Successful in 19s
CI / docs-sync-exercise (pull_request) Successful in 19s
labels / labels (pull_request) Successful in 21s
Refs guard / refs-not-closing (pull_request) Successful in 19s
fdb7d7577b
forgejo-actions added the
state:building
label 2026-08-24 13:25:14 +00:00
codex-bot-andresmgsl added the
release
label 2026-08-24 13:29:36 +00:00
Author
Member

📣 round answered at head fdb7d7577b

📣 round answered at head fdb7d7577b4b30c11f2db9b47f278e2a16783c8c
codex-bot-andresmgsl changed title from WIP: release: forge 0.6.2 to release: forge 0.6.2 2026-08-24 13:29:54 +00:00
forgejo-actions added the
scope:docs
scope:labels
scope:release-flow
labels 2026-08-24 13:39:39 +00:00
forgejo-actions added
blocker:ci-red
state:addressing
and removed
state:building
labels 2026-08-24 14:17:46 +00:00
codex-bot-andresmgsl changed title from release: forge 0.6.2 to WIP: release: forge 0.6.2 2026-08-24 14:28:13 +00:00
Author
Member

🔧 addressing round on head fdb7d7577b

Round analysis (there are no reviewer verdicts yet; this pickup answers the amended issue contract and the red current-head check):

  • Blocking — missing drills/0.6.2.md: agree. I will reproduce drill-recorded, measure the release path at this candidate head, and add the doors-unchanged record only if all three conditions in drills/README.md hold.
  • Blocking — CI / self-guards is red: agree. The head is incomplete and will not be signalled; after the record is added I will run the targeted guard and the full required verification before pushing.
  • Non-blocking — PR contract omitted the new drill criterion: agree. I will add that acceptance criterion and round-fix steps to the PR body ## Worklog, checking them only as evidence lands.
  • Non-blocking — release label plus Refs #231: agree, already satisfied. I verified !250 carries release and its body starts with Refs #231; I will preserve both.
  • Non-blocking — post-merge ownership: agree, already represented. Tag/publish, 0.6.3-dev re-arm, and the crew follow-up remain unchecked and explicitly operator/triage-owned.

No point needs a ruling. I am returning !250 to draft before changing the head; the final act will be the exact-head round signal, followed by ready with no intervening commit.

🔧 addressing round on head fdb7d7577b4b30c11f2db9b47f278e2a16783c8c Round analysis (there are no reviewer verdicts yet; this pickup answers the amended issue contract and the red current-head check): - **Blocking — missing `drills/0.6.2.md`: agree.** I will reproduce `drill-recorded`, measure the release path at this candidate head, and add the doors-unchanged record only if all three conditions in `drills/README.md` hold. - **Blocking — `CI / self-guards` is red: agree.** The head is incomplete and will not be signalled; after the record is added I will run the targeted guard and the full required verification before pushing. - **Non-blocking — PR contract omitted the new drill criterion: agree.** I will add that acceptance criterion and round-fix steps to the PR body `## Worklog`, checking them only as evidence lands. - **Non-blocking — release label plus `Refs #231`: agree, already satisfied.** I verified !250 carries `release` and its body starts with `Refs #231`; I will preserve both. - **Non-blocking — post-merge ownership: agree, already represented.** Tag/publish, `0.6.3-dev` re-arm, and the crew follow-up remain unchecked and explicitly operator/triage-owned. No point needs a ruling. I am returning !250 to draft before changing the head; the final act will be the exact-head round signal, followed by ready with no intervening commit.
codex-bot-andresmgsl added 1 commit 2026-08-24 14:32:41 +00:00
docs: record 0.6.2 doors unchanged
All checks were successful
CI / test (pull_request) Successful in 3m42s
CI / release-exercise (pull_request) Successful in 23s
CI / self-guards (pull_request) Successful in 20s
CI / action-exercise (pull_request) Successful in 19s
CI / docs-sync-exercise (pull_request) Successful in 19s
labels / labels (pull_request) Successful in 21s
Refs guard / refs-not-closing (pull_request) Successful in 19s
809b7e907a
Author
Member

Round answered whole at head 809b7e907a8fb05136b268ed22ed9c92b1346c21.

  • Missing drill record — addressed. Added drills/0.6.2.md as a doors-unchanged record measured at the candidate tree. It records the pin-only 0.6.1..HEAD release-path delta, the exact path emitted by release-path.sh, and the full-rehearsal/published-release/re-armed-main evidence from 0.6.1.
  • Red self-guard — addressed. drill-recorded now passes on the real release tree, and its 18-case contract suite passes.
  • PR contract gap — addressed. The amended drill criterion and fix-round worklog are in the PR body and checked against evidence.
  • Release interlocks — preserved. !250 still carries release and begins with Refs #231; the three post-merge criteria remain unchecked and operator/triage-owned.
  • Verification — complete. Fresh at this head: bash test/run.sh 31/31 files; shellcheck 64 scripts; actionlint 9 workflows; self-ref, marker, vendored, strict changelog armed/monotonic/assembled, drill-recorded, runner-isolated, and git diff --check all green. The worktree is clean and the remote branch equals this head.

The current-head forge checks are pending, with no current-head failure. Per #330 the engine owns waiting for them to settle and requesting the panel; no manual review request is made.

Round answered whole at head `809b7e907a8fb05136b268ed22ed9c92b1346c21`. - **Missing drill record — addressed.** Added `drills/0.6.2.md` as a doors-unchanged record measured at the candidate tree. It records the pin-only `0.6.1..HEAD` release-path delta, the exact path emitted by `release-path.sh`, and the full-rehearsal/published-release/re-armed-main evidence from `0.6.1`. - **Red self-guard — addressed.** `drill-recorded` now passes on the real release tree, and its 18-case contract suite passes. - **PR contract gap — addressed.** The amended drill criterion and fix-round worklog are in the PR body and checked against evidence. - **Release interlocks — preserved.** !250 still carries `release` and begins with `Refs #231`; the three post-merge criteria remain unchecked and operator/triage-owned. - **Verification — complete.** Fresh at this head: `bash test/run.sh` 31/31 files; shellcheck 64 scripts; actionlint 9 workflows; self-ref, marker, vendored, strict changelog armed/monotonic/assembled, drill-recorded, runner-isolated, and `git diff --check` all green. The worktree is clean and the remote branch equals this head. The current-head forge checks are pending, with no current-head failure. Per #330 the engine owns waiting for them to settle and requesting the panel; no manual review request is made.
Author
Member

📣 round answered at head 809b7e907a

📣 round answered at head 809b7e907a8fb05136b268ed22ed9c92b1346c21
codex-bot-andresmgsl changed title from WIP: release: forge 0.6.2 to release: forge 0.6.2 2026-08-24 14:35:34 +00:00
forgejo-actions removed the
blocker:ci-red
label 2026-08-24 14:41:15 +00:00
codex-bot-andresmgsl requested review from glm-bot-andresmgsl 2026-08-24 15:21:05 +00:00
codex-bot-andresmgsl requested review from claude-bot-andresmgsl 2026-08-24 15:21:06 +00:00
codex-bot-andresmgsl requested review from kimi-bot-andresmgsl 2026-08-24 15:21:06 +00:00
codex-bot-andresmgsl added the
state:bots-reviewing
label 2026-08-24 15:21:07 +00:00
forgejo-actions removed the
state:addressing
label 2026-08-24 15:23:44 +00:00

🔎 reviewing head 809b7e907a

Verified in a detached worktree at this head (yq is absent in this box; the two test files that need it are the only gaps, and they fail identically at base 7bdae45):

  • Three stamps: VERSION 0.6.2, CEREMONY_SELF_REF 0.6.2 in release.yml, labels.yml, labels-sweep.yml; self-ref-check.sh green — settled.
  • Changelog exactly assembled: changelog-assembled on the real tree reports the 0.6.2 section byte-for-byte equal to the six fragments at merge base 7bdae45; all six consumed, README.md/shape kept — settled.
  • UPSTREAM-SYNC + provenance: both baselines named separately, .upstream-ref byte-identical, header carries the port clause — settled.
  • Drill record: conditions 1–3 re-measured here — release-path diff 0.6.1..HEAD is only the pin line, path equals release-path.sh output, 0.6.1 is a full rehearsal, published 2026-08-09T19:46:56Z, origin/main:VERSION 0.6.2-dev; drill-recorded green — settled.
  • release label + Refs #231 with no closing keyword anywhere in the body — settled.
  • Suite 29/31 files pass here (the 2 are the yq gap); shellcheck clean; changelog-armed, changelog-monotonic, runner-isolated, marker-check, vendored-check green; all 7 forge checks green on this head.
🔎 reviewing head 809b7e907a8fb05136b268ed22ed9c92b1346c21 Verified in a detached worktree at this head (`yq` is absent in this box; the two test files that need it are the only gaps, and they fail identically at base `7bdae45`): - Three stamps: `VERSION` `0.6.2`, `CEREMONY_SELF_REF` `0.6.2` in `release.yml`, `labels.yml`, `labels-sweep.yml`; `self-ref-check.sh` green — **settled**. - Changelog exactly assembled: `changelog-assembled` on the real tree reports the 0.6.2 section byte-for-byte equal to the six fragments at merge base `7bdae45`; all six consumed, `README.md`/`shape` kept — **settled**. - UPSTREAM-SYNC + provenance: both baselines named separately, `.upstream-ref` byte-identical, header carries the port clause — **settled**. - Drill record: conditions 1–3 re-measured here — release-path diff `0.6.1..HEAD` is only the pin line, path equals `release-path.sh` output, `0.6.1` is a full rehearsal, published `2026-08-09T19:46:56Z`, `origin/main:VERSION` `0.6.2-dev`; `drill-recorded` green — **settled**. - `release` label + `Refs #231` with no closing keyword anywhere in the body — **settled**. - Suite 29/31 files pass here (the 2 are the `yq` gap); shellcheck clean; `changelog-armed`, `changelog-monotonic`, `runner-isolated`, `marker-check`, `vendored-check` green; all 7 forge checks green on this head.

$🔎 reviewing head 809b7e907a8fb05136b268ed22ed9c92b1346c21\n\n- Ran bash test/run.sh at the head: 31/31 test files green.\n- Ran all five self-guards locally (armed, monotonic, assembled, drill-recorded, runner-isolated): green; assembled proves the 0.6.2 section byte-for-byte equals the assembly of the 6 fragments consumed at merge base 7bdae45.\n- Re-measured doors-unchanged at the final head: release-path diff vs 0.6.1 is pin-only (release.yml CEREMONY_SELF_REF); release-path.sh output matches the record verbatim; 0.6.1 release published per the API; .upstream-ref byte-identical to base.\n- release label present; body opens Refs #231; no closing keyword precedes #231 anywhere; fragments 217/229/230/235/236/246 deleted, nothing else touched.\n- All 7 CI checks green at the head (test, release-exercise, self-guards, action-exercise, docs-sync-exercise, labels, refs-not-closing).\n- Could not run: actionlint (absent locally) — relying on the green CI job; post-merge criteria (tag/publish, re-arm, crew follow-up) not verifiable now by design.\n- Composing verdict: approve.

$🔎 reviewing head 809b7e907a8fb05136b268ed22ed9c92b1346c21\n\n- Ran `bash test/run.sh` at the head: 31/31 test files green.\n- Ran all five self-guards locally (armed, monotonic, assembled, drill-recorded, runner-isolated): green; assembled proves the 0.6.2 section byte-for-byte equals the assembly of the 6 fragments consumed at merge base 7bdae45.\n- Re-measured doors-unchanged at the final head: release-path diff vs 0.6.1 is pin-only (release.yml CEREMONY_SELF_REF); release-path.sh output matches the record verbatim; 0.6.1 release published per the API; .upstream-ref byte-identical to base.\n- `release` label present; body opens `Refs #231`; no closing keyword precedes #231 anywhere; fragments 217/229/230/235/236/246 deleted, nothing else touched.\n- All 7 CI checks green at the head (test, release-exercise, self-guards, action-exercise, docs-sync-exercise, labels, refs-not-closing).\n- Could not run: actionlint (absent locally) — relying on the green CI job; post-merge criteria (tag/publish, re-arm, crew follow-up) not verifiable now by design.\n- Composing verdict: approve.

🔎 reviewing head 809b7e907a

  • Acceptance criteria read from #231; pre-merge items identified.
  • changelog-assembled: green — section 0.6.2 is byte-for-byte the assembly of 6 fragments at merge base 7bdae45.
  • drill-recorded: green — drills/0.6.2.md is present and non-blank.
  • self-ref / marker / vendored / shellcheck-all: green.
  • test/run.sh: 27/31 test files pass; the 4 failures are package-json cases that require node/npm, which is absent in this box.
  • release-path doors-unchanged verified: diff 0.6.1..HEAD over the release path changes only the CEREMONY_SELF_REF pin in release.yml; 0.6.1 is published; origin/main reads 0.6.2-dev.
  • actionlint not run (binary absent).
  • Verdict pending.
🔎 reviewing head 809b7e907a8fb05136b268ed22ed9c92b1346c21 - Acceptance criteria read from #231; pre-merge items identified. - changelog-assembled: green — section 0.6.2 is byte-for-byte the assembly of 6 fragments at merge base 7bdae45. - drill-recorded: green — drills/0.6.2.md is present and non-blank. - self-ref / marker / vendored / shellcheck-all: green. - test/run.sh: 27/31 test files pass; the 4 failures are package-json cases that require node/npm, which is absent in this box. - release-path doors-unchanged verified: diff 0.6.1..HEAD over the release path changes only the CEREMONY_SELF_REF pin in release.yml; 0.6.1 is published; origin/main reads 0.6.2-dev. - actionlint not run (binary absent). - Verdict pending.
glm-bot-andresmgsl approved these changes 2026-08-24 15:30:47 +00:00
glm-bot-andresmgsl left a comment
Member

Verdict: approve — release 0.6.2 at 809b7e9 meets every now-reviewable criterion of #231

Reviewed the whole PR at head 809b7e907a8fb05136b268ed22ed9c92b1346c21 in a detached throwaway worktree against issue #231's acceptance criteria, the repo's load-bearing constraints, and the code.

What I verified by running (not by reading)

  • Full suite: bash test/run.sh31/31 test files green at the head.
  • All five self-guards run locally against the real tree, green: changelog-armed (0.6.2 agrees with fragment mode), changelog-monotonic (all 8 merge-base headings preserved), changelog-assembled — the 0.6.2 section is byte-for-byte the assembly of the 6 fragments consumed at merge base 7bdae45 (criterion 4: no hand-typed sentence survives this guard; #246's entries verbatim in canonical order is subsumed by the byte-exact comparison), drill-recorded (record present at drills/0.6.2.md), runner-isolated.
  • Doors-unchanged re-measured at the final head, not trusted from the record: git diff 0.6.1..HEAD -- $(sh .github/scripts/release-path.sh) is exactly the CEREMONY_SELF_REF pin change in release.yml and nothing else; the enumerated path in the drill record is verbatim the output of release-path.sh; the 0.6.1 release is published per the releases API (2026-08-09T19:46:56Z, not draft, not prerelease); base main reads 0.6.2-dev. All three conditions of the doors-unchanged shape hold — spec item 6 / criterion 5 earned.
  • .upstream-ref byte-identical to the base (empty diff; still full SHA 8c3a4d1…5214) and test/upstream-delta.test.sh green in the suite — spec item 3's ancestry half.
  • UPSTREAM-SYNC + provenance header (criterion 3): both baselines named separately (upstream-0.6.3 content / 8c3a4d1 ancestry), date, tag disambiguation (upstream-0.6.x vs bare 0.6.x), next-campaign note including who advances .upstream-ref; CHANGELOG provenance keeps "carries upstream through 8c3a4d1" and adds the port clause for 0.6.1–0.6.3 — spec 3b satisfied.
  • Interlocks (criterion 6): the PR carries the hand-set release label; the body opens with Refs #231; I scanned every #231 mention in the body — no closing keyword precedes it anywhere.
  • Diff hygiene: exactly the six fragments the issue names (217, 229, 230, 235, 236, 246) deleted by the assembly, the three pins + VERSION stamped at 0.6.2, and nothing else touched — matches the issue's carrier list exactly.
  • CI: all 7 checks on this head green via the status rollup (test, release-exercise, self-guards, action-exercise, docs-sync-exercise, labels, refs-not-closing).

What I could not verify and what I relied on instead

  • actionlint is not installed on this box; the PR's only workflow changes are three one-line env: pin bumps, and I relied on the green CI / test job at this head for the lint gate.
  • Post-merge criteria (tag exists + release published; main re-armed to 0.6.3-dev; crew pin-bump follow-up issue) are operator/triage-owned after merge per the issue and are correctly left unticked — nothing owed by this PR now.

Non-blocking notes

  • The drill record took its release-path measurement at fdb7d75 (the commit before the record itself) and discloses that in its own text; since drills/ is outside the release path and my own re-measurement at the final head agrees, that is accurate evidence, not a gap.
  • The prior round's two blocking items (missing drill record; red self-guard) are exactly what this head fixed; both re-verified green here.

Approving this head. The remaining criteria land with the merge (operator) and the close (triage), as the issue directs.

## Verdict: approve — release 0.6.2 at `809b7e9` meets every now-reviewable criterion of #231 Reviewed the whole PR at head `809b7e907a8fb05136b268ed22ed9c92b1346c21` in a detached throwaway worktree against issue #231's acceptance criteria, the repo's load-bearing constraints, and the code. ### What I verified by running (not by reading) - **Full suite**: `bash test/run.sh` — **31/31 test files green** at the head. - **All five self-guards run locally against the real tree, green**: `changelog-armed` (0.6.2 agrees with fragment mode), `changelog-monotonic` (all 8 merge-base headings preserved), **`changelog-assembled` — the 0.6.2 section is byte-for-byte the assembly of the 6 fragments consumed at merge base `7bdae45`** (criterion 4: no hand-typed sentence survives this guard; #246's entries verbatim in canonical order is subsumed by the byte-exact comparison), `drill-recorded` (record present at `drills/0.6.2.md`), `runner-isolated`. - **Doors-unchanged re-measured at the final head, not trusted from the record**: `git diff 0.6.1..HEAD -- $(sh .github/scripts/release-path.sh)` is exactly the `CEREMONY_SELF_REF` pin change in `release.yml` and nothing else; the enumerated path in the drill record is verbatim the output of `release-path.sh`; the `0.6.1` release is published per the releases API (2026-08-09T19:46:56Z, not draft, not prerelease); base `main` reads `0.6.2-dev`. All three conditions of the doors-unchanged shape hold — spec item 6 / criterion 5 earned. - **`.upstream-ref` byte-identical to the base** (empty diff; still full SHA `8c3a4d1…5214`) and `test/upstream-delta.test.sh` green in the suite — spec item 3's ancestry half. - **UPSTREAM-SYNC + provenance header** (criterion 3): both baselines named separately (`upstream-0.6.3` content / `8c3a4d1` ancestry), date, tag disambiguation (`upstream-0.6.x` vs bare `0.6.x`), next-campaign note including who advances `.upstream-ref`; CHANGELOG provenance keeps "carries upstream through `8c3a4d1`" and adds the port clause for 0.6.1–0.6.3 — spec 3b satisfied. - **Interlocks** (criterion 6): the PR carries the hand-set `release` label; the body opens with `Refs #231`; I scanned every `#231` mention in the body — no closing keyword precedes it anywhere. - **Diff hygiene**: exactly the six fragments the issue names (`217, 229, 230, 235, 236, 246`) deleted by the assembly, the three pins + `VERSION` stamped at `0.6.2`, and nothing else touched — matches the issue's carrier list exactly. - **CI**: all 7 checks on this head green via the status rollup (test, release-exercise, self-guards, action-exercise, docs-sync-exercise, labels, refs-not-closing). ### What I could not verify and what I relied on instead - **actionlint is not installed on this box**; the PR's only workflow changes are three one-line `env:` pin bumps, and I relied on the green `CI / test` job at this head for the lint gate. - **Post-merge criteria (tag exists + release published; main re-armed to `0.6.3-dev`; crew pin-bump follow-up issue)** are operator/triage-owned after merge per the issue and are correctly left unticked — nothing owed by this PR now. ### Non-blocking notes - The drill record took its release-path measurement at `fdb7d75` (the commit before the record itself) and discloses that in its own text; since `drills/` is outside the release path and my own re-measurement at the final head agrees, that is accurate evidence, not a gap. - The prior round's two blocking items (missing drill record; red self-guard) are exactly what this head fixed; both re-verified green here. Approving this head. The remaining criteria land with the merge (operator) and the close (triage), as the issue directs.
claude-bot-andresmgsl approved these changes 2026-08-24 15:33:03 +00:00
claude-bot-andresmgsl left a comment
Member

Approve — head 809b7e907a8fb05136b268ed22ed9c92b1346c21, reviewed whole in a detached worktree at that head against #231's amended contract.

What I ran, and what it said

Real-tree guards (the same scripts CI / self-guards runs, invoked directly with the action defaults):

  • changelog-armedversion '0.6.2' agrees with fragment mode (changelog.d)
  • changelog-monotonic (base origin/main, strict) → all 8 headings at the merge base still present
  • changelog-assembled (base origin/main, strict) → "section '0.6.2' in CHANGELOG.md is byte-for-byte the assembly of the 6 fragment(s) consumed at the merge base (7bdae45)"
  • drill-recordedversion '0.6.2' has a drill record at drills/0.6.2.md
  • runner-isolated → 9 workflows, no pull_request work on a self-hosted runner
  • self-ref-check.sh, marker-check.sh, vendored-check.sh → green; .github/scripts/shellcheck-all.sh → clean; git diff --check 7bdae45..HEAD → clean.

bash test/run.sh29 of 31 test files pass. The two that fail — test/labels-bootstrap.test.sh (7/7 failing cases) and test/labels-dispatch.test.sh (14 failing cases) — fail on yq: command not found, which this box does not have. I re-ran both at the base commit 7bdae45 in a second worktree: identical counts (7 passed/7 failed and 7 passed/14 failed). So this is my environment, not a regression from this PR, and CI covers it — CI / test sets CEREMONY_REQUIRE_YQ=1, and all seven checks on this head are green (CI / test, self-guards, release-exercise, action-exercise, docs-sync-exercise, labels / labels, Refs guard / refs-not-closing).

Criteria

  • Three stamps (spec 1). VERSION 0.6.2-dev0.6.2; CEREMONY_SELF_REF 0.6.10.6.2 in release.yml, labels.yml, labels-sweep.yml. No other 0.6.1 pin is left in the tree — the consumer stubs in docs/CONSUMERS.md carry <pinned-tag> placeholders, not a version.
  • Changelog assembled, nothing typed (spec 2 / criterion 4). The assembler's replay is byte-exact against the six fragments reachable from the merge base, and all six (217, 229, 230, 235, 236, 246) are deleted in the same diff while changelog.d/README.md and changelog.d/shape survive. #246's six entries are present verbatim, in the assembler's group order, with the section extractable: changelog_section CHANGELOG.md 0.6.2 returns the notes body and changelog_section_problem is silent.
  • UPSTREAM-SYNC + provenance (spec 3, 3b / criterion 3). The new ## 0.6.2 port record names the content baseline upstream-0.6.3 and the ancestry baseline 8c3a4d1…5214 separately, says plainly that nothing advanced, carries the tag-disambiguation convention and the 0.7.0–0.7.4 deferral including who would advance .upstream-ref next. git diff 7bdae45..HEAD -- .upstream-ref is empty, and git cat-file -t 8c3a4d1… resolves locally, so upstream-delta has its evidence. The provenance header keeps "carries upstream through 8c3a4d1" and adds the port clause in the same paragraph.
  • Drill record (spec 6 / criterion 5). I re-measured all three doors-unchanged conditions at this head rather than trusting the record: (1) git diff 0.6.1..HEAD -- $(sh .github/scripts/release-path.sh) is exactly the one CEREMONY_SELF_REF hunk in release.yml and nothing else; (2) the seven paths the record quotes are exactly release-path.sh's output, lib/forge.sh included; (3) drills/0.6.1.md is a full six-probe rehearsal, the Forgejo releases API returns 0.6.1 published 2026-08-09T19:46:56Z with draft=false/prerelease=false, and origin/main:VERSION reads 0.6.2-dev. 0.6.1 is the last rehearsed tag, not merely the previous one, and the tag resolves to 338cf5f7 both locally and on the remote. The record's own caveat — measured at fdb7d75, with this record the only later change and drills/ outside the release path — checks out: 809b7e9 adds drills/0.6.2.md and nothing else. Doors unchanged is the right shape here; I do not rule a full rehearsal owed.
  • How the PR is opened (spec 7 / criterion 6). release is on the PR, hand-set; the body opens with Refs #231, and a scan of the whole body for a closing keyword within 40 characters before any #N (the #209/#212/#199 shape) finds none — the only #-references are #231, #246, #231, #231. Refs guard / refs-not-closing agrees on this head.
  • The three post-merge criteria (tag/publish, 0.6.3-dev re-arm, crew pin-bump issue) are correctly left unticked and labelled operator/triage-owned in the PR body — that is the shape #231 spec item 7 requires, not an omission.

Not verified, and what I relied on instead

  • The release doors themselves — tag create, publish, -dev re-arm — cannot be run from a review checkout. I relied on the doors-unchanged measurement above plus 0.6.1's live rehearsal and published release, which is exactly what the shape is for.
  • yq-backed cases in labels-bootstrap and labels-dispatch: relied on CI / test green on this head (both are untouched by this diff beyond labels.yml/labels-sweep.yml's pin line, and both fail identically at base here).
  • actionlint is absent in this box; I read the three workflow diffs by hand (one pin line each, no structural change) and relied on CI's actionlint step.

Non-blocking nits (yours to take or leave)

  • drills/README.md's "Doors unchanged" condition 2 still enumerates the release path inline without lib/forge.sh, which .github/scripts/release-path.sh has emitted since #198 and which this record correctly quotes. The prose is the stale copy, not your record, and test/release-path.test.sh does not hold that README list to the script — so it is not this PR's carrier. Worth a discussion so the next release author copy-pastes from an agreeing source.
  • The #246 fragment's entries are blank-line-separated inside ### Changed while the #230/#229/#217 entries are not, so the rendered section has two rhythms. That is a property of the fragment already on main; the assembler is byte-exact and this PR may not touch it.
**Approve** — head `809b7e907a8fb05136b268ed22ed9c92b1346c21`, reviewed whole in a detached worktree at that head against #231's amended contract. ## What I ran, and what it said Real-tree guards (the same scripts `CI / self-guards` runs, invoked directly with the action defaults): - `changelog-armed` → `version '0.6.2' agrees with fragment mode (changelog.d)` - `changelog-monotonic` (base `origin/main`, strict) → all 8 headings at the merge base still present - `changelog-assembled` (base `origin/main`, strict) → *"section '0.6.2' in CHANGELOG.md is byte-for-byte the assembly of the 6 fragment(s) consumed at the merge base (7bdae45)"* - `drill-recorded` → `version '0.6.2' has a drill record at drills/0.6.2.md` - `runner-isolated` → 9 workflows, no `pull_request` work on a self-hosted runner - `self-ref-check.sh`, `marker-check.sh`, `vendored-check.sh` → green; `.github/scripts/shellcheck-all.sh` → clean; `git diff --check 7bdae45..HEAD` → clean. `bash test/run.sh` → **29 of 31 test files pass**. The two that fail — `test/labels-bootstrap.test.sh` (7/7 failing cases) and `test/labels-dispatch.test.sh` (14 failing cases) — fail on `yq: command not found`, which this box does not have. I re-ran both at the base commit `7bdae45` in a second worktree: identical counts (7 passed/7 failed and 7 passed/14 failed). So this is my environment, not a regression from this PR, and CI covers it — `CI / test` sets `CEREMONY_REQUIRE_YQ=1`, and all seven checks on this head are green (`CI / test`, `self-guards`, `release-exercise`, `action-exercise`, `docs-sync-exercise`, `labels / labels`, `Refs guard / refs-not-closing`). ## Criteria - **Three stamps (spec 1).** `VERSION` `0.6.2-dev` → `0.6.2`; `CEREMONY_SELF_REF` `0.6.1` → `0.6.2` in `release.yml`, `labels.yml`, `labels-sweep.yml`. No other `0.6.1` pin is left in the tree — the consumer stubs in `docs/CONSUMERS.md` carry `<pinned-tag>` placeholders, not a version. ✅ - **Changelog assembled, nothing typed (spec 2 / criterion 4).** The assembler's replay is byte-exact against the six fragments reachable from the merge base, and all six (`217`, `229`, `230`, `235`, `236`, `246`) are deleted in the same diff while `changelog.d/README.md` and `changelog.d/shape` survive. #246's six entries are present verbatim, in the assembler's group order, with the section extractable: `changelog_section CHANGELOG.md 0.6.2` returns the notes body and `changelog_section_problem` is silent. ✅ - **UPSTREAM-SYNC + provenance (spec 3, 3b / criterion 3).** The new `## 0.6.2 port record` names the content baseline `upstream-0.6.3` and the ancestry baseline `8c3a4d1…5214` separately, says plainly that nothing advanced, carries the tag-disambiguation convention and the 0.7.0–0.7.4 deferral including who would advance `.upstream-ref` next. `git diff 7bdae45..HEAD -- .upstream-ref` is empty, and `git cat-file -t 8c3a4d1…` resolves locally, so `upstream-delta` has its evidence. The provenance header keeps *"carries upstream through `8c3a4d1`"* and adds the port clause in the same paragraph. ✅ - **Drill record (spec 6 / criterion 5).** I re-measured all three doors-unchanged conditions at this head rather than trusting the record: (1) `git diff 0.6.1..HEAD -- $(sh .github/scripts/release-path.sh)` is exactly the one `CEREMONY_SELF_REF` hunk in `release.yml` and nothing else; (2) the seven paths the record quotes are exactly `release-path.sh`'s output, `lib/forge.sh` included; (3) `drills/0.6.1.md` is a full six-probe rehearsal, the Forgejo releases API returns `0.6.1` published `2026-08-09T19:46:56Z` with `draft=false`/`prerelease=false`, and `origin/main:VERSION` reads `0.6.2-dev`. `0.6.1` is the last *rehearsed* tag, not merely the previous one, and the tag resolves to `338cf5f7` both locally and on the remote. The record's own caveat — measured at `fdb7d75`, with this record the only later change and `drills/` outside the release path — checks out: `809b7e9` adds `drills/0.6.2.md` and nothing else. **Doors unchanged is the right shape here; I do not rule a full rehearsal owed.** ✅ - **How the PR is opened (spec 7 / criterion 6).** `release` is on the PR, hand-set; the body opens with `Refs #231`, and a scan of the whole body for a closing keyword within 40 characters before any `#N` (the #209/#212/#199 shape) finds none — the only `#`-references are `#231`, `#246`, `#231`, `#231`. `Refs guard / refs-not-closing` agrees on this head. ✅ - **The three post-merge criteria** (tag/publish, `0.6.3-dev` re-arm, crew pin-bump issue) are correctly left unticked and labelled operator/triage-owned in the PR body — that is the shape #231 spec item 7 requires, not an omission. ✅ ## Not verified, and what I relied on instead - The release doors themselves — tag create, publish, `-dev` re-arm — cannot be run from a review checkout. I relied on the doors-unchanged measurement above plus `0.6.1`'s live rehearsal and published release, which is exactly what the shape is for. - `yq`-backed cases in `labels-bootstrap` and `labels-dispatch`: relied on `CI / test` green on this head (both are untouched by this diff beyond `labels.yml`/`labels-sweep.yml`'s pin line, and both fail identically at base here). - `actionlint` is absent in this box; I read the three workflow diffs by hand (one pin line each, no structural change) and relied on CI's actionlint step. ## Non-blocking nits (yours to take or leave) - `drills/README.md`'s "Doors unchanged" condition 2 still enumerates the release path inline without `lib/forge.sh`, which `.github/scripts/release-path.sh` has emitted since #198 and which this record correctly quotes. The prose is the stale copy, not your record, and `test/release-path.test.sh` does not hold that README list to the script — so it is not this PR's carrier. Worth a discussion so the next release author copy-pastes from an agreeing source. - The `#246` fragment's entries are blank-line-separated inside `### Changed` while the `#230`/`#229`/`#217` entries are not, so the rendered section has two rhythms. That is a property of the fragment already on `main`; the assembler is byte-exact and this PR may not touch it.
kimi-bot-andresmgsl approved these changes 2026-08-24 15:36:07 +00:00
kimi-bot-andresmgsl left a comment
Member

Reviewed at head 809b7e907a8fb05136b268ed22ed9c92b1346c21.

This PR satisfies the pre-merge acceptance criteria from #231:

  • Refs #231 is used (not Closes #231) and the hand-set release label is present.
  • VERSION is 0.6.2; the three CEREMONY_SELF_REF pins in .github/workflows/labels.yml, labels-sweep.yml, and release.yml are updated to 0.6.2.
  • CHANGELOG.md gained the 0.6.2 section. changelog-assembled is green and confirms the section is byte-for-byte the assembly of the six fragments at merge base 7bdae45, including #246 verbatim in canonical group order.
  • docs/UPSTREAM-SYNC.md records both baselines: content baseline upstream-0.6.3 and unchanged ancestry baseline 8c3a4d1dee2bdb5ac06a632a285bb65ab2615214. .upstream-ref is unchanged at that SHA, and the CHANGELOG.md provenance header carries the port clause.
  • drills/0.6.2.md is present and non-blank; drill-recorded is green. The doors-unchanged claim checks out: git diff 0.6.1..HEAD -- $(sh .github/scripts/release-path.sh) changes only the CEREMONY_SELF_REF pin in release.yml; the release path matches .github/scripts/release-path.sh; tag 0.6.1 is published; and origin/main:VERSION reads 0.6.2-dev.

Verification run:

  • bash .github/scripts/shellcheck-all.sh — green.
  • bash .github/scripts/self-ref-check.sh — green.
  • bash .github/scripts/marker-check.sh — green.
  • bash .github/scripts/vendored-check.sh — green.
  • bash actions/changelog-assembled/changelog-assembled.sh origin/main CHANGELOG.md changelog.d file — green.
  • bash actions/drill-recorded/drill-recorded.sh drills file — green.
  • bash test/run.sh — 27 of 31 test files pass. The 4 failures are package-json version-source cases that require node/npm, which is not installed in this box; I relied on CI for those paths. actionlint is also absent here, so .github/scripts/actionlint-all.sh was not run.

The post-merge criteria (tag/publish, re-arm to 0.6.3-dev, crew pin-bump follow-up issue) remain operator/triage-owned after merge, as #231 states.

Approve.

Reviewed at head `809b7e907a8fb05136b268ed22ed9c92b1346c21`. This PR satisfies the pre-merge acceptance criteria from #231: - `Refs #231` is used (not `Closes #231`) and the hand-set `release` label is present. - `VERSION` is `0.6.2`; the three `CEREMONY_SELF_REF` pins in `.github/workflows/labels.yml`, `labels-sweep.yml`, and `release.yml` are updated to `0.6.2`. - `CHANGELOG.md` gained the 0.6.2 section. `changelog-assembled` is green and confirms the section is byte-for-byte the assembly of the six fragments at merge base `7bdae45`, including #246 verbatim in canonical group order. - `docs/UPSTREAM-SYNC.md` records both baselines: content baseline `upstream-0.6.3` and unchanged ancestry baseline `8c3a4d1dee2bdb5ac06a632a285bb65ab2615214`. `.upstream-ref` is unchanged at that SHA, and the `CHANGELOG.md` provenance header carries the port clause. - `drills/0.6.2.md` is present and non-blank; `drill-recorded` is green. The doors-unchanged claim checks out: `git diff 0.6.1..HEAD -- $(sh .github/scripts/release-path.sh)` changes only the `CEREMONY_SELF_REF` pin in `release.yml`; the release path matches `.github/scripts/release-path.sh`; tag `0.6.1` is published; and `origin/main:VERSION` reads `0.6.2-dev`. Verification run: - `bash .github/scripts/shellcheck-all.sh` — green. - `bash .github/scripts/self-ref-check.sh` — green. - `bash .github/scripts/marker-check.sh` — green. - `bash .github/scripts/vendored-check.sh` — green. - `bash actions/changelog-assembled/changelog-assembled.sh origin/main CHANGELOG.md changelog.d file` — green. - `bash actions/drill-recorded/drill-recorded.sh drills file` — green. - `bash test/run.sh` — 27 of 31 test files pass. The 4 failures are package-json version-source cases that require `node`/`npm`, which is not installed in this box; I relied on CI for those paths. `actionlint` is also absent here, so `.github/scripts/actionlint-all.sh` was not run. The post-merge criteria (tag/publish, re-arm to `0.6.3-dev`, crew pin-bump follow-up issue) remain operator/triage-owned after merge, as #231 states. Approve.
codex-bot-andresmgsl requested review from andres 2026-08-24 15:36:23 +00:00
codex-bot-andresmgsl added the
state:needs-human
label 2026-08-24 15:36:23 +00:00

🧭 Triage — the round's non-blocking drills/README.md note is routed, not dropped: #251.

  • What it is. drills/README.md's doors-unchanged condition 2 states the release path is exactly .github/scripts/release-path.sh's output and then prints its own copy of it. Verified at 7bdae45: the README's copy names six paths, the script prints seven, and the seventh — lib/forge.sh — is this forge's, added in #198's own merge resolution (e035130) beside the upstream prose that was written against the six-path script. test/release-path.test.sh holds the script's list against the workflow's transitive dependencies and never opens the README, so condition 2's closing sentence tells a reader the inline list is machine-checked when it is the one list that is not.
  • !250 owes nothing for it, and no shipped measurement is wrong. drills/README.md is not a carrier this PR may touch. Both live records — drills/0.6.1.md and this candidate's drills/0.6.2.md — quote the script's seven-path output, and all three reviewers re-measured against the script rather than the prose.
  • #251 is blocked and names #231 as its dependency, because a seventh changelog.d/ fragment landing on main while this PR is open moves its merge base and turns changelog-assembled red against a section assembled from six. That hazard clears at this PR's merge, not at #231's close; triage re-reads the declaration and unblocks by hand at the merge.

Nothing here changes this round: the panel state is unchanged and no builder move is owed on !250.

🧭 Triage — the round's non-blocking `drills/README.md` note is routed, not dropped: **#251**. - **What it is.** `drills/README.md`'s doors-unchanged condition 2 states the release path is exactly `.github/scripts/release-path.sh`'s output and then prints its own copy of it. Verified at `7bdae45`: the README's copy names six paths, the script prints seven, and the seventh — `lib/forge.sh` — is this forge's, added in #198's own merge resolution (`e035130`) beside the upstream prose that was written against the six-path script. `test/release-path.test.sh` holds the *script's* list against the workflow's transitive dependencies and never opens the README, so condition 2's closing sentence tells a reader the inline list is machine-checked when it is the one list that is not. - **!250 owes nothing for it, and no shipped measurement is wrong.** `drills/README.md` is not a carrier this PR may touch. Both live records — `drills/0.6.1.md` and this candidate's `drills/0.6.2.md` — quote the script's seven-path output, and all three reviewers re-measured against the script rather than the prose. - **#251 is `blocked` and names #231 as its dependency**, because a seventh `changelog.d/` fragment landing on `main` while this PR is open moves its merge base and turns `changelog-assembled` red against a section assembled from six. That hazard clears at this PR's merge, not at #231's close; triage re-reads the declaration and unblocks by hand at the merge. Nothing here changes this round: the panel state is unchanged and no builder move is owed on !250.
forgejo-actions removed the
state:bots-reviewing
label 2026-08-24 15:53:18 +00:00
andres merged commit 5a8fce8375 into main 2026-08-24 15:55:13 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
4 participants
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#250
No description provided.