Fundamentals
Visão geral de QA
A pilha privada de QA exercita o OpenClaw de uma maneira realista, estruturada como um canal, que um teste unitário não consegue reproduzir.
Componentes:
extensions/qa-channel: canal de mensagens sintético com superfícies de DM, canal, thread, reação, edição e exclusão.extensions/qa-lab: interface de depuração e barramento de QA para observar a transcrição, injetar mensagens recebidas e exportar um relatório em Markdown.extensions/qa-matrix: adaptador de transporte em produção que aciona o Plugin Matrix real dentro de um gateway de QA filho.qa/: ativos iniciais armazenados no repositório para a tarefa de kickoff e cenários de QA de referência.- Mantis: verificação em produção de antes/depois para bugs que exigem transportes reais, capturas de tela do navegador, estado da VM e evidências do PR.
Superfície de comandos
Todo fluxo de QA é executado em pnpm openclaw qa <subcommand>. Muitos têm aliases de script
pnpm qa:*; ambas as formas funcionam.
| Comando | Finalidade |
|---|---|
qa run |
Autoverificação de QA integrada sem --qa-profile; executor de perfil de maturidade baseado em taxonomia com --qa-profile smoke-ci, --qa-profile release ou --qa-profile all. |
qa suite |
Executa cenários armazenados no repositório na via do gateway de QA. --runner multipass usa uma VM Linux descartável em vez do host. |
qa coverage |
Exibe o inventário YAML de cobertura de cenários (--json para saída legível por máquina; --match <query> para encontrar cenários de um comportamento alterado; --tools para cobertura de fixtures de ferramentas do runtime). |
qa parity-report |
Compara dois arquivos qa-suite-summary.json para um gate de paridade no eixo de modelos ou usa --runtime-axis --token-efficiency para gerar relatórios de paridade de runtime entre Codex e OpenClaw e de eficiência de tokens. |
qa confidence-report |
Classifica artefatos de comprovação de QA em relação a um manifesto, gerando um relatório de confiança sem itens desconhecidos. |
qa confidence-self-test |
Grava canários de controle negativo com dados iniciais que comprovam que o gate de confiança detecta desvios. |
qa jsonl-replay |
Reproduz transcrições JSONL selecionadas por meio do harness de reprodução de paridade de runtime. |
qa character-eval |
Executa o cenário de QA de personagem em vários modelos em produção, com um relatório avaliado. Consulte Relatórios. |
qa manual |
Executa um prompt avulso na via de provedor/modelo selecionada. |
qa ui |
Inicia a interface de depuração de QA e o barramento local de QA (alias: pnpm qa:lab:ui). |
qa docker-build-image |
Compila a imagem Docker de QA pré-criada. |
qa docker-scaffold |
Grava uma estrutura docker-compose para a via do painel de QA + gateway. |
qa up |
Compila o site de QA, inicia a pilha baseada em Docker e exibe a URL (alias: pnpm qa:lab:up; a variante :fast adiciona --use-prebuilt-image --bind-ui-dist --skip-ui-build). |
qa aimock |
Inicia apenas o servidor do provedor AIMock. |
qa mock-openai |
Inicia apenas o servidor do provedor mock-openai, que reconhece cenários. |
qa credentials doctor / add / list / remove |
Gerencia o pool compartilhado de credenciais do Convex. |
qa discord |
Via de transporte em produção em um canal real de um servidor privado do Discord. |
qa matrix |
Via de transporte em produção em um homeserver Tuwunel descartável. Consulte QA do Matrix. |
qa slack |
Via de transporte em produção em um canal privado real do Slack. |
qa telegram |
Via de transporte em produção em um grupo privado real do Telegram. |
qa whatsapp |
Via de transporte em produção em contas reais do WhatsApp Web. |
qa mantis |
Executor de verificação de antes/depois para bugs de transporte em produção, com evidências de reações de status no Discord, smoke test de desktop/navegador no Crabbox e smoke test do Slack no VNC. Consulte Mantis e Runbook do Mantis para o Slack Desktop. |
qa matrix é registrado como um plugin de executor (extensions/qa-matrix);
todas as outras faixas acima são integradas diretamente ao qa-lab.
qa run baseado em perfil
O qa run baseado em perfil lê a associação em taxonomy.yaml e, em seguida,
despacha os cenários resolvidos por meio de qa suite. --surface e
--category filtram o perfil selecionado, em vez de definir faixas separadas.
O qa-evidence.json resultante inclui um resumo do quadro de pontuação do perfil
com contagens das categorias selecionadas e IDs de cobertura ausentes; as
entradas individuais de evidências continuam sendo a fonte da verdade para os
testes, as funções de cobertura e os resultados. Os IDs de cobertura de recursos
da taxonomia são alvos exatos de comprovação, não aliases: a cobertura do cenário
primário satisfaz os IDs correspondentes, enquanto a cobertura secundária
permanece apenas consultiva. Os IDs de cobertura usam o formato pontilhado
namespace.behavior, com segmentos alfanuméricos em minúsculas ou com hífens;
os IDs de perfil, superfície e categoria ainda podem usar os IDs de taxonomia
existentes com hífens ou pontos.
Evidências compactas omitem o campo execution de cada entrada e definem evidenceMode: "slim";
smoke-ci usa o modo compacto por padrão, e --evidence-mode full restaura as entradas completas:
pnpm openclaw qa run \ --qa-profile smoke-ci \ --category channel-framework.conversation-routing-and-delivery \ --provider-mode mock-openai \ --output-dir .artifacts/qa-e2e/smoke-ci-profile-dispatchUse smoke-ci para obter provas determinísticas de perfil com provedores de modelo simulados e
servidores locais de provedor Crabline. Use release para provas de versão estável/LTS em
canais ativos. Use all somente para execuções explícitas de evidências da taxonomia completa; ele
seleciona todas as categorias de maturidade ativas e pode ser acionado pelo fluxo de trabalho QA Profile Evidence do GitHub Actions com qa_profile=all. Quando um
comando também precisar de um perfil raiz do OpenClaw, coloque o perfil raiz antes do
comando de QA:
pnpm openclaw --profile work qa run --qa-profile smoke-ciFluxo do operador
O fluxo atual do operador de QA é um site de QA com dois painéis:
- À esquerda: painel do Gateway (UI de controle) com o agente.
- À direita: QA Lab, mostrando a transcrição no estilo do Slack e o plano do cenário.
Execute-o com:
pnpm qa:lab:upIsso compila o site de QA, inicia a faixa do Gateway baseada em Docker e disponibiliza a página do QA Lab, onde um operador ou loop de automação pode atribuir ao agente uma missão de QA, observar o comportamento real do canal e registrar o que funcionou, falhou ou permaneceu bloqueado.
Para iterar mais rapidamente na UI do QA Lab sem recompilar a imagem do Docker a cada vez, inicie a pilha com um pacote do QA Lab montado por bind:
pnpm openclaw qa docker-build-imagepnpm qa:lab:buildpnpm qa:lab:up:fastpnpm qa:lab:watchqa:lab:up:fast mantém os serviços do Docker em uma imagem pré-compilada e
monta por bind extensions/qa-lab/web/dist no contêiner qa-lab.
qa:lab:watch recompila esse pacote quando há alterações, e o navegador recarrega
automaticamente quando o hash dos ativos do QA Lab muda.
Testes rápidos de observabilidade
| Alias | O que executa |
|---|---|
pnpm qa:otel:smoke |
Receptor OpenTelemetry local mais o cenário otel-trace-smoke com diagnostics-otel habilitado. |
pnpm qa:otel:collector-smoke |
A mesma via por trás de um contêiner Docker real do OpenTelemetry Collector. Use-a ao alterar a conexão de endpoints ou a compatibilidade com Collector/OTLP. |
pnpm qa:prometheus:smoke |
O cenário docker-prometheus-smoke com diagnostics-prometheus habilitado. |
pnpm qa:observability:smoke |
qa:otel:smoke seguido de qa:prometheus:smoke. |
pnpm qa:observability:collector-smoke |
qa:otel:collector-smoke seguido de qa:prometheus:smoke. |
qa:otel:smoke inicia um receptor OTLP/HTTP local, executa um turno mínimo do
agente do canal de QA e, em seguida, verifica se traces, métricas e logs são
exportados. Ele decodifica os spans de trace protobuf exportados e verifica o
formato crítico para a versão: openclaw.run, openclaw.harness.run, um span
de chamada de modelo da convenção semântica GenAI mais recente,
openclaw.context.assembled e openclaw.message.delivery devem estar
presentes. O smoke força
OTEL_SEMCONV_STABILITY_OPT_IN=gen_ai_latest_experimental, portanto o span de
chamada de modelo deve usar o nome {gen_ai.operation.name} {gen_ai.request.model};
as chamadas de modelo não devem exportar StreamAbandoned em turnos
bem-sucedidos; IDs de diagnóstico brutos e atributos openclaw.content.* não
devem aparecer no trace. O prompt do cenário solicita que o modelo responda
com um marcador fixo e omita uma string secreta fixa; os payloads OTLP brutos
não devem conter nenhum dos dois, nem a chave da sessão de QA derivada do ID do
cenário. Ele grava otel-smoke-summary.json ao lado dos artefatos da suíte de
QA.
qa:prometheus:smoke verifica se scrapes não autenticados são rejeitados e,
em seguida, confirma que o scrape autenticado inclui famílias de métricas
críticas para a versão sem conteúdo do prompt, conteúdo da resposta,
identificadores de diagnóstico brutos, tokens de autenticação ou caminhos
locais.
Vias de smoke do Matrix
Para uma via de smoke do Matrix com transporte real que não exija credenciais do provedor de modelo, execute o perfil rápido com o provedor OpenAI simulado e determinístico:
OPENCLAW_QA_MATRIX_NO_REPLY_WINDOW_MS=3000 \ pnpm openclaw qa matrix --provider-mode mock-openai --profile fast --fail-fastPara a via do provedor live-frontier, forneça explicitamente credenciais compatíveis com a OpenAI:
OPENCLAW_LIVE_OPENAI_KEY="${OPENAI_API_KEY}" \OPENCLAW_QA_MATRIX_NO_REPLY_WINDOW_MS=3000 \ pnpm openclaw qa matrix --provider-mode live-frontier --profile fast --fail-fastA referência completa da CLI, o catálogo de perfis/cenários, as variáveis de
ambiente e a organização dos artefatos dessa via estão em
QA do Matrix. Em resumo: ela provisiona um homeserver
Tuwunel descartável no Docker, registra usuários temporários de
driver/SUT/observador, executa o Plugin real do Matrix dentro de um gateway
filho de QA com escopo limitado a esse transporte (sem qa-channel) e, em
seguida, grava um relatório em Markdown, um resumo JSON, um artefato de eventos
observados e um log de saída combinado em
.artifacts/qa-e2e/matrix-<timestamp>/.
Os cenários abrangem comportamentos de transporte que testes unitários não
conseguem comprovar de ponta a ponta: bloqueio por menção, políticas para
permitir bots, listas de permissões, respostas de nível superior e em threads,
roteamento de mensagens diretas, tratamento de reações, supressão de edições
recebidas, eliminação de duplicações na repetição após reinicialização,
recuperação de interrupções do homeserver, entrega de metadados de aprovação,
tratamento de mídia e fluxos de inicialização/recuperação/verificação de E2EE
do Matrix. O perfil E2EE da CLI também executa openclaw matrix encryption setup
e comandos de verificação no mesmo homeserver descartável antes de verificar
as respostas do gateway.
A CI usa a mesma superfície de comandos em
.github/workflows/qa-live-transports-convex.yml. As execuções agendadas e as
execuções manuais padrão usam o perfil rápido do Matrix com credenciais
live-frontier fornecidas pelo QA, --fast e
OPENCLAW_QA_MATRIX_NO_REPLY_WINDOW_MS=3000. A execução manual com
matrix_profile=all distribui o trabalho em cinco shards de perfil:
transport, media, e2ee-smoke, e2ee-deep e e2ee-cli.
Cenários Mantis do Discord
O Discord também tem cenários opcionais exclusivos do Mantis para reprodução
de bugs. Use --scenario discord-status-reactions-tool-only para a linha do
tempo explícita de reações de status ou
--scenario discord-thread-reply-filepath-attachment para criar uma thread
real do Discord e verificar se message.thread-reply preserva um anexo
filePath. Esses cenários ficam fora da via padrão do Discord em ambiente
real porque são sondas de reprodução de antes/depois, e não uma cobertura
ampla de smoke. O fluxo de trabalho Mantis para anexos em threads também pode
adicionar um vídeo de testemunho do Discord Web com uma sessão iniciada quando
MANTIS_DISCORD_VIEWER_CHROME_PROFILE_DIR ou
MANTIS_DISCORD_VIEWER_CHROME_PROFILE_TGZ_B64 está configurado no ambiente de
QA. Esse perfil de visualização serve apenas para captura visual; a decisão de
aprovação/reprovação ainda vem do oráculo REST do Discord.
Para vias de smoke com transporte real do Discord, Slack, Telegram e WhatsApp:
pnpm openclaw qa discordpnpm openclaw qa slackpnpm openclaw qa telegrampnpm openclaw qa whatsappElas usam como destino um canal real preexistente com dois bots ou contas (driver + SUT). As variáveis de ambiente obrigatórias, as listas de cenários, os artefatos de saída e o pool de credenciais do Convex estão documentados na referência de QA do Discord, Slack, Telegram e WhatsApp abaixo.
Executores de tarefas visuais e do aplicativo Slack para desktop do Mantis
Para uma execução completa da VM do Slack para desktop com recuperação por VNC, execute:
pnpm openclaw qa mantis slack-desktop-smoke \ --gateway-setup \ --scenario slack-canary \ --keep-leaseEsse comando obtém uma máquina Crabbox com desktop/navegador, executa a
rotina ativa do Slack dentro da VM, abre o Slack Web no navegador VNC, captura
a área de trabalho e copia slack-qa/, slack-desktop-smoke.png e
slack-desktop-smoke.mp4 (quando a captura de vídeo está disponível) de volta
para o diretório de artefatos do Mantis. As concessões de desktop/navegador do
Crabbox fornecem antecipadamente as ferramentas de captura e os pacotes
auxiliares de navegador/compilação nativa, portanto o cenário deve instalar
alternativas somente em concessões mais antigas. O Mantis informa os tempos
totais e por fase em mantis-slack-desktop-smoke-report.md, para que execuções
lentas mostrem se o tempo foi gasto no aquecimento da concessão, na obtenção
de credenciais, na configuração remota ou na cópia de artefatos. Reutilize
--lease-id <cbx_...> depois de entrar manualmente no Slack Web por VNC; as
concessões reutilizadas também mantêm aquecido o cache do armazenamento pnpm
do Crabbox. O padrão --hydrate-mode source faz a verificação a partir de um
checkout do código-fonte e executa a instalação/compilação dentro da VM. Use
--hydrate-mode prehydrated somente quando o espaço de trabalho remoto
reutilizado já tiver node_modules e um dist/ compilado; esse modo ignora a
etapa onerosa de instalação/compilação e encerra de forma segura com falha
quando o espaço de trabalho não está pronto. Com --gateway-setup, o Mantis
deixa um gateway persistente do OpenClaw para Slack em execução dentro da VM
na porta 38973; sem essa opção, o comando executa a rotina normal de QA do
Slack entre bots e sai após a captura dos artefatos.
Para comprovar a interface nativa de aprovação do Slack com evidências da área de trabalho, execute o modo de pontos de verificação de aprovação do Mantis:
pnpm openclaw qa mantis slack-desktop-smoke \ --approval-checkpoints \ --credential-source convex \ --credential-role maintainerEsse modo é mutuamente exclusivo com --gateway-setup. Ele executa os
cenários de aprovação do Slack, rejeita IDs de cenários que não sejam de
aprovação, aguarda cada estado de aprovação pendente e resolvido, renderiza a
mensagem observada da API do Slack em
approval-checkpoints/<scenario>-pending.png e
approval-checkpoints/<scenario>-resolved.png e, em seguida, falha se algum
ponto de verificação, evidência da mensagem, confirmação ou captura de tela
renderizada estiver ausente ou vazio. Concessões frias de CI ainda podem
mostrar a tela de entrada do Slack em slack-desktop-smoke.png; as imagens dos
pontos de verificação de aprovação são a comprovação visual dessa rotina.
A execução padrão dos pontos de verificação mantém os dois cenários padrão de
aprovação do Slack. Para capturar qualquer uma das rotas opcionais de aprovação
do Codex, selecione-a explicitamente com
--scenario slack-codex-approval-exec-native ou
--scenario slack-codex-approval-plugin-native; o Mantis aceita ambas e gera
o mesmo par de capturas de tela de estado pendente/resolvido. O executor amplia
os prazos dos pontos de verificação e dos comandos remotos para cada rota do
Codex selecionada, permitindo a conclusão de toda a sequência de aprovação,
conclusão do agente e atualização do estado resolvido.
A lista de verificação do operador, o comando de disparo do workflow do GitHub, o contrato de comentários de evidências, a tabela de decisão do modo de hidratação, a interpretação dos tempos e as etapas de tratamento de falhas estão no runbook do Mantis para Slack Desktop.
Para uma tarefa de desktop no estilo agente/CV, execute:
pnpm openclaw qa mantis visual-task \ --browser-url https://example.net \ --expect-text "Example Domain" \ --vision-model openai/gpt-5.6-lunavisual-task reserva ou reutiliza uma máquina desktop/com navegador do Crabbox, inicia
crabbox record --while, controla o navegador visível por meio de um
visual-driver aninhado, captura visual-task.png, executa openclaw infer image describe na captura de tela quando --vision-mode image-describe está
selecionado e grava visual-task.mp4, mantis-visual-task-summary.json,
mantis-visual-task-driver-result.json e
mantis-visual-task-report.md. Quando --expect-text está definido, o prompt de visão
solicita um veredito JSON estruturado (visible, evidence, reason)
e só é aprovado quando o modelo relata visible: true com evidências que
citam o texto esperado; uma resposta visible: false que apenas cita o
texto-alvo ainda falha na asserção. Use --vision-mode metadata para um
teste rápido sem modelo que comprove o funcionamento integrado do desktop, navegador, captura de tela e vídeo
sem chamar um provedor de compreensão de imagens. A gravação é um
artefato obrigatório para visual-task; se o Crabbox não gravar um
visual-task.mp4 não vazio, a tarefa falhará mesmo que o driver visual tenha sido aprovado. Em
caso de falha, o Mantis mantém a reserva para VNC, a menos que a tarefa já tenha sido aprovada
e --keep-lease não tenha sido definido.
Verificação de integridade do pool de credenciais
Antes de usar credenciais ativas do pool, execute:
pnpm openclaw qa credentials doctorO doctor verifica as variáveis de ambiente do broker Convex (OPENCLAW_QA_CONVEX_SITE_URL,
OPENCLAW_QA_CONVEX_ENDPOINT_PREFIX), valida as configurações do endpoint, informa
apenas o status definido/ausente de OPENCLAW_QA_CONVEX_SECRET_CI e
OPENCLAW_QA_CONVEX_SECRET_MAINTAINER e verifica a acessibilidade de administração/listagem
quando o segredo do mantenedor está presente.
Cobertura de transporte em ambiente real
As vias de transporte em ambiente real compartilham um único contrato, em vez de cada uma criar seu próprio
formato de lista de cenários. qa-channel é a suíte sintética ampla de comportamento do produto
e não faz parte da matriz de cobertura de transporte em ambiente real.
Os executores de transporte em ambiente real importam os IDs de cenário compartilhados, os auxiliares de
cobertura de referência e o auxiliar de seleção de cenários de
openclaw/plugin-sdk/qa-live-transport-scenarios.
| Fluxo | Canary | Controle por menção | Bot para bot | Bloqueio por lista de permissões | Resposta de nível superior | Resposta com citação | Retomada após reinício | Continuação em thread | Isolamento de thread | Observação de reação | Comando de ajuda | Registro de comando nativo |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Discord | x | x | x | x | ||||||||
| Matrix | x | x | x | x | x | x | x | x | x | |||
| Slack | x | x | x | x | x | x | x | x | ||||
| Telegram | x | x | x | x | ||||||||
| x | x | x | x | x | x | x | x |
Isso mantém qa-channel como a ampla suíte de comportamento do produto, enquanto Matrix,
Telegram e os outros transportes ativos compartilham uma única lista de verificação
explícita do contrato de transporte.
Para um fluxo de VM Linux descartável sem introduzir o Docker no caminho de QA, execute:
pnpm openclaw qa suite --runner multipass --scenario channel-chat-baselineIsso inicializa um convidado Multipass novo, instala as dependências, compila o OpenClaw
dentro do convidado, executa qa suite e então copia o relatório e o
resumo normais de QA de volta para .artifacts/qa-e2e/... no host. Ele reutiliza o mesmo
comportamento de seleção de cenários de qa suite no host.
As execuções da suíte no host e no Multipass executam vários cenários selecionados em
paralelo, com workers isolados do Gateway por padrão. qa-channel usa por padrão
concorrência 4, limitada pela quantidade de cenários selecionados. Use --concurrency <count> para ajustar a quantidade de workers ou --concurrency 1 para execução serial.
Use --pack personal-agent para executar o pacote de benchmarks do assistente pessoal (10
cenários). O seletor de pacote é aditivo com flags --scenario repetidas:
os cenários explícitos são executados primeiro e, em seguida, os cenários do pacote são executados na ordem do pacote, com
as duplicatas removidas. Use --pack observability para selecionar os cenários
otel-trace-smoke e docker-prometheus-smoke em conjunto quando um
executor personalizado de QA já fornecer a configuração do coletor OpenTelemetry.
O comando encerra com código diferente de zero quando qualquer cenário falha. Use --allow-failures
quando quiser os artefatos sem um código de saída de falha.
As execuções ativas encaminham as entradas de autenticação de QA compatíveis que são práticas para o
convidado: chaves de provedores baseadas em variáveis de ambiente, o caminho da configuração do provedor ativo de QA e
CODEX_HOME, quando presente. Mantenha --output-dir sob a raiz do repositório para que o
convidado possa gravar de volta pelo workspace montado.
Referência de QA do Discord, Slack, Telegram e WhatsApp
Matrix tem uma página dedicada devido à quantidade de cenários e ao provisionamento do homeserver baseado em Docker. Discord, Slack, Telegram e WhatsApp são executados em transportes reais preexistentes, portanto sua referência fica aqui.
Flags compartilhadas da CLI
Esses fluxos são registrados por meio de
extensions/qa-lab/src/live-transports/shared/live-transport-cli.ts e
aceitam as mesmas flags:
| Flag | Padrão | Descrição |
|---|---|---|
--scenario <id> |
- | Executa somente este cenário. Pode ser repetida. |
--output-dir <path> |
<repo>/.artifacts/qa-e2e/<transport>-<timestamp> |
Local onde são gravados relatórios, resumos, evidências, artefatos específicos do transporte e o log de saída. Caminhos relativos são resolvidos em relação a --repo-root. |
--repo-root <path> |
process.cwd() |
Raiz do repositório ao invocar a partir de um diretório de trabalho neutro. |
--sut-account <id> |
sut |
ID temporário da conta na configuração do Gateway de QA. |
--provider-mode <mode> |
live-frontier |
mock-openai ou live-frontier (o legado live-openai ainda funciona). |
--model <ref> / --alt-model <ref> |
padrão do provedor | Referências dos modelos principal/alternativo. |
--fast |
desativado | Modo rápido do provedor, quando compatível. |
--credential-source <env|convex> |
env |
Consulte o pool de credenciais do Convex. |
--credential-role <maintainer|ci> |
ci na CI, maintainer nos demais casos |
Função usada quando --credential-source convex. |
Cada fluxo encerra com código diferente de zero em caso de falha de qualquer cenário. --allow-failures grava
os artefatos sem definir um código de saída de falha. O Telegram também aceita
--list-scenarios para exibir os IDs dos cenários disponíveis e encerrar; os outros fluxos
não expõem essa flag.
QA do Telegram
pnpm openclaw qa telegramTem como alvo um grupo privado real do Telegram com dois bots distintos (controlador +
SUT). O bot SUT deve ter um nome de usuário do Telegram; a observação bot para bot funciona
melhor quando ambos os bots têm Bot-to-Bot Communication Mode habilitado no
@BotFather.
Variáveis de ambiente obrigatórias quando --credential-source env:
OPENCLAW_QA_TELEGRAM_GROUP_ID- ID numérico do chat (string).OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKENOPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN
Cenários (extensions/qa-lab/src/live-transports/telegram/telegram-live.runtime.ts):
telegram-canarytelegram-mention-gatingtelegram-mentioned-message-replytelegram-help-commandtelegram-commands-commandtelegram-tools-compact-commandtelegram-whoami-commandtelegram-status-commandtelegram-repeated-command-authorizationtelegram-other-bot-command-gatingtelegram-context-commandtelegram-current-session-status-tooltelegram-tool-only-usage-footertelegram-reply-chain-exact-markertelegram-stream-final-single-messagetelegram-long-final-reuses-previewtelegram-long-final-three-chunks
O conjunto padrão implícito sempre abrange canary, controle por menção, respostas de comandos
nativos, endereçamento de comandos e respostas bot para bot em grupos. Os padrões de mock-openai
também incluem verificações determinísticas da cadeia de respostas e do streaming da mensagem final.
telegram-current-session-status-tool e
telegram-tool-only-usage-footer permanecem opcionais: o primeiro só é estável
quando executado diretamente após o canary, e o segundo é uma comprovação no Telegram real
do rodapé de /usage em respostas que contêm apenas ferramentas. Use pnpm openclaw qa telegram --list-scenarios --provider-mode mock-openai para exibir a divisão atual entre
cenários padrão/opcionais com referências de regressão.
Artefatos de saída:
telegram-qa-report.mdqa-evidence.json- entradas de evidência para as verificações do transporte ativo, incluindo campos de perfil, cobertura, provedor, canal, artefatos, resultado e RTT.
As execuções do pacote do Telegram usam o mesmo contrato de credenciais do Telegram. A medição repetida de RTT
faz parte do fluxo ativo normal do pacote do Telegram; a distribuição de RTT
é incorporada a qa-evidence.json em result.timing para a
verificação de RTT selecionada.
OPENCLAW_QA_CREDENTIAL_SOURCE=convex \pnpm test:docker:npm-telegram-liveQuando OPENCLAW_QA_CREDENTIAL_SOURCE=convex está definido, o wrapper da execução ativa do pacote
reserva uma credencial kind: "telegram", exporta as variáveis de ambiente
do grupo/controlador/bot SUT reservadas para a execução do pacote instalado, envia Heartbeats para a reserva e a libera
no encerramento. O wrapper do pacote usa por padrão 20 verificações de RTT de
telegram-mentioned-message-reply, um tempo limite de RTT de 30s e a função do Convex
maintainer fora da CI quando o Convex está selecionado. Substitua
OPENCLAW_NPM_TELEGRAM_RTT_SAMPLES, OPENCLAW_NPM_TELEGRAM_RTT_TIMEOUT_MS
ou OPENCLAW_NPM_TELEGRAM_RTT_MAX_FAILURES para ajustar a medição de RTT sem
criar um comando de RTT separado ou um formato de resumo específico do Telegram.
QA do Discord
pnpm openclaw qa discordTem como alvo um canal de uma guilda privada real do Discord com dois bots: um bot controlador
controlado pelo harness e um bot SUT iniciado pelo Gateway filho do OpenClaw
por meio do Plugin integrado do Discord. Verifica o tratamento de menções no canal, se
o bot SUT registrou o comando nativo /help no Discord e
cenários opcionais de evidência do Mantis.
Variáveis de ambiente obrigatórias quando --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- deve corresponder ao ID de usuário do bot SUT retornado pelo Discord (caso contrário, o fluxo falha imediatamente).
Opcionais:
OPENCLAW_QA_DISCORD_CAPTURE_CONTENT=1mantém o conteúdo das mensagens nos artefatos de mensagens observadas.OPENCLAW_QA_DISCORD_VOICE_CHANNEL_IDseleciona o canal de voz/palco paradiscord-voice-autojoin; sem ele, o cenário escolhe o primeiro canal de voz/palco visível para o bot SUT.
Cenários (extensions/qa-lab/src/live-transports/discord/discord-live.runtime.ts:36):
discord-canarydiscord-mention-gatingdiscord-native-help-command-registrationdiscord-voice-autojoin- cenário de voz opcional. É executado isoladamente, habilitachannels.discord.voice.autoJoine verifica se o estado de voz atual do bot SUT no Discord corresponde ao canal de voz/palco de destino. As credenciais do Discord no Convex podem incluir ovoiceChannelIdopcional; caso contrário, o executor descobre o primeiro canal de voz/palco visível na guilda.discord-status-reactions-tool-only- cenário opcional do Mantis. É executado isoladamente porque muda o SUT para respostas da guilda sempre ativas e somente com ferramentas, commessages.statusReactions.enabled=true, e então captura uma linha do tempo de reações via REST, além de artefatos visuais HTML/PNG. Os relatórios de antes/depois do Mantis também preservam os artefatos MP4 fornecidos pelo cenário comobaseline.mp4ecandidate.mp4.discord-thread-reply-filepath-attachment- cenário opcional do Mantis; consulte Cenários do Mantis no Discord.
Execute explicitamente o cenário de entrada automática no canal de voz do Discord:
pnpm openclaw qa discord \ --scenario discord-voice-autojoin \ --provider-mode mock-openaiExecute explicitamente o cenário de reações de status do Mantis:
pnpm openclaw qa discord \ --scenario discord-status-reactions-tool-only \ --provider-mode live-frontier \ --model openai/gpt-5.6-luna \ --alt-model openai/gpt-5.6-luna \ --fastArtefatos de saída:
discord-qa-report.mdqa-evidence.json- entradas de evidência para as verificações de transporte ao vivo.discord-qa-observed-messages.json- corpos redigidos, a menos queOPENCLAW_QA_DISCORD_CAPTURE_CONTENT=1.discord-qa-reaction-timelines.jsonediscord-status-reactions-tool-only-timeline.pngquando o cenário de reações de status é executado.
QA do Slack
pnpm openclaw qa slackTem como alvo um canal privado real do Slack com dois bots distintos: um bot driver controlado pelo harness e um bot SUT iniciado pelo Gateway filho do OpenClaw por meio do Plugin do Slack incluído.
Variáveis de ambiente obrigatórias quando --credential-source env:
OPENCLAW_QA_SLACK_CHANNEL_IDOPENCLAW_QA_SLACK_DRIVER_BOT_TOKENOPENCLAW_QA_SLACK_SUT_BOT_TOKENOPENCLAW_QA_SLACK_SUT_APP_TOKEN
Opcional:
OPENCLAW_QA_SLACK_CAPTURE_CONTENT=1mantém os corpos das mensagens nos artefatos de mensagens observadas.OPENCLAW_QA_SLACK_APPROVAL_CHECKPOINT_DIRhabilita pontos de verificação visuais de aprovação para Mantis. O executor grava<scenario>.pending.jsone<scenario>.resolved.jsone, em seguida, aguarda os arquivos.ack.jsoncorrespondentes.OPENCLAW_QA_SLACK_APPROVAL_CHECKPOINT_TIMEOUT_MSsubstitui o tempo limite de confirmação do ponto de verificação. O padrão é120000.
Cenários YAML canônicos expostos por meio do adaptador ao vivo do Slack:
thread-follow-upthread-isolation
Cenários imperativos do Slack (extensions/qa-lab/src/live-transports/slack/slack-live.runtime.ts):
slack-canaryslack-mention-gatingslack-allowlist-blockslack-top-level-reply-shapeslack-restart-resumeslack-progress-commentary-true,slack-progress-commentary-false,slack-progress-commentary-omittedeslack-progress-commentary-verbose-dedupe- sondagens opcionais no Slack real para controles independentes de comentários/progresso de ferramentas, o padrão legado quando a chave é omitida e o comportamento de entrega única quando o progresso detalhado persistente está ativado.slack-reaction-glyph-native- cenário opcional de reação ao vivo da ferramenta de mensagens. Instrui o agente a fornecer o glifo exato✅e confirma que o Slack armazenouwhite_check_markpara o bot SUT na mensagem de destino.slack-chart-presentation-native- cenário opcional de gráfico portátil que verifica o bloco nativodata_visualizatione o texto acessível exato.slack-table-presentation-native- cenário opcional de tabela portátil que verifica o bloco nativodata_table, as linhas exatas e o texto acessível.slack-table-invalid-blocks-fallback- cenário opcional de transporte direto que envia uma tabela bruta estruturalmente legível acima do limite, com 101 linhas de dados mais o cabeçalho, por meio do caminho de envio do Slack em produção, comprova que o próprio Slack retornainvalid_blockse verifica se o fallback armazenado com formatação desabilitada está completo e não contém nenhum bloco de dados nativo. O relatório mantém apenas evidências seguras de código de erro, contagem e valores booleanos; o texto bruto da tabela sintética segueOPENCLAW_QA_SLACK_CAPTURE_CONTENT.slack-approval-exec-native- cenário opcional de aprovação nativa de execução no Slack. Solicita uma aprovação de execução por meio do Gateway, verifica se a mensagem do Slack tem botões nativos de aprovação, resolve a solicitação e verifica a atualização resolvida no Slack.slack-approval-plugin-native- cenário opcional de aprovação nativa de Plugin no Slack. Habilita em conjunto o encaminhamento de aprovações de execução e de Plugin para que os eventos de Plugin não sejam suprimidos pelo roteamento de aprovação de execução e, em seguida, verifica o mesmo fluxo de interface nativa pendente/resolvida do Slack.slack-codex-approval-exec-native- cenário opcional de aprovação de comando do Codex Guardian. Habilita o Plugin do Codex no modo Guardian, encaminha um turno de agente do Gateway originado no Slack pelo harness do app-server do Codex, aguarda a solicitação nativa de aprovação do Plugin do Slack paraopenclaw-codex-app-server, resolve-a e verifica se o turno do Codex termina com os marcadores esperados de saída do comando e do assistente.slack-codex-approval-plugin-native- cenário opcional de aprovação de arquivo do Codex Guardian. Usa uma instruçãoapply_patchfora do espaço de trabalho para que o Codex emita a rota de aprovação de alteração de arquivo do app-server e, em seguida, verifica o mesmo fluxo nativo de aprovação pendente/resolvida do Slack, o marcador final do assistente e o conteúdo exato do arquivo antes da limpeza.
Os cenários de aprovação do Codex exigem um --model openai/* ou codex/*, as
credenciais normais do modelo ao vivo e autenticação do Codex ou autenticação por chave de API aceita pelo Plugin do Codex.
O relatório do Slack inclui o método do app-server do Codex, a chave do modelo Codex selecionada,
o status final do turno do Codex e a verificação do marcador de operação, além dos
metadados redigidos de aprovação do Slack.
Artefatos de saída:
slack-qa-report.mdqa-evidence.json- entradas de evidência para as verificações de transporte ao vivo.slack-qa-observed-messages.json- corpos redigidos, a menos queOPENCLAW_QA_SLACK_CAPTURE_CONTENT=1.approval-checkpoints/- somente quando Mantis defineOPENCLAW_QA_SLACK_APPROVAL_CHECKPOINT_DIR; contém JSON dos pontos de verificação, JSON de confirmação e capturas de tela dos estados pendente/resolvido.
Configuração do espaço de trabalho do Slack
A lane precisa de dois aplicativos distintos do Slack em um espaço de trabalho, além de um canal do qual ambos os bots sejam membros:
channelId- o IDCxxxxxxxxxxde um canal para o qual ambos os bots foram convidados. Use um canal dedicado; a lane publica a cada execução.driverBotToken- token do bot (xoxb-...) do aplicativo Driver.sutBotToken- token do bot (xoxb-...) do aplicativo SUT, que deve ser um aplicativo Slack separado do driver para que o ID de usuário do bot seja distinto.sutAppToken- token no nível do aplicativo (xapp-...) do aplicativo SUT comconnections:write, usado pelo Socket Mode para que o aplicativo SUT possa receber eventos.
Prefira um espaço de trabalho do Slack dedicado à QA em vez de reutilizar um espaço de trabalho de produção.
O manifesto do SUT abaixo restringe intencionalmente a instalação de produção do Plugin do Slack
incluído (extensions/slack/src/setup-shared.ts:12) às
permissões e aos eventos cobertos pelo conjunto de QA ao vivo do Slack. Para a
configuração do canal de produção conforme apresentada aos usuários, consulte
configuração rápida do canal do Slack; o par Driver/SUT de QA
é intencionalmente separado porque a lane precisa de dois IDs distintos de usuário de bot
em um único espaço de trabalho.
1. Crie o aplicativo Driver
Acesse api.slack.com/apps → Create New App → From a manifest → escolha o espaço de trabalho de QA, cole o manifesto a seguir e depois selecione Install to Workspace:
{ "display_information": { "name": "OpenClaw QA Driver", "description": "Bot driver de teste para a lane ao vivo de QA do Slack do OpenClaw" }, "features": { "bot_user": { "display_name": "OpenClaw QA Driver", "always_online": true } }, "oauth_config": { "scopes": { "bot": ["chat:write", "channels:history", "groups:history", "users:read"] } }, "settings": { "socket_mode_enabled": false }}Copie o Bot User OAuth Token (xoxb-...) - ele se torna
driverBotToken. O driver precisa apenas publicar mensagens e identificar
a si mesmo; sem eventos, sem Socket Mode.
2. Crie o aplicativo SUT
Repita Create New App → From a manifest no mesmo workspace. Este aplicativo de QA
usa intencionalmente uma versão mais restrita do manifesto de produção do
Plugin Slack incluído (extensions/slack/src/setup-shared.ts:12): escopos e
eventos de reação foram omitidos porque a suíte de QA em ambiente real do Slack
ainda não abrange o tratamento de reações.
{ "display_information": { "name": "OpenClaw QA SUT", "description": "Conector OpenClaw QA SUT para o OpenClaw" }, "features": { "bot_user": { "display_name": "OpenClaw QA SUT", "always_online": true }, "app_home": { "home_tab_enabled": true, "messages_tab_enabled": true, "messages_tab_read_only_enabled": false } }, "oauth_config": { "scopes": { "bot": [ "app_mentions:read", "assistant:write", "channels:history", "channels:read", "chat:write", "commands", "emoji:read", "files:read", "files:write", "groups:history", "groups:read", "im:history", "im:read", "im:write", "mpim:history", "mpim:read", "mpim:write", "pins:read", "pins:write", "usergroups:read", "users:read" ] } }, "settings": { "socket_mode_enabled": true, "event_subscriptions": { "bot_events": [ "app_home_opened", "app_mention", "channel_rename", "member_joined_channel", "member_left_channel", "message.channels", "message.groups", "message.im", "message.mpim", "pin_added", "pin_removed" ] } }}Depois que o Slack criar o aplicativo, faça duas coisas na página de configurações dele:
- Install to Workspace → copie o Bot User OAuth Token → ele se torna
sutBotToken. - Basic Information → App-Level Tokens → Generate Token and Scopes → adicione
o escopo
connections:write→ salve → copie o valorxapp-...→ ele se tornasutAppToken.
Verifique se os dois bots têm ids de usuário distintos chamando auth.test com
cada token. O runtime diferencia o driver e o SUT pelo id de usuário; reutilizar
um aplicativo para ambos fará a restrição por menção falhar imediatamente.
3. Crie o canal
No workspace de QA, crie um canal (por exemplo, #openclaw-qa) e convide os dois
bots dentro do canal:
/invite @OpenClaw QA Driver/invite @OpenClaw QA SUTCopie o id Cxxxxxxxxxx em channel info → About → Channel ID — ele se
torna channelId. Um canal público funciona; se você usar um canal privado,
ambos os aplicativos já têm groups:history, portanto as leituras de histórico
do harness continuarão funcionando.
4. Registre as credenciais
Há duas opções. Use variáveis de ambiente para depuração em uma única máquina
(defina as quatro variáveis OPENCLAW_QA_SLACK_* e passe
--credential-source env) ou inicialize o pool compartilhado do Convex para
que a CI e outros mantenedores possam obtê-las por meio de concessão.
Para o pool do Convex, grave os quatro campos em um arquivo JSON:
{ "channelId": "Cxxxxxxxxxx", "driverBotToken": "xoxb-...", "sutBotToken": "xoxb-...", "sutAppToken": "xapp-..."}Com OPENCLAW_QA_CONVEX_SITE_URL e OPENCLAW_QA_CONVEX_SECRET_MAINTAINER
exportados no seu shell, registre e verifique:
pnpm openclaw qa credentials add \ --kind slack \ --payload-file slack-creds.json \ --note "Semente do pool de QA do Slack" pnpm openclaw qa credentials list --kind slack --status all --jsonEspere count: 1, status: "active" e nenhum campo lease.
5. Verifique de ponta a ponta
Execute a lane localmente para confirmar que ambos os bots conseguem se comunicar por meio do broker:
pnpm openclaw qa slack \ --credential-source convex \ --credential-role maintainer \ --output-dir .artifacts/qa-e2e/slack-localUma execução bem-sucedida é concluída em bem menos de 30 segundos, e slack-qa-report.md
mostra tanto slack-canary quanto slack-mention-gating com o status pass. Se a
lane ficar travada por ~90 segundos e encerrar com Convex credential pool exhausted for kind "slack", o pool está vazio ou todas as linhas estão locadas — qa credentials list --kind slack --status all --json indicará qual é o caso.
QA do WhatsApp
pnpm openclaw qa whatsappTem como alvo duas contas dedicadas do WhatsApp Web: uma conta de driver controlada pelo harness e uma conta do SUT iniciada pelo Gateway filho do OpenClaw por meio do Plugin integrado do WhatsApp.
Variáveis de ambiente obrigatórias ao usar --credential-source env:
OPENCLAW_QA_WHATSAPP_DRIVER_PHONE_E164OPENCLAW_QA_WHATSAPP_SUT_PHONE_E164OPENCLAW_QA_WHATSAPP_DRIVER_AUTH_ARCHIVE_BASE64OPENCLAW_QA_WHATSAPP_SUT_AUTH_ARCHIVE_BASE64
Opcional:
OPENCLAW_QA_WHATSAPP_GROUP_JIDhabilita cenários de grupo, comowhatsapp-mention-gating,whatsapp-group-pending-history-context,whatsapp-broadcast-group-fanout,whatsapp-group-activation-always,whatsapp-group-reply-to-bot-triggers, cenários de ações/mídia/enquetes em grupo ewhatsapp-group-allowlist-block.OPENCLAW_QA_WHATSAPP_CAPTURE_CONTENT=1mantém o corpo das mensagens nos artefatos de mensagens observadas.
Catálogo de cenários (extensions/qa-lab/src/live-transports/whatsapp/whatsapp-live.runtime.ts):
- Linha de base e controle de grupo:
whatsapp-canary,whatsapp-pairing-block,whatsapp-mention-gating,whatsapp-group-pending-history-context,whatsapp-group-activation-always,whatsapp-group-reply-to-bot-triggers,whatsapp-top-level-reply-shape,whatsapp-restart-resume,whatsapp-group-allowlist-block. - Comandos nativos:
whatsapp-help-command,whatsapp-status-command,whatsapp-commands-command,whatsapp-tools-compact-command,whatsapp-whoami-command,whatsapp-context-command,whatsapp-native-new-command. - Comportamento de resposta e saída final:
whatsapp-tool-only-usage-footer,whatsapp-reply-to-message,whatsapp-group-reply-to-message,whatsapp-reply-to-mode-batched,whatsapp-reply-context-isolation,whatsapp-reply-delivery-shape,whatsapp-stream-final-message-accounting. - Ações de mensagem no fluxo do usuário:
whatsapp-agent-message-action-reactcomeça com uma DM real do driver, permite que o modelo chame a ferramentamessagee observa a reação nativa do WhatsApp.whatsapp-agent-message-action-upload-fileusa a mesma abordagem paramessage(action=upload-file)e observa mídia nativa do WhatsApp.whatsapp-group-agent-message-action-reactewhatsapp-group-agent-message-action-upload-filecomprovam as mesmas ações visíveis ao usuário em um grupo real do WhatsApp. - Distribuição para grupos:
whatsapp-broadcast-group-fanoutcomeça com uma mensagem mencionada em um grupo do WhatsApp e verifica respostas visíveis distintas demaineqa-second. - Ativação de grupo:
whatsapp-group-activation-alwaysaltera uma sessão de grupo real para/activation always, comprova que uma mensagem de grupo sem menção desperta o agente e, em seguida, restaura/activation mention.whatsapp-group-reply-to-bot-triggersinsere uma resposta do bot, envia uma resposta nativa citando-a sem uma menção explícita e verifica se o agente desperta a partir desse contexto de resposta. - Mídia recebida e mensagens estruturadas:
whatsapp-inbound-image-caption,whatsapp-audio-preflight,whatsapp-inbound-structured-messages,whatsapp-group-audio-gating,whatsapp-inbound-reaction-no-trigger. Esses cenários enviam eventos reais de imagem, áudio, documento, localização, contato, figurinha e reação do WhatsApp por meio do driver. - Sondagens diretas do contrato do Gateway:
whatsapp-outbound-media-matrix,whatsapp-outbound-document-preserves-filename,whatsapp-outbound-poll,whatsapp-outbound-send-serialization,whatsapp-group-outbound-media,whatsapp-group-outbound-poll,whatsapp-message-actions,whatsapp-reply-context-isolation,whatsapp-reply-delivery-shape. Esses cenários ignoram de propósito a solicitação ao modelo e comprovam contratos determinísticos desend,pollemessage.actiondo Gateway/canal. - Cobertura de controle de acesso:
whatsapp-access-control-dm-open,whatsapp-access-control-dm-disabled,whatsapp-access-control-group-open,whatsapp-access-control-group-disabled,whatsapp-group-allowlist-block. - Aprovações nativas:
whatsapp-approval-exec-deny-native,whatsapp-approval-exec-native,whatsapp-approval-exec-reaction-native,whatsapp-approval-exec-group-reaction-native,whatsapp-approval-plugin-native. - Reações de status:
whatsapp-status-reactions,whatsapp-status-reaction-lifecycle.
O catálogo contém atualmente 52 cenários. A lane padrão live-frontier
é mantida pequena, com 10 cenários, para uma cobertura de smoke rápida. A lane padrão
mock-openai executa 45 cenários de forma determinística pelo transporte real do WhatsApp,
simulando apenas a saída do modelo; os cenários de aprovação e algumas
verificações mais pesadas/bloqueantes permanecem explícitos por ID de cenário.
O driver de QA do WhatsApp observa eventos ativos estruturados (text, media,
location, reaction e poll) e pode enviar ativamente mídia, enquetes,
contatos, localizações e figurinhas. O QA Lab importa esse driver pela
superfície do pacote @openclaw/whatsapp/api.js, em vez de acessar arquivos privados
do runtime do WhatsApp. Para observações de grupo, fromJid é o JID do grupo,
enquanto participantJid e fromPhoneE164 identificam o participante remetente.
O conteúdo das mensagens é ocultado por padrão. As sondagens diretas do Gateway de enquete,
upload de arquivo, mídia, enquete em grupo, mídia em grupo e formato de resposta são verificações
do contrato de transporte/API; elas não são tratadas como prova de que uma solicitação do usuário fez
o agente escolher a mesma ação. A comprovação de ações no fluxo do usuário vem de cenários
como whatsapp-agent-message-action-react e
whatsapp-group-agent-message-action-react, nos quais o driver envia uma mensagem normal
do WhatsApp e o QA Lab observa o artefato nativo resultante do WhatsApp.
Os relatórios do WhatsApp incluem a abordagem de cada cenário (user-path,
direct-gateway ou native-approval), para que as evidências não sejam confundidas com um
contrato mais forte do que aquele que realmente comprovam.
Artefatos de saída:
whatsapp-qa-report.mdqa-evidence.json- entradas de evidência para as verificações do transporte ativo.whatsapp-qa-observed-messages.json- corpos ocultados, a menos queOPENCLAW_QA_WHATSAPP_CAPTURE_CONTENT=1.
Pool de credenciais do Convex
As lanes do Discord, Slack, Telegram e WhatsApp podem obter credenciais de um
pool compartilhado do Convex, em vez de ler as variáveis de ambiente acima. Passe
--credential-source convex (ou defina OPENCLAW_QA_CREDENTIAL_SOURCE=convex);
o QA Lab adquire uma concessão exclusiva, envia Heartbeats durante toda a
execução e a libera no encerramento. Os tipos do pool são "discord", "slack",
"telegram" e "whatsapp".
Formatos de payload que o broker valida em admin/add:
- Discord (
kind: "discord"):{ guildId: string, channelId: string, driverBotToken: string, sutBotToken: string, sutApplicationId: string }. - Telegram (
kind: "telegram"):{ groupId: string, driverToken: string, sutToken: string }-groupIddeve ser uma string numérica de ID de chat. - Usuário real do Telegram (
kind: "telegram-user"):{ groupId: string, sutToken: string, testerUserId: string, testerUsername: string, telegramApiId: string, telegramApiHash: string, tdlibDatabaseEncryptionKey: string, tdlibArchiveBase64: string, tdlibArchiveSha256: string, desktopTdataArchiveBase64: string, desktopTdataArchiveSha256: string }- somente para comprovação do Telegram Desktop no Mantis. As lanes genéricas do QA Lab não devem adquirir esse tipo. - WhatsApp (
kind: "whatsapp"):{ driverPhoneE164: string, sutPhoneE164: string, driverAuthArchiveBase64: string, sutAuthArchiveBase64: string, groupJid?: string }- os números de telefone devem ser strings E.164 distintas.
O fluxo de trabalho de comprovação do Telegram Desktop no Mantis mantém uma concessão exclusiva
telegram-user do Convex tanto para o driver CLI da TDLib quanto para a testemunha do Telegram Desktop
e, em seguida, libera-a após publicar a comprovação.
Quando um PR precisa de uma comparação visual determinística, o Mantis pode usar a mesma resposta
do modelo simulado em main e no head do PR enquanto o formatador ou
a camada de entrega do Telegram é alterada. Os padrões de captura são ajustados para comentários de PR: classe
Crabbox padrão, gravação da área de trabalho a 24fps, GIF de movimento a 24fps e largura de
pré-visualização de 1920px. Os comentários de antes/depois devem publicar um pacote limpo que contenha
apenas os GIFs pretendidos.
As lanes do Slack também podem usar o pool. Atualmente, as verificações do formato do payload do Slack ficam
no executor de QA do Slack, e não no broker; use { channelId: string, driverBotToken: string, sutBotToken: string, sutAppToken: string }, com um
ID de canal do Slack como Cxxxxxxxxxx. Consulte
Configuração do workspace do Slack para provisionar aplicativos
e escopos.
As variáveis de ambiente operacionais e o contrato do endpoint do broker do Convex estão em Testes → Credenciais compartilhadas do Telegram via Convex (o nome da seção é anterior ao pool multicanal; a semântica das concessões é compartilhada entre os tipos).
Seeds armazenadas no repositório
Os recursos de seed ficam em qa/:
qa/scenarios/index.yamlqa/scenarios/<theme>/*.yaml
Eles ficam intencionalmente no git para que o plano de QA seja visível tanto para humanos quanto para o agente.
qa-lab continua sendo um executor genérico de cenários YAML. Cada arquivo YAML de cenário é a
fonte da verdade para uma execução de teste e deve definir:
titleno nível superior- metadados de
scenario - metadados opcionais de categoria, capacidade, lane e risco em
scenario - referências de documentação e código em
scenario - requisitos opcionais de Plugin em
scenario - patch opcional da configuração do Gateway em
scenario flowexecutável no nível superior para cenários de fluxo, ouscenario.execution.kind/scenario.execution.pathpara cenários do Vitest e Playwright
A superfície reutilizável do runtime que sustenta flow permanece genérica e
transversal. Por exemplo, os cenários YAML podem combinar auxiliares do lado do
transporte com auxiliares do lado do navegador que controlam a Control UI incorporada por meio
da interface browser.request do Gateway, sem adicionar um executor de caso especial.
Os arquivos de cenário devem ser agrupados por capacidade do produto, e não por pasta da
árvore de origem. Mantenha os IDs dos cenários estáveis quando os arquivos forem movidos; use docsRefs e
codeRefs para rastreabilidade da implementação.
A lista de linha de base deve permanecer abrangente o suficiente para cobrir:
- DM e chat em canal
- comportamento de threads
- ciclo de vida de ações de mensagem
- callbacks de Cron
- recuperação de memória
- troca de modelos
- transferência para subagente
- leitura de repositório e documentação
- uma pequena tarefa de build, como Lobster Invaders
Lanes de simulação de provedores
qa suite tem duas lanes locais de simulação de provedores:
mock-openaié a simulação do OpenClaw ciente dos cenários. Continua sendo a lane de simulação determinística padrão para QA armazenada no repositório e gates de paridade.aimockinicia um servidor de provedor baseado em AIMock para cobertura experimental de protocolo, fixtures, gravação/reprodução e caos. Ele é aditivo e não substitui o dispatcher de cenáriosmock-openai.
A implementação das lanes de provedores fica em extensions/qa-lab/src/providers/.
Cada provedor é responsável por seus padrões, inicialização do servidor local, configuração do modelo do Gateway,
necessidades de preparação do perfil de autenticação e flags de capacidade ativa/simulada. O código compartilhado da suíte e
do Gateway é roteado pelo registro de provedores, em vez de criar ramificações com base nos
nomes dos provedores.
Adaptadores de transporte
O qa-lab é responsável por uma interface genérica de transporte para cenários de QA em YAML. qa-channel é
o padrão sintético. crabline inicia servidores locais com formato de provedor e
executa os Plugins de canal normais do OpenClaw neles. live é reservado para
credenciais reais de provedores e canais externos.
No nível da arquitetura, a divisão é:
qa-labé responsável pela execução genérica de cenários, concorrência de workers, gravação de artefatos e geração de relatórios.- O adaptador de transporte é responsável pela configuração do Gateway, prontidão, observação de entrada e saída, ações de transporte e estado normalizado do transporte.
- Os arquivos de cenário YAML em
qa/scenarios/definem a execução do teste; oqa-labfornece a superfície reutilizável do runtime que os executa.
Adição de um canal
Adicionar um canal ao sistema de QA em YAML requer a implementação do canal,
além de um pacote de cenários que exercite o contrato do canal. Para cobertura de smoke em CI,
adicione o servidor de provedor local correspondente do Crabline e exponha-o
pelo driver crabline.
Não adicione uma nova raiz de comando de QA de nível superior quando o host compartilhado qa-lab puder
ser responsável pelo fluxo.
O qa-lab é responsável pelos mecanismos compartilhados do host:
- a raiz de comando
openclaw qa - inicialização e encerramento da suíte
- concorrência de workers
- gravação de artefatos
- geração de relatórios
- execução de cenários
- aliases de compatibilidade para cenários
qa-channelmais antigos
Os Plugins executores são responsáveis pelo contrato de transporte:
- como
openclaw qa <runner>é montado sob a raiz compartilhadaqa - como o Gateway é configurado para esse transporte
- como a prontidão é verificada
- como eventos de entrada são injetados
- como mensagens de saída são observadas
- como transcrições e o estado normalizado do transporte são expostos
- como ações respaldadas pelo transporte são executadas
- como a redefinição ou limpeza específica do transporte é tratada
Os requisitos mínimos de adoção para um novo canal:
- Manter
qa-labcomo proprietário da raiz compartilhadaqa. - Implementar o executor do transporte no ponto de integração compartilhado do host
qa-lab. - Manter a mecânica específica do transporte dentro do Plugin executor ou do ambiente de testes do canal.
- Montar o executor como
openclaw qa <runner>em vez de registrar um comando raiz concorrente. Os Plugins executores devem declararqaRunnersemopenclaw.plugin.jsone exportar um arrayqaRunnerCliRegistrationscorrespondente deruntime-api.ts. Manterruntime-api.tsleve; o carregamento tardio da CLI e a execução do executor devem permanecer atrás de pontos de entrada separados. UmadapterFactoryopcional expõe o transporte a cenários compartilhados sem alterar o catálogo de cenários existente do comando. - Criar ou adaptar cenários YAML nos diretórios temáticos
qa/scenarios/. - Usar os auxiliares genéricos de cenário para novos cenários.
- Manter os aliases de compatibilidade existentes funcionando, a menos que o repositório esteja realizando uma migração intencional.
A regra de decisão é estrita:
- Se o comportamento puder ser expresso uma única vez em
qa-lab, coloque-o emqa-lab. - Se o comportamento depender do transporte de um canal, mantenha-o nesse Plugin executor ou no ambiente de testes do Plugin.
- Se um cenário precisar de um novo recurso que possa ser usado por mais de um canal,
adicione um auxiliar genérico em vez de uma ramificação específica de canal em
suite.ts. - Se um comportamento só fizer sentido para um transporte, mantenha o cenário específico do transporte e deixe isso explícito no contrato do cenário.
Nomes dos auxiliares de cenário
Auxiliares genéricos preferenciais para novos cenários:
waitForTransportReadywaitForChannelReadyinjectInboundMessageinjectOutboundMessagewaitForTransportOutboundMessagewaitForChannelOutboundMessagewaitForNoTransportOutboundgetTransportSnapshotreadTransportMessagereadTransportTranscriptformatTransportTranscriptresetTransport
Os aliases de compatibilidade continuam disponíveis para cenários existentes —
waitForQaChannelReady, waitForOutboundMessage, waitForNoOutbound,
formatConversationTranscript, resetBus —, mas a criação de novos cenários
deve usar os nomes genéricos. Os aliases existem para evitar uma migração
de uma só vez, não como o modelo a ser seguido daqui em diante.
Relatórios
qa-lab exporta um relatório de protocolo em Markdown com base na linha do tempo
observada do barramento. O relatório deve responder:
- O que funcionou
- O que falhou
- O que permaneceu bloqueado
- Quais cenários de acompanhamento vale a pena adicionar
Para consultar o inventário de cenários disponíveis — útil ao estimar o trabalho de acompanhamento
ou integrar um novo transporte — execute pnpm openclaw qa coverage (adicione --json
para obter uma saída legível por máquina). Ao escolher uma comprovação específica para um
comportamento ou caminho de arquivo alterado, execute pnpm openclaw qa coverage --match <query>. O
relatório de correspondências pesquisa metadados de cenários, referências de documentação, referências de código, IDs de cobertura,
plugins e requisitos de provedores e, em seguida, exibe os alvos qa suite --scenario ... correspondentes.
Cada execução de qa suite grava os artefatos de nível superior qa-evidence.json,
qa-suite-summary.json e qa-suite-report.md para o conjunto de
cenários selecionado. Os cenários que declaram execution.kind: vitest ou
execution.kind: playwright executam o caminho de teste correspondente e também gravam
logs por cenário. Os cenários que declaram execution.kind: script executam o
produtor de evidências em execution.path por meio de node --import tsx (com
${outputDir} e ${scenarioId} expandidos em execution.args); o
produtor grava seu próprio qa-evidence.json, cujas entradas são importadas para
a saída da suíte e cujos caminhos de artefatos são resolvidos em relação ao
qa-evidence.json desse produtor. Quando qa suite é acessado por meio de qa run --qa-profile, o mesmo qa-evidence.json também inclui o resumo do
painel de pontuação do perfil para as categorias de taxonomia selecionadas.
Trate a saída de cobertura como um auxílio à descoberta, não como substituta de um gate; o cenário selecionado ainda precisa do modo de provedor, transporte ativo, Multipass, Testbox ou lane de lançamento adequados ao comportamento em teste. Para obter o contexto do painel de pontuação, consulte Painel de pontuação de maturidade.
Para verificações de personalidade e estilo, execute o mesmo cenário com várias referências de modelos ativos e gere um relatório Markdown avaliado:
pnpm openclaw qa character-eval \ --model openai/gpt-5.6-luna,thinking=medium,fast \ --model openai/gpt-5.2,thinking=xhigh \ --model openai/gpt-5,thinking=xhigh \ --model anthropic/claude-opus-4-8,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.6-sol,thinking=xhigh,fast \ --judge-model anthropic/claude-opus-4-8,thinking=high \ --blind-judge-models \ --concurrency 16 \ --judge-concurrency 16O comando executa processos filhos locais do Gateway de QA, não Docker. Os cenários de
avaliação de personalidade devem definir a persona por meio de SOUL.md e, em seguida, executar
interações comuns do usuário, como conversas, ajuda com o workspace e pequenas tarefas com arquivos. O modelo
candidato não deve ser informado de que está sendo avaliado. O comando preserva
cada transcrição completa, registra estatísticas básicas da execução e, em seguida, solicita aos modelos avaliadores, no
modo rápido e com raciocínio xhigh quando compatível, que classifiquem as execuções por
naturalidade, estilo e humor. Use --blind-judge-models ao comparar
provedores: o prompt do avaliador ainda recebe todas as transcrições e os status das execuções, mas
as referências dos candidatos são substituídas por rótulos neutros, como candidate-01; o
relatório associa novamente as classificações às referências reais após o processamento.
As execuções dos candidatos usam por padrão o nível de raciocínio high, com medium para o GPT-5.6 Luna e
xhigh para referências de avaliação mais antigas da OpenAI que sejam compatíveis. Substitua a configuração de um
candidato específico diretamente com --model provider/model,thinking=<level>; as opções
diretas também aceitam fast, no-fast e fast=<bool>. --thinking <level> ainda define um fallback global, e a forma antiga --model-thinking <provider/model=level> é mantida para compatibilidade. As referências de candidatos da OpenAI
usam o modo rápido por padrão, permitindo o processamento prioritário quando o provedor
oferece suporte. Passe --fast somente quando quiser forçar a ativação do modo rápido para
todos os modelos candidatos. As durações dos candidatos e avaliadores são registradas no
relatório para análise de benchmark, mas os prompts dos avaliadores dizem explicitamente para não classificar
por velocidade. As execuções dos modelos candidatos e avaliadores usam, por padrão, concorrência 16.
Reduza --concurrency ou --judge-concurrency quando os limites do provedor ou a pressão sobre o
Gateway local tornarem uma execução excessivamente instável.
Quando nenhum --model de candidato é fornecido, a avaliação de personalidade usa por padrão
openai/gpt-5.6-luna, openai/gpt-5.2, openai/gpt-5,
anthropic/claude-opus-4-8, anthropic/claude-sonnet-4-6, zai/glm-5.1,
moonshot/kimi-k2.5 e google/gemini-3.1-pro-preview. Quando nenhum
--judge-model é fornecido, os avaliadores usam por padrão
openai/gpt-5.6-sol,thinking=xhigh,fast e
anthropic/claude-opus-4-8,thinking=high.