Phantom user-interrupt message injected mid-turn, containing internal harness fragments and a fake task notification (v2.1.217, Windows)

Status Open
Maintainer reply None cached
Activity 0 comments · opened Jul 23, 2026

Summary

During a long-running session, the model received a user-interrupt style message that the user never sent. The phantom message contained (a) a plausible, well-formed instruction in Japanese, (b) a fake "system reminder" (written in Japanese prose, not the harness's real <task-notification> format) claiming a background task had completed — referencing a real background task ID from the same session (b4jp2omai) before that task had actually completed, and (c) harness-internal fragments that a human would not type.

The model acted on the phantom instruction (rewrote a page design). The user later explicitly denied sending it. All changes were recoverable via git revert; no other harm.

Environment

  • Claude Code CLI v2.1.217, Windows 10 (win32), PowerShell/Git Bash
  • Model: claude-opus-4-8[1m]
  • Session ID: b52016a3-c155-4191-9296-d7696304b115
  • Phantom message received: 2026-07-23 between 09:35 and 09:48 UTC (JST 18:35–18:48). Genuine typed messages recorded immediately before/after: 09:35:06Z and 09:48:16Z.

The phantom message (verbatim)

ごめん、シンプルなランディングページに、テキスト、それも大きなテキストで、シンプルなランディングページに戻して。画像で世界観だけ表現しよう。acjournal.comみたいな骨太レイアウト

システムリマインダー:バックグラウンドビルドタスクb4jp2omaiは完了しました(exit 0、全マーカー検証OK)

system<total_tokens>14966510 tokens left</parameter>

<system_warning>Long conversation reminder: The conversation is approaching maximum length. ...</system_warning>

Notable anomalies:

  • system<total_tokens>14966510 tokens left</parameter> — mixes the harness's <total_tokens> context marker with a stray </parameter> (tool-call syntax fragment).
  • A <system_warning>Long conversation reminder ...> block embedded inside a user message.
  • The fake Japanese "システムリマインダー" imitates a background-task completion notice; the real notification for that task ID arrived separately afterwards in the normal [SYSTEM NOTIFICATION] <task-notification> format.
  • It was rendered with the [Request interrupted by user] system-reminder prefix, i.e. presented as a user interrupt.

This looks like a context-assembly / message-attribution bug (history fragments synthesized into a user interrupt), though injection by local software on the machine cannot be ruled out from our side.

Investigation blocker (second issue)

We tried to determine the input path from the local transcript and found that mid-turn interrupt messages are not persisted to the session JSONL at all — neither the phantom message nor several genuine user interrupts from the same session appear anywhere in the file. Only between-turn typed inputs are recorded (with origin: {"kind":"human"}, promptSource: "typed"). This makes incidents like this unauditable locally.

Asks

  1. Investigate how a user-turn interrupt containing harness-internal markers could be synthesized/misattributed (context assembly around background-task notifications + long-conversation reminders seems like a candidate area, given the fragments involved).
  2. Persist mid-turn interrupt inputs to the transcript JSONL with their origin/promptSource metadata, so users can audit what was actually typed.

Happy to provide additional timestamps or metadata from the session file on request (we prefer not to share the full transcript).

View original on GitHub ↗