[Bug]: V2 Codex subagent model stays "Not reported" after metadata lookup fails#15250

openedOct 3, 2026byNniko-itswld

Before submitting

  • I searched existing issues. This is a V2 follow-up to closed #10185, with a captured child metadata lookup error.
  • I included enough detail to investigate the problem.

Area

apps/server

Steps to reproduce

  1. Open a Codex thread in T3 Code Nightly with the parent using gpt-6.1-sol.
  2. Have the parent spawn a native Codex subagent using gpt-6-luna with max reasoning effort.
  3. Hover the child in the Lineage list.
  4. Compare the model label with Codex's saved child metadata and turn records.

These steps describe an observed live session. The lookup failure was captured in its existing protocol trace. I have not established a deterministic fresh-session reproduction.

Expected behavior

The child tooltip displays its actual model once that metadata is available. A temporary metadata lookup failure does not leave the child model permanently unknown. Unknown child settings should not inherit the parent's model.

Actual behavior

The child appears as Luna Five Shutdown, with status and duration, but the tooltip's model label is Not reported.

The agent path is present as /root/luna_five_shutdown. The missing value is the model, not the task slug.

Read-only inspection of the same child confirms:

SourceModelReasoning effort
Codex saved thread metadatagpt-6-lunamax
Codex recorded turn contextsgpt-6-lunamax
T3 V2 projected subagent recordnullNot part of this model-label report

T3's t3_thread_list also reports the child's model as gpt-6.1-sol, matching the parent rather than the recorded child model.

Impact

Minor bug or occasional failure.

Users cannot verify the child model in Lineage. The thread-list metadata can also report the parent's model while the actual child runs a different one. Codex's own records confirm that the requested Luna model is running.

Version or commit

T3 Code Nightly 0.0.46-nightly.20261003.2610, commit 8ed276c246b6.

Environment

macOS 26.7.1, Apple Silicon, desktop app, Codex CLI 0.159.2. Parent model gpt-6.1-sol, child model gpt-6-luna, child reasoning effort max.

Logs or stack traces

Sanitized protocol trace for the affected child:

json
1{"method":"thread/resume","params":{"threadId":"<child-thread-id>","excludeTurns":true}}

The matching response returns error -32603:

text
1failed to read thread: thread-store internal error: failed to read session metadata <child-rollout-path>: rollout at <child-rollout-path> is empty

The rollout later contains the child's metadata and turn contexts, but T3's projected subagent still has model: null.

At the installed commit, CodexAdapterV2.ts does a one-shot thread/resume when task.model is null and catches the failure with Effect.catch(() => Effect.void). This explains why that lookup did not populate the model. The empty-rollout response supports a startup timing problem in this session; it does not establish the cause of every missing label.

Workaround

No verified UI workaround. Read-only inspection of Codex's saved child records confirms the actual model and effort.

  • #10185 covers the older Codex model/effort label issue and contains a similar active-child lookup failure. It is closed; this report concerns the V2 adapter in the current installed nightly.
  • #15214 covers absent reasoning-effort labels in V2. This report focuses on the missing Codex model and failed metadata recovery.

Investigated with Codex in T3 Code. No application files, provider settings, or live databases were changed during the investigation.

Note

Grok responding on behalf of Julius.

Triage

Thanks @niko-itswld for the careful, read-only investigation and the captured protocol trace.

Confirmed on current main (aad732901e). Your nightly (8ed276c) is an ancestor of it, and this lookup path hasn't changed since. This is the V2 version of #10185, which was closed when Orchestrator V2 shipped. It isn't #15214, which is about missing reasoning effort.

What I found

The Lineage title Luna Five Shutdown comes from the subAgentActivity path. That path registers the child with model: null and turns the agent path into the title. SubagentTooltipContent then prints Not reported whenever subagent.model is null.

The only recovery for that null is a single background thread/resume with excludeTurns: true, capped at five seconds. Any failure, including the -32603 empty-rollout error in your trace, is swallowed by Effect.catch(() => Effect.void), and nothing tries again once the rollout has metadata. thread/settings/updated and model/rerouted could still set the model later, but only if Codex sends them, and your projected subagent staying model: null means neither arrived.

t3_thread_list uses a different field. The child thread is created with the parent's modelSelection and keeps it while task.model is null. A later subagent.updated that carries a real model would switch it, but that never ran here, so the list still shows gpt-6.1-sol.

The existing adapter test covers a resume that succeeds and one that returns no model, but not one that errors at first and would succeed later. That's the same startup race seen on #10185.

Likely fix area

  • Retry the child metadata read a bounded number of times after an empty-rollout error, and stop once the child is gone or a settings or reroute event has already set the model.
  • Don't fall back to the parent's model in the tooltip. Once a real child model arrives, the existing thread sync should move t3_thread_list off the parent placeholder.
  • If retries still can't read a model, consider not presenting the parent's model as the child's in the thread list.

Open PR #14108 doesn't cover this case. It tries thread/read first and falls back to thread/resume only when that read succeeds with an empty model, so an empty-rollout error still ends the single attempt.

A maintainer will decide on the fix direction.

Synced from GitHub

FYI worked with Sonnet 5.5, no bug there. Maybe not deterministic. Verify further.

la 3.10.2026 klo 19.56 Julius Marminge @.***> kirjoitti:

