LABELS.md + issueflow-reconcile — post-merge: the fourth queue state, for a merged PR whose acceptance criteria remain
#175
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#175
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?
Context
The board has no way to say "the PR landed; post-merge acceptance criteria remain." Discussion #172 collected one evening's cost of that gap, all four failure modes live on incubator's board the same night: state riding in prose re-stated every comment (the
attentionlesson from #83, inverted), the operator readingclaimedas "builder still owes work" (incubator#55), the 48h reclaim unable to tell a parked post-merge claim from a stale one, and two independent duty loops treating a mergedbuild/*branch under a still-openclaimedissue as interrupted work (phantom resumes, patched per-box in crew#19 and in the shared engine in crew#16 — bridges, because the board doesn't carry the fact).The doctrine half already exists: #151's contract made a post-merge criterion carry
Refs #N, triage-owned close, in the criterion itself (TRIAGE.md L88–L99, BUILDER.md L123–L132). This issue gives that contract its queue state.Code this touches, pinned at
486bbd1:QUEUE_LABELS), L94–L118 (claim decisions), L270–L307 (conflict message + the claimed block that would reclaim a parked post-merge claim today).core_label_rows(), the registry the bootstrap upserts from.Decisions below were converged on the discussion (triage and codex aligned on all three open questions; operator's re-entry ruling recorded 23:01Z).
Spec
post-merge, the fourth work-queue label. Color#006B75. Means: the Refs-linked PR merged; post-merge acceptance criteria remain; the claim is released — nothing here is buildable and nobody owes a draft. Set by the sweep or by triage; the exactly-one invariant becomesready/claimed/blocked/post-merge. Rejected names, for the record:verifyingasserts activity that is false during an external wait;landeddescribes the PR, not the issue.claimed → post-mergeand clears the assignee when a merged PR referencing the issue withRefs #Nexists and the issue body still carries unchecked checkboxes. How merged PRs are gathered is the builder's detail (the open-PR scan atOPEN_PR_ISSUESis the shape to extend). Non-triggers, each deliberate: an open PR (nothing landed); aCloses-linked merge (the close itself is the event; a hand-reopened #137-shape issue is triage's, not the sweep's); a merged Refs PR with zero unchecked boxes (that is a triage close, and the sweep never closes).needs-ruling.blocked(the wait lives in the transition comment, not on a second queue label); never withattention(assignee-clear is part of the invariant — there is nobody parked-for);needs-rulingstill composes. Apost-mergeissue carrying an assignee is flagged, not repaired — a hand-assign is intent, and the sweep does not undo the operator's hand.post-merge. No claim, no clock: apost-mergeissue quiet for weeks is the state working, not staleness.ready, no special standing (operator ruling, 2026-07-24 23:01Z): when the remainder becomes buildable, triage flipspost-merge → readyor mints a fresh issue; any builder claims from currentmain; the original builder has no standing andattentionis not set on re-entry.post-mergein its label list.Tasks
LABELS.md: thepost-mergerow, the four-state invariant sentence, the sweep paragraph (transition, transition comment, reclaim exemption), and the composition sentences (D4).TRIAGE.md: the post-merge-criterion bullet points at the state; transition-comment ownership and re-entry (D3, D6).BUILDER.md: theRefs #Nparagraph says the merge releases the claim — the builder walks away at merge and does not holdclaimedthrough the wait.actions/labels-reconcile/labels-reconcile.shcore_label_rows(): thepost-merge|006B75|...row (and whatever registry-count assertions pin it intest/labels-reconcile.test.sh).actions/issueflow-reconcile/issueflow-reconcile.sh:QUEUE_LABELSgainspost-merge; the D2 transition + assignee clear + D3 comment; the D5 exemption; the D4 assignee-present flag; the conflict-message text.test/issueflow-reconcile.test.sh: the cases in the test plan, with the sweep-body paths in an executed subprocess (#91's lesson).changelog.d/fragment.Acceptance criteria
claimedissue whose Refs-linked PR merged with unchecked boxes is, one tick later:post-merge, unassigned, with the transition comment naming the unchecked criteria and the triage-owes-completion line.post-mergeissue with no open PR and no activity for over 48 hours is untouched — no reclaim comment, no relabel.claimed+post-mergetogether draws the conflict flag, and the flag's message lists all six labels.ClosesPR, and a merged Refs PR with zero unchecked boxes each leave the issue exactly as found.post-mergeissue with an assignee is flagged, not unassigned.LABELS.md,TRIAGE.mdandBUILDER.mdall carry the same word,post-merge, and the release-at-merge / re-entry doctrine (D3, D6).Refs #N, notCloses #N: after the operator's next labels bootstrap dispatch,post-mergeexists on this repo and the missing-core-labels warning does not fire on the following sweep.Test plan
Must fail:
post-mergeissue → red.post-mergefrom its list → red.Boundaries: open Refs PR untouched; merged Closes PR untouched; merged Refs PR with all boxes checked untouched; hand-assigned
post-mergeflagged not unassigned;post-merge+needs-rulingcomposes without conflict.Control: existing reclaim behavior on a genuinely stale
claimedissue is byte-identical before and after.Dependencies
None — no open issue or PR gates this. From discussion #172. Related, not gating: #151 (the contract this labels), crew#16/crew#19 (engine-side bridges, out of scope per D8), discussion #122 (PR-side
state:*question, separate axis).Claimed by @codex-bot-andresmgsl. Starting build now on
build/175-post-merge-queue-state; I will open a draft PR after the first commit.The Refs-linked PR merged with these acceptance criteria still unchecked:
LABELS.md: thepost-mergerow, the four-state invariant sentence, the sweep paragraph (transition, transition comment, reclaim exemption), and the composition sentences (D4).TRIAGE.md: the post-merge-criterion bullet points at the state; transition-comment ownership and re-entry (D3, D6).BUILDER.md: theRefs #Nparagraph says the merge releases the claim — the builder walks away at merge and does not holdclaimedthrough the wait.actions/labels-reconcile/labels-reconcile.shcore_label_rows(): thepost-merge|006B75|...row (and whatever registry-count assertions pin it intest/labels-reconcile.test.sh).actions/issueflow-reconcile/issueflow-reconcile.sh:QUEUE_LABELSgainspost-merge; the D2 transition + assignee clear + D3 comment; the D5 exemption; the D4 assignee-present flag; the conflict-message text.test/issueflow-reconcile.test.sh: the cases in the test plan, with the sweep-body paths in an executed subprocess (#91's lesson).changelog.d/fragment.claimedissue whose Refs-linked PR merged with unchecked boxes is, one tick later:post-merge, unassigned, with the transition comment naming the unchecked criteria and the triage-owes-completion line.post-mergeissue with no open PR and no activity for over 48 hours is untouched — no reclaim comment, no relabel.claimed+post-mergetogether draws the conflict flag, and the flag's message lists all six labels.ClosesPR, and a merged Refs PR with zero unchecked boxes each leave the issue exactly as found.post-mergeissue with an assignee is flagged, not unassigned.LABELS.md,TRIAGE.mdandBUILDER.mdall carry the same word,post-merge, and the release-at-merge / re-entry doctrine (D3, D6).Refs #N, notCloses #N: after the operator's next labels bootstrap dispatch,post-mergeexists on this repo and the missing-core-labels warning does not fire on the following sweep.The merge releases the claim; no builder owes a draft. Triage owes completion in a follow-up comment that names the owner and wake condition.
Completion follow-up per the transition above — owner and wake condition.
Build side is done and verified on
mainatede2767(PR #176): thepost-merge|006B75row incore_label_rows(),QUEUE_LABELS+ the D2 transition + D3 comment + D4 flag + D5 exemption inissueflow-reconcile.sh, the test-plan cases in both test files, the doctrine word in LABELS.md / TRIAGE.md / BUILDER.md, and the changelog fragment. Ticked in the body; one criterion remains.Remaining criterion — owner: @danmt. Wake condition:
post-mergeexists in this repo's label registry. The labels workflow's manual bootstrap dispatch onmaincreates it — the registry row is already there since #176. Triage cannot substitute: the label create returns 404 on this token, and the sweep's own attempt already failed live, see below.Known interim board noise, recorded so nobody chases it as a bug. This issue was the first live exercise of its own transition: the sweep fired at 10:31Z, wrote the comment above and released the claim, but
--add-label post-mergecannot apply a label the repo does not have — so this issue now carries no queue label, and the next sweep tick will addneeds-triage(the missing-queue-state repair). That is bootstrap ordering — the issue that introduces the fourth state necessarily merges before the dispatch that mints its label — not a sweep defect. After the dispatch: triage clears the interim label, verifies the missing-core-labels warning is gone on the following sweep, ticks the last criterion, and closes under #151's contract.I just ran the workflow, some else to close this?
Nothing else — closing now. The last criterion verified: your dispatch (run 30155221049, 10:51:50Z) created
post-mergein the registry, and the following sweep (run 30155570694, 11:03:24Z) ran with zero warnings — the missing-core-labels warning is gone. Interimneeds-triagecleared,post-mergeapplied (this issue is the label's first wearer), final box ticked in the body. All criteria met; closing under #151's contract.