Caricamento in corso...
Caricamento in corso...
Last synced: Today, 22:00
Technical reference for the OpenClaw framework. Real-time synchronization with the official documentation engine.
Use this file to discover all available pages before exploring further.
The private QA stack is meant to exercise OpenClaw in a more realistic, channel-shaped way than a single unit test can.
Current pieces:
extensions/qa-channelextensions/qa-labextensions/qa-matrixqa/Every QA flow runs under
pnpm openclaw qa <subcommand>pnpm qa:*| Command | Purpose |
|---|---|
text qa run | Bundled QA self-check; writes a Markdown report. |
text qa suite | Run repo-backed scenarios against the QA gateway lane. Aliases: text pnpm openclaw qa suite --runner multipass |
text qa coverage | Print the markdown scenario-coverage inventory ( text --json |
text qa parity-report | Compare two text qa-suite-summary.json |
text qa character-eval | Run the character QA scenario across multiple live models with a judged report. See Reporting. |
text qa manual | Run a one-off prompt against the selected provider/model lane. |
text qa ui | Start the QA debugger UI and local QA bus (alias: text pnpm qa:lab:ui |
text qa docker-build-image | Build the prebaked QA Docker image. |
text qa docker-scaffold | Write a docker-compose scaffold for the QA dashboard + gateway lane. |
text qa up | Build the QA site, start the Docker-backed stack, print the URL (alias: text pnpm qa:lab:uptext :fasttext --use-prebuilt-image --bind-ui-dist --skip-ui-build |
text qa aimock | Start only the AIMock provider server. |
text qa mock-openai | Start only the scenario-aware text mock-openai |
text qa credentials doctortext addtext listtext remove | Manage the shared Convex credential pool. |
text qa matrix | Live transport lane against a disposable Tuwunel homeserver. See Matrix QA. |
text qa telegram | Live transport lane against a real private Telegram group. |
text qa discord | Live transport lane against a real private Discord guild channel. |
The current QA operator flow is a two-pane QA site:
Run it with:
bashpnpm qa:lab:up
That builds the QA site, starts the Docker-backed gateway lane, and exposes the QA Lab page where an operator or automation loop can give the agent a QA mission, observe real channel behavior, and record what worked, failed, or stayed blocked.
For faster QA Lab UI iteration without rebuilding the Docker image each time, start the stack with a bind-mounted QA Lab bundle:
bashpnpm openclaw qa docker-build-image pnpm qa:lab:build pnpm qa:lab:up:fast pnpm qa:lab:watch
qa:lab:up:fastextensions/qa-lab/web/distqa-labqa:lab:watchFor a local OpenTelemetry trace smoke, run:
bashpnpm qa:otel:smoke
That script starts a local OTLP/HTTP trace receiver, runs the
otel-trace-smokediagnostics-otelopenclaw.runopenclaw.harness.runopenclaw.model.callopenclaw.context.assembledopenclaw.message.deliveryStreamAbandonedopenclaw.content.*otel-smoke-summary.jsonObservability QA stays source-checkout only. The npm tarball intentionally omits QA Lab, so package Docker release lanes do not run
qapnpm qa:otel:smokeFor a transport-real Matrix smoke lane, run:
bashpnpm openclaw qa matrix --profile fast --fail-fast
The full CLI reference, profile/scenario catalog, env vars, and artifact layout for this lane live in Matrix QA. At a glance: it provisions a disposable Tuwunel homeserver in Docker, registers temporary driver/SUT/observer users, runs the real Matrix plugin inside a child QA gateway scoped to that transport (no
qa-channel.artifacts/qa-e2e/matrix-<timestamp>/For transport-real Telegram and Discord smoke lanes:
bashpnpm openclaw qa telegram pnpm openclaw qa discord
Both target a pre-existing real channel with two bots (driver + SUT). Required env vars, scenario lists, output artifacts, and the Convex credential pool are documented in Telegram and Discord QA reference below.
Before using pooled live credentials, run:
bashpnpm openclaw qa credentials doctor
The doctor checks Convex broker env, validates endpoint settings, and verifies admin/list reachability when the maintainer secret is present. It reports only set/missing status for secrets.
Live transport lanes share one contract instead of each inventing their own scenario list shape.
qa-channel| Lane | Canary | Mention gating | Bot-to-bot | Allowlist block | Top-level reply | Restart resume | Thread follow-up | Thread isolation | Reaction observation | Help command | Native command registration |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Matrix | x | x | x | x | x | x | x | x | x | ||
| Telegram | x | x | x | x | |||||||
| Discord | x | x | x | x |
This keeps
qa-channelFor a disposable Linux VM lane without bringing Docker into the QA path, run:
bashpnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline
This boots a fresh Multipass guest, installs dependencies, builds OpenClaw inside the guest, runs
qa suite.artifacts/qa-e2e/...qa suiteqa-channel--concurrency <count>--concurrency 1--allow-failuresCODEX_HOME--output-dirMatrix has a dedicated page because of its scenario count and Docker-backed homeserver provisioning. Telegram and Discord are smaller — a handful of scenarios each, no profile system, against pre-existing real channels — so their reference lives here.
Both lanes register through
extensions/qa-lab/src/live-transports/shared/live-transport-cli.ts| Flag | Default | Description |
|---|---|---|
text --scenario <id> | — | Run only this scenario. Repeatable. |
text --output-dir <path> | text <repo>/.artifacts/qa-e2e/{telegram,discord}-<timestamp> | Where reports/summary/observed messages and the output log are written. Relative paths resolve against text --repo-root |
text --repo-root <path> | text process.cwd() | Repository root when invoking from a neutral cwd. |
text --sut-account <id> | text sut | Temporary account id inside the QA gateway config. |
text --provider-mode <mode> | text live-frontier | text mock-openaitext live-frontiertext live-openai |
text --model <ref>text --alt-model <ref> | provider default | Primary/alternate model refs. |
text --fast | off | Provider fast mode where supported. |
text --credential-source <env|convex> | text env | See Convex credential pool. |
text --credential-role <maintainer|ci> | text citext maintainer | Role used when text --credential-source convex |
Both exit non-zero on any failed scenario.
--allow-failuresbashpnpm openclaw qa telegram
Targets one real private Telegram group with two distinct bots (driver + SUT). The SUT bot must have a Telegram username; bot-to-bot observation works best when both bots have Bot-to-Bot Communication Mode enabled in
@BotFatherRequired env when
--credential-source envOPENCLAW_QA_TELEGRAM_GROUP_IDOPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKENOPENCLAW_QA_TELEGRAM_SUT_BOT_TOKENOptional:
OPENCLAW_QA_TELEGRAM_CAPTURE_CONTENT=1Scenarios (
extensions/qa-lab/src/live-transports/telegram/telegram-live.runtime.ts:44telegram-canarytelegram-mention-gatingtelegram-mentioned-message-replytelegram-help-commandtelegram-commands-commandtelegram-tools-compact-commandtelegram-whoami-commandtelegram-context-commandOutput artifacts:
telegram-qa-report.mdtelegram-qa-summary.jsontelegram-qa-observed-messages.jsonOPENCLAW_QA_TELEGRAM_CAPTURE_CONTENT=1bashpnpm openclaw qa discord
Targets one real private Discord guild channel with two bots: a driver bot controlled by the harness and a SUT bot started by the child OpenClaw gateway through the bundled Discord plugin. Verifies channel mention handling and that the SUT bot has registered the native
/helpRequired env when
--credential-source envOPENCLAW_QA_DISCORD_GUILD_IDOPENCLAW_QA_DISCORD_CHANNEL_IDOPENCLAW_QA_DISCORD_DRIVER_BOT_TOKENOPENCLAW_QA_DISCORD_SUT_BOT_TOKENOPENCLAW_QA_DISCORD_SUT_APPLICATION_IDOptional:
OPENCLAW_QA_DISCORD_CAPTURE_CONTENT=1Scenarios (
extensions/qa-lab/src/live-transports/discord/discord-live.runtime.ts:36discord-canarydiscord-mention-gatingdiscord-native-help-command-registrationOutput artifacts:
discord-qa-report.mddiscord-qa-summary.jsondiscord-qa-observed-messages.jsonOPENCLAW_QA_DISCORD_CAPTURE_CONTENT=1Both Telegram and Discord lanes can lease credentials from a shared Convex pool instead of reading the env vars above. Pass
--credential-source convexOPENCLAW_QA_CREDENTIAL_SOURCE=convex"telegram""discord"Payload shapes the broker validates on
admin/addkind: "telegram"{ groupId: string, driverToken: string, sutToken: string }groupIdkind: "discord"{ guildId: string, channelId: string, driverBotToken: string, sutBotToken: string, sutApplicationId: string }Operational env vars and the Convex broker endpoint contract live in Testing → Shared Telegram credentials via Convex (the section name predates Discord support; the broker semantics are identical for both kinds).
Seed assets live in
qa/qa/scenarios/index.mdqa/scenarios/<theme>/*.mdThese are intentionally in git so the QA plan is visible to both humans and the agent.
qa-labqa-flowThe reusable runtime surface that backs
qa-flowbrowser.requestScenario files should be grouped by product capability rather than source tree folder. Keep scenario IDs stable when files move; use
docsRefscodeRefsThe baseline list should stay broad enough to cover:
qa suitemock-openaiaimockmock-openaiProvider-lane implementation lives under
extensions/qa-lab/src/providers/qa-labqa-channelAt the architecture level, the split is:
qa-labqa/scenarios/qa-labAdding a channel to the markdown QA system requires exactly two things:
Do not add a new top-level QA command root when the shared
qa-labqa-labopenclaw qaqa-channelRunner plugins own the transport contract:
openclaw qa <runner>qaThe minimum adoption bar for a new channel:
qa-labqaqa-labopenclaw qa <runner>qaRunnersopenclaw.plugin.jsonqaRunnerCliRegistrationsruntime-api.tsruntime-api.tsqa/scenarios/The decision rule is strict:
qa-labqa-labsuite.tsPreferred generic helpers for new scenarios:
waitForTransportReadywaitForChannelReadyinjectInboundMessageinjectOutboundMessagewaitForTransportOutboundMessagewaitForChannelOutboundMessagewaitForNoTransportOutboundgetTransportSnapshotreadTransportMessagereadTransportTranscriptformatTransportTranscriptresetTransportCompatibility aliases remain available for existing scenarios —
waitForQaChannelReadywaitForOutboundMessagewaitForNoOutboundformatConversationTranscriptresetBusqa-labFor the inventory of available scenarios — useful when sizing follow-up work or wiring a new transport — run
pnpm openclaw qa coverage--jsonFor character and style checks, run the same scenario across multiple live model refs and write a judged Markdown report:
bashpnpm openclaw qa character-eval \ --model openai/gpt-5.5,thinking=medium,fast \ --model openai/gpt-5.2,thinking=xhigh \ --model openai/gpt-5,thinking=xhigh \ --model anthropic/claude-opus-4-6,thinking=high \ --model anthropic/claude-sonnet-4-6,thinking=high \ --model zai/glm-5.1,thinking=high \ --model moonshot/kimi-k2.5,thinking=high \ --model google/gemini-3.1-pro-preview,thinking=high \ --judge-model openai/gpt-5.5,thinking=xhigh,fast \ --judge-model anthropic/claude-opus-4-6,thinking=high \ --blind-judge-models \ --concurrency 16 \ --judge-concurrency 16
The command runs local QA gateway child processes, not Docker. Character eval scenarios should set the persona through
SOUL.mdxhigh--blind-judge-modelscandidate-01highmediumxhigh--model provider/model,thinking=<level>--thinking <level>--model-thinking <provider/model=level>,fast,no-fast,fast=false--fast--concurrency--judge-concurrency--modelopenai/gpt-5.5openai/gpt-5.2openai/gpt-5anthropic/claude-opus-4-6anthropic/claude-sonnet-4-6zai/glm-5.1moonshot/kimi-k2.5google/gemini-3.1-pro-preview--model--judge-modelopenai/gpt-5.5,thinking=xhigh,fastanthropic/claude-opus-4-6,thinking=high© 2024 TaskFlow Mirror
Powered by TaskFlow Sync Engine