docs/CONSUMERS.md — the published stub's issues: types are a subset of the caller's; a consumer never wakes on edited or reopened
#144
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#144
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
Found while answering a builder's spec question on #137, which asked whether the stale release-state notes in the same file should be folded into that issue. The notes were; this was not — it changes the published trigger contract, not prose. All line references pinned at
7b97554.Context
Ceremony's own labels caller and the caller stub
docs/CONSUMERS.mdpublishes are supposed to be the same file. Theirissues:type lists are not:(
self-labels.ymlL10-L11,CONSUMERS.mdL289-L290.)This is drift, not a decision. Both lists were written inside PR #32:
8174080wrote the stub, and70db91f("fix: wire dogfood issue reconciliation") later widened the caller byeditedandreopened. The stub never followed, and nothing in the docs claims the consumer wants a narrower list.Both missing types are load-bearing for the sweep the stub exists to wake:
edited—issueflow-reconcileparses theBlocked by #Ndeclaration out of the issue body (issueflow-reconcile.shL145, L328-L334). Editing that body is precisely the act that makes ablocked/readylabel wrong, and precisely the act a consumer gets no wake for. Adding a dependency to an issue already labelledreadyleaves it lying until the next unrelated issue event or the advisory cron.reopened— a reopened issue re-enters the queue with labels derived when it closed, and no event announces it.Same failure shape as #137, one surface over: the event that falsifies the label is the event nobody listens for. Ceremony itself is covered; every consumer adopting the published stub is not.
Spec
issues:types become byte-identical to the caller's, including order:[opened, edited, assigned, unassigned, labeled, unlabeled, closed, reopened]. The caller is the source of truth; the stub follows it.pull_request_targetlists are identical, deliberately scoped to that list because this one was already drifted. Extend that row's helper to theissues:list, with the same failing cases. After this lands, a type in one file only is red on either list.self-labels.ymlto close the gap; both earn their wake per the Context.0.2.0and adopts at the pin bump to the first tag carrying this issue. If #137 lands in the same tag, one sentence covers both stub edits — do not write two competing adoption notes.scopejob is untouched. It is gated ongithub.event_name == 'pull_request_target'(labels.ymlL33-L38), so noissues:action can reach it. Nothing to exclude.Tasks
docs/CONSUMERS.md: replace the stub'sissues:types with the caller's list, verbatim.docs/CONSUMERS.md: state the adoption cost per D4, folded into whichever adoption sentence #137 left behind.test/labels.test.sh: extend the caller/stub parity row to theissues:list.changelog.d/144.md.Acceptance criteria
issues:type lists are byte-identical,editedandreopenedincluded.test/labels.test.shgoes red if either file drops a type from either list, or if the twoissues:lists drift apart.CONSUMERS.mdcarries exactly one adoption note covering every pending stub edit, naming the tag.self-labels.ymlstill lists all eight types.actionlintand the full local suite are green.Test plan
editedfrom the caller → red; drop it from the stub → red; reorder one list only → red.actionlinton the caller.Dependencies
Related to #137 — same two files, same parity row, and #137's row is scoped to
pull_request_targetso that this one can extend it rather than fight it. Not blocked by it: if this lands first, #137 extends the helper instead. Whichever lands second rebases onto the other's helper rather than duplicating it.🔨 Claiming — starting now. Plan: make the stub's
issues:list byte-identical to the caller's (D1), extend the caller/stub parity coverage to theissues:list with failing cases (D2), leave the caller at all eight types (D3), fold the adoption cost into one note per D4. Note on the #137 interplay: my PR #143 (for #137) is atstate:needs-humanwith thepull_request_targetparity row; this PR will be built against main, and whichever lands second rebases onto the other's helper as the issue specifies. Draft PR link to follow.Draft PR is up: #150. All five spec decisions covered; local suite and shellcheck green. Next: CI, then ready-for-review to the panel.
PR #150 is ready-for-review with the whole panel requested (codex, grok, kimi) on head
0b77d4b. Parked, shape 2: the round is awaiting its first verdicts, and every outstanding move belongs to the reviewers. Mid-draft, #143 (for #137) merged, so per this issue's lands-second clause the branch was rebased onto main, #137's parity helper generalized to cover both trigger lists, and both pending stub edits folded into the one adoption note. I'll pick the round up the moment all verdicts are in.