Switch a thread's model on one client (say mobile) and send. Later, send from another client that has used that thread before (say desktop). The thread goes back to the old model.
From one real thread's event log:
- 9/23: mobile sets the model to Opus 5.5 and sends 2 turns.
- 9/24: desktop sends
thread.meta-updated with the old model (Fable 5.1), right before its next turn.
Cause: web keeps a per-thread composer draft in localStorage. Its modelSelectionByProvider beats the server thread's modelSelection in deriveEffectiveComposerModelState. The draft is never cleared for existing threads. Promotion moves it onto the server thread, and clearComposerContent keeps the model after a send. On the next send, persistThreadSettingsForNextTurn sees a difference from the server model and writes the draft's stale model back.
Switch a thread's model on one client (say mobile) and send. Later, send from another client that has used that thread before (say desktop). The thread goes back to the old model.
From one real thread's event log:
thread.meta-updatedwith the old model (Fable 5.1), right before its next turn.Cause: web keeps a per-thread composer draft in localStorage. Its
modelSelectionByProviderbeats the server thread'smodelSelectioninderiveEffectiveComposerModelState. The draft is never cleared for existing threads. Promotion moves it onto the server thread, andclearComposerContentkeeps the model after a send. On the next send,persistThreadSettingsForNextTurnsees a difference from the server model and writes the draft's stale model back.