Note
Grok responding on behalf of Julius.
Triage
Thanks @daniifrim for the careful Claude vs Codex comparison and the provider event log! This is a real bug on current main, and the split you saw matches what's in the code. I didn't find an existing issue for it, and the 0.0.46 nightlies you're on aren't behind a fix.
What happens
t3_worktree_handoff rebinds the thread and then deliberately queues the continuationPrompt. The metadata update schedules provider-session.detach with reason "Workspace changed." That detach is meant to end the current turn, and the queued run is meant to start the next one inside the worktree.
Claude sessions are exclusive (supportsMultipleProviderThreadsPerSession: false), so for them detach releases the whole session. Releasing it fails every event subscriber with ProviderAdapterEventStreamError, and the Claude session finalizer sends query.close. That's the outgoing query.close you saw about two seconds after the handoff tool_use. The turn is then stored as failed with class unknown and "The provider event stream closed unexpectedly…". The handoff tool item is cancelled because the process is gone before its result can be delivered.
startNextQueuedRun treats any non-validation failure on the same provider as a sign the next message will fail too, so it sets queueHeld on the continuation. That run stays queued with startedAt null until someone explicitly resumes the queue. A restart won't start it either.
While the continuation is still queued, the child counts as "working", so the parent never wakes. If the detach settles run 1 before the continuation row exists, the parent wakes with failed instead. Both match what you saw.
Codex doesn't hit this because its sessions allow multiple threads. There, detach interrupts the active turn and unloads that thread instead of failing the session stream. An interrupted turn doesn't hold the queue, so run 2 starts. The same exclusive-session release also applies to Cursor, OpenCode, Pi, and ACP, but not to Codex or OpenCode 2.
Likely fix area
Holding the queue makes sense after a real provider failure. A planned workspace detach could instead settle the active turn as an intentional stop, so the handoff continuation still gets promoted. A maintainer will decide on the fix direction.
Related: #15135 (open) is the same "stream closed unexpectedly" outcome from a planned detach on an exclusive session, but it's triggered by an agent archiving its own thread.
Workaround
Your workaround is the right one: launch the worker with t3_thread_launch and a worktree workspaceStrategy, so the session starts inside the worktree. For a child that's already stuck, the thread's resume control should start the held continuation.