You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[Bug] Agent model composer-2.5[fast=false] set in Desktop but ACP session bills/runs as fast=true #4004
Buzz Desktop lets me set Fizz to composer-2.5[fast=false]. Harness env shows BUZZ_ACP_MODEL=composer-2.5[fast=false], but cursor-agent ACP actually runs composer-2.5[fast=true]. Cursor usage dashboard shows all agent turns as Composer 2.5 Fast.
Possible fix: map Desktop selection to a model ID ACP actually supports, or pass --model at cursor-agent startup (see Cursor forum threads on ACP model switching).
Suggested Buzz fixes: (1) buzz-acp declare parameterizedModelPicker in ACP initialize, (2) pass --model at cursor-agent spawn per agent, (3) fail loud on model mismatch instead of silent Fast fallback.
Buzz correctly propagates BUZZ_ACP_MODEL=composer-2.5[fast=false] through crates/buzz-acp/src/commands/launch.rs; the harness env is correct (per issue repro). cursor-agent ACP then ignores the suffix and defaults to composer-2.5[fast=true] on its own bug tracker. Identical ACP-client reports exist for PhpStorm/JetBrains and Zed with the same fallback.
The Buzz-side workaround would be to post-process the model list returned from cursor-agent's session/new into Desktop's model picker (so users can't pick a variant that isn't actually supported at startup), but that masks the upstream bug and the right fix belongs in cursor-agent. Suggest closing as upstream-blocked and tracking Cursor's own fix; the related systemic work for client-side catalog-vs-run mismatches is #3934.
#4519 may be relevant here, though it addresses the visibility of this, not the mismatch itself.
If composer-2.5[fast=false] isn't a byte-exact match for an entry in the harness catalog, resolve_model_switch_method (crates/buzz-acp/src/acp.rs:2110) returns None, and pool.rs:958 warns and starts the session on the agent's own default — which would present exactly as "Desktop says fast=false, session runs fast=true".
Whether that's what's happening here is checkable: with #4519 the picker shows <model> not applied when the harness refused the request. If the warning appears, the divergence is Buzz-side model resolution rather than an upstream cursor-agent bug; if it doesn't, the request was accepted and the discussion in this thread about upstream behaviour stands.
Worth noting #4054 deliberately pins exact-match semantics, so I've left the matching logic alone — #4519 only makes the outcome observable either way.
Adding a measurement that I think settles the open question in this thread, because it
contradicts the "upstream cursor-agent bug, close as upstream-blocked" reading above.
The non-fast variant is reachable from the same cursor-agent binary. The gate is a client
capability, so the fix is client-side.
Controlled pair
Two ACP handshakes against the same binary, same account, minutes apart, initialize + session/new only — no prompt, no turn. The only difference is one boolean in the client's initialize:
cursor-agent 2026.08.11-e8db854. In both runs the model list held 35 rows and exactly one
Composer 2.5 row; declaring the capability changes which form that row takes.
Why
The mode is chosen purely from the client capability:
and the two modes read different fields of the same model object:
variants enumerates model.variants[], one option per materialised variant. Only the fast
Composer 2.5 row is materialised, so a non-fast selection is unrepresentable and resolution
falls through to options[0].
parameterized does not read variants[] at all. It reads model.parameterDefinitions[],
where fast is an ordinary boolean whose values fall back to ["false","true"].
buzz-acp does not declare the capability — the string does not appear in the shipped binary —
so it gets variants mode by omission.
Two consequences worth separating
The persisted CLI selection is silently overwritten, not merely ignored. Once a session
resolves to the fast row, the adapter writes that resolution back into cursor-agent's own
persisted config on its next config flush. So a correctly-set non-fast selection is replaced
on disk, and re-setting it is undone within about an hour. It presents as configuration drift
with no author, which is a slow thing to diagnose.
Per Cursor's published pricing, Composer 2.5 is $0.50/$2.50 per M input/output and the fast
variant $3.00/$15.00 — 6× on both sides, for what Cursor describes as the same intelligence
differing in latency. For a long-running headless agent nobody is waiting on, that is the whole
delta. That is a list-price ratio rather than an observed invoice — I have not reconciled a
bill against it.
parameterDefinitions is also where thinking/reasoning/effort parameters live, and the adapter
has an explicit thought-level branch for them. So a client in variants mode would be unable to
select those either, for the same structural reason. I measured only fast, so treat the
generalisation as read-from-source rather than tested.
Corroboration
Same root cause reported against two other ACP clients: zed-industries/zed#57571 (whose reporter
worked around it by patching initialize to advertise the capability) and tiann/hapi#967, #968.
What I did locally
As a stopgap I put a small wrapper in front of cursor-agent acp: it reads only the first line
of stdin, sets _meta.parameterizedModelPicker, then execs the real binary and splices the
rest through untouched. After that the non-fast selection both applies and stops being
overwritten. I am not offering that as the fix — it is a local patch of someone else's
protocol negotiation and I would rather delete it. I mention it only because it is a workaround
people are independently reaching for, which seems like useful signal.
Happy to run any other handshake variation that would help.
Activity
NocturnusCoder commentedon Jul 31, 2026
Added a public screenshot copy — the Buzz relay media URL requires community auth and is not viewable by maintainers.
Gist: https://gist.github.com/NocturnusCoder/05290e272d734628939705d90887f83a
Update: Gist PNG was re-uploaded as proper binary (first upload was corrupted via API). Issue body restored after accidental wipe during edit.
NocturnusCoder commentedon Jul 31, 2026
Related: user reports Bumble (configured for Grok) also bills as Composer 2.5 Fast — likely systemic ACP model-switch failure, not Composer-specific.
NocturnusCoder commentedon Jul 31, 2026
Internet research — same issue across ACP clients (not Buzz-specific)
Cross-client reports with identical symptom (picker/env says X, usage bills
composer-2.5-fast):parameterizedModelPickercapability, only default variant per model; Composer default = Fast; no ETA for third-party clients)session/set_modelmetadata-only: https://forum.cursor.com/t/bug-agent-acp-model-switching-updates-session-metadata-but-does-not-change-the-inference-backend/157312clientCapabilities._meta.parameterizedModelPicker: true): Cursor ACP in Zed: Composer 2.5 Fast Mode Issue zed-industries/zed#57571Suggested Buzz fixes: (1) buzz-acp declare
parameterizedModelPickerin ACP initialize, (2) pass--modelat cursor-agent spawn per agent, (3) fail loud on model mismatch instead of silent Fast fallback.iroiro147 commentedon Aug 1, 2026
Confirmed: this is an upstream
cursor-agent/ ACP issue, not a Buzz bug.From the comments already on this issue:
Buzz correctly propagates
BUZZ_ACP_MODEL=composer-2.5[fast=false]throughcrates/buzz-acp/src/commands/launch.rs; the harness env is correct (per issue repro).cursor-agentACP then ignores the suffix and defaults tocomposer-2.5[fast=true]on its own bug tracker. Identical ACP-client reports exist for PhpStorm/JetBrains and Zed with the same fallback.The Buzz-side workaround would be to post-process the model list returned from cursor-agent's
session/newinto Desktop's model picker (so users can't pick a variant that isn't actually supported at startup), but that masks the upstream bug and the right fix belongs in cursor-agent. Suggest closing as upstream-blocked and tracking Cursor's own fix; the related systemic work for client-side catalog-vs-run mismatches is #3934.mikececco commentedon Aug 3, 2026
#4519 may be relevant here, though it addresses the visibility of this, not the mismatch itself.
If
composer-2.5[fast=false]isn't a byte-exact match for an entry in the harness catalog,resolve_model_switch_method(crates/buzz-acp/src/acp.rs:2110) returnsNone, andpool.rs:958warns and starts the session on the agent's own default — which would present exactly as "Desktop saysfast=false, session runsfast=true".Whether that's what's happening here is checkable: with #4519 the picker shows
<model> not appliedwhen the harness refused the request. If the warning appears, the divergence is Buzz-side model resolution rather than an upstream cursor-agent bug; if it doesn't, the request was accepted and the discussion in this thread about upstream behaviour stands.Worth noting #4054 deliberately pins exact-match semantics, so I've left the matching logic alone — #4519 only makes the outcome observable either way.
feat(managed-agents): close five Claude Code agent-config gaps (#4557)
feat(managed-agents): isolate Claude Code agent config per-agent root
feat(managed-agents): isolate Claude Code agent config per-agent root
feat(managed-agents): close five Claude Code agent-config gaps (block…
mkumas commentedon Aug 24, 2026
Adding a measurement that I think settles the open question in this thread, because it
contradicts the "upstream
cursor-agentbug, close as upstream-blocked" reading above.The non-fast variant is reachable from the same
cursor-agentbinary. The gate is a clientcapability, so the fix is client-side.
Controlled pair
Two ACP handshakes against the same binary, same account, minutes apart,
initialize+session/newonly — no prompt, no turn. The only difference is one boolean in the client'sinitialize:clientCapabilities._meta.parameterizedModelPickerconfigOptionsmodelcurrentValuefastoptionbuzz-acpsends today)mode,modelcomposer-2.5[fast=true]truemode,model,fastcomposer-2.5category: model_config, values["false","true"]cursor-agent 2026.08.11-e8db854. In both runs the model list held 35 rows and exactly oneComposer 2.5 row; declaring the capability changes which form that row takes.
Why
The mode is chosen purely from the client capability:
and the two modes read different fields of the same model object:
variantsenumeratesmodel.variants[], one option per materialised variant. Only the fastComposer 2.5 row is materialised, so a non-fast selection is unrepresentable and resolution
falls through to
options[0].parameterizeddoes not readvariants[]at all. It readsmodel.parameterDefinitions[],where
fastis an ordinary boolean whose values fall back to["false","true"].buzz-acpdoes not declare the capability — the string does not appear in the shipped binary —so it gets
variantsmode by omission.Two consequences worth separating
resolves to the fast row, the adapter writes that resolution back into
cursor-agent's ownpersisted config on its next config flush. So a correctly-set non-fast selection is replaced
on disk, and re-setting it is undone within about an hour. It presents as configuration drift
with no author, which is a slow thing to diagnose.
BUZZ_ACP_MODELunset entirely. In that case nosession/set_config_optionis attempted at all and the session still runs fast — so theexact-match path in
resolve_model_switch_method(fix(desktop): surface model requests the harness rejected #4519 / test(buzz-acp): pin exact-match boundary for unadvertised model variants (#4004) #4054) is not required to producethis symptom. Worth knowing, because a fix confined to model-string matching would leave this
case untouched.
Cost
Per Cursor's published pricing, Composer 2.5 is
$0.50/$2.50per M input/output and the fastvariant
$3.00/$15.00— 6× on both sides, for what Cursor describes as the same intelligencediffering in latency. For a long-running headless agent nobody is waiting on, that is the whole
delta. That is a list-price ratio rather than an observed invoice — I have not reconciled a
bill against it.
Possibly the same root cause as #6114
parameterDefinitionsis also where thinking/reasoning/effort parameters live, and the adapterhas an explicit thought-level branch for them. So a client in
variantsmode would be unable toselect those either, for the same structural reason. I measured only
fast, so treat thegeneralisation as read-from-source rather than tested.
Corroboration
Same root cause reported against two other ACP clients: zed-industries/zed#57571 (whose reporter
worked around it by patching
initializeto advertise the capability) and tiann/hapi#967, #968.What I did locally
As a stopgap I put a small wrapper in front of
cursor-agent acp: it reads only the first lineof stdin, sets
_meta.parameterizedModelPicker, thenexecs the real binary and splices therest through untouched. After that the non-fast selection both applies and stops being
overwritten. I am not offering that as the fix — it is a local patch of someone else's
protocol negotiation and I would rather delete it. I mention it only because it is a workaround
people are independently reaching for, which seems like useful signal.
Happy to run any other handshake variation that would help.
feat(managed-agents): close five Claude Code agent-config gaps (block…
feat(managed-agents): close five Claude Code agent-config gaps (block…