Skip to content

Claude primary: routine wakes force a visible "Captain, shipshape." turn each - ~20 no-op model turns/hour on a busy fleet #3285

Description

@NewAiCoder

Summary

On the Claude primary, every watcher wake that turns out to be routine (a signal: from a worker's progress line, a turn-ended from a worker polling its own pipeline, a false stale: on an intentionally paused worker) costs the captain two visible terminal lines: the Stop hook feedback banner from the exit-2 asyncRewake, plus a forced one-line model reply because Claude Code demands visible text on the handling turn. The prescribed reply is Captain, shipshape., so a busy fleet fills the captain's terminal with dozens of identical no-op lines per hour. The captain's words: "really token wasting and annoying."

Measured today on a 9-worker fleet (5 of them driving no-mistakes runs): ~25 wake-handling turns in ~90 minutes, of which roughly 4 needed a decision. The other ~21 produced only Captain, shipshape. - each one a full model turn re-sending the whole primary context (tens of thousands of cached tokens) to print nine characters.

Environment

  • firstmate at commit eec826e (2026-08-21), Claude primary, tmux backend
  • Claude Code 2.1.251, Linux
  • Supervision: Stop-owned auto-arm (bin/fm-claude-stop-autoarm.sh, asyncRewake: true)

Wake shapes that produced no-op turns

  1. signal: on a worker's working: progress append - informational by contract (AGENTS.md section 11 says status appends are "sparse supervisor-actionable events"), yet every append wakes the primary.
  2. turn-ended from a worker that polls its own no-mistakes run with a background job/monitor and ends its turn each poll - a wake every 30-90 s per such worker until steered to a foreground wait.
  3. stale: on a worker whose LAST line is a declared paused: but whose run-step reads failed (the run died with the daemon) - run-step precedence outranks the pause declaration, so the hold re-alarms on the stale cadence.
  4. check: inactive-outcome for the same intentionally held workers, asking for "captain presentation" of an outcome the primary already handled.

Expected

A routine wake whose drain yields only working:/turn-ended/already-handled events should be absorbed by the watcher without a model turn at all; and when a model turn is unavoidable, the instructions should not prescribe a mandatory visible line for the no-action case.

Suggestions

  • Watcher-side: do not emit a wake for a working: append or a bare turn-ended unless it coincides with a keyed event (needs-decision, blocked, done, failed) or a liveness threshold; coalesce the rest into the next heartbeat.
  • Let a declared paused: line outrank a failed run-step when that run's id is recorded as superseded/dead, so a held worker does not re-alarm.
  • Drop the mandatory "reply exactly Captain, shipshape." instruction for the routine no-action case (AGENTS.md section 9). If Claude Code forces visible text, one character is cheaper than a sentence; better still, the hook could return exit 0 for wakes it can classify as no-op so no turn starts.
  • Related but distinct: Correlated Secondmate answer can be silently suppressed as merely: "Captain, shipshape." #3205 covers a real answer being suppressed as Captain, shipshape.; this issue is about the volume of genuine no-op turns.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions