Twinned from https://github.com/cfsh/ninefold/issues/445 by tools/beads/import_github.py's reconcile pass.
Suggestions from ninefold-reviewer's review of #437 (dispatcher heartbeat + STALE-DISPATCH). Filed unclaimed and unlabelled — nothing here blocked that PR, and nothing here should be folded back into it.
dispatch_health returns silently when mktemp failstools/pr/poll.sh — errf="$(mktemp)" || return 0, added by the third commit alongside the stderr split.
The function's own header comment two lines above still reads:
> ⚠ The check's OWN failure is surfaced, never swallowed. […] A liveness check that fails silently is the #352 failure mode wearing the costume of its own fix.
That property now holds on every path but this one. Reproduced against the head function, same 135m-stale heartbeat on both sides — only TMPDIR differs:
``` --- TMPDIR points at a non-directory --- mktemp rc: 1 out=[<SILENT>]
--- control, TMPDIR fine --- out=[⚠ STALE-DISPATCH: last good dispatcher tick was 135m ago (> 90m = 3 x 30m; …)] ```
Trigger needs an already-degraded box (unwritable/absent TMPDIR, full disk), which is why it was not gating. Fix is the same shape as the other three swallow fixes on that PR — report and carry on rather than return quietly:
```bash errf="$(mktemp)" || { echo "⚠ STALE-DISPATCH: liveness check could not allocate a temp file — reviewer liveness UNKNOWN."; return 0; } ```
Both were argued and the reasoning holds; noting them only so piece 3 does not rediscover them.
ERR trap double-fires for a failure inside a command substitution (once in the subshell, once in the parent), so an aborted tick advances tick by 2. Declined as cosmetic — nothing reads tick for a decision, verified: poll.sh only prints it. Piece 3 removes the subshell.dispatch.log is the history. Much narrower now that both poll paths hold the cron at 30m.poll.py), the fixture dimension that actually mattersRecorded on the thread already, repeated here because it is the durable lesson: the characterization fixture needs heartbeat state crossed with invocation mode, not either alone.
| | --check | full digest |
|---|---|---|
| fresh / stale / failed / unreadable / absent+dir / absent | ✓ | ✓ |
Both of this PR's later defects lived in the dimension the oracle did not vary — a failing gh (the stub always exited 0) and the full-digest call site (the harness only drove --check). poll.py must also reproduce dispatch_health's output byte-identically for the golden diff.
None.
No comments.