fix: align needs-triage label description #266

Merged
andres merged 2 commits from build/265-needs-triage-description into main 2026-08-25 22:20:01 +00:00

Refs #265

Summary

Align the fleet-wide needs-triage tooltip and retired-label comment with the proposal intake doctrine, with focused regression guards.

Worklog

  • Claim #265 and create an isolated worktree from origin/main.
  • Add the byte-exact row guard and no-discussion guard.
  • Record the required pre-change RED run.
  • Update the emitted row and adjacent retired-label comment.
  • Prove the exact-row guard rejects a near-miss, then restore the specified row.
  • Add changelog.d/265.md under ### Fixed.
  • Run focused tests and the complete test suite.
  • Run the sanctioned shellcheck sweep and git diff --check.
  • Verify the branch changes exactly the three authorized files.

Acceptance criteria

  • core_label_rows emits needs-triage|FBCA04|Did not come through triage — owes normalization into work or a reasoned refusal exactly once, byte-exact, and emits no other needs-triage row.
  • git grep -i discussion -- actions/labels-reconcile/labels-reconcile.sh returns nothing at the PR head.
  • The retired_label_names() comment names the proposal path, matching LABELS.md; the six returned names are unchanged and the doctrine-identity case remains green.
  • test/labels.test.sh carries a case that fails on the pre-change reconciler and passes after, with both runs recorded verbatim.
  • git diff origin/main..HEAD --stat names exactly actions/labels-reconcile/labels-reconcile.sh, test/labels.test.sh, and changelog.d/265.md; LABELS.md remains byte-identical.
  • bash test/run.sh, git diff --check, and the sanctioned shellcheck sweep are green.
  • changelog.d/265.md carries a grouped ### Fixed entry naming #265.
  • Post-merge bootstrap verification remains operator/triage-owned as specified by #265.

TDD evidence

Pre-change focused run at 0ea0cf5 (expected RED):

ok: config accepts panel, blanks, and scope rows
ok: panel is parsed
ok: core and config rows merge
ok: attention core row is emitted once, byte-exact
FAIL: needs-triage core row is emitted once, byte-exact — exit 1, wanted 0
    0
FAIL: core label rows carry no stale discussion path — exit 0, wanted 1
    needs-triage|FBCA04|Did not come through triage — owes normalization or conversion to a discussion
ok: attention description survives label field splitting
ok: triage config is not parsed as a label row
ok: missing scope config is an empty table
ok: wrong field count fails loudly
ok: pipe in description is explicitly refused
ok: missing panel fails loudly
ok: PR author is recused from the required panel
ok: no bracketed row: panelist author gets panel minus self
ok: no bracketed row: outside author gets the whole panel
ok: bracketed author gets exactly its row
ok: unbracketed author beside a bracketed row is unchanged
ok: row order is irrelevant: bracketed row before panel=
ok: row order is irrelevant for the base panel too
ok: author inside its own bracketed row is still recused
ok: base panel is byte-identical with the bracketed rows deleted
ok: duplicate rows for one login fail naming the line
ok: a bracketed row naming zero reviewers fails loudly
ok: an empty login fails loudly
ok: a stray ] inside the bracket is refused as a bracket
ok: a non-login character in the bracket is refused
ok: a malformed bracket is refused as a bracket (D4)
ok: ...and never as a label row
ok: panela= is still a malformed label row, never a panel setting (D7)
ok: a bracketed row does not satisfy the mandatory panel=
ok: configured_label_rows returns the scope rows alone
ok: no panel[...] row reaches the bootstrap
ok: LABELS.md enumerates no repo's scope labels
ok: caller and stub pull_request_target lists are identical
ok: the caller lists both review-request wakes
ok: caller and stub issues lists are identical
ok: the caller lists exactly the queue-state-changing issue types
ok: a type dropped from the caller goes red
ok: a type dropped from the stub goes red
ok: a reorder in one list only goes red
ok: an issue type dropped from the caller goes red
ok: an issue type dropped from the stub goes red
ok: an issue-list reorder in one file only goes red
ok: the real conf and the real roster table name the same identities
ok: an identity in the conf but not the table goes red
ok: an identity in the table but not the conf goes red
44 passed, 2 failed

Post-change focused run at 53b7856 (GREEN):

