openai / openai/codex

Native subagent reports to unrelated fork via cross-thread messaging instead of its recorded parent

Open
#45,372 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

app bug subagent
Dominant language
Rust
Stars
125k
Forks
19.4k
PR merge metrics
PR metrics pending

Description

Summary

A native subagent spawned by thread A sent a progress report to thread B, a user-created fork of A with a different active task. B then responded to that unrelated report.

The sender explicitly supplied B's ID to mcp__codex_app__send_message_to_thread. This is not evidence that the transport delivered to the wrong requested ID. It is an observed parent-routing/tool-selection failure, with a possible tool-discovery or runtime contribution that remains unconfirmed.

Environment

  • Codex Desktop on macOS.
  • Affected fork's session metadata records bundled CLI 0.154.0-alpha.6.2.
  • Native collaboration subagents; implementation worker spawned with fork_turns: "all".
  • Code-mode tool orchestration via functions.exec; Codex app thread-management tools also available.
  • Custom orchestration guidance is present. The currently inspected guidance explicitly distinguishes native subagent reporting from cross-task messaging; its exact incident-time contents have not been established.
  • Exact Desktop About version and effective worker model are not established by this report.

Observed sequence (2026-09-14, UTC)

Thread IDs and business content are replaced with A/B/W below.

  1. 05:07:06: B is created as a fork of A. Session metadata records forked_from_id: A. B is subsequently used for a different task.
  2. 06:36:58: While handling that different task, B attempts collaboration.interrupt_agent for an agent from A's inherited history. It gets live agent path /root/<historical-worker> not found. This suggests confusion between inherited history and live team membership, not proof that the fork owns A's agents.
  3. 07:06:38: A spawns native worker W. W's session metadata records:
    {
      "source": {
        "subagent": {
          "thread_spawn": {
            "parent_thread_id": "A",
            "depth": 1,
            "agent_path": "/root/renewal_model_integration",
            "agent_role": "worker"
          }
        }
      }
    }
    
  4. 07:06:51: W searches ALL_TOOLS for send_message|collaboration|agent. Its runtime instructions explicitly say collaboration tools are direct calls and are absent from functions.exec's tools.* namespace. They also state that its final response is delivered to its parent.
  5. 07:17:45: W calls mcp__codex_app__list_threads({limit:50}).
  6. 07:17:54: W explicitly calls:
    await tools.mcp__codex_app__send_message_to_thread({
      threadId: "B", // not recorded parent A
      prompt: "<implementation progress report>"
    });
    
  7. B records an incoming codex_delegation with source_thread_id: W and the implementation report. B replies to that report at 07:18:02, despite its active subject being unrelated.

These observations come from read-only inspection of the parent, fork, and worker rollout records. No synthetic reproduction has been attempted.

Expected behavior

  • A native worker should report to its immediate spawning coordinator through native messaging or its final response.
  • Parent identity should be unambiguous and should not require discovery through the user-facing task list.
  • If native progress messaging is unavailable, the worker should fall back to its native final response, not infer a destination from related/forked chats.
  • A fork should not treat inherited agent references as current live team ownership.
  • Cross-task messages from native workers should require an explicitly assigned destination/purpose, or otherwise have a guardrail against accidental unrelated-thread sends.

Impact

An unrelated task is resumed and its context contaminated by a worker update. The intended coordinator may miss the update. This creates a risk of scope confusion; this report does not establish unauthorized external writes or business-data corruption resulting from the misplaced message.

Uncertainty / investigation request

The immediate wrong-ID selection is confirmed. The logs inspected do not prove that native collaboration messaging was actually unavailable to W; absence from ALL_TOOLS is not proof of absence from direct tool declarations. Please investigate whether this is model/tool-selection behavior alone or whether worker tool exposure, parent-identity presentation, or fork-context handling contributes.

Useful regression coverage would include a native worker whose parent has a user-created sibling fork, a missing/ambiguous progress-message capability, and a fork containing historical subagent references.

Privacy

No raw conversations, business data, account identifiers, private paths, credentials, or original thread IDs are included. A/B/W are placeholders. This report deliberately separates confirmed routing behavior from unverified runtime hypotheses.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the parent, fork, and worker rollout records, including session metadata and the ALL_TOOLS inspection, then trace the native collaboration and mcp__codex_app__send_message_to_thread entry points. No source files or tests are named in the report. Done means establishing whether parent identity, tool exposure, or fork handling contributes and adding regression coverage for a sibling fork, missing or ambiguous messaging, and historical subagent references.

Written by the indexing model from the issue text.

Assessment

Tech stack
rust
Domain
ai-infra-agents
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
42/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.