PR #462 follow-ups: undated writer-warning in the poll.py port, two overstated liveness lines nf-3dgs ← Beads

open priority 2 task unassigned

Twinned from https://github.com/cfsh/ninefold/issues/468 by tools/beads/import_github.py's reconcile pass.

Suggestions from ninefold-reviewer's review of #462. All below the gate floor — #462 is CONVERGED and nothing here blocks it. Unclaimed and unlabelled.

1. ⚠️ Act before merging the stack: #463 does not carry #462's F8 fix

#462's commit 4 (03badb1) dated the writer-warning: poll.sh's _warning_is_current(stamp) only believes the warning if it post-dates the heartbeat's own ts, because a repaired writer's warning lingers ~6h in the 8 KB tail and would otherwise raise ⚠ the heartbeat WRITER is broken on the next ordinary long sweep — holding every session's cron at 30m, which is the exact cost #461 was filed about.

tools/pr/poll.py at #463's head 7083434 has no dating:

```python def heartbeat_writer_broken(path: Path, tail_bytes: int = 8192) -> bool: ... Self-limiting rather than time-boxed: callers consult this ONLY from the already-stale branches ... # ← the claim #462 F8 disproved return _HB_WRITER_WARNING.encode() in fh.read() ```

writer_broken is computed before record is read and is never compared against stamp. So merging #462#463 silently reverts F8, and tools/tests/test_poll.py would not catch it (the dating case does not exist there). Same shape as #462's F7, one round on — the rebase has to carry commit 4's logic and extend the fixture.

2. tools/reviewer/README.md:211 overstates the writer-warning row

> \| stale / never written \| carries write_heartbeat's own failure warning \| the heartbeat WRITER is broken — liveness UNKNOWN \|

True only when the warning post-dates the heartbeat. Driven against the real dispatch_health() at head, with the real emitter string from dispatch.sh:180:

``` stale 100m + warm log + warning stamped NOW -> ⚠ … the heartbeat WRITER is broken stale 100m + warm log + warning stamped OLD -> ⓘ dispatcher: … probably mid-sweep ```

The second is the state F8 was filed about and is reachable for ~6h after any repair, so the row is false there. The CLAUDE.md row is fine — it states the property (a ⚠ does not imply a quiet log) rather than the state. Fifth instance on that PR of prose outliving the code it describes (F1, F2, F5, F6, this).

3. poll.sh:262-264 asserts the conclusion it has just disclaimed

Never-written heartbeat + no dispatch.log:

``` ⚠ STALE-DISPATCH: reviewer state dir exists, no heartbeat has EVER been written, and no dispatch.log exists at the expected path (…) — so there is NO corroborating evidence either way. The dispatcher is not running. Check the schtasks job. ```

F4 softened the log clause; the sentence after it still states flatly that the dispatcher is not running. One reachable route is the one F4's own comment names: NINEFOLD_REVIEWER_LOGS set to an existing directory the dispatcher does not use — both the heartbeat and the log are then looked for where neither is, and the digest asserts an outage from no evidence. poll.py at #463 carries the same wording.

Dependencies

None.

Comments

No comments.

Add a comment