Buzz, Discord, Slack, Telegram, and WhatsApp QA reference
The Matrix adapter uses the disposable Docker-backed lane documented in Matrix live lane. Buzz, Discord, Slack, Telegram, and WhatsApp run against pre-existing real transports, so their reference lives here.Shared CLI flags
These lanes register through the shared QA runner CLI contract. Transport plugins may own the registration while QA Lab remains the suite host. They accept the same flags:
Telegram fixes
--credential-source to convex. Its Test Server userbot
credential cannot be supplied through the shared environment credential mode.
Each lane exits non-zero on any failed scenario. --allow-failures writes
artifacts without setting a failing exit code. Telegram also accepts
--list-scenarios to print available scenario ids and exit; the other lanes
do not expose that flag.
Buzz QA
mock-openai provider proves the real Buzz transport without requiring
a model-provider credential.
Local runs use --credential-file <path> with a private JSON file containing
relayUrl, roomId, driverPrivateKey, and sutPrivateKey. Closed relays may
also need driverAuthTag and sutAuthTag. Relative paths resolve from
--repo-root. Hosted relays must use wss://; plaintext ws:// is accepted
only for loopback development relays.
Both identities must be members of the dedicated room, and the SUT public key
must have the Bot role. A hosted closed relay may also require both public
keys to be enrolled as relay members. Use dedicated QA identities only; never
use a human owner or admin private key. Keep all private keys and authorization
values out of logs, command lines, artifacts, screenshots, and source control.
The default scenarios are:
channel-canarychannel-mention-gating
qa-suite-report.md, qa-suite-summary.json, and
qa-evidence.json under the selected output directory. The report identifies
the real Buzz relay path but omits credential values.
Telegram QA
@openclaw, which the adapter replaces
with the leased bot username. Native commands are addressed to that same bot.
Required env:
OPENCLAW_QA_CONVEX_SITE_URLOPENCLAW_QA_CONVEX_SECRET_MAINTAINERfor the default local role, orOPENCLAW_QA_CONVEX_SECRET_CIwith--credential-role ci
--credential-source defaults to convex; env is rejected. The lease owns
the Test Server group, SUT token, and restored TDLib session. The lane does not
use production Telegram credentials or Bot-to-Bot Communication Mode.
The release profile selects taxonomy-owned Telegram scenarios that declare
the channel, use the flow execution kind, and match the requested provider and
model lane. Explicit --scenario values narrow that same selection instead of
bypassing its constraints. Use pnpm openclaw qa telegram --list-scenarios --provider-mode mock-openai to print the current selection with regression
refs. Supplying --model applies the same model constraint to listing and
execution.
telegram-startup-getme-live is a catalog script producer, not a live-adapter
flow. Run it through qa suite --scenario telegram-startup-getme-live; the
dedicated qa telegram command and --list-scenarios intentionally omit it.
Output artifacts:
qa-suite-report.mdqa-suite-summary.jsonqa-evidence.json- evidence entries for the live transport checks, including profile, coverage, provider, channel, artifacts, result, and RTT fields.
qa-evidence.json under result.timing for the
selected RTT check.
kind: "telegram-test-userbot" credential,
restores its isolated TDLib user session, and routes the SUT bot through the
Test Bot API proxy. It heartbeats the lease and releases it on shutdown. The
package wrapper defaults to 20 RTT checks of channel-canary, a 30s RTT
timeout, and Convex role maintainer outside CI. Override
OPENCLAW_NPM_TELEGRAM_RTT_SAMPLES, OPENCLAW_NPM_TELEGRAM_RTT_TIMEOUT_MS,
or OPENCLAW_NPM_TELEGRAM_RTT_MAX_FAILURES to tune RTT measurement without
creating a separate RTT command or Telegram-specific summary format.
Discord QA
/help command with Discord, and
opt-in Mantis evidence scenarios.
Required env when --credential-source env:
OPENCLAW_QA_DISCORD_GUILD_IDOPENCLAW_QA_DISCORD_CHANNEL_IDOPENCLAW_QA_DISCORD_DRIVER_BOT_TOKENOPENCLAW_QA_DISCORD_SUT_BOT_TOKENOPENCLAW_QA_DISCORD_SUT_APPLICATION_ID- must match the SUT bot user id returned by Discord (the lane fails fast otherwise).
OPENCLAW_QA_DISCORD_VOICE_CHANNEL_IDselects the voice/stage channel fordiscord-voice-autojoin; without it, the scenario picks the first visible voice/stage channel for the SUT bot. It is required fordiscord-transcripts-voice-authorizationwhen using env credentials.
qa/scenarios/channels/discord-*.yaml):
discord-canarydiscord-mention-gatingdiscord-native-help-command-registrationdiscord-progress-draft-lifecycle- runs a deterministic tool turn, verifies the final answer has no synthesized activity receipt, confirms the working draft is deleted after a successful final, and confirms an error final keeps its draft visible as diagnostic context.discord-voice-autojoin- opt-in voice scenario. Runs by itself, enableschannels.discord.voice.autoJoin, and verifies the SUT bot’s current Discord voice state is the target voice/stage channel. Convex Discord credentials may include optionalvoiceChannelId; otherwise the runner adapter discovers the first visible voice/stage channel in the guild.discord-transcripts-voice-authorization- opt-in live-model scenario. A real driver-bot message first proves a sender excluded from the target voice channel receives a visible transcript-tool denial without a join. The same sender is then allowlisted and must start, stop, and leave live capture. The scenario writes redacted JSON evidence and deletes its known Discord messages during cleanup. It requires an explicitvoiceChannelIdin the leased credential orOPENCLAW_QA_DISCORD_VOICE_CHANNEL_ID; it never discovers a room automatically. The operator must reserve a dedicated empty QA voice channel before running it. An explicit ID does not prove that prerequisite: the harness observes the SUT bot’s connection, not the room’s full membership.discord-status-reactions-tool-only- opt-in Mantis scenario. Runs by itself because it switches the SUT to always-on, tool-only guild replies withmessages.statusReactions.enabled=true, then captures a REST reaction timeline plus HTML/PNG visual artifacts. Mantis before/after reports also preserve scenario-provided MP4 artifacts asbaseline.mp4andcandidate.mp4.discord-thread-reply-filepath-attachment- opt-in Mantis scenario; see Discord Mantis scenarios.
voiceChannelId:
qa-suite-report.mdqa-suite-summary.jsonqa-evidence.json- evidence entries for the live transport checks.discord-qa-reaction-timelines.jsonanddiscord-status-reactions-tool-only-timeline.pngwhen the status-reaction scenario runs.