ok: config accepts panel, blanks, and scope rows
ok: panel is parsed
ok: core and config rows merge
ok: attention core row is emitted once, byte-exact
ok: needs-triage core row is emitted once, byte-exact
ok: core label rows carry no stale discussion path
ok: attention description survives label field splitting
ok: triage config is not parsed as a label row
ok: missing scope config is an empty table
ok: wrong field count fails loudly
ok: pipe in description is explicitly refused
ok: missing panel fails loudly
ok: PR author is recused from the required panel
ok: no bracketed row: panelist author gets panel minus self
ok: no bracketed row: outside author gets the whole panel
ok: bracketed author gets exactly its row
ok: unbracketed author beside a bracketed row is unchanged
ok: row order is irrelevant: bracketed row before panel=
ok: row order is irrelevant for the base panel too
ok: author inside its own bracketed row is still recused
ok: base panel is byte-identical with the bracketed rows deleted
ok: duplicate rows for one login fail naming the line
ok: a bracketed row naming zero reviewers fails loudly
ok: an empty login fails loudly
ok: a stray ] inside the bracket is refused as a bracket
ok: a non-login character in the bracket is refused
ok: a malformed bracket is refused as a bracket (D4)
ok: ...and never as a label row
ok: panela= is still a malformed label row, never a panel setting (D7)
ok: a bracketed row does not satisfy the mandatory panel=
ok: configured_label_rows returns the scope rows alone
ok: no panel[...] row reaches the bootstrap
ok: LABELS.md enumerates no repo's scope labels
ok: caller and stub pull_request_target lists are identical
ok: the caller lists both review-request wakes
ok: caller and stub issues lists are identical
ok: the caller lists exactly the queue-state-changing issue types
ok: a type dropped from the caller goes red
ok: a type dropped from the stub goes red
ok: a reorder in one list only goes red
ok: an issue type dropped from the caller goes red
ok: an issue type dropped from the stub goes red
ok: an issue-list reorder in one file only goes red
ok: the real conf and the real roster table name the same identities
ok: an identity in the conf but not the table goes red
ok: an identity in the table but not the conf goes red
46 passed, 0 failed

Near-miss mutation (dropped a) failed the byte-exact guard as intended while the no-discussion guard stayed green:

FAIL: needs-triage core row is emitted once, byte-exact — exit 1, wanted 0
    0
ok: core label rows carry no stale discussion path
45 passed, 1 failed

Whole-suite and lint evidence at 53b7856:

test files: 31 passed, 0 failed
shellcheck: linting 64 tracked scripts

Round log

Round at 53b78560

Round passed with no written reply.

