OpenClaw QA 테스팅은(는) 무엇을 하나요?
이 스킬은 qa-lab / qa-channel 작업에 사용합니다. 저장소 로컬 QA만 해당됩니다.
먼저 읽기
docs/concepts/qa-e2e-automation.mddocs/help/testing.mddocs/channels/qa-channel.mdqa/README.mdqa/scenarios/index.yamlextensions/qa-lab/src/suite.tsextensions/qa-lab/src/character-eval.ts
모델 정책
- 일반 실시간 스위트 실행은 QA Lab의 소스 및 인증 인식 기본값을 사용합니다.
- 기본적으로
--model,--alt-model또는--fast를 전달하지 마십시오.--fast를 생략한다고 fast가 비활성화되는 것은 아닙니다. fast 동작은 소스가 소유합니다. - 시나리오별 실행의 경우
execution.summary가 권위를 가지며, 다른 플래그가 필요한 경우를 포함하여 일반 기본 지침을 재정의합니다.execution.config.requiredProvider또는requiredModel에서 요구하는 경우에만 명시적 제공자/모델 핀을 추가하십시오.
기본 워크플로
- 시나리오 팩과 현재 스위트 구현을 읽습니다.
- 실행 차선을 결정합니다:
- mock/dev:
mock-openai - 실시간 검증:
live-frontier
- mock/dev:
- 일반 실시간 스위트의 경우 다음을 사용합니다:
pnpm openclaw qa suite \
--provider-mode live-frontier \
--output-dir .artifacts/qa-e2e/run-all-live-frontier-<tag>
- 출력을 관찰합니다:
- 요약:
.artifacts/qa-e2e/run-all-live-frontier-<tag>/qa-suite-summary.json - 보고서:
.artifacts/qa-e2e/run-all-live-frontier-<tag>/qa-suite-report.md
- 요약:
- 사용자가 실시간 UI를 관찰하려면 현재
openclaw-qa수신 포트를 찾아http://127.0.0.1:<port>를 보고합니다. - 시나리오가 실패하면 제품 또는 하네스의 근본 원인을 수정한 후 전체 차선을 다시 실행합니다.
OTEL 스모크
로컬 QA-Lab OpenTelemetry 검증을 위해 다음을 사용합니다:
pnpm qa:otel:smoke
이 명령은 로컬 OTLP/HTTP 트레이스 수신기를 시작하고, otel-trace-smoke 시나리오를 qa-channel을 통해 실행하며, 내보낸 protobuf 스팬을 디코딩하고, 내보낸 트레이스 이름과 개인정보 보호 계약을 검증합니다. Opik, Langfuse 또는 외부 수집기 자격 증명이 필요하지 않습니다.
QA 자격 증명 및 1Password
- 이 저장소에서 QA 비밀 조회를 위해
tmux내에서만op을 사용합니다. - tmux 내에서 빠른 인증 확인:
op account list
- 승인된 1Password 항목 및 필드 참조를 확인합니다:
OPENCLAW_QA_CONVEX_SITE_URLOPENCLAW_QA_CONVEX_SECRET_MAINTAINER(유지보수자 역할)OPENCLAW_QA_CONVEX_SECRET_CI(CI 역할)
- 필요한 참조가 누락되었거나 오래된 경우, 현재 항목 및 필드 참조를 유지보수자/운영자에게 문의하십시오. 채팅에 비밀 값을 요청하거나 로그 또는 증명 아티팩트에 복사하지 마십시오.
- npm Telegram Docker 차선은 Convex 자격 증명 임대가 필요합니다. 임대는 Telegram E2E userbot에 정의된 Test Server SUT 봇, QA 사용자 권한 부여 및 테스트 그룹 메타데이터를 제공합니다. 직접 Telegram 토큰 변수는 필요한 Convex 구성을 대체하지 않습니다.
- 승인된 사이트 URL 및 역할별 비밀을 승인된 비밀 소스를 통해 명령어 환경에 로드합니다. 사전 점검에는 Docker 실행 전에 사이트 URL과 일치하는 역할 비밀이 필요합니다.
- 유지보수자 구성이 로드된 상태에서 다음을 실행합니다:
OPENCLAW_NPM_TELEGRAM_CREDENTIAL_SOURCE=convex \
OPENCLAW_NPM_TELEGRAM_CREDENTIAL_ROLE=maintainer \
OPENCLAW_NPM_TELEGRAM_PROVIDER_MODE=mock-openai \
OPENCLAW_NPM_TELEGRAM_PACKAGE_SPEC="openclaw@beta" \
pnpm test:docker:npm-telegram-live
scripts/e2e/npm-telegram-live-runner.ts는OPENCLAW_NPM_TELEGRAM_PROVIDER_MODE를 읽으며,OPENCLAW_QA_PROVIDER_MODE를 읽지 않습니다.- 승인된 호스팅 증명의 경우,
qa-live-shared환경에 유효한 Convex CI 구성이 있을 때 기존 수동 차선을 사용합니다. 디스패치는 자격 증명을 프로비저닝하거나 자격 증명 거부를 우회하지 않습니다.
ghx workflow run "NPM Telegram Beta E2E" --repo openclaw/openclaw --ref main \
-f [email protected] \
-f [email protected] \
-f provider_mode=mock-openai
- 디스패치 URL에서 정확한 실행 ID를 폴링합니다.
gh run view --json artifacts는 지원되지 않습니다. 다음을 사용하여 아티팩트를 나열합니다:
gh api repos/openclaw/openclaw/actions/runs/<run-id>/artifacts
WhatsApp 실시간 자격 증명
Convex kind=whatsapp 자격 증명을 설정하거나 교체할 때 사용합니다.
- WhatsApp QA 자격 증명은 생성된 픽스처가 아닌 운영자 소유의 실시간 계정으로 취급합니다.
- 두 개의 전용 WhatsApp 지원 테스트 번호(드라이버 계정 1개, SUT 계정 1개)를 사용합니다. 개인 번호나 공유 풀의 개인 OpenClaw WhatsApp 계정을 사용하지 마십시오.
- WhatsApp 또는 WhatsApp Business로 각 계정을 수동으로 등록하고 연결하며, 웹 인증만 저장소 외부의 격리된 로컬 인증 디렉토리에 저장합니다.
- 그룹 커버리지를 위해 두 QA 계정을 모두 포함하는 전용 테스트 그룹을 만들고 해당 JID를
groupJid로 저장합니다. 그렇지 않으면 그룹 멘션 게이팅 시나리오는 기본적으로 건너뛰어야 하며 명시적으로 요청될 때 실패해야 합니다. - 두 개의 Baileys 인증 디렉토리를 base64
.tgz페이로드 필드로 패키징하고 새 활성 Convex 자격 증명 행을 추가합니다. 자격 증명을 제자리에서 덮어쓰는 것보다 새 행을 추가하고 오래된/손상된 행을 비활성화하는 것이 좋습니다. - 예상 페이로드 필드:
driverPhoneE164,sutPhoneE164,driverAuthArchiveBase64,sutAuthArchiveBase64, 선택적groupJid. - 자격 증명 자료를 저장소, 로그, PR 및 스크린샷에 보관하지 마십시오. 운영자가 로컬 디버깅을 명시적으로 요청하지 않는 한 전화번호를 숨깁니다.
pnpm openclaw qa whatsapp --credential-source convex --credential-role maintainer --provider-mode mock-openai로 검증하고 아티팩트 경로와 편집된 통과/실패 요약을 보존합니다.- WhatsApp이 연결된 웹 세션을 만료하거나 무효화하는 경우 로컬에서 다시 연결하고, 새 인증 아카이브를 패키징하고, 새 Convex 행을 추가한 다음 오래된 행을 비활성화합니다.
캐릭터 평가
qa character-eval을 사용하여 여러 실시간 모델에 걸친 스타일/페르소나/바이브 검사를 수행합니다.
pnpm openclaw qa character-eval \
--output-dir .artifacts/qa-e2e/character-eval-<tag>
- 로컬 QA 게이트웨이 자식 프로세스를 실행하며 Docker를 사용하지 않습니다.
- 패키징된
pnpm build는 설계상 QA Lab + qa-channel을 생략합니다(소스 체크아웃 전용). 빌드된 dist에서openclaw qa/qa-channel을 실행하려면OPENCLAW_BUILD_PRIVATE_QA=1 pnpm build로 빌드하거나(dist/plugin-sdk/qa-lab.js,qa-runtime.js,dist/extensions/{qa-lab,qa-channel}생성)pnpm dev를 통해 실행합니다. - 모델 플래그가 없으면 캐릭터 평가는 현재 소스 정의된 후보, 판사, 사고 및 빠른 기본값을 사용합니다.
--model provider/model,thinking=<level>[,fast|,no-fast|,fast=<bool>]또는--judge-model ...을 반복하여 해당 인벤토리를 명시적으로 교체할 때만 사용합니다.- 별도의
--model-thinking을 사용하여 새 예제를 추가하지 마십시오. 해당 플래그는 레거시 호환성으로만 유지합니다. - 보고서에는 판사 순위, 실행 통계, 기간 및 전체 대화 내용이 포함됩니다. 원시 판사 응답은 포함하지 마십시오. 기간은 벤치마크 컨텍스트이며 채점 신호가 아닙니다.
- 후보 및 판사 동시 실행 기본값은 16입니다.
--concurrency <n>및--judge-concurrency <n>을 사용하여 로컬 게이트웨이 또는 제공자 제한이 더 완만한 차선이 필요할 때 재정의합니다. - 시나리오 소스는
qa/scenarios/아래에 YAML 전용입니다:index.yaml과 시나리오별*.yaml파일을title,scenario, 선택적flow와 함께 사용합니다.qa-scenario/qa-flow펜스 처리된 Markdown 파일을 추가하지 마십시오. - 격리된 캐릭터/페르소나 평가를 위해 시나리오 흐름에서 페르소나를
SOUL.md에 쓰고IDENTITY.md를 비워 둡니다. 일반 OpenClaw 아이덴티티가 캐릭터와 결합되는 방식을 의도적으로 테스트할 때만SOUL.md + IDENTITY.md를 사용합니다. - 프롬프트를 자연스럽고 작업 지향적으로 유지합니다. 후보 모델은
SOUL.md를 통해 캐릭터 설정을 받은 다음 채팅, 작업 공간 도움말, 작은 파일 작업과 같은 일반 사용자 턴을 수행해야 합니다. "어떻게 반응하겠습니까?"라고 묻거나 모델에게 평가 중임을 알리지 마십시오. - 작은 작업 공간 아티팩트를 생성하거나 편집하는 등 최소한 하나의 실제 작업을 선호하여 대화 내용이 순수한 롤플레이 대신 정상적인 도구 사용에서 캐릭터를 포착하도록 합니다.
Codex CLI 모델 차선
QA가 모델 백엔드로 Codex를 실행해야 할 때마다 codex-cli/<codex-model> 형태의 모델 참조를 사용합니다.
예시:
pnpm openclaw qa suite \
--provider-mode live-frontier \
--model codex-cli/<codex-model> \
--alt-model codex-cli/<codex-model> \
--scenario <scenario-id> \
--output-dir .artifacts/qa-e2e/codex-<tag>
pnpm openclaw qa manual \
--model codex-cli/<codex-model> \
--message "Reply exactly: CODEX_OK"
- 구체적인 Codex 모델 이름은 사용자/구성 입력으로 취급합니다. 소스, 문서 예제 또는 시나리오에 하드코딩하지 마십시오.
- 실시간 QA는
CODEX_HOME을 보존하여 Codex CLI 인증/구성이 작동하도록 하면서HOME및OPENCLAW_HOME은 샌드박싱된 상태로 유지합니다. - 모의 QA는
CODEX_HOME을 정리해야 합니다. - Codex가 매 턴마다 폴백/인증 텍스트를 반환하는 경우 시나리오 어설션을 변경하기 전에 먼저
CODEX_HOME, 관련 비밀 기반 인증 및 게이트웨이 자식 로그를 확인합니다. - 모델 비교를 위해
qa character-eval에codex-cli/<codex-model>을 다른 후보로 포함합니다. 보고서는 이를 불투명한 모델 이름으로 레이블을 지정해야 합니다.
저장소 정보
- 시드 시나리오는
qa/scenarios/index.yaml및qa/scenarios/<theme>/*.yaml에 있습니다. - 주요 실시간 실행기:
extensions/qa-lab/src/suite.ts - QA 랩 서버:
extensions/qa-lab/src/lab-server.ts - 자식 게이트웨이 하네스:
extensions/qa-lab/src/gateway-child.ts - 합성 채널:
extensions/qa-channel/
"완료"의 의미
- 요청된 차선에 대해 전체 스위트가 통과(녹색)입니다.
- 사용자는 다음을 받습니다:
- 해당되는 경우 감시 URL
- 통과/실패 횟수
- 아티팩트 경로
- 수정된 사항에 대한 간결한 메모
일반적인 실패 패턴
- 실시간 시간 제한이 너무 짧음:
extensions/qa-lab/src/suite.ts에서 실시간 대기 시간을 늘립니다.
- 검색이 저장소 파일을 찾을 수 없음:
- 시드된 작업 공간 내에서
repo/...에 프롬프트를 지정합니다.
- 시드된 작업 공간 내에서
- 하위 에이전트 증명이 너무 취약함:
- 일시적인 자식 세션 목록보다 안정적인 최종 응답 증거를 선호합니다.
- 하네스 "재빌드" 지연:
- 더티 트리는 실행 전 빌드를 트리거할 수 있습니다. 포트가 나타나기 전에 이를 예상합니다.
시나리오 추가 시
qa/scenarios/아래에 시나리오 YAML을 추가하거나 업데이트합니다..md시나리오 파일이나 펜스 처리된 YAML 블록을 추가하지 마십시오.qa/scenarios/index.yaml의 시작 기대치를 정렬합니다.extensions/qa-lab/src/suite.ts에 실행 가능한 커버리지를 추가합니다.- 모의 전용 검사보다 종단 간 어설션을 선호합니다.
- 출력을
.artifacts/qa-e2e/아래에 저장합니다.