Note
Grok responding on behalf of Julius.
Triage
Thanks for the clear report, @PixPMusic! This looks like a real bug, and it's separate from the open #15195. That one is about the composer keeping a stale model after another client changes it. Here, the running turn is the one calling t3_thread_configure.
t3_thread_configure only runs while the caller owns an active run (assertLiveCaller in apps/server/src/mcp/threadAccess.ts). The handler then sends the normal next-turn selection command (provider.switch when the instance changes, thread.model-selection.set otherwise) and returns just { sequence }.
Instance change (codex to codex_alt, same Codex home). These instances share a continuation key, so decideProviderSessionTransition plans restart_and_resume, and ProviderSwitchService releases the live session. dispatchThreadMutation saves the new selection and queues that detach, but it doesn't start another attempt. Because Codex sessions allow multiple threads, the detach calls interruptTurn on the turn that's still running. The run is still running on that attempt, so finalization treats the interrupt as the end of the run and writes "Run interrupted by user" (makeInterruptResultTurnItem in RunExecutionService.ts). Nothing replays the unfinished request, so the poem never runs and you have to send another message.
Same instance (Luna to Sol). Codex treats every selection change as apply_on_next_turn, which becomes switch_model_in_session and releases nothing. The saved selection updates and the tool reports success, but the active turn keeps running on Luna. Reading the saved configuration back won't show that this request actually ran on Luna rather than Sol.
Likely fix area
Codex can't retarget the turn that's running the tool, so a few directions are possible:
- The tool could report that limit for a self-configure call and leave the current session and run alone, with the change applying from the next turn.
- Alternatively, the unfinished request could be replayed under the new model. Today the selection-restart path only does that when a new message arrives, not from a configure call, so this would be a separate choice.
A maintainer will decide on the fix direction.