Repository navigation
Description
Before submitting
- I searched existing issues and did not find a duplicate.
- I included enough detail to reproduce or investigate the problem.
Area
apps/server
Steps to reproduce
- Start a Claude thread: "Run the shell command
sleep 30in the foreground. When it finishes, use the AskUserQuestion tool to ask me which color to pick, with the options "Red" and "Blue". After I answer, quote my answer exactly." - While the command runs, type a follow-up and press Enter. With the default follow-up behaviour it is queued.
- When the question appears, click Steer on the queued message.
- Answer the question that is shown first.
Expected behavior
The question Claude gave up on closes in T3 Code, so only the question Claude is waiting on is shown, and answering it reaches Claude.
Actual behavior
The steer aborts the pending tool permission request. The SDK returns tool_result "Tool permission request aborted" (is_error), Claude reads the steered message and asks the same question again as a new request. T3 Code keeps the aborted request pending, so the thread shows two questions. Answering the stale one marks it resolved, but the server logs No pending Claude runtime request …, Claude never gets the answer, and the real question still waits. Nothing tells the user.
In ClaudeAdapterV2.ts, the AskUserQuestion branch of the permission callback races the answer against the abort signal. On abort it removes the request from pendingRuntimeRequests and returns deny, but it emits no runtime_request.updated that cancels the request, so the projection never leaves pending.
Impact
Minor bug or occasional failure
Version or commit
upstream/main at ee7b49d638, dev desktop app
Environment
macOS 27, T3 Code dev desktop app, Claude Fable 5.1 through the Claude Agent SDK
Logs or stack traces
Provider events for the thread (trimmed):
05:45:16.671 outgoing prompt.offer {"content":"PROBE2: queued before the question, steered while it is pending.","priority":"now"}
05:45:16.704 incoming tool_result {"content":"Tool permission request aborted","is_error":true,"tool_use_id":"toolu_0149MNMxsZ7jF7UxaZcK6of1"}
05:45:21.016 incoming assistant thinking: "…the color question got aborted before you answered… I'll ask it again."
05:45:21.023 incoming tool_use AskUserQuestion toolu_01E98pK64FFo5cdGAAHhgMgk
orchestration_v2_projection_runtime_requests afterwards: both toolu_0149… and toolu_01E9… are user_input / pending. After answering the first: toolu_0149… resolved, and server.trace.ndjson holds five No pending Claude runtime request runtime-request:…toolu_0149… failures.
Related
- [Bug]: Incoming agent questions replace an unfinished message and redirect subsequent typing #11116: found while verifying the fix, where a message can be sent while a question is pending.
- fix(server): show when an answer's delivery to the provider fails #14496 (open) reports failed answer deliveries, which would make the stale answer visible but would not close the aborted request.
Claude Opus 5.5 via T3 Code
Activity
fix(server): session_wake queues behind an open question instead of a…
fix(server): a scheduled task queues behind a busy thread instead of …
WhiteWarrior625 commentedon Oct 8, 2026
Additional production reproduction on Linux, stock nightly
0.0.46-nightly.20261005.2702, Claude Agent SDK / Claude Opus 5.5. This reaches the same abort through cross-threadt3_thread_sendwithmode: auto, rather than the manual Steer button.Five recorded
AskUserQuestioncalls aborted when an incoming message was offered withpriority: now. The provider log pairs are below, in UTC on October 8:Each returned
Tool permission request aborted. Two other question calls in the same retained timeline accepted answers normally. The user reported typing answers repeatedly, with the composer clearing and the answer not reaching the agent. I have not independently reproduced the composer-clearing UI behavior.A later read-only projection check found four of the aborted requests marked resolved at 15:24:39.404, 15:33:44.827, 15:34:11.851 and 15:35:26.757Z, all after their provider tool result had already aborted. The fifth was cancelled when that turn was interrupted. This corroborates the stale-request problem described here. It does not establish a current pending orphan, since those requests were subsequently resolved or cancelled.
The installed-version source sends steering with
priority: now. Its AskUserQuestion callback removes itspendingRuntimeRequestsentry after the abort race without emitting cancellation at that point. Our named local question guard runs only on Stop and has no path that aborts a pending question.Minimal reproduction for this additional entry point:
t3_thread_sendto A withmode: autoand a neutral follow-up while the question waits.We have switched informational cross-thread messages to queue mode while user input is pending. No local T3 patch was installed.
Nightly check on October 8: the newest published Nightly is
v0.0.46-nightly.20261008.2819, commit5e2225671f705fcd33f1ea5591b79ba612fb6974. I inspected both that tag's AskUserQuestion callback and its Linux x86_64 AppImage's packaged server bundle. The callback still races answers against the abort signal, removes the pending runtime entry, and returns denial when aborted. It emits no runtime-request cancellation after that wait. The packaged callback contains the same sequence. This is a check of shipped code, not a live reproduction after upgrading. The stale-request cancellation fix is not present at this callback.Packaged server SHA256:
310635e55d11b09ef92672c2ea71d44f017cab43b26a83586b16be6ab051cfa5. The stock AppImage SHA256 matches the GitHub asset digest. Our installed app remains the older 2702 Nightly.MasterMann commentedon Oct 16, 2026
Still reproducible on v0.1.0 (stable, released 2026-10-15). Here it combined with #15136 / #15993 and left the thread stuck.
Environment: server v0.1.0 (Linux x64, desktop AppImage backend), used remotely from the Windows desktop app v0.1.0;
claudeAgent/claude-opus-5-5, full access.Sequence (UTC, from the provider event log and server trace):
AskUserQuestion(4 questions) shownpriority: "now"→ SDKtool_result"Tool permission request aborted"; the card stays pending in T3t3_worktree_handoff(withcontinuationPrompt); thread rebindsquery.close; run fails "The provider event stream closed unexpectedly"; composer shows "Waiting on background task mcp__t3-code__t3_worktree_handoff" (Stop does not clear it); the queued continuation never startsruntime-request.respondfails:OrchestrationV2DispatchCommandError: Provider session provider-session:provider-instance:claudeAgent:thread:<id>:<session> was not found.(shown as an error toast)So once a handoff detach has released the session, the stale request from this bug turns into a user-visible "Provider session … was not found" error, and the thread has no recovery path: the question can't be answered, Stop does nothing, and the queued continuation stays queued. The source matches what this issue describes: on abort, the
AskUserQuestionbranch inClaudeAdapterV2.tsremoves the request frompendingRuntimeRequestsand emits noruntime_request.updatedcancellation.dismissNativeUserInputsonly cancels it on a terminal provider turn, and that turn never arrives here.No relevant changes between
v0.1.0andmain(17e1087d3).Produced by Claude Code (Claude Opus 5.5) via
t3 triage.beardedarchitect commentedon Oct 17, 2026
Also hitting this regularly on the Windows 11 desktop app with Claude Opus 5.5. The trigger is a message from another T3 session (cross-thread send) arriving while an AskUserQuestion card is waiting for my answer. Claude then asks the same questions again, often 2–3 times in a row, and I have to retype my answers each time. No logs captured; reporting the frequency and the entry point.
Claude Opus 5.5 via T3 Code
juliusmarminge commentedon Oct 21, 2026
Reproduced on current main (e27a03e): after a steer during AskUserQuestion, answering the stale card failed delivery. The question-only fix in https://git.cafe/pingdotgg/t3code/pulls/22803 cancels the aborted request before answering; the replacement question remains answerable. Runtime evidence and 204 passing adapter tests back this. Mobile, other adapters and remote/tunnel remain unverified.
whygee-dev commentedon Oct 25, 2026
Same failure on command approval cards, which #22803 leaves out ("Approval requests and modes are unchanged").
Environment: T3 Code (Beta) 0.1.2 desktop, macOS,
claudeAgentprovider, Claude Code 2.1.309 through the Agent SDK.A typed follow-up steered into the turn (
priority: "now") while a Bash approval card is pending aborts the permission request, as described above for AskUserQuestion. The card stays live. Clicking Approve then fails delivery, yet the request is stored as approved, and nothing tells the user that the command never ran. #21158 does not cover this either: it only reroutes agent-originated sends, and this was a human steer.Sequence (UTC, 2026-10-25), from the provider event log,
orchestration_v2_projection_runtime_requestsandserver.trace.ndjson:kind: command)priority: "now"tool_result"Tool permission request aborted", withtool_result_metapermission_decision: {decision: "reject", source: "user_abort"}No pending Claude runtime requestfailures inClaudeAdapterV2.respondToRuntimeRequestresolvedwithdecision: "accept"; itsapproval_requestturn itemcompletedA second occurrence in the same thread: request created 2026-10-24 23:11:54.124, steer offered 23:12:11.676, aborted 23:12:11.688, projected
resolved/acceptat 23:12:12.143 (that trace has rotated out).Code path (0.1.2 bundle): the approval branch of
canUseToolEffectawaitsawaitClaudeApprovalDecision(decision, callbackOptions.signal)and, on exit, only deletes the entry frompendingRuntimeRequestsinensuring(...). Like the question branch before #22803, it emits noruntime_request.updated/turn_item.updatedcancellation on abort, so the request stayspendinguntil a click resolves it, and the click's decision is what gets projected.Steps to reproduce:
Expected: the aborted approval card closes, as #22803 does for questions.
Actual: the card stays; Approve fails delivery five times and the request is recorded as accepted.
m4littlemozarts commentedon Oct 27, 2026
This one's pretty serious for multi-agent setups. Any cross-thread
t3_thread_sendthat steers into a Claude thread with an open question cancels the question. Claude asks again, and the dead card stays answerable. Tonight, in the same minute, I answered 2 dead cards in one thread and 8 in another. The original report lists it as minor, but it breaks the whole ask-and-answer loop.Still reproduces on 0.1.3-nightly.20261027.3754 (Linux, claudeAgent, claude-opus-5-5). The new "Answer delivery not confirmed" notice shows up, but only after the answer has gone nowhere. Would love to see #22803 and #21158 land.
Claude Opus 5.5 via T3 Code
shivamhwp commentedon Nov 10, 2026
Retested on main at 41443e5 (Linux, web dev client, Claude Haiku 5.5) and this no longer reproduces. Closing as fixed by #27320, merged as 41588d4.
Steps: Claude ran a 40 second foreground command with a follow-up queued behind it, then asked the Red or Blue question. I clicked Send now on the queued message while the question was open.
cancelledat the moment of the steer.resolved, and Claude repliedYou answered: "Red".server.trace.ndjsonhas noNo pending Claude runtime requestfailure.One run, on the web client only. Not checked: the desktop app, mobile, and a steer sent from another thread with
t3_thread_send.