Repository navigation
Description
Before submitting
- I searched existing issues and did not find an exact duplicate.
- I included enough detail to investigate the problem.
Area
apps/server
Summary
A Codex parent launches native subagents, ends its turn while they are still working, and expects their completion to resume it. The children finish and their results are available, but the parent stays idle until the user sends another message.
This has happened repeatedly. One incident was traced through the parent and child Codex transcripts and T3's stored run/subagent state. The affected children were recorded with origin: "provider_native", rather than as app-owned delegate_task jobs.
Steps to reproduce
This outline describes the observed workflow. A fresh, isolated reproduction with the generic task below has not been run.
- Start a Codex thread on Orchestrator V2.
- Ask it to launch a native subagent using
spawn_agent, for example to review a sufficiently large diff. - Let the parent finish its launching turn with a status message while the child continues. Do not have it remain in
wait_agent. - Let the child finish without sending another message to the parent.
- Inspect whether child completion starts a parent continuation.
- Send a manual message to the parent. It resumes and can retrieve the completed result.
Expected behavior
The parent continues when its delegated work finishes, without the user having to notice the stall and send a message.
If native subagents intentionally require the parent turn to stay active and explicitly wait, T3's injected instructions should state that requirement and direct agents to delegate_task for work that must resume an idle parent. They currently prefer native subagent tools for supported same-provider work without explaining this lifecycle difference.
Actual behavior
The parent completes its turn while its children are working. Child results are recorded, but no parent continuation starts from their completion.
In the clearest traced incident, the parent ended its turn, the lead reviewer finished about 20 minutes later, and a user message about 3 minutes after that restarted the parent. There was no intervening parent run. The parent then retrieved the finished review.
In another fan-out, seven native children finished after the launching parent turn ended. Parent turns during that period came from unrelated PR-watch notifications, rather than child-completion notifications. The review results were available during those turns. This supports a missing wake-up rather than missing child results.
Impact
Major degradation or frequent failure. Delegated workflows stall unless the user monitors the children and manually resumes the parent.
Version or commit
0.0.46-nightly.20261007.2774, Orchestrator V2.
The release tag points to 611132c171f3a821bd2e32f22261135cef6330ac. The source references below use that revision.
Environment
Linux x86_64 server, Codex provider, full access. The exact Codex CLI version was not established during this investigation.
Evidence and likely cause
Observed evidence comes from read-only inspection of the existing incident. No raw transcripts, database exports, screenshots, thread identifiers, project details, or local paths are attached.
Source inspection suggests a mismatch between native delegation and T3's completion-delivery mechanism:
T3OrchestrationInstructions.tsprefers native subagent tools when they support the selected model. It does not tell agents to keep the parent turn active until native children finish.emitSubagentTaskUpdateemits subagent and turn-item updates. It does not offer a parent continuation.turnHasRetainedBackgroundWorkchecks running commands and persistent dynamic tools, without including native subagents.emitOrDeferRootTerminaldefers terminalization for active descendants only when the root status is notcompleted.- The app-owned result-finalization and completion-delivery paths explicitly select
origin === "app_owned". The pending completion-delivery filter has the same restriction.
These are candidate causes from source inspection, not a verified patch. The investigation does not establish whether the intended fix belongs in T3's native completion handling, its injected instructions, or the provider's continuation contract.
Workaround
Sending a manual message to the parent restored progress in the traced incident.
Potential workflow mitigations are to keep the parent active with wait_agent, or use app-owned delegate_task for asynchronous work that needs a completion wake-up. Those alternatives have not been tested in a fresh reproduction of this incident.
Related reports
- #13490 covers missing wakes after follow-up turns on reused app-owned children. This report concerns native children completing after the spawning parent turn ends.
- #15567 concerns lost native Codex child tracking after a server restart. Here, child completion and results were recorded.
Suggested verification
Cover a native child completing after its parent turn ends, multiple children completing close together, and a child completing while an unrelated parent turn is active. Verify that results reach the parent without a manual prod and without duplicate continuations. If automatic native wakes are intentionally unsupported, verify that the instructions prevent the parent from ending its turn while relying on one.
Activity
nicsaul commentedon Oct 15, 2026
Here is an isolated reproduction on
0.0.46-nightly.20261012.3010(d83929a), Codex0.160.1,gpt-6.1-sol. It also shows the relatedparent_not_activefailure from #16808 / #19751.Control: native child, parent ends its turn
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.sleep 90. It then callst3_thread_sendto the parent's own thread id.Result:
t3_thread_sendfails with{"code":"parent_not_active","message":"The calling provider no longer owns an active thread run."}.Same steps with
delegate_taskinstead ofspawn_agentt3_thread_sendsucceeds, because it runs under its own live run.Impact in real use
We measured this from
statev2.sqliteby grouping each finished child under the parent's next run.delegate_taskjobsClaude 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_taskdescription, 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
PreToolUsehook denies*spawn_agent*whenT3CODE_CLI_PATHis set. The deny message tells the agent to usedelegate_taskinstead.--disable multi_agent --disable multi_agent_v2on the app-server does not removecollaboration.spawn_agenton Codex 0.160.1. We verified native spawn still succeeds with both flags.Possible fixes
Either of these would help:
provider_nativechild settles after its parent run has completed, queue a wake through the same delivery used for app-owned tasks.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 0instead of starting a new process.NOirBRight commentedon Oct 19, 2026
We observed the same behavior again on 2026-10-19 after updating T3 Code locally (Windows, Codex provider,
gpt-6.1-sol).In an isolated smoke-test conversation:
We stopped the test at that point. We did not send a follow-up to test whether the parent could retrieve the result, so this observation establishes the missing wake, not missing result delivery into a later parent turn.
The exact T3 build/commit and Codex CLI version were not captured for this test, so this is an additional reproduction report rather than verification against a specific merged revision.
We are retaining our workaround: keep the Codex parent turn active until required native subagents finish, with individual waits limited to about 60 seconds. This lifecycle distinction would also be useful to state explicitly in the injected guidance that currently prefers native subagents for supported same-provider work.
juliusmarminge commentedon Oct 22, 2026
Reproduced on current main
a12d6ed942, Linux x86_64, Codex CLI 0.163.0,gpt-6.1-sol, in the real web dev app with isolated state.sleep 90; parent ended withoutwait_agentat 22:56:36 UTC. Child completed at 22:58:10 with its result recorded, but no parent continuation started.Runtime transcript
viell-dev commentedon Oct 26, 2026
Note
Agent-authored and submitted on the owner's behalf by GPT-6 Astra via Codex.
The owner authorized this report but has not reviewed its text.
Additional Windows evidence from 2026-10-26, including an interaction with PR watching that can make the stalled workflow continue to look active.
Environment: Codex parent (
gpt-6-astra), native Codex implementation child (gpt-6.1-sol), and separate app-owned Claude review tasks. The currentt3_environment_readreports server0.1.0, Windows x64. I have not independently established the exact incident build or Codex CLI version.A recorded native-child completion without a parent continuation (UTC):
00:21:02.781: parent run completed while the native implementer continued.00:55:54.846: the native child's final result was recorded, reporting a clean, pushed implementation and completed local checks. It also reported that its T3 link/watch attempts had failed with inactive-run errors.01:00:44.872: the next parent run was requested by the user's “Keep going or tell me what the blockers are” message. The parent then recovered the completed work. There was no parent run between these events.The PR watch did not provide general workflow liveness:
01:04:51, the parent calledwatch_pull_requestwith the PR URL. It returnedwatching: true, wasWatching: false.02:01:44, another watch call returnedwatching: true, wasWatching: true; the parent finished at02:01:50.795.11:08:25.445, over nine hours later. The watch was still registered when checked. The native agent was no longer present in the native live-agent inventory; partial correction edits remained locally.The second interval is not proof that the child completed or that GitHub polling failed. The native child's T3 timeline only exposes its earlier result, so its later stopping point is not established. Existing CI was already green; a registered PR watch cannot substitute for waiting on local implementation work. This was also an orchestration mistake by the parent agent.
The useful distinction is that native completion, app-owned review completion, and PR-event delivery behaved differently in the same workflow. The injected preference for native same-provider delegation should make the required parent lifetime explicit. An active PR watch should not be presented or relied on as evidence that outstanding native work will resume the parent.
The user's requested fallback is bounded waits with explicit status checks; the mandatory PR-watching policy is the adjacent concern already tracked in #22369. No new duplicate issue, patch, fresh isolated reproduction, or claim of a verified root cause is intended here. This report uses scoped timeline reads; no raw transcripts, database exports, private paths, or session identifiers are attached.
If you prefer no further agent-authored reports from this account, please say so; we will honor that.
t3dotgg commentedon Oct 31, 2026
Note
🤖 Claude Opus 5.5 responding on behalf of Theo
Closing: this is covered by #23840, which landed. Reopen if an important part is still missing.