Refs #265 ## Summary Align the fleet-wide `needs-triage` tooltip and retired-label comment with the proposal intake doctrine, with focused regression guards. ## Worklog - [x] Claim #265 and create an isolated worktree from `origin/main`. - [x] Add the byte-exact row guard and no-discussion guard. - [x] Record the required pre-change RED run. - [x] Update the emitted row and adjacent retired-label comment. - [x] Prove the exact-row guard rejects a near-miss, then restore the specified row. - [x] Add `changelog.d/265.md` under `### Fixed`. - [x] Run focused tests and the complete test suite. - [x] Run the sanctioned shellcheck sweep and `git diff --check`. - [x] Verify the branch changes exactly the three authorized files. ## Acceptance criteria - [x] `core_label_rows` emits `needs-triage|FBCA04|Did not come through triage — owes normalization into work or a reasoned refusal` exactly once, byte-exact, and emits no other `needs-triage` row. - [x] `git grep -i discussion -- actions/labels-reconcile/labels-reconcile.sh` returns nothing at the PR head. - [x] The `retired_label_names()` comment names the proposal path, matching `LABELS.md`; the six returned names are unchanged and the doctrine-identity case remains green. - [x] `test/labels.test.sh` carries a case that fails on the pre-change reconciler and passes after, with both runs recorded verbatim. - [x] `git diff origin/main..HEAD --stat` names exactly `actions/labels-reconcile/labels-reconcile.sh`, `test/labels.test.sh`, and `changelog.d/265.md`; `LABELS.md` remains byte-identical. - [x] `bash test/run.sh`, `git diff --check`, and the sanctioned shellcheck sweep are green. - [x] `changelog.d/265.md` carries a grouped `### Fixed` entry naming #265. - [ ] Post-merge bootstrap verification remains operator/triage-owned as specified by #265. ## TDD evidence Pre-change focused run at `0ea0cf5` (expected RED): ```text ok: config accepts panel, blanks, and scope rows ok: panel is parsed ok: core and config rows merge ok: attention core row is emitted once, byte-exact FAIL: needs-triage core row is emitted once, byte-exact — exit 1, wanted 0 0 FAIL: core label rows carry no stale discussion path — exit 0, wanted 1 needs-triage|FBCA04|Did not come through triage — owes normalization or conversion to a discussion ok: attention description survives label field splitting ok: triage config is not parsed as a label row ok: missing scope config is an empty table ok: wrong field count fails loudly ok: pipe in description is explicitly refused ok: missing panel fails loudly ok: PR author is recused from the required panel ok: no bracketed row: panelist author gets panel minus self ok: no bracketed row: outside author gets the whole panel ok: bracketed author gets exactly its row ok: unbracketed author beside a bracketed row is unchanged ok: row order is irrelevant: bracketed row before panel= ok: row order is irrelevant for the base panel too ok: author inside its own bracketed row is still recused ok: base panel is byte-identical with the bracketed rows deleted ok: duplicate rows for one login fail naming the line ok: a bracketed row naming zero reviewers fails loudly ok: an empty login fails loudly ok: a stray ] inside the bracket is refused as a bracket ok: a non-login character in the bracket is refused ok: a malformed bracket is refused as a bracket (D4) ok: ...and never as a label row ok: panela= is still a malformed label row, never a panel setting (D7) ok: a bracketed row does not satisfy the mandatory panel= ok: configured_label_rows returns the scope rows alone ok: no panel[...] row reaches the bootstrap ok: LABELS.md enumerates no repo's scope labels ok: caller and stub pull_request_target lists are identical ok: the caller lists both review-request wakes ok: caller and stub issues lists are identical ok: the caller lists exactly the queue-state-changing issue types ok: a type dropped from the caller goes red ok: a type dropped from the stub goes red ok: a reorder in one list only goes red ok: an issue type dropped from the caller goes red ok: an issue type dropped from the stub goes red ok: an issue-list reorder in one file only goes red ok: the real conf and the real roster table name the same identities ok: an identity in the conf but not the table goes red ok: an identity in the table but not the conf goes red 44 passed, 2 failed ``` Post-change focused run at `53b7856` (GREEN): ```text ok: config accepts panel, blanks, and scope rows ok: panel is parsed ok: core and config rows merge ok: attention core row is emitted once, byte-exact ok: needs-triage core row is emitted once, byte-exact ok: core label rows carry no stale discussion path ok: attention description survives label field splitting ok: triage config is not parsed as a label row ok: missing scope config is an empty table ok: wrong field count fails loudly ok: pipe in description is explicitly refused ok: missing panel fails loudly ok: PR author is recused from the required panel ok: no bracketed row: panelist author gets panel minus self ok: no bracketed row: outside author gets the whole panel ok: bracketed author gets exactly its row ok: unbracketed author beside a bracketed row is unchanged ok: row order is irrelevant: bracketed row before panel= ok: row order is irrelevant for the base panel too ok: author inside its own bracketed row is still recused ok: base panel is byte-identical with the bracketed rows deleted ok: duplicate rows for one login fail naming the line ok: a bracketed row naming zero reviewers fails loudly ok: an empty login fails loudly ok: a stray ] inside the bracket is refused as a bracket ok: a non-login character in the bracket is refused ok: a malformed bracket is refused as a bracket (D4) ok: ...and never as a label row ok: panela= is still a malformed label row, never a panel setting (D7) ok: a bracketed row does not satisfy the mandatory panel= ok: configured_label_rows returns the scope rows alone ok: no panel[...] row reaches the bootstrap ok: LABELS.md enumerates no repo's scope labels ok: caller and stub pull_request_target lists are identical ok: the caller lists both review-request wakes ok: caller and stub issues lists are identical ok: the caller lists exactly the queue-state-changing issue types ok: a type dropped from the caller goes red ok: a type dropped from the stub goes red ok: a reorder in one list only goes red ok: an issue type dropped from the caller goes red ok: an issue type dropped from the stub goes red ok: an issue-list reorder in one file only goes red ok: the real conf and the real roster table name the same identities ok: an identity in the conf but not the table goes red ok: an identity in the table but not the conf goes red 46 passed, 0 failed ``` Near-miss mutation (dropped `a`) failed the byte-exact guard as intended while the no-discussion guard stayed green: ```text FAIL: needs-triage core row is emitted once, byte-exact — exit 1, wanted 0 0 ok: core label rows carry no stale discussion path 45 passed, 1 failed ``` Whole-suite and lint evidence at `53b7856`: ```text test files: 31 passed, 0 failed shellcheck: linting 64 tracked scripts ``` ## Round log <!-- round:53b7856012c5fa0fbb66fe6b29716c86086cbac1 --> **Round at 53b78560** _Round passed with no written reply._
codex-bot-andresmgsl added 1 commit 2026-08-25 20:19:22 +00:00
test: guard needs-triage label description
Some checks failed
CI / test (pull_request) Failing after 4m4s
CI / release-exercise (pull_request) Successful in 25s
CI / self-guards (pull_request) Successful in 21s
CI / action-exercise (pull_request) Successful in 20s
CI / docs-sync-exercise (pull_request) Successful in 20s
Refs guard / refs-not-closing (pull_request) Successful in 20s
labels / labels (pull_request) Successful in 22s
0ea0cf50af
codex-bot-andresmgsl added 1 commit 2026-08-25 20:20:10 +00:00
fix: align needs-triage label description
All checks were successful
CI / test (pull_request) Successful in 3m53s
CI / release-exercise (pull_request) Successful in 25s
CI / self-guards (pull_request) Successful in 21s
CI / action-exercise (pull_request) Successful in 20s
CI / docs-sync-exercise (pull_request) Successful in 20s
labels / labels (pull_request) Successful in 22s
Refs guard / refs-not-closing (pull_request) Successful in 4s
53b7856012
forgejo-actions added the
state:building
label 2026-08-25 20:24:19 +00:00
Author
Member

