Twinned from https://github.com/cfsh/ninefold/issues/413 by tools/beads/import_github.py's reconcile pass.
Suggestions from ninefold-reviewer's review of #402. Advisory, sub-gate — #402 is CONVERGED and approved, and nothing here blocks it.
---
.claude/commands/triage.md:47-54 (added in 41402fe to cover #397's "collapse near-duplicates") tells the triage runner to "Fold them into one, comment on the losers saying where the work now lives, and close them" — inside Step 2, which runs before Step 3 proposes anything and before Step 4 lets Aedan react.
Two things make that worth one more clause:
active/session: labels; the close bullet has no equivalent. The uncertain case is handled ("keep both and say so in the proposal"), so the clear-cut ones are closed silently — and a mis-judged "clear-cut" duplicate is invisible to Aedan, in a tracker whose whole premise (triage.md:7) is that capture is cheap and the finds are real.Suggested shape: fold and identify duplicates in Step 2, list the proposed closures as a line in the Step 3 proposal, and do the commenting + closing in Step 5 alongside the label writes.
---
CLAUDE.md:252-258 and triage.md:124-126 make #398's body the single source of session state and tell every session to "edit your own row in place" — at start, at a chunk change, and at wrap-up, where CLAUDE.md:312 now makes a board write a mandatory wrap-up step.
The mechanism is gh issue edit --body, a whole-body replace: read body → edit one row → write body back. Two sessions overlapping and the later write silently reverts the earlier session's row. No error, no conflict, and nothing in either file says to re-read immediately before writing.
Blast radius is bounded — triage.md:119-123 rebuilds the board from live state each round, so a lost row survives at most one round — but *within* a round cross-session visibility is the board's entire job, and this failure is silent, where the comment channel it replaces at least left the text on the page.
One clause closes it: re-read the body immediately before writing your row, and if it moved under you, re-apply.
---
The incident named at CLAUDE.md:254-255 as the motivation for the whole protocol is a sid change arriving as a comment.
But on #398 as it stands, sids are not in the rows — they live in a collapsed <details> block below the Sessions table, where ninefold-a's entry currently reads "re-register on next chunk (sid changes on reset)". CLAUDE.md:248 says the board lists "its clone and sid"; :258 scopes a between-rounds write to "one row". A session whose sid changed on reset therefore has nothing *in its row* to update, and the rule as written leaves it exactly where the incident started.
Either the sid belongs in the row, or the rule needs to read "your row and your sid entry".
---
Not a code item, but it will outlive the PR: #402's body still advertises "End with a paste-ready snippet per session." — the bullet 16555b2 deleted at Aedan's request — and its test plan still claims "paste snippets produced for A and C". Neither the board write protocol (5663a01) nor the Step 6 inversion appears in the body at all. On a squash-merge that text can land in main's history describing behaviour the diff removed.
---
Sub-floor, recorded not raised: gh label create session:d (triage.md:102) creates a label with no color or description, so triage-created session labels will not match the ones created by hand.
None.
No comments.