Here is an isolated reproduction on 0.0.46-nightly.20261012.3010 (d83929ad), Codex 0.160.1, gpt-6.1-sol. It also shows the related parent_not_active failure from #16808 / #19751.
Control: native child, parent ends its turn
- Through
delegate_task, start a Codex thread (the "parent") with this instruction: spawn one helper with the nativespawn_agent, do not wait for it, end the turn. - The helper runs
sleep 90. It then callst3_thread_sendto the parent's own thread id.
Result:
- The parent's turn ends at 16:53:23 and the helper finishes at 16:54:57.
- The helper's
t3_thread_sendfails with{"code":"parent_not_active","message":"The calling provider no longer owns an active thread run."}. - The parent never gets another run. Its latest run was still ordinal 1 when we checked about 25 minutes later.
Same steps with delegate_task instead of spawn_agent
- The parent's turn ends at 16:53:11 and the grandchild finishes at 16:54:46.
- The grandchild's
t3_thread_sendsucceeds, because it runs under its own live run. - The parent is woken at 16:54:44 by the send and at 16:54:46 by the delegated-completion notification, with no user message.
Impact in real use
We measured this from statev2.sqlite by grouping each finished child under the parent's next run.
| Codex coordinator thread | Claude threads (all) | |
|---|---|---|
| Incidents where children finished after the parent's run ended | 27 | 484 |
| Incidents where only a user message resumed the parent, more than 15 min later | 7 (43 to 594 min each) | 20, across 13 threads |
Delay to resume when the children were delegate_task jobs | 0 to 11 min, always automatic | n/a |
Claude is mostly fine because its background-agent notifications become wake runs. Codex native children have no equivalent path. The cohort/delivery logic only covers origin === "app_owned".
The coordinator switched to native subagents partly because of the delegate_task description, which says "Prefer native subagent tools for same-provider work only when they support the chosen model." That steers Codex-to-Codex fan-out into this path.
Workaround we're using
A Codex PreToolUse hook denies *spawn_agent* when T3CODE_CLI_PATH is set. The deny message tells the agent to use delegate_task instead.
--disable multi_agent --disable multi_agent_v2 on the app-server does not remove collaboration.spawn_agent on Codex 0.160.1. We verified native spawn still succeeds with both flags.
Possible fixes
Either of these would help:
- (a) When a
provider_nativechild settles after its parent run has completed, queue a wake through the same delivery used for app-owned tasks. - (b) Keep the parent run in
waitingwhile native children are alive. The runtime liveness check already counts them.
The tool-description guidance should also say that native children don't resume an idle parent. #19751 fixes the credential half, but not the missing wake.
Minor, found while testing: if the Codex app-server process exits underneath T3, later turns on that instance keep failing with Codex App Server process exited with code 0 instead of starting a new process.