docs(contributing): document the blocker axis and merge-next ownership #139
Labels
No labels
blocked
blocker:ci-red
blocker:conflict
blocker:drill-pending
blocker:unrequested
bug
claimed
documentation
enhancement
epic
merge-next
needs-triage
ready
release
scope:cli
scope:drill
scope:host
scope:installer
scope:templates
scope:tiers
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/box#139
Loading…
Reference in a new issue
No description provided.
Delete branch "docs/contributing-blocker-axis"
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?
Follow-up to #138.
CONTRIBUTING.mdwas not touched by the two-axis refactor and is now stale in three places.What is wrong
The who-sets-what table never mentions
blocker:*. That table is the day-to-day answer to can I move this by hand, and it silently omits a whole machine-owned label family. The predictable failure is someone hand-applyingblocker:conflictto flag a PR, then being surprised when the next sweep strips it — or worse, removing one and assuming that unblocked something.merge-nextis missing too, and that gap predates this refactor — it arrived with #137 and was never documented here. It is also the row that most needs writing down, becausemerge-nextis the one label in the machine's vocabulary the machine deliberately does not set. A reader of this table would reasonably assume the workflow owns it like everything else.Step 6 overstates what a review request does. It reads as though requesting the maintainer is what flips
state:needs-human. Since #138 that is necessary but not sufficient: needs-human requires zero blockers, so the request does nothing on a conflicted or red PR. Someone following step 6 literally would request a review, watch the label not move, and have nothing telling them why.What this does
Three edits, no behaviour change:
blocker:*row — same workflow, same facts, any number per PR, never by handmerge-nextrow — yours or the queue agent's to set; the workflow only ever clears itAlso sharpens the
state:*row to say exactly one per PR: whose ball is it, since that contrast is what makes the two axes legible.LABELS.mdalready documents all of this correctly — it was updated in #138. This is purely the contributor-facing summary catching up.Verification
Docs only; no code paths touched. The same change goes to
heavy-duty/rigandheavy-duty/cast— the labels section ofCONTRIBUTING.mdis byte-identical across the three.Verdict: I agree with everything and have no additional feedback.
✅ Approved — I agree with all of this, no concerns.
Verified each claim against
.github/scripts/labels-reconcile.shat head rather than againstLABELS.md, since the point of the PR is that prose had drifted from behaviour:decide_state()(.github/scripts/labels-reconcile.sh:224) downgradesstate:needs-humantostate:addressingwheneverblockers()is non-empty, so a review request genuinely does not flip the label on a conflicted or red PR. The proviso is attached to the flip itself rather than to either request path, which is right: the automatic path at:330is gated on the same$desiredand is equally subject to it.blocker:*is a set, machine-owned —BLOCKERSat:35is three independent facts, and the converge loop at:349-355adds/removes each one on its own againstblockers(). A hand-appliedblocker:conflictis provably stripped on the next sweep, so "never by hand" is not just advice.merge-nextcleared, never set —:408-410is the only mention outside the bootstrap block; there is no add path. "The moment the PR stops being something a human could merge" is exactly[ "$desired" != state:needs-human ].state:*,blocker:*,merge-next, andstale; with these two rows the table now accounts for all four, plus the human-owned families. No remaining gap.Also confirmed the cross-repo claim: the added lines are byte-identical in
heavy-duty/cast#130andheavy-duty/rig#94(only the surrounding context and hunk offsets differ), and the reconcile scripts themselves are identical across all three apart from the per-reposcope:*label list — so the shared wording describes shared behaviour, not a coincidence.Docs-only, no behaviour change, and the sharpened
state:*row ("exactly one per PR: whose ball is it") against the newblocker:*row ("any number, or none") is what makes the two-axis split legible at a glance.— automated review by
claude-bot-andresmgsl· heavy-duty-review-botVerdict: Approve — I agree with this as-is.
Docs-only CONTRIBUTING catch-up after the two-axis label refactor. Checked the three prose claims against
.github/scripts/labels-reconcile.shon each tip (same script family across box/rig/cast):decide_statedowngradesstate:needs-humanwhenblockersis non-empty (:224), so a maintainer request alone does not flip the label on a conflicted/red PR.blocker:*row —BLOCKERSis a set converged from facts (:35,:349); hand-applied labels are stripped next sweep. "Never by hand" is accurate.merge-nextrow — clear-only path at:408-410when desired ≠needs-human; no machine set path. Ownership wording is correct.state:*sharpening — exactly-one / whose-ball contrast makes the axes legible.Cross-repo added lines are byte-identical; CI green. No blockers.
@danmt — handoff. All three bots approved on the current head; ready for your review.
Docs only, one file, +10/−5.
CONTRIBUTING.mdwas not touched by the two-axis refactor (box#138 / rig#90 / cast#129) and was stale in three places:blocker:*— a whole machine-owned family. That table is the day-to-day answer to can I move this by hand, so the omission invites someone to hand-applyblocker:conflictand be puzzled when the sweep strips it.merge-nextwas missing too, and that gap predates the refactor — it arrived with box#137 / rig#88 / cast#128 and was never documented here. It is the row that most needs saying, because it is the one label the machine deliberately does not set.state:needs-human. Since the refactor that is necessary but not sufficient — needs-human requires zero blockers, so the request does nothing on a conflicted or red PR.Clean round: no reviewer requested a change or suggested wording, so there are no round-replies on these threads.
The
## Labels — who sets whatsection and step 6 are byte-identical across box/rig/cast (md567c0d37d), verified on the three branch tips — by me and independently by two of the bots. These should land together.Live confirmation the refactor is working, from the board this documents: box#120 currently carries
blocker:conflictandblocker:ci-red. Under the single-axis design it could only ever have said one of them, and would have told an agent to rebase when what it owed was a test fix.One thing you already hit, worth writing down somewhere if it recurs: running
workflow_dispatchwithin a minute of merging lands in the window where GitHub still reportsmergeable: UNKNOWN, so no conflict blockers get applied on that pass. It is the deliberate anti-flap behaviour, and the next sweep corrects it — but the board looks wrong in the meantime.