Skip to content

[Bug]: After Esc-interrupting a Claude turn, later turns in the same pane never leave "Interrupted" (grey) — hook-driven status stays frozen #34336

Closed as not planned

Description

@iflov

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)

  1. In a fresh Orca terminal tab, launch Claude Code.
  2. 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").
  3. Press Esc on the keyboard while it generates. Claude shows ⎿ Interrupted · What should Claude do instead?.
  4. Type a new prompt by hand (e.g. "continue the previous task") and press Enter.
  5. Claude works on it and finishes. The sidebar stays grey "Interrupted" throughout.
  6. 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

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

  1. iflov commented on Oct 27, 2026

    @iflov
    Author

    Closing — this only happens without Orca's Claude hooks.

    The repro sessions ran with CLAUDE_CONFIG_DIR pointing at a config dir Orca doesn't manage (not in claude-observed-config-dirs.json), so its settings.json had none of Orca's status hooks. Only the default ~/.claude had them. In that setup the row is driven by title/Escape inference alone. The prompt field stayed "" on every row, which shows no UserPromptSubmit was arriving.

    Control with the same steps, but Claude launched with the default config dir (Orca hooks installed):

    18:02:37.902 working / interrupted:false / prompt:"1부터 900까지 ..."
    18:02:50.052 done / interrupted:true / cancellation          # Esc
    18:03:00.243 working / interrupted:false / prompt:"이어서 다시 진행해줘"   # next prompt recovers
    

    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 programStatus keeps following the next turns.

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