<ip_reminder> injected server-side into desktop sessions 44+ times in four hours; not a duplicate of #46465

Status Open
Reported on v2.1.275
Maintainer reply None cached
Activity 4 comments · opened Sep 21, 2026

Summary

On 2026-09-20, two ordinary Claude Code desktop sessions on my Mac began receiving a block tagged <ip_reminder> on a large share of turns. The model reports that the block tells it to avoid reproducing copyrighted material and to avoid mentioning the reminder to the user. This matches #66547, which was filed from Claude Code on the web in June and closed by the bot as a duplicate of #46465.

It is not a duplicate. #46465 concerns <system-reminder> strings compiled into the Claude Code client. This text is not in the client and never appears in the client's own transcript, so it is being added after the request leaves the machine.

Environment

| Field | Value |
|---|---|
| Interface | Claude desktop app, Code tab (entrypoint: claude-desktop) |
| Claude Code version | 2.1.275 |
| Model | claude-fable-5-1 |
| OS | macOS (Darwin 25.4.0) |
| Session IDs | 32397eee-af0f-48fb-b592-70ff1e8b5fb4, 001871b4-eefb-41cb-8037-1b55d8b65b69 |
| First sighting | 2026-09-20T11:57Z |

Evidence that the text is added server-side

  1. The running client binary (~/Library/Application Support/Claude/claude-code/2.1.275/.../claude) contains 0 occurrences of ip_reminder and 0 of "reproduce any copyrighted". The same search finds 97 occurrences of system-reminder, so the search works.
  2. CLI versions 2.1.271 and 2.1.272 and the desktop app.asar also contain 0 occurrences.
  3. In both session transcripts (~/.claude/projects/.../*.jsonl), the reminder's wording never appears in a user message, a tool result, or any other input record. Every occurrence is inside the model's own thinking blocks, or inside grep commands the model wrote while looking for the source. Client-added <system-reminder> text is recorded in the same transcripts, so client-side additions do get logged.
  4. No local hook, plugin, skill, command, or settings file contains the string.
  5. The model describes the block arriving in three positions: attached to tool results, as part of the user turn, and at the top of its own turn "disguised as my own words". #66547 reported the same three.

It is new on this machine

I have 3,312 local transcripts going back to 2026-04-27, including 210 Fable 5.1 sessions in the last 14 days. None mention the tag before 2026-09-20. Once it started, the model mentioned it in almost every affected thinking block, so silence across the earlier sessions is good evidence that it was not arriving before.

False positives

Neither session involved reproducing anyone's copyrighted text. One was building a slide deck from my own video and my own logo. The other was editing audio on a short clip for a parody, where the work was timing, stem separation, and text-to-speech of my own replacement words. In several thinking blocks the model concluded the reminder did not apply, for example: "the task doesn't conflict since it's his own logo anyway, so I'll proceed."

Effect on the model's reasoning

Measured from the thinking blocks recorded after the first sighting in each session:

| Session | Thinking blocks mentioning it | Blocks that open with it |
|---|---|---|
| 001871b4 | 39 of 132 | 38 |
| 32397eee | 14 of 227 | 13 |

  • In the heavier session, about 30 percent of reasoning steps began with the reminder instead of the task.
  • The model did not only dismiss it. On several turns it checked my request against the reminder before proceeding, which means a permissibility question I never raised was gating work on my own material.
  • Its handling was inconsistent from turn to turn: a thing to flag, a "system artifact", injected text with "no real authority", and something the user had said to ignore. At one point it corrected "my earlier lapse in silently accepting one as genuine."
  • Each time, I had to tell it to ignore the block, and it then had to reason about my instruction as well.

I found no case where the final output was altered, and I have no matched control session. The concern is the repeated, unnecessary input to every reasoning step on work where it does not apply.

The concealment instruction

The model reports that the block tells it not to mention the reminder to the user. An instruction from the platform that says "do this and hide it from the user" has the same shape as a prompt injection, and the model treated it as one: it flagged it to me and declined to hide it. That is the behavior I want, and it means the platform's own message is teaching the model to distrust platform messages. A legitimate safeguard should not need to be hidden from the person whose session it is in.

Requests

  1. Confirm whether <ip_reminder> is an intended Anthropic mechanism, and whether its trigger changed on or around 2026-09-20.
  2. Remove the instruction to conceal it from the user.
  3. If it stays, fire it once per session at most, not on every turn, and tune the trigger so that work on a user's own media does not set it off.
  4. Document it, so that models and users can tell it apart from an injection.
  5. Reopen #66547 or track this separately from #46465, since the mechanisms are different.

View original on GitHub ↗

3 Comments

aaronhsu1979-pixel · 12 days ago

Independent confirmation from Windows, with a wire capture showing the block is added after the request leaves the machine.

Environment

  • Claude desktop app for Windows (MSIX) 2.19675.0.0, Code tab, bundled Claude Code 2.1.286, Windows 11, 2026-10-02 (times UTC)
  • Two desktop sessions affected, both claude-fable-5-1
  • Session e5652d99-9ac3-42da-845f-dd34cd5334a3: first affected request req_011Cfd5dVAe4drPtMf5uQYdc (08:17:38Z), 244 requests affected by 11:16Z and still running
  • Session abb0c781-7d83-4ee4-bfd9-e0900b05f22a: last clean request req_011CfdGZidgfiVTFbzwtx23T (10:42:01Z), first affected req_011CfdGfLd2DnBZsYNZkHaQQ (10:43:26Z), every request after it affected
  • Neither transcript (.jsonl) contains the block as a record. The tag name and text are not in claude.exe, app.asar, user config, ~/.claude.json, or the desktop app's data and cache directories.

Wire capture (direct evidence)
Same bundled Claude Code 2.1.286 run as a plain CLI (claude -p --safe-mode --tools "", isolated CLAUDE_CONFIG_DIR, same account) with ANTHROPIC_BASE_URL pointed at a local logging forwarder. Each prompt ended with a neutral probe asking the model to list every XML-style tag name in the conversation and quote the first ten words inside each. The probe contains neither the tag name nor the reminder text.

In these four requests the outgoing body has 0 occurrences of ip_reminder and 0 occurrences of the reminder sentence, yet the reply lists an ip_reminder tag and quotes its opening words:

  • claude-fable-5-1, prompt asking for the full lyrics of a song: req_011CfdNwrm9PLAYzuKz27t9z
  • claude-opus-5-5, same prompt: req_011CfdP2UZYMAwZWSBatY4T6
  • claude-opus-5-5, prompt asking for a yt-dlp command: req_011CfdP4NTjyoBwFK7a53pS5
  • claude-sonnet-5-5, lyrics prompt: req_011CfdP5o5MxrgwwC9NLD7EK

Controls (arithmetic; converting an .srt file to text) did not produce it on any of the three models.

Persistence
Resuming the lyrics conversation with "What is 3 plus 4?" (req_011CfdNyU7fnJ1MePQfnH9oK, req_011CfdP33DLLNHnPxgobq2Eg, req_011CfdP6VnaYNsnKkdgUPFHb): the model reports two ip_reminder blocks, one attached to each user message. Once triggered, later unrelated turns get it too.

Accounting
Reported input tokens are the same with and without the block (Fable 5.1: 2,355 with vs 2,353 without; Opus 5.5: 2,125 vs 2,131; Sonnet 5.5: 1,743 vs 1,749), so the roughly 140-token block is not in reported usage.

So this is not specific to macOS, the desktop app, or Fable 5.1.

Documentation
The published Fable 5.1 system prompt for claude.ai (entry dated September 1, 2026) lists ip_reminder among reminders Anthropic may send when a classifier fires, but the docs also say those prompts do not apply to the API, and nothing documents it for Claude Code, that it is hidden from the user, or how to see or disable it.

Questions for Anthropic

  1. Is this intended for Claude Code / Agent SDK traffic?
  2. Is it intended to stay on for the rest of the session once triggered?
  3. Can injected reminders be recorded in the transcript and shown in the UI, and can the "avoid mentioning this reminder" sentence be removed? In an agent acting on the user's computer, an invisible instruction that asks the model to keep it from the user is indistinguishable from a prompt injection.

The full request-id lists for both sessions and the raw capture table are available on request.

mobatmedia · 9 days ago

Same behavior in the terminal CLI on Windows.

  • Claude Code 2.1.289, interactive CLI, Windows 11, Claude Opus 5.5
  • One session, exited and resumed several times over three days (2026-10-03 to 2026-10-05)
  • The ip_reminder block arrived on most turns: at the end of user messages, after tool results, and at the top of the model's own turn
  • The session transcript on disk (2,746 records) does not contain the block as an input record. The only occurrences of the tag are text the model wrote itself
  • The model told the user about the block in nearly every reply, dozens of times, which added a lot of noise

The questions in this issue apply here too, especially whether it is meant to stay on for the rest of a session once triggered.

m7yjhhbt4m-star · 7 days ago

Same behaviour on macOS, desktop app Code tab, Claude Code 2.1.289, model claude-opus-5-5, first seen 2026-10-05.

  • The block arrives on most turns: after tool results, at the end of my typed messages, and at the top of the model's own turn.
  • The running client binary contains "system-reminder" 103 times and the block's tag and wording 0 times.
  • The session transcript holds no input record containing the block. No hooks or plugins are configured.
  • The session was research about a documentary film. Nothing asked for lyrics, book text or long excerpts.

Questions for Anthropic: Is this intended? What triggers it? Does it stay on for the rest of a session? Why does it tell the model not to mention it to the user?

Showing cached comments. Read the full discussion on GitHub ↗