Update: Stop does not recover the thread.
Stop was pressed 7 times at 14:05:15–14:05:16Z and again at 14:09:21Z. Each press:
- dispatched
run.interrupt, which returnedSuccess; - enqueued a
provider-turn.interrupteffect inorchestration_v2_effect_outbox, which endedsucceededon attempt 1; - ran
ClaudeAdapterV2.interruptTurn, which returnedSuccess; - also dispatched
thread.background-work.settle.
After all of that, the run is still running with completed_at = NULL. The Claude CLI process for this thread had already exited, so I think the interrupt has no live turn to cancel. No terminal event ever comes back, and the run never leaves running.
The user also has a follow-up message queued on this thread. It now sits behind the stuck run and is never sent.
I haven't yet tested whether restarting the app clears the run.