juliusmarminge left a comment (pingdotgg/t3code#15250) https://github.com/pingdotgg/t3code/issues/15250#issuecomment-5971310561

Note

Grok responding on behalf of Julius. Triage

Thanks @niko-itswld https://github.com/niko-itswld for the careful, read-only investigation and the captured protocol trace.

Confirmed on current main (aad732901e). Your nightly (8ed276c) is an ancestor of it, and this lookup path hasn't changed since. This is the V2 version of #10185 https://github.com/pingdotgg/t3code/issues/10185, which was closed when Orchestrator V2 shipped. It isn't #15214 https://github.com/pingdotgg/t3code/issues/15214, which is about missing reasoning effort. What I found

The Lineage title Luna Five Shutdown comes from the subAgentActivity path. That path registers the child with model: null and turns the agent path into the title. SubagentTooltipContent then prints Not reported whenever subagent.model is null.

The only recovery for that null is a single background thread/resume with excludeTurns: true, capped at five seconds. Any failure, including the -32603 empty-rollout error in your trace, is swallowed by Effect.catch(() => Effect.void), and nothing tries again once the rollout has metadata. thread/settings/updated and model/rerouted could still set the model later, but only if Codex sends them, and your projected subagent staying model: null means neither arrived.

t3_thread_list uses a different field. The child thread is created with the parent's modelSelection and keeps it while task.model is null. A later subagent.updated that carries a real model would switch it, but that never ran here, so the list still shows gpt-6.1-sol.

The existing adapter test covers a resume that succeeds and one that returns no model, but not one that errors at first and would succeed later. That's the same startup race seen on #10185 https://github.com/pingdotgg/t3code/issues/10185. Likely fix area

  • Retry the child metadata read a bounded number of times after an empty-rollout error, and stop once the child is gone or a settings or reroute event has already set the model.
  • Don't fall back to the parent's model in the tooltip. Once a real child model arrives, the existing thread sync should move t3_thread_list off the parent placeholder.
  • If retries still can't read a model, consider not presenting the parent's model as the child's in the thread list.

Open PR #14108 https://github.com/pingdotgg/t3code/pull/14108 doesn't cover this case. It tries thread/read first and falls back to thread/resume only when that read succeeds with an empty model, so an empty-rollout error still ends the single attempt.

A maintainer will decide on the fix direction.

โ€” Reply to this email directly, view it on GitHub https://github.com/pingdotgg/t3code/issues/15250?email_source=notifications&email_token=CMRD36TNDFS7U4763WPDUFD5SEVTHA5CNFSNUABFM5UWIORPF5TWS5BNNB2WEL2JONZXKZKDN5WW2ZLOOQXTKOJXGEZTCMBVGYY2M4TFMFZW63VHNVSW45DJN5XKKZLWMVXHJLDGN5XXIZLSL5RWY2LDNM#issuecomment-5971310561, or unsubscribe https://github.com/notifications/unsubscribe-auth/CMRD36S7OIPOL2MJQBLLVW35SEVTHAVCNFSNUABGKJSXA33TNF2G64TZHMYTCNJTGEZTAMZUHE5US43TOVSTWNJWHEYTKOJTGI2DTILWAI . You are receiving this because you were mentioned.Message ID: @.***>

Synced from GitHub

Submitted a focused fix in https://github.com/pingdotgg/t3code/pull/15285.

This is low-hanging fruit for a quick review and merge: the existing Codex child-model lookup now retries the captured empty-rollout startup error within a fixed limit, preserves newer metadata, and stops retries for interrupted children. The regression fails before the fix; all 128 adapter tests and server typecheck pass afterward.

The PR links this issue and its triage comment, and records the verification limits. Maintainers decide merge timing.

Synced from GitHub

Same bug on a newer build: T3 Code nightly 0.1.1-nightly.20261017.3238 (desktop app, macOS 27 arm64, Codex CLI 0.163.0). The parent ran gpt-6.1-sol/xhigh. Every native subagent's chat view showed "Sol 6.1 xhigh", including one Codex ran as gpt-6-luna/high.

New finding: Codex 0.163.0 already puts the child's model in the subAgentActivity started item:

json
1{"type":"subAgentActivity","model":"gpt-6-luna","reasoningEffort":"high","kind":"started","agentPath":"/root/azure_design_luna"}

registerSubagentActivity (CodexAdapterV2.ts ~L3053 at tag v0.1.1-nightly.20261017.3238) passes model: null and no reasoningEffort, and the generated SubAgentActivityThreadItem schema doesn't include those fields. The fallback thread/read and thread/resume were sent in the same millisecond and both failed with -32603 โ€ฆ rollout at <rollout-path> is empty, so all four children in this run stored model: null. The child thread then kept the parent's modelSelection (~L2823), options included.

Regenerating the schema and passing item.model / item.reasoningEffort from the started item would fix this deterministically on current Codex, without depending on #15285's retry. The retry would still help older Codex CLIs that don't send these fields.

Investigated via t3 triage with Claude Code (Claude Opus 5.5). No files, settings or databases were changed.

Synced from GitHub

Additional occurrence of the misleading child-model label:

I explicitly requested that subagents use GPT-6-Luna, Extra High. T3 Code's child view instead displayed GPT-6.1-Sol, Extra High, matching the parent conversation. This made it appear that the requested subagent-model restriction was being ignored.

Expected: show the child's own reported model and reasoning effort, or clearly mark the value as unknown. Do not silently present the parent's model as the child's model.

This is a user-visible report of the label mismatch, not a claim that execution was actually routed to the wrong model. No local session logs, identifiers, machine details, or project information are included.

Related: #17694. Adding this occurrence to the existing open report instead of filing a duplicate.

Reproduced on 1688f96568: when the one-time metadata lookup for a native Codex child failed, the child's model stayed "Not reported" through completion. #22830 adds bounded retries for that lookup; in an isolated runtime the child recovered the correct model and effort within seconds and kept them through completion. Claude children, the mobile card and remote modes remain unverified.