/crabbox
Crabbox/Testbox remote proof for OpenClaw: trusted-source routing, untrusted isolation, Linux/macOS/Windows/WSL2, live E2E, desktop, diagnostics, cleanup.
$ npx -y skills add openclaw/agent-skills --skill crabbox --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/crabbox
Context preview
The summary Claude sees to decide when to auto-load this skill.
Crabbox/Testbox remote proof for OpenClaw: trusted-source routing, untrusted isolation, Linux/macOS/Windows/WSL2, live E2E, desktop, diagnostics, cleanup.
SKILL.md
crabbox.SKILL.mdname: crabbox
description: "Crabbox/Testbox remote proof for OpenClaw: trusted-source routing, untrusted isolation, Linux/macOS/Windows/WSL2, live E2E, desktop, diagnostics, cleanup."
Crabbox
Remote OpenClaw proof. Heavy tests. Builds. Typecheck/lint fan-out. Docker. Packages. Live providers. Desktop. Cross-OS.
Backends:
- `blacksmith-testbox`: trusted maintainer source. Prepared CI. `tbx_...`.
- `aws`: direct brokered Crabbox. Fresh PRs. Custom sync/env/capture. `cbx_...`.
- `local-container`: Docker fallback. Not remote proof.
- `ssh`: existing operator host. macOS/Windows/WSL2.
Always report provider, id, run URL, command, result. Never call Testbox “AWS Crabbox.”
Route First
Source trust before test size.
- Trusted + one/few focused tests + ready deps: local.
- Trusted + heavy proof: Blacksmith Testbox.
- Untrusted contributor/fork: secretless fork CI or sanitized direct AWS.
- Never untrusted code on credential-hydrated Testbox.
- Never run untrusted repo wrapper/config locally.
- No speculative warmup. Acquire when first heavy command ready. Reuse id. Stop.
Need direct AWS semantics? Pass `--provider aws`. Need normal trusted OpenClaw heavy proof? Pass `--provider blacksmith-testbox`.
Preflight
Run from repo root.
command -v crabbox
../crabbox/bin/crabbox --version
node scripts/crabbox-wrapper.mjs run --help | sed -n '1,100p'
command -v blacksmith
blacksmith --version
Set checked binary once. PATH copy may be stale.
if [ -x ../crabbox/bin/crabbox ]; then
export CRABBOX=../crabbox/bin/crabbox
else
export CRABBOX="$(command -v crabbox)"
fi
"$CRABBOX" --version
Read `.crabbox.yaml`; never guess provider default.
No binary? Clean sibling checkout only:
if [ -n "$(git -C ../crabbox status --short)" ]; then
git -C ../crabbox status --short
exit 1
fi
git -C ../crabbox pull --ff-only
mkdir -p ../crabbox/bin
(cd ../crabbox && go build -o bin/crabbox ./cmd/crabbox)
../crabbox/bin/crabbox --version
Dirty/missing/nonstandard sibling: stop. No overwrite.
Trusted Testbox
One-shot heavy gate:
node scripts/crabbox-wrapper.mjs run \
--provider blacksmith-testbox \
--timing-json -- \
CI=1 NODE_OPTIONS=--max-old-space-size=4096 \
OPENCLAW_TEST_PROJECTS_PARALLEL=6 \
OPENCLAW_VITEST_MAX_WORKERS=1 \
OPENCLAW_TESTBOX=1 OPENCLAW_TESTBOX_REMOTE_RUN=1 \
pnpm check:changed
Several commands: warm once, save id, reuse, stop.
node scripts/crabbox-wrapper.mjs warmup \
--provider blacksmith-testbox --keep --timing-json
node scripts/crabbox-wrapper.mjs run \
--provider blacksmith-testbox --id <tbx_id> --timing-json -- \
OPENCLAW_TESTBOX=1 OPENCLAW_TESTBOX_REMOTE_RUN=1 \
pnpm test <path-or-filter>
blacksmith testbox stop --id <tbx_id>
Rules:
- One lease, one active command. No sync/reclaim during run.
- Sync current checkout every run. `--no-sync` only unchanged intentional rerun.
- `--reclaim` only deliberate checkout-path ownership transfer.
- Base/head change: stop. Rewarm. No stale-lease override.
- Raw SHA unreliable for `warmup --ref`; use branch/tag.
- `blacksmith testbox list` hides states. Use `list --all` or
`status --id <tbx_id>`.
- Testbox status/stop: `--id`. No status `--json`.
- Delegated provider rejects `--fresh-pr`, `--full-resync`, `--script*`,
`--env-helper`, capture/download flags.
Autoreview parallel tests:
- Current helper: short POSIX test home. Nothing extra.
- Old helper + macOS `ControlPath too long`: put `TMPDIR=/tmp` on outer process.
TMPDIR=/tmp OPENCLAW_TESTBOX=1 "$AUTOREVIEW" \
--parallel-tests "pnpm check:changed"
- Do not put `TMPDIR` inside quoted test command. Home already created.
Untrusted AWS
Clean trusted `main` checkout. Installed trusted Crabbox binary. Fresh lease per reviewed full head SHA. No instance role. No Tailscale. No hydration. Only `CI` forwarded. Trusted bootstrap uploaded beside `--fresh-pr`.
cd <clean-trusted-openclaw-main>
env -u CRABBOX_AWS_INSTANCE_PROFILE \
"$CRABBOX" config show --json | \
jq -e '.aws.instanceProfile == ""' >/dev/null
env -u CRABBOX_AWS_INSTANCE_PROFILE \
-u CRABBOX_TAILSCALE \
-u CRABBOX_TAILSCALE_AUTH_KEY \
-u CRABBOX_TAILSCALE_AUTH_KEY_ENV \
-u CRABBOX_TAILSCALE_EXIT_NODE \
-u CRABBOX_TAILSCALE_EXIT_NODE_ALLOW_LAN_ACCESS \
-u CRABBOX_TAILSCALE_HOSTNAME_TEMPLATE \
-u CRABBOX_TAILSCALE_TAGS \
"$CRABBOX" warmup \
--provider aws --network public --tailscale=false \
--tailscale-exit-node= \
--tailscale-exit-node-allow-lan-access=false \
--keep --timing-json
"$CRABBOX" inspect --provider aws --id <cbx_id> --json | \
jq -e '.network == "public" and .tailscale == null' >/dev/null
env -u CRABBOX_AWS_INSTANCE_PROFILE \
CRABBOX_ENV_ALLOW=CI \
"$CRABBOX" run \
--provider aws --id <cbx_id> \
--fresh-pr <owner/repo#number> \
--no-hydrate --timing-json \
--script scripts/crabbox-untrusted-bootstrap.sh -- \
<expected_full_head_sha> /usr/local/bin/pnpm test <path-or-filter>
env -u CRABBOX_AWS_INSTANCE_PROFILE \
"$CRABBOX" stop --provider aws <cbx_id>
Bootstrap proves IMDSv2 IAM credential endpoint returns 404, verifies full SHA, unsets `NODE_OPTIONS`, pins Node/pnpm, checks package-manager pin, isolates `HOME`, installs, tests.
Head moved? Stop. Rewarm. No reuse across revisions. No remote PR or no-role proof unavailable? Secretless fork CI. No exceptions.
Direct AWS
Trusted direct run:
node scripts/crabbox-wrapper.mjs run \
--provider aws \
--idle-timeout 90m --ttl 240m --timing-json \
--shell -- \
"pnpm test:changed"
Focused:
node scripts/crabbox-wrapper.mjs run \
--provider aws --timing-json --shell -- \
"pnpm test <path-or-filter>"
Stale sync: retry `--full-resync` once. Still bad: fresh lease. One-shot should stop itself; after failure/interruption verify `"$CRABBOX" list --provider aws`.
Broker auth, not cloud keys:
"$CRABBOX" config show
"$CRABBOX" doctor
"$CRABBOX" whoami
"$CRABBOX" login
Read more
name: crabbox description: "Crabbox/Testbox remote proof for OpenClaw: trusted-source routing, untrusted isolation, Linux/macOS/Windows/WSL2, live E2E, desktop, diagnostics, cleanup."
Crabbox
Remote OpenClaw proof. Heavy tests. Builds. Typecheck/lint fan-out. Docker. Packages. Live providers. Desktop. Cross-OS.
Backends:
- `blacksmith-testbox`: trusted maintainer source. Prepared CI. `tbx_...`.
- `aws`: direct brokered Crabbox. Fresh PRs. Custom sync/env/capture. `cbx_...`.
- `local-container`: Docker fallback. Not remote proof.
- `ssh`: existing operator host. macOS/Windows/WSL2.
Always report provider, id, run URL, command, result. Never call Testbox “AWS Crabbox.”
Route First
Source trust before test size.
- Trusted + one/few focused tests + ready deps: local.
- Trusted + heavy proof: Blacksmith Testbox.
- Untrusted contributor/fork: secretless fork CI or sanitized direct AWS.
- Never untrusted code on credential-hydrated Testbox.
- Never run untrusted repo wrapper/config locally.
- No speculative warmup. Acquire when first heavy command ready. Reuse id. Stop.
Need direct AWS semantics? Pass `--provider aws`. Need normal trusted OpenClaw heavy proof? Pass `--provider blacksmith-testbox`.
Preflight
Run from repo root.
command -v crabbox ../crabbox/bin/crabbox --version node scripts/crabbox-wrapper.mjs run --help | sed -n '1,100p' command -v blacksmith blacksmith --version
Set checked binary once. PATH copy may be stale.
if [ -x ../crabbox/bin/crabbox ]; then export CRABBOX=../crabbox/bin/crabbox else export CRABBOX="$(command -v crabbox)" fi "$CRABBOX" --version
Read `.crabbox.yaml`; never guess provider default.
No binary? Clean sibling checkout only:
if [ -n "$(git -C ../crabbox status --short)" ]; then git -C ../crabbox status --short exit 1 fi git -C ../crabbox pull --ff-only mkdir -p ../crabbox/bin (cd ../crabbox && go build -o bin/crabbox ./cmd/crabbox) ../crabbox/bin/crabbox --version
Dirty/missing/nonstandard sibling: stop. No overwrite.
Trusted Testbox
One-shot heavy gate:
node scripts/crabbox-wrapper.mjs run \ --provider blacksmith-testbox \ --timing-json -- \ CI=1 NODE_OPTIONS=--max-old-space-size=4096 \ OPENCLAW_TEST_PROJECTS_PARALLEL=6 \ OPENCLAW_VITEST_MAX_WORKERS=1 \ OPENCLAW_TESTBOX=1 OPENCLAW_TESTBOX_REMOTE_RUN=1 \ pnpm check:changed
Several commands: warm once, save id, reuse, stop.
node scripts/crabbox-wrapper.mjs warmup \ --provider blacksmith-testbox --keep --timing-json node scripts/crabbox-wrapper.mjs run \ --provider blacksmith-testbox --id <tbx_id> --timing-json -- \ OPENCLAW_TESTBOX=1 OPENCLAW_TESTBOX_REMOTE_RUN=1 \ pnpm test <path-or-filter> blacksmith testbox stop --id <tbx_id>
Rules:
- One lease, one active command. No sync/reclaim during run.
- Sync current checkout every run. `--no-sync` only unchanged intentional rerun.
- `--reclaim` only deliberate checkout-path ownership transfer.
- Base/head change: stop. Rewarm. No stale-lease override.
- Raw SHA unreliable for `warmup --ref`; use branch/tag.
- `blacksmith testbox list` hides states. Use `list --all` or
`status --id <tbx_id>`.
- Testbox status/stop: `--id`. No status `--json`.
- Delegated provider rejects `--fresh-pr`, `--full-resync`, `--script*`,
`--env-helper`, capture/download flags.
Autoreview parallel tests:
- Current helper: short POSIX test home. Nothing extra.
- Old helper + macOS `ControlPath too long`: put `TMPDIR=/tmp` on outer process.
TMPDIR=/tmp OPENCLAW_TESTBOX=1 "$AUTOREVIEW" \ --parallel-tests "pnpm check:changed"
- Do not put `TMPDIR` inside quoted test command. Home already created.
Untrusted AWS
Clean trusted `main` checkout. Installed trusted Crabbox binary. Fresh lease per reviewed full head SHA. No instance role. No Tailscale. No hydration. Only `CI` forwarded. Trusted bootstrap uploaded beside `--fresh-pr`.
cd <clean-trusted-openclaw-main> env -u CRABBOX_AWS_INSTANCE_PROFILE \ "$CRABBOX" config show --json | \ jq -e '.aws.instanceProfile == ""' >/dev/null env -u CRABBOX_AWS_INSTANCE_PROFILE \ -u CRABBOX_TAILSCALE \ -u CRABBOX_TAILSCALE_AUTH_KEY \ -u CRABBOX_TAILSCALE_AUTH_KEY_ENV \ -u CRABBOX_TAILSCALE_EXIT_NODE \ -u CRABBOX_TAILSCALE_EXIT_NODE_ALLOW_LAN_ACCESS \ -u CRABBOX_TAILSCALE_HOSTNAME_TEMPLATE \ -u CRABBOX_TAILSCALE_TAGS \ "$CRABBOX" warmup \ --provider aws --network public --tailscale=false \ --tailscale-exit-node= \ --tailscale-exit-node-allow-lan-access=false \ --keep --timing-json "$CRABBOX" inspect --provider aws --id <cbx_id> --json | \ jq -e '.network == "public" and .tailscale == null' >/dev/null env -u CRABBOX_AWS_INSTANCE_PROFILE \ CRABBOX_ENV_ALLOW=CI \ "$CRABBOX" run \ --provider aws --id <cbx_id> \ --fresh-pr <owner/repo#number> \ --no-hydrate --timing-json \ --script scripts/crabbox-untrusted-bootstrap.sh -- \ <expected_full_head_sha> /usr/local/bin/pnpm test <path-or-filter> env -u CRABBOX_AWS_INSTANCE_PROFILE \ "$CRABBOX" stop --provider aws <cbx_id>
Bootstrap proves IMDSv2 IAM credential endpoint returns 404, verifies full SHA, unsets `NODE_OPTIONS`, pins Node/pnpm, checks package-manager pin, isolates `HOME`, installs, tests.
Head moved? Stop. Rewarm. No reuse across revisions. No remote PR or no-role proof unavailable? Secretless fork CI. No exceptions.
Direct AWS
Trusted direct run:
node scripts/crabbox-wrapper.mjs run \ --provider aws \ --idle-timeout 90m --ttl 240m --timing-json \ --shell -- \ "pnpm test:changed"
Focused:
node scripts/crabbox-wrapper.mjs run \ --provider aws --timing-json --shell -- \ "pnpm test <path-or-filter>"
Stale sync: retry `--full-resync` once. Still bad: fresh lease. One-shot should stop itself; after failure/interruption verify `"$CRABBOX" list --provider aws`.
Broker auth, not cloud keys:
"$CRABBOX" config show "$CRABBOX" doctor "$CRABBOX" whoami "$CRABBOX" login
Shared skills for coding agents that work on OpenClaw projects. This repo is the public canonical source for common workflows such as review closeout and remote validation.
Repo: openclaw/agent-skills
Other skills on openclaw-agent-skills.
- /agent-transcript
GitHub PR/issue agent transcripts: redact, preview, and insert safely.
Open skill - /autoreview
Pre-commit/ship code review: Codex default; optional Claude, Pi, or Kimi.
Open skill - /beam
Publish a redacted local coding session to an authenticated read-only Beam catalog.
Open skill - /behavior-validator
Source-blind user behavior validation against a prewritten contract for apps, CLIs, APIs, and generated artifacts.
Open skill - /handoff
Clipboard-ready handoff prompt for another agent to investigate or continue a task.
Open skill - /readme-standard
House README standard: structure, badge row, tone, per-archetype templates, and verification gates for steipete/openclaw repos.
Open skill

