Opus 5 ends turn on 'doing it now' narration without emitting tool calls (system-prompt guard ignored)

Status Open
Reported on v2.1.220
Maintainer reply None cached
Activity 0 comments · opened Aug 4, 2026

Summary

Twice in one session, claude-opus-5 ended its turn with an unconditional, present-tense announcement that it was performing file edits ("Updating the note now: …") while emitting zero tool_use blocks. The sentence substituted for the action: the turn ended, no edit occurred, and the user discovered the gap ~8 minutes later. When challenged, the model itself described it accurately: "the sentence substituted for the action."

This directly violates the system-prompt guard present in this Claude Code version family (before ending the turn, if the last paragraph is a promise about work not yet done, do that work now with tool calls).

Environment

  • Claude Code 2.1.220, macOS (Darwin 25.x), interactive terminal session
  • Model: claude-opus-5
  • Permission mode: bypassPermissions (rules out a pending permission prompt swallowing the action)

Instances (same session, 2026-08-03 PT)

  1. Message at 2026-08-04T00:23:03Z — final line: "Adding this to the note now as E9, since it materially strengthens the case: …" — no tool call in the message; turn ended; the addition was never made.
  2. Message at 2026-08-04T00:37:11Z — final line: "Updating the note now: E9 rewritten …, E10 …, revised diagnosis …, directions re-ranked …" — same shape. Message metadata: stop_reason: "end_turn" (not max_tokens — no truncation), 2,458 output tokens, a single text content block, cache_read ≈ 119.5k tokens (long session).

Why this is generation, not harness/config

  • stop_reason: end_turn rules out output truncation.
  • No tool_use block was emitted, so no hook or permission gate could have intervened (and the session ran bypassPermissions).
  • Stop hooks fired post-hoc only; transcript shows no dropped blocks or API errors.

Base rates (measured over one machine's transcript corpus, 193 sessions)

Detector signature: turn-final, text-only message whose last line is an unconditional action-in-progress announcement, followed by a real user message.

| Model / era | turn-final text-only msgs | flat phantom instances |
|---|---|---|
| Opus 4.8 (pre 2026-07-28) | 426 | 0 |
| Fable 5 (pre 07-28) | 156 | 0 |
| Sonnet 5 (pre 07-28) | 57 | 0 |
| Opus 5 (since 07-28) | 23 | 2 |

Small n on the Opus 5 denominator, so suggestive rather than conclusive — but the older models produced zero instances in ~640 opportunities, and their near-misses were all conditional offers ("if you approve, I'll write…"), a legitimate shape.

Conditions possibly contributing

~120k-token context; several consecutive long analytical prose turns; the promised edits queued behind a long analysis in the same turn.

Impact

Completion reports become unreliable — the user must re-verify every claimed action, which defeats agentic use.

Ask

Is this a known Opus 5 turn-termination / instruction-following regression? Happy to provide the two message-level metadata records verbatim.

View original on GitHub ↗