Skip to content

[Bug]: keep-native-v1 catalog pin is overridden by global V2 in fresh Codex CLI 0.149 processes #2409

Description

@rrmlima

Summary

keepNativeChatGptOnV1 remains ineffective at runtime when the global Codex multi_agent_v2 feature override is enabled.

With OpenCodex 2.29.0 and Codex CLI 0.149.0, OpenCodex correctly writes the native ChatGPT catalog row as multi_agent_version: "v1" while routed rows remain V2. However, a brand-new codex exec --ephemeral process with features.multi_agent_v2.enabled=true still creates an encrypted V2 child task. The routed child fails before provider dispatch with unreadable_encrypted_agent_task.

This is a current CLI regression/reproduction of #2184, which covered the same mismatch in the Codex App and was closed after asking users to restart and report if it reproduced. Every A/B run below starts a fresh CLI process, so stale sessions, picker cache and a long-lived app-server are excluded.

Reproduction

Environment and models:

  • OpenCodex: 2.29.0
  • Codex CLI: 0.149.0
  • OS: Linux x86_64
  • Parent: native gpt-5.6-luna
  • Child: routed command-code/deepseek-deepseek-v4-flash
  • OpenCodex config: multiAgentMode: "v2", keepNativeChatGptOnV1: true

The same generated catalog was used on both sides of the A/B test:

gpt-5.6-luna                                    multi_agent_version=v1
command-code/deepseek-deepseek-v4-flash         multi_agent_version=v2
google-antigravity/gemini-3.7-flash             multi_agent_version=v2
google-antigravity/claude-opus-4-6-thinking     multi_agent_version=v2

The test prompt required exactly one spawn_agent call to the routed DeepSeek child, waited for an exact sentinel response, used no shell/files, and ran under the read-only sandbox.

A. Global V2 override enabled

codex exec \
  --ephemeral \
  --json \
  --sandbox read-only \
  -c 'features.multi_agent_v2.enabled=true' \
  --model gpt-5.6-luna \
  '<spawn exactly one command-code/deepseek-deepseek-v4-flash child and wait for its sentinel>'

Actual:

Agent errored:
code=unreadable_encrypted_agent_task
Routed V2 worker task is encrypted for the native ChatGPT backend and cannot be read by the selected provider.

B. Global V2 override disabled

codex exec \
  --ephemeral \
  --json \
  --sandbox read-only \
  -c 'features.multi_agent_v2.enabled=false' \
  --model gpt-5.6-luna \
  '<the same child model and sentinel contract>'

Actual:

spawn_agent completed
child status=completed
child sentinel received
parent sentinel returned

Only the global feature override changed. The catalog, parent, child, prompt contract, OpenCodex process and providers stayed the same.

Routed-parent controls also passed:

Parent Child Result
google-antigravity/gemini-3.7-flash command-code/deepseek-deepseek-v4-flash PASS
command-code/deepseek-deepseek-v4-flash google-antigravity/gemini-3.7-flash PASS
google-antigravity/claude-opus-4-6-thinking command-code/deepseek-deepseek-v4-flash PASS

This isolates the failure to native-parent surface selection. Routed V2 collaboration remains functional.

Expected behavior:

  • With multiAgentMode=v2, keepNativeChatGptOnV1=true, and a native ChatGPT parent, the effective parent surface is V1.
  • Routed catalog rows remain V2.
  • Native -> routed delegation does not create an unreadable encrypted V2 NEW_TASK under the documented mitigation.
  • ocx v2 status reports the effective state without contradiction.

Likely cause and suggested remediation:

The catalog is correct. The A/B result suggests Codex 0.149 resolves the global features.multi_agent_v2.enabled=true override before the selected catalog entry's explicit multi_agent_version: "v1" pin.

OpenCodex currently reports a contradictory state:

multi_agent_v2: ON — v2 multi-agent surface active
multi_agent_mode: v2 — ALL models forced to v2 surface
keep_native_chatgpt_on_v1: ON — ChatGPT-native rows stay v1 when mode is v2

A supported fix should establish one effective contract:

  1. Prefer a catalog-driven hybrid mode when keepNativeChatGptOnV1=true: global V2 override off, native rows V1 and routed rows V2. Preserve thread-limit semantics during the transition.
  2. If an installed Codex version cannot honor the hybrid pins, warn or reject the incompatible combination instead of claiming the mitigation is active.
  3. If fixed upstream in Codex, resolve the selected catalog entry's multi_agent_version before constructing the collaboration surface so an explicit model pin takes precedence over the global default.

Regression acceptance criteria:

  • A fresh native-parent CLI process respects the V1 pin.
  • Native -> routed and routed -> routed controls both pass.
  • Coverage starts a fresh process/session; catalog-only assertions are insufficient.
  • ocx v2 on, ocx v2 mode v2, ocx v2 keep-native-v1 on, sync, status, and thread-limit migration converge on the same contract regardless of command order.
  • Unsupported Codex versions receive a clear compatibility warning.

Related: #2184, #92, #1540 and #1533. The encrypted-task recovery in #1540 is a compatibility path after ciphertext exists; it does not make an ineffective keep-native-v1 contract correct.

Logs and screenshots

catalog native row: gpt-5.6-luna -> multi_agent_version=v1
catalog routed row: command-code/deepseek-deepseek-v4-flash -> multi_agent_version=v2

global override ON:
error.code=unreadable_encrypted_agent_task

global override OFF:
spawn_agent=completed
child=completed
parent=completed

No screenshots are required. Raw credentials, request headers, account identifiers, private prompts and raw encrypted_content were deliberately excluded.

Area

CLI

Version

OpenCodex 2.29.0; Codex CLI 0.149.0

OS

Linux x86_64

Config shape

{
  "multiAgentMode": "v2",
  "keepNativeChatGptOnV1": true,
  "subagentModels": [
    "gpt-5.6-luna",
    "command-code/deepseek-deepseek-v4-flash",
    "google-antigravity/gemini-3.7-flash",
    "google-antigravity/claude-opus-4-6-thinking"
  ]
}

Checks

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingcatalogModel catalog, slugs, visibility, routed entriescliCLI, config inject, packaging flags

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions