Replay the launcher PATH into remote Claude Teams teammate panes - #10042
Replay the launcher PATH into remote Claude Teams teammate panes#10042asaflavi-baysecurity wants to merge 1 commit into
Conversation
|
To use Codex here, create a Codex account and connect to github. |
|
@codex review |
|
To use Codex here, create a Codex account and connect to github. |
@asaflavi-baysecurity I can't start this review because your workspace has reached its free monthly review limit. cubic has reviewed 245,275 of the 240,000 allowed lines of code this month. Reviews resume on 1 September 2026 (in 20 days). Paid plans include much higher monthly review limits. Upgrade now to resume reviews. To help optimise your usage, you can tune cubic to get the most out of your usage limits:
|
|
|
|
Important Review skippedNo new commits to review since the last review. ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
📝 WalkthroughWalkthroughClaude Teams launch environments are encoded after configuration, cleared before new agent setup, and replayed by tmux respawns. The transport allowlists ChangesClaude Teams respawn environment
Estimated code review effort: 3 (Moderate) | ~25 minutes Sequence Diagram(s)sequenceDiagram
participant ClaudeTeamsRelay
participant AgentEnvironment
participant RespawnEnvironmentCodec
participant TmuxRespawn
ClaudeTeamsRelay->>AgentEnvironment: configure current agent environment
ClaudeTeamsRelay->>RespawnEnvironmentCodec: encode configured environment
RespawnEnvironmentCodec-->>ClaudeTeamsRelay: return encoded transport value
TmuxRespawn->>RespawnEnvironmentCodec: decode recorded environment
RespawnEnvironmentCodec-->>TmuxRespawn: return allowlisted values
TmuxRespawn->>TmuxRespawn: sort keys and build respawn exports
Suggested reviewers: 🚥 Pre-merge checks | ✅ 24 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (24 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@daemon/remote/cmd/cmuxd-remote/agent_launch_context_test.go`:
- Around line 134-136: Update the test around configureAgentEnvironment to seed
non-empty values for CLAUDE_CODE_SANDBOXED, CMUX_CLAUDE_TEAMS_SANDBOXED, and
claudeTeamsRespawnEnvironmentKey before configuration, then assert each variable
is absent afterward while preserving the existing environment setup.
In `@daemon/remote/cmd/cmuxd-remote/agent_launch.go`:
- Around line 468-478: The cleanup in configureAgentEnvironment must not discard
the teammate sandbox opt-in needed by tmuxClaudeTeamsRespawnEnvironment.
Preserve CMUX_CLAUDE_TEAMS_SANDBOXED through an authoritative post-cleanup
source such as agentConfig.extraEnv, so configureClaudeTeamsShellWrapper can
restore it and respawns emit CLAUDE_CODE_SANDBOXED=1.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 99873d15-8ee4-4c99-9cf7-5b7921a50613
📒 Files selected for processing (7)
daemon/remote/cmd/cmuxd-remote/agent_launch.godaemon/remote/cmd/cmuxd-remote/agent_launch_context_test.godaemon/remote/cmd/cmuxd-remote/claude_teams_respawn_env.godaemon/remote/cmd/cmuxd-remote/claude_teams_respawn_env_test.godaemon/remote/cmd/cmuxd-remote/tmux_compat.godaemon/remote/cmd/cmuxd-remote/tmux_compat_test.godaemon/remote/cmd/cmuxd-remote/tmux_corpus_behavior_test.go
| "CLAUDE_CODE_SANDBOXED", | ||
| "CMUX_CLAUDE_TEAMS_SANDBOXED", | ||
| claudeTeamsRespawnEnvironmentKey, |
There was a problem hiding this comment.
🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick win
Assert that inherited sandbox state is removed.
The test only preserves these variables. It does not set non-empty values or verify that configureAgentEnvironment removes them. Seed CLAUDE_CODE_SANDBOXED, CMUX_CLAUDE_TEAMS_SANDBOXED, and claudeTeamsRespawnEnvironmentKey, then assert that all are absent after configuration.
Proposed test extension
t.Setenv("PATH", "/usr/bin:/bin")
+ t.Setenv("CLAUDE_CODE_SANDBOXED", "1")
+ t.Setenv("CMUX_CLAUDE_TEAMS_SANDBOXED", "1")
+ t.Setenv(claudeTeamsRespawnEnvironmentKey, "transport")
configureAgentEnvironment(agentConfig{
@@
})
+ for _, key := range []string{
+ "CLAUDE_CODE_SANDBOXED",
+ "CMUX_CLAUDE_TEAMS_SANDBOXED",
+ claudeTeamsRespawnEnvironmentKey,
+ } {
+ if value, present := os.LookupEnv(key); present {
+ t.Errorf("%s leaked inherited value %q", key, value)
+ }
+ }📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "CLAUDE_CODE_SANDBOXED", | |
| "CMUX_CLAUDE_TEAMS_SANDBOXED", | |
| claudeTeamsRespawnEnvironmentKey, | |
| t.Setenv("PATH", "/usr/bin:/bin") | |
| t.Setenv("CLAUDE_CODE_SANDBOXED", "1") | |
| t.Setenv("CMUX_CLAUDE_TEAMS_SANDBOXED", "1") | |
| t.Setenv(claudeTeamsRespawnEnvironmentKey, "transport") | |
| configureAgentEnvironment(agentConfig{ | |
| // existing configuration | |
| }) | |
| for _, key := range []string{ | |
| "CLAUDE_CODE_SANDBOXED", | |
| "CMUX_CLAUDE_TEAMS_SANDBOXED", | |
| claudeTeamsRespawnEnvironmentKey, | |
| } { | |
| if value, present := os.LookupEnv(key); present { | |
| t.Errorf("%s leaked inherited value %q", key, value) | |
| } | |
| } |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@daemon/remote/cmd/cmuxd-remote/agent_launch_context_test.go` around lines 134
- 136, Update the test around configureAgentEnvironment to seed non-empty values
for CLAUDE_CODE_SANDBOXED, CMUX_CLAUDE_TEAMS_SANDBOXED, and
claudeTeamsRespawnEnvironmentKey before configuration, then assert each variable
is absent afterward while preserving the existing environment setup.
| // Drop launch state inherited from an enclosing claude-teams process tree: its | ||
| // PATH must not replace this agent's own in a respawn, and its trust-prompt | ||
| // bypass must not waive this agent's own prompt. cfg.extraEnv is applied after | ||
| // this, and runClaudeTeamsRelay records its own transport once this returns. | ||
| for _, key := range []string{ | ||
| "CLAUDE_CODE_SANDBOXED", | ||
| "CMUX_CLAUDE_TEAMS_SANDBOXED", | ||
| claudeTeamsRespawnEnvironmentKey, | ||
| } { | ||
| os.Unsetenv(key) | ||
| } |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/usr/bin/env bash
set -euo pipefail
ast-grep outline daemon/remote/cmd/cmuxd-remote \
--items all --type function \
--match 'configureClaudeTeamsShellWrapper|runClaudeTeamsRelay|tmuxClaudeTeamsRespawnEnvironment'
rg -n -C 5 \
'CMUX_CLAUDE_TEAMS_SANDBOXED|CLAUDE_CODE_SANDBOXED|configureClaudeTeamsShellWrapper' \
daemon/remote/cmd/cmuxd-remote -g '*.go'Repository: manaflow-ai/cmux
Length of output: 22929
🏁 Script executed:
#!/usr/bin/env bash
set -euo pipefail
printf '%s\n' '--- agent_launch.go: runClaudeTeamsRelay and cleanup ---'
sed -n '360,520p' daemon/remote/cmd/cmuxd-remote/agent_launch.go
printf '%s\n' '--- agent_launch.go: environment configuration and call order ---'
rg -n -C 12 \
'configureAgentEnvironment|runClaudeTeamsRelay|extraEnv|syscall.Exec|CMUX_CLAUDE_TEAMS_SANDBOXED|CLAUDE_CODE_SANDBOXED' \
daemon/remote/cmd/cmuxd-remote/agent_launch.go daemon/remote/cmd/cmuxd-remote/*.go
printf '%s\n' '--- agent_launch_shell.go: complete wrapper implementation ---'
cat -n daemon/remote/cmd/cmuxd-remote/agent_launch_shell.go
printf '%s\n' '--- respawn transport implementation ---'
sed -n '1735,1815p' daemon/remote/cmd/cmuxd-remote/tmux_compat.goRepository: manaflow-ai/cmux
Length of output: 50372
🏁 Script executed:
#!/usr/bin/env bash
set -euo pipefail
printf '%s\n' '--- configureClaudeTeamsShellWrapper ---'
sed -n '1,145p' daemon/remote/cmd/cmuxd-remote/agent_launch_shell.go
printf '%s\n' '--- production references to sandbox opt-in ---'
rg -n -C 8 \
'CMUX_CLAUDE_TEAMS_SANDBOXED|CLAUDE_CODE_SANDBOXED|sandbox' \
daemon/remote/cmd/cmuxd-remote \
-g '*.go' \
-g '!**/*_test.go'
printf '%s\n' '--- repository-wide non-test references ---'
rg -n -C 5 \
'CMUX_CLAUDE_TEAMS_SANDBOXED|CLAUDE_CODE_SANDBOXED' \
-g '!**/*_test.go' \
-g '!**/vendor/**'Repository: manaflow-ai/cmux
Length of output: 9149
Preserve the sandbox opt-in for teammate respawns.
configureClaudeTeamsShellWrapper does not restore CMUX_CLAUDE_TEAMS_SANDBOXED. After configureAgentEnvironment clears it, tmuxClaudeTeamsRespawnEnvironment cannot emit CLAUDE_CODE_SANDBOXED=1. Pass the opt-in through agentConfig.extraEnv or another authoritative post-cleanup source.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@daemon/remote/cmd/cmuxd-remote/agent_launch.go` around lines 468 - 478, The
cleanup in configureAgentEnvironment must not discard the teammate sandbox
opt-in needed by tmuxClaudeTeamsRespawnEnvironment. Preserve
CMUX_CLAUDE_TEAMS_SANDBOXED through an authoritative post-cleanup source such as
agentConfig.extraEnv, so configureClaudeTeamsShellWrapper can restore it and
respawns emit CLAUDE_CODE_SANDBOXED=1.
Summary
PATHthecmux claude-teamslead was launched with. Go only — no Swift, no app-target, noCLI/cmux.swiftdiff..gofile. The remote daemon carries a deliberate line-by-line twin of that Swift path:daemon/remote/cmd/cmuxd-remote/tmux_compat.go:1677already callstmuxRespawnStartCommand(commandText, tmuxClaudeTeamsRespawnEnvironment()), buttmuxClaudeTeamsRespawnEnvironmentreturned at mostCLAUDE_CODE_SANDBOXEDand never readCMUX_CLAUDE_TEAMS_RESPAWN_ENV_B64. A remote teammate therefore got no launcherPATHat all — the Teammate/agent panes get a minimal PATH — Homebrew (gh) and mise (node) commands not found #7240 / claude-teams: teammate panes get the app's minimal PATH, breaking node-based Claude Code hooks #9150 symptom on the remote path.Four small pieces:
claude_teams_respawn_env.go(new) — Go twin ofClaudeTeamsRespawnEnvironmentTransporton the same wire: base64 of a sorted-key JSON string map under the sameCMUX_CLAUDE_TEAMS_RESPAWN_ENV_B64key (json.Marshalsorts map keys, matching Swift's.sortedKeys). Decode reapplies the allowlist and fails closed — bad base64, bad JSON, a JSON array/string, non-string values, or a non-allowlisted key all yield nothing rather than a partial environment.agent_launch.go→runClaudeTeamsRelay— encodes its own fully configured environment at the same seam the Swift launcher'sdeferuses: afterconfigureAgentEnvironmentandconfigureClaudeNodeOptions, immediately beforesyscall.Exec.agent_launch.go→configureAgentEnvironment— unsets the transport key and the two inherited trust-bypass keys (CLAUDE_CODE_SANDBOXED,CMUX_CLAUDE_TEAMS_SANDBOXED) for every relay, socmux omo/omx/omclaunched from inside a claude-teams process tree cannot inherit the lead's value and replay the lead'sPATH— or the lead's trust-prompt waiver — into their own pane respawns.tmux_compat.go:1678is a single shared respawn dispatch for every agent shim, so without this an inherited value would override the panePATHbuilt byws_pty.go:757and maketmuxresolve to~/.cmuxterm/claude-teams-bininstead of that agent's own shim dir. This mirrorsclearInheritedClaudeLaunchEnvironment()(CLI/CMUXCLI+ExecutableResolution.swift:306-312), which the Swift side calls from both the claude-teams launcher and the omc launcher — as far as the Go side has the concepts: it clearsinheritedTrustBypassKeys+ the transport, and does not clearinheritedSessionIdentityKeysorCMUX_CLAUDE_TEAMS_WRAPPER_LAUNCH, neither of which the remote daemon reads or writes anywhere. The clear runs beforecfg.extraEnvis applied, matching the Swift order (clearInheritedClaudeLaunchEnvironment()→claudeTeamsExtraEnvVars). Placing it in the sharedconfigureAgentEnvironmentcovers all four relays in one block;runClaudeTeamsRelayrecords its own value afterwards.tmux_compat.go—tmuxClaudeTeamsRespawnEnvironmentdecodes the transport, overlays the existingCLAUDE_CODE_SANDBOXEDopt-in exactly as before, and emits pairs in sorted key order, matching the Swift emitter's key-ordering rule.The Go allowlist is deliberately
PATH-only, and this is a real narrowing versus Swift — not parity. Swift'stmuxClaudeTeamsRespawnEnvironmentalso replaysAgentLaunchEnvironmentPolicy.safeEnvironmentKeys(Packages/macOS/CMUXAgentLaunch/Sources/CMUXAgentLaunch/AgentLaunchEnvironmentPolicy.swift:58-119:CLAUDE_CONFIG_DIR,CLAUDE_SECURESTORAGE_CONFIG_DIR,ANTHROPIC_BASE_URL/MODEL,NODE_OPTIONS, …). The Go side replaysPATHand nothing else, so the emitted command string matches the Swift one only in key ordering and quoting, not in content whenever a policy key is set. The narrowing is stated at the pointer in the code rather than claimed as a mirror. Rationale:AgentLaunchEnvironmentPolicy.swiftis hand-written (scripts/generate-claude-launch-environment-policy.pyemits onlyClaudeSessionEnvironmentPolicy+Generated.swiftand the TypeScript/wrapper outputs, from a manifest whose only keys areinheritedSessionIdentityKeysandinheritedTrustBypassKeys), so a hand-copied second allowlist in Go would silently drift from it.PATHis the only value a remote teammate needs replayed. If you'd prefer full policy parity, the right move is extending the generator to emit Go — a larger cross-cutting change I did not make unasked. Happy to do it if you want it.No new precedence logic, no synthesized or home-relative directories, no two-tier resolution: the lead's
PATHis copied verbatim, so a repaired remote teammate resolves exactly what the lead resolves.Relationship to #7240 / #9150 / #9731
mainand it works: encode atCLI/cmux.swift:20758-20766→ tmux shim → decode atCLI/CMUXCLI+TmuxCompatSupport.swift:152-164→ exports at:109-120→ pane process atSources/Workspace.swift:8444. This PR does not re-fix that, and does not claim the local path is still broken.gh) and mise (node) commands not found #7240 is the broader "cmux.app runs on launchd's barePATH" issue. This PR does not address that root cause — ordinary panes and other app-spawned subprocesses are untouched. It closes one specific remaining hole of the same shape.Verified repro evidence (for the symptom, on a build that predates #9731)
Reproduced on cmux 0.64.17 build 97 (a June build, before #9731):
ps ewwon the app pid: cmux.app runs with launchd's barePATH=/usr/bin:/bin:/usr/sbin:/sbin.cmux claude-teamsfrom a full-env terminal) gotPATH=<TMPDIR>/cmux-cli-shims/<uuid>:/Applications/cmux.app/Contents/Resources/bin:/usr/bin:/bin:/usr/sbin:/sbin.gh,go,node,npm,taskall exited 127 inside it;git/jqresolved only as Apple/usr/binstubs./usr/bin/login -flp <user> /bin/bash --noprofile --norc -c exec -l /bin/sh -c '<abs path to claude> --agent-id … --agent-name …'— no login shell, so dotfiles cannot repair it.This is evidence for the symptom's shape, not evidence that
mainis still broken locally — onmain, #9731 fixes that scenario. The remote gap this PR closes is code-traced and unit-tested, not runtime-reproduced (see Testing).Deliberately left alone (disclosed, not overlooked)
--dangerously-skip-permissionsargv check, so unlike the Swift launcher it never setsCLAUDE_CODE_SANDBOXED/CMUX_CLAUDE_TEAMS_SANDBOXEDitself. Widening a trust-prompt bypass is your call, not a contributor's — this PR does not change that. What it does change is inheritance:configureAgentEnvironmentnow clears both keys alongside the transport, completing the mirror ofclearInheritedClaudeLaunchEnvironment(), so a value inherited from an enclosing claude-teams process tree can no longer waive a different agent's prompt. The clear runs beforecfg.extraEnvis applied, matching the Swift order, so a caller that ever does grant the opt-in still wins.split-window/new-window/new-sessionremain uninjected, which keeps the whole mechanism coupled to Claude Code's current split-then-respawn sequence.Testing
Run in
daemon/remotewith go1.26.5 darwin/arm64.gofmt -l ./cmd/cmuxd-remote— clean (no files listed).go build ./...— passes.go vet ./...— passes.go test ./...(the exact CI command,.github/workflows/ci.yml:313-315) —ok github.com/manaflow-ai/cmux/daemon/remote/cmd/cmuxd-remote 5.180s. Green onmainbefore the change and green after.PATH; a non-allowlisted key (ANTHROPIC_API_KEY,CMUX_SURFACE_ID) never crosses the boundary; an environment withoutPATHencodes nothing; and seven fail-closed decode cases (empty, non-base64, base64-of-non-JSON, JSON array, JSON string, non-string values, non-allowlisted key) each yield no values.TestConfigureAgentEnvironmentClearsInheritedRespawnTransport— pins piece 3: with a lead's transport value in the ambient environment,configureAgentEnvironmentfor an omc-shaped config leaves the key unset andtmuxClaudeTeamsRespawnEnvironment()returns no pairs. Without the fix it fails withpairs = [{PATH /claude-teams/lead/bin}]— the lead'sPATHleaking into another agent's respawn.TestTmuxCorpusRespawnPaneDispatchesSurfaceRespawntable, in the style of the neighboringclaude-teams sandbox opt-in prepends env exportcase. They assert the fullcommandparam that the production dispatch path actually sends oversurface.respawn— not a substring, so any change to the emitted quoting is caught:/bin/sh -c 'export PATH='"'"'/opt/homebrew/bin:/usr/bin:/bin'"'"'; claude --agent-id teammate-1', withtmux_start_commandstill raw for persistence;tmux_compat.gofromorigin/mainfails…ReplaysTransportedPath,…OrdersKeysDeterministicallyand…/claude-teams_respawn_transport_prepends_the_launcher_PATH; (b) removing just the added unset block inconfigureAgentEnvironmentfailsTestConfigureAgentEnvironmentClearsInheritedRespawnTransport. Both pass again once restored. The tests exercise the production path rather than re-implementing its ordering.-racescoped to the touched tests passes 3/3 consecutive runs. A wider-race -run 'TestTmuxCorpus'intermittently failsTestTmuxCorpusPRLaneSourcesExerciseRuntimeBehavior/regress/session-group-resize.sh— I ran that same command 4× on unmodifiedorigin/mainand it failed on 2 of 4 runs on the identical subtest, so it is a pre-existing flake in a PTY-driving corpus test this PR does not touch. CI runs plaingo test ./..., not-race.Test-isolation note worth knowing — this change widens it:
TestTmuxCorpusRespawnPaneDispatchesSurfaceRespawntakes part of its input from the ambient environment, and this PR takes that sensitivity from one variable to two. The pre-existing one isCMUX_CLAUDE_TEAMS_SANDBOXED: on unmodifiedmain, running the suite from inside acmux claude-teamspane — where it leaks in as1— already fails 4 of that test's subtests. This PR adds a second variable with the same blast radius,CMUX_CLAUDE_TEAMS_RESPAWN_ENV_B64: with a lead's transport value in the environment those subtests would see an unexpectedexport PATH=…prepended to the command. So the pin is at the parent test rather than per-subtest —TestTmuxCorpusRespawnPaneDispatchesSurfaceRespawnnow pins both variables once witht.Setenvat the top, which makes every one of its subtests immune to whatever launched the suite. The tests added here pin both as well, and the two pre-existing tests that callconfigureAgentEnvironmentnow save/restore all three keys that block clears, so the new productionos.Unsetenvcannot leak process-wide into later tests. Verified: the package passes withCMUX_CLAUDE_TEAMS_SANDBOXED=1in the environment, and with a validCMUX_CLAUDE_TEAMS_RESPAWN_ENV_B64in the environment.What I could not verify: I have no SSH/remote cmux workspace, so I never observed a real remote teammate pane before/after. The claim "a remote claude-teams teammate gets no launcher
PATH" rests on readingtmux_compat.go:1677+:1763-1769andagent_launch.go:26-76/:407-417, plusgh pr view 9731 --json filesshowing no.gofile in #9731. This PR does not claim to have fixed anyone's observed remote failure. Please sanity-check one remote claude-teams session before merging.Which targets compiled locally: only
daemon/remote(the sole module this PR touches) — built, vetted and fully tested here. No macOS app or Swift package target was compiled: this machine has Swift 6.3.2 CommandLineTools with no Xcode, soxcodebuildis unavailable. Since the diff is Go-only, no Swift target is affected; the Swift/app CI jobs will exercise unchanged code.Demo Video
Not produced — I could not record one. Two reasons, both hard blockers on the authoring machine: the macOS app target cannot be built (Swift 6.3.2 CommandLineTools, no Xcode/
xcodebuild), and I have no SSH/remote host to run a remoteclaude-teamssession against, which is the only place this change is observable.In its place, the verifiable evidence is:
pairs = [{PATH /claude-teams/lead/bin}]for the cross-agent case.go test ./...output from the exact CI command.Review Trigger (Copy/Paste as PR comment)
Checklist
gofmt,go build,go vet, andgo test ./...(the exact CI command) indaemon/remote, plus two negative checks that the new tests fail without the production change. Not tested against a live remote host; see Testing.Need help on this PR? Tag
@codesmith-botwith what you need. Autofix is disabled.Summary by cubic
Replays the launcher PATH in remote Claude Teams teammate panes so tools resolve exactly like the lead session. Ports the respawn-environment transport to the remote Go daemon and prevents env leaks across agents.
tmux-compat path; teammate panes now export the leadPATH.runClaudeTeamsRelayrecordsCMUX_CLAUDE_TEAMS_RESPAWN_ENV_B64(base64 JSON);tmuxClaudeTeamsRespawnEnvironmentdecodes it, preservesCLAUDE_CODE_SANDBOXEDwhen opted-in, and emits env pairs in deterministic order.configureAgentEnvironmentunsets the transport and trust-bypass keys (CLAUDE_CODE_SANDBOXED,CMUX_CLAUDE_TEAMS_SANDBOXED) for all relays to avoid cross-agent PATH/trust leaks.surface.respawncommand assertions.gh) and mise (node) commands not found #7240.Written for commit d1b74dd. Summary will update on new commits.
Summary by CodeRabbit
New Features
PATH.Bug Fixes
Tests