fix: surface wholly blind label sweeps #96
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#96
Loading…
Reference in a new issue
No description provided.
Delete branch "build/95-labels-blind-sweep-warning"
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 #95
Acceptance criteria
checks: readandstatuses: readexit 0remain byte-identicaltest/run.shis greenWorklog
🔎 reviewing head
1d3e98497d🔎 reviewing head
1d3e98497dVerdict: approve
Closes #95. Reviewed head
1d3e98497d8912357f03e51c5600fab4fba4a4b8against the issue's acceptance criteria and the repo's "decisions live where a test can reach them" discipline.Acceptance criteria
checks: read+statuses: readwith reasons; original three unchangeddocs/CONSUMERS.mdstub has all five; each new line carries its reasonstate:*axis, not a red run.github/workflows/self-labels.ymlhas the same five::warning::naming both permissionsblind_sweep_warningand the wiring inmainexit 0byte-identicallog "#$n: could not read mergeability/checks — left alone this pass"/exit 0unchangedtest/run.shgreenlabels-reconcile: 120 passedDesign / code
blind_sweep_warning unreadable total— counts in, annotation or empty out, no API/globals. Matches the decide.sh pattern the issue required.MUTATION:lines and two skip messages).Verification
./test/run.shin a detached worktree at this head: all green.test,self-guards, labels scope/reconcile, release-exercise fixtures, etc.).## Unreleasedpresent and correctly placed above existing entries.No blockers. Non-blocking note only: unreadable counting greps the frozen skip string rather than a structured signal — fine while that string is an AC invariant; if the skip message ever changes, the counter must move with it (the unit tests would catch a silent break).
Approve — head
1d3e984.Reviewed the whole PR at the current head in a detached worktree, checked every acceptance criterion of #95 against the diff:
docs/CONSUMERS.mdaddschecks: read/statuses: read, each with an inline reason comment; the original three are unchanged.none, public repos read anyway, private failure shows as an emptystate:*axis, not a red run). No duplication elsewhere in the guide..github/workflows/self-labels.ymlgrants the identical five.blind_sweep_warningfires only whentotal > 0 && unreadable == total; direct unit coverage of all three cases (3/3 warns and names both permissions; 1/3 silent; 0/0 silent).labels-reconcile.sh:632and itsexit 0are untouched; the sweep detects the blind case by exact-linegrep -qxFon the existing message rather than re-deriving it, so the message stays the single source.blind_main_probewith a mockedghproves a wholly blind sweep emits exactly one::warning::naming both permissions, performs zero PR mutations, and still runs the per-PR skip for each PR. This is the must-fail case from the test plan done right: the warning is a signal, not a new write path.## Unreleased, correctly placed.Verification: I could not run
test/run.shlocally — this box has nojqornode, and the suite fails identically onmain(8 passed / 7 failed both trees), so local red is environmental. CI on the head sha is authoritative and green:testjob reportslabels-reconcile tests: 120 passed, 0 failed(includes the nine new expectations),self-guards(shellcheck/actionlint) passes, and all exercise jobs pass.One non-blocking observation: output is now captured per-PR and reprinted instead of streamed, which changes log interleaving across PRs — arguably an improvement (no cross-PR interleave), and within-PR ordering is preserved.
🔎 reviewing head
1d3e98497dVerdict: approve
Head
1d3e98497d8912357f03e51c5600fab4fba4a4b8, reviewed in a detached worktree against #95's spec and acceptance criteria.Acceptance criteria
docs/CONSUMERS.mdlabels stub addschecks: read/statuses: read, each with a one-clause comment naming the read; the original three are byte-unchanged. The only other permission block in the guide (the release caller, ~L187) is a different workflow's list, so the "guide must not disagree with itself" clause is satisfied vacuously — there is no second labels list to update.none, public repos read anyway, private failure is an emptystate:*axis rather than a red run..github/workflows/self-labels.ymlcarries the identical five.::warning::naming both permissions — met.blind_sweep_warningfires only ontotal > 0 && unreadable == total; the annotation text names both reads and the private-repo cause.1 3→ empty,0 0→ empty).exit 0are untouched; the sweep detects blindness bygrep -qxFon the exact logged line (log()prefixeslabels:, and the match string carries it), so the frozen message stays the single source rather than being re-derived.test/run.shgreen — met, ran locally at this head: 15/15 files,labels-reconcile: 120 passed, 0 failed.Design
main()wiring is asserted separately by the mocked-ghprobe.total/unreadablemutate in the parent shell; the skip pathexit 0s, so theelif [ "$status" -ne 0 ]failure branch can never swallow an unreadable PR.totalbut notunreadable, so a full GitHub incident suppresses the warning rather than crying wolf — the annotation targets exactly the permanent-misconfig signature (every PR politely skipped), which is the defect #95 documented.MUTATION:lines — the warning is a signal, not a write path.Verification
./test/run.shat this head in a clean worktree: all 15 files pass (this box has jq/node; the 120 labels expectations include the eight new ones —expect()is silent on pass, so I confirmed the count delta rather than grepping for names).labels / reconciledogfood pass included.## Unreleased.Non-blocking observations
2>&1and reprinted to stdout, so the sweep's stderr/stdout separation is gone and logs are buffered per PR instead of streamed. Harmless under Actions (annotations still parse; within-PR ordering preserved, cross-PR interleave actually improves), but if anything ever consumes the streams separately, this is where that changed.grep -qxFwith it; the probe'sexpect ... still runs for every blind PRwould catch a silent break.No blockers.
Round summary
Current head:
1d3e98497d8912357f03e51c5600fab4fba4a4b8grok-bot-andresmgsl,kimi-bot-andresmgsl, andclaude-bot-andresmgsleach approved this exact head.checks: read/statuses: readpermissions in the published and dogfood callers, the documented private-repository asymmetry, the pure wholly-blind-sweep warning decision, silence for partial/no-PR cases, and preservation of the per-PR skip behavior../test/run.shpasses 15/15 files with 120 labels-reconcile expectations; all required CI jobs are green; the head is mergeable with noblocker:*labels.Ready for human review.