Phantom text on a panel's prompt line while composer state reports empty (STUCK held-input-present is false)
# Phantom text appears on a panel's prompt line; composer state says the composer is empty
## What happens
An idle Claude CLI panel renders a line of text on its `❯` prompt that nobody typed. The
daemon then reports `STUCK ... held-input-present` for that panel, indefinitely.
The text is **not actually in the composer**. In every sample, while the text was visibly
painted and the panel was **idle**, `panels screen --json` returned:
"composer": {"isPresent": false, "hasUndeliveredText": false}
## Why it matters
The phantom text is contextually plausible each time — it reads like an instruction a
human would give the agent at that exact moment. An orchestrator that trusts either the
painted screen or the `STUCK` signal can conclude a human left an instruction and act on
it. Observed strings included `commit this` and
`go ahead with the join table, start implementing`.
Two detectors disagree and the screen-based one is the one that surfaces as an event:
`STUCK held-input-present` is derived from the painted screen, `composer.hasUndeliveredText`
from real state.
## Occurrences (one session, 2026-09-09)
Pane `ef6a634c-35de-43c3-ae5d-d22233ca63de`, repo `pss`, all `--agent claude`:
| Panel | Phantom text |
|---|---|
| `468e75c5-033a-4a63-854f-7f74e523b638` | `go ahead with the join table, start implementing` |
| `2e6c33b4-a4fe-4457-bc79-d681dea03483` | `commit this` |
| `81b2b94e-7b99-42af-a2e5-959b46fb0aef` | `commit this` |
| `caf03f43-04a9-48b6-984f-db52b2cee943` | `commit this` |
The same string `commit this` appearing on three separate panels suggests a shared or
reused input buffer rather than random corruption.
A fifth occurrence was recorded on 2026-08-31 in a different pane, so this is not new to
this release.
The panel owner confirmed explicitly that he did not type the first one.
## Behaviour when you try to clear it
On panel `468e75c5`, idle, with the text painted:
1. `panels input --input-file` with a single `0x15` (Ctrl-U) — no change to the painted line.
2. `panels input --input-file` with a single `0x1b` (Esc) — no change.
3. Later, with no further input from anyone, the line **disappeared on its own**.
Nothing was ever executed: `git log`/`git status` on the worktree confirmed no commit and
no staged change at any point, despite `commit this` sitting on three prompts.
## Diagnostic dead end worth documenting
`panels output --panel <id> --limit N` returns only **343 characters regardless of
`--limit`** for these alternate-screen CLI panels (tried 400 and 5000). So the output
stream cannot be used to confirm or deny whether the text ever arrived as input.
## Suggested fixes
1. Derive `STUCK held-input-present` from composer state, not the painted screen — or
suppress the event when `hasUndeliveredText` is false and the panel is idle.
2. Include `composer.hasUndeliveredText` in the `STUCK` event line so a consumer can tell
the two apart without a follow-up `panels screen` call.
3. Investigate the shared-buffer hypothesis suggested by the repeated `commit this`.
## Environment
- runpane 2.4.102 via `npx --yes runpane@latest`, `--pane-dir ~\.pane`
- Pane on win32, daemon over `\.\pipe\pane-daemon-...`, `remoteDaemonService.reachable: true`
- Claude Code v2.1.267 in the panels
{
"source": "npm",
"wrapper": {
"runtime": "node",
"version": "2.4.102",
"paneDir": "C:\\Users\\Pablo Duarte\\.pane",
"endpoint": {
"transport": "pipe",
"path": "\\\\.\\pipe\\pane-daemon-9342e179739692b8"
}
},
"platform": {
"os": "win32",
"arch": "x64"
},
"release": {
"ok": true,
"tagName": "v2.4.102",
"artifactName": "Pane-2.4.102-Windows-x64.exe",
"format": "exe",
"preferredDownloadUrl": "https://runpane.com/api/download?platform=[REDACTED]&arch=[REDACTED]&format=[REDACTED]&version=[REDACTED]&channel=[REDACTED]&source=[REDACTED]
"fallbackDownloadUrl": "https://github.com/dcouple/Pane/releases/download/v2.4.102/Pane-2.4.102-Windows-x64.exe"
},
"installedPane": {
"found": true,
"path": "C:\\Users\\Pablo Duarte\\AppData\\Local\\Programs\\Pane\\Pane.exe",
"version": "2.4.102"
},
"daemon": {
"reachable": true,
"endpoint": {
"transport": "pipe",
"path": "\\\\.\\pipe\\pane-daemon-9342e179739692b8"
},
"app": {
"version": "2.4.102",
"isPackaged": true,
"platform": "win32",
"electronVersion": "41.10.3",
"nodeVersion": "24.18.0"
}
},
"remoteSetup": {
"ready": true,
"displayAvailable": true,
"headlessEnvironmentApplied": false,
"diagnostics": []
}
}
RunPane watcher failure report
Report title
Failure evidence
RunPane diagnostics