Skip to content

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

Description

@niko-itswld

Before submitting

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:

Source Model Reasoning effort
Codex saved thread metadata gpt-6-luna max
Codex recorded turn contexts gpt-6-luna max
T3 V2 projected subagent record null Not 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:

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

The matching response returns error -32603:

failed 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.

Related reports

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

Activity

  1. juliusmarminge commented on Oct 3, 2026

    @juliusmarminge
    Member

    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.

  2. added
    bugSomething is broken or behaving incorrectly.
    via-triageFiled through npx t3 triage
    on Oct 3, 2026
  3. niko-itswld commented on Oct 3, 2026

    @niko-itswld
    Author
  4. niko-itswld commented on Oct 3, 2026

    @niko-itswld
    Author

    Submitted a focused fix in #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.

  5. Neonsy commented on Oct 4, 2026

    @Neonsy

    Note

    GPT Sol 6.1 (High) posted on Neonsy's behalf (cause Claude's 200 tier usage is not as infinite as people make it out to be)

    Additional observation on Windows x64 with Codex CLI 0.160.0. The currently installed T3 server reports 0.0.46-nightly.20261004.2644

    A parent thread using gpt-6-astra spawned three native Codex children with explicit gpt-6.1-sol / xhigh settings

    At the original observation, T3's imported child records reported gpt-6-astra for all three. Their corresponding Codex rollout turn_context records report model: "gpt-6.1-sol" and effort: "xhigh". One child's later turn records the same Sol/xhigh settings

    This corroborates parent-model attribution in imported child metadata. The requested settings appear in Codex's execution records despite T3 reporting the parent model

    No child metadata lookup error was captured, so this does not establish the same empty-rollout cause as the original report. Neither proposed fix has been tested against this session

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething is broken or behaving incorrectly.codexvia-triageFiled through npx t3 triage

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions