Skip to content

watcher: a cycle that emits an actionable stale: reason still closes as FAILED - cycle ended without an actionable reason #1949

Description

@mathew-builds

Summary

A watcher cycle that does produce an actionable close reason reports FAILED - cycle ended without an actionable reason at the next Stop. Observed repeatedly on 2026-08-08 against a healthy
crewmate, including after bin/fm-watch-arm.sh --restart.

The consequence is not a lost wake — every event did reach the supervising session — but the Stop
hook treats each cycle as a supervision failure, so the operator is told supervision is down while
it demonstrably is not, and is instructed to repair something that is working.

Observed sequence, repeated

Each cycle looked exactly like this:

watcher: started pid=<N> (beacon fresh)
stale: default:w2:pN (idle 244s, possible wedge, escalation <k>)

then, at the next turn end:

watcher: attached pid=<N> (beacon 2s)
watcher: FAILED - cycle ended without an actionable reason

The cycle emitted stale: ... — an actionable reason — and it was delivered to the session as a
Stop hook feedback wake, which is why the operator saw it at all. The close accounting then
reports the opposite.

What was ruled out

  • Operator-side manual arming. Hypothesis: repeated manual bin/fm-watch-arm.sh calls were
    creating cycles that competed with the Stop-hook auto-arm. Tested by deliberately withholding
    the manual arm for one full turn and letting the Stop hook re-arm on its own. The cycle still
    closed FAILED. Not operator-induced.

  • A genuinely wedged crewmate. The pane really was idle ~244s each time, but the worker was
    healthy throughout, verified three independent ways rather than from the pane:

    • crewmate session transcript grew +16,378 bytes in 30s while thinking;
    • git -C <worktree> diff --shortstat main grew 1281 → 1328 → 2259 insertions;
    • ~/.no-mistakes/state.sqlite step_results advanced document → push → pr → ci.

    The task went on to open PR fix(watch): assert watcher liveness during wake drain #101, which merged cleanly. So the possible wedge escalations were
    false positives on a worker that was working the whole time.

The escalation interaction

The same pane escalated 1 → 5 consecutively. From escalation 3 onward the reason line carried
demand-deep-inspection: same pane has wedge-escalated 3 times in a row - do not re-absorb on the run-step/pane state alone, which is good and correct behaviour. The suspicion is that the repeated
same-pane escalation is what the close accounting fails to count as actionable — i.e. the first
escalation is treated as the actionable event and subsequent ones on the same pane are not, even
though they are still emitted and delivered.

Stated as a hypothesis, not a diagnosis: this was not confirmed by reading the arm-layer close
contract.

A likely-unrelated cosmetic detail

bin/fm-watch-arm.sh output carries these when stdout is consumed by a truncating pipe:

bin/backends/herdr.sh: line 2559: printf: write error: Broken pipe
bin/backends/herdr.sh: line 2560: printf: write error: Broken pipe

Almost certainly an artifact of the caller's head, not a fault — noted only in case the same
writes are how the close reason is recorded.

Environment

  • backend herdr, harness claude, macOS Darwin 25.5.0
  • Supervision mode: Claude Stop-hook-owned auto-arm (bin/fm-claude-stop-autoarm.sh)
  • One kind=ship crewmate live in a treehouse worktree, running the no-mistakes pipeline

Why this matters

The banner is the operator's only signal that supervision is genuinely down. When a working cycle
reports FAILED, the real signal and the false one become indistinguishable, and the documented
response is to re-arm — which then produces another FAILED. A real supervision outage during this
period would have looked identical to the noise.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions