feat: centralize labels machinery #27
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#27
Loading…
Reference in a new issue
No description provided.
Delete branch "build/10-labels-machinery"
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?
Closes #10
Acceptance criteria
.github/workflows/labels-bootstrap.yml(PR #22) is DELETED in this issue's PR — its dispatch carries the same table this workflow's bootstrap absorbs, and two registries of one taxonomy is exactly the drift this repo exists to end. Grep the tree forlabels-bootstrapafterwards; zero hits.labels.confformat, "run workflow_dispatch once to bootstrap labels on a fresh repo".Changelog
CHANGELOG.mdexists yet; #11 owns the dogfood release files. This PR does not widen scope by creating it early.Round log
labels-bootstraptree hits.Port audit against the issue-pinned box source. The diff is limited to the source-test guard/path, extracted panel + author recusal, core/scope table split, issue-flow bootstrap rows, and configuration wiring:
🔎 reviewing head
1ff660f539c02e683c9d2c007932dc9fa614d9a7🔎 reviewing head
1ff660f539🔎 reviewing head
1ff660f539Verdict: Approve — I agree with this as-is.
First review of tip
1ff660f(reconciler + tests + safety docs). Closes #10.What holds
labels-bootstrap.ymlgone; tree has zero residuallabels-bootstraphits.load_config/labels.conf, author recusal viaREQUIRED_BOTS, core vs scope table split, issue-flow labels (needs-triage/ready/claimed/epic).set_required_bots+ fixture; state machine iteratesREQUIRED_BOTSonly.pull_request_target, base-only checkout, concurrency groups, and the labeled-wake story. Consumer caller stub + bootstrap dispatch indocs/CONSUMERS.md.labels-reconcile.test.sh72/0 (upstream machine),labels.test.sh8/0 (config/recusal). Ran locally. CI green.action.ymlis not a workflow).Nits (non-blocking)
CEREMONY_SELF_REF: "0.1.0"is a forward pin until dogfood release — correct for consumers; self-dogfood needs a real tag later.REQUIRED_BOTS(solo-panel author edge) falls through to needs-human; not realistic with a multi-bot panel.No blockers.
Approve — head
1ff660f539c02e683c9d2c007932dc9fa614d9a7.I verified rather than trusted; what I ran and saw:
labels-reconcile.shat the issue-pinned SHAa17903fand diffed it againstactions/labels-reconcile/labels-reconcile.shmyself. My diff is byte-identical to the audit comment: source-test guard, panel extraction (BOTS→labels.conf), author recusal (REQUIRED_BOTSat the three iteration sites), core/scope table split + issue-flow rows, config wiring inmain(), and the two "three formal approvals" → "every required verdict" comment updates. No logic was refactored in transit — the state machine,checks_state, andreconcile_prare verbatim (context lines).labels-bootstrap.ymltable againstcore_label_rows+ ceremony'slabels.conf. Sole difference:blocker:drill-pending— correct per spec (issue #10's core list omits it; LABELS.md documents it as maintainer-created, the bot 403s on it).grep -ri labels-bootstrapover the tree: zero hits.test/run.sh: 72 + 8 checks, 0 failures. The fixture tests source the real script via the BASH_SOURCE guard (the boxtest/cli.shtrick the issue asked for) and load the reallabels.conf, so recusal is exercised against the actual 4-bot panel.shellcheck-all(7 scripts incl. the reconciler) andactionlint(both workflows) clean locally; CI green on this head.pull_request_targetsafety essay survives at both the header and the reconcile step, including the load-bearing sentence; per-PR scope concurrency, sharedlabels-reconcilegroup withcancel-in-progress: false, base-branch-only checkout,bootstrapwired toworkflow_dispatch— all per deliverable 2. The empty-reffallback on schedule events (norepositoryin that payload) resolves to the default branch tip via checkout's same-repo fallback, so cron runs are fine.action.ymlas a workflow and would have gone red on the first composite action this PR adds.Non-blocking notes, builder's discretion:
CEREMONY_SELF_REF: "0.1.0"is currently unguarded — the self-ref guard is #9's deliverable (test/self-ref.test.sh), and when it lands it must sweeplabels.yml's pin too, not just the release workflow's. Today nothing fails CI if this pin goes stale. (Harmless for consumers — they can only reach this file via a published ref that self-references consistently.).ceremony-srccheckout of a not-yet-existing tag fails before the first release.load_configmakeslabels.confmandatory for every consumer, which resolves the issue's mild tension ("missing conf is fine" for scopes vs "refuse loudly" for the panel) in the safe direction — an empty panel marking everything approved is the failure the issue names. CONSUMERS.md documents it as mandatory, so this is coherent; just flagging the deliberate resolution.✅ Approve — head
1ff660fReviewed the whole PR at the current head against issue #10's acceptance criteria, verifying rather than opining:
labels-bootstrap.ymlis gone and a tree-wide grep forlabels-bootstrapat this head returns zero hits.BOTSpanel extraction tolabels.conf, author recusal (REQUIRED_BOTSin exactly the three iteration sites), the core/scope table split, the four issue-flow rows, config wiring inmain, and the "three formal approvals" → "every required verdict" phrasing. No smuggled refactors.blocker:drill-pendingcorrectly stays out of bootstrap per LABELS.md's 403 note.actionlint-all.shchange is verified, not just claimed: actionlint does misclassifyaction.ymlas a workflow (exit 1, syntax errors) — excluding it is correct.name|color|description, blanks skipped, extra pipes refused), and the "dispatch once to bootstrap" note is there. (#12 is still open, so creating the file with this section is the right call; #12 will absorb it.)pull_request_targetsafety essay is preserved and still true (base-branch-only checkout, no PR code executed), scope job skipslabeled/unlabeled,sync-labels: false, per-PR scope concurrency, single sharedlabels-reconcilegroup withcancel-in-progress: false.CEREMONY_SELF_REFreuses #9's env name; the pin guard test itself is #9's acceptance criterion and can't exist before #11's VERSION/CHANGELOG land.Non-blocking nits, builder's discretion:
GITHUB_EVENT_NAME=workflow_dispatchinternally. It keeps the ported script verbatim and the workflow wires it exactly as the issue prescribed, so it's fine — but a one-line comment inaction.ymlsaying why the override is there would save the next reader a head-scratch.Round log note: the port audit comment, panel extraction, and recusal all check out as described.
Closing round summary
What shipped
.github/labels.conf.labels-bootstrap.yml, added consumer setup/bootstrap documentation, and adjusted the actionlint wrapper for composite actions.Review rounds
1ff660f539c02e683c9d2c007932dc9fa614d9a7): Claude, Grok, and Kimi independently approved the current head. No blocking findings and no code changes were required. Their audits confirmed the port delta was limited to the intended adaptations, the core table stayed exact, the interim bootstrap has no residual tree references, the workflow safety properties hold, and the acceptance criteria are met.Verified
testcheck: green on the current head.labels-bootstrapsearch: zero hits.blocker:*labels.Post-merge residue
CEREMONY_SELF_REFand must include the new labels workflow pin.The bot review round has converged; handing this PR to the human.