Skip to content

cross-model: Codex peer fails on every run under ChatGPT login because the default model is rejected; no same-family fallback is tried #1776

Description

@Fetterj

Problem

With the Codex CLI logged in through a ChatGPT account, the cross-model adversarial pass in ce-code-review and ce-doc-review fails on every run, and the host falls back to the in-process adversarial reviewer.

The worker requests M_CODEX="gpt-6-luna" (scripts/cross-model-adversarial-review.sh, same in cross-model-doc-review.sh). Under ChatGPT login the API returns:

{"type":"error","status":400,"error":{"type":"invalid_request_error","message":"The 'gpt-6-luna' model is not supported when using Codex with a ChatGPT account."}}

The message names the account, so the host reads it as "this route is unavailable for this user" and records the peer as unsupported. It is actually a model problem. On the same account:

codex exec -m gpt-5.6-sol -c 'model_reasoning_effort="xhigh"' --sandbox read-only --skip-git-repo-check "Reply OK"
# -> OK

references/cross-model-review.md already permits "the closest compatible same-target/same-family replacement" after an observed unavailable model. Nothing prompts the host to try one, so in practice the review loses its independent peer on every run.

Environment: compound-engineering v3.28.2, codex-cli 0.153.4, Claude Code host, ChatGPT login (codex login status → "Logged in using ChatGPT").

Workaround

Set CROSS_MODEL_MODEL_OVERRIDE_TARGET=codex and CROSS_MODEL_MODEL_OVERRIDE=gpt-5.6-sol in the host environment, or set cross_model_model: gpt-5.6-sol in .compound-engineering/config.local.yaml. --emit-adapter codex then shows -m gpt-5.6-sol for both scripts.

Suggestion

  1. In the codex adapter, classify a 400 whose message names the requested model as "model unavailable", not "route unavailable".
  2. On that error, retry once with a configured fallback list (for example cross_model_model_fallbacks: [gpt-5.6-sol]) before failing the route. Record the model that actually served in the receipt.
  3. In the coverage line, name the rejected model so the user can see the fix is a config key.

Related but distinct: #1261 (default model/effort choice), #1500 (namespaced ids), #1565 (effort values).

Activity

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

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions