Before submitting
Area
apps/web
Steps to reproduce
- Run the current T3 Code Desktop Nightly on macOS and Windows.
- Connect both desktop clients to the same remote T3 Code environment.
- Open the same existing server-backed thread on both clients.
- On the macOS client, switch the interaction mode from Build to Plan without sending a message.
- Observe the same thread on Windows.
- Repeat with the access/runtime mode, for example by switching from Full access to Approval required.
- The same behavior can be observed in the opposite direction.
Expected behavior
Build/Plan and access/runtime mode are properties of the active thread. Changing either mode on one connected client should persist the new thread state immediately and propagate it to every client viewing that thread. Sending a prompt or reopening the thread should not be required.
Composer text, attachments, and other unsent draft content may remain device-local.
Actual behavior
The other desktop client continues showing its previous mode selection. Each client can therefore display and use a different Build/Plan or access/runtime mode for the same thread.
Impact
Minor bug or occasional failure.
The mismatch is easy to overlook when switching devices and can cause the next turn to run with a different interaction or access mode than expected.
Version or commit
Current Nightly as of 2026-08-03: 0.0.32-nightly.20260803.986, corresponding to main @ 30c96228067b. Exact per-client build numbers were not captured separately.
Environment
- T3 Code Desktop Nightly on macOS
- T3 Code Desktop Nightly on Windows
- Both clients connected to the same remote T3 Code environment
- Same existing server-backed thread open on both clients
Logs or stack traces
No crash or stack trace. This is a deterministic client-state synchronization issue.
Screenshots, recordings, or supporting files
No response
Workaround
Manually verify and select the same modes on every client before sending the next prompt.
Relevant implementation context
The current web client prefers locally persisted composer overrides over the server-backed thread values:
For an existing server thread, the mode-change handlers update the local composer draft. The corresponding server commands are dispatched by persistThreadSettingsForNextTurn when a message is sent:
The server/client-runtime already exposes thread.runtime-mode.set and thread.interaction-mode.set, so this appears to be a synchronization/ownership problem rather than missing thread fields.
Before submitting
Area
apps/web
Steps to reproduce
Expected behavior
Build/Plan and access/runtime mode are properties of the active thread. Changing either mode on one connected client should persist the new thread state immediately and propagate it to every client viewing that thread. Sending a prompt or reopening the thread should not be required.
Composer text, attachments, and other unsent draft content may remain device-local.
Actual behavior
The other desktop client continues showing its previous mode selection. Each client can therefore display and use a different Build/Plan or access/runtime mode for the same thread.
Impact
Minor bug or occasional failure.
The mismatch is easy to overlook when switching devices and can cause the next turn to run with a different interaction or access mode than expected.
Version or commit
Current Nightly as of 2026-08-03:
0.0.32-nightly.20260803.986, corresponding tomain @ 30c96228067b. Exact per-client build numbers were not captured separately.Environment
Logs or stack traces
Screenshots, recordings, or supporting files
No response
Workaround
Manually verify and select the same modes on every client before sending the next prompt.
Relevant implementation context
The current web client prefers locally persisted composer overrides over the server-backed thread values:
ChatView.tsxcomposerDraftStore.tsFor an existing server thread, the mode-change handlers update the local composer draft. The corresponding server commands are dispatched by
persistThreadSettingsForNextTurnwhen a message is sent:ChatView.tsxChatView.tsxThe server/client-runtime already exposes
thread.runtime-mode.setandthread.interaction-mode.set, so this appears to be a synchronization/ownership problem rather than missing thread fields.