# 0.6.1 — drill record Run 2026-08-09 by `codex-reviewer-andresmgsl` against release PR !226, candidate branch `release-0.6.1`, canonical candidate SHA `ba3b17af88e0fe1ccae9eefd4b37bf2666f6cdad`. All six probes ran on this Forgejo instance. Each result below was read from its own run and from the repository state after that run. ## Scope ruling — a full rehearsal was owed The last rehearsed tag was `0.6.0`. The release path at this candidate is the exact output of `.github/scripts/release-path.sh`. Its measured diff from `0.6.0` is not pin-only: `.github/workflows/release.yml`, `lib/facts.sh`, and the new `lib/forge.sh` changed. These are release-door bytes, so the doors-unchanged record shape is refused and this release carries a full live rehearsal. ## Where Disposable **private** repository `heavy-duty/ceremony-drill-0.6.1`, created by the operator on 2026-08-09 after the fleet identity's personal repository could not see the organization runner. It carries the `docs/CONSUMERS.md` release caller with `version-source: file`, a fragment-mode fixture armed at `0.6.1-dev`, and a non-blank `drills/0.6.1.md`. The `release` label existed before the first probe PR. **Disposal as observed when this record was written:** the repository is private and **not yet archived**. This builder's archive PATCH returned 403 because it has push but not admin permission. The operator was asked to archive it; delete remains the operator's later step. No archive or delete is claimed, and cleanup gates neither review nor merge. ## Candidate-ref deviation The candidate tree pins `CEREMONY_SELF_REF` to `0.6.1`, a tag that did not exist before this release. No branch named `0.6.1` was created on `heavy-duty/ceremony`. The scratch caller instead uses `codex-reviewer-andresmgsl/ceremony/.github/workflows/release.yml@drill/0.6.1`. That ref is commit `f766752090429241c20a0d86aba6f679d713fc2c`; its parent is the canonical candidate SHA above, and its only change rewrites all three `CEREMONY_SELF_REF` carriers to that canonical SHA. The release path is therefore byte-identical to the candidate except for the required candidate pin rewrite. ## Probes | # | probe | run | result | |---|---|---|---| | 1 | merge-door ceremony | 5 | ✅ one `0.6.1` release; tag points to merge commit `438097fc75b1d294b448830a3a79c00b0ee7b83f`; main re-armed to `0.6.2-dev` | | 2 | release-labelled ordinary PR | 2 | ✅ green no-op; zero tags and zero releases | | 3 | bare-version PR without `release` | 3 | ✅ refused; zero tags and zero releases | | 4 | completed ceremony repeated | 7 | ✅ refused; release count stayed one and tag `0.6.1` stayed on the original merge commit | | 5 | manual matching tag | 8 | ✅ `0.6.2` published from its own changelog section; main was unchanged | | 6 | mismatched tag | 9 | ✅ refused before publication; no `9.9.9` release, and the operator-created probe tag was removed afterwards | ### Probe 1 — merge door PR #4 transitioned `VERSION` from `0.6.1-dev` to `0.6.1`, assembled both fixture fragments, and carried the `release` label. Run 5 succeeded. The published body is exactly the assembled `0.6.1` section, tag `0.6.1` points to PR #4's merge commit, and the workflow pushed `0.6.2-dev` to main at `1c74d76f035da4a13f7af0d2a43d611092061204`. ### Probe 2 — labelled ordinary work PR #1 carried the `release` label and added only `changelog.d/2.md`. `VERSION` stayed `0.6.1-dev`. Run 2 succeeded as a no-op; the tag and release lists were both empty afterwards. ### Probe 3 — bare version without declared intent PR #2 assembled the two fragments and transitioned to bare `0.6.1`, but had no `release` label. Run 3 failed. Both tag and release lists remained empty. Setup PR #3 then reverted that probe and restored the armed fixture; run 4 was green before the ceremony probe began. ### Probe 4 — completed ceremony repeated Forgejo exposes no run-rerun API, so this probe reproduced the completed door's input. Setup PR #5 restored `0.6.1-dev` and run 6 was green. Release- labelled PR #6 transitioned to bare `0.6.1` again. Run 7 failed at the already-existing tag guard. The release count stayed one and tag `0.6.1` still pointed to the original ceremony merge commit, not PR #6. ### Probe 5 — matching manual tag Side branch `probe5-tag` carried bare `VERSION 0.6.2` and a publishable `0.6.2` changelog section. Tag `0.6.2` was created at `a4ba62aa83fdd2e259ed3c3e906b13eaab1abcd0`. Run 8 succeeded and published only that section. Main stayed at the state left by probe 4; the tag door did not push a version change to it. ### Probe 6 — mismatched tag Tag `9.9.9` was created at the same `0.6.2` tree. Run 9 failed before publication. The release list remained exactly `0.6.1` and `0.6.2`. The operator-created `9.9.9` ref was then deleted; the remaining tag list was exactly `0.6.1` and `0.6.2`. ## Runs that are setup, not probes - Run 1: the initial `0.6.1-dev` fixture push; green no-op. - Run 4: PR #3 restored the armed fixture after probe 3; green. - Run 6: PR #5 restored `0.6.1-dev` to reproduce the completed ceremony input for probe 4; green. ## What this rehearsal establishes Both release doors ran against the 0.6.1 candidate's Forgejo implementation. The merge door published once, tagged the reviewed merge commit, and re-armed main. It stayed a green no-op for labelled ordinary work, refused a bare unlabelled transition, and refused a repeated ceremony. The tag door published a matching tag without changing main and refused a mismatched tag without publishing. Every refusal created no tag or release of its own.