Skip to content

fix: save the composer's model pick on the chat so every view names the next run's model - #640

Merged
iamnbutler merged 3 commits into
mainfrom
fix-model-next
Oct 22, 2026
Merged

iamnbutler merged 3 commits into
mainfrom
fix-model-next

Conversation

@iamnbutler

@iamnbutler iamnbutler commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

The composer, the details sidebar and ace info now name the same model for a chat's next run, after a default model change, Automatic, or a pick from another client.

  • A composer pick (model or effort) now sets the chat's model right away through a new channel select request, instead of waiting in browser storage until a send. Details, ace info and other clients see it at once, and it survives reload because the chat holds it.
  • Channels send an agent event to watchers that opt in when a chat's model or effort changes. The app reads info again on that event and when host settings change.
  • ChannelInfo.automatic says what Automatic resolves to. The composer shows Automatic (claude-opus-5-5), details show claude-opus-5-5 (Automatic) for a chat with no model yet, and ace model prints Automatic (anthropic/claude-opus-5-5).
  • A busy chat refuses the pick right away, with the same message a send used to get.

Smoke-tested on an isolated loopback host (own ACE_HOME, config, keychain service, port 4955), using a headless browser and the CLI with real Anthropic and OpenAI keys:

  1. New channel: composer Automatic (claude-opus-5-5), details claude-opus-5-5 (Automatic), ace info automatic: claude-opus-5-5.
  2. Default changed to sonnet in Settings in a second window: the first window changed to Automatic (claude-sonnet-5-5) without a reload, and so did details and the CLI.
  3. Picked haiku without sending: composer, details, ace info and a second client all showed claude-haiku-4-5.
  4. Effort Low → all three showed · Low. Automatic → all three showed claude-sonnet-5-5 · Low. After a reload they still matched.
  5. A second client picked gpt-6-luna: the first window followed without a reload.
  6. Sent with haiku picked: the reply was labeled claude-haiku-4-5 and answered OK.

Map: ^378, ^46, ^517, ^543.

Part of #618. Not covered here: grouping and key marks in Settings → Default model, a model on the Dashboard composer, and new channels starting on the last-used model.

Built in Ace

No. This was made from Claude Code as a fix-train worker, using a headless Chromium to drive an isolated source host. Ace has no way yet to run an agent-driven fix queue across several workers like this (#5).

…he next run's model

The composer's pick lived in browser storage until a send, so details, `ace info` and
other clients named a different model. A pick now selects the chat's model and effort
through a new `select` request; channels announce the change to watchers, and info
names what Automatic resolves to, which a default model change moves.

Why: apps/app/src/composer.tsx#function Composer | the chat holds the model and effort pick (select op); the composer must not keep its own browser copy, or details and the CLI disagree with it
@iamnbutler
iamnbutler merged commit e04cc04 into main Oct 22, 2026
1 check passed
@iamnbutler
iamnbutler deleted the fix-model-next branch October 22, 2026 20:31
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.

1 participant