Summary
In a newly onboarded NemoClaw sandbox in default mutable mode, the OpenClaw doctor command (openclaw doctor --fix) tightens $OPENCLAW_HOME/.openclaw and openclaw.json to 700 / 600. This breaks the documented group-writable contract for mutable sandboxes and prevents the gateway user from writing /sandbox/.openclaw/openclaw.json.
As a result, gateway-initiated config updates (e.g., control-UI toggles like "Enable Dreaming" and account toggles) would fail to persist, even though the sandbox is explicitly in the default mutable state.
Additionally, su -s /bin/sh gateway ... fails inside the sandbox with su: System error, so it is not possible to validate the gateway's write permissions as described in NemoClaw/OpenClaw guidance.
Environment
- Host OS: Ubuntu (DGX Spark; user
nvidia@spark-dadc)
- NemoClaw CLI:
nemoclaw (host) – version bundled with NemoClaw v0.0.44
- NemoClaw version: v0.0.44 (per
nemoclaw mutable-test status)
- OpenClaw version inside sandbox:
OpenClaw 2026.5.22 (a374c3a)
- OpenShell:
0.0.44 (docker) from nemoclaw mutable-test status
- Model:
nvidia/nemotron-3-super-120b-a12b
- Provider:
nvidia-prod
- Sandbox name:
mutable-test
Reproduction steps
Preconditions
- NemoClaw CLI installed and working.
- Supported NVIDIA inference credential configured.
- No existing sandbox named
mutable-test.
Steps
-
On host, onboard a new sandbox:
nemoclaw onboard --name mutable-test
- Complete the wizard using the default permission mode / default mutable state.
- Onboarding completes successfully; no "Permission denied" errors.
-
Confirm shields / permissions state:
nemoclaw mutable-test shields status
nemoclaw mutable-test status
Actual output (relevant parts):
Shields: NOT CONFIGURED (default mutable state)
Config is mutable. Run `nemoclaw <sandbox> shields up` to opt into lockdown.
Permissions: not configured (default mutable state)
- No mention of a "permission-bypass" mode.
- This is interpreted as the default mutable / shields-down state.
-
Connect to the sandbox:
nemoclaw mutable-test connect
Inside the sandbox shell:
-
Check initial permissions on .openclaw and openclaw.json:
stat -c '%a %U:%G' /sandbox/.openclaw/openclaw.json
stat -c '%a %U:%G' /sandbox/.openclaw
Actual:
660 sandbox:sandbox
2770 sandbox:sandbox
(Test expectation was 664 and 2775 under NemoClaw mutable contract.)
-
Run OpenClaw doctor with automatic fixes:
openclaw doctor --fix; echo "doctor_exit:$?"
Actual key output:
-
Verify sandbox user can still write to openclaw.json:
echo 'smoke' >> /sandbox/.openclaw/openclaw.json; echo "write_exit:$?"
Actual:
(Sandbox user can still write; this part is OK.)
-
Verify gateway user write (group-writable contract):
su -s /bin/sh gateway -c "printf 'gateway-probe\n' >> /sandbox/.openclaw/openclaw.json"; echo "gateway_write_exit:$?"
Actual:
Password:
su: System error
gateway_write_exit:1
su itself fails with System error.
- Even if
su worked, openclaw.json is now 600, so gateway (same group, different UID) would not be able to write.
-
Exit sandbox and verify skill install still works (for completeness):
On host:
rm -rf /tmp/nemoclaw-test-skill && mkdir -p /tmp/nemoclaw-test-skill
printf '%s\n' '---' 'name: nemoclaw-test-skill' 'description: smoke test skill' '---' 'Smoke test skill.' > /tmp/nemoclaw-test-skill/SKILL.md
nemoclaw mutable-test skill install /tmp/nemoclaw-test-skill; echo "skill_exit:$?"
Actual:
✓ Skill 'nemoclaw-test-skill' installed
skill_exit:0
Connect to sandbox again:
nemoclaw mutable-test connect
test -f /sandbox/.openclaw/skills/nemoclaw-test-skill/SKILL.md; echo "installed_skill:$?"
Actual:
Expected behavior
For a NemoClaw sandbox in default mutable state:
-
/sandbox/.openclaw and /sandbox/.openclaw/openclaw.json should remain group-writable so that both the sandbox user and the gateway process (running as a gateway user in the sandbox group) can write config.
-
A typical contract for mutable mode (per documentation and test expectations) is:
/sandbox/.openclaw/openclaw.json: 664 sandbox:sandbox
/sandbox/.openclaw: 2775 sandbox:sandbox
g+w plus setgid so new files inherit group sandbox.
-
Running openclaw doctor --fix should not tighten permissions to 700/600 in a NemoClaw-managed mutable sandbox, because that prevents the gateway user from modifying openclaw.json and breaks UI-driven config persistence.
-
The gateway user inside the sandbox should be properly configured so that a probe like:
su -s /bin/sh gateway -c "printf 'gateway-probe\n' >> /sandbox/.openclaw/openclaw.json"
either:
- succeeds (
gateway_write_exit:0) in mutable mode, or
- there is a documented alternative way to verify gateway write capabilities.
Actual behavior
-
openclaw doctor --fix reports .openclaw and openclaw.json as "too open" and tightens them to 700 / 600 even though:
- The sandbox is in NemoClaw's default mutable state (
Permissions: not configured (default mutable state)), and
- NemoClaw policy explicitly treats
/sandbox/.openclaw as a read-write area for sandbox + gateway.
-
openclaw.json ends up with permissions that prevent the gateway user from writing via the sandbox group.
-
su to the gateway user fails with su: System error, making it impossible to validate the gateway's write access using the expected probe.
-
Sandbox user writes still succeed, and skill installation under /sandbox/.openclaw/skills/... works as expected (skill_exit:0, installed_skill:0).
Why this is a problem
NemoClaw's mutable-mode story relies on the gateway being able to mutate openclaw.json and related state on behalf of the user, while the sandbox user can also write state under /sandbox/.openclaw.
When openclaw doctor --fix tightens the directory and config file to 700/600:
- The gateway, running as a different UID (but same
sandbox group), can no longer write openclaw.json.
- Control-UI toggles and other gateway-driven config updates silently fail to persist.
- The behavior contradicts the intended group-writable contract for the NemoClaw mutable default state.
The su: System error on gateway is an additional symptom suggesting that the gateway user entry / auth setup inside the sandbox image is not in a healthy or expected state.
Suggested fix / questions
-
Adjust openclaw doctor behavior when running inside a NemoClaw sandbox in mutable mode so that it does not tighten $OPENCLAW_HOME/.openclaw and openclaw.json to 700/600, and instead preserves or restores group-writable permissions compatible with NemoClaw's gateway-write contract.
-
Ensure the gateway user in the NemoClaw sandbox image is configured in a way that:
- Allows probing gateway writeability (either via
su or a documented alternative), and
- Actually has write access to
/sandbox/.openclaw/openclaw.json in mutable mode.
-
Clarify in docs what the expected permissions are for /sandbox/.openclaw and openclaw.json under:
- Mutable default state (shields down / not configured), and
- Locked-down state (shields up), where tighter
700/600 may be intended.
Summary
In a newly onboarded NemoClaw sandbox in default mutable mode, the OpenClaw doctor command (
openclaw doctor --fix) tightens$OPENCLAW_HOME/.openclawandopenclaw.jsonto700/600. This breaks the documented group-writable contract for mutable sandboxes and prevents thegatewayuser from writing/sandbox/.openclaw/openclaw.json.As a result, gateway-initiated config updates (e.g., control-UI toggles like "Enable Dreaming" and account toggles) would fail to persist, even though the sandbox is explicitly in the default mutable state.
Additionally,
su -s /bin/sh gateway ...fails inside the sandbox withsu: System error, so it is not possible to validate the gateway's write permissions as described in NemoClaw/OpenClaw guidance.Environment
nvidia@spark-dadc)nemoclaw(host) – version bundled with NemoClaw v0.0.44nemoclaw mutable-test status)OpenClaw 2026.5.22 (a374c3a)0.0.44 (docker)fromnemoclaw mutable-test statusnvidia/nemotron-3-super-120b-a12bnvidia-prodmutable-testReproduction steps
Preconditions
mutable-test.Steps
On host, onboard a new sandbox:
Confirm shields / permissions state:
Actual output (relevant parts):
Connect to the sandbox:
Inside the sandbox shell:
Check initial permissions on
.openclawandopenclaw.json:Actual:
(Test expectation was
664and2775under NemoClaw mutable contract.)Run OpenClaw doctor with automatic fixes:
Actual key output:
Doctor reports state directory and config file permissions as "too open" and then tightens them:
Exit code is 0:
Verify sandbox user can still write to
openclaw.json:Actual:
(Sandbox user can still write; this part is OK.)
Verify gateway user write (group-writable contract):
Actual:
suitself fails withSystem error.suworked,openclaw.jsonis now600, sogateway(same group, different UID) would not be able to write.Exit sandbox and verify skill install still works (for completeness):
On host:
Actual:
Connect to sandbox again:
Actual:
Expected behavior
For a NemoClaw sandbox in default mutable state:
/sandbox/.openclawand/sandbox/.openclaw/openclaw.jsonshould remain group-writable so that both the sandbox user and the gateway process (running as agatewayuser in thesandboxgroup) can write config.A typical contract for mutable mode (per documentation and test expectations) is:
/sandbox/.openclaw/openclaw.json:664 sandbox:sandbox/sandbox/.openclaw:2775 sandbox:sandboxg+wplus setgid so new files inherit groupsandbox.Running
openclaw doctor --fixshould not tighten permissions to700/600in a NemoClaw-managed mutable sandbox, because that prevents the gateway user from modifyingopenclaw.jsonand breaks UI-driven config persistence.The
gatewayuser inside the sandbox should be properly configured so that a probe like:su -s /bin/sh gateway -c "printf 'gateway-probe\n' >> /sandbox/.openclaw/openclaw.json"either:
gateway_write_exit:0) in mutable mode, orActual behavior
openclaw doctor --fixreports.openclawandopenclaw.jsonas "too open" and tightens them to700/600even though:Permissions: not configured (default mutable state)), and/sandbox/.openclawas a read-write area for sandbox + gateway.openclaw.jsonends up with permissions that prevent the gateway user from writing via the sandbox group.suto thegatewayuser fails withsu: System error, making it impossible to validate the gateway's write access using the expected probe.Sandbox user writes still succeed, and skill installation under
/sandbox/.openclaw/skills/...works as expected (skill_exit:0,installed_skill:0).Why this is a problem
NemoClaw's mutable-mode story relies on the gateway being able to mutate
openclaw.jsonand related state on behalf of the user, while the sandbox user can also write state under/sandbox/.openclaw.When
openclaw doctor --fixtightens the directory and config file to700/600:sandboxgroup), can no longer writeopenclaw.json.The
su: System errorongatewayis an additional symptom suggesting that the gateway user entry / auth setup inside the sandbox image is not in a healthy or expected state.Suggested fix / questions
Adjust
openclaw doctorbehavior when running inside a NemoClaw sandbox in mutable mode so that it does not tighten$OPENCLAW_HOME/.openclawandopenclaw.jsonto700/600, and instead preserves or restores group-writable permissions compatible with NemoClaw's gateway-write contract.Ensure the
gatewayuser in the NemoClaw sandbox image is configured in a way that:suor a documented alternative), and/sandbox/.openclaw/openclaw.jsonin mutable mode.Clarify in docs what the expected permissions are for
/sandbox/.openclawandopenclaw.jsonunder:700/600may be intended.