$npx -y skills add SafeAI-Lab-X/ClawKeeper --skill openclaw-parallels-smokeEnd-to-end Parallels smoke, upgrade, and rerun workflow for OpenClaw across macOS, Windows, and Linux guests. Use when Codex needs to run, rerun, debug, or interpret VM-based install, onboarding, gateway smoke tests, latest-release-to-main upgrade checks, fresh snapshot retests,
| 1 | # OpenClaw Parallels Smoke |
| 2 | |
| 3 | Use this skill for Parallels guest workflows and smoke interpretation. Do not load it for normal repo work. |
| 4 | |
| 5 | ## Global rules |
| 6 | |
| 7 | - Use the snapshot most closely matching the requested fresh baseline. |
| 8 | - Gateway verification in smoke runs should use `openclaw gateway status --deep --require-rpc` unless the stable version being checked does not support it yet. |
| 9 | - Stable `2026.3.12` pre-upgrade diagnostics may require a plain `gateway status --deep` fallback. |
| 10 | - Treat `precheck=latest-ref-fail` on that stable pre-upgrade lane as baseline, not automatically a regression. |
| 11 | - Pass `--json` for machine-readable summaries. |
| 12 | - Per-phase logs land under `/tmp/openclaw-parallels-*`. |
| 13 | - Do not run local and gateway agent turns in parallel on the same fresh workspace or session. |
| 14 | |
| 15 | ## macOS flow |
| 16 | |
| 17 | - Preferred entrypoint: `pnpm test:parallels:macos` |
| 18 | - Default to the snapshot closest to `macOS 26.3.1 latest`. |
| 19 | - On Peter's Tahoe VM, `fresh-latest-march-2026` can hang in `prlctl snapshot-switch`; if restore times out there, rerun with `--snapshot-hint 'macOS 26.3.1 latest'` before blaming auth or the harness. |
| 20 | - `prlctl exec` is fine for deterministic repo commands, but use the guest Terminal or `prlctl enter` when installer parity or shell-sensitive behavior matters. |
| 21 | - On the fresh Tahoe snapshot, `brew` exists but `node` may be missing from PATH in noninteractive exec. Use `/opt/homebrew/bin/node` when needed. |
| 22 | - Fresh host-served tgz installs should install as guest root with `HOME=/var/root`, then run onboarding as the desktop user via `prlctl exec --current-user`. |
| 23 | - Root-installed tgz smoke can log plugin blocks for world-writable `extensions/*`; do not treat that as an onboarding or gateway failure unless plugin loading is the task. |
| 24 | |
| 25 | ## Windows flow |
| 26 | |
| 27 | - Preferred entrypoint: `pnpm test:parallels:windows` |
| 28 | - Use the snapshot closest to `pre-openclaw-native-e2e-2026-03-12`. |
| 29 | - Always use `prlctl exec --current-user`; plain `prlctl exec` lands in `NT AUTHORITY\\SYSTEM`. |
| 30 | - Prefer explicit `npm.cmd` and `openclaw.cmd`. |
| 31 | - Use PowerShell only as the transport with `-ExecutionPolicy Bypass`, then call the `.cmd` shims from inside it. |
| 32 | - Keep onboarding and status output ASCII-clean in logs; fancy punctuation becomes mojibake in current capture paths. |
| 33 | |
| 34 | ## Linux flow |
| 35 | |
| 36 | - Preferred entrypoint: `pnpm test:parallels:linux` |
| 37 | - Use the snapshot closest to fresh `Ubuntu 24.04.3 ARM64`. |
| 38 | - If that exact VM is missing on the host, fall back to the closest Ubuntu guest with a fresh poweroff snapshot. On Peter's host today, that is `Ubuntu 25.10`. |
| 39 | - Use plain `prlctl exec`; `--current-user` is not the right transport on this snapshot. |
| 40 | - Fresh snapshots may be missing `curl`, and `apt-get update` can fail on clock skew. Bootstrap with `apt-get -o Acquire::Check-Date=false update` and install `curl ca-certificates`. |
| 41 | - Fresh `main` tgz smoke still needs the latest-release installer first because the snapshot has no Node or npm before bootstrap. |
| 42 | - This snapshot does not have a usable `systemd --user` session; managed daemon install is unsupported. |
| 43 | - `prlctl exec` reaps detached Linux child processes on this snapshot, so detached background gateway runs are not trustworthy smoke signals. |
| 44 | - Treat `gateway=skipped-no-detached-linux-gateway` plus `daemon=systemd-user-unavailable` as baseline on that Linux lane, not a regression. |
| 45 | |
| 46 | ## Discord roundtrip |
| 47 | |
| 48 | - Discord roundtrip is optional and should be enabled with: |
| 49 | - `--discord-token-env` |
| 50 | - `--discord-guild-id` |
| 51 | - `--discord-channel-id` |
| 52 | - Keep the Discord token only in a host env var. |
| 53 | - Use installed `openclaw message send/read`, not `node openclaw.mjs message ...`. |
| 54 | - Set `channels.discord.guilds` as one JSON object, not dotted config paths with snowflakes. |
| 55 | - Avoid long `prlctl enter` or expect-driven Discord config scripts; prefer `prlctl exec --current-user /bin/sh -lc ...` with short commands. |
| 56 | - For a narrower macOS-only Discord proof run, the existing `parallels-discord-roundtrip` skill is the deep-dive companion. |