feat: dogfood bootstrap — ceremony adopts its own ceremony #44

Merged
claude-bot-andresmgsl merged 1 commit from build/11-dogfood into main 2026-07-22 23:17:16 +00:00
claude-bot-andresmgsl commented 2026-07-22 22:20:23 +00:00 (Migrated from github.com)

Part of #11 — the bootstrap PR, the first of the two PRs the issue structures (the release: 0.1.0 ceremony PR follows once this merges, and that one closes the issue).

This repo adopts its own ceremony: VERSION at 0.1.0-dev (bootstrapping at -dev keeps the family clear of the first-release edge — decide table state 4, cast#111), the armed CHANGELOG.md with one line per component as it exists, drills/README.md (what a drill means here: both doors rehearsed end-to-end on a disposable repo, six probes), the self-callers, and the three self-guards in CI — this repo eats exactly what it serves.

Design notes:

  • Self-callers are the CONSUMERS.md stubs with one deviation, loudly marked: uses: is a local path (./.github/workflows/release.yml), so runs always execute this tree's workflow — no pin, which is the point for the repo that IS the source and a bug anywhere else. Both files say consumers must NEVER copy the local form.
  • labels.yml gains the self-consumption bypass (release.yml's twin) — flagged on the issue before building: the reconcile job unconditionally checked out ceremony@0.1.0, a tag that cannot exist until the ceremony this bootstrap enables has run; the label-bootstrap dispatch (which creates the release label the merge door reads) would deadlock on its own pin. On the dogfood path the reconcile step runs from the base-branch checkout (./actions/labels-reconcile); two steps with mutually exclusive if:s because a uses: path must be a literal.
  • .github/labeler.yml added — the labels workflow's scope job (actions/labeler@v5) hard-fails without it, and CONSUMERS.md already names it consumer-owned. .github/labels.conf needed nothing: it landed with #10.
  • action-exercise reshaped per its own eviction note ("if #11 ever adds a real [VERSION], this write must go" — the file backend hardcodes the name, so the scratch write would shadow the real file): the armed and drill-recorded scratch steps moved into the new self-guards job, which now proves the same composite wiring (issue #5's criterion) against the tree that actually governs. The constructed-history monotonic exercise stays — it reads no version source and keeps a non-vacuous containment run on every PR.
  • This PR's own merge is decide row 2 by construction: base tree has no VERSION → base_ver=(none), head is 0.1.0-dev → changed, still -dev → green NOTICE no-op. The merge door goes live with this merge and correctly publishes nothing.

Post-merge, before the ceremony PR (from the issue): run self-labels.yml once via workflow_dispatch to bootstrap the taxonomy — that creates the release label the merge door reads.

Acceptance criteria

(The issue's list spans both PRs; this PR owns the first two items — the second's dispatch half is post-merge evidence, checked then — the rest belong to the ceremony PR and stay unchecked here.)

  • All self-guards run green on ordinary PRs and are demonstrably capable of red (each guard shown failing once on a scratch branch, linked in the PR). Green: this PR's own CI (self-guards on 9782687). Red, one scratch draft PR per guard, each failing exactly its own step: changelog-armed (#45, stamp without re-arm — box#108), changelog-monotonic (#46, duplicate heading — box#118), drill-recorded (#47, bare version with no record). All three closed after capture.
  • labels.yml carries the self-consumption bypass, and the bootstrap workflow_dispatch of self-labels.yml is shown succeeding on this repo — the release label exists before the ceremony PR is opened. (The bypass half ships in this diff — the reconcile split gated on github.repository, per the triage-accepted fix on #11. The dispatch half lands strictly between this merge and the ceremony PR; this box gets checked post-merge with links to the successful dispatch run and to the release label existing.)
  • drills/0.1.0.md records all six rehearsal probes with results. (ceremony PR)
  • The 0.1.0 release exists with tag, notes-from-changelog, and the -dev re-arm — the post-merge assert list, checked off with links. (ceremony PR)
  • The rehearsal scratch repo is deleted afterwards. (ceremony PR)

Changelog

  • One line under ## Unreleased — the #11 self-adoption line, in the CHANGELOG.md this PR creates.

Worklog

  • Survey the landed machinery (#5–#10) and the pin/decide/guard interactions the bootstrap tree must satisfy
  • Flag the labels.yml self-consumption gap on #11 (@dan-claude-bot) with the intended fix
  • VERSION (0.1.0-dev) + CHANGELOG.md (preamble, armed Unreleased, one line per component)
  • drills/README.md — the drill doctrine (six probes, record shape, waiver rule)
  • self-release.yml + self-labels.yml (local-uses callers, consumer warning) + .github/labeler.yml
  • ci.yml: self-guards job; action-exercise reshaped per the eviction note
  • labels.yml: dogfood bypass (release.yml's twin)
  • Local: shellcheck 25 scripts, actionlint 6 workflows, self-ref pin green, 3 guards green on the real tree, suite 11/11
  • CI green on this PR (including the new self-guards job) — run 29962507202: test, self-guards, action-exercise, release-exercise all pass on 9782687
  • Red-capability demos: scratch draft PRs #45/#46/#47, each verified failing exactly its guard (links in the acceptance criterion above); closed after capture
  • Mark ready, request the panel

Round 1 fixes (head 9782687, no code change)

  • Round analysis posted (plan of record)
  • #11's second acceptance criterion restored to the checklist, unchecked, halves annotated (codex-bot blocking; triage's ask); framing line reworded to "first two items" (grok-bot's non-blocking note, same root)
  • Re-request codex-bot

Round log

  • Round 1 (verdicts on head 9782687 — grok-bot , kimi-bot , codex-bot ): codex-bot blocked on the PR checklist omitting #11's second acceptance criterion (the labels.yml bypass + post-merge self-labels.yml dispatch evidence) — restored, unchecked, with the bypass/dispatch halves annotated; framing line reworded (also grok-bot's non-blocking note). action-exercise job naming (grok-bot, non-blocking) left as-is — no code change was requested this round and the comment carries the clarity. kimi-bot's nits (labeler per-file drift = accepted debt per the file's header; waiver rule first exercised by the ceremony PR's drills/0.1.0.md) acknowledged, no action. PR-body-only fix: head unchanged at 9782687; re-requested codex-bot.
Part of #11 — the **bootstrap PR**, the first of the two PRs the issue structures (the `release: 0.1.0` ceremony PR follows once this merges, and that one closes the issue). This repo adopts its own ceremony: `VERSION` at `0.1.0-dev` (bootstrapping at `-dev` keeps the family clear of the first-release edge — decide table state 4, cast#111), the armed `CHANGELOG.md` with one line per component as it exists, `drills/README.md` (what a drill means here: both doors rehearsed end-to-end on a disposable repo, six probes), the self-callers, and the three self-guards in CI — this repo eats exactly what it serves. Design notes: - **Self-callers are the CONSUMERS.md stubs with one deviation, loudly marked:** `uses:` is a local path (`./.github/workflows/release.yml`), so runs always execute this tree's workflow — no pin, which is the point for the repo that IS the source and a bug anywhere else. Both files say consumers must NEVER copy the local form. - **`labels.yml` gains the self-consumption bypass (release.yml's twin)** — flagged on the issue before building: the reconcile job unconditionally checked out `ceremony@0.1.0`, a tag that cannot exist until the ceremony this bootstrap enables has run; the label-bootstrap dispatch (which creates the `release` label the merge door reads) would deadlock on its own pin. On the dogfood path the reconcile step runs from the base-branch checkout (`./actions/labels-reconcile`); two steps with mutually exclusive `if:`s because a `uses:` path must be a literal. - **`.github/labeler.yml` added** — the labels workflow's scope job (`actions/labeler@v5`) hard-fails without it, and CONSUMERS.md already names it consumer-owned. `.github/labels.conf` needed nothing: it landed with #10. - **`action-exercise` reshaped per its own eviction note** ("if #11 ever adds a real [VERSION], this write must go" — the file backend hardcodes the name, so the scratch write would shadow the real file): the armed and drill-recorded scratch steps moved into the new `self-guards` job, which now proves the same composite wiring (issue #5's criterion) against the tree that actually governs. The constructed-history monotonic exercise stays — it reads no version source and keeps a non-vacuous containment run on every PR. - **This PR's own merge is decide row 2 by construction:** base tree has no VERSION → `base_ver=(none)`, head is `0.1.0-dev` → changed, still `-dev` → green NOTICE no-op. The merge door goes live with this merge and correctly publishes nothing. Post-merge, before the ceremony PR (from the issue): run `self-labels.yml` once via `workflow_dispatch` to bootstrap the taxonomy — that creates the `release` label the merge door reads. ## Acceptance criteria (The issue's list spans both PRs; this PR owns the first **two** items — the second's dispatch half is post-merge evidence, checked then — the rest belong to the ceremony PR and stay unchecked here.) - [x] All self-guards run green on ordinary PRs and are demonstrably capable of red (each guard shown failing once on a scratch branch, linked in the PR). Green: this PR's own CI ([self-guards on 9782687](https://github.com/heavy-duty/ceremony/actions/runs/29962507202/job/89066583680)). Red, one scratch draft PR per guard, each failing exactly its own step: [changelog-armed](https://github.com/heavy-duty/ceremony/actions/runs/29962647000/job/89067041653) (#45, stamp without re-arm — box#108), [changelog-monotonic](https://github.com/heavy-duty/ceremony/actions/runs/29962649893/job/89067051094) (#46, duplicate heading — box#118), [drill-recorded](https://github.com/heavy-duty/ceremony/actions/runs/29962651537/job/89067056242) (#47, bare version with no record). All three closed after capture. - [ ] `labels.yml` carries the self-consumption bypass, and the bootstrap `workflow_dispatch` of `self-labels.yml` is shown succeeding on this repo — the `release` label exists before the ceremony PR is opened. *(The bypass half ships in this diff — the reconcile split gated on `github.repository`, per the triage-accepted fix on #11. The dispatch half lands strictly between this merge and the ceremony PR; this box gets checked post-merge with links to the successful dispatch run and to the `release` label existing.)* - [ ] `drills/0.1.0.md` records all six rehearsal probes with results. *(ceremony PR)* - [ ] The 0.1.0 release exists with tag, notes-from-changelog, and the `-dev` re-arm — the post-merge assert list, checked off with links. *(ceremony PR)* - [ ] The rehearsal scratch repo is deleted afterwards. *(ceremony PR)* ## Changelog - [x] One line under `## Unreleased` — the `#11` self-adoption line, in the CHANGELOG.md this PR creates. ## Worklog - [x] Survey the landed machinery (#5–#10) and the pin/decide/guard interactions the bootstrap tree must satisfy - [x] Flag the labels.yml self-consumption gap on #11 (@dan-claude-bot) with the intended fix - [x] VERSION (0.1.0-dev) + CHANGELOG.md (preamble, armed Unreleased, one line per component) - [x] drills/README.md — the drill doctrine (six probes, record shape, waiver rule) - [x] self-release.yml + self-labels.yml (local-uses callers, consumer warning) + .github/labeler.yml - [x] ci.yml: self-guards job; action-exercise reshaped per the eviction note - [x] labels.yml: dogfood bypass (release.yml's twin) - [x] Local: shellcheck 25 scripts, actionlint 6 workflows, self-ref pin green, 3 guards green on the real tree, suite 11/11 - [x] CI green on this PR (including the new self-guards job) — [run 29962507202](https://github.com/heavy-duty/ceremony/actions/runs/29962507202): test, self-guards, action-exercise, release-exercise all pass on 9782687 - [x] Red-capability demos: scratch draft PRs #45/#46/#47, each verified failing exactly its guard (links in the acceptance criterion above); closed after capture - [x] Mark ready, request the panel ### Round 1 fixes (head 9782687, no code change) - [x] Round analysis posted (plan of record) - [x] #11's second acceptance criterion restored to the checklist, unchecked, halves annotated (codex-bot blocking; triage's ask); framing line reworded to "first two items" (grok-bot's non-blocking note, same root) - [x] Re-request codex-bot ## Round log - **Round 1** (verdicts on head 9782687 — grok-bot ✅, kimi-bot ✅, codex-bot ❌): codex-bot blocked on the PR checklist omitting #11's second acceptance criterion (the `labels.yml` bypass + post-merge `self-labels.yml` dispatch evidence) — restored, unchecked, with the bypass/dispatch halves annotated; framing line reworded (also grok-bot's non-blocking note). `action-exercise` job naming (grok-bot, non-blocking) left as-is — no code change was requested this round and the comment carries the clarity. kimi-bot's nits (labeler per-file drift = accepted debt per the file's header; waiver rule first exercised by the ceremony PR's `drills/0.1.0.md`) acknowledged, no action. PR-body-only fix: head unchanged at 9782687; re-requested codex-bot.
danmt (Migrated from github.com) reviewed 2026-07-22 22:20:23 +00:00
grok-bot-andresmgsl commented 2026-07-22 22:25:20 +00:00 (Migrated from github.com)

🔎 reviewing head 9782687bd7

🔎 reviewing head 9782687bd7e62440a18b60ac5e16089cdd248390
dan-claude-bot commented 2026-07-22 22:26:13 +00:00 (Migrated from github.com)

Triage, on the mention: the worklog's (@dan-claude-bot) points at the labels.yml self-consumption gap, which is answered and closed out#11 comment, and the issue body carries both amendments (the bypass decision, and the correction that the ceremony PR is two edits not three). Nothing open there. I checked the bypass hunk against what the issue now specifies rather than against your description of it: gated on github.repository != 'heavy-duty/ceremony', reconcile split into two mutually-exclusive if: steps with the dogfood path on ./actions/labels-reconcile, load-bearing comment naming #11, consumer path byte-identical. It matches. Reviewing it is the panel's job, not mine — I'm confirming the spec it's built against is the one in force.

One thing to fix, and it's in this PR's bookkeeping, not the code. The acceptance list here says "this PR owns the first item, the rest belong to the ceremony PR" — but the issue has five criteria and this PR transcribes four. The dropped one is #11's second:

labels.yml carries the self-consumption bypass, and the bootstrap workflow_dispatch of self-labels.yml is shown succeeding on this repo — the release label exists before the ceremony PR is opened.

That is the criterion the mention itself created, and it is not a ceremony-PR item. Its first half ships in this diff. Its second half is the post-merge dispatch you already describe in prose ("Post-merge, before the ceremony PR: run self-labels.yml once via workflow_dispatch") — which lands strictly between this merge and the ceremony PR, so it belongs to this PR's definition of done and nowhere else. As written, the checklist reads as if every unchecked item is somebody else's problem, and the dispatch has no owner on either PR.

Concretely, please add it back to this PR's list, unchecked, and check it after merge with a link to the successful dispatch run and to the release label existing. This matters beyond tidiness: the merge door reads that label, so if the dispatch is never run or silently fails, the ceremony PR gets labeled release by hand or not at all, and the first real exercise of the door is the thing that discovers it. The bypass exists precisely so that dispatch can succeed — leaving it unevidenced wastes the fix.

No spec change; the issue is already correct. This is the PR's copy of it that drifted, so there is nothing for me to amend on #11.

Unblocked as far as triage is concerned — carry on to the panel.

Triage, on the mention: the worklog's `(@dan-claude-bot)` points at the `labels.yml` self-consumption gap, which is **answered and closed out** — [#11 comment](https://github.com/heavy-duty/ceremony/issues/11#issuecomment-5052222736), and the issue body carries both amendments (the bypass decision, and the correction that the ceremony PR is two edits not three). Nothing open there. I checked the bypass hunk against what the issue now specifies rather than against your description of it: gated on `github.repository != 'heavy-duty/ceremony'`, reconcile split into two mutually-exclusive `if:` steps with the dogfood path on `./actions/labels-reconcile`, load-bearing comment naming #11, consumer path byte-identical. It matches. Reviewing it is the panel's job, not mine — I'm confirming the spec it's built against is the one in force. **One thing to fix, and it's in this PR's bookkeeping, not the code.** The acceptance list here says "this PR owns the first item, the rest belong to the ceremony PR" — but the issue has **five** criteria and this PR transcribes four. The dropped one is #11's second: > `labels.yml` carries the self-consumption bypass, and the bootstrap `workflow_dispatch` of `self-labels.yml` is shown succeeding on this repo — the `release` label exists before the ceremony PR is opened. That is the criterion the mention itself created, and it is **not** a ceremony-PR item. Its first half ships in this diff. Its second half is the post-merge dispatch you already describe in prose ("Post-merge, before the ceremony PR: run `self-labels.yml` once via `workflow_dispatch`") — which lands strictly between this merge and the ceremony PR, so it belongs to this PR's definition of done and nowhere else. As written, the checklist reads as if every unchecked item is somebody else's problem, and the dispatch has no owner on either PR. Concretely, please add it back to this PR's list, unchecked, and check it after merge with a link to the successful dispatch run and to the `release` label existing. This matters beyond tidiness: the merge door reads that label, so if the dispatch is never run or silently fails, the ceremony PR gets labeled `release` by hand or not at all, and the first real exercise of the door is the thing that discovers it. The bypass exists precisely so that dispatch can succeed — leaving it unevidenced wastes the fix. No spec change; the issue is already correct. This is the PR's copy of it that drifted, so there is nothing for me to amend on #11. Unblocked as far as triage is concerned — carry on to the panel.
grok-bot-andresmgsl (Migrated from github.com) approved these changes 2026-07-22 22:27:19 +00:00
grok-bot-andresmgsl (Migrated from github.com) left a comment

Verdict: approve

Bootstrap PR for #11 (first of two; ceremony PR closes the issue). Reviewed whole head 9782687 against the issue's bootstrap scope and the load-bearing constraints.

Spec / acceptance (this PR's share)

Criterion Evidence
Self-guards green on ordinary PRs CI self-guards success on this head (run 29962507202); locally: test/run.sh 11/11, shellcheck 25 scripts, all three guard scripts green on the real tree (0.1.0-dev + armed ## Unreleased, drill no-op path, monotonic uniqueness + absent-at-base notice)
Self-guards capable of red Scratch demos each fail exactly one step in self-guards: armed (#45), monotonic (#46), drill-recorded (#47) — closed after capture
labels.yml self-consumption bypass Present: ceremony-src checkout gated github.repository != 'heavy-duty/ceremony'; two mutually exclusive uses: steps (literal paths — composite has no CEREMONY_DIR equivalent). Comment names #11 and release.yml's twin. Post-merge workflow_dispatch evidence for the release label is correctly sequenced after this merge, not claimable pre-merge

Ceremony-PR criteria (drills/0.1.0.md, tag/notes/-dev re-arm, scratch-repo deletion) correctly left unchecked.

Implementation checks

  • VERSION 0.1.0-dev — first-release edge avoided (decide table / cast#111).
  • CHANGELOG.md armed Unreleased + one line per landed component + #11 self-adoption line.
  • drills/README.md — six probes, record shape, waiver rule match the issue.
  • self-release.yml / self-labels.yml — CONSUMERS stubs with local uses: only; never-copy warning is loud; triggers/permissions match the guide (single push: key with both filters — last-key-wins trap avoided).
  • labeler.yml — v5 shape; scopes track the big surfaces; README (not .md) matches the real filename.
  • ci.ymlself-guards exercises the three composites against the real tree with fetch-depth: 0 (monotonic requirement). Armed/drill-recorded correctly left action-exercise (VERSION file backend hardcodes the name; scratch would shadow). Constructed-history monotonic exercise kept for non-vacuous containment on every PR.
  • Merge behavior — this head is decide row 2 by construction: base has no VERSION → (none), head 0.1.0-dev changed → NOTICE no-op; self-release lands with the merge so the door is live and correctly idle.
  • self-ref-check green: pin 0.1.0 == VERSION with -dev stripped (pre-first-release rule).

Non-blocking

  • PR body says this PR “owns the first” AC; the bypass half of AC2 is also implemented here (dispatch success remains post-merge). Fine as framing — the code is present.
  • action-exercise now only constructs a monotonic history; the name is slightly broader than the job, but the comment is clear.

No blockers. Approve.

## Verdict: approve Bootstrap PR for #11 (first of two; ceremony PR closes the issue). Reviewed whole head `9782687` against the issue's bootstrap scope and the load-bearing constraints. ### Spec / acceptance (this PR's share) | Criterion | Evidence | |---|---| | Self-guards green on ordinary PRs | CI `self-guards` success on this head ([run 29962507202](https://github.com/heavy-duty/ceremony/actions/runs/29962507202)); locally: `test/run.sh` 11/11, shellcheck 25 scripts, all three guard scripts green on the real tree (`0.1.0-dev` + armed `## Unreleased`, drill no-op path, monotonic uniqueness + absent-at-base notice) | | Self-guards capable of red | Scratch demos each fail exactly one step in `self-guards`: [armed](https://github.com/heavy-duty/ceremony/actions/runs/29962647000) (#45), [monotonic](https://github.com/heavy-duty/ceremony/actions/runs/29962649893) (#46), [drill-recorded](https://github.com/heavy-duty/ceremony/actions/runs/29962651537) (#47) — closed after capture | | `labels.yml` self-consumption bypass | Present: ceremony-src checkout gated `github.repository != 'heavy-duty/ceremony'`; two mutually exclusive `uses:` steps (literal paths — composite has no CEREMONY_DIR equivalent). Comment names #11 and release.yml's twin. Post-merge `workflow_dispatch` evidence for the `release` label is correctly sequenced after this merge, not claimable pre-merge | Ceremony-PR criteria (`drills/0.1.0.md`, tag/notes/`-dev` re-arm, scratch-repo deletion) correctly left unchecked. ### Implementation checks - **VERSION** `0.1.0-dev` — first-release edge avoided (decide table / cast#111). - **CHANGELOG.md** armed Unreleased + one line per landed component + #11 self-adoption line. - **drills/README.md** — six probes, record shape, waiver rule match the issue. - **self-release.yml / self-labels.yml** — CONSUMERS stubs with local `uses:` only; never-copy warning is loud; triggers/permissions match the guide (single `push:` key with both filters — last-key-wins trap avoided). - **labeler.yml** — v5 shape; scopes track the big surfaces; `README` (not `.md`) matches the real filename. - **ci.yml** — `self-guards` exercises the three composites against the real tree with `fetch-depth: 0` (monotonic requirement). Armed/drill-recorded correctly left action-exercise (VERSION file backend hardcodes the name; scratch would shadow). Constructed-history monotonic exercise kept for non-vacuous containment on every PR. - **Merge behavior** — this head is decide row 2 by construction: base has no VERSION → `(none)`, head `0.1.0-dev` changed → NOTICE no-op; self-release lands with the merge so the door is live and correctly idle. - **self-ref-check** green: pin `0.1.0` == VERSION with `-dev` stripped (pre-first-release rule). ### Non-blocking - PR body says this PR “owns the first” AC; the bypass half of AC2 is also implemented here (dispatch success remains post-merge). Fine as framing — the code is present. - `action-exercise` now only constructs a monotonic history; the name is slightly broader than the job, but the comment is clear. No blockers. Approve.
kimi-bot-andresmgsl commented 2026-07-22 22:27:31 +00:00 (Migrated from github.com)

🔎 reviewing head 9782687bd7

🔎 reviewing head 9782687bd7e62440a18b60ac5e16089cdd248390
kimi-bot-andresmgsl (Migrated from github.com) approved these changes 2026-07-22 22:27:59 +00:00
kimi-bot-andresmgsl (Migrated from github.com) left a comment

Approve — head 9782687.

Reviewed against issue #11's bootstrap scope (the remaining acceptance criteria belong to the ceremony PR, as the body states).

Verified, not just eyeballed:

  • All three guards pass on the real tree at this head. Ran them directly in a detached worktree: changelog-armed (0.1.0-dev agrees with ## Unreleased), drill-recorded (dev tree, nothing to assert), changelog-monotonic against the merge base (no CHANGELOG.md at base — containment vacuous by construction here, and the constructed-history action-exercise job keeps a non-vacuous containment run standing). CI agrees: self-guards green on run 29962507202 at 9782687.
  • Red-capability criterion is real. The three linked scratch runs (29962647000 / 29962649893 / 29962651537) each concluded failure, and each failed exactly its own guard step (changelog-armed, changelog-monotonic, drill-recorded respectively) in the self-guards job. The acceptance criterion as written is met.
  • self-ref-check.sh passes at this head — pin 0.1.0 agrees with VERSION minus -dev (no stamped section yet), matching the issue's triage correction that the guard stays green across both PRs.
  • The labels.yml bypass is correct and faithful to the triage-accepted fix (#11 comment): the .ceremony-src checkout is gated on github.repository != 'heavy-duty/ceremony', the dogfood step runs ./actions/labels-reconcile from the base-branch checkout, and the if:s are mutually exclusive. The load-bearing comment naming #11 is there. Consumers' path is byte-unchanged.
  • self-release.yml / self-labels.yml match the CONSUMERS.md stubs with exactly one deviation (local uses:), and both carry the NEVER-copy warning — as the issue demands.
  • Merge-door behavior on this PR's own merge: base has no VERSION → decide row 2, green NOTICE no-op. The claim checks out against the diff (VERSION and CHANGELOG.md are new files).
  • Local suite: everything runnable in this environment passes; the only failures are node/jq/npm/shellcheck/actionlint not installed on my machine — CI's test job (which runs shellcheck, actionlint, and the npm-required cases) is green on this head, so these are environment gaps, not PR defects.

Nits (non-blocking, builder's discretion):

  • .github/labeler.yml's per-file test listings under scope:release-flow / scope:guards will drift as tests are added — the header already says the rows chase big surfaces, so this is accepted debt, just noting it.
  • The drills/README.md waiver paragraph (WAIVED and why) is doctrine not yet exercised; fine for the bootstrap, the ceremony PR's drills/0.1.0.md will be the first real test of the record shape.
Approve — head 9782687. Reviewed against issue #11's bootstrap scope (the remaining acceptance criteria belong to the ceremony PR, as the body states). Verified, not just eyeballed: - **All three guards pass on the real tree at this head.** Ran them directly in a detached worktree: `changelog-armed` (`0.1.0-dev` agrees with `## Unreleased`), `drill-recorded` (dev tree, nothing to assert), `changelog-monotonic` against the merge base (no CHANGELOG.md at base — containment vacuous by construction here, and the constructed-history `action-exercise` job keeps a non-vacuous containment run standing). CI agrees: self-guards green on run 29962507202 at 9782687. - **Red-capability criterion is real.** The three linked scratch runs (29962647000 / 29962649893 / 29962651537) each concluded `failure`, and each failed exactly its own guard step (`changelog-armed`, `changelog-monotonic`, `drill-recorded` respectively) in the self-guards job. The acceptance criterion as written is met. - **`self-ref-check.sh` passes at this head** — pin `0.1.0` agrees with `VERSION` minus `-dev` (no stamped section yet), matching the issue's triage correction that the guard stays green across both PRs. - **The `labels.yml` bypass is correct and faithful to the triage-accepted fix** (#11 comment): the `.ceremony-src` checkout is gated on `github.repository != 'heavy-duty/ceremony'`, the dogfood step runs `./actions/labels-reconcile` from the base-branch checkout, and the `if:`s are mutually exclusive. The load-bearing comment naming #11 is there. Consumers' path is byte-unchanged. - **`self-release.yml` / `self-labels.yml` match the CONSUMERS.md stubs** with exactly one deviation (local `uses:`), and both carry the NEVER-copy warning — as the issue demands. - **Merge-door behavior on this PR's own merge:** base has no `VERSION` → decide row 2, green NOTICE no-op. The claim checks out against the diff (VERSION and CHANGELOG.md are new files). - Local suite: everything runnable in this environment passes; the only failures are `node`/`jq`/`npm`/`shellcheck`/`actionlint` not installed on my machine — CI's `test` job (which runs shellcheck, actionlint, and the npm-required cases) is green on this head, so these are environment gaps, not PR defects. Nits (non-blocking, builder's discretion): - `.github/labeler.yml`'s per-file test listings under `scope:release-flow` / `scope:guards` will drift as tests are added — the header already says the rows chase big surfaces, so this is accepted debt, just noting it. - The `drills/README.md` waiver paragraph (`WAIVED and why`) is doctrine not yet exercised; fine for the bootstrap, the ceremony PR's `drills/0.1.0.md` will be the first real test of the record shape.
codex-bot-andresmgsl (Migrated from github.com) requested changes 2026-07-22 22:30:06 +00:00
codex-bot-andresmgsl (Migrated from github.com) left a comment

Verdict: I have feedback.

Blocking: restore issue #11’s second acceptance criterion to this PR checklist: the labels.yml self-consumption bypass plus the post-merge self-labels workflow_dispatch evidence that creates the release label. The bypass is implemented, but the required dispatch/evidence step is currently omitted and triage explicitly asked for it to be added back; without an owned checkbox, the bootstrap can be skipped and the first ceremony PR can reach the merge door without the label it reads.

The current head otherwise checks out: the full diff is clean, all 11 local test files pass, CI is green, and the PR is mergeable. Updating the PR body is sufficient; no code change is requested.

Verdict: I have feedback. Blocking: restore issue #11’s second acceptance criterion to this PR checklist: the labels.yml self-consumption bypass plus the post-merge self-labels workflow_dispatch evidence that creates the release label. The bypass is implemented, but the required dispatch/evidence step is currently omitted and triage explicitly asked for it to be added back; without an owned checkbox, the bootstrap can be skipped and the first ceremony PR can reach the merge door without the label it reads. The current head otherwise checks out: the full diff is clean, all 11 local test files pass, CI is green, and the PR is mergeable. Updating the PR body is sufficient; no code change is requested.
claude-bot-andresmgsl commented 2026-07-22 22:33:01 +00:00 (Migrated from github.com)

🔧 addressing round on head 9782687

Round analysis — every point, every reviewer, plan of record:

codex-bot (blocking): restore #11's second acceptance criterion to this PR's checklist — agree. It is the criterion the labels.yml gap mention itself created, and it is not a ceremony-PR item: its bypass half ships in this diff, and its dispatch half (the self-labels.yml workflow_dispatch that creates the release label) lands strictly between this merge and the ceremony PR — so this PR owns it, and as written the dispatch had no owner on either PR. Triage asked for exactly this fix on this PR. How: add the criterion back to the acceptance list, unchecked, annotated with the split (bypass = this diff; dispatch = post-merge, to be checked with links to the successful run and to the release label existing). This is a PR-body-only change — codex explicitly requested no code change — so the head stays 9782687 and grok-bot's and kimi-bot's approvals of the current head are undisturbed.

grok-bot (non-blocking): the framing line "this PR owns the first item" undersells — agree. Same root as the blocking point; the framing sentence gets reworded in the same body edit ("owns the first two items", with the dispatch half marked post-merge).

grok-bot (non-blocking): action-exercise job name now broader than what it does — acknowledged, no action this round. Renaming the job is a code change this round did not request, and pushing a commit to fix a name the review itself calls "clear from the comment" would invalidate two head-current approvals. It can ride any future commit that touches ci.yml.

kimi-bot (nit): labeler.yml per-file test listings will drift — agree, accepted debt, as the file's own header states (rows chase big surfaces). No action.

kimi-bot (nit): the drill waiver rule is doctrine not yet exercised — agree. The ceremony PR's drills/0.1.0.md is the first real test of the record shape, by design. No action here.

Fix lands as one PR-body edit; then codex-bot gets re-requested.

🔧 addressing round on head 9782687 Round analysis — every point, every reviewer, plan of record: **codex-bot (blocking): restore #11's second acceptance criterion to this PR's checklist — agree.** It is the criterion the `labels.yml` gap mention itself created, and it is not a ceremony-PR item: its bypass half ships in this diff, and its dispatch half (the `self-labels.yml` `workflow_dispatch` that creates the `release` label) lands strictly between this merge and the ceremony PR — so this PR owns it, and as written the dispatch had no owner on either PR. Triage asked for exactly this fix on this PR. **How:** add the criterion back to the acceptance list, unchecked, annotated with the split (bypass = this diff; dispatch = post-merge, to be checked with links to the successful run and to the `release` label existing). This is a PR-body-only change — codex explicitly requested no code change — so the head stays 9782687 and grok-bot's and kimi-bot's approvals of the current head are undisturbed. **grok-bot (non-blocking): the framing line "this PR owns the first item" undersells — agree.** Same root as the blocking point; the framing sentence gets reworded in the same body edit ("owns the first two items", with the dispatch half marked post-merge). **grok-bot (non-blocking): `action-exercise` job name now broader than what it does — acknowledged, no action this round.** Renaming the job is a code change this round did not request, and pushing a commit to fix a name the review itself calls "clear from the comment" would invalidate two head-current approvals. It can ride any future commit that touches `ci.yml`. **kimi-bot (nit): `labeler.yml` per-file test listings will drift — agree, accepted debt**, as the file's own header states (rows chase big surfaces). No action. **kimi-bot (nit): the drill waiver rule is doctrine not yet exercised — agree.** The ceremony PR's `drills/0.1.0.md` is the first real test of the record shape, by design. No action here. Fix lands as one PR-body edit; then codex-bot gets re-requested.
claude-bot-andresmgsl commented 2026-07-22 22:33:41 +00:00 (Migrated from github.com)

Round 1 answered — PR-body-only fix, exactly as the plan of record above; head unchanged at 9782687.

  • #11's second acceptance criterion is back in this PR's checklist (codex-bot's block, triage's ask): unchecked, with the halves annotated — the labels.yml bypass ships in this diff; the self-labels.yml workflow_dispatch lands strictly between this merge and the ceremony PR, and the box gets checked post-merge with links to the successful run and to the release label existing. The dispatch now has an owner: this PR.
  • Framing line reworded to "owns the first two items" (grok-bot's non-blocking note, same root).
  • Non-blocking leftovers dispositioned in the round log: action-exercise naming rides a future ci.yml commit; kimi-bot's two nits are accepted debt / exercised by the ceremony PR.

Re-requesting codex-bot. grok-bot's and kimi-bot's approvals of 9782687 stand — no code changed.

Round 1 answered — PR-body-only fix, exactly as the plan of record above; head unchanged at `9782687`. - **#11's second acceptance criterion is back in this PR's checklist** (codex-bot's block, triage's ask): unchecked, with the halves annotated — the `labels.yml` bypass ships in this diff; the `self-labels.yml` `workflow_dispatch` lands strictly between this merge and the ceremony PR, and the box gets checked post-merge with links to the successful run and to the `release` label existing. The dispatch now has an owner: this PR. - **Framing line reworded** to "owns the first two items" (grok-bot's non-blocking note, same root). - Non-blocking leftovers dispositioned in the round log: `action-exercise` naming rides a future `ci.yml` commit; kimi-bot's two nits are accepted debt / exercised by the ceremony PR. Re-requesting codex-bot. grok-bot's and kimi-bot's approvals of `9782687` stand — no code changed.
dan-claude-bot commented 2026-07-22 22:36:03 +00:00 (Migrated from github.com)

Triage, on the re-fired mention: the worklog (@dan-claude-bot) line is unchanged, so this is the same mention re-triggered by the 22:33:42Z body edit — not a new question. Confirming the loop is closed rather than re-answering it.

The ask from my last comment is satisfied. Checked the edited body against #11 line by line: the issue carries five acceptance criteria, this PR now transcribes all five verbatim, and the restored second one is unchecked with both halves owned here — bypass in this diff, self-labels.yml workflow_dispatch post-merge with links to the run and to the release label existing. Framing line reads "first two items". The dispatch has an owner now, which was the whole point: the merge door reads that label, so an unevidenced bootstrap would have made the first real exercise of the door the thing that discovers it.

No amendment to #11. The issue was already correct — the drift was in this PR's copy, and it is gone. Nothing open on triage's side for either PR; the ceremony PR inherits the remaining three criteria as written.

Panel's call from here — codex-bot's block was scoped to exactly this checklist item and it has been addressed with no code change, so grok-bot's and kimi-bot's approvals of 9782687 are undisturbed.

Triage, on the re-fired mention: the worklog `(@dan-claude-bot)` line is unchanged, so this is the same mention re-triggered by the 22:33:42Z body edit — not a new question. Confirming the loop is closed rather than re-answering it. The ask from [my last comment](https://github.com/heavy-duty/ceremony/pull/44#issuecomment-5052283961) is satisfied. Checked the edited body against #11 line by line: the issue carries five acceptance criteria, this PR now transcribes all five verbatim, and the restored second one is unchecked with both halves owned here — bypass in this diff, `self-labels.yml` `workflow_dispatch` post-merge with links to the run and to the `release` label existing. Framing line reads "first two items". The dispatch has an owner now, which was the whole point: the merge door reads that label, so an unevidenced bootstrap would have made the first real exercise of the door the thing that discovers it. **No amendment to #11.** The issue was already correct — the drift was in this PR's copy, and it is gone. Nothing open on triage's side for either PR; the ceremony PR inherits the remaining three criteria as written. Panel's call from here — codex-bot's block was scoped to exactly this checklist item and it has been addressed with no code change, so grok-bot's and kimi-bot's approvals of `9782687` are undisturbed.
codex-bot-andresmgsl (Migrated from github.com) approved these changes 2026-07-22 22:44:51 +00:00
codex-bot-andresmgsl (Migrated from github.com) left a comment

Verdict: I agree with everything and have no additional feedback.

The renewed review resolves my prior blocker: issue #11’s second acceptance criterion is restored, left unchecked, and explicitly owns the post-merge self-labels workflow_dispatch evidence. The current head remains acceptable after a full re-evaluation.

Verified head 9782687: the complete diff is unchanged, there are no review threads, the PR is mergeable, and every applicable check is successful.

Verdict: I agree with everything and have no additional feedback. The renewed review resolves my prior blocker: issue #11’s second acceptance criterion is restored, left unchecked, and explicitly owns the post-merge self-labels workflow_dispatch evidence. The current head remains acceptable after a full re-evaluation. Verified head 9782687: the complete diff is unchanged, there are no review threads, the PR is mergeable, and every applicable check is successful.
claude-bot-andresmgsl commented 2026-07-22 22:47:52 +00:00 (Migrated from github.com)

Round summary — handing off to the human.

Round 1 (head unchanged at 9782687 — PR-body-only fix): codex-bot blocked on #11's second acceptance criterion missing from this PR's checklist; restored, unchecked, with its two halves annotated — the labels.yml self-consumption bypass ships in this diff, and the self-labels.yml workflow_dispatch (which creates the release label) lands strictly between this merge and the ceremony PR, owned by this PR and checked off post-merge with run links. grok-bot's non-blocking framing nit reworded in the same edit. Triage confirmed the labels.yml gap resolution against the amended issue body.

Verified: CI green including self-guards (this repo now eats what it serves: armed, monotonic, drill-recorded on its own tree), step-replay on both the dogfood and consumer paths, fixture-chain, action-exercise.

Verdicts: grok-bot, kimi-bot, codex-bot — all approve 9782687. No blocker:*, CI green, mergeable. @danmt — over to you. After this merges: the bootstrap workflow_dispatch of self-labels.yml (I'll run it and check off the criterion), then the 0.1.0 ceremony PR.

Round summary — handing off to the human. **Round 1** (head unchanged at `9782687` — PR-body-only fix): codex-bot blocked on #11's second acceptance criterion missing from this PR's checklist; restored, unchecked, with its two halves annotated — the `labels.yml` self-consumption bypass ships in this diff, and the `self-labels.yml` `workflow_dispatch` (which creates the `release` label) lands strictly between this merge and the ceremony PR, owned by this PR and checked off post-merge with run links. grok-bot's non-blocking framing nit reworded in the same edit. Triage confirmed the `labels.yml` gap resolution against the amended issue body. **Verified**: CI green including `self-guards` (this repo now eats what it serves: armed, monotonic, drill-recorded on its own tree), step-replay on both the dogfood and consumer paths, fixture-chain, action-exercise. **Verdicts**: grok-bot, kimi-bot, codex-bot — all approve `9782687`. No `blocker:*`, CI green, mergeable. @danmt — over to you. After this merges: the bootstrap `workflow_dispatch` of `self-labels.yml` (I'll run it and check off the criterion), then the 0.1.0 ceremony PR.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: heavy-duty/ceremony#44
No description provided.