anthropics / anthropics/claude-code
Ghost-text: CLI spontaneously renders old conversation content as untagged input, reproducible across restarts and a version update
Nobody has claimed this yet.
- Dominant language
- TypeScript
- Stars
- 147k
- Forks
- 24k
- PR merge metrics
- PR metrics pending
Description
Summary
A custom Telegram bridge (community plugin telegram@claude-plugins-official, using tmux send-keys/load-buffer+paste-buffer to inject messages wrapped in a <channel source="plugin:telegram" ...> tag) is seeing old conversation content spontaneously reappear in the live input box as untagged plain text — with no new inbound message from the actual source triggering it. This matches the exact failure mode from a documented incident in August 2026 where promptSuggestionEnabled ghost text got mistaken for real user input, except this recurs with promptSuggestionEnabled: false already set.
Evidence ruling out every other layer
- Not the bridge's own resubmit/watchdog script: its log has zero entries spanning the entire incident window each time this happened.
- Not stuck/leftover tmux state: reproduced after a full
tmux kill-session+ fresh process relaunch. - Not a Telegram-side redelivery bug:
getWebhookInfo/getUpdatesconfirm zero pending updates on Telegram's side at the time. - Not a stale-version issue: reproduced identically before and after updating from 2.1.268 → 2.1.276 (confirmed via the in-app "Update installed · Restart to update" prompt).
- Not the message-injection mechanism: reproduced both before and after switching the bridge from
tmux send-keys -ltotmux load-buffer+paste-buffer(a change made specifically to rule out a known tmux long-string length limit, tmux/tmux#1502, #1185). promptSuggestionEnabled: falseis confirmed set in~/.claude/settings.jsonthroughout.
Repro pattern
- A long message is sent through the bridge (a multi-paragraph note, e.g. ad/script copy).
- It is correctly received and processed once.
- Minutes to over a day later, with no new inbound message, the exact same (or a near-identical fragment of the same) content reappears in the live input line — sometimes as raw text, sometimes rendered as a
[Pasted text #N]placeholder — without the<channel ...>tag that every genuine bridge-injected message carries. - The session correctly refuses to act on it (this specific safety behavior works as intended), but it repeats across multiple separate occasions with different content each time, and once even appeared within seconds of a fresh session restart before any real message had been processed.
Environment
- Claude Code versions: 2.1.268 and 2.1.276 (both affected)
- macOS, headless/detached session driven via
tmux(not an interactive terminal user) settings.json:"promptSuggestionEnabled": false,"permissions": {"defaultMode": "auto"}- Session launched with
--permission-mode auto --plugin-dir ... --channels plugin:telegram@claude-plugins-official, no--continue/--resume(fresh session each restart, per user's own standing rule to avoid unbounded transcript growth)
What should happen
The CLI should never render previously-seen conversation content into the live input line as if it were new pending input, regardless of promptSuggestionEnabled. If this is a distinct mechanism from the original prompt-suggestion ghost text (rendering as [Pasted text #N] rather than dim suggestion text), that mechanism needs its own kill switch, since promptSuggestionEnabled: false does not appear to cover it.
Is this a regression?
Yes — matches the exact behavior class from the August 2026 ghost-text incident, which was believed fixed via promptSuggestionEnabled: false.
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by reproducing the report in a fresh macOS session using tmux, the Telegram plugin, and promptSuggestionEnabled: false in ~/.claude/settings.json; compare raw input with [Pasted text #N] behavior across the reported Claude Code versions. Done means previously seen conversation content no longer appears as pending untagged input, or the separate mechanism has an effective documented disable switch.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- shell
- Domain
- cli, tooling
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Needs clarification
- Newbie friendliness
- 42/100