diff --git a/.github/workflows/labels-sweep.yml b/.github/workflows/labels-sweep.yml index 9e68d22..ec50bb7 100644 --- a/.github/workflows/labels-sweep.yml +++ b/.github/workflows/labels-sweep.yml @@ -49,7 +49,7 @@ on: env: # A called workflow arrives without its repository. Keep this literal pin # aligned with the ceremony release consumed by callers (issue #9 D3). - CEREMONY_SELF_REF: "0.4.0" + CEREMONY_SELF_REF: "0.4.1" jobs: reconcile: diff --git a/.github/workflows/labels.yml b/.github/workflows/labels.yml index 8a13c2e..ca159b8 100644 --- a/.github/workflows/labels.yml +++ b/.github/workflows/labels.yml @@ -48,7 +48,7 @@ on: env: # A called workflow arrives without its repository. Keep this literal pin # aligned with the ceremony release consumed by callers (issue #9 D3). - CEREMONY_SELF_REF: "0.4.0" + CEREMONY_SELF_REF: "0.4.1" jobs: scope: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d604f0e..9081740 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -129,7 +129,7 @@ env: # `ref:` accepts ${{ env }}; `uses:` strings do not — which is why the # shared logic arrives as script files via checkout, not as inner `uses:` # references. - CEREMONY_SELF_REF: "0.4.0" + CEREMONY_SELF_REF: "0.4.1" VERSION_SOURCE: ${{ inputs.version-source }} jobs: diff --git a/CHANGELOG.md b/CHANGELOG.md index fc33418..406114a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,31 @@ Entries arrive as fragments — one `changelog.d/.md` per PR, never an edit to this file — and the release PR assembles them into the next section here (`bin/changelog-assemble`, #112). +## 0.4.1 — 2026-08-01 + +### Changed + +- The reconcile sweep is detached from PR-triggered runs: a new reusable + `labels-sweep.yml` carries it, woken by `labels.yml`'s new `trigger` job, so + a queue-displaced sweep cancels on the Actions tab instead of landing a + cancelled `reconcile` check on a PR (#209). +- Labels consumers add a sweep caller (`labels-sweep.yml`, stub in + docs/CONSUMERS.md), relocate the hourly cron and manual bootstrap dispatch + to it, and grant the labels caller `actions: write`; a pin bump without the + sweep caller goes loudly red at the trigger job (#209). + +### Fixed + +- `checks_state` drops rollup entries belonging to the workflow it runs + inside — `SELF_WORKFLOW`, defaulting to the ambient `GITHUB_WORKFLOW` — + before the newest-per-context collapse: the label machine never grades + its own runs, and an empty name filters nothing (#208). +- A sweep displaced from the shared concurrency queue attaches CANCELLED to + its PR while its successor attaches elsewhere, so the sweep set + `blocker:ci-red` off its own displaced run and re-affirmed it every + cadence (crew#227). A rollup of only self entries now honestly scores + NONE (#208). + ## 0.4.0 — 2026-07-29 ### Added diff --git a/VERSION b/VERSION index 1351681..267577d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.4.1-dev +0.4.1 diff --git a/changelog.d/208.md b/changelog.d/208.md deleted file mode 100644 index aa1d9b7..0000000 --- a/changelog.d/208.md +++ /dev/null @@ -1,11 +0,0 @@ -### Fixed - -- `checks_state` drops rollup entries belonging to the workflow it runs - inside — `SELF_WORKFLOW`, defaulting to the ambient `GITHUB_WORKFLOW` — - before the newest-per-context collapse: the label machine never grades - its own runs, and an empty name filters nothing (#208). -- A sweep displaced from the shared concurrency queue attaches CANCELLED to - its PR while its successor attaches elsewhere, so the sweep set - `blocker:ci-red` off its own displaced run and re-affirmed it every - cadence (crew#227). A rollup of only self entries now honestly scores - NONE (#208). diff --git a/changelog.d/209.md b/changelog.d/209.md deleted file mode 100644 index 55be82b..0000000 --- a/changelog.d/209.md +++ /dev/null @@ -1,10 +0,0 @@ -### Changed - -- The reconcile sweep is detached from PR-triggered runs: a new reusable - `labels-sweep.yml` carries it, woken by `labels.yml`'s new `trigger` job, so - a queue-displaced sweep cancels on the Actions tab instead of landing a - cancelled `reconcile` check on a PR (#209). -- Labels consumers add a sweep caller (`labels-sweep.yml`, stub in - docs/CONSUMERS.md), relocate the hourly cron and manual bootstrap dispatch - to it, and grant the labels caller `actions: write`; a pin bump without the - sweep caller goes loudly red at the trigger job (#209). diff --git a/drills/0.4.1.md b/drills/0.4.1.md new file mode 100644 index 0000000..dc6a2e6 --- /dev/null +++ b/drills/0.4.1.md @@ -0,0 +1,42 @@ +# 0.4.1 — drill record + +Run 2026-08-01 by `dan-claude-bot` against release PR (Refs #212), candidate +branch `build/212-release-0-4-1` on `heavy-duty/ceremony` main at `c2987fd`. + +## Scope ruling — doors unchanged, no disposable-repo rehearsal + +The 0.4.0 drill (drills/0.4.0.md) probed both release doors end-to-end in a +disposable repo, and the live 0.4.0 release then exercised the merge door for +real: one tag, one release, main re-armed to `0.4.1-dev`. Since that tag, +`release.yml`'s only delta is the `CEREMONY_SELF_REF` pin line — no door +logic, no decide table, no publish step changed. Re-running a full +disposable-repo drill would rehearse machinery this repo already proved both +in rehearsal and in production within the last three days. This record +therefore rests on the standing evidence below, and says so honestly rather +than staging a ceremony for a tree the doors cannot distinguish from the last +one. The panel reviews this claim like any other; if any reviewer rules a +full drill owed, that verdict wins. + +## Standing evidence at the candidate head + +| # | probe | where | result | +|---|---|---|---| +| 1 | decide + merge-door step-replay (dogfood) | `release-exercise / step-replay (dogfood)` on this PR | CI-gating; green required to merge | +| 2 | decide + merge-door step-replay (consumer) | `release-exercise / step-replay (consumer)` on this PR | CI-gating; green required to merge | +| 3 | fragment chain: armed → assemble → monotonic | `release-exercise / fixture-chain` on this PR | CI-gating; green required to merge | +| 4 | the real tree's own guards (armed, monotonic, drill-recorded, self-ref) | `self-guards` on this PR | CI-gating; green required to merge | +| 5 | the 0.4.1 payload live: split labels machinery dogfooding on this very PR | this PR's checks | `labels / scope` + `labels / trigger` green, and NO `labels / reconcile` check attached — the #209 acceptance shape, observed on the first post-split PR in this repo | + +Probe 5 is the one piece 0.4.0's drill could not have covered: the sweep +split is 0.4.1's payload, and this repo adopted it on merge (#211 split +`self-labels.yml` / `self-labels-sweep.yml`). Every PR opened after that +merge — this one included — is a live consumer-shaped proof that PR checks +carry scope and trigger only, with sweeps dispatched to the detached +`self-labels-sweep` runs. + +## Deviations + +No candidate-ref deviation arises: this record stages no scratch caller, so +nothing needs to resolve `CEREMONY_SELF_REF: "0.4.1"` before the tag exists. +The sibling crew migration is the post-tag consumer proof, per #212's +acceptance criteria.