active/claw-integ/SKILL.md
Run live OpenClaw integration proof against a named claw gateway profile with showboat-v2.
npx skillsauth add kevinslin/skills claw-integInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use this skill when the user invokes $claw-integ to prove OpenClaw behavior against a live claw gateway profile.
Usage:
$claw-integ [profile] "test it"
profile is optional. When omitted, infer the profile from the behavior under test.
Run a live integration proof through the requested claw gateway profile and capture the evidence with ../showboat-v2/SKILL.md.
Do not use Showboat to wrap existing unit tests. The proof must exercise the expected behavior through the live gateway/TUI or the closest repo-supported live gateway client path.
When testing exec or plugin approvals, read ./references/approvals.md before starting the live run.
When testing Signal channel delivery or Signal-backed approvals, read ./references/signal.md before starting the live run.
When testing iMessage or SMS-backed approvals, read ./references/imessage.md before starting the live run.
When the live run tests exec or plugin approval delivery, create a row-by-row proof matrix before triggering requests. The proof is incomplete until every user-requested row is either observed with artifacts or recorded with a specific blocker.
Include rows for the relevant approval family and channel states:
/approve: allow-always or any requested slash-command fallback works when applicable.For each row, record the exact command or live action, expected result, observed result, raw artifact path, and screenshot/photo path when the user asks for visual proof. Do not summarize the approval suite as complete from unit tests alone.
Treat channel-backed integration as a state machine, not merely an ordered list:
parent-created -> turn-active -> terminal-reply
terminal-reply -> approval-pending -> decision-or-expiry -> terminal-reply
terminal-reply -> direct-side-effect-verification -> next-scenario
<proof-root>/raw/ as the run progresses../references/approvals.md./Users/kevinlin/code/openclaw unless the user gives another path.openclaw-codex-dev: Codex claw profile. Use it for Codex harness, Codex app-server, Codex plugin/tool, Codex approval, or OpenAI Codex runtime/protocol behavior..openclaw-dev: dev claw profile. Use it for the normal OpenClaw dev gateway/TUI path, Pi-style harness work, non-Codex channel delivery, and generic OpenClaw behavior.openclaw-codex-dev only when the behavior being tested depends on Codex;.openclaw-dev..openclaw-dev, or copy credentials between profiles.Treat these as local claw profile selectors, not always as literal OPENCLAW_PROFILE values. Before invoking OpenClaw commands, resolve and record the selected profile's concrete OpenClaw runtime environment, including the actual OPENCLAW_PROFILE, OPENCLAW_STATE_DIR, and OPENCLAW_CONFIG_PATH when present. For .openclaw-dev, the OpenClaw dev CLI profile is dev and the state directory is ~/.openclaw-dev; do not pass .openclaw-dev as OPENCLAW_PROFILE.
Profile existence is a local state check: the selected claw profile exists only when its matching local config/state can be found and the resolved OpenClaw config path points at openclaw.json. Prefer profile-aware CLI commands for operation, but use the resolved state/config paths for existence checks and redacted summaries.
This skill's built-in profile contract is local-only. When the user requests a remote gateway or hosted tenant:
openclaw-codex-dev or .openclaw-dev.Do not add remote credentials, tenant paths, or provider-specific cluster assumptions to this public skill.
Use the selected profile's claw gateway. Prefer repo-local or documented profile-aware commands over ad hoc global state changes.
Before running the proof:
For .openclaw-dev, use the dev profile and dev gateway/TUI path:
pnpm gateway:dev
pnpm tui:dev
For openclaw-codex-dev, first resolve the profile's concrete OpenClaw environment from the local claw profile config/service env, then use profile-scoped commands from the repo root:
OPENCLAW_PROFILE=<resolved-openclaw-profile> pnpm openclaw gateway status --deep --require-rpc
OPENCLAW_PROFILE=<resolved-openclaw-profile> pnpm openclaw gateway restart
OPENCLAW_PROFILE=<resolved-openclaw-profile> pnpm openclaw tui
For every openclaw-codex-dev run, confirm the Google Calendar Codex plugin is configured and enabled before the live invocation. The redacted config summary must show:
plugins.entries.codex.enabled: trueplugins.entries.codex.config.codexPlugins.enabled: trueplugins.entries.codex.config.codexPlugins.plugins["google-calendar"].enabled: truemarketplaceName: "openai-curated"pluginName: "google-calendar"If the google-calendar entry exists but is disabled, enable it through the product-supported Codex command:
/codex plugins enable google-calendar
If the entry is missing, use the Codex migration/setup flow for the selected profile before the live run:
OPENCLAW_PROFILE=<resolved-openclaw-profile> pnpm openclaw migrate apply codex --yes --plugin google-calendar
After changing codexPlugins, start a fresh Codex conversation with /new or /reset before testing plugin behavior. Do not treat openclaw-codex-dev proof as ready until Google Calendar is enabled or a specific blocker is recorded.
If the test needs Codex plugins, ensure the selected profile has the required allow_destructive_actions or equivalent policy before the live invocation, and record the redacted setting in the proof.
When testing approvals through an existing channel app such as WhatsApp, Signal, iMessage, SMS, or a browser-backed sender, do this preflight before sending the first live message:
openclaw-codex-dev and .openclaw-dev..openclaw-dev resolves to OpenClaw profile dev and state path ~/.openclaw-dev.openclaw-codex-dev must be resolved from its local profile config/service env before launch.Split every approval row into two gates:
For plugin approvals, the request-created gate must include evidence that the plugin call actually reached the approval path, such as plugin.approval.waitDecision, a pending item from plugin.approval.list, or the equivalent channel/runtime artifact. If the model sends a normal reply without calling the plugin, record that as a plugin-invocation blocker rather than testing accept or deny.
For exec approvals, similarly prove the exec approval request exists before acting on it. Do not infer plugin approval health from exec approval success; they use different approval namespaces and may fail independently.
Keep log collection narrow. Search by nonce, channel session id, request id, or the selected profile's known log/session files. Avoid broad recursive scans of the entire profile directory when it can include caches, node_modules, or old session artifacts.
Capture video proof with ffmpeg for every live $claw-integ run when feasible.
Store video artifacts under <proof-root>/raw/:
<scenario-slug>.mp4: the proof video<scenario-slug>.ffprobe.txt: ffprobe metadata for the MP4<scenario-slug>.video-notes.md: capture method, command, duration, and any cropping/redaction notesStart recording before the live action and stop only after the expected result is visible. Include the video and ffprobe files in the Showboat raw artifact index and scenario result.
For terminal, prompt, menu, or TUI behavior, prefer privacy-safe tmux-pane video over full desktop capture:
tmux.raw/<scenario-slug>.frames/ or an equivalent temporary frame directory.ffmpeg:ffmpeg -hide_banner -y -framerate 1 \
-i "<frames-dir>/frame_%04d.png" \
-c:v libx264 -pix_fmt yuv420p -r 30 -movflags +faststart \
"<proof-root>/raw/<scenario-slug>.mp4"
For browser or graphical UI behavior that cannot be proven from tmux output, use ffmpeg screen capture with the narrowest feasible capture area. Avoid recording unrelated private windows. On macOS, first list devices:
ffmpeg -hide_banner -f avfoundation -list_devices true -i ""
Then capture the intended screen only, adding crop filters when needed:
ffmpeg -hide_banner -y -f avfoundation -framerate 30 \
-i "<screen-index>:none" \
-c:v libx264 -pix_fmt yuv420p -movflags +faststart \
"<proof-root>/raw/<scenario-slug>.mp4"
Verify every produced video:
ffprobe -v error -select_streams v:0 \
-show_entries stream=codec_name,width,height,duration,nb_frames \
-of default=noprint_wrappers=1 \
"<proof-root>/raw/<scenario-slug>.mp4" \
> "<proof-root>/raw/<scenario-slug>.ffprobe.txt"
If ffmpeg is unavailable, screen-recording permission is blocked, or recording would expose unrelated private content, save blocker evidence under raw/, keep the non-video Showboat proof intact, and report the gap directly.
For live integration proof, the conversation itself must include image proof, not only a path, PR link, video, or Showboat artifact.
Capture at least one still screenshot of the actual channel surface being tested and store it under <proof-root>/raw/:
Before final handoff, show that screenshot inline in the thread using the chat surface's supported image mechanism. If a local path will not render inline, upload or attach the redacted screenshot through an approved artifact/image path and embed that image. The final answer must also name the saved raw screenshot path.
If screenshot capture or inline display is blocked, the integration proof is incomplete for user-facing purposes. Save blocker evidence under raw/, state the blocker directly, and do not imply that full proof was shown inline.
Use ../showboat-v2/SKILL.md for every $claw-integ run.
The proof directory is a durable artifact. Before choosing the proof path, invoke ../mem/SKILL.md and resolve the OpenClaw memory base, root, schemas, and file rules. Do not infer the target from a cwd-relative .mem path; $mem may resolve to any configured folder. If $mem cannot resolve a suitable OpenClaw proof base, ask before falling back to a workspace-local proof directory.
Use these OpenClaw-specific values with showboat-v2:
<proofs-root>: the concrete root/path resolved from $mem claw/main proofs, otherwise the explicitly approved fallback proof root.<proof-slug>: demo-{num}-{profile}-{slug}.<proof-root>: <proofs-root>/<proof-slug>.<scenario-slug>: a short behavior slug; use one scenario file per distinct behavior path.Report the selected $mem base name, resolved root, and final <proof-root> in the handoff so wrong-root writes are auditable.
Follow showboat-v2 to materialize proof.md and each scenario/<scenario-slug>.md, create raw/ and scripts/, and capture the stable Showboat summary at:
<proof-root>/raw/showboat-summary.md
The proof must include:
proof.md with the claim, expected behavior, target details, status, scenario results, and raw artifact index.scenario/<scenario-slug>.md describing the requested profile, test prompt, preconditions, relevant redacted config, live action, expected result, observed result, and raw artifact links.ffprobe metadata under raw/, or explicit blocker evidence if video capture was not feasible.raw/, plus inline display of that screenshot in the conversation before final handoff.raw/, not embedded directly in a way that breaks showboat verify.uvx showboat verify <proof-root>/raw/showboat-summary.md pass.When the output includes timestamps, temp paths, session ids, event ids, or stochastic model text, save raw output under raw/ and capture a stable summary command in the verified Showboat summary.
When the selected local claw profile is missing, ambiguous, or not one of openclaw-codex-dev / .openclaw-dev:
.openclaw-dev, create a new profile, or move credentials as part of claw-integ.For built-in local-profile runs, the run is complete only when:
openclaw-codex-dev or .openclaw-devraw/, or a video-capture blocker was saved thereraw/ and shown inline in the conversation, or a screenshot/inline-display blocker was saved and reportedshowboat-v2 proof directory was materialized and filleduvx showboat verify <proof-root>/raw/showboat-summary.md passedIf any step is blocked, save the partial proof directory with the blocker evidence and report the blocker directly.
development
Create, rename, audit, or close a tracked Codex task whose turns and status are persisted in the local thread ledger. Only use when directly invoked.
testing
Manage Git preflight, branch and worktree creation, and completed-work cleanup. Use when explicitly invoked.
databases
Automatically use for durable knowledge, configured project-context lookup, and schema-backed artifact layouts.
content-media
Create, update, or optimize skills and SKILL.md content.