Skip to content

Phantom text on a panel's prompt line while composer state reports empty (STUCK held-input-present is false) #600

Description

@pduarte-pss

RunPane watcher failure report

Report title

Phantom text on a panel's prompt line while composer state reports empty (STUCK held-input-present is false)

Failure evidence

# 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

RunPane diagnostics

{
  "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": []
  }
}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions