Skip to content

fix: catalog effort ladders, v2 pin precedence, and combo owned_by (#2410 #2409 #2401) - #2630

Merged
lidge-jun merged 6 commits into
devfrom
codex/community-bugs-wave1
Aug 25, 2026
Merged

lidge-jun merged 6 commits into
devfrom
codex/community-bugs-wave1

Conversation

@lidge-jun

Copy link
Copy Markdown
Owner

Summary

Three community bug issues, each verified and falsified independently before merging.

#2410 — reasoningEfforts missing from the live catalog for newer opencode-go models

The reporter suspected a static table lagging new models, and that was right. gpt-5.6-luna and qwen3.8-max were missing from opencode-go's registry map while the same model ids exposed full effort ladders under OpenAI API and Alibaba Token Plan. Tooling infers "supports no efforts" from an empty ladder (src/server/management/shared.ts:260), so agent harnesses selecting programmatically skipped these models.

Filling today's holes alone would have left the asymmetry undetectable, so this also adds a cross-provider parity check — a same-model ladder mismatch now fails a test instead of waiting for the next report. The generated-metadata pipeline cannot supply this: it discards source thinking ladders and keeps only a boolean reasoning flag (scripts/generate-model-metadata.ts:69).

#2409 — keepNativeChatGptOnV1 ineffective when global V2 is enabled

OpenCodex was already writing the catalog split correctly. The precedence is in the Codex client: multi_agent_version_override() returns V2 whenever the global feature is on, before multi_agent_version_for_model() ever consults the row pin. So no amount of catalog stamping could fix this — the reporter's fresh-process A/B was measuring a client-side override winning.

Rather than write a row that cannot take effect, the pin and the global flag are now reconciled where OpenCodex actually owns the decision: enabling the pin disables the global override before syncing, ocx v2 mode v2 honours an existing pin, and a later ocx v2 on is rejected with an explanation of the precedence instead of silently producing the broken hybrid. Same contract on PUT /api/v2.

A user who set keepNativeChatGptOnV1 and got unreadable_encrypted_agent_task deserves to be told why — that is the actual fix here.

#2401 — combo rows expose owned_by: "combo"

"combo" is not a real provider, so OpenAI-compatible clients that select a dispatch adapter by owned_by fail (registration.adapter.prepareCall is not a function). Combo routing itself was fine; only the metadata was wrong.

The canonical catalog row keeps provider: "combo" — internal sync and cleanup depend on that marker, and changing it would break working behavior. Only the plain /v1/models serialization changes: owned_by: "openai" because the endpoint is OpenAI-compatible regardless of which target a failover picks, plus is_combo: true so the dashboard still classifies aliases correctly.

Named tradeoff: owned_by now describes the compatible inbound adapter rather than literal ownership. The primary target was rejected as the value because it becomes false after failover and would select the wrong wire adapter — worse than the current bug, silently.

Verification

bun x tsc --noEmit                                    exit 0
bun test <catalog, registry parity, keep-native-v1,
          v2 gate, combo failover e2e, api-access>    458 pass / 0 fail
bun run build:gui                                     ok
bun run privacy:scan                                  Privacy scan passed

Each fix was falsified separately: removing the registry rows reddens the ladder and parity tests; removing the v2 precedence hunks reddens four cases (pin left global on, explicit enable accepted, mode v2 re-enabling, API reporting enabled: true); reverting the serialization reddens both the server row shape and the GUI classification.

Checklist

  • Targets dev
  • Regression tests per fix, falsified individually
  • GUI classification change covered and the dashboard rendered
  • No credential, auth, workflow or release-automation surface touched

Closes #2410. Closes #2409. Closes #2401.

@lidge-jun
lidge-jun requested a review from Ingwannu as a code owner August 25, 2026 21:29
@lidge-jun
lidge-jun merged commit 324c1aa into dev Aug 25, 2026
3 checks passed
@lidge-jun
lidge-jun deleted the codex/community-bugs-wave1 branch August 25, 2026 21:29
@github-actions

Copy link
Copy Markdown
Contributor

✅ Deterministic PR hygiene checks passed.

@github-actions github-actions Bot added the bug Something isn't working label Aug 25, 2026
@coderabbitai

coderabbitai Bot commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

Next included review available in 46 seconds.

View limit details

Limit details: You’ve used all 10 included reviews currently available.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 5317e77c-4900-4607-917f-cd482cde6018

📥 Commits

Reviewing files that changed from the base of the PR and between faf70c4 and 461eddd.

📒 Files selected for processing (17)
  • docs-site/src/content/docs/guides/sub-agent-surface.md
  • docs-site/src/content/docs/reference/cli/agents.md
  • docs-site/src/content/docs/reference/configuration/agents.md
  • gui/src/api-access-models.ts
  • gui/src/pages/ApiKeys.tsx
  • gui/tests/api-access-models.test.ts
  • src/cli/v2.ts
  • src/providers/registry.ts
  • src/server/index.ts
  • src/server/management/agent-settings-routes.ts
  • structure/03_catalog-and-subagents.md
  • structure/05_gui-and-management-api.md
  • tests/codex-catalog.test.ts
  • tests/codex-v2-gate.test.ts
  • tests/multi-agent-keep-native-v1.test.ts
  • tests/provider-registry-parity.test.ts
  • tests/server-combo-failover-e2e.test.ts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Aug 25, 2026 •

Copy link
Copy Markdown
Contributor

⏳ DRAFT

  • UI screenshot required.

What to do

  • Add a screenshot of the UI change to the PR description.

Automatic draft conversion failed (token cannot change draft status). Please convert this pull request to a draft manually. The required enforce-target check will keep failing until every issue above is resolved.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 461eddd363

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/cli/v2.ts
Comment on lines +229 to +230
if (next && requiresGlobalV2Disabled(cfg.multiAgentMode, true)) {
const transition = transitionMultiAgentV2(false, enabled => runCodexFeatures(enabled ? "enable" : "disable", deps));

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve the V2 thread limit when entering hybrid mode

When a user has configured features.multi_agent_v2.max_concurrent_threads_per_session, enabling the hybrid pin calls transitionMultiAgentV2(false). That helper treats the change as a complete switch to V1: it deletes the V2 limit and writes a translated [agents].max_threads value. Routed catalog rows remain explicitly V2 in hybrid mode, so their configured concurrency limit disappears and they fall back to the upstream default. Disable the global override without removing the V2-specific limit, retaining limits for both surfaces while the hybrid is active.

AGENTS.md reference: src/AGENTS.md:L10-L10

Useful? React with 👍 / 👎.

Comment on lines +344 to +346
const requestedFlag = wantsFlag
? body.enabled as boolean
: modeFlag ?? (wantsKeepNative && hybridPinActive ? false : undefined);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Re-enable global V2 when the hybrid pin is cleared

With multiAgentMode: "v2" and the hybrid pin active, the dashboard clears the pin by sending only keepNativeChatGptOnV1: false. Here hybridPinActive becomes false, so this expression produces undefined and no transition runs, leaving the global feature disabled even though ordinary V2 mode normally enables it; the CLI's keep-native-v1 off path has the same one-directional behavior. Users must unexpectedly reselect V2 or run ocx v2 on to restore the standard state, so reconcile the flag in both directions when the pin changes.

AGENTS.md reference: src/AGENTS.md:L10-L10

Useful? React with 👍 / 👎.

tarunravi pushed a commit to tarunravi/opencodex that referenced this pull request Sep 14, 2026
…idge-jun#2410 lidge-jun#2409 lidge-jun#2401) (lidge-jun#2630)

* fix(catalog): expose opencode-go reasoning efforts

* fix(models): advertise combo rows via OpenAI adapter

* fix(codex): honor native v1 hybrid pin
agentHits pushed a commit to agentHits/opencodex that referenced this pull request Sep 17, 2026
…idge-jun#2410 lidge-jun#2409 lidge-jun#2401) (lidge-jun#2630)

* fix(catalog): expose opencode-go reasoning efforts

* fix(models): advertise combo rows via OpenAI adapter

* fix(codex): honor native v1 hybrid pin
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant