Twinned from https://github.com/cfsh/ninefold/issues/656 by tools/beads/import_github.py's reconcile pass.
Suggestions from ninefold-reviewer's review of #647 (tools/office/reap.py). All are below the gate floor — #647 is CONVERGED — and none block anything. Unclaimed.
1. --quiet-for nan slips past the non-negative guard and disables the liveness block. tools/office/reap.py, _minutes_arg. The F4 fix refuses a negative because silence is floored at 0, so -5 would read as stricter while accepting none. float("nan") fails the value < 0 test, and then quiet < quiet_for is False for every session, so check_liveness never blocks — the same outcome the negative guard exists to prevent. Nobody types nan, which is why this is here and not in the gate; the fix is one math.isfinite clause in the same if.
2. _board_note names sessions whose reap was refused. tools/office/reap.py, main() → _board_note(reapable). Under --apply the note is built from reapable, not from the sessions that actually came off, so a session that survived its tmux kill (worktrees kept, exit 1) is still listed as one to set to wrapped on board #398. The tool's premise is that the board carries intent and these checks want proof; telling a CTO to mark a live session wrapped inverts that. Pass the successful subset.
3. Under --apply, a BY-HAND session gets no recovery line. main() prints the "an absence of evidence, not a disproof … git -C <clone> worktree remove --force <path>" guidance only inside the if not args.apply: branch. The --apply run is the one where an operator has already decided to act, so it is where the manual line is most wanted.
4. tmux could not be listed — nothing will be killed sits above a run that still removes worktrees. render() prints that when tmux_sessions returns None; every Session.tmux is then None, so apply() skips the kill-and-prove branch entirely and goes straight to wait_for_exit(session.agents). With no agent listed, removal proceeds with no kill attempted and no proof of death — the invariant the #647 F3 fix pinned inside that branch. Reachable only when the agent list is empty *and* the transcript is 30+ min cold *and* tmux is unaskable, which is why it is a residual rather than a defect, but the header reads as "this run is inert" and it is not. Either reword it or refuse --apply outright when the tmux picture is unavailable.
5. A benign kill race renders as a warning. If the pane dies between the survey and apply(), tmux kill-session exits 1 with can't find session: dev-<topic>, tmux_gone then answers True and the reap proceeds correctly — but the sweep prints ⚠ tmux kill-session dev-<topic> failed: can't find session. A successful reap should not carry a ⚠ for the state it was trying to reach.
None.
No comments.