Repository navigation
Description
Short summary
Interrupting a running Claude Code turn with Esc correctly marks the pane done + interrupted (grey "Interrupted"). But every later turn in that pane is then ignored by the agent-status row: the user sends a new prompt, Claude works and finishes, and the sidebar stays grey "Interrupted" the whole time. programStatus (title-based) follows the new turns, but state / mainAgent / updatedAt stay frozen at the moment of the Esc.
It does not depend on a queued message — I first hit it while cancelling a queued message, then reproduced it without one.
Operating system
macOS 27.0.1 (26A434), arm64
Orca version
v1.4.242
Agent
Claude Code 2.1.311 (model: Haiku 5.5), local terminal pane (not SSH). Launched in an Orca terminal with claude --plugin-dir "$ORCA_CLAUDE_AGENT_VIEW_PLUGIN_DIR" --permission-mode auto --model haiku (via a wrapper that only sets CLAUDE_CONFIG_DIR). The pane's ORCA_PANE_KEY / ORCA_AGENT_HOOK_PORT match the live hook endpoint, and hooks were delivering normally before the Esc.
Reproduction (2/2 attempts)
- In a fresh Orca terminal tab, launch Claude Code.
- Send a prompt that keeps Claude generating for ~30 s (e.g. "write the prime factorization of every number from 1 to 600, one per line").
- Press Esc on the keyboard while it generates. Claude shows
⎿ Interrupted · What should Claude do instead?. - Type a new prompt by hand (e.g. "continue the previous task") and press Enter.
- Claude works on it and finishes. The sidebar stays grey "Interrupted" throughout.
- Any further prompt behaves the same — the row never recovers.
Captured status (orca worktree ps --json, agent row for the pane, polled every 0.5 s, logged on change)
Control run (no queued message):
17:39:27.637 {"state":"done","interrupted":false,"main":"done","outcome":null,"prog":"idle"} # session start
17:39:36.945 {"state":"working","interrupted":false,"main":"working","outcome":null,"prog":"working"} # prompt 1
17:39:49.708 {"state":"done","interrupted":true,"main":"done","outcome":"cancellation","prog":"idle"} # Esc
17:39:56.728 {"state":"done","interrupted":true,"main":"done","outcome":"cancellation","prog":"working"} # prompt 2 sent, Claude working
# prompt 2 finished at 17:40 — row afterwards:
{"state":"done","interrupted":true,"mainAgent":{"state":"done","outcome":"cancellation","stateStartedAt":1793090389046},"programStatus":{"state":"done","observedAt":1793090416543},"updatedAt":1793090389046}
First run (Esc also cancelled a queued message), with two more prompts afterwards:
17:35:28.309 working / interrupted:false # prompt 1, queued msg pending
17:35:51.363 done / interrupted:true / cancellation / prog idle # Esc
17:36:33.008 done / interrupted:true / cancellation / prog working # prompt 2 (typed by hand)
17:36:54.054 done / interrupted:true / cancellation / prog done # prompt 2 finished
17:37:08.087 done / interrupted:true / cancellation / prog working # prompt 3 (sent via `orca terminal send`)
17:37:10.236 done / interrupted:true / cancellation / prog done # prompt 3 finished
Before the Esc, the same pane tracked several turns normally (working → done/success on each prompt).
Expected
The next UserPromptSubmit starts a new turn: the row goes working with interrupted cleared, then done/success on that turn's Stop.
Possibly related
- Fix Claude's stuck spinner after Escape cancellation #25846 (merged 2026-10-06) — execution host applies Claude Escape cancellation from the title glyph changing to
✳; mentions launch-token and status-age checks before applying it. Not verified as the cause, but it is the code path that writes thiscancellationrow. - Record Stop immediately and settle subagents from exit proof #28051 (merged 2026-10-24) — Stop recording changes.
- fix(agent-hooks): stop navigation Escape from inferring completion #20149 / [Bug]: Escape dismissing Claude Code's /btw composer is inferred as a turn interrupt (false red "Interrupted") #13547 — Escape inferred as an interrupt while Claude was still working.
- [Bug]: Esc-interrupting a Claude turn in an SSH worktree leaves the pane 'working' forever — interrupt recovery is gated behind sendInputAccepted, which SSH transports omit #10114 — opposite symptom: Esc interrupt left the pane
workingforever (SSH). - fix(agent-status): let a stopped turn stay working while its background work runs #22043 (closed) —
interruptedclamped ontodone.
Side observation (may be separate)
In the same tab, after /exit and relaunching Claude Code by typing the command again, Orca never created an agent row for the new session (orca terminal show → agentIdentity: null), even though a full turn ran. A brand-new tab registered normally.
Activity
iflov commentedon Oct 27, 2026
Closing — this only happens without Orca's Claude hooks.
The repro sessions ran with
CLAUDE_CONFIG_DIRpointing at a config dir Orca doesn't manage (not inclaude-observed-config-dirs.json), so itssettings.jsonhad none of Orca's status hooks. Only the default~/.claudehad them. In that setup the row is driven by title/Escape inference alone. Thepromptfield stayed""on every row, which shows noUserPromptSubmitwas arriving.Control with the same steps, but Claude launched with the default config dir (Orca hooks installed):
So with hooks the next prompt clears the cancellation as expected. One leftover point, in case it matters to you: without hooks, an inferred cancellation is never cleared, even though the title-based
programStatuskeeps following the next turns.