feat: dogfood bootstrap — ceremony adopts its own ceremony #44
No reviewers
Labels
No labels
attention
blocked
blocker:ci-red
blocker:conflict
blocker:drill-pending
blocker:unrequested
bug
claimed
documentation
enhancement
epic
merge-next
needs-ruling
needs-triage
offsite
post-merge
ready
release
scope:docs
scope:guards
scope:labels
scope:release-flow
stale
state:addressing
state:bots-reviewing
state:building
state:needs-human
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: heavy-duty/ceremony#44
Loading…
Reference in a new issue
No description provided.
Delete branch "build/11-dogfood"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Part of #11 — the bootstrap PR, the first of the two PRs the issue structures (the
release: 0.1.0ceremony PR follows once this merges, and that one closes the issue).This repo adopts its own ceremony:
VERSIONat0.1.0-dev(bootstrapping at-devkeeps the family clear of the first-release edge — decide table state 4, cast#111), the armedCHANGELOG.mdwith 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:
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.ymlgains the self-consumption bypass (release.yml's twin) — flagged on the issue before building: the reconcile job unconditionally checked outceremony@0.1.0, a tag that cannot exist until the ceremony this bootstrap enables has run; the label-bootstrap dispatch (which creates thereleaselabel 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 exclusiveif:s because auses:path must be a literal..github/labeler.ymladded — the labels workflow's scope job (actions/labeler@v5) hard-fails without it, and CONSUMERS.md already names it consumer-owned..github/labels.confneeded nothing: it landed with #10.action-exercisereshaped 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 newself-guardsjob, 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.base_ver=(none), head is0.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.ymlonce viaworkflow_dispatchto bootstrap the taxonomy — that creates thereleaselabel 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.)
labels.ymlcarries the self-consumption bypass, and the bootstrapworkflow_dispatchofself-labels.ymlis shown succeeding on this repo — thereleaselabel exists before the ceremony PR is opened. (The bypass half ships in this diff — the reconcile split gated ongithub.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 thereleaselabel existing.)drills/0.1.0.mdrecords all six rehearsal probes with results. (ceremony PR)-devre-arm — the post-merge assert list, checked off with links. (ceremony PR)Changelog
## Unreleased— the#11self-adoption line, in the CHANGELOG.md this PR creates.Worklog
9782687Round 1 fixes (head
9782687, no code change)Round log
9782687— grok-bot ✅, kimi-bot ✅, codex-bot ❌): codex-bot blocked on the PR checklist omitting #11's second acceptance criterion (thelabels.ymlbypass + post-mergeself-labels.ymldispatch evidence) — restored, unchecked, with the bypass/dispatch halves annotated; framing line reworded (also grok-bot's non-blocking note).action-exercisejob 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'sdrills/0.1.0.md) acknowledged, no action. PR-body-only fix: head unchanged at 9782687; re-requested codex-bot.🔎 reviewing head
9782687bd7Triage, on the mention: the worklog's
(@dan-claude-bot)points at thelabels.ymlself-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 ongithub.repository != 'heavy-duty/ceremony', reconcile split into two mutually-exclusiveif: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:
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.ymlonce viaworkflow_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
releaselabel 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 labeledreleaseby 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.
Verdict: approve
Bootstrap PR for #11 (first of two; ceremony PR closes the issue). Reviewed whole head
9782687against the issue's bootstrap scope and the load-bearing constraints.Spec / acceptance (this PR's share)
self-guardssuccess on this head (run 29962507202); locally:test/run.sh11/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: armed (#45), monotonic (#46), drill-recorded (#47) — closed after capturelabels.ymlself-consumption bypassgithub.repository != 'heavy-duty/ceremony'; two mutually exclusiveuses:steps (literal paths — composite has no CEREMONY_DIR equivalent). Comment names #11 and release.yml's twin. Post-mergeworkflow_dispatchevidence for thereleaselabel is correctly sequenced after this merge, not claimable pre-mergeCeremony-PR criteria (
drills/0.1.0.md, tag/notes/-devre-arm, scratch-repo deletion) correctly left unchecked.Implementation checks
0.1.0-dev— first-release edge avoided (decide table / cast#111).uses:only; never-copy warning is loud; triggers/permissions match the guide (singlepush:key with both filters — last-key-wins trap avoided).README(not.md) matches the real filename.self-guardsexercises the three composites against the real tree withfetch-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.(none), head0.1.0-devchanged → NOTICE no-op; self-release lands with the merge so the door is live and correctly idle.0.1.0== VERSION with-devstripped (pre-first-release rule).Non-blocking
action-exercisenow only constructs a monotonic history; the name is slightly broader than the job, but the comment is clear.No blockers. Approve.
🔎 reviewing head
9782687bd7Approve — 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:
changelog-armed(0.1.0-devagrees with## Unreleased),drill-recorded(dev tree, nothing to assert),changelog-monotonicagainst the merge base (no CHANGELOG.md at base — containment vacuous by construction here, and the constructed-historyaction-exercisejob keeps a non-vacuous containment run standing). CI agrees: self-guards green on run 29962507202 at9782687.failure, and each failed exactly its own guard step (changelog-armed,changelog-monotonic,drill-recordedrespectively) in the self-guards job. The acceptance criterion as written is met.self-ref-check.shpasses at this head — pin0.1.0agrees withVERSIONminus-dev(no stamped section yet), matching the issue's triage correction that the guard stays green across both PRs.labels.ymlbypass is correct and faithful to the triage-accepted fix (#11 comment): the.ceremony-srccheckout is gated ongithub.repository != 'heavy-duty/ceremony', the dogfood step runs./actions/labels-reconcilefrom the base-branch checkout, and theif:s are mutually exclusive. The load-bearing comment naming #11 is there. Consumers' path is byte-unchanged.self-release.yml/self-labels.ymlmatch the CONSUMERS.md stubs with exactly one deviation (localuses:), and both carry the NEVER-copy warning — as the issue demands.VERSION→ decide row 2, green NOTICE no-op. The claim checks out against the diff (VERSION and CHANGELOG.md are new files).node/jq/npm/shellcheck/actionlintnot installed on my machine — CI'stestjob (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 underscope:release-flow/scope:guardswill drift as tests are added — the header already says the rows chase big surfaces, so this is accepted debt, just noting it.drills/README.mdwaiver paragraph (WAIVED and why) is doctrine not yet exercised; fine for the bootstrap, the ceremony PR'sdrills/0.1.0.mdwill be the first real test of the record shape.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.
🔧 addressing round on head
9782687Round 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.ymlgap mention itself created, and it is not a ceremony-PR item: its bypass half ships in this diff, and its dispatch half (theself-labels.ymlworkflow_dispatchthat creates thereleaselabel) 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 thereleaselabel existing). This is a PR-body-only change — codex explicitly requested no code change — so the head stays9782687and 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-exercisejob 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 touchesci.yml.kimi-bot (nit):
labeler.ymlper-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.mdis 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.
Round 1 answered — PR-body-only fix, exactly as the plan of record above; head unchanged at
9782687.labels.ymlbypass ships in this diff; theself-labels.ymlworkflow_dispatchlands strictly between this merge and the ceremony PR, and the box gets checked post-merge with links to the successful run and to thereleaselabel existing. The dispatch now has an owner: this PR.action-exercisenaming rides a futureci.ymlcommit; 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
9782687stand — no code changed.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.ymlworkflow_dispatchpost-merge with links to the run and to thereleaselabel 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
9782687are undisturbed.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.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 — thelabels.ymlself-consumption bypass ships in this diff, and theself-labels.ymlworkflow_dispatch(which creates thereleaselabel) 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 thelabels.ymlgap 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. Noblocker:*, CI green, mergeable. @danmt — over to you. After this merges: the bootstrapworkflow_dispatchofself-labels.yml(I'll run it and check off the criterion), then the 0.1.0 ceremony PR.