Skip to content

fix/sandbox picker no host fallback - #49

Merged
OmarAlex24 merged 1 commit into
fix/sandbox-child-thread-blankfrom
fix/sandbox-picker-no-host-fallback
Nov 13, 2026
Merged

OmarAlex24 merged 1 commit into
fix/sandbox-child-thread-blankfrom
fix/sandbox-picker-no-host-fallback

Conversation

@OmarAlex24

@OmarAlex24 OmarAlex24 commented Nov 13, 2026 •

Copy link
Copy Markdown
Owner

Problem

On a sandbox chat whose own thread this client does not list (sandbox starting, stopped, or not paired), the model picker offered the host's providers. Picking the host's Claude was refused: "This chat runs on a sandbox, so it keeps the sandbox's agent."

Change

sandboxMirrorPickerSource (client-runtime) decides every picker on a mirror: the paired sandbox thread, else the host's read of the sandbox (sandboxes.subscribeThreadMirror, as mobile uses), else the mirror's current pick read-only and disabled with a reason. A pick without a paired thread goes through sandboxes.setThreadModel. Covered: the picker and its effort column, the controls bar, the model-picker and effort keybindings, /model, and on mobile the composer control, the thread settings sheet and "Manage hidden models". The host's guard is unchanged.

Scope and approval

Requested by the fork owner in a T3 Code session, after installing stack pingdotgg#43. Part of stack pingdotgg#52 on feat/sandbox-environments.

Verification

  • Two new sandboxMirror.test.ts cases (source precedence; never the host's providers) failed before the fix
  • Whole stack: vp run check:changed omar/feat/sandbox-environments passes format, lint, knip, typecheck, 17 test files (144 tests) and react compiler
  • ChatView.sandboxLaunch and ChatView.sandboxLaunchReleased browser tests pass 6/6 runs at this layer and at the top

Not yet run in a real client.

Model and harness: Claude Opus 5.5 (implementation subagents at high effort, coordinated by Claude Opus 5.5) in Claude Code, running in T3 Code.

🤖 Generated with Claude Code

On a sandbox chat's host mirror, the picker read the sandbox's provider only
from its paired thread. While that thread was unlisted (sandbox starting,
resuming or stopped, or an unpaired client such as app.t3.codes), it fell
back to the host's provider list, and picking the host's Claude was refused
with SANDBOX_BRIDGE_SWITCH_REFUSAL.

The picker now falls back to the host's read of the sandbox
(sandboxes.subscribeThreadMirror), as the phone does, and sets picks through
sandboxes.setThreadModel. With neither source it shows the mirror's pick
read-only, with the reason, and the effort keybinding and /model do nothing.
Mobile shares the derivation, so its sheet and "Manage hidden models" no
longer list the host's providers either.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@OmarAlex24
OmarAlex24 added this pull request to stack #52 November 13, 2026 15:43
@OmarAlex24
OmarAlex24 merged commit 9eb36d5 into feat/sandbox-environments Nov 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