[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M698R6DY8CDZWQTQEV32S38D":3,"skill-same:01M698R6DY8CDZWQTQEV32S38D":70},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":36,"linkOnly":37,"markdownContent":38,"markdownBody":39,"frontMatter":40,"refName":41,"commitSha":42,"skillDirectory":43,"forksCount":44,"repositoryHtmlUrl":45,"repositoryHomepageUrl":46,"ownerHtmlUrl":47,"ownerBlogUrl":46,"ownerDescription":48,"updatedAt":49,"install":50,"resources":63},"01M698R6DY8CDZWQTQEV32S38D","openclaw-qa-testing",null,"Run, watch, debug, extend, or explain OpenClaw qa-lab and qa-channel scenarios, artifacts, and live lanes.","openclaw\u002Fopenclaw","openclaw","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F252820863?v=4","01M698P3FSAZ6B4R928ZF19KPT","01M698PDMDRVH56MV30D253NFP",394352,"MIT","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fopenclaw-qa-testing\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[23,9,24,25,26,27,28,29,30,31,32,33,34,35],"testing","openclaw qa testing","qa","qa testing","debug","run","artifacts","explain","channel","live","watch","lab","extend","2026-11-10 10:12:30",false,"---\nname: openclaw-qa-testing\ndescription: Run, watch, debug, extend, or explain OpenClaw qa-lab and qa-channel scenarios, artifacts, and live lanes.\n---\n\n# OpenClaw QA Testing\n\nUse this skill for `qa-lab` \u002F `qa-channel` work. Repo-local QA only.\n\n## Read first\n\n- `docs\u002Fconcepts\u002Fqa-e2e-automation.md`\n- `docs\u002Fhelp\u002Ftesting.md`\n- `docs\u002Fchannels\u002Fqa-channel.md`\n- `qa\u002FREADME.md`\n- `qa\u002Fscenarios\u002Findex.yaml`\n- `extensions\u002Fqa-lab\u002Fsrc\u002Fsuite.ts`\n- `extensions\u002Fqa-lab\u002Fsrc\u002Fcharacter-eval.ts`\n\n## Model policy\n\n- Normal live suite runs rely on QA Lab source- and auth-aware defaults.\n- Do not pass `--model`, `--alt-model`, or `--fast` by default. Omitted\n  `--fast` does not mean fast is disabled; fast behavior is source-owned.\n- For scenario-specific runs, the complete `execution.summary` is authoritative\n  and overrides generic default guidance, including when it requires other\n  flags. Add explicit provider\u002Fmodel pins only when\n  `execution.config.requiredProvider` or `requiredModel` requires them.\n\n## Default workflow\n\n1. Read the scenario pack and current suite implementation.\n2. Decide lane:\n   - mock\u002Fdev: `mock-openai`\n   - real validation: `live-frontier`\n3. For a normal live suite, use:\n\n```bash\npnpm openclaw qa suite \\\n  --provider-mode live-frontier \\\n  --output-dir .artifacts\u002Fqa-e2e\u002Frun-all-live-frontier-\u003Ctag>\n```\n\n4. Watch outputs:\n   - summary: `.artifacts\u002Fqa-e2e\u002Frun-all-live-frontier-\u003Ctag>\u002Fqa-suite-summary.json`\n   - report: `.artifacts\u002Fqa-e2e\u002Frun-all-live-frontier-\u003Ctag>\u002Fqa-suite-report.md`\n5. If the user wants to watch the live UI, find the current `openclaw-qa` listen port and report `http:\u002F\u002F127.0.0.1:\u003Cport>`.\n6. If a scenario fails, fix the product or harness root cause, then rerun the full lane.\n\n## OTEL smoke\n\nFor local QA-lab OpenTelemetry validation, use:\n\n```bash\npnpm qa:otel:smoke\n```\n\nThis starts a local OTLP\u002FHTTP trace receiver, runs the `otel-trace-smoke`\nscenario through qa-channel, decodes the emitted protobuf spans, and verifies\nthe exported trace names and privacy contract. It does not require Opik,\nLangfuse, or external collector credentials.\n\n## QA credentials and 1Password\n\n- Use `op` only inside `tmux` for QA secret lookup in this repo.\n- Quick auth check inside tmux:\n\n```bash\nop account list\n```\n\n- Resolve approved 1Password item and field references for:\n  - `OPENCLAW_QA_CONVEX_SITE_URL`\n  - `OPENCLAW_QA_CONVEX_SECRET_MAINTAINER` for the maintainer role\n  - `OPENCLAW_QA_CONVEX_SECRET_CI` for the CI role\n- If a required reference is missing or stale, ask the maintainer\u002Foperator for its current item and field reference.\n  Do not ask for secret values in chat or copy them into logs or proof artifacts.\n- The npm Telegram Docker lane requires Convex credential leasing.\n  The lease supplies the Test Server SUT bot, QA-user authorization, and test-group metadata\n  defined by [Telegram E2E userbot](..\u002Ftelegram-e2e-userbot\u002FSKILL.md).\n  Direct Telegram token variables do not replace the required Convex configuration.\n- Load the approved site URL and role-specific secret into the command's environment through the approved secret source.\n  The preflight requires the site URL and matching role secret before the Docker run.\n- With the maintainer configuration loaded, run:\n\n```bash\nOPENCLAW_NPM_TELEGRAM_CREDENTIAL_SOURCE=convex \\\nOPENCLAW_NPM_TELEGRAM_CREDENTIAL_ROLE=maintainer \\\nOPENCLAW_NPM_TELEGRAM_PROVIDER_MODE=mock-openai \\\nOPENCLAW_NPM_TELEGRAM_PACKAGE_SPEC=\"openclaw@beta\" \\\npnpm test:docker:npm-telegram-live\n```\n\n- `scripts\u002Fe2e\u002Fnpm-telegram-live-runner.ts` reads `OPENCLAW_NPM_TELEGRAM_PROVIDER_MODE`, not `OPENCLAW_QA_PROVIDER_MODE`.\n- For authorized hosted proof, use the existing manual lane when its `qa-live-shared` environment has valid Convex CI configuration.\n  A dispatch does not provision credentials or bypass a credential refusal.\n\n```bash\nghx workflow run \"NPM Telegram Beta E2E\" --repo openclaw\u002Fopenclaw --ref main \\\n  -f package_spec=openclaw@YYYY.M.D-beta.N \\\n  -f package_label=openclaw@YYYY.M.D-beta.N \\\n  -f provider_mode=mock-openai\n```\n\n- Poll the exact run id from the dispatch URL. `gh run view --json artifacts` is not supported; list artifacts with:\n\n```bash\ngh api repos\u002Fopenclaw\u002Fopenclaw\u002Factions\u002Fruns\u002F\u003Crun-id>\u002Fartifacts\n```\n\n## WhatsApp live credentials\n\nUse this when setting up or replacing Convex `kind=whatsapp` credentials.\n\n- Treat WhatsApp QA credentials as operator-owned live accounts, not generated fixtures.\n- Use two dedicated WhatsApp-capable test numbers: one driver account and one SUT account. Do not use personal numbers or personal OpenClaw WhatsApp accounts in the shared pool.\n- Register and link each account manually with WhatsApp or WhatsApp Business, storing Web auth only in isolated local auth dirs outside the repo.\n- For group coverage, create a dedicated test group that includes both QA accounts and store its JID as `groupJid`; otherwise the group mention-gating scenario should be skipped by default and fail when explicitly requested.\n- Package the two Baileys auth dirs into base64 `.tgz` payload fields and add a new active Convex credential row. Prefer adding a fresh row and disabling stale\u002Fbroken rows over overwriting credentials in place.\n- Expected payload fields: `driverPhoneE164`, `sutPhoneE164`, `driverAuthArchiveBase64`, `sutAuthArchiveBase64`, and optional `groupJid`.\n- Keep credential material out of the repo, logs, PRs, and screenshots. Redact phone numbers unless the operator explicitly asks for local debugging.\n- Validate with `pnpm openclaw qa whatsapp --credential-source convex --credential-role maintainer --provider-mode mock-openai` and preserve artifact paths plus redacted pass\u002Ffail summaries.\n- If WhatsApp expires or invalidates a linked Web session, relink locally, package fresh auth archives, add a new Convex row, then disable the stale row.\n\n## Character evals\n\nUse `qa character-eval` for style\u002Fpersona\u002Fvibe checks across multiple live models.\n\n```bash\npnpm openclaw qa character-eval \\\n  --output-dir .artifacts\u002Fqa-e2e\u002Fcharacter-eval-\u003Ctag>\n```\n\n- Runs local QA gateway child processes, not Docker.\n- Packaged `pnpm build` omits QA Lab + qa-channel by design (source-checkout\n  only). To exercise `openclaw qa`\u002Fqa-channel from a built dist, build with\n  `OPENCLAW_BUILD_PRIVATE_QA=1 pnpm build` (emits `dist\u002Fplugin-sdk\u002Fqa-lab.js`,\n  `qa-runtime.js`, `dist\u002Fextensions\u002F{qa-lab,qa-channel}`) or run via `pnpm dev`.\n- With no model flags, character eval uses its current source-defined candidate,\n  judge, thinking, and fast defaults.\n- Repeat `--model provider\u002Fmodel,thinking=\u003Clevel>[,fast|,no-fast|,fast=\u003Cbool>]`\n  or `--judge-model ...` only to replace the corresponding inventory explicitly.\n- Do not add new examples with separate `--model-thinking`; keep that flag as legacy compatibility only.\n- Report includes judge ranking, run stats, durations, and full transcripts; do not include raw judge replies. Duration is benchmark context, not a grading signal.\n- Candidate and judge concurrency default to 16. Use `--concurrency \u003Cn>` and `--judge-concurrency \u003Cn>` to override when local gateways or provider limits need a gentler lane.\n- Scenario source is YAML-only under `qa\u002Fscenarios\u002F`: use `index.yaml` and\n  per-scenario `*.yaml` files with top-level `title`, `scenario`, and optional\n  `flow`. Never add fenced `qa-scenario` \u002F `qa-flow` Markdown files.\n- For isolated character\u002Fpersona evals, write the persona into `SOUL.md` and blank `IDENTITY.md` in the scenario flow. Use `SOUL.md + IDENTITY.md` only when intentionally testing how the normal OpenClaw identity combines with the character.\n- Keep prompts natural and task-shaped. The candidate model should receive character setup through `SOUL.md`, then normal user turns such as chat, workspace help, and small file tasks; do not ask \"how would you react?\" or tell the model it is in an eval.\n- Prefer at least one real task, such as creating or editing a tiny workspace artifact, so the transcript captures character under normal tool use instead of pure roleplay.\n\n## Codex CLI model lane\n\nUse model refs shaped like `codex-cli\u002F\u003Ccodex-model>` whenever QA should exercise Codex as a model backend.\n\nExamples:\n\n```bash\npnpm openclaw qa suite \\\n  --provider-mode live-frontier \\\n  --model codex-cli\u002F\u003Ccodex-model> \\\n  --alt-model codex-cli\u002F\u003Ccodex-model> \\\n  --scenario \u003Cscenario-id> \\\n  --output-dir .artifacts\u002Fqa-e2e\u002Fcodex-\u003Ctag>\n```\n\n```bash\npnpm openclaw qa manual \\\n  --model codex-cli\u002F\u003Ccodex-model> \\\n  --message \"Reply exactly: CODEX_OK\"\n```\n\n- Treat the concrete Codex model name as user\u002Fconfig input; do not hardcode it in source, docs examples, or scenarios.\n- Live QA preserves `CODEX_HOME` so Codex CLI auth\u002Fconfig works while keeping `HOME` and `OPENCLAW_HOME` sandboxed.\n- Mock QA should scrub `CODEX_HOME`.\n- If Codex returns fallback\u002Fauth text every turn, first check `CODEX_HOME`,\n  relevant secret-backed auth, and gateway child logs before changing\n  scenario assertions.\n- For model comparison, include `codex-cli\u002F\u003Ccodex-model>` as another candidate in `qa character-eval`; the report should label it as an opaque model name.\n\n## Repo facts\n\n- Seed scenarios live in `qa\u002Fscenarios\u002Findex.yaml` and\n  `qa\u002Fscenarios\u002F\u003Ctheme>\u002F*.yaml`.\n- Main live runner: `extensions\u002Fqa-lab\u002Fsrc\u002Fsuite.ts`\n- QA lab server: `extensions\u002Fqa-lab\u002Fsrc\u002Flab-server.ts`\n- Child gateway harness: `extensions\u002Fqa-lab\u002Fsrc\u002Fgateway-child.ts`\n- Synthetic channel: `extensions\u002Fqa-channel\u002F`\n\n## What “done” looks like\n\n- Full suite green for the requested lane.\n- User gets:\n  - watch URL if applicable\n  - pass\u002Ffail counts\n  - artifact paths\n  - concise note on what was fixed\n\n## Common failure patterns\n\n- Live timeout too short:\n  - widen live waits in `extensions\u002Fqa-lab\u002Fsrc\u002Fsuite.ts`\n- Discovery cannot find repo files:\n  - point prompts at `repo\u002F...` inside seeded workspace\n- Subagent proof too brittle:\n  - prefer stable final reply evidence over transient child-session listing\n- Harness “rebuild” delay:\n  - dirty tree can trigger a pre-run build; expect that before ports appear\n\n## When adding scenarios\n\n- Add or update scenario YAML under `qa\u002Fscenarios\u002F`; do not add `.md` scenario\n  files or fenced YAML blocks.\n- Keep kickoff expectations in `qa\u002Fscenarios\u002Findex.yaml` aligned\n- Add executable coverage in `extensions\u002Fqa-lab\u002Fsrc\u002Fsuite.ts`\n- Prefer end-to-end assertions over mock-only checks\n- Save outputs under `.artifacts\u002Fqa-e2e\u002F`\n","# OpenClaw QA Testing\n\nUse this skill for `qa-lab` \u002F `qa-channel` work. Repo-local QA only.\n\n## Read first\n\n- `docs\u002Fconcepts\u002Fqa-e2e-automation.md`\n- `docs\u002Fhelp\u002Ftesting.md`\n- `docs\u002Fchannels\u002Fqa-channel.md`\n- `qa\u002FREADME.md`\n- `qa\u002Fscenarios\u002Findex.yaml`\n- `extensions\u002Fqa-lab\u002Fsrc\u002Fsuite.ts`\n- `extensions\u002Fqa-lab\u002Fsrc\u002Fcharacter-eval.ts`\n\n## Model policy\n\n- Normal live suite runs rely on QA Lab source- and auth-aware defaults.\n- Do not pass `--model`, `--alt-model`, or `--fast` by default. Omitted\n  `--fast` does not mean fast is disabled; fast behavior is source-owned.\n- For scenario-specific runs, the complete `execution.summary` is authoritative\n  and overrides generic default guidance, including when it requires other\n  flags. Add explicit provider\u002Fmodel pins only when\n  `execution.config.requiredProvider` or `requiredModel` requires them.\n\n## Default workflow\n\n1. Read the scenario pack and current suite implementation.\n2. Decide lane:\n   - mock\u002Fdev: `mock-openai`\n   - real validation: `live-frontier`\n3. For a normal live suite, use:\n\n```bash\npnpm openclaw qa suite \\\n  --provider-mode live-frontier \\\n  --output-dir .artifacts\u002Fqa-e2e\u002Frun-all-live-frontier-\u003Ctag>\n```\n\n4. Watch outputs:\n   - summary: `.artifacts\u002Fqa-e2e\u002Frun-all-live-frontier-\u003Ctag>\u002Fqa-suite-summary.json`\n   - report: `.artifacts\u002Fqa-e2e\u002Frun-all-live-frontier-\u003Ctag>\u002Fqa-suite-report.md`\n5. If the user wants to watch the live UI, find the current `openclaw-qa` listen port and report `http:\u002F\u002F127.0.0.1:\u003Cport>`.\n6. If a scenario fails, fix the product or harness root cause, then rerun the full lane.\n\n## OTEL smoke\n\nFor local QA-lab OpenTelemetry validation, use:\n\n```bash\npnpm qa:otel:smoke\n```\n\nThis starts a local OTLP\u002FHTTP trace receiver, runs the `otel-trace-smoke`\nscenario through qa-channel, decodes the emitted protobuf spans, and verifies\nthe exported trace names and privacy contract. It does not require Opik,\nLangfuse, or external collector credentials.\n\n## QA credentials and 1Password\n\n- Use `op` only inside `tmux` for QA secret lookup in this repo.\n- Quick auth check inside tmux:\n\n```bash\nop account list\n```\n\n- Resolve approved 1Password item and field references for:\n  - `OPENCLAW_QA_CONVEX_SITE_URL`\n  - `OPENCLAW_QA_CONVEX_SECRET_MAINTAINER` for the maintainer role\n  - `OPENCLAW_QA_CONVEX_SECRET_CI` for the CI role\n- If a required reference is missing or stale, ask the maintainer\u002Foperator for its current item and field reference.\n  Do not ask for secret values in chat or copy them into logs or proof artifacts.\n- The npm Telegram Docker lane requires Convex credential leasing.\n  The lease supplies the Test Server SUT bot, QA-user authorization, and test-group metadata\n  defined by [Telegram E2E userbot](..\u002Ftelegram-e2e-userbot\u002FSKILL.md).\n  Direct Telegram token variables do not replace the required Convex configuration.\n- Load the approved site URL and role-specific secret into the command's environment through the approved secret source.\n  The preflight requires the site URL and matching role secret before the Docker run.\n- With the maintainer configuration loaded, run:\n\n```bash\nOPENCLAW_NPM_TELEGRAM_CREDENTIAL_SOURCE=convex \\\nOPENCLAW_NPM_TELEGRAM_CREDENTIAL_ROLE=maintainer \\\nOPENCLAW_NPM_TELEGRAM_PROVIDER_MODE=mock-openai \\\nOPENCLAW_NPM_TELEGRAM_PACKAGE_SPEC=\"openclaw@beta\" \\\npnpm test:docker:npm-telegram-live\n```\n\n- `scripts\u002Fe2e\u002Fnpm-telegram-live-runner.ts` reads `OPENCLAW_NPM_TELEGRAM_PROVIDER_MODE`, not `OPENCLAW_QA_PROVIDER_MODE`.\n- For authorized hosted proof, use the existing manual lane when its `qa-live-shared` environment has valid Convex CI configuration.\n  A dispatch does not provision credentials or bypass a credential refusal.\n\n```bash\nghx workflow run \"NPM Telegram Beta E2E\" --repo openclaw\u002Fopenclaw --ref main \\\n  -f package_spec=openclaw@YYYY.M.D-beta.N \\\n  -f package_label=openclaw@YYYY.M.D-beta.N \\\n  -f provider_mode=mock-openai\n```\n\n- Poll the exact run id from the dispatch URL. `gh run view --json artifacts` is not supported; list artifacts with:\n\n```bash\ngh api repos\u002Fopenclaw\u002Fopenclaw\u002Factions\u002Fruns\u002F\u003Crun-id>\u002Fartifacts\n```\n\n## WhatsApp live credentials\n\nUse this when setting up or replacing Convex `kind=whatsapp` credentials.\n\n- Treat WhatsApp QA credentials as operator-owned live accounts, not generated fixtures.\n- Use two dedicated WhatsApp-capable test numbers: one driver account and one SUT account. Do not use personal numbers or personal OpenClaw WhatsApp accounts in the shared pool.\n- Register and link each account manually with WhatsApp or WhatsApp Business, storing Web auth only in isolated local auth dirs outside the repo.\n- For group coverage, create a dedicated test group that includes both QA accounts and store its JID as `groupJid`; otherwise the group mention-gating scenario should be skipped by default and fail when explicitly requested.\n- Package the two Baileys auth dirs into base64 `.tgz` payload fields and add a new active Convex credential row. Prefer adding a fresh row and disabling stale\u002Fbroken rows over overwriting credentials in place.\n- Expected payload fields: `driverPhoneE164`, `sutPhoneE164`, `driverAuthArchiveBase64`, `sutAuthArchiveBase64`, and optional `groupJid`.\n- Keep credential material out of the repo, logs, PRs, and screenshots. Redact phone numbers unless the operator explicitly asks for local debugging.\n- Validate with `pnpm openclaw qa whatsapp --credential-source convex --credential-role maintainer --provider-mode mock-openai` and preserve artifact paths plus redacted pass\u002Ffail summaries.\n- If WhatsApp expires or invalidates a linked Web session, relink locally, package fresh auth archives, add a new Convex row, then disable the stale row.\n\n## Character evals\n\nUse `qa character-eval` for style\u002Fpersona\u002Fvibe checks across multiple live models.\n\n```bash\npnpm openclaw qa character-eval \\\n  --output-dir .artifacts\u002Fqa-e2e\u002Fcharacter-eval-\u003Ctag>\n```\n\n- Runs local QA gateway child processes, not Docker.\n- Packaged `pnpm build` omits QA Lab + qa-channel by design (source-checkout\n  only). To exercise `openclaw qa`\u002Fqa-channel from a built dist, build with\n  `OPENCLAW_BUILD_PRIVATE_QA=1 pnpm build` (emits `dist\u002Fplugin-sdk\u002Fqa-lab.js`,\n  `qa-runtime.js`, `dist\u002Fextensions\u002F{qa-lab,qa-channel}`) or run via `pnpm dev`.\n- With no model flags, character eval uses its current source-defined candidate,\n  judge, thinking, and fast defaults.\n- Repeat `--model provider\u002Fmodel,thinking=\u003Clevel>[,fast|,no-fast|,fast=\u003Cbool>]`\n  or `--judge-model ...` only to replace the corresponding inventory explicitly.\n- Do not add new examples with separate `--model-thinking`; keep that flag as legacy compatibility only.\n- Report includes judge ranking, run stats, durations, and full transcripts; do not include raw judge replies. Duration is benchmark context, not a grading signal.\n- Candidate and judge concurrency default to 16. Use `--concurrency \u003Cn>` and `--judge-concurrency \u003Cn>` to override when local gateways or provider limits need a gentler lane.\n- Scenario source is YAML-only under `qa\u002Fscenarios\u002F`: use `index.yaml` and\n  per-scenario `*.yaml` files with top-level `title`, `scenario`, and optional\n  `flow`. Never add fenced `qa-scenario` \u002F `qa-flow` Markdown files.\n- For isolated character\u002Fpersona evals, write the persona into `SOUL.md` and blank `IDENTITY.md` in the scenario flow. Use `SOUL.md + IDENTITY.md` only when intentionally testing how the normal OpenClaw identity combines with the character.\n- Keep prompts natural and task-shaped. The candidate model should receive character setup through `SOUL.md`, then normal user turns such as chat, workspace help, and small file tasks; do not ask \"how would you react?\" or tell the model it is in an eval.\n- Prefer at least one real task, such as creating or editing a tiny workspace artifact, so the transcript captures character under normal tool use instead of pure roleplay.\n\n## Codex CLI model lane\n\nUse model refs shaped like `codex-cli\u002F\u003Ccodex-model>` whenever QA should exercise Codex as a model backend.\n\nExamples:\n\n```bash\npnpm openclaw qa suite \\\n  --provider-mode live-frontier \\\n  --model codex-cli\u002F\u003Ccodex-model> \\\n  --alt-model codex-cli\u002F\u003Ccodex-model> \\\n  --scenario \u003Cscenario-id> \\\n  --output-dir .artifacts\u002Fqa-e2e\u002Fcodex-\u003Ctag>\n```\n\n```bash\npnpm openclaw qa manual \\\n  --model codex-cli\u002F\u003Ccodex-model> \\\n  --message \"Reply exactly: CODEX_OK\"\n```\n\n- Treat the concrete Codex model name as user\u002Fconfig input; do not hardcode it in source, docs examples, or scenarios.\n- Live QA preserves `CODEX_HOME` so Codex CLI auth\u002Fconfig works while keeping `HOME` and `OPENCLAW_HOME` sandboxed.\n- Mock QA should scrub `CODEX_HOME`.\n- If Codex returns fallback\u002Fauth text every turn, first check `CODEX_HOME`,\n  relevant secret-backed auth, and gateway child logs before changing\n  scenario assertions.\n- For model comparison, include `codex-cli\u002F\u003Ccodex-model>` as another candidate in `qa character-eval`; the report should label it as an opaque model name.\n\n## Repo facts\n\n- Seed scenarios live in `qa\u002Fscenarios\u002Findex.yaml` and\n  `qa\u002Fscenarios\u002F\u003Ctheme>\u002F*.yaml`.\n- Main live runner: `extensions\u002Fqa-lab\u002Fsrc\u002Fsuite.ts`\n- QA lab server: `extensions\u002Fqa-lab\u002Fsrc\u002Flab-server.ts`\n- Child gateway harness: `extensions\u002Fqa-lab\u002Fsrc\u002Fgateway-child.ts`\n- Synthetic channel: `extensions\u002Fqa-channel\u002F`\n\n## What “done” looks like\n\n- Full suite green for the requested lane.\n- User gets:\n  - watch URL if applicable\n  - pass\u002Ffail counts\n  - artifact paths\n  - concise note on what was fixed\n\n## Common failure patterns\n\n- Live timeout too short:\n  - widen live waits in `extensions\u002Fqa-lab\u002Fsrc\u002Fsuite.ts`\n- Discovery cannot find repo files:\n  - point prompts at `repo\u002F...` inside seeded workspace\n- Subagent proof too brittle:\n  - prefer stable final reply evidence over transient child-session listing\n- Harness “rebuild” delay:\n  - dirty tree can trigger a pre-run build; expect that before ports appear\n\n## When adding scenarios\n\n- Add or update scenario YAML under `qa\u002Fscenarios\u002F`; do not add `.md` scenario\n  files or fenced YAML blocks.\n- Keep kickoff expectations in `qa\u002Fscenarios\u002Findex.yaml` aligned\n- Add executable coverage in `extensions\u002Fqa-lab\u002Fsrc\u002Fsuite.ts`\n- Prefer end-to-end assertions over mock-only checks\n- Save outputs under `.artifacts\u002Fqa-e2e\u002F`\n",{"name":5,"description":7},"main","df9d3240e52a533ea176e98cf047ed6b40cf37d6",".agents\u002Fskills\u002Fopenclaw-qa-testing",82861,"https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw","https:\u002F\u002Fopenclaw.ai","https:\u002F\u002Fgithub.com\u002Fopenclaw","Your personal, open source AI assistant.","2026-11-12 03:01:25",{"source":8,"skillName":5,"commands":51,"prompt":61,"zipAvailable":62},[52,55,58],{"tool":53,"command":54},"npx","npx skills add openclaw\u002Fopenclaw --skill openclaw-qa-testing",{"tool":56,"command":57},"bunx","bunx skills add openclaw\u002Fopenclaw --skill openclaw-qa-testing",{"tool":59,"command":60},"pnpm","pnpm dlx skills add openclaw\u002Fopenclaw --skill openclaw-qa-testing","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fopenclaw-qa-testing\u002FSKILL.md",true,[64],{"path":65,"resourceType":66,"resourceTypeDesc":67,"sizeBytes":68,"sourceHtmlUrl":69},"agents\u002Fopenai.yaml","REFERENCE","参考文档",500,"https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fopenclaw-qa-testing\u002Fagents\u002Fopenai.yaml",[71,77,100,118,140,162],{"skillNo":72,"name":73,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":74,"categories":75,"keywords":76,"publishedAt":36},"01M698VP84FNM6G9MR1HPX7MF7","lobster","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fextensions\u002Flobster\u002FSKILL.md",[],[73],{"skillNo":78,"name":79,"nameZh":6,"description":80,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":81,"categories":82,"keywords":83,"publishedAt":36},"01M698YY8QGQ7S8TJNKJG6VTPH","xurl","xurl CLI for authenticated X posts, replies, reads\u002Fsearch, DMs, media upload, followers, auth status, or raw v2 API calls.","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fskills\u002Fxurl\u002FSKILL.md",[],[79,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99],"for","api","calls","replies","posts","upload","tap","install","brew","node","Media","search","npm","status","auth","cli",{"skillNo":101,"name":102,"nameZh":6,"description":103,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":104,"categories":105,"keywords":106,"publishedAt":36},"01M698YWT1CJ0WK88WB909R9RT","weather","Current weather and forecasts with web_fetch, falling back to wttr.in curl for locations, rain, temperature, travel planning.","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fskills\u002Fweather\u002FSKILL.md",[],[102,107,108,91,109,92,110,111,112,113,114,115,84,116,117],"travel planning","travel","fetch","curl","https","help","planning","web","back","temperature","with",{"skillNo":119,"name":120,"nameZh":6,"description":121,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":122,"categories":123,"keywords":129,"publishedAt":36},"01M698YV2Q0R0JJKAWGFS21K0N","visualize","Create inline visuals for code and explanations, or author persistent OpenClaw dashboard widgets with show_widget.","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fskills\u002Fvisualize\u002FSKILL.md",[124],{"categoryNo":125,"categoryName":126,"taxonomyType":127,"taxonomyTypeDesc":128},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[120,130,131,132,133,84,117,134,135,136,137,138,9,139],"widgets","openclaw dashboard","author","inline","show","code","create","visuals","dashboard","widget",{"skillNo":141,"name":142,"nameZh":6,"description":143,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":144,"categories":145,"keywords":152,"publishedAt":36},"01M698YS2TRJH9ENG28HD9CD87","trello","Manage Trello boards, lists, and cards via the Trello REST API.","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fskills\u002Ftrello\u002FSKILL.md",[146,149],{"categoryNo":147,"categoryName":148,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":150,"categoryName":151,"taxonomyType":127,"taxonomyTypeDesc":128},"01JBSEEDCAT000000000000030","开发工程师",[142,111,153,154,155,156,157,158,91,92,159,110,85,160,161],"cloud","manage","via","rest api","token","atlassian","jq","REST","developer",{"skillNo":163,"name":164,"nameZh":6,"description":165,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":166,"categories":167,"keywords":168,"publishedAt":36},"01M698YQ9Q3M4W78EWV2KSCSVW","tmux","Control tmux sessions\u002Fpanes for interactive CLIs: list, capture output, send keys, paste text, monitor prompts.","https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw\u002Fblob\u002Fmain\u002Fskills\u002Ftmux\u002FSKILL.md",[],[164,91,169,170,84,171,172,173,174,175,176,177,92,178,179,180,181,182,183],"send","darwin","keys","paste","output","control","prompts","interactive","list","capture","panes","text","monitor","sessions","linux"]