v3.0.7
Changed
- Migrated to
agent-client-protocol0.11 (pinned>=0.11,<0.12). ACP 0.11 removed model channel 1
(session.models/SessionModelState/ModelInfo/session/set_model) outright. Rutherford now reads
the legacy channel defensively (a config-only 0.11 response no longerAttributeErrors at session open) and
selects models through the survivingconfigOptionschannel and, for launch-flag agents, the process argv.
The ACP client conforms to the 0.11Clientprotocol — it adds the elicitation callbacks
(create_elicitationis declined, since Rutherford drives agents headless) and matches the reordered
filesystem / terminal / permission signatures. The upper cap is load-bearing: it keeps a future breaking
minor from resolving into a runtime break rather than an install-time error. - Provenance is stricter.
DelegationResultnow tracksrequested_model(the pre-effort request) versus
selected_model(the model an in-session ACP selection actually confirmed), andprovenance.confirmedis
Trueonly after a verified in-session selection — never a config echo or a launch-argv intent.
provenance.modelremains the effective model that ran, so cross-model diversity and the correlation
discount keep their lineage key.
Added
- Cursor model selection via a launch
--modelflag (newAgentDescriptor.model_launch_flag). Cursor
applies its model from the process argv rather than an in-session ACP call, including effort-encoded
compound ids (…[effort=high,fast=false]), and inherits the flag on a config clone that reuses the built-in
launch command. Launch-flag selection is validated advisorily and never blocks a turn on a missing ACP
advertisement (the model is on the argv regardless). Contributed by
@Artemonim in #10. capabilitiesreports static per-agent model metadata —default_model,fallback_model,
model_selection(launch_argvfor launch-flag agents, elsein_session), andeffort_capable— without
spawning the agent; usedoctor(connect_only=true)for live advertised model ids.
Fixed
- An unconfirmable requested model fails loudly instead of silently running the wrong one. When a caller
names a model (or effort rewrites one) that the agent advertises on no ACP channel, the turn fails
MODEL_UNAVAILABLErather than quietly falling back to the agent's default. A descriptor default the agent
does not advertise — for example a Bedrock/Vertex provider id applied via an injectedANTHROPIC_MODEL,
never on an ACP channel — remains a soft-skip, so a Bedrock/Vertex Claude Code seat is unaffected. - A model-selection failure can no longer leak the spawned agent process. The session tears the agent down
before a post-handshakeMODEL_UNAVAILABLEpropagates, so a rejected model does not orphan a process tree.
Thanks to @Artemonim for the Cursor ACP model-routing contribution in #10.