Skip to content

fix(*): move the codex and claude code adapters to their current builds - #752

Merged
LivXue merged 1 commit into
mainfrom
fix/keep_acp_adapters_current
Sep 23, 2026
Merged

LivXue merged 1 commit into
mainfrom
fix/keep_acp_adapters_current

Conversation

@LivXue

@LivXue LivXue commented Sep 23, 2026

Copy link
Copy Markdown
Member

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-acp builds its model choices from the codex binary it bundles, and @agentclientprotocol/codex-acp@1.1.14 bundles codex 0.147.0, whose model/list stops 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-acp 0.66.0 offers claude-fable-5[1m] where 0.79.0 and 0.81.1 offer claude-fable-5-1[1m].

What changes:

  • codex-acp 1.1.14 -> 1.13.1 and claude-agent-acp 0.79.0 -> 0.81.1, the current npm releases of both.
  • Config migration 11, _migrate_retired_shim_pins. subagents.add copies the preset command into config.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 launches claude-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 without preset, 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_COMMANDS spells the stock commands inside raven/config rather than importing the preset table, for the reason raven.config.agent_names gives. 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's adapter, pi-acp@0.0.33, is already its latest release.
  • A recurring job that watches for new adapter releases and opens the bump PR. Its checks need a Codex and a Claude login, so it cannot run in GitHub CI; it is a separate change.
  • Found on the way, present since feat(*): take the agents page to the agent hub prototype #559: the model-change gate (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

  • Fix
  • Feature
  • Docs
  • CI / tooling
  • Refactor
  • Other

Verification

  • uv run --frozen --python 3.12 --all-extras pytest -q on 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 preset field, 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/new against 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 offers claude-fable-5-1[1m] under the model option.

  • One real turn each through build_third_party_backend(...).run(..., session_model=...) on the shipped presets: codex answered on gpt-6-sol and Claude Code on claude-haiku-4-5-20251001, each with one shell tool call. The model is read from the agent's own session record (turn_context.model in the codex rollout, message.model in the Claude Code session file), not from the reply.

  • Cross-version reopen, session/load with 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, claude Read, Bash and Write through ClaudeCodeDialect. 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, a Write diff with oldText: null for a new and for an existing file, and mcpCapabilities of {http, sse}.

  • End to end, raven web from this branch on a real ~/.raven in daily use (stamp 10, Codex on 1.1.14, Claude Code on 0.66.0), first on a copy (gateway.host on 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 listed 6 Astra, 6 Sol, 6 Luna, 5.6 Sol, 5.6 Terra, 5.6 Luna, 5.5 for Codex and Default (recommended), Opus 5.5, Fable 5.1, Sonnet 5, Haiku 4.5 for 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 sessionMcp stays true for both presets.

  • Changed on the wire and handled: codex-acp 1.13.1 no longer sends _meta.codex.params on permission requests, so Raven falls back to rawInput.command (and under agent-full-access codex asks for none); mode display names changed while the ids did not; claude-agent-acp dropped the dontAsk mode 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.py was 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 command back restores the old pin, and the migration stamp keeps it from being moved again.

Related Issues

N/A

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>
@LivXue
LivXue requested review from 0xKT and gloryfromca September 23, 2026 15:24
@LivXue
LivXue merged commit 5b0d004 into main Sep 23, 2026
22 checks passed
@LivXue
LivXue deleted the fix/keep_acp_adapters_current branch September 23, 2026 15:30

@gloryfromca gloryfromca left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

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 untouched tests/test_cli_theme.py::test_bold_accent_renders_styled_not_bare.
  • Source-language, commit-message, PR-title, and whitespace gates: passed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants