fix: align needs-triage label description #266
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
4 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: heavy-duty/ceremony#266
Loading…
Reference in a new issue
No description provided.
Delete branch "build/265-needs-triage-description"
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?
Refs #265
Summary
Align the fleet-wide
needs-triagetooltip and retired-label comment with the proposal intake doctrine, with focused regression guards.Worklog
origin/main.changelog.d/265.mdunder### Fixed.git diff --check.Acceptance criteria
core_label_rowsemitsneeds-triage|FBCA04|Did not come through triage — owes normalization into work or a reasoned refusalexactly once, byte-exact, and emits no otherneeds-triagerow.git grep -i discussion -- actions/labels-reconcile/labels-reconcile.shreturns nothing at the PR head.retired_label_names()comment names the proposal path, matchingLABELS.md; the six returned names are unchanged and the doctrine-identity case remains green.test/labels.test.shcarries a case that fails on the pre-change reconciler and passes after, with both runs recorded verbatim.git diff origin/main..HEAD --statnames exactlyactions/labels-reconcile/labels-reconcile.sh,test/labels.test.sh, andchangelog.d/265.md;LABELS.mdremains byte-identical.bash test/run.sh,git diff --check, and the sanctioned shellcheck sweep are green.changelog.d/265.mdcarries a grouped### Fixedentry naming #265.TDD evidence
Pre-change focused run at
0ea0cf5(expected RED):Post-change focused run at
53b7856(GREEN):Near-miss mutation (dropped
a) failed the byte-exact guard as intended while the no-discussion guard stayed green:Whole-suite and lint evidence at
53b7856:Round log
Round at
53b78560Round passed with no written reply.
📣 round answered at head
53b7856012WIP: fix: align needs-triage label descriptionto fix: align needs-triage label description🔎 reviewing head
53b7856012needs-triage|row in the tree.git grep -i discussion -- actions/labels-reconcile/labels-reconcile.sh→ exit 1, no output.retired_label_names()comment matchesLABELS.md:245; the six-name body is byte-identical toorigin/main;test/labels-reconcile.test.sh258 passed.44 passed, 2 failed, matching the recorded RED run; three near-miss mutations each go red on the byte-exact guard.LABELS.mduntouched.test/labels.test.sh46/0;.github/scripts/shellcheck-all.shexit 0;git diff --checkclean. Whole-suite: 28/3 here, the three failures allyq: command not found(absent in this box), files this PR does not touch; CI at this head issuccessacross 7 statuses.changelog.d/265.md### Fixed+ names #265; matches thegroupedsentinel.Verdict submitted: approve at this head.
🔎 reviewing head
53b7856012git grep -i discussion -- actions/labels-reconcile/labels-reconcile.shreturns nothing.git diff --checkclean.bash test/run.shhas unrelated package-json failures because this box has no node; the PR-touching test files are green.🔎 reviewing head
53b78560120ea0cf5(44 passed, 2 failed, same lines as PR record) and GREEN at head (46/0); near-miss mutation (dropped "a") reproduced → byte-exact guard red### Fixed, names #265Refs #265present, no closing keyword near #265 anywhere in body (grep + CI refs-not-closing green); board refresh half is post-merge/operator-owned by specApprove.
This PR meets the acceptance criteria from #265:
core_label_rows()now emits the exactneeds-triagerow specified in the issue, and only once.actions/labels-reconcile/labels-reconcile.shcontains no "discussion" mention.retired_label_names()comment is updated to matchLABELS.md#L245; the six retired names andtest/labels-reconcile.test.sh’s LABELS.md-identity case remain unchanged and green.test/labels.test.shcarries both regression guards and fails on the pre-change reconciler (44 passed, 2 failed) while passing after the fix (46 passed, 0 failed).actions/labels-reconcile/labels-reconcile.sh,test/labels.test.sh, andchangelog.d/265.md;LABELS.mdis byte-identical.changelog.d/265.mdis a grouped### Fixedfragment citing #265.git diff --checkis clean and the sanctioned shellcheck sweep is green across 64 tracked scripts.Verification gap: the full
bash test/run.shrun reports failures only in thepackage-jsoncases oftest/changelog-armed.test.sh,test/drill-recorded.test.sh,test/facts.test.sh, andtest/version.test.sh, all because this box has nonodeinstalled (version_read: node is required for version-source: package-json). Those failures are unrelated to the files this PR touches and were not part of the issue’s test plan.Approve — every acceptance criterion of #265 verified at head
53b7856012c5fa0fbb66fe6b29716c86086cbac1, each by running it in a detached throwaway worktree, not by reading alone.Criterion-by-criterion (all run at the head):
core_label_rowsemitsneeds-triage|FBCA04|Did not come through triage — owes normalization into work or a reasoned refusalexactly once (grep -cxF → 1), no otherneeds-triagerow, and the row still splits into exactly 3|-fields.git grep -i discussion -- actions/labels-reconcile/labels-reconcile.shreturns nothing (rc=1).retired_label_names()comment now reads "aquestionbelongs in a proposal, not a work issue", matching LABELS.md:245; the six returned names are unchanged;test/labels-reconcile.test.shis green (258 passed, 0 failed), covering both the LABELS.md-identity case andexpected_upserts.0ea0cf5(tests-only commit over old reconciler)test/labels.test.shfails exactly the two recorded cases (44 passed, 2 failed, same FAIL lines as the PR body); at the head it is 46/0. Also reproduced the near-miss probe: dropping the "a" from "a reasoned refusal" turns the byte-exact guard red while the no-discussion guard stays green, then reverted.git diff origin/main..HEAD --statnames exactly the three authorized files; per-commit files are also exactly those;LABELS.mddiff is empty (byte-identical).bash test/run.sh→ 31 test files, 0 failed;git diff --checkclean;.github/scripts/shellcheck-all.shlints 64 tracked scripts, clean.changelog.d/265.mdexists with a grouped### Fixedheading per thegroupedshape sentinel and names #265, matching sibling fragments' shape.Refs #265and a mechanical scan of the whole body finds no closing keyword against #265 anywhere (the CIrefs-not-closingguard is green at head too). The live-board bootstrap refresh half is post-merge and operator-owned exactly as #265 specifies — correctly not attempted here.Constraints/conventions: base is
origin/main(0533766), two commits, conventional title, test file keepsset -u, new cases sit beside theattentionprecedent using the samecheckrc/output contract, shellcheck disables are annotated with why. No workflow, action, or YAML surface is touched, so no new third-party-action or token exposure exists.What I could not verify and relied on instead:
actionlintis not installed on this box — irrelevant to this diff (no workflow/action files changed) and covered by CI, whose combined status issuccessat this head (test, release-exercise, self-guards, action-exercise, docs-sync-exercise, labels, refs-not-closing). CI job internals themselves I take from the forge statuses; every locally runnable claim I re-ran myself.Non-blocking nit (address at discretion): none of substance — the changelog prose paraphrases the row rather than quoting it, which is the right register for CHANGELOG.md.
Approve — head
53b7856012c5fa0fbb66fe6b29716c86086cbac1. On panel (panel=in.github/labels.conf), author recused.Reviewed the whole PR at this head in a detached worktree, against #265's spec and acceptance criteria.
What I ran
:718against #265 spec item 1git grep -i discussion -- actions/labels-reconcile/labels-reconcile.shbash test/labels.test.sh46 passed, 0 failedbash test/labels-reconcile.test.sh258 passed, 0 failed(theLABELS.md-identity andexpected_upsertscases both green)bash .github/scripts/shellcheck-all.shgit diff --check origin/main..HEADgit diff origin/main..HEAD --name-onlyLABELS.mdbyte-identicalThe TDD claim reproduced, not taken on trust
I copied the head tree, restored
origin/main'slabels-reconcile.shunderneath the new tests, and got exactly the RED run the PR records:The test plan's near-miss requirement holds under three separate mutations of the row, each of which leaves the no-discussion guard green and takes only the byte-exact guard red:
a reasoned refusal→reasoned refusal→45 passed, 1 failedinto work→to work→45 passed, 1 failed45 passed, 1 failedSo
grep -cxFis a real guard here and not a paraphrase-tolerant one — including on the character most likely to rot in a copy-paste.Criteria
needs-triagerow in the emitted table, byte-exact to the spec string, and the only occurrence of that sentence in the tree.discussionanywhere in the reconciler. The mentions #265 named as deliberately kept are all still present and untouched (.github/scripts/release-path.sh:2,RELEASES.md,docs/CONSUMERS.md,drills/0.2.0.md);LABELS.md:141's "Active discussion" is ordinary prose, not the intake path.:726comment now reads "aquestionbelongs in a proposal, not a work issue", matchingLABELS.md:245word for word. I diffed the function body againstorigin/main: identical, so the six names are unchanged and the doctrine-identity case stays green — confirmed by running it.actions/labels-reconcile/labels-reconcile.sh,test/labels.test.sh,changelog.d/265.md.changelog.d/265.mdcarries### Fixedand names #265, matching thegroupedsentinel inchangelog.d/shape.Refs #265with no closing keyword preceding the number anywhere in the body (I scanned forclose/fix/resolveforms and the### Fixedmention is separated from#265by intervening words, so GitHub's linker cannot bind them). That is the shape #265 asks for.What I could not verify here, and what I relied on instead
bash test/run.shwhole is not green in my box:28 passed, 3 failed. Every one of those failures isyq: command not foundintest/labels-bootstrap.test.sh,test/labels-dispatch.test.shandtest/labels-triggers.test.sh—yqis not installed here. None of those three files is touched by this PR, and none exercisescore_label_rows. I relied on CI at this head, which reportsstate: successacross 7 statuses includingCI / test, for the 31-file green the PR records.needs-triagedescription is not changed by this merge and I did not try to change it; that is criterion 8's mechanism, post-merge and not the builder's.One non-blocking nit
The byte-exact guard pins this row's wording, but it does not enforce criterion 1's second clause — "emits no other
needs-triagerow". I injected a second row,needs-triage|FBCA04|Some other wording entirely, alongside the correct one:grep -cxFstill counts 1, the no-discussion guard stays green, and the whole suite reports46 passed, 0 failed. A duplicate of the same row is caught; a differently-worded second one is not. This is the same shape as the pre-existingattention_rowprecedent the spec pointed at, and #265's spec item 4 asked for exactly the two cases that are here, so it is not a defect against the issue — acore_label_rows | grep -c '^needs-triage|'equal to1would close it whenever someone is next in this file. Builder's discretion.The fix is right, the wording is doctrine's, and the guard earns its place.
🧭 board note at head
53b7856— measured 2026-08-25T21:58Z. No labels written.Three
state:*labels stand at once, againstLABELS.md's "exactly one per open PR". From the label events, not the label list:state:addressing— 20:32:02Z, by the reconcilerstate:bots-reviewing— 21:38:50Z, hand-setstate:needs-human— 21:51:00Z, hand-setPR states are machine-owned, so triage reports this and does not hand-write one; the scheduled sweep recomputes. It has not fired.
actions/tasksshows no run of any workflow created in this repo since 21:38:25Z, so neither the 21:38:50Z nor the 21:51:00Zlabeledevent produced the validating sweep LABELS.md promises "within seconds" on a same-repository head. Last sweep run: 20:50:49Z (schedule). The wake condition is a sweep run, not anything the builder owes.The handoff's two halves, measured independently rather than read off the label:
APPROVEDat53b7856, the current head.andrescarries a liveREQUEST_REVIEWrow from 21:51:00Z.53b7856ispending, notsuccess. Six contexts aresuccessat 21:37Z, butRefs guard / refs-not-closingposted a freshpendingstatus at 21:50:57Z and no run was created for it. The three earlierrefs-not-closingruns on this head (21:37:31Z, 21:38:19Z, 21:38:25Z) were all green, so this is a re-fired check with no runner behind it, not a new verdict.So
state:needs-human— "a human could merge this right now" — is not yet true in its zero-blockers half. A queued check is not a failed one: noblocker:*is owed, and this is not an escalation.This is the third measured instance of a hand-set state going unvalidated on this instance (!249 2026-08-24T15:22Z, !264 2026-08-25T18:21Z, here). The review verdicts above stand on their own; only the board's state labels and the CI rollup are affected.