Repository navigation
fix(*): move the codex and claude code adapters to their current builds - #752
Merged
Merged
Conversation
The Web picker offered Codex nothing newer than GPT-5.6. The list is fetched over ACP, but it comes from the codex binary the pinned codex-acp build bundles: 1.1.14 carries codex 0.147.0, whose model/list stops at GPT-5.6, while 1.13.1 carries 0.156.1 and lists the GPT-6 family. The Claude Code pin had the same shape: 0.66.0 offers no Fable 5.1, and 0.81.1 is the current build. Bumping the constants alone reaches only rows added afterwards, because subagents.add copies the preset command into config.json. Config migration 11 therefore carries a preset row still on the exact stock command of a retired pin to the command its preset ships now. Edited commands and hand-written rows are left alone, and the new command is a new capability-snapshot fingerprint, so the boot backfill re-measures the menu instead of serving the old build's. Measured before trusting the carry: codex-acp 1.13.1 reopens a thread 1.1.14 created, and claude-agent-acp 0.81.1 reopens sessions 0.66.0 and 0.79.0 created. Both new builds keep one session's MCP servers to that session, and the codex and claude dialects read their frames as before. Co-authored-by: Claude (claude-opus-5-5[1m]) <noreply@anthropic.com>
Handsome-wzw
approved these changes
Sep 23, 2026
gloryfromca
reviewed
Sep 23, 2026
gloryfromca
left a comment
Member
There was a problem hiding this comment.
No blockers; this can merge as far as I am concerned.
I found no actionable defects in this revision. The stable npm tags match the proposed pins (claude-agent-acp 0.81.1 and codex-acp 1.13.1), and the versioned migration advances only exact stock commands with matching preset provenance while preserving renamed rows, custom pins/flags, malformed values for schema diagnostics, and session continuity.
I covered the AGENTS.md rules and domain vocabulary, the complete diff, config-load/persistence and preset callers, relevant history, backward compatibility and rollback behavior, test-strength changes, and the config/agent package dependency boundary. Existing tests were not weakened.
Verification:
uv run pytest tests/test_config_loader.py tests/test_subagent_third_party.py tests/test_acp_dialects.py -q: 390 passed.- Ruff check and format check on all six touched files: passed.
uv run --frozen --python 3.12 --all-extras pytest -q: 26,134 passed, 122 skipped, 1 unrelated pre-existing failure in untouchedtests/test_cli_theme.py::test_bold_accent_renders_styled_not_bare.- Source-language, commit-message, PR-title, and whitespace gates: passed.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The Agent Connector page's Codex model picker offered nothing newer than GPT-5.6. The picker already draws the model list the agent advertises over ACP (
session/new->configOptions); the list was old because the pinned adapter was old.codex-acpbuilds its model choices from the codex binary it bundles, and@agentclientprotocol/codex-acp@1.1.14bundles codex 0.147.0, whosemodel/liststops at GPT-5.6, while 1.13.1 bundles 0.156.1 and lists gpt-6-astra, gpt-6-sol and gpt-6-luna. The Claude Code pin has the same shape:claude-agent-acp0.66.0 offersclaude-fable-5[1m]where 0.79.0 and 0.81.1 offerclaude-fable-5-1[1m].What changes:
codex-acp1.1.14 -> 1.13.1 andclaude-agent-acp0.79.0 -> 0.81.1, the current npm releases of both._migrate_retired_shim_pins.subagents.addcopies the preset command intoconfig.json, so a bumped pin never reached rows already configured; a row added before feat(*): take the agents page to the agent hub prototype #559 still launchesclaude-agent-acp@0.66.0. The migration moves a row that names the preset and still carries the exact stock command of a retired pin to the command that preset ships now, in memory and in the file, and says so once. An edited command, a hand-written row running the same string withoutpreset, and a row carrying another preset's retired command are left alone. The new command is a new capability-snapshot fingerprint, so the boot backfill re-measures the model list instead of serving the old build's._RETIRED_SHIM_COMMANDSspells the stock commands insideraven/configrather than importing the preset table, for the reasonraven.config.agent_namesgives. A test pins its current commands equal to the presets', so the next pin bump fails until it extends the table.Why a migration and not the remove-and-add a transport change gets (
_upgrade_transport): that path is manual because a transport change strands the row's session handles, and a pin bump does not. Measured: codex-acp 1.13.1 reopens a thread 1.1.14 created, and claude-agent-acp 0.81.1 reopens sessions 0.66.0 and 0.79.0 created, transcripts replayed. The table only takes a pin with that measurement behind it.Not in this PR:
pi-acp@0.0.33, is already its latest release.subagents.update->_refuse_unless_it_answers->ping_agent) sends its proof ping without the picked model, so it proves the agent's default rather than the pick: a pick of gpt-6-sol passed its gate on a ping the codex rollout records as gpt-5.6-sol. Real dispatches do apply the pick (see Verification). Left for its own change.Type
Verification
uv run --frozen --python 3.12 --all-extras pytest -qon this head: 26142 passed, 1 failed, 114 skipped. The failure,tests/test_install_script.py::test_resolve_node_dir_answers_each_case_it_exists_for, fails the same way on a clean extract of this branch's base commit on this machine (its node-without-npm case finds an npm elsewhere on PATH and settles on the system node), and this change touches neither the installer nor that test.Mutation check on the three migration tests: 9 mutants, each turning at least one of them red. They drop the in-memory pass, drop the file pass, leave either pin un-bumped, ignore the
presetfield, gate on the previous floor, drop the Claude entry, and drop either retired Claude command.Gates, each exit 0:
scripts/check_commit_messages.py origin/main..HEAD,npx commitlint --from origin/main --to HEAD,scripts/check_large_files.py,scripts/check_source_language.py,lint-imports(10 contracts kept),ty check,ruff check,ruff format --check.ACP handshake plus
session/newagainst the real adapters, no prompt: codex-acp 1.1.14 advertises 4 models and 1.13.1 advertises 7, with gpt-6-astra, gpt-6-sol and gpt-6-luna first; claude-agent-acp 0.81.1 offersclaude-fable-5-1[1m]under themodeloption.One real turn each through
build_third_party_backend(...).run(..., session_model=...)on the shipped presets: codex answered ongpt-6-soland Claude Code onclaude-haiku-4-5-20251001, each with one shell tool call. The model is read from the agent's own session record (turn_context.modelin the codex rollout,message.modelin the Claude Code session file), not from the reply.Cross-version reopen,
session/loadwith no prompt: a thread codex-acp 1.1.14 created reopens on 1.13.1, and sessions claude-agent-acp 0.66.0 and 0.79.0 created reopen on 0.81.1. All replay their transcripts.MCP isolation on both new builds: one connection, two sessions, a stdio probe server granted to the first. The first returned the probe's token and the second answered that it had no such tool.
Frames read through the dialects on the new builds: codex read and command frames through
CodexDialect, claudeRead,BashandWritethroughClaudeCodeDialect. The claude claims the dialect rests on hold on 0.81.1:_meta.claudeCode.toolName, a fenced second copy of the output,rawInput: {}on announce, aWritediff witholdText: nullfor a new and for an existing file, andmcpCapabilitiesof{http, sse}.End to end,
raven webfrom this branch on a real~/.ravenin daily use (stamp 10, Codex on 1.1.14, Claude Code on 0.66.0), first on a copy (gateway.hoston loopback, a2a and the memory plugin off) and then on the original: the stamp went to 11, both rows moved in the file with one notice each, the boot backfill re-measured both within 30 s, and the Agent Connector pickers listed6 Astra, 6 Sol, 6 Luna, 5.6 Sol, 5.6 Terra, 5.6 Luna, 5.5for Codex andDefault (recommended), Opus 5.5, Fable 5.1, Sonnet 5, Haiku 4.5for Claude Code. A model already picked on a row stays picked; only the launch command moves.Relevant tests pass locally
Relevant lint / type checks pass locally
User-facing docs or screenshots are updated when needed
No user-facing doc names either adapter version, so there is nothing to update.
Risk
Security impact considered
Backward compatibility considered
Rollback path is clear for risky changes
Both adapters run with full access and hold the agent's own login. Both new builds are published by GitHub Actions with SLSA provenance from the same repositories as the builds they replace. Both were published on 2026-09-23, hours before they were measured here. MCP session isolation was re-measured on both (see Verification), so
sessionMcpstays true for both presets.Changed on the wire and handled: codex-acp 1.13.1 no longer sends
_meta.codex.paramson permission requests, so Raven falls back torawInput.command(and underagent-full-accesscodex asks for none); mode display names changed while the ids did not; claude-agent-acp dropped thedontAskmode after 0.66.0, and nothing in Raven names a Claude mode id.Not re-measured on the new builds: cancel latency (the bound in
raven/acp_client/client.pywas measured on 0.66.0 and 1.1.14, and exceeding it is a handled state), and the codex web search, apply_patch, MCP and image tool frames.The first connect after upgrading downloads the new adapter through
npx: 387 MB on disk for codex-acp 1.13.1. The old build stays in the npx cache.Rollback: revert the PR. Reverting the code leaves a migrated row on its new command; editing
commandback restores the old pin, and the migration stamp keeps it from being moved again.Related Issues
N/A