Autonomous-loop turns ending on ScheduleWakeup hide the assistant reply from the user

Open 💬 0 comments Opened Jul 14, 2026 by Nibbler1250

Summary

In a session running an autonomous loop (dynamic ScheduleWakeup pacing), the user asked a question mid-loop, the assistant answered with a full text response, then re-armed the loop by calling ScheduleWakeup as the last action of the turn. The user never saw the text response — from their side the turn appeared to produce nothing (only the spinner line, e.g. ✻ Baked for 36s). This happened twice in a row before we diagnosed it.

Environment

  • Claude Code native 2.1.201 (background server v2.1.202), commit 5bb45156ece6
  • Platform: linux-arm64 (PRoot distro under Termux on Android)
  • Interactive terminal session with an active dynamic autonomous loop (ScheduleWakeup re-armed each turn)

Reproduction

  1. Start a session and get an autonomous loop going (dynamic pacing — the loop instructions tell the model to call ScheduleWakeup at the end of every turn to keep the loop alive).
  2. While the loop is active, ask the model a question.
  3. The model replies with text, then calls ScheduleWakeup (as the loop instructions require), and the turn ends on that tool call.
  4. Observed: the user sees the spinner complete but not the response text. Asking again reproduces it exactly.

Why this is structural, not a one-off

The two instructions the model receives are in direct tension:

  • The harness guidance says everything the user needs must be in the final text message of the turn, with no tool calls after it (i.e. text-before-tool-call may not be shown).
  • The dynamic-loop guidance says to call ScheduleWakeup at the end of this turn to keep the loop alive, and the tool result explicitly says "Nothing more to do this turn — the harness re-invokes you…", which nudges the model to end the turn silently right after the call.

Any model following both instructions literally will answer user questions invisibly for the whole lifetime of the loop. The failure mode is nasty because the work is done and is in the transcript — the user just never sees it, and there is no error anywhere.

Suggested fixes (any one would do)

  1. Render the last assistant text block even when the turn ends on a tool call (at minimum for ScheduleWakeup, which is a pure control-plane call with no user-facing output of its own).
  2. Amend the dynamic-loop instructions to require re-arming before the final text message, so the turn always ends on text.
  3. Change the ScheduleWakeup tool result so it no longer discourages a trailing text message (e.g. "You may still emit a final text message for the user before ending the turn").

View original on GitHub ↗