QA Channel: Synthetic Slack-Class Transport for OpenClaw Testing
Learn about the qa-channel plugin, a repository-local synthetic message transport for deterministic OpenClaw QA scenarios. It tests channel plugin boundaries with full inspectability.
Read this when
- You are wiring the synthetic QA transport into a local or CI test run
- You need the bundled qa-channel config surface
- You are iterating on end-to-end QA automation
qa-channel functions as a repository-local synthetic message transport intended for automated OpenClaw QA (extensions/qa-channel, a private package that is not part of packaged installs). Rather than serving as a production channel, it is designed to test the same channel plugin boundary that real transports use, while ensuring deterministic state and full inspectability.
What it does
- Slack-class target grammar:
dm:<user>channel:<room>group:<room>thread:<room>/<thread>
- Conversations shared via
channel:andgroup:appear to agents as group or channel room turns, meaning they follow the same visible-reply and message-tool routing policy applied by Discord, Slack, Telegram, and comparable transports. - An HTTP-backed synthetic bus handles inbound message injection, outbound transcript capture, thread creation, reactions, edits, deletes, and search or read actions.
- Streamed replies that carry media deliver attachments along with the current tool trace. A later identical text-only final is suppressed only when both its caption and tool trace were already delivered successfully.
- A host-side self-check runner produces a Markdown report written to
.artifacts/qa-e2e/.
Config
{
"channels": {
"qa-channel": {
"baseUrl": "http://127.0.0.1:43123",
"botUserId": "openclaw",
"botDisplayName": "OpenClaw QA",
"allowFrom": ["*"],
"pollTimeoutMs": 1000
}
}
}
Account keys:
enabled- master toggle for this account.name- optional display label.responsePrefix- automatic reply prefix; account overrides win. Accepts a literal,"auto"for the agent identity name, a template such as"[{model}]", or""to disable an inherited prefix.baseUrl- synthetic bus URL. The account counts as configured once this is set.botUserId- synthetic bot user id used in target grammar (default:openclaw).botDisplayName- display name for outbound messages (default:OpenClaw QA).pollTimeoutMs- long-poll wait window. Integer between 100 and 30000 (default: 1000).mediaMaxMb- per-attachment limit in MiB for inbound bytes and outbound files. Named accounts override the channel root, thenagents.defaults.mediaMaxMbsupplies the fallback. If none is set, existing media-store and loader defaults apply. An oversized inbound attachment becomes an unavailable-attachment notice for the model. The channel loads each outbound batch before publishing it, so a failed attachment prevents that batch from being sent. Shared reply preparation can first remove oversized local files and retain valid attachments with a warning.allowFrom- sender allowlist (user ids or"*"; default:["*"]). DMs are alwaysopenpolicy; allowlisted group policy also uses these synthetic sender ids.groupPolicy- shared-room policy:"open"(default),"allowlist", or"disabled".groupAllowFrom- optional shared-room sender allowlist. When omitted under"allowlist", QA Channel falls back toallowFrom.groups.<room>.requireMention- require a bot mention before replying in a specific group/channel room (default: false).groups."*"sets the default; per-roomtools/toolsBySenderset tool policy overrides.defaultTo- fallback target when none is supplied.actions.messages/actions.reactions/actions.search/actions.threads- per-action tool gating.
Multi-account keys at the top level:
accounts- record of named per-account overrides keyed by account id.defaultAccount- preferred account id when multiple are configured.
Runners
Host-side self-check (writes a Markdown report under .artifacts/qa-e2e/):
pnpm qa:e2e
This routes through qa-lab, starts the in-repo QA bus, boots the qa-channel runtime slice, and runs a deterministic self-check.
Full repo-backed scenario suite:
pnpm openclaw qa suite
The isolated channel-participant-identity-inspection scenario enables
execution identity before startup, exercises DM, group, senderless, same- and
mixed-participant collect paths, proves an ingress rejection creates no audit
rows, and compares JSON plus human CLI inspection across Gateway restart:
pnpm openclaw qa suite --scenario channel-participant-identity-inspection
Runs scenarios in parallel against the QA gateway lane. See QA overview for scenarios, profiles, and provider modes.
Docker-backed QA site (gateway + QA Lab debugger UI in one stack):
pnpm qa:lab:up
Builds the QA site, starts the Docker-backed gateway + QA Lab stack, and prints the QA Lab URL. From there you can pick scenarios, choose the model lane, launch individual runs, and watch results live. The QA Lab debugger is separate from the shipped Control UI bundle.
Related
- QA overview: the complete toolchain, transport adapters, the Matrix live lane, and how scenarios are written
- Pairing
- Groups
- Channels overview