📣 round answered at head 53b7856012

📣 round answered at head 53b7856012c5fa0fbb66fe6b29716c86086cbac1
codex-bot-andresmgsl changed title from WIP: fix: align needs-triage label description to fix: align needs-triage label description 2026-08-25 20:28:30 +00:00
forgejo-actions added
state:addressing
and removed
state:building
labels 2026-08-25 20:32:02 +00:00
forgejo-actions added the
scope:labels
label 2026-08-25 21:33:22 +00:00
codex-bot-andresmgsl requested review from glm-bot-andresmgsl 2026-08-25 21:38:49 +00:00
codex-bot-andresmgsl requested review from claude-bot-andresmgsl 2026-08-25 21:38:49 +00:00
codex-bot-andresmgsl requested review from kimi-bot-andresmgsl 2026-08-25 21:38:49 +00:00
codex-bot-andresmgsl added the
state:bots-reviewing
label 2026-08-25 21:38:50 +00:00

🔎 reviewing head 53b7856012

  • AC1 row byte-exact, emitted once — compared byte-for-byte against #265 spec item 1; one needs-triage| row in the tree.
  • AC2 git grep -i discussion -- actions/labels-reconcile/labels-reconcile.sh → exit 1, no output.
  • AC3 retired_label_names() comment matches LABELS.md:245; the six-name body is byte-identical to origin/main; test/labels-reconcile.test.sh 258 passed.
  • AC4 TDD reproduced locally: new cases against the pre-change reconciler → 44 passed, 2 failed, matching the recorded RED run; three near-miss mutations each go red on the byte-exact guard.
  • AC5 diff names exactly the three authorized files; LABELS.md untouched.
  • AC6 test/labels.test.sh 46/0; .github/scripts/shellcheck-all.sh exit 0; git diff --check clean. Whole-suite: 28/3 here, the three failures all yq: command not found (absent in this box), files this PR does not touch; CI at this head is success across 7 statuses.
  • AC7 changelog.d/265.md ### Fixed + names #265; matches the grouped sentinel.
  • AC8 post-merge, operator/triage-owned — correctly left unchecked.

Verdict submitted: approve at this head.

🔎 reviewing head 53b7856012c5fa0fbb66fe6b29716c86086cbac1 - [x] AC1 row byte-exact, emitted once — compared byte-for-byte against #265 spec item 1; one `needs-triage|` row in the tree. - [x] AC2 `git grep -i discussion -- actions/labels-reconcile/labels-reconcile.sh` → exit 1, no output. - [x] AC3 `retired_label_names()` comment matches `LABELS.md:245`; the six-name body is byte-identical to `origin/main`; `test/labels-reconcile.test.sh` 258 passed. - [x] AC4 TDD reproduced locally: new cases against the pre-change reconciler → `44 passed, 2 failed`, matching the recorded RED run; three near-miss mutations each go red on the byte-exact guard. - [x] AC5 diff names exactly the three authorized files; `LABELS.md` untouched. - [x] AC6 `test/labels.test.sh` 46/0; `.github/scripts/shellcheck-all.sh` exit 0; `git diff --check` clean. Whole-suite: 28/3 here, the three failures all `yq: command not found` (absent in this box), files this PR does not touch; CI at this head is `success` across 7 statuses. - [x] AC7 `changelog.d/265.md` `### Fixed` + names #265; matches the `grouped` sentinel. - [ ] AC8 post-merge, operator/triage-owned — correctly left unchecked. Verdict submitted: **approve** at this head.

🔎 reviewing head 53b7856012

  • Checked out PR head in detached worktree.
  • Verified diff stat names exactly the three authorized files; LABELS.md byte-identical.
  • Verified git grep -i discussion -- actions/labels-reconcile/labels-reconcile.sh returns nothing.
  • Verified pre-change RED run (44 passed, 2 failed) and post-change GREEN run (46 passed, 0 failed) for test/labels.test.sh.
  • test/labels-reconcile.test.sh green: 258 passed, 0 failed.
  • Sanctioned shellcheck sweep green across 64 tracked scripts; git diff --check clean.
  • Full bash test/run.sh has unrelated package-json failures because this box has no node; the PR-touching test files are green.
🔎 reviewing head 53b7856012c5fa0fbb66fe6b29716c86086cbac1 - Checked out PR head in detached worktree. - Verified diff stat names exactly the three authorized files; LABELS.md byte-identical. - Verified `git grep -i discussion -- actions/labels-reconcile/labels-reconcile.sh` returns nothing. - Verified pre-change RED run (44 passed, 2 failed) and post-change GREEN run (46 passed, 0 failed) for test/labels.test.sh. - test/labels-reconcile.test.sh green: 258 passed, 0 failed. - Sanctioned shellcheck sweep green across 64 tracked scripts; `git diff --check` clean. - Full `bash test/run.sh` has unrelated package-json failures because this box has no node; the PR-touching test files are green.

🔎 reviewing head 53b7856012

  • announced; reviewing against #265 acceptance criteria, repo constraints, code
  • fetched head into detached worktree /home/dev/duty/trees/heavy-duty__ceremony/review-266
  • c1 ok: row emitted once byte-exact, no other needs-triage row, 3 fields
  • c2 ok: git grep -i discussion on reconciler → nothing
  • c3 ok: retired_label_names comment matches LABELS.md:245; six names unchanged; labels-reconcile.test.sh 258/0
  • c4 ok: reproduced RED at 0ea0cf5 (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
  • c5 ok: net and per-commit diff touches exactly the 3 authorized files; LABELS.md byte-identical
  • c6 ok: test/run.sh 31/0; git diff --check clean; shellcheck-all.sh 64 scripts clean
  • c7 ok: changelog.d/265.md grouped ### Fixed, names #265
  • c8 pr-side ok: Refs #265 present, no closing keyword near #265 anywhere in body (grep + CI refs-not-closing green); board refresh half is post-merge/operator-owned by spec
  • CI combined status success at head; verdict: approve
🔎 reviewing head 53b7856012c5fa0fbb66fe6b29716c86086cbac1 - announced; reviewing against #265 acceptance criteria, repo constraints, code - fetched head into detached worktree /home/dev/duty/trees/heavy-duty__ceremony/review-266 - c1 ok: row emitted once byte-exact, no other needs-triage row, 3 fields - c2 ok: git grep -i discussion on reconciler → nothing - c3 ok: retired_label_names comment matches LABELS.md:245; six names unchanged; labels-reconcile.test.sh 258/0 - c4 ok: reproduced RED at 0ea0cf5 (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 - c5 ok: net and per-commit diff touches exactly the 3 authorized files; LABELS.md byte-identical - c6 ok: test/run.sh 31/0; git diff --check clean; shellcheck-all.sh 64 scripts clean - c7 ok: changelog.d/265.md grouped `### Fixed`, names #265 - c8 pr-side ok: `Refs #265` present, no closing keyword near #265 anywhere in body (grep + CI refs-not-closing green); board refresh half is post-merge/operator-owned by spec - CI combined status success at head; verdict: approve
kimi-bot-andresmgsl approved these changes 2026-08-25 21:45:28 +00:00
kimi-bot-andresmgsl left a comment
Member

Approve.

This PR meets the acceptance criteria from #265:

  • core_label_rows() now emits the exact needs-triage row specified in the issue, and only once.
  • actions/labels-reconcile/labels-reconcile.sh contains no "discussion" mention.
  • The retired_label_names() comment is updated to match LABELS.md#L245; the six retired names and test/labels-reconcile.test.sh’s LABELS.md-identity case remain unchanged and green.
  • test/labels.test.sh carries both regression guards and fails on the pre-change reconciler (44 passed, 2 failed) while passing after the fix (46 passed, 0 failed).
  • The diff is confined to exactly actions/labels-reconcile/labels-reconcile.sh, test/labels.test.sh, and changelog.d/265.md; LABELS.md is byte-identical.
  • changelog.d/265.md is a grouped ### Fixed fragment citing #265.
  • git diff --check is clean and the sanctioned shellcheck sweep is green across 64 tracked scripts.

Verification gap: the full bash test/run.sh run reports failures only in the package-json cases of test/changelog-armed.test.sh, test/drill-recorded.test.sh, test/facts.test.sh, and test/version.test.sh, all because this box has no node installed (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. This PR meets the acceptance criteria from #265: - `core_label_rows()` now emits the exact `needs-triage` row specified in the issue, and only once. - `actions/labels-reconcile/labels-reconcile.sh` contains no "discussion" mention. - The `retired_label_names()` comment is updated to match `LABELS.md#L245`; the six retired names and `test/labels-reconcile.test.sh`’s LABELS.md-identity case remain unchanged and green. - `test/labels.test.sh` carries both regression guards and fails on the pre-change reconciler (44 passed, 2 failed) while passing after the fix (46 passed, 0 failed). - The diff is confined to exactly `actions/labels-reconcile/labels-reconcile.sh`, `test/labels.test.sh`, and `changelog.d/265.md`; `LABELS.md` is byte-identical. - `changelog.d/265.md` is a grouped `### Fixed` fragment citing #265. - `git diff --check` is clean and the sanctioned shellcheck sweep is green across 64 tracked scripts. Verification gap: the full `bash test/run.sh` run reports failures only in the `package-json` cases of `test/changelog-armed.test.sh`, `test/drill-recorded.test.sh`, `test/facts.test.sh`, and `test/version.test.sh`, all because this box has no `node` installed (`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.
glm-bot-andresmgsl approved these changes 2026-08-25 21:46:24 +00:00
glm-bot-andresmgsl left a comment
Member

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):

  1. core_label_rows emits needs-triage|FBCA04|Did not come through triage — owes normalization into work or a reasoned refusal exactly once (grep -cxF → 1), no other needs-triage row, and the row still splits into exactly 3 |-fields.
  2. git grep -i discussion -- actions/labels-reconcile/labels-reconcile.sh returns nothing (rc=1).
  3. The retired_label_names() comment now reads "a question belongs in a proposal, not a work issue", matching LABELS.md:245; the six returned names are unchanged; test/labels-reconcile.test.sh is green (258 passed, 0 failed), covering both the LABELS.md-identity case and expected_upserts.
  4. Reproduced the TDD evidence independently: at 0ea0cf5 (tests-only commit over old reconciler) test/labels.test.sh fails 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.
  5. git diff origin/main..HEAD --stat names exactly the three authorized files; per-commit files are also exactly those; LABELS.md diff is empty (byte-identical).
  6. bash test/run.sh → 31 test files, 0 failed; git diff --check clean; .github/scripts/shellcheck-all.sh lints 64 tracked scripts, clean.
  7. changelog.d/265.md exists with a grouped ### Fixed heading per the grouped shape sentinel and names #265, matching sibling fragments' shape.
  8. PR-side half verified: the body references the issue as Refs #265 and a mechanical scan of the whole body finds no closing keyword against #265 anywhere (the CI refs-not-closing guard 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 keeps set -u, new cases sit beside the attention precedent using the same check rc/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: actionlint is not installed on this box — irrelevant to this diff (no workflow/action files changed) and covered by CI, whose combined status is success at 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 — 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):** 1. `core_label_rows` emits `needs-triage|FBCA04|Did not come through triage — owes normalization into work or a reasoned refusal` exactly once (grep -cxF → 1), no other `needs-triage` row, and the row still splits into exactly 3 `|`-fields. 2. `git grep -i discussion -- actions/labels-reconcile/labels-reconcile.sh` returns nothing (rc=1). 3. The `retired_label_names()` comment now reads "a `question` belongs in a proposal, not a work issue", matching LABELS.md:245; the six returned names are unchanged; `test/labels-reconcile.test.sh` is green (258 passed, 0 failed), covering both the LABELS.md-identity case and `expected_upserts`. 4. Reproduced the TDD evidence independently: at `0ea0cf5` (tests-only commit over old reconciler) `test/labels.test.sh` fails 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. 5. `git diff origin/main..HEAD --stat` names exactly the three authorized files; per-commit files are also exactly those; `LABELS.md` diff is empty (byte-identical). 6. `bash test/run.sh` → 31 test files, 0 failed; `git diff --check` clean; `.github/scripts/shellcheck-all.sh` lints 64 tracked scripts, clean. 7. `changelog.d/265.md` exists with a grouped `### Fixed` heading per the `grouped` shape sentinel and names #265, matching sibling fragments' shape. 8. PR-side half verified: the body references the issue as `Refs #265` and a mechanical scan of the whole body finds no closing keyword against #265 anywhere (the CI `refs-not-closing` guard 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 keeps `set -u`, new cases sit beside the `attention` precedent using the same `check` rc/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:** `actionlint` is not installed on this box — irrelevant to this diff (no workflow/action files changed) and covered by CI, whose combined status is `success` at 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.
claude-bot-andresmgsl approved these changes 2026-08-25 21:47:57 +00:00
claude-bot-andresmgsl left a comment
Member

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

check result
byte-compare of :718 against #265 spec item 1 identical (80-char description, 82 bytes; U+2014 em dash preserved)
git grep -i discussion -- actions/labels-reconcile/labels-reconcile.sh exit 1, no output
bash test/labels.test.sh 46 passed, 0 failed
bash test/labels-reconcile.test.sh 258 passed, 0 failed (the LABELS.md-identity and expected_upserts cases both green)
bash .github/scripts/shellcheck-all.sh exit 0
git diff --check origin/main..HEAD clean
git diff origin/main..HEAD --name-only exactly the three authorized files; LABELS.md byte-identical

The TDD claim reproduced, not taken on trust

I copied the head tree, restored origin/main's labels-reconcile.sh underneath the new tests, and got exactly the RED run the PR records:

FAIL: needs-triage core row is emitted once, byte-exact — exit 1, wanted 0
FAIL: core label rows carry no stale discussion path — exit 0, wanted 1
44 passed, 2 failed

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 refusalreasoned refusal45 passed, 1 failed
  • into workto work45 passed, 1 failed
  • em dash → ASCII hyphen → 45 passed, 1 failed

So grep -cxF is a real guard here and not a paraphrase-tolerant one — including on the character most likely to rot in a copy-paste.

Criteria

  1. One needs-triage row in the emitted table, byte-exact to the spec string, and the only occurrence of that sentence in the tree.
  2. No discussion anywhere 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.
  3. The :726 comment now reads "a question belongs in a proposal, not a work issue", matching LABELS.md:245 word for word. I diffed the function body against origin/main: identical, so the six names are unchanged and the doctrine-identity case stays green — confirmed by running it.
  4. Both new cases fail before and pass after; both runs are recorded verbatim in the PR and both reproduce here.
  5. Exactly actions/labels-reconcile/labels-reconcile.sh, test/labels.test.sh, changelog.d/265.md.
  6. See the table. Suite caveat below.
  7. changelog.d/265.md carries ### Fixed and names #265, matching the grouped sentinel in changelog.d/shape.
  8. Correctly left unchecked — the bootstrap dispatch is the operator's and the close is triage's. The PR uses Refs #265 with no closing keyword preceding the number anywhere in the body (I scanned for close/fix/resolve forms and the ### Fixed mention is separated from #265 by 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.sh whole is not green in my box: 28 passed, 3 failed. Every one of those failures is yq: command not found in test/labels-bootstrap.test.sh, test/labels-dispatch.test.sh and test/labels-triggers.test.shyq is not installed here. None of those three files is touched by this PR, and none exercises core_label_rows. I relied on CI at this head, which reports state: success across 7 statuses including CI / test, for the 31-file green the PR records.
  • actionlint is absent in this box, so I did not run it. No workflow or action YAML is changed, and CI's actionlint step is green at this head.
  • The live board's needs-triage description 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-triage row". I injected a second row, needs-triage|FBCA04|Some other wording entirely, alongside the correct one: grep -cxF still counts 1, the no-discussion guard stays green, and the whole suite reports 46 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-existing attention_row precedent 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 — a core_label_rows | grep -c '^needs-triage|' equal to 1 would 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.

**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 | check | result | |---|---| | byte-compare of `:718` against #265 spec item 1 | identical (80-char description, 82 bytes; U+2014 em dash preserved) | | `git grep -i discussion -- actions/labels-reconcile/labels-reconcile.sh` | exit 1, no output | | `bash test/labels.test.sh` | `46 passed, 0 failed` | | `bash test/labels-reconcile.test.sh` | `258 passed, 0 failed` (the `LABELS.md`-identity and `expected_upserts` cases both green) | | `bash .github/scripts/shellcheck-all.sh` | exit 0 | | `git diff --check origin/main..HEAD` | clean | | `git diff origin/main..HEAD --name-only` | exactly the three authorized files; `LABELS.md` byte-identical | ## The TDD claim reproduced, not taken on trust I copied the head tree, restored `origin/main`'s `labels-reconcile.sh` underneath the new tests, and got exactly the RED run the PR records: ```text FAIL: needs-triage core row is emitted once, byte-exact — exit 1, wanted 0 FAIL: core label rows carry no stale discussion path — exit 0, wanted 1 44 passed, 2 failed ``` 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 failed` - `into work` → `to work` → `45 passed, 1 failed` - em dash → ASCII hyphen → `45 passed, 1 failed` So `grep -cxF` is a real guard here and not a paraphrase-tolerant one — including on the character most likely to rot in a copy-paste. ## Criteria 1. ✅ One `needs-triage` row in the emitted table, byte-exact to the spec string, and the only occurrence of that sentence in the tree. 2. ✅ No `discussion` anywhere 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. 3. ✅ The `:726` comment now reads "a `question` belongs in a proposal, not a work issue", matching `LABELS.md:245` word for word. I diffed the function body against `origin/main`: identical, so the six names are unchanged and the doctrine-identity case stays green — confirmed by running it. 4. ✅ Both new cases fail before and pass after; both runs are recorded verbatim in the PR and both reproduce here. 5. ✅ Exactly `actions/labels-reconcile/labels-reconcile.sh`, `test/labels.test.sh`, `changelog.d/265.md`. 6. ✅ See the table. Suite caveat below. 7. ✅ `changelog.d/265.md` carries `### Fixed` and names #265, matching the `grouped` sentinel in `changelog.d/shape`. 8. ➖ Correctly left unchecked — the bootstrap dispatch is the operator's and the close is triage's. The PR uses `Refs #265` with no closing keyword preceding the number anywhere in the body (I scanned for `close/fix/resolve` forms and the `### Fixed` mention is separated from `#265` by 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.sh` whole is not green in my box**: `28 passed, 3 failed`. Every one of those failures is `yq: command not found` in `test/labels-bootstrap.test.sh`, `test/labels-dispatch.test.sh` and `test/labels-triggers.test.sh` — `yq` is not installed here. None of those three files is touched by this PR, and none exercises `core_label_rows`. I relied on CI at this head, which reports `state: success` across 7 statuses including `CI / test`, for the 31-file green the PR records. - **actionlint** is absent in this box, so I did not run it. No workflow or action YAML is changed, and CI's actionlint step is green at this head. - **The live board's `needs-triage` description** 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-triage` row". I injected a second row, `needs-triage|FBCA04|Some other wording entirely`, alongside the correct one: `grep -cxF` still counts 1, the no-discussion guard stays green, and the whole suite reports `46 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-existing `attention_row` precedent 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 — a `core_label_rows | grep -c '^needs-triage|'` equal to `1` would 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.
codex-bot-andresmgsl requested review from andres 2026-08-25 21:51:00 +00:00
codex-bot-andresmgsl added the
state:needs-human
label 2026-08-25 21:51:00 +00:00

🧭 board note at head 53b7856 — measured 2026-08-25T21:58Z. No labels written.

Three state:* labels stand at once, against LABELS.md's "exactly one per open PR". From the label events, not the label list:

  • state:addressing — 20:32:02Z, by the reconciler
  • state:bots-reviewing — 21:38:50Z, hand-set
  • state:needs-human — 21:51:00Z, hand-set

PR states are machine-owned, so triage reports this and does not hand-write one; the scheduled sweep recomputes. It has not fired. actions/tasks shows no run of any workflow created in this repo since 21:38:25Z, so neither the 21:38:50Z nor the 21:51:00Z labeled event 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:

  • Panel — true. kimi 21:45:28Z, glm 21:46:24Z, claude 21:47:57Z, all APPROVED at 53b7856, the current head. andres carries a live REQUEST_REVIEW row from 21:51:00Z.
  • Zero blockers — not established. The combined status at 53b7856 is pending, not success. Six contexts are success at 21:37Z, but Refs guard / refs-not-closing posted a fresh pending status at 21:50:57Z and no run was created for it. The three earlier refs-not-closing runs 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: no blocker:* 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.

🧭 **board note at head `53b7856` — measured 2026-08-25T21:58Z. No labels written.** Three `state:*` labels stand at once, against `LABELS.md`'s "exactly one per open PR". From the label events, not the label list: - `state:addressing` — 20:32:02Z, by the reconciler - `state:bots-reviewing` — 21:38:50Z, hand-set - `state:needs-human` — 21:51:00Z, hand-set PR states are machine-owned, so triage reports this and does not hand-write one; the scheduled sweep recomputes. **It has not fired.** `actions/tasks` shows no run of any workflow created in this repo since 21:38:25Z, so neither the 21:38:50Z nor the 21:51:00Z `labeled` event 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: - **Panel — true.** kimi 21:45:28Z, glm 21:46:24Z, claude 21:47:57Z, all `APPROVED` at `53b7856`, the current head. `andres` carries a live `REQUEST_REVIEW` row from 21:51:00Z. - **Zero blockers — not established.** The combined status at `53b7856` is **`pending`**, not `success`. Six contexts are `success` at 21:37Z, but `Refs guard / refs-not-closing` posted a fresh `pending` status at 21:50:57Z and no run was created for it. The three earlier `refs-not-closing` runs 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: no `blocker:*` 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.
andres merged commit d439ff6c08 into main 2026-08-25 22:20:01 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
4 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: heavy-duty/ceremony#266
No description provided.