diff --git a/drills/0.6.0.md b/drills/0.6.0.md index 1b4de41..2415dc2 100644 --- a/drills/0.6.0.md +++ b/drills/0.6.0.md @@ -81,13 +81,86 @@ One row per probe, written from its run. Runs are in | # | probe | run | result | |---|---|---|---| -| 1 | merge-door ceremony | — | — | +| 1 | merge-door ceremony | 30992108742 (attempt 1) | ✅ exactly one `0.6.0` release; tag equals the merge commit; main re-armed to `0.6.1-dev` | | 2 | mislabeled ordinary PR | 30991634654 | ✅ green NOTICE no-op; no tag, no release | -| 3 | bare-version PR without `release` | — | — | -| 4 | re-run completed ceremony | — | — | +| 3 | bare-version PR without `release` | 30991832001 | ✅ refused at decide; no tag, no release | +| 4 | re-run completed ceremony | 30992108742 (attempt 2) | ✅ refused at the nothing-exists assert; the release count stayed one | | 5 | manual matching tag | — | — | | 6 | mismatched tag | — | — | +### Probe 1 — the merge-door ceremony + +PR #4 (`probe1-ceremony`) bumped `0.6.0-dev` to bare `0.6.0` and stamped +`## 0.6.0 — 2026-08-05`, assembled from the three fixture fragments by the +candidate's own `bin/changelog-assemble` and committed with the deletions +in one commit. The `release` label was applied and confirmed before the +merge. Facts and verdict: + +```text + VER: 0.6.0 + BASE_VER: 0.6.0-dev + RELEASED: + LABELED: yes +ceremony=yes +``` + +Observed after the run: + +- **Exactly one** release: `GET /releases` returned `0.6.0` alone, not a + draft, not a pre-release, zero assets (no artifact hook in the fixture — + the hook step skipped). +- `GET /tags` returned `0.6.0` alone, pointing at + `64d02539f4a20286afc08b9997f0f8a7d1dbfccd`, which is PR #4's merge commit + — the tag names the tree that was reviewed. +- The release body was byte-for-byte the assembled section's bullets: + + ```text + - A second ordinary fragment, written by probe 2 of the 0.6.0 drill (#249). + - An ordinary behavior change, landing under the release label (#249). + - Fragment mode is exercised by the ceremony 0.6.0 drill (#249). + ``` + +- Main re-armed itself: commit `2d0e19a` ("bump main to 0.6.1-dev — a dev + install must not impersonate 0.6.0"), pushed by the job's own token. Main + reads `0.6.1-dev` and `changelog.d/` holds only `README.md`. +- **The anti-recursion property held.** Neither the tag create nor the bump + push started a workflow run — the run list after the ceremony ends at + 30992108742. That is what makes the merge door the release's only chance + to publish, and it is the reason probe 4 below is the door's own guard + rather than a second run's. + +### Probe 4 — a re-run of the completed ceremony + +Re-running 30992108742 as attempt 2 re-decided `ceremony=yes` — the facts +at that merge commit have not changed — and then died at the assert: + +```text +tag '0.6.0' already exists — this release already happened, or a manual tag won the race; refusing to re-release, creating nothing. +``` + +Tag, publish and bump all skipped. `GET /releases` still returned exactly +one `0.6.0`. The refusal is loud (the job is red) and creates nothing, which +is the required shape: the assert is what covers a manual tag racing the +merge, not only an operator's stray re-run. + +### Probe 3 — a bare-version PR without the `release` label + +PR #3 (`probe3-bare`) bumped `VERSION` to bare `0.6.0` and carried no label; +the label list was read as empty before merging. The merge run refused at +decide, row 5 of the table: + +```text + VER: 0.6.0 + BASE_VER: 0.6.0-dev + RELEASED: + LABELED: no +the version transitioned ('0.6.0-dev' -> '0.6.0') but no merged, release-labeled PR is behind this commit — a release is a labeled ceremony PR, not a bare push — creating nothing. +``` + +Notes, the assert, tag, hook, publish and bump all skipped; tags and +releases were both still empty afterwards. The merge was then undone and +main re-armed to `0.6.0-dev` before the ceremony probe ran (see Setup). + ### Probe 2 — a mislabeled ordinary PR PR #2 (`probe2b-mislabeled`) added one changelog fragment and touched no