[Linux][Agent&Skills] health-monitor sandbox recovery silently wipes messaging channel configuration
- Dominant language
- TypeScript
- Stars
- 22.5k
- Forks
- 3.1k
- Avg merge
- 1d 1h
- Merged PRs (30d)
- 715
Description
## Description
When a messaging bridge (Discord or Slack) exhausts its auto-restart attempts and the sandbox health-monitor triggers recovery (container recreation), the messaging channel configuration stored in `openclaw.json` is silently reset to default. The user's channel enrollment — completed through the full interactive wizard including sandbox rebuild — is lost without any warning. The user must re-run the entire wizard to restore the channel.
Platform scope: Reproduced on Linux x86_64 (Ubuntu 22.04). Other platforms not tested for this specific failure path.
Regression: Unknown — earlier versions not tested.
OpenShell issue: No
## Environment
```text
Device: Ubuntu 22.04 x86_64 server
OS: Ubuntu 22.04.5 LTS
Architecture: x86_64
Node.js: v22.23.2
npm: 10.9.8
Docker: Docker CE 29.x
OpenShell CLI: 0.0.101
NemoClaw: v0.0.113
OpenClaw: 2026.7.x
```
## Steps to Reproduce
1. Onboard a sandbox and add Discord via the wizard: `nemoclaw {sandbox} channels add discord`
2. Confirm sandbox rebuilds and channel is listed: `nemoclaw {sandbox} channels list`
3. Allow the Discord bridge to exhaust its auto-restart attempts (~26 minutes with v0.0.113 credential regression — bridge fails immediately, retries 10 times, then stops).
4. Wait for health-monitor to trigger sandbox recovery after bridge exhaustion.
5. Check: `nemoclaw {sandbox} channels list`
## Expected Result
After sandbox recovery, channel configuration persists. `nemoclaw channels list` still shows the enrolled Discord channel. User receives a notification if the bridge could not be automatically restarted.
## Actual Result
`openclaw.json` is reset to default after health-monitor recovery — channels array becomes empty. `nemoclaw {sandbox} channels list` shows no enrolled channels. No warning is shown to the user.
```text
Before recovery: nemoclaw {sandbox} channels list → "discord — Discord bot messaging"
After recovery: nemoclaw {sandbox} channels list → "(no channels configured)"
openclaw.json channels: [] (was populated with Discord config before recovery)
```
## Logs
```text
[discord] channel exited: Failed to resolve Discord application id — restart 10/10
[health-monitor] sandbox flagged for recovery: bridge exhausted retries
[health-monitor] recreating sandbox container
[sandbox] openclaw.json reset to defaults during container recreation
```
Contributor guide
Assessment
This issue has not been assessed yet.