Skip to content

feat(threads): model change marker shows effort, fast mode and other parameters - #294

Merged
adampeterhiggins merged 2 commits into
mainfrom
ah/parameter-change-markers
Oct 13, 2026
Merged

adampeterhiggins merged 2 commits into
mainfrom
ah/parameter-change-markers

Conversation

@adampeterhiggins

@adampeterhiggins adampeterhiggins commented Oct 13, 2026 •

Copy link
Copy Markdown
Owner

Switching models in a thread leaves a "Model changed" divider, but changing a parameter of the same model (effort, fast mode, context window, thinking, OpenCode agent/variant, and so on) left nothing in the transcript, and the divider never said which parameters either side ran with.

How

  • One divider for every change. The model_change turn item is now recorded when the model or any of its options change, and it always renders as Model changed. Each side names the model and its parameters, labelled exactly as the composer's traits picker labels them, e.g. Claude Opus 5.5 High → Claude Opus 5.5 Max Fast, or Claude Opus 5.5 High → Claude Sonnet 5.5 High for a model switch.
  • Provider-agnostic. Labels and defaults come from the option descriptors every provider already advertises, so Codex, Claude, Cursor, Grok, OpenCode, Antigravity, ACP and the rest work without per-adapter code.
  • No phantom markers. With descriptors (clients), an omitted option resolves to the provider default, prompt-injected values such as Claude's ultrathink resolve to the default they dispatch as, and stale options the model doesn't offer are ignored. The orchestrator stays pure, so it compares raw values; if that records something the client can't resolve to a real difference, the row renders nothing.
  • No contract change. The item already carried the full from/to ModelSelection. The steer-restart path already compared full selections.
  • buildTraitsTriggerDisplay moved unchanged from the web TraitsPicker to @t3tools/shared/model so mobile's ThreadModelChangeRow renders the same text. Mobile's activity preview/inspector and the MCP thread text describe both selections with their options.
  • Updated docs/fork-differences.md.

Screenshots

Same thread on Claude Opus 5.5 at High effort, composer changed before sending.

Before: effort → Max + Fast Mode on, no marker After: same change After: model switch
No marker Model changed · Claude Opus 5.5 High → Claude Opus 5.5 Max Fast Model changed · Claude Opus 5.5 High → Claude Sonnet 5.5 High

Verification

  • vp test run for modelChangeMarker.test.ts (option-only change recorded; explicit default and ultrathink produce no pending divider; composer-style labels) and TraitsPicker.test.ts, plus server orchestration/MCP suites, mobile threadActivity* and web session-logic tests.
  • tsc-rs --noEmit passes for shared, server and mobile. Web's only error is pre-existing, in terminal/ghostty/surface.test.ts.
  • Checked the pending divider in the web client against a copy of real thread data (screenshots above). Mobile not checked in a simulator.

🤖 Generated with Claude Code

adampeterhiggins and others added 2 commits October 13, 2026 14:23
Changing effort, fast mode, context window or any other model option left no
marker in the transcript, unlike a model switch. The model change marker now
records option-only changes too and renders them as "Model settings changed"
with each option's old and new value, on web, mobile and in MCP thread reads.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Option-only changes no longer get their own "Model settings changed"
divider. Every change is a "Model changed" divider whose two sides name the
model and its parameters, labelled as the composer's traits picker labels
them (e.g. "Claude Opus 5.5 High → Claude Opus 5.5 Max Fast"). The traits
label builder moves to @t3tools/shared/model so mobile renders the same text.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@adampeterhiggins adampeterhiggins changed the title feat(threads): mark effort, fast mode and other model option changes feat(threads): model change marker shows effort, fast mode and other parameters Oct 13, 2026
@adampeterhiggins
adampeterhiggins merged commit 3d2d038 into main Oct 13, 2026
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