Files
openclaw/docs/channels/qa-channel.md
Dallin Romney ad34552473 refactor(qa): migrate Matrix scenarios into QA Lab (#103589)
* refactor(qa): migrate Matrix scenarios into QA Lab

* fix(qa): build Matrix boundary declarations

* fix(qa): preserve Matrix preview boundaries

* fix(qa): preserve Matrix hot reload semantics

* fix(qa): harden Matrix destructive scenario failures

* fix(qa): harden Matrix scenario isolation

* fix(qa): close Matrix negative scenario blind spots

* fix(qa): isolate Matrix substrate state

* fix(qa): harden Matrix transport substrate

* fix(qa): preserve Matrix profile and event parity

* fix(qa): preserve explicit scenario models

* fix(qa): align Matrix scenario coverage taxonomy

* fix(qa): format Matrix allowlist cleanup

* fix(qa): satisfy migrated Matrix CI contracts

* fix(qa): reconcile Matrix migration with current main

* fix(qa): break scenario flow import cycle

* fix(qa): reconcile Matrix max-lines ownership

* fix(qa): address Matrix review boundaries

* fix(qa): remove stale Matrix lint suppression

* fix(qa): adopt split Matrix E2EE flows

* fix(qa): export Matrix scenario record guard

* fix(qa): align Matrix migration with privatized helpers

* refactor(qa): finish Matrix QA Lab ownership

* fix(qa): preserve Matrix suite defaults

* fix(qa): reconcile Matrix cleanup with current main

* test(qa): follow canonical Matrix profile size

* fix(qa): guard stale Matrix QA package output

* docs(qa): redirect retired Matrix QA pages

* refactor(qa): finish Matrix runner rename

* test(qa): assert Matrix defaults through profile resolver

* docs: refresh QA cleanup map

* fix(qa): privatize Matrix storage discovery
2026-07-15 01:22:20 -07:00

3.8 KiB

summary, title, read_when
summary title read_when
Synthetic Slack-class channel plugin for deterministic OpenClaw QA scenarios QA channel
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 is a repo-local synthetic message transport for automated OpenClaw QA (extensions/qa-channel, private package, excluded from packaged installs). It is not a production channel - it exists to exercise the same channel plugin boundary used by real transports while keeping state deterministic and fully inspectable.

What it does

  • Slack-class target grammar:
    • dm:<user>
    • channel:<room>
    • group:<room>
    • thread:<room>/<thread>
  • Shared channel: and group: conversations are surfaced to agents as group/channel room turns, so they exercise the same visible-reply and message-tool routing policy used by Discord, Slack, Telegram, and similar transports.
  • HTTP-backed synthetic bus for inbound message injection, outbound transcript capture, thread creation, reactions, edits, deletes, and search/read actions.
  • Host-side self-check runner that writes a Markdown report 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.
  • 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).
  • allowFrom - sender allowlist (user ids or "*"; default: ["*"]). DMs are always open policy; 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 to allowFrom.
  • groups.<room>.requireMention - require a bot mention before replying in a specific group/channel room (default: false). groups."*" sets the default; per-room tools / toolsBySender set 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

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.