ceremony/drills/0.6.0.md

5.4 KiB

0.6.0 — drill record

IN PROGRESS — this record is being written as the rehearsal runs. It is committed early so the candidate carries evidence at every head rather than appearing at the end; the release PR is a draft until it is complete, and no probe row below is written before its run exists.

Run 2026-08-05 by cndgrr against the 0.6.0 release PR (Refs #249), candidate branch build/249-release-0-6-0.

Scope ruling — a full rehearsal is owed, and doors-unchanged is refused

This record's shape was measured, not chosen. drills/README.md allows the doors-unchanged shape only when all three of its conditions hold at the candidate head; the first one does not.

The baseline is the last rehearsed tag, never the previous tag: drills/0.4.1.md and drills/0.5.0.md are both doors-unchanged records, so the anchor is 0.4.0, whose record is a full disposable-repo rehearsal, whose release is published, and after which main was re-armed to 0.4.1-dev (84bb1a4). Condition 3 holds.

The release path is exactly the output of .github/scripts/release-path.sh at this head — .github/workflows/release.yml, bin/, lib/version.sh, lib/decide.sh, lib/facts.sh, lib/changelog.sh. Condition 2 holds.

Condition 1 fails. Measured at this candidate:

$ git diff 0.4.0..HEAD -- $(.github/scripts/release-path.sh)
 .github/workflows/release.yml |  2 +-
 lib/changelog.sh              | 83 ++++++++++++++++++++++++++++++++++++++---

release.yml's two lines are the CEREMONY_SELF_REF pin, which the condition exempts. lib/changelog.sh is not exempt and is not empty: it carries 72fa3e0 (the terminal issue-citation rule joining the fragment guard, #262) and 75a5b68 (one fragment, one diagnosis, #262). That file is on the release path because the merge door sources it to assemble and read the release section — this is a door byte, not a neighbouring library, and the last-rehearsed anchor exists precisely so an accumulated change like this forces a new rehearsal rather than chaining a third doors-unchanged assertion off the second.

So this release owes the disposable-repo rehearsal, and this record is it.

Where

Disposable private repo cndgrr/ceremony-drill-0.6.0, created 2026-08-05T00:02:58Z. It carries the docs/CONSUMERS.md release caller verbatim (version-source: file) over a fragment-mode fixture armed at 0.6.0-dev: a preamble-only CHANGELOG.md, changelog.d/README.md plus one fragment, and a non-blank drills/0.6.0.md. The release label was created there before the first ceremony PR, per the guide's prerequisite.

Disposal state is written below when the rehearsal ends, as this record's author observes it — never as an intention.

Candidate-ref deviation

The pure consumer path cannot resolve this candidate's CEREMONY_SELF_REF: "0.6.0": that tag is the one this release has not created yet. No 0.6.0 branch was created on heavy-duty/ceremony.

The scratch caller instead pins cndgrr/ceremony/.github/workflows/release.yml@drill/0.6.0. That fork ref's parent is the canonical candidate SHA fb8f8282a9e7b317d4d028f8e8da50501a882d14, and its one additional commit (775b4d1f6485ebdde924979ac2dce536643c6071) rewrites all three CEREMONY_SELF_REF carriers — release.yml, labels.yml, labels-sweep.yml — to that same SHA. All runtime machinery in every probe below was therefore fetched from the 0.6.0 candidate tree.

Commits pushed to the candidate after fb8f828 are this record only; the release path (.github/scripts/release-path.sh) is byte-identical at the canonical SHA and at the final head.

Probes

One row per probe, written from its run. Runs are in cndgrr/ceremony-drill-0.6.0.

# probe run result
1 merge-door ceremony
2 mislabeled ordinary PR 30991634654 green NOTICE no-op; no tag, no release
3 bare-version PR without release
4 re-run completed ceremony
5 manual matching tag
6 mismatched tag

Probe 2 — a mislabeled ordinary PR

PR #2 (probe2b-mislabeled) added one changelog fragment and touched no version. The release label was applied through POST /repos/{owner}/{repo}/issues/2/labels and confirmed present before the merge. The merge run decided row 1 of the table and published nothing:

  VER: 0.6.0-dev
  BASE_VER: 0.6.0-dev
  RELEASED:
  LABELED:
NOTICE: the version '0.6.0-dev' is -dev and unchanged by this PR — release-flow work under the release label, not a ceremony. Nothing to publish.
ceremony=no

RELEASED and LABELED are empty on purpose — the -dev rows never consult them, which is precisely why the label alone cannot ship anything. Notes, the nothing-exists assert, tag, artifact hook, publish and bump all skipped; GET /tags and GET /releases were both empty afterwards.

An earlier merge (PR #1, run 30991571096) was intended as this probe but landed unlabeled: gh pr edit --add-label failed against this repo's projects-classic GraphQL surface, and the merge went ahead before the failure was read. That run is a green no-op too, but it is not evidence for this probe — an unlabeled ordinary merge proves less than a labeled one — so the probe was re-run as PR #2 with the label applied through the REST endpoint and verified before merging. Recorded here because the run exists in the repo's history and a reader will find it.