diff --git a/.github/workflows/labels-sweep.yml b/.github/workflows/labels-sweep.yml index ec50bb7..ffa2d61 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.1" + CEREMONY_SELF_REF: "0.5.0" jobs: reconcile: diff --git a/.github/workflows/labels.yml b/.github/workflows/labels.yml index ca159b8..46234d1 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.1" + CEREMONY_SELF_REF: "0.5.0" jobs: scope: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9081740..62e8928 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.1" + CEREMONY_SELF_REF: "0.5.0" VERSION_SOURCE: ${{ inputs.version-source }} jobs: diff --git a/CHANGELOG.md b/CHANGELOG.md index 406114a..dcd452c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,44 @@ 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.5.0 — 2026-08-03 + +### Added + +- `labels.conf` accepts optional `panel[]=` rows: the required set for + a PR authored by that login is the row minus the author; other authors keep + `panel=`. Consumers gain the row at their next pin bump — adding it before + that bump is a parse failure that takes the label board down (#224). + +### Changed + +- Doctrine: third-party actions never hold a write-capable token by default — + repo-owned scripts in write-capable jobs, established publisher plus + full-SHA pin for the exception, SHA pins everywhere. Canonical in + REVIEWER.md, short form in BUILDER.md; consumers adopt at the pin bump + (#216). + +### Fixed + +- `ruling_escalation_row` selects the setter's best-shaped in-window comment, + ties broken to the earliest, instead of the earliest outright — a whole-round + reply landing seconds before the escalation is no longer graded in its place + (crew#293). +- The escalation selector and `ruling_shape_decision` share one field-presence + matcher, and an undecodable body column scores 0 instead of erroring the + sweep. +- Five stale **unreleased** markers in `docs/CONSUMERS.md` now name their + tags: fragment mode, `changelog-assembled` and `runner-isolated` at + `0.2.0`; the additive labeler at `0.3.0`; the two-caller split at `0.4.1` + (#221). +- The marker convention now names its clearing owner: the release PR that + ships machinery clears, in that same PR, every marker its assembled + section makes false (#221). +- A standing non-approving verdict now outranks draft in `decide_state`: a + re-drafted PR mid-round reads `state:addressing`, a live panel request on a + draft surfaces as `state:bots-reviewing`, and a draft with no round history + still reads `state:building` (#205). + ## 0.4.1 — 2026-08-01 ### Changed diff --git a/VERSION b/VERSION index 7532512..8f0916f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.4.2-dev +0.5.0 diff --git a/changelog.d/205.md b/changelog.d/205.md deleted file mode 100644 index d1c2371..0000000 --- a/changelog.d/205.md +++ /dev/null @@ -1,6 +0,0 @@ -### Fixed - -- A standing non-approving verdict now outranks draft in `decide_state`: a - re-drafted PR mid-round reads `state:addressing`, a live panel request on a - draft surfaces as `state:bots-reviewing`, and a draft with no round history - still reads `state:building` (#205). diff --git a/changelog.d/216.md b/changelog.d/216.md deleted file mode 100644 index f111098..0000000 --- a/changelog.d/216.md +++ /dev/null @@ -1,7 +0,0 @@ -### Changed - -- Doctrine: third-party actions never hold a write-capable token by default — - repo-owned scripts in write-capable jobs, established publisher plus - full-SHA pin for the exception, SHA pins everywhere. Canonical in - REVIEWER.md, short form in BUILDER.md; consumers adopt at the pin bump - (#216). diff --git a/changelog.d/221.md b/changelog.d/221.md deleted file mode 100644 index e1b4997..0000000 --- a/changelog.d/221.md +++ /dev/null @@ -1,9 +0,0 @@ -### Fixed - -- Five stale **unreleased** markers in `docs/CONSUMERS.md` now name their - tags: fragment mode, `changelog-assembled` and `runner-isolated` at - `0.2.0`; the additive labeler at `0.3.0`; the two-caller split at `0.4.1` - (#221). -- The marker convention now names its clearing owner: the release PR that - ships machinery clears, in that same PR, every marker its assembled - section makes false (#221). diff --git a/changelog.d/224.md b/changelog.d/224.md deleted file mode 100644 index cac5b2a..0000000 --- a/changelog.d/224.md +++ /dev/null @@ -1,6 +0,0 @@ -### Added - -- `labels.conf` accepts optional `panel[]=` rows: the required set for - a PR authored by that login is the row minus the author; other authors keep - `panel=`. Consumers gain the row at their next pin bump — adding it before - that bump is a parse failure that takes the label board down (#224). diff --git a/changelog.d/226.md b/changelog.d/226.md deleted file mode 100644 index b945142..0000000 --- a/changelog.d/226.md +++ /dev/null @@ -1,9 +0,0 @@ -### Fixed - -- `ruling_escalation_row` selects the setter's best-shaped in-window comment, - ties broken to the earliest, instead of the earliest outright — a whole-round - reply landing seconds before the escalation is no longer graded in its place - (crew#293). -- The escalation selector and `ruling_shape_decision` share one field-presence - matcher, and an undecodable body column scores 0 instead of erroring the - sweep. diff --git a/docs/CONSUMERS.md b/docs/CONSUMERS.md index 3160b0a..99e1ce2 100644 --- a/docs/CONSUMERS.md +++ b/docs/CONSUMERS.md @@ -506,7 +506,7 @@ rows only; adding `triage-actors=` is a parse failure, not an ignored setting. Add it at the same pin bump as the `issues:` trigger — `0.2.0` or later — never before it and never through mixed refs. -The optional `panel[]=` rows are **unreleased** (#224). A row names +The optional `panel[]=` rows are available at `0.5.0` and later (#224). A row names the effective panel for PRs authored by exactly that login — the reconciler computes that PR's required set from the row, minus the author as always — and every other author keeps the base `panel=`, which stays mandatory. The diff --git a/drills/0.5.0.md b/drills/0.5.0.md new file mode 100644 index 0000000..6a29c1f --- /dev/null +++ b/drills/0.5.0.md @@ -0,0 +1,58 @@ +# 0.5.0 — drill record + +Run 2026-08-03 by `dan-claude-bot` against the release PR (Refs #233), +candidate branch `build/233-release-0-5-0` on `heavy-duty/ceremony` main at +`0ac3a6f`. + +## 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; the live 0.4.0 and 0.4.1 releases then exercised the merge +door for real, twice, within the last three days. Measured at `0ac3a6f`, +stated as they are rather than as #233's D3 predicted them at `b18c0bc`: + +- `git diff 0.4.1..main -- .github/workflows/release.yml` — **empty**. No + door logic, no decide table, no publish step moved. +- `git diff 0.4.1..main -- bin` — **empty**. No release tooling moved. +- `git diff 0.4.1..main -- lib` — **not empty**: `lib/ruling.sh` +50/−13, + #226's best-shaped escalation selection, merged this morning as PR #234. + That is the labels-sweep library the reconcilers source; nothing in the + release path reads it. The doors-unchanged ruling rests on the two empty + surfaces above, not on a lib claim this tag can no longer make. + +Re-running a full disposable-repo drill would rehearse machinery this repo +proved in rehearsal at 0.4.0 and in production at both subsequent tags. This +record rests on the standing evidence below and says so honestly. The panel +reviews this claim like any other; if any reviewer rules a full drill owed, +that verdict wins (#233 D3). + +## 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.5.0 payload's one lib delta: #226's best-shaped selection | `test/ruling.test.sh` in the `test` job at this head, plus claude-bot's independent reproduction in the #234 review round | green — suite coverage, **not** live dogfood; see below | + +Probe 5 makes no live-exercise claim, and the reason is stated so the next +reader does not restore one: the post-merge sweeps (`30811983604`, +`30812172095`, both at `0ac3a6f`) do run the candidate's `lib/ruling.sh` on +the dogfood path, but every #226 call site sits inside `reconcile_ruling`, +whose single caller is behind the `needs-ruling` flag check +(`labels-reconcile.sh:865–866`), and this board has no `needs-ruling` item, +standing or historical — so not one line of the delta this tag carries has +executed live here. Its coverage at this candidate is `test/ruling.test.sh` +(107 checks, including the crew#293 replay and the six regression proofs +named in PR #234) and the #234 round's independent re-run of that proof. +Per drills/README.md — the record is the evidence — and #135's defect +class, a smaller true probe stands where a larger unobserved one would not. + +## Deviations + +No candidate-ref deviation arises: this record stages no scratch caller, so +nothing needs to resolve `CEREMONY_SELF_REF: "0.5.0"` before the tag exists. +The sibling adoption proof is post-tag and crew's: crew#298's pin bump, then +its `panel[]=` rows, then crew's first clean sweep — owned by that +issue's criteria, reported back on #233 per its post-merge criterion.