Testing
рдкрд░реАрдХреНрд╖рдг
OpenClaw рдореЗрдВ рддреАрди Vitest рд╕реВрдЯ (рдпреВрдирд┐рдЯ/рдЗрдВрдЯреАрдЧреНрд░реЗрд╢рди, e2e, рд▓рд╛рдЗрд╡) рдФрд░ Docker рд░рдирд░реЛрдВ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕реЗрдЯ рд╣реИред рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ "рд╣рдо рдХреИрд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВ" рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛ рд╣реИ:
- рд╣рд░ рд╕реВрдЯ рдХреНрдпрд╛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИ (рдФрд░ рдЬрд╛рдирдмреВрдЭрдХрд░ рдХреНрдпрд╛ рдирд╣реАрдВ рдХрд╡рд░ рдХрд░рддрд╛)ред
- рд╕рд╛рдорд╛рдиреНрдп рд╡рд░реНрдХрдлрд╝реНрд▓реЛ (рд▓реЛрдХрд▓, pre-push, рдбреАрдмрдЧрд┐рдВрдЧ) рдХреЗ рд▓рд┐рдП рдХреМрди-рд╕реЗ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдиреЗ рд╣реИрдВред
- рд▓рд╛рдЗрд╡ рдкрд░реАрдХреНрд╖рдг рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдХреИрд╕реЗ рдЦреЛрдЬрддреЗ рд╣реИрдВ рдФрд░ рдореЙрдбрд▓/рдкреНрд░реЛрд╡рд╛рдЗрдбрд░ рдХреИрд╕реЗ рдЪреБрдирддреЗ рд╣реИрдВред
- рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЗ рдореЙрдбрд▓/рдкреНрд░реЛрд╡рд╛рдЗрдбрд░ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд░рд┐рдЧреНрд░реЗрд╢рди рдХреИрд╕реЗ рдЬреЛрдбрд╝реЗрдВред
рддреБрд░рдВрдд рд╢реБрд░реВ рдХрд░реЗрдВ
рдЕрдзрд┐рдХрддрд░ рджрд┐рдиреЛрдВ рдореЗрдВ:
- рдкреВрд░рд╛ рдЧреЗрдЯ (push рд╕реЗ рдкрд╣рд▓реЗ рдЕрдкреЗрдХреНрд╖рд┐рдд):
pnpm build && pnpm check && pnpm check:test-types && pnpm test - рдЕрдзрд┐рдХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рд╡рд╛рд▓реА рдорд╢реАрди рдкрд░ рддреЗрдЬрд╝ рд▓реЛрдХрд▓ рдкреВрд░рд╛-рд╕реВрдЯ рд░рди:
pnpm test:max - рдкреНрд░рддреНрдпрдХреНрд╖ Vitest рд╡реЙрдЪ рд▓реВрдк:
pnpm test:watch - рдкреНрд░рддреНрдпрдХреНрд╖ рдлрд╝рд╛рдЗрд▓ рд▓рдХреНрд╖реНрдпреАрдХрд░рдг рдЕрдм extension/channel рдкрд╛рде рднреА рд░реВрдЯ рдХрд░рддрд╛ рд╣реИ:
pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts - рдЬрдм рдЖрдк рдХрд┐рд╕реА рдПрдХ рд╡рд┐рдлрд▓рддрд╛ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд░ рд░рд╣реЗ рд╣реЛрдВ, рддреЛ рдкрд╣рд▓реЗ рд▓рдХреНрд╖рд┐рдд рд░рди рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВред
- Docker-backed QA рд╕рд╛рдЗрдЯ:
pnpm qa:lab:up - Linux VM-backed QA рд▓реЗрди:
pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline
рдЬрдм рдЖрдк рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдЫреВрддреЗ рд╣реИрдВ рдпрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рднрд░реЛрд╕рд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
- рдХрд╡рд░реЗрдЬ рдЧреЗрдЯ:
pnpm test:coverage - E2E рд╕реВрдЯ:
pnpm test:e2e
рдкрд░реАрдХреНрд╖рдг рдЕрд╕реНрдерд╛рдпреА рдбрд╛рдпрд░реЗрдХреНрдЯрд░рд┐рдпрд╛рдБ
рдкрд░реАрдХреНрд╖рдг-рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд╡рд╛рд▓реА рдЕрд╕реНрдерд╛рдпреА рдбрд╛рдпрд░реЗрдХреНрдЯрд░рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП test/helpers/temp-dir.ts рдореЗрдВ рд╕рд╛рдЭрд╛ рд╣реЗрд▓реНрдкрд░реЛрдВ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВред рд╡реЗ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд╕реНрдкрд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рдлрд╝рд╛рдИ рдХреЛ рдЙрд╕реА рдкрд░реАрдХреНрд╖рдг рд▓рд╛рдЗрдлрд╝рд╕рд╛рдЗрдХрд▓ рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ:
const tempDirs = useAutoCleanupTempDirTracker(afterEach); it("uses a temp workspace", () => { const workspace = tempDirs.make("openclaw-example-"); // use workspace});useAutoCleanupTempDirTracker(afterEach) рдЬрд╛рдирдмреВрдЭрдХрд░ рдХреЛрдИ рдореИрдиреБрдЕрд▓ рд╕рдлрд╝рд╛рдИ рдореЗрдердб рдЙрдЬрд╛рдЧрд░ рдирд╣реАрдВ рдХрд░рддрд╛; Vitest рд╣рд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рдж рд╕рдлрд╝рд╛рдИ рдХрд╛ рд╕реНрд╡рд╛рдореА рд╣реИред рдореМрдЬреВрджрд╛ рдирд┐рдЪрд▓реЗ-рд╕реНрддрд░ рдХреЗ рд╣реЗрд▓реНрдкрд░ рдЙрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдмрдиреЗ рд░рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдЕрднреА рдорд╛рдЗрдЧреНрд░реЗрдЯ рдирд╣реАрдВ рд╣реБрдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рдирдП рдФрд░ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд┐рдП рдЧрдП рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдСрдЯреЛ-рдХреНрд▓реАрдирд┐рдВрдЧ рдЯреНрд░реИрдХрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдирдП рдореИрдиреБрдЕрд▓ makeTempDir, cleanupTempDirs, рдпрд╛ createTempDirTracker рдЙрдкрдпреЛрдЧ рд╕реЗ рдмрдЪреЗрдВ рдФрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдирдП рд╕реАрдзреЗ fs.mkdtemp* рдХреЙрд▓ рд╕реЗ рдмрдЪреЗрдВ, рдЬрдм рддрдХ рдХрд┐ рдХреЛрдИ рдорд╛рдорд▓рд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрдЪреНрдЪреЗ temp-dir рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рди рдХрд░ рд░рд╣рд╛ рд╣реЛред рдЬрдм рдХрд┐рд╕реА рдкрд░реАрдХреНрд╖рдг рдХреЛ рдЬрд╛рдирдмреВрдЭрдХрд░ рд╕реАрдзреЗ temp рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдЪрд╛рд╣рд┐рдП, рддреЛ рдареЛрд╕ рдХрд╛рд░рдг рдХреЗ рд╕рд╛рде рдСрдбрд┐рдЯ рдпреЛрдЧреНрдп allow рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ:
// openclaw-temp-dir: allow verifies raw fs cleanup behaviorconst workspace = fs.mkdtempSync(prefix);рдорд╛рдЗрдЧреНрд░реЗрд╢рди рджреГрд╢реНрдпрддрд╛ рдХреЗ рд▓рд┐рдП, node scripts/report-test-temp-creations.mjs рдЬреЛрдбрд╝реА рдЧрдИ diff рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдирдИ рд╕реАрдзреА temp-dir рд░рдЪрдирд╛ рдФрд░ рдирдП рдореИрдиреБрдЕрд▓ рд╕рд╛рдЭрд╛-рд╣реЗрд▓реНрдкрд░ рдЙрдкрдпреЛрдЧ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ, рдмрд┐рдирд╛ рдореМрдЬреВрджрд╛ рд╕рдлрд╝рд╛рдИ рд╢реИрд▓рд┐рдпреЛрдВ рдХреЛ рдмреНрд▓реЙрдХ рдХрд┐рдПред рдЗрд╕рдХрд╛ рдлрд╝рд╛рдЗрд▓ рд╕реНрдХреЛрдк рдЬрд╛рдирдмреВрдЭрдХрд░ scripts/changed-lanes.mjs рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдЙрд╕реА test-path рд╡рд░реНрдЧреАрдХрд░рдг рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИ, рдЕрд▓рдЧ test-helper рдлрд╝рд╛рдЗрд▓рдирд╛рдо рд╣реАрдпреВрд░рд┐рд╕реНрдЯрд┐рдХ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдФрд░ рд╕рд╛рдЭрд╛ рд╣реЗрд▓реНрдкрд░ рдЗрдореНрдкреНрд▓реАрдореЗрдВрдЯреЗрд╢рди рдХреЛ рдЫреЛрдбрд╝рддрд╛ рд╣реИред check:changed рдмрджрд▓реЗ рд╣реБрдП test рдкрд╛рде рдХреЗ рд▓рд┐рдП рдЗрд╕ рд░рд┐рдкреЛрд░реНрдЯ рдХреЛ warning-only CI рд╕рд┐рдЧреНрдирд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рд╛рддрд╛ рд╣реИ; рдирд┐рд╖реНрдХрд░реНрд╖ GitHub warning annotations рд╣реЛрддреЗ рд╣реИрдВ, рд╡рд┐рдлрд▓рддрд╛рдПрдБ рдирд╣реАрдВред
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░реЛрд╡рд╛рдЗрдбрд░/рдореЙрдбрд▓ рдбреАрдмрдЧ рдХрд░рддреЗ рд╕рдордп (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдЪрд╛рд╣рд┐рдП):
- рд▓рд╛рдЗрд╡ рд╕реВрдЯ (рдореЙрдбрд▓ + Gateway рдЯреВрд▓/рдЗрдореЗрдЬ probes):
pnpm test:live - рдПрдХ рд▓рд╛рдЗрд╡ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╢рд╛рдВрддрд┐рдкреВрд░реНрд╡рдХ рд▓рдХреНрд╖реНрдп рдХрд░реЗрдВ:
pnpm test:live -- src/agents/models.profiles.live.test.ts - рд░рдирдЯрд╛рдЗрдо рдкреНрд░рджрд░реНрд╢рди рд░рд┐рдкреЛрд░реНрдЯ: рд╡рд╛рд╕реНрддрд╡рд┐рдХ
openai/gpt-5.5agent turn рдХреЗ рд▓рд┐рдПlive_openai_candidate=trueрдХреЗ рд╕рд╛рде рдпрд╛ Kova CPU/heap/trace artifacts рдХреЗ рд▓рд┐рдПdeep_profile=trueрдХреЗ рд╕рд╛рдеOpenClaw Performancedispatch рдХрд░реЗрдВред рдЬрдмCLAWGRIT_REPORTS_TOKENрдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рд╣реЛ, рддреЛ рджреИрдирд┐рдХ scheduled рд░рди mock-provider, deep-profile, рдФрд░ GPT 5.5 рд▓реЗрди artifacts рдХреЛopenclaw/clawgrit-reportsрдкрд░ publish рдХрд░рддреЗ рд╣реИрдВред mock-provider рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ source-level Gateway boot, memory, plugin-pressure, repeated fake-model hello-loop, рдФрд░ CLI startup numbers рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВред - Docker рд▓рд╛рдЗрд╡ рдореЙрдбрд▓ sweep:
pnpm test:docker:live-models- рд╣рд░ рдЪреБрдирд╛ рдЧрдпрд╛ рдореЙрдбрд▓ рдЕрдм рдПрдХ text turn рдФрд░ рдПрдХ рдЫреЛрдЯрд╛ file-read-style probe рдЪрд▓рд╛рддрд╛ рд╣реИред рдЬрд┐рди рдореЙрдбрд▓реЛрдВ рдХрд╛ metadata
imageinput рд╡рд┐рдЬреНрдЮрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╡реЗ рдПрдХ рдЫреЛрдЯрд╛ image turn рднреА рдЪрд▓рд╛рддреЗ рд╣реИрдВред рдкреНрд░реЛрд╡рд╛рдЗрдбрд░ рд╡рд┐рдлрд▓рддрд╛рдУрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рддреЗ рд╕рдордп рдЕрддрд┐рд░рд┐рдХреНрдд probes рдХреЛOPENCLAW_LIVE_MODEL_FILE_PROBE=0рдпрд╛OPENCLAW_LIVE_MODEL_IMAGE_PROBE=0рд╕реЗ рдЕрдХреНрд╖рдо рдХрд░реЗрдВред - CI рдХрд╡рд░реЗрдЬ: рджреИрдирд┐рдХ
OpenClaw Scheduled Live And E2E ChecksрдФрд░ рдореИрдиреБрдЕрд▓OpenClaw Release ChecksрджреЛрдиреЛрдВ reusable live/E2E workflow рдХреЛinclude_live_suites: trueрдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ provider рджреНрд╡рд╛рд░рд╛ sharded рдЕрд▓рдЧ Docker live model matrix jobs рд╢рд╛рдорд┐рд▓ рд╣реИрдВред - рдХреЗрдВрджреНрд░рд┐рдд CI reruns рдХреЗ рд▓рд┐рдП,
OpenClaw Live And E2E Checks (Reusable)рдХреЛinclude_live_suites: trueрдФрд░live_models_only: trueрдХреЗ рд╕рд╛рде dispatch рдХрд░реЗрдВред - рдирдП high-signal provider secrets рдХреЛ
scripts/ci-hydrate-live-auth.shрдФрд░.github/workflows/openclaw-live-and-e2e-checks-reusable.ymlрддрдерд╛ рдЙрд╕рдХреЗ scheduled/release callers рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред
- рд╣рд░ рдЪреБрдирд╛ рдЧрдпрд╛ рдореЙрдбрд▓ рдЕрдм рдПрдХ text turn рдФрд░ рдПрдХ рдЫреЛрдЯрд╛ file-read-style probe рдЪрд▓рд╛рддрд╛ рд╣реИред рдЬрд┐рди рдореЙрдбрд▓реЛрдВ рдХрд╛ metadata
- Native Codex bound-chat smoke:
pnpm test:docker:live-codex-bind- Codex app-server path рдХреЗ рд╡рд┐рд░реБрджреНрдз Docker live lane рдЪрд▓рд╛рддрд╛ рд╣реИ,
/codex bindрдХреЗ рд╕рд╛рде synthetic Slack DM bind рдХрд░рддрд╛ рд╣реИ,/codex fastрдФрд░/codex permissionsexercise рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ ACP рдХреЗ рдмрдЬрд╛рдп native Plugin binding рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ plain reply рдФрд░ image attachment route рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред
- Codex app-server path рдХреЗ рд╡рд┐рд░реБрджреНрдз Docker live lane рдЪрд▓рд╛рддрд╛ рд╣реИ,
- Codex app-server harness smoke:
pnpm test:docker:live-codex-harness- plugin-owned Codex app-server harness рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ Gateway agent turns рдЪрд▓рд╛рддрд╛ рд╣реИ,
/codex statusрдФрд░/codex modelsрд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ image, Cron MCP, sub-agent, рдФрд░ Guardian probes exercise рдХрд░рддрд╛ рд╣реИред рдЕрдиреНрдп Codex app-server рд╡рд┐рдлрд▓рддрд╛рдУрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рддреЗ рд╕рдордп sub-agent probe рдХреЛOPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_PROBE=0рд╕реЗ рдЕрдХреНрд╖рдо рдХрд░реЗрдВред рдХреЗрдВрджреНрд░рд┐рдд sub-agent рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП, рдЕрдиреНрдп probes рдЕрдХреНрд╖рдо рдХрд░реЗрдВ:OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=0 OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=0 OPENCLAW_LIVE_CODEX_HARNESS_GUARDIAN_PROBE=0 OPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_PROBE=1 pnpm test:docker:live-codex-harness. рдпрд╣ sub-agent probe рдХреЗ рдмрд╛рдж рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐OPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_ONLY=0рд╕реЗрдЯ рди рд╣реЛред
- plugin-owned Codex app-server harness рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ Gateway agent turns рдЪрд▓рд╛рддрд╛ рд╣реИ,
- Codex on-demand install smoke:
pnpm test:docker:codex-on-demand- packaged OpenClaw tarball рдХреЛ Docker рдореЗрдВ install рдХрд░рддрд╛ рд╣реИ, OpenAI API-key рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реЗрдЯрдЕрдк рдЪрд▓рд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ Codex Plugin рддрдерд╛
@openai/codexdependency рдорд╛рдВрдЧ рдкрд░ managed npm project root рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рд╣реБрдИрдВред
- packaged OpenClaw tarball рдХреЛ Docker рдореЗрдВ install рдХрд░рддрд╛ рд╣реИ, OpenAI API-key рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реЗрдЯрдЕрдк рдЪрд▓рд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ Codex Plugin рддрдерд╛
- Live Plugin tool dependency smoke:
pnpm test:docker:live-plugin-tool- рд╡рд╛рд╕реНрддрд╡рд┐рдХ
slugifydependency рдХреЗ рд╕рд╛рде fixture Plugin pack рдХрд░рддрд╛ рд╣реИ, рдЙрд╕реЗnpm-pack:рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ install рдХрд░рддрд╛ рд╣реИ, managed npm project root рдХреЗ рддрд╣рдд dependency рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ live OpenAI model рд╕реЗ Plugin tool call рдХрд░рдиреЗ рдФрд░ hidden slug рд▓реМрдЯрд╛рдиреЗ рдХреЛ рдХрд╣рддрд╛ рд╣реИред
- рд╡рд╛рд╕реНрддрд╡рд┐рдХ
- Crestodian rescue command smoke:
pnpm test:live:crestodian-rescue-channel- message-channel rescue command рд╕рддрд╣ рдХреЗ рд▓рд┐рдП opt-in belt-and-suspenders рдЬрд╛рдВрдЪред рдпрд╣
/crestodian statusexercise рдХрд░рддрд╛ рд╣реИ, persistent model change queue рдХрд░рддрд╛ рд╣реИ,/crestodian yesreply рдХрд░рддрд╛ рд╣реИ, рдФрд░ audit/config write path рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред
- message-channel rescue command рд╕рддрд╣ рдХреЗ рд▓рд┐рдП opt-in belt-and-suspenders рдЬрд╛рдВрдЪред рдпрд╣
- Crestodian planner Docker smoke:
pnpm test:docker:crestodian-planner- configless container рдореЗрдВ Crestodian рдХреЛ
PATHрдкрд░ fake Claude CLI рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рддрд╛ рд╣реИ рдФрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ fuzzy planner fallback audited typed config write рдореЗрдВ translate рд╣реЛрддрд╛ рд╣реИред
- configless container рдореЗрдВ Crestodian рдХреЛ
- Crestodian first-run Docker smoke:
pnpm test:docker:crestodian-first-run- рдЦрд╛рд▓реА OpenClaw state dir рд╕реЗ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, modern onboard Crestodian entrypoint рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ, setup/model/agent/Discord Plugin + SecretRef writes рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, config validate рдХрд░рддрд╛ рд╣реИ, рдФрд░ audit entries рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╡рд╣реА Ring 0 setup path QA Lab рдореЗрдВ рднреА
pnpm openclaw qa suite --scenario crestodian-ring-zero-setupрджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рд╣реИред
- рдЦрд╛рд▓реА OpenClaw state dir рд╕реЗ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, modern onboard Crestodian entrypoint рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ, setup/model/agent/Discord Plugin + SecretRef writes рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, config validate рдХрд░рддрд╛ рд╣реИ, рдФрд░ audit entries рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╡рд╣реА Ring 0 setup path QA Lab рдореЗрдВ рднреА
- Moonshot/Kimi cost smoke:
MOONSHOT_API_KEYрд╕реЗрдЯ рд╣реЛрдиреЗ рдкрд░,openclaw models list --provider moonshot --jsonрдЪрд▓рд╛рдПрдБ, рдлрд┐рд░moonshot/kimi-k2.6рдХреЗ рд╡рд┐рд░реБрджреНрдз isolatedopenclaw agent --local --session-id live-kimi-cost --message 'Reply exactly: KIMI_LIVE_OK' --thinking off --jsonрдЪрд▓рд╛рдПрдБред рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВ рдХрд┐ JSON Moonshot/K2.6 рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ assistant transcript normalizedusage.costрд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред
QA-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░рдирд░
рдЬрдм рдЖрдкрдХреЛ QA-lab рдпрдерд╛рд░реНрдерд╡рд╛рдж рдЪрд╛рд╣рд┐рдП, рдпреЗ рдХрдорд╛рдВрдб рдореБрдЦреНрдп рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ рдХреЗ рд╕рд╛рде рдмреИрдарддреЗ рд╣реИрдВ:
CI QA Lab рдХреЛ dedicated workflows рдореЗрдВ рдЪрд▓рд╛рддрд╛ рд╣реИред Agentic parity QA-Lab - All Lanes рдФрд░ release validation рдХреЗ рддрд╣рдд nested рд╣реИ, standalone PR workflow рдирд╣реАрдВред рд╡реНрдпрд╛рдкрдХ validation рдХреЛ rerun_group=qa-parity рдпрд╛ release-checks QA group рдХреЗ рд╕рд╛рде Full Release Validation рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред Stable/default release checks exhaustive live/Docker soak рдХреЛ run_release_soak=true рдХреЗ рдкреАрдЫреЗ рд░рдЦрддреЗ рд╣реИрдВ; full profile soak рдХреЛ force рдХрд░рддрд╛ рд╣реИред QA-Lab - All Lanes main рдкрд░ nightly рдФрд░ manual dispatch рд╕реЗ mock parity lane, live Matrix lane, Convex-managed live Telegram lane, рдФрд░ Convex-managed live Discord lane рдХреЛ parallel jobs рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рд╛рддрд╛ рд╣реИред Scheduled QA рдФрд░ release checks Matrix --profile fast рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ pass рдХрд░рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ Matrix CLI рдФрд░ manual workflow input default all рдмрдиреЗ рд░рд╣рддреЗ рд╣реИрдВ; manual dispatch all рдХреЛ transport, media, e2ee-smoke, e2ee-deep, рдФрд░ e2ee-cli jobs рдореЗрдВ shard рдХрд░ рд╕рдХрддрд╛ рд╣реИред OpenClaw Release Checks release approval рд╕реЗ рдкрд╣рд▓реЗ parity plus fast Matrix рдФрд░ Telegram lanes рдЪрд▓рд╛рддрд╛ рд╣реИ, release transport checks рдХреЗ рд▓рд┐рдП mock-openai/gpt-5.5 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рддрд╛рдХрд┐ рд╡реЗ deterministic рд░рд╣реЗрдВ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп provider-plugin startup рд╕реЗ рдмрдЪреЗрдВред рдпреЗ live transport gateways memory search рдЕрдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВ; memory behavior QA parity suites рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рд░рд╣рддрд╛ рд╣реИред
Full release live media shards ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ ffmpeg рдФрд░ ffprobe рд╣реИрдВред Docker live model/backend shards рдЪрдпрдирд┐рдд commit рдкрд░ рдПрдХ рдмрд╛рд░ built shared ghcr.io/openclaw/openclaw-live-test:<sha> image рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╣рд░ shard рдореЗрдВ rebuild рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЙрд╕реЗ OPENCLAW_SKIP_DOCKER_BUILD=1 рдХреЗ рд╕рд╛рде pull рдХрд░рддреЗ рд╣реИрдВред
pnpm openclaw qa suite- рд░реЗрдкреЛ-рд╕рдорд░реНрдерд┐рдд QA рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЛ рд╕реАрдзреЗ рд╣реЛрд╕реНрдЯ рдкрд░ рдЪрд▓рд╛рддрд╛ рд╣реИред
- рдЪреБрдиреЗ рдЧрдП рдкрд░рд┐рджреГрд╢реНрдп рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп
qa-evidence.json,qa-suite-summary.json, рдФрд░qa-suite-report.mdрдЖрд░реНрдЯрд┐рдлреИрдХреНрдЯ рд▓рд┐рдЦрддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рдорд┐рд╢реНрд░рд┐рдд flow, Vitest, рдФрд░ Playwright рдкрд░рд┐рджреГрд╢реНрдп рдЪрдпрди рд╢рд╛рдорд┐рд▓ рд╣реИрдВред - рдЬрдм
pnpm openclaw qa run --qa-profile <profile>рджреНрд╡рд╛рд░рд╛ рдбрд┐рд╕реНрдкреИрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЪреБрдиреЗ рдЧрдП taxonomy profile scorecard рдХреЛ рдЙрд╕реАqa-evidence.jsonрдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░рддрд╛ рд╣реИредsmoke-ciрдкрддрд▓рд╛ evidence рд▓рд┐рдЦрддрд╛ рд╣реИ, рдЬреЛevidenceMode: "slim"рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддрд┐-рдПрдВрдЯреНрд░реАexecutionрдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИредreleasecurated release-readiness slice рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИ;allрд╣рд░ рд╕рдХреНрд░рд┐рдп maturity category рдЪреБрдирддрд╛ рд╣реИ рдФрд░ explicit QA Profile Evidence workflow dispatches рдХреЗ рд▓рд┐рдП рд╣реИ рдЬрдм full scorecard artifact рдХреА рдЬрд░реВрд░рдд рд╣реЛред - рдЕрд▓рдЧ-рдерд▓рдЧ gateway workers рдХреЗ рд╕рд╛рде default рд░реВрдк рд╕реЗ рдХрдИ рдЪреБрдиреЗ рдЧрдП рдкрд░рд┐рджреГрд╢реНрдп рд╕рдорд╛рдирд╛рдВрддрд░ рдЪрд▓рд╛рддрд╛ рд╣реИред
qa-channelconcurrency 4 рдкрд░ default рд╣реЛрддрд╛ рд╣реИ (рдЪреБрдиреЗ рдЧрдП scenario count рд╕реЗ рд╕реАрдорд┐рдд)ред worker count рдХреЛ tune рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП--concurrency <count>рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдпрд╛ рдкреБрд░рд╛рдиреЗ serial lane рдХреЗ рд▓рд┐рдП--concurrency 1ред - рдХрд┐рд╕реА рднреА рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ fail рд╣реЛрдиреЗ рдкрд░ non-zero exit рдХрд░рддрд╛ рд╣реИред рдЬрдм рдЖрдк
failing exit code рдХреЗ рдмрд┐рдирд╛ artifacts рдЪрд╛рд╣рддреЗ рд╣реЛрдВ рддреЛ
--allow-failuresрдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред - provider modes
live-frontier,mock-openai, рдФрд░aimockрдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИредaimockexperimental fixture рдФрд░ protocol-mock coverage рдХреЗ рд▓рд┐рдП local AIMock-backed provider server рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рдмрд┐рдирд╛ scenario-awaremock-openailane рдХреЛ рдмрджрд▓рддреЗ рд╣реБрдПред
pnpm openclaw qa coverage --match <query>- scenario IDs, titles, surfaces, coverage IDs, docs refs, code refs, plugins, рдФрд░ provider requirements рдЦреЛрдЬрддрд╛ рд╣реИ, рдлрд┐рд░ matching suite targets рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИред
- QA Lab run рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрдм рдЖрдкрдХреЛ touched behavior рдпрд╛ file path рдкрддрд╛ рд╣реЛ рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛ scenario рдирд╣реАрдВред рдпрд╣ рдХреЗрд╡рд▓ рд╕рд▓рд╛рд╣рдХрд╛рд░реА рд╣реИ; рдлрд┐рд░ рднреА рдмрджрд▓реЗ рдЬрд╛ рд░рд╣реЗ behavior рд╕реЗ mock, live, Multipass, Matrix, рдпрд╛ transport proof рдЪреБрдиреЗрдВред
pnpm test:plugins:kitchen-sink-live- QA Lab рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ live OpenAI Kitchen Sink plugin gauntlet рдЪрд▓рд╛рддрд╛ рд╣реИред рдпрд╣
external Kitchen Sink package install рдХрд░рддрд╛ рд╣реИ, plugin SDK surface
inventory рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ,
/healthzрдФрд░/readyzprobe рдХрд░рддрд╛ рд╣реИ, gateway CPU/RSS evidence рд░рд┐рдХреЙрд░реНрдб рдХрд░рддрд╛ рд╣реИ, live OpenAI turn рдЪрд▓рд╛рддрд╛ рд╣реИ, рдФрд░ adversarial diagnostics рдЬрд╛рдВрдЪрддрд╛ рд╣реИредOPENAI_API_KEYрдЬреИрд╕реЗ live OpenAI auth рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред hydrated Testbox sessions рдореЗрдВ, рдЬрдмopenclaw-testbox-envhelper рдореМрдЬреВрдж рд╣реЛ рддреЛ рдпрд╣ рдЕрдкрдиреЗ рдЖрдк Testbox live-auth profile source рдХрд░рддрд╛ рд╣реИред
- QA Lab рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ live OpenAI Kitchen Sink plugin gauntlet рдЪрд▓рд╛рддрд╛ рд╣реИред рдпрд╣
external Kitchen Sink package install рдХрд░рддрд╛ рд╣реИ, plugin SDK surface
inventory рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ,
pnpm test:gateway:cpu-scenarios- gateway startup bench рдФрд░ рдЫреЛрдЯрд╛ mock QA Lab scenario pack
(
channel-chat-baseline,memory-failure-fallback,gateway-restart-inflight-run) рдЪрд▓рд╛рддрд╛ рд╣реИ рдФрд░ combined CPU observation summary.artifacts/gateway-cpu-scenarios/рдХреЗ рдЕрдВрджрд░ рд▓рд┐рдЦрддрд╛ рд╣реИред - default рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ sustained hot CPU observations flag рдХрд░рддрд╛ рд╣реИ (
--cpu-core-warnplus--hot-wall-warn-ms), рдЗрд╕рд▓рд┐рдП рдЫреЛрдЯреЗ startup bursts metrics рдХреЗ рд░реВрдк рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рд╣реЛрддреЗ рд╣реИрдВ рдмрд┐рдирд╛ minutes-long gateway peg regression рдЬреИрд╕реЗ рджрд┐рдЦреЗред - built
distartifacts рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ; рдЬрдм checkout рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ fresh runtime output рди рд╣реЛ рддреЛ рдкрд╣рд▓реЗ build рдЪрд▓рд╛рдПрдВред
- gateway startup bench рдФрд░ рдЫреЛрдЯрд╛ mock QA Lab scenario pack
(
pnpm openclaw qa suite --runner multipass- рд╡рд╣реА QA suite disposable Multipass Linux VM рдХреЗ рдЕрдВрджрд░ рдЪрд▓рд╛рддрд╛ рд╣реИред
- host рдкрд░
qa suiteрдЬреИрд╕реА рд╣реА scenario-selection behavior рд░рдЦрддрд╛ рд╣реИред qa suiteрдЬреИрд╕реЗ рд╣реА provider/model selection flags рдлрд┐рд░ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред- Live runs guest рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ supported QA auth inputs forward рдХрд░рддреЗ рд╣реИрдВ:
env-based provider keys, QA live provider config path, рдФрд░
CODEX_HOMEрдЬрдм рдореМрдЬреВрдж рд╣реЛред - Output dirs repo root рдХреЗ рдЕрдВрджрд░ рд╣реА рд░рд╣рдиреЗ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ guest mounted workspace рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд╛рдкрд╕ рд▓рд┐рдЦ рд╕рдХреЗред
- normal QA report + summary рдФрд░ Multipass logs
.artifacts/qa-e2e/...рдХреЗ рдЕрдВрджрд░ рд▓рд┐рдЦрддрд╛ рд╣реИред
pnpm qa:lab:up- operator-style QA work рдХреЗ рд▓рд┐рдП Docker-backed QA site рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред
pnpm test:docker:npm-onboard-channel-agent- current checkout рд╕реЗ npm tarball рдмрдирд╛рддрд╛ рд╣реИ, Docker рдореЗрдВ globally install рдХрд░рддрд╛ рд╣реИ, non-interactive OpenAI API-key onboarding рдЪрд▓рд╛рддрд╛ рд╣реИ, default рд░реВрдк рд╕реЗ Telegram configure рдХрд░рддрд╛ рд╣реИ, startup dependency repair рдХреЗ рдмрд┐рдирд╛ packaged plugin runtime load рд╣реЛрдирд╛ verify рдХрд░рддрд╛ рд╣реИ, doctor рдЪрд▓рд╛рддрд╛ рд╣реИ, рдФрд░ mocked OpenAI endpoint рдХреЗ рд╡рд┐рд░реБрджреНрдз рдПрдХ local agent turn рдЪрд▓рд╛рддрд╛ рд╣реИред
- Discord рдХреЗ рд╕рд╛рде рд╡рд╣реА packaged-install
lane рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП
OPENCLAW_NPM_ONBOARD_CHANNEL=discordрдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
pnpm test:docker:session-runtime-context- embedded runtime context
transcripts рдХреЗ рд▓рд┐рдП deterministic built-app Docker smoke рдЪрд▓рд╛рддрд╛ рд╣реИред рдпрд╣ verify рдХрд░рддрд╛ рд╣реИ рдХрд┐ hidden OpenClaw runtime context visible user turn рдореЗрдВ leak рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп
non-display custom message рдХреЗ рд░реВрдк рдореЗрдВ persisted рд╣реИ,
рдлрд┐рд░ affected broken session JSONL seed рдХрд░рддрд╛ рд╣реИ рдФрд░ verify рдХрд░рддрд╛ рд╣реИ рдХрд┐
openclaw doctor --fixрдЙрд╕реЗ backup рдХреЗ рд╕рд╛рде active branch рдореЗрдВ rewrite рдХрд░рддрд╛ рд╣реИред
- embedded runtime context
transcripts рдХреЗ рд▓рд┐рдП deterministic built-app Docker smoke рдЪрд▓рд╛рддрд╛ рд╣реИред рдпрд╣ verify рдХрд░рддрд╛ рд╣реИ рдХрд┐ hidden OpenClaw runtime context visible user turn рдореЗрдВ leak рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп
non-display custom message рдХреЗ рд░реВрдк рдореЗрдВ persisted рд╣реИ,
рдлрд┐рд░ affected broken session JSONL seed рдХрд░рддрд╛ рд╣реИ рдФрд░ verify рдХрд░рддрд╛ рд╣реИ рдХрд┐
pnpm test:docker:npm-telegram-live- Docker рдореЗрдВ OpenClaw package candidate install рдХрд░рддрд╛ рд╣реИ, installed-package onboarding рдЪрд▓рд╛рддрд╛ рд╣реИ, installed CLI рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ Telegram configure рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рдЙрд╕ installed package рдХреЛ SUT Gateway рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП live Telegram QA lane рдлрд┐рд░ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
- wrapper checkout рд╕реЗ рдХреЗрд╡рд▓
qa-labharness source mount рдХрд░рддрд╛ рд╣реИ; installed packagedist,openclaw/plugin-sdk, рдФрд░ bundled plugin runtime рдХрд╛ рдорд╛рд▓рд┐рдХ рд╣реЛрддрд╛ рд╣реИ рддрд╛рдХрд┐ lane current checkout plugins рдХреЛ test рдХреЗ рдЕрдВрддрд░реНрдЧрдд package рдореЗрдВ mix рди рдХрд░реЗред - default
OPENCLAW_NPM_TELEGRAM_PACKAGE_SPEC=openclaw@betaрд╣реЛрддрд╛ рд╣реИ; registry рд╕реЗ install рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп resolved local tarball test рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПOPENCLAW_NPM_TELEGRAM_PACKAGE_TGZ=/path/to/openclaw-current.tgzрдпрд╛OPENCLAW_CURRENT_PACKAGE_TGZрд╕реЗрдЯ рдХрд░реЗрдВред - default рд░реВрдк рд╕реЗ
qa-evidence.jsonрдореЗрдВ repeated RTT timing emit рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВOPENCLAW_NPM_TELEGRAM_RTT_SAMPLES=20рд╣реЛрддрд╛ рд╣реИред RTT run tune рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПOPENCLAW_NPM_TELEGRAM_RTT_SAMPLES,OPENCLAW_NPM_TELEGRAM_RTT_TIMEOUT_MS, рдпрд╛OPENCLAW_NPM_TELEGRAM_RTT_MAX_FAILURESoverride рдХрд░реЗрдВредOPENCLAW_NPM_TELEGRAM_RTT_CHECKSsample рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Telegram QA check IDs рдХреА comma-separated list рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ; unset рд╣реЛрдиреЗ рдкрд░ default RTT-capable checktelegram-mentioned-message-replyрд╣реИред pnpm openclaw qa telegramрдЬреИрд╕реЗ рд╣реА Telegram env credentials рдпрд╛ Convex credential source рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред CI/release automation рдХреЗ рд▓рд┐рдП,OPENCLAW_NPM_TELEGRAM_CREDENTIAL_SOURCE=convexplusOPENCLAW_QA_CONVEX_SITE_URLрдФрд░ role secret рд╕реЗрдЯ рдХрд░реЗрдВред рдпрджрд┐OPENCLAW_QA_CONVEX_SITE_URLрдФрд░ Convex role secret CI рдореЗрдВ рдореМрдЬреВрдж рд╣реИрдВ, рддреЛ Docker wrapper Convex рдЕрдкрдиреЗ рдЖрдк рдЪреБрдирддрд╛ рд╣реИред- Docker build/install work рд╕реЗ рдкрд╣рд▓реЗ wrapper host рдкрд░ Telegram рдпрд╛ Convex credential env validate рдХрд░рддрд╛ рд╣реИред
OPENCLAW_NPM_TELEGRAM_SKIP_CREDENTIAL_PREFLIGHT=1рдХреЗрд╡рд▓ рддрдм рд╕реЗрдЯ рдХрд░реЗрдВ рдЬрдм рдЬрд╛рдирдмреВрдЭрдХрд░ pre-credential setup debug рдХрд░ рд░рд╣реЗ рд╣реЛрдВред OPENCLAW_NPM_TELEGRAM_CREDENTIAL_ROLE=ci|maintainerрдЗрд╕ lane рдХреЗ рд▓рд┐рдП рд╣реА sharedOPENCLAW_QA_CREDENTIAL_ROLEoverride рдХрд░рддрд╛ рд╣реИред рдЬрдм Convex credentials рдЪреБрдиреЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдХреЛрдИ role set рдирд╣реАрдВ рд╣реЛрддрд╛, wrapper CI рдореЗрдВciрдФрд░ CI рдХреЗ рдмрд╛рд╣рд░maintainerрдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред- GitHub Actions рдЗрд╕ lane рдХреЛ manual maintainer workflow
NPM Telegram Beta E2EрдХреЗ рд░реВрдк рдореЗрдВ expose рдХрд░рддрд╛ рд╣реИред рдпрд╣ merge рдкрд░ рдирд╣реАрдВ рдЪрд▓рддрд╛ред workflowqa-live-sharedenvironment рдФрд░ Convex CI credential leases рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
- GitHub Actions side-run product proof рдХреЗ рд▓рд┐рдП
Package AcceptanceрднреА expose рдХрд░рддрд╛ рд╣реИ рдПрдХ candidate package рдХреЗ рд╡рд┐рд░реБрджреНрдзред рдпрд╣ trusted ref, published npm spec, HTTPS tarball URL plus SHA-256, рдпрд╛ рджреВрд╕рд░реЗ run рд╕реЗ tarball artifact рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, normalizedopenclaw-current.tgzрдХреЛpackage-under-testрдХреЗ рд░реВрдк рдореЗрдВ upload рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ smoke, package, product, full, рдпрд╛ custom lane profiles рдХреЗ рд╕рд╛рде existing Docker E2E scheduler рдЪрд▓рд╛рддрд╛ рд╣реИред рдЙрд╕реАpackage-under-testartifact рдХреЗ рд╡рд┐рд░реБрджреНрдз Telegram QA workflow рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдПtelegram_mode=mock-openaiрдпрд╛live-frontierрд╕реЗрдЯ рдХрд░реЗрдВред- Latest beta product proof:
gh workflow run package-acceptance.yml --ref main \ -f source=npm \ -f package_spec=openclaw@beta \ -f suite_profile=product \ -f telegram_mode=mock-openai- Exact tarball URL proof рдХреЛ digest рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ public URL safety policy рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:
gh workflow run package-acceptance.yml --ref main \ -f source=url \ -f package_url=https://registry.npmjs.org/openclaw/-/openclaw-VERSION.tgz \ -f package_sha256=<sha256> \ -f suite_profile=package- Enterprise/private tarball mirrors explicit trusted-source policy рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
gh workflow run package-acceptance.yml --ref main \ -f source=trusted-url \ -f trusted_source_id=enterprise-artifactory \ -f package_url=https://packages.example.internal:8443/artifactory/openclaw/openclaw-VERSION.tgz \ -f package_sha256=<sha256> \ -f suite_profile=packagesource=trusted-url trusted workflow ref рд╕реЗ .github/package-trusted-sources.json рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ URL credentials рдпрд╛ workflow-input private-network bypass рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ред рдпрджрд┐ named policy bearer auth declare рдХрд░рддреА рд╣реИ, рддреЛ fixed OPENCLAW_TRUSTED_PACKAGE_TOKEN secret configure рдХрд░реЗрдВред
- Artifact proof рджреВрд╕рд░реЗ Actions run рд╕реЗ tarball artifact download рдХрд░рддрд╛ рд╣реИ:
gh workflow run package-acceptance.yml --ref main \ -f source=artifact \ -f artifact_run_id=<run-id> \ -f artifact_name=<artifact-name> \ -f suite_profile=smoke-
pnpm test:docker:plugins- Docker рдореЗрдВ current OpenClaw build pack рдФрд░ install рдХрд░рддрд╛ рд╣реИ, OpenAI configured рдХреЗ рд╕рд╛рде Gateway рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ config edits рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ bundled channel/plugins enable рдХрд░рддрд╛ рд╣реИред
- verify рдХрд░рддрд╛ рд╣реИ рдХрд┐ setup discovery unconfigured downloadable plugins рдХреЛ absent рдЫреЛрдбрд╝рддреА рд╣реИ, рдкрд╣рд▓рд╛ configured doctor repair рд╣рд░ missing downloadable plugin рдХреЛ explicitly install рдХрд░рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ restart hidden dependency repair рдирд╣реАрдВ рдЪрд▓рд╛рддрд╛ред
- рд╕рд╛рде рд╣реА known older npm baseline install рдХрд░рддрд╛ рд╣реИ,
openclaw update --tag <candidate>рдЪрд▓рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ Telegram enable рдХрд░рддрд╛ рд╣реИ, рдФрд░ verify рдХрд░рддрд╛ рд╣реИ рдХрд┐ candidate рдХрд╛ post-update doctor legacy plugin dependency debris рдХреЛ рдмрд┐рдирд╛ harness-side postinstall repair рдХреЗ clean рдХрд░рддрд╛ рд╣реИред
-
pnpm test:parallels:npm-update-
Parallels guests рдХреЗ across native packaged-install update smoke рдЪрд▓рд╛рддрд╛ рд╣реИред рд╣рд░ рдЪреБрдирд╛ рдЧрдпрд╛ platform рдкрд╣рд▓реЗ requested baseline package install рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рдЙрд╕реА guest рдореЗрдВ installed
openclaw updatecommand рдЪрд▓рд╛рддрд╛ рд╣реИ рдФрд░ installed version, update status, gateway readiness, рдФрд░ рдПрдХ local agent turn verify рдХрд░рддрд╛ рд╣реИред -
рдПрдХ guest рдкрд░ iterate рдХрд░рддреЗ рд╕рдордп
--platform macos,--platform windows, рдпрд╛--platform linuxрдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред summary artifact path рдФрд░ per-lane status рдХреЗ рд▓рд┐рдП--jsonрдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред -
OpenAI lane default рд░реВрдк рд╕реЗ live agent-turn proof рдХреЗ рд▓рд┐рдП
openai/gpt-5.5рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдХрд┐рд╕реА рджреВрд╕рд░реЗ OpenAI model рдХреЛ рдЬрд╛рдирдмреВрдЭрдХрд░ validate рдХрд░рддреЗ рд╕рдордп--model <provider/model>рдкрд╛рд╕ рдХрд░реЗрдВ рдпрд╛OPENCLAW_PARALLELS_OPENAI_MODELрд╕реЗрдЯ рдХрд░реЗрдВред -
рд▓рдВрдмреЗ local runs рдХреЛ host timeout рдореЗрдВ wrap рдХрд░реЗрдВ рддрд╛рдХрд┐ Parallels transport stalls testing window рдХрд╛ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕рд╛ consume рди рдХрд░ рд╕рдХреЗрдВ:
bash timeout --foreground 150m pnpm test:parallels:npm-update -- --jsontimeout --foreground 90m pnpm test:parallels:npm-update -- --platform windows --json -
script nested lane logs
/tmp/openclaw-parallels-npm-update.*рдХреЗ рдЕрдВрджрд░ рд▓рд┐рдЦрддрд╛ рд╣реИред outer wrapper рдХреЗ hung рд╣реЛрдиреЗ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗwindows-update.log,macos-update.log, рдпрд╛linux-update.loginspect рдХрд░реЗрдВред -
Windows update cold guest рдкрд░ post-update doctor рдФрд░ package update work рдореЗрдВ 10 рд╕реЗ 15 рдорд┐рдирдЯ рдЦрд░реНрдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реИ; nested npm debug log advance рд╣реЛ рд░рд╣рд╛ рд╣реЛ рддреЛ рдпрд╣ рдЕрднреА рднреА healthy рд╣реИред
-
рдЗрд╕ aggregate wrapper рдХреЛ individual Parallels macOS, Windows, рдпрд╛ Linux smoke lanes рдХреЗ рд╕рд╛рде parallel рдореЗрдВ рди рдЪрд▓рд╛рдПрдВред рд╡реЗ VM state share рдХрд░рддреЗ рд╣реИрдВ рдФрд░ snapshot restore, package serving, рдпрд╛ guest gateway state рдкрд░ collide рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
-
post-update proof normal bundled plugin surface рдЪрд▓рд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ speech, image generation, рдФрд░ media understanding рдЬреИрд╕реА capability facades bundled runtime APIs рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ loaded рд╣реЛрддреА рд╣реИрдВ, рднрд▓реЗ рд╣реА agent turn рд╕реНрд╡рдпрдВ рдХреЗрд╡рд▓ simple text response check рдХрд░реЗред
-
-
pnpm openclaw qa aimock- рд╕реАрдзреЗ protocol smoke рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ local AIMock provider server рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ.
-
pnpm openclaw qa matrix- Disposable Docker-backed Tuwunel homeserver рдХреЗ рд╡рд┐рд░реБрджреНрдз Matrix live QA lane рдЪрд▓рд╛рддрд╛ рд╣реИ. рдХреЗрд╡рд▓ source-checkout - packaged installs рдореЗрдВ
qa-labship рдирд╣реАрдВ рд╣реЛрддрд╛. - рдкреВрд░рд╛ CLI, profile/scenario catalog, env vars, рдФрд░ artifact layout: Matrix QA.
- Disposable Docker-backed Tuwunel homeserver рдХреЗ рд╡рд┐рд░реБрджреНрдз Matrix live QA lane рдЪрд▓рд╛рддрд╛ рд╣реИ. рдХреЗрд╡рд▓ source-checkout - packaged installs рдореЗрдВ
-
pnpm openclaw qa telegram- env рд╕реЗ driver рдФрд░ SUT bot tokens рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ private group рдХреЗ рд╡рд┐рд░реБрджреНрдз Telegram live QA lane рдЪрд▓рд╛рддрд╛ рд╣реИ.
OPENCLAW_QA_TELEGRAM_GROUP_ID,OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN, рдФрд░OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKENрдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ. group id numeric Telegram chat id рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП.- Shared pooled credentials рдХреЗ рд▓рд┐рдП
--credential-source convexрдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ. default рд░реВрдк рд╕реЗ env mode рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдпрд╛ pooled leases рдореЗрдВ opt in рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПOPENCLAW_QA_CREDENTIAL_SOURCE=convexрд╕реЗрдЯ рдХрд░реЗрдВ. - Defaults рдореЗрдВ canary, mention gating, command addressing,
/status, bot-to-bot mentioned replies, рдФрд░ core native command replies рд╢рд╛рдорд┐рд▓ рд╣реИрдВ.mock-openaidefaults deterministic reply-chain рдФрд░ Telegram final-message streaming regressions рдХреЛ рднреА cover рдХрд░рддреЗ рд╣реИрдВ.session_statusрдЬреИрд╕реЗ optional probes рдХреЗ рд▓рд┐рдП--list-scenariosрдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ. - рдХреЛрдИ рднреА scenario fail рд╣реЛрдиреЗ рдкрд░ non-zero exit рдХрд░рддрд╛ рд╣реИ. рдЬрдм рдЖрдк failing exit code рдХреЗ рдмрд┐рдирд╛ artifacts рдЪрд╛рд╣рддреЗ рд╣реЛрдВ, рддреЛ
--allow-failuresрдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ. - рдПрдХ рд╣реА private group рдореЗрдВ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ bots рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ SUT bot Telegram username expose рдХрд░рддрд╛ рд╣реЛ.
- Stable bot-to-bot observation рдХреЗ рд▓рд┐рдП, рджреЛрдиреЛрдВ bots рдХреЗ рд▓рд┐рдП
@BotFatherрдореЗрдВ Bot-to-Bot Communication Mode enable рдХрд░реЗрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ driver bot group bot traffic observe рдХрд░ рд╕рдХрддрд╛ рд╣реИ. .artifacts/qa-e2e/...рдХреЗ рдЕрдВрддрд░реНрдЧрдд Telegram QA report, summary, рдФрд░qa-evidence.jsonрд▓рд┐рдЦрддрд╛ рд╣реИ. Replying scenarios рдореЗрдВ driver send request рд╕реЗ observed SUT reply рддрдХ RTT рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ.
Mantis Telegram Live рдЗрд╕ lane рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ PR-evidence wrapper рд╣реИ. рдпрд╣
candidate ref рдХреЛ Convex-leased Telegram credentials рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рддрд╛ рд╣реИ, redacted QA
report/evidence bundle рдХреЛ Crabbox desktop browser рдореЗрдВ render рдХрд░рддрд╛ рд╣реИ, MP4 evidence record рдХрд░рддрд╛ рд╣реИ,
motion-trimmed GIF generate рдХрд░рддрд╛ рд╣реИ, artifact bundle upload рдХрд░рддрд╛ рд╣реИ, рдФрд░ pr_number рд╕реЗрдЯ рд╣реЛрдиреЗ рдкрд░ Mantis GitHub App рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ inline PR
evidence post рдХрд░рддрд╛ рд╣реИ. Maintainers рдЗрд╕реЗ Actions UI рд╕реЗ Mantis Scenario (scenario_id: telegram-live) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпрд╛ рд╕реАрдзреЗ pull request comment рд╕реЗ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
@openclaw-mantis telegram@openclaw-mantis telegram scenario=telegram-status-command@openclaw-mantis telegram scenarios=telegram-status-command,telegram-mentioned-message-replyMantis Telegram Desktop Proof PR visual proof рдХреЗ рд▓рд┐рдП agentic native Telegram Desktop
before/after wrapper рд╣реИ. рдЗрд╕реЗ Actions UI рд╕реЗ
freeform instructions рдХреЗ рд╕рд╛рде, Mantis Scenario (scenario_id: telegram-desktop-proof) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдпрд╛ PR comment рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ:
@openclaw-mantis telegram desktop proofMantis agent PR рдкрдврд╝рддрд╛ рд╣реИ, рддрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ Telegram-visible behavior рдмрджрд▓рд╛рд╡ рдХреЛ prove рдХрд░рддрд╛ рд╣реИ,
baseline рдФрд░ candidate refs рдкрд░ real-user Crabbox Telegram Desktop proof lane рдЪрд▓рд╛рддрд╛ рд╣реИ,
native GIFs рдЙрдкрдпреЛрдЧреА рд╣реЛрдиреЗ рддрдХ iterate рдХрд░рддрд╛ рд╣реИ, paired
motionPreview manifest рд▓рд┐рдЦрддрд╛ рд╣реИ, рдФрд░ pr_number рд╕реЗрдЯ рд╣реЛрдиреЗ рдкрд░ Mantis GitHub App рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд╣реА 2-column GIF table post рдХрд░рддрд╛ рд╣реИ.
pnpm openclaw qa mantis telegram-desktop-builder- Crabbox Linux desktop lease рдпрд╛ reuse рдХрд░рддрд╛ рд╣реИ, native Telegram Desktop install рдХрд░рддрд╛ рд╣реИ, leased Telegram SUT bot token рдХреЗ рд╕рд╛рде OpenClaw configure рдХрд░рддрд╛ рд╣реИ, gateway рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ visible VNC desktop рд╕реЗ screenshot/MP4 evidence record рдХрд░рддрд╛ рд╣реИ.
- Default
--credential-source convexрд╣реИ рддрд╛рдХрд┐ workflows рдХреЛ рдХреЗрд╡рд▓ Convex broker secret рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ.pnpm openclaw qa telegramрдЬреИрд╕реЗ рд╣реАOPENCLAW_QA_TELEGRAM_*variables рдХреЗ рд╕рд╛рде--credential-source envрдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ. - Telegram Desktop рдХреЛ рдЕрднреА рднреА user login/profile рдЪрд╛рд╣рд┐рдП. bot token рдХреЗрд╡рд▓ OpenClaw configure рдХрд░рддрд╛ рд╣реИ. base64
.tgzprofile archive рдХреЗ рд▓рд┐рдП--telegram-profile-archive-env <name>рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдпрд╛--keep-leaseрдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ VNC рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдмрд╛рд░ manually log in рдХрд░реЗрдВ. - Output directory рдХреЗ рдЕрдВрддрд░реНрдЧрдд
mantis-telegram-desktop-builder-report.md,mantis-telegram-desktop-builder-summary.json,telegram-desktop-builder.png, рдФрд░telegram-desktop-builder.mp4рд▓рд┐рдЦрддрд╛ рд╣реИ.
Live transport lanes рдПрдХ standard contract рд╕рд╛рдЭрд╛ рдХрд░рддреА рд╣реИрдВ рддрд╛рдХрд┐ рдирдП transports drift рди рдХрд░реЗрдВ; per-lane coverage matrix QA overview тЖТ Live transport coverage рдореЗрдВ рд╣реИ. qa-channel broad synthetic suite рд╣реИ рдФрд░ рдЙрд╕ matrix рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИ.
Convex рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд╛рдЭрд╛ Telegram credentials (v1)
рдЬрдм live transport QA рдХреЗ рд▓рд┐рдП --credential-source convex (рдпрд╛ OPENCLAW_QA_CREDENTIAL_SOURCE=convex) enabled рд╣реЛрддрд╛ рд╣реИ,
QA lab Convex-backed pool рд╕реЗ exclusive lease acquire рдХрд░рддрд╛ рд╣реИ, lane рдЪрд▓рдиреЗ рдХреЗ рджреМрд░рд╛рди рдЙрд╕
lease рдХреЛ heartbeat рдХрд░рддрд╛ рд╣реИ, рдФрд░ shutdown рдкрд░ lease release рдХрд░рддрд╛ рд╣реИ. Section name
Discord, Slack, рдФрд░ WhatsApp support рд╕реЗ рдкрд╣рд▓реЗ рдХрд╛ рд╣реИ; lease contract рд╕рднреА kinds рдореЗрдВ shared рд╣реИ.
Reference Convex project scaffold:
qa/convex-credential-broker/
Required env vars:
OPENCLAW_QA_CONVEX_SITE_URL(рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдПhttps://your-deployment.convex.site)- Selected role рдХреЗ рд▓рд┐рдП рдПрдХ secret:
OPENCLAW_QA_CONVEX_SECRET_MAINTAINERmaintainerрдХреЗ рд▓рд┐рдПOPENCLAW_QA_CONVEX_SECRET_CIciрдХреЗ рд▓рд┐рдП
- Credential role selection:
- CLI:
--credential-role maintainer|ci - Env default:
OPENCLAW_QA_CREDENTIAL_ROLE(CI рдореЗрдВ defaultci, рдЕрдиреНрдпрдерд╛maintainer)
- CLI:
Optional env vars:
OPENCLAW_QA_CREDENTIAL_LEASE_TTL_MS(default1200000)OPENCLAW_QA_CREDENTIAL_HEARTBEAT_INTERVAL_MS(default30000)OPENCLAW_QA_CREDENTIAL_ACQUIRE_TIMEOUT_MS(default90000)OPENCLAW_QA_CREDENTIAL_HTTP_TIMEOUT_MS(default15000)OPENCLAW_QA_CONVEX_ENDPOINT_PREFIX(default/qa-credentials/v1)OPENCLAW_QA_CREDENTIAL_OWNER_ID(optional trace id)OPENCLAW_QA_ALLOW_INSECURE_HTTP=1local-only development рдХреЗ рд▓рд┐рдП loopbackhttp://Convex URLs allow рдХрд░рддрд╛ рд╣реИ.
рд╕рд╛рдорд╛рдиреНрдп operation рдореЗрдВ OPENCLAW_QA_CONVEX_SITE_URL рдХреЛ https:// рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП.
Maintainer admin commands (pool add/remove/list) рдХреЗ рд▓рд┐рдП
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ OPENCLAW_QA_CONVEX_SECRET_MAINTAINER рдЖрд╡рд╢реНрдпрдХ рд╣реИ.
Maintainers рдХреЗ рд▓рд┐рдП CLI helpers:
pnpm openclaw qa credentials doctorpnpm openclaw qa credentials add --kind telegram --payload-file qa/telegram-credential.jsonpnpm openclaw qa credentials list --kind telegrampnpm openclaw qa credentials remove --credential-id <credential-id>Live runs рд╕реЗ рдкрд╣рд▓реЗ Convex site URL, broker secrets,
endpoint prefix, HTTP timeout, рдФрд░ admin/list reachability рдХреЛ secret values print рдХрд┐рдП рдмрд┐рдирд╛ check рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП doctor рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ. Scripts рдФрд░ CI
utilities рдореЗрдВ machine-readable output рдХреЗ рд▓рд┐рдП --json рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ.
Default endpoint contract (OPENCLAW_QA_CONVEX_SITE_URL + /qa-credentials/v1):
POST /acquire- Request:
{ kind, ownerId, actorRole, leaseTtlMs, heartbeatIntervalMs } - Success:
{ status: "ok", credentialId, leaseToken, payload, leaseTtlMs?, heartbeatIntervalMs? } - Exhausted/retryable:
{ status: "error", code: "POOL_EXHAUSTED" | "NO_CREDENTIAL_AVAILABLE", ... }
- Request:
POST /payload-chunk- Request:
{ kind, ownerId, actorRole, credentialId, leaseToken, index } - Success:
{ status: "ok", index, data }
- Request:
POST /heartbeat- Request:
{ kind, ownerId, actorRole, credentialId, leaseToken, leaseTtlMs } - Success:
{ status: "ok" }(рдпрд╛ empty2xx)
- Request:
POST /release- Request:
{ kind, ownerId, actorRole, credentialId, leaseToken } - Success:
{ status: "ok" }(рдпрд╛ empty2xx)
- Request:
POST /admin/add(рдХреЗрд╡рд▓ maintainer secret)- Request:
{ kind, actorId, payload, note?, status? } - Success:
{ status: "ok", credential }
- Request:
POST /admin/remove(рдХреЗрд╡рд▓ maintainer secret)- Request:
{ credentialId, actorId } - Success:
{ status: "ok", changed, credential } - Active lease guard:
{ status: "error", code: "LEASE_ACTIVE", ... }
- Request:
POST /admin/list(рдХреЗрд╡рд▓ maintainer secret)- Request:
{ kind?, status?, includePayload?, limit? } - Success:
{ status: "ok", credentials, count }
- Request:
Telegram kind рдХреЗ рд▓рд┐рдП payload shape:
{ groupId: string, driverToken: string, sutToken: string }groupIdnumeric Telegram chat id string рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП.admin/addkind: "telegram"рдХреЗ рд▓рд┐рдП рдЗрд╕ shape рдХреЛ validate рдХрд░рддрд╛ рд╣реИ рдФрд░ malformed payloads reject рдХрд░рддрд╛ рд╣реИ.
Telegram real-user kind рдХреЗ рд▓рд┐рдП payload shape:
{ groupId: string, sutToken: string, testerUserId: string, testerUsername: string, telegramApiId: string, telegramApiHash: string, tdlibDatabaseEncryptionKey: string, tdlibArchiveBase64: string, tdlibArchiveSha256: string, desktopTdataArchiveBase64: string, desktopTdataArchiveSha256: string }groupId,testerUserId, рдФрд░telegramApiIdnumeric strings рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП.tdlibArchiveSha256рдФрд░desktopTdataArchiveSha256SHA-256 hex strings рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП.kind: "telegram-user"Mantis Telegram Desktop proof workflow рдХреЗ рд▓рд┐рдП reserved рд╣реИ. Generic QA Lab lanes рдХреЛ рдЗрд╕реЗ acquire рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП.
Broker-validated multi-channel payloads:
- Discord:
{ guildId: string, channelId: string, driverBotToken: string, sutBotToken: string, sutApplicationId: string, voiceChannelId?: string } - WhatsApp:
{ driverPhoneE164: string, sutPhoneE164: string, driverAuthArchiveBase64: string, sutAuthArchiveBase64: string, groupJid?: string }
Slack lanes рднреА pool рд╕реЗ lease рдХрд░ рд╕рдХрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди Slack payload validation рдЕрднреА
broker рдХреЗ рдмрдЬрд╛рдп Slack QA runner рдореЗрдВ рд░рд╣рддрд╛ рд╣реИ. Slack rows рдХреЗ рд▓рд┐рдП
{ channelId: string, driverBotToken: string, sutBotToken: string, sutAppToken: string }
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ.
QA рдореЗрдВ channel рдЬреЛрдбрд╝рдирд╛
рдирдП channel adapters рдХреЗ рд▓рд┐рдП architecture рдФрд░ scenario-helper names QA overview тЖТ Adding a channel рдореЗрдВ рд╣реИрдВ. Minimum bar: shared qa-lab host seam рдкрд░ transport runner implement рдХрд░реЗрдВ, plugin manifest рдореЗрдВ qaRunners declare рдХрд░реЗрдВ, openclaw qa <runner> рдХреЗ рд░реВрдк рдореЗрдВ mount рдХрд░реЗрдВ, рдФрд░ qa/scenarios/ рдХреЗ рдЕрдВрддрд░реНрдЧрдд scenarios author рдХрд░реЗрдВ.
Test suites (рдХрд╣рд╛рдБ рдХреНрдпрд╛ рдЪрд▓рддрд╛ рд╣реИ)
Suites рдХреЛ "рдмрдврд╝рддрд╛ realism" (рдФрд░ рдмрдврд╝рддреА flakiness/cost) рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪреЗрдВ:
Unit / integration (default)
- Command:
pnpm test - Config: untargeted runs
vitest.full-*.config.tsshard set рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ parallel scheduling рдХреЗ рд▓рд┐рдП multi-project shards рдХреЛ per-project configs рдореЗрдВ expand рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - Files:
src/**/*.test.ts,packages/**/*.test.ts, рдФрд░test/**/*.test.tsрдХреЗ рдЕрдВрддрд░реНрдЧрдд core/unit inventories; UI unit tests dedicatedunit-uishard рдореЗрдВ рдЪрд▓рддреЗ рд╣реИрдВ - Scope:
- Pure unit tests
- In-process integration tests (gateway auth, routing, tooling, parsing, config)
- Known bugs рдХреЗ рд▓рд┐рдП deterministic regressions
- Expectations:
- CI рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ
- Real keys рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ
- Fast рдФрд░ stable рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
- Resolver рдФрд░ public-surface loader tests рдХреЛ generated tiny plugin fixtures рдХреЗ рд╕рд╛рде broad
api.jsрдФрд░runtime-api.jsfallback behavior prove рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, real bundled plugin source APIs рдХреЗ рд╕рд╛рде рдирд╣реАрдВ. Real plugin API loads plugin-owned contract/integration suites рдореЗрдВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП.
Native dependency policy:
- Default test installs optional native Discord opus builds skip рдХрд░рддреЗ рд╣реИрдВ. Discord voice bundled
libopus-wasmрдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░@discordjs/opusallowBuildsрдореЗрдВ disabled рд░рд╣рддрд╛ рд╣реИ рддрд╛рдХрд┐ local tests рдФрд░ Testbox lanes native addon compile рди рдХрд░реЗрдВ. - Native opus performance рдХреА рддреБрд▓рдирд╛
libopus-wasmbenchmark repo рдореЗрдВ рдХрд░реЗрдВ, default OpenClaw install/test loops рдореЗрдВ рдирд╣реАрдВ. DefaultallowBuildsрдореЗрдВ@discordjs/opusрдХреЛtrueрдкрд░ set рди рдХрд░реЗрдВ; рдЗрд╕рд╕реЗ unrelated install/test loops native code compile рдХрд░рддреЗ рд╣реИрдВ.
Projects, shards, and scoped lanes
- рдмрд┐рдирд╛ рд▓рдХреНрд╖реНрдп рд╡рд╛рд▓рд╛
pnpm testрдПрдХ рд╡рд┐рд╢рд╛рд▓ рдиреЗрдЯрд┐рд╡ рд░реВрдЯ-рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрдЬрд╛рдп рдмрд╛рд░рд╣ рдЫреЛрдЯреЗ shard configs (core-unit-fast,core-unit-src,core-unit-security,core-unit-ui,core-unit-support,core-support-boundary,core-contracts,core-bundled,core-runtime,agentic,auto-reply,extensions) рдЪрд▓рд╛рддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рд▓реЛрдбреЗрдб рдорд╢реАрдиреЛрдВ рдкрд░ рдкреАрдХ RSS рдШрдЯрддрд╛ рд╣реИ рдФрд░ auto-reply/extension рдХрд╛рд░реНрдп рдЕрд╕рдВрдмрдВрдзрд┐рдд suites рдХреЛ рднреВрдЦрд╛ рд░рдЦрдиреЗ рд╕реЗ рдмрдЪрддрд╛ рд╣реИред pnpm test --watchрдЕрдм рднреА рдиреЗрдЯрд┐рд╡ рд░реВрдЯvitest.config.tsрдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЧреНрд░рд╛рдл рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ multi-shard watch loop рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдирд╣реАрдВ рд╣реИредpnpm test,pnpm test:watch, рдФрд░pnpm test:perf:importsрд╕реНрдкрд╖реНрдЯ рдлрд╝рд╛рдЗрд▓/рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЛ рдкрд╣рд▓реЗ scoped lanes рд╕реЗ рд░реВрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдПpnpm test extensions/discord/src/monitor/message-handler.preflight.test.tsрдХреЛ рдкреВрд░реЗ рд░реВрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ startup tax рдХреА рдХреАрдордд рдирд╣реАрдВ рдЪреБрдХрд╛рдиреА рдкрдбрд╝рддреАредpnpm test:changedрдмрджрд▓реЗ рд╣реБрдП git paths рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рд╕реНрддреЗ scoped lanes рдореЗрдВ рдлреИрд▓рд╛рддрд╛ рд╣реИ: direct test edits, sibling*.test.tsрдлрд╝рд╛рдЗрд▓реЗрдВ, рд╕реНрдкрд╖реНрдЯ source mappings, рдФрд░ local import-graph dependentsред Config/setup/package edits рд╡реНрдпрд╛рдкрдХ tests рдирд╣реАрдВ рдЪрд▓рд╛рддреЗ, рдЬрдм рддрдХ рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗOPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changedрдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВредpnpm check:changedрд╕рдВрдХрд░реЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп smart local check gate рд╣реИред рдпрд╣ diff рдХреЛ core, core tests, extensions, extension tests, apps, docs, release metadata, live Docker tooling, рдФрд░ tooling рдореЗрдВ рд╡рд░реНрдЧреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рдореЗрд▓ рдЦрд╛рддреЗ typecheck, lint, рдФрд░ guard commands рдЪрд▓рд╛рддрд╛ рд╣реИред рдпрд╣ Vitest tests рдирд╣реАрдВ рдЪрд▓рд╛рддрд╛; test proof рдХреЗ рд▓рд┐рдПpnpm test:changedрдпрд╛ рд╕реНрдкрд╖реНрдЯpnpm test <target>рдЪрд▓рд╛рдПрдБред рдХреЗрд╡рд▓ release metadata рд╡рд╛рд▓реЗ version bumps targeted version/config/root-dependency checks рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рдПрдХ guard рдХреЗ рд╕рд╛рде рдЬреЛ top-level version field рдХреЗ рдмрд╛рд╣рд░ package changes рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред- Live Docker ACP harness edits focused checks рдЪрд▓рд╛рддреЗ рд╣реИрдВ: live Docker auth scripts рдХреЗ рд▓рд┐рдП shell syntax рдФрд░ live Docker scheduler dry-runред
package.jsonchanges рдХреЗрд╡рд▓ рддрдм рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм diffscripts["test:docker:live-*"]рддрдХ рд╕реАрдорд┐рдд рд╣реЛ; dependency, export, version, рдФрд░ рдЕрдиреНрдп package-surface edits рдЕрдм рднреА рд╡реНрдпрд╛рдкрдХ guards рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред - agents, commands, plugins, auto-reply helpers,
plugin-sdk, рдФрд░ рд╕рдорд╛рди pure utility areas рд╕реЗ import-light unit testsunit-fastlane рд╕реЗ рд░реВрдЯ рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛtest/setup-openclaw-runtime.tsрдХреЛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ; stateful/runtime-heavy рдлрд╝рд╛рдЗрд▓реЗрдВ рдореМрдЬреВрджрд╛ lanes рдкрд░ рд░рд╣рддреА рд╣реИрдВред - рдЪреБрдиреА рд╣реБрдИ
plugin-sdkрдФрд░commandshelper source files рднреА changed-mode runs рдХреЛ рдЙрди light lanes рдореЗрдВ рд╕реНрдкрд╖реНрдЯ sibling tests рд╕реЗ map рдХрд░рддреА рд╣реИрдВ, рддрд╛рдХрд┐ helper edits рдЙрд╕ directory рдХреЗ рд▓рд┐рдП рдкреВрд░реЗ heavy suite рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдиреЗ рд╕реЗ рдмрдЪреЗрдВред auto-replyрдореЗрдВ top-level core helpers, top-levelreply.*integration tests, рдФрд░src/auto-reply/reply/**subtree рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд buckets рд╣реИрдВред CI reply subtree рдХреЛ agent-runner, dispatch, рдФрд░ commands/state-routing shards рдореЗрдВ рдФрд░ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдПрдХ import-heavy bucket рдкреВрд░реЗ Node tail рдХрд╛ рдорд╛рд▓рд┐рдХ рди рдмрдиреЗред- рд╕рд╛рдорд╛рдиреНрдп PR/main CI рдЬрд╛рдирдмреВрдЭрдХрд░ extension batch sweep рдФрд░ release-only
agentic-pluginsshard рдХреЛ рдЫреЛрдбрд╝рддрд╛ рд╣реИред Full Release Validation release candidates рдкрд░ рдЙрди plugin/extension-heavy suites рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧPlugin Prereleasechild workflow dispatch рдХрд░рддрд╛ рд╣реИред
Embedded runner coverage
- рдЬрдм рдЖрдк message-tool discovery inputs рдпрд╛ compaction runtime context рдмрджрд▓реЗрдВ, coverage рдХреЗ рджреЛрдиреЛрдВ рд╕реНрддрд░ рдмрдирд╛рдП рд░рдЦреЗрдВред
- pure routing рдФрд░ normalization boundaries рдХреЗ рд▓рд┐рдП focused helper regressions рдЬреЛрдбрд╝реЗрдВред
- embedded runner integration suites рдХреЛ рд╕реНрд╡рд╕реНрде рд░рдЦреЗрдВ:
src/agents/embedded-agent-runner/compact.hooks.test.ts,src/agents/embedded-agent-runner/run.overflow-compaction.test.ts, рдФрд░src/agents/embedded-agent-runner/run.overflow-compaction.loop.test.tsред - рдпреЗ suites рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ scoped ids рдФрд░ compaction behavior рдЕрдм рднреА
рд╡рд╛рд╕реНрддрд╡рд┐рдХ
run.ts/compact.tspaths рд╕реЗ рд╣реЛрдХрд░ рдмрд╣рддреЗ рд╣реИрдВ; рдХреЗрд╡рд▓ helper tests рдЙрди integration paths рдХрд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИрдВред
Vitest pool and isolation defaults
- Base Vitest config рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ
threadsрдкрд░ рд╕реЗрдЯ рд╣реИред - shared Vitest config
isolate: falseрдХреЛ рд╕реНрдерд┐рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ root projects, e2e, рдФрд░ live configs рдореЗрдВ non-isolated runner рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред - root UI lane рдЕрдкрдирд╛
jsdomsetup рдФрд░ optimizer рдмрдирд╛рдП рд░рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╣ рднреА shared non-isolated runner рдкрд░ рдЪрд▓рддрд╛ рд╣реИред - рд╣рд░
pnpm testshard shared Vitest config рд╕реЗ рд╡рд╣реАthreads+isolate: falsedefaults рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рд▓реЗрддрд╛ рд╣реИред scripts/run-vitest.mjsрдмрдбрд╝реЗ local runs рдХреЗ рджреМрд░рд╛рди V8 compile churn рдШрдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП Vitest child Node processes рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ--no-maglevрдЬреЛрдбрд╝рддрд╛ рд╣реИред stock V8 behavior рд╕реЗ рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПOPENCLAW_VITEST_ENABLE_MAGLEV=1рд╕реЗрдЯ рдХрд░реЗрдВредscripts/run-vitest.mjsрд╕реНрдкрд╖реНрдЯ non-watch Vitest runs рдХреЛ 5 рдорд┐рдирдЯ рддрдХ stdout рдпрд╛ stderr output рди рдЖрдиреЗ рдкрд░ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрддрд╛ рд╣реИред рдЬрд╛рдирдмреВрдЭрдХрд░ silent investigation рдХреЗ рд▓рд┐рдП watchdog рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рд╣реЗрддреБOPENCLAW_VITEST_NO_OUTPUT_TIMEOUT_MS=0рд╕реЗрдЯ рдХрд░реЗрдВред
Fast local iteration
pnpm changed:lanesрджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ diff рдХрд┐рди architectural lanes рдХреЛ trigger рдХрд░рддрд╛ рд╣реИред- pre-commit hook рдХреЗрд╡рд▓ formatting рдХрд░рддрд╛ рд╣реИред рдпрд╣ formatted files рдХреЛ рдлрд┐рд░ рд╕реЗ stage рдХрд░рддрд╛ рд╣реИ рдФрд░ lint, typecheck, рдпрд╛ tests рдирд╣реАрдВ рдЪрд▓рд╛рддрд╛ред
- handoff рдпрд╛ push рд╕реЗ рдкрд╣рд▓реЗ, рдЬрдм smart local check gate рдЪрд╛рд╣рд┐рдП, рддреЛ
pnpm check:changedрд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдПрдБред pnpm test:changedрдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рд╕реНрддреЗ scoped lanes рд╕реЗ рд░реВрдЯ рдХрд░рддрд╛ рд╣реИредOPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changedрдХреЗрд╡рд▓ рддрдм рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬрдм agent рдирд┐рд░реНрдгрдп рдХрд░реЗ рдХрд┐ рдХрд┐рд╕реА harness, config, package, рдпрд╛ contract edit рдХреЛ рд╕рдЪ рдореЗрдВ рд╡реНрдпрд╛рдкрдХ Vitest coverage рдЪрд╛рд╣рд┐рдПредpnpm test:maxрдФрд░pnpm test:changed:maxрд╡рд╣реА routing behavior рд░рдЦрддреЗ рд╣реИрдВ, рдмрд╕ worker cap рдЕрдзрд┐рдХ рд╣реЛрддрд╛ рд╣реИред- Local worker auto-scaling рдЬрд╛рдирдмреВрдЭрдХрд░ conservative рд╣реИ рдФрд░ host load average рдкрд╣рд▓реЗ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрдиреЗ рдкрд░ рдкреАрдЫреЗ рд╣рдЯрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрдИ concurrent Vitest runs рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХрдо рдиреБрдХрд╕рд╛рди рдХрд░рддреЗ рд╣реИрдВред
- base Vitest config projects/config files рдХреЛ
forceRerunTriggersрдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ test wiring рдмрджрд▓рдиреЗ рдкрд░ changed-mode reruns рд╕рд╣реА рд░рд╣реЗрдВред - config рд╕рдорд░реНрдерд┐рдд hosts рдкрд░
OPENCLAW_VITEST_FS_MODULE_CACHEenabled рд░рдЦрддрд╛ рд╣реИ; рдпрджрд┐ direct profiling рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдкрд╖реНрдЯ cache location рдЪрд╛рд╣рд┐рдП, рддреЛOPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/pathрд╕реЗрдЯ рдХрд░реЗрдВред
Perf debugging
pnpm test:perf:importsVitest import-duration reporting рдФрд░ import-breakdown output enabled рдХрд░рддрд╛ рд╣реИредpnpm test:perf:imports:changedрд╡рд╣реА profiling vieworigin/mainрдХреЗ рдмрд╛рдж рдмрджрд▓реА рдлрд╝рд╛рдЗрд▓реЛрдВ рддрдХ scoped рдХрд░рддрд╛ рд╣реИред- Shard timing data
.artifacts/vitest-shard-timings.jsonрдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред Whole-config runs key рдХреЗ рд░реВрдк рдореЗрдВ config path рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ; include-pattern CI shards shard name рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ filtered shards рдХреЛ рдЕрд▓рдЧ рд╕реЗ track рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред - рдЬрдм рдПрдХ hot test рдЕрдм рднреА рдЕрдкрдирд╛ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдордп startup imports рдореЗрдВ рдЦрд░реНрдЪ рдХрд░рддрд╛ рд╣реИ,
heavy dependencies рдХреЛ рд╕рдВрдХрд░реЗ local
*.runtime.tsseam рдХреЗ рдкреАрдЫреЗ рд░рдЦреЗрдВ рдФрд░ рдЙрд╕ seam рдХреЛ рд╕реАрдзреЗ mock рдХрд░реЗрдВ, runtime helpers рдХреЛ рдХреЗрд╡рд▓vi.mock(...)рд╕реЗ pass рдХрд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП deep-import рди рдХрд░реЗрдВред pnpm test:perf:changed:bench -- --ref <git-ref>рдЙрд╕ committed diff рдХреЗ рд▓рд┐рдП routedtest:changedрдХреА рддреБрд▓рдирд╛ native root-project path рд╕реЗ рдХрд░рддрд╛ рд╣реИ рдФрд░ wall time рддрдерд╛ macOS max RSS рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИредpnpm test:perf:changed:bench -- --worktreecurrent dirty tree рдХреЛ benchmark рдХрд░рддрд╛ рд╣реИ, changed file list рдХреЛscripts/test-projects.mjsрдФрд░ root Vitest config рд╕реЗ рд░реВрдЯ рдХрд░рдХреЗредpnpm test:perf:profile:mainVitest/Vite startup рдФрд░ transform overhead рдХреЗ рд▓рд┐рдП main-thread CPU profile рд▓рд┐рдЦрддрд╛ рд╣реИредpnpm test:perf:profile:runnerfile parallelism disabled рдХреЗ рд╕рд╛рде unit suite рдХреЗ рд▓рд┐рдП runner CPU+heap profiles рд▓рд┐рдЦрддрд╛ рд╣реИред
Stability (gateway)
- Command:
pnpm test:stability:gateway - Config:
vitest.gateway.config.ts, рдПрдХ worker рдкрд░ forced - Scope:
- diagnostics рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ enabled рд░рдЦрддреЗ рд╣реБрдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ loopback Gateway рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ
- diagnostic event path рд╕реЗ synthetic gateway message, memory, рдФрд░ large-payload churn рдЪрд▓рд╛рддрд╛ рд╣реИ
- Gateway WS RPC рдкрд░
diagnostics.stabilityquery рдХрд░рддрд╛ рд╣реИ - diagnostic stability bundle persistence helpers cover рдХрд░рддрд╛ рд╣реИ
- Assert рдХрд░рддрд╛ рд╣реИ рдХрд┐ recorder bounded рд░рд╣рддрд╛ рд╣реИ, synthetic RSS samples pressure budget рдХреЗ рдиреАрдЪреЗ рд░рд╣рддреЗ рд╣реИрдВ, рдФрд░ per-session queue depths рд╡рд╛рдкрд╕ zero рддрдХ drain рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ
- Expectations:
- CI-safe рдФрд░ keyless
- stability-regression follow-up рдХреЗ рд▓рд┐рдП narrow lane, рдкреВрд░реЗ Gateway suite рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ
E2E (repo aggregate)
- Command:
pnpm test:e2e - Scope:
- gateway smoke E2E lane рдЪрд▓рд╛рддрд╛ рд╣реИ
- mocked Control UI browser E2E lane рдЪрд▓рд╛рддрд╛ рд╣реИ
- Expectations:
- CI-safe рдФрд░ keyless
- Playwright Chromium installed рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ
E2E (gateway smoke)
- Command:
pnpm test:e2e:gateway - Config:
vitest.e2e.config.ts - Files:
src/**/*.e2e.test.ts,test/**/*.e2e.test.ts, рдФрд░ bundled-plugin E2E testsextensions/рдХреЗ рдЕрдВрддрд░реНрдЧрдд - Runtime defaults:
- Vitest
threadsрдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ,isolate: falseрдХреЗ рд╕рд╛рде, repo рдХреЗ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЗ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реБрдПред - adaptive workers рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (CI: 2 рддрдХ, local: рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ 1)ред
- console I/O overhead рдШрдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ silent mode рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИред
- Vitest
- Useful overrides:
- worker count force рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
OPENCLAW_E2E_WORKERS=<n>(16 рдкрд░ capped)ред - verbose console output рдлрд┐рд░ рд╕реЗ enabled рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
OPENCLAW_E2E_VERBOSE=1ред
- worker count force рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
- Scope:
- Multi-instance gateway end-to-end behavior
- WebSocket/HTTP surfaces, node pairing, рдФрд░ heavier networking
- Expectations:
- CI рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ (рдЬрдм pipeline рдореЗрдВ enabled рд╣реЛ)
- рд╡рд╛рд╕реНрддрд╡рд┐рдХ keys рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ
- unit tests рд╕реЗ рдЕрдзрд┐рдХ moving parts (рдзреАрдорд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)
E2E (Control UI mocked browser)
- Command:
pnpm test:ui:e2e - Config:
test/vitest/vitest.ui-e2e.config.ts - Files:
ui/src/**/*.e2e.test.ts - Scope:
- Vite Control UI рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ
- Playwright рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ Chromium page рдЪрд▓рд╛рддрд╛ рд╣реИ
- Gateway WebSocket рдХреЛ deterministic in-browser mocks рд╕реЗ рдмрджрд▓рддрд╛ рд╣реИ
- Expectations:
pnpm test:e2eрдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ CI рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ- рд╡рд╛рд╕реНрддрд╡рд┐рдХ Gateway, agents, рдпрд╛ provider keys рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ
- Browser dependency рдореМрдЬреВрдж рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП (
pnpm --dir ui exec playwright install chromium)
E2E: OpenShell backend smoke
- Command:
pnpm test:e2e:openshell - File:
extensions/openshell/src/backend.e2e.test.ts - Scope:
- рд╕рдХреНрд░рд┐рдп local OpenShell gateway рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ
- temporary local Dockerfile рд╕реЗ sandbox рдмрдирд╛рддрд╛ рд╣реИ
- рд╡рд╛рд╕реНрддрд╡рд┐рдХ
sandbox ssh-config+ SSH exec рдкрд░ OpenClaw рдХреЗ OpenShell backend рдХрд╛ рдЕрднреНрдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ - sandbox fs bridge рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ remote-canonical filesystem behavior рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ
- Expectations:
- рдХреЗрд╡рд▓ opt-in; default
pnpm test:e2erun рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ - local
openshellCLI рдФрд░ working Docker daemon рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ - рд╕рдХреНрд░рд┐рдп local OpenShell gateway рдФрд░ рдЙрд╕рдХрд╛ config source рдЖрд╡рд╢реНрдпрдХ рд╣реИ
- isolated
HOME/XDG_CONFIG_HOMEрдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ test sandbox рдХреЛ рдирд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ
- рдХреЗрд╡рд▓ opt-in; default
- Useful overrides:
- broader e2e suite manually рдЪрд▓рд╛рддреЗ рд╕рдордп test enabled рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
OPENCLAW_E2E_OPENSHELL=1 - non-default CLI binary рдпрд╛ wrapper script рдХреА рдУрд░ point рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
OPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshell - registered gateway config рдХреЛ isolated test рдореЗрдВ expose рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
OPENCLAW_E2E_OPENSHELL_CONFIG_HOME=/path/to/config - host policy fixture рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ Docker gateway IP рдХреЛ override рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
OPENCLAW_E2E_OPENSHELL_HOST_IP=172.18.0.1
- broader e2e suite manually рдЪрд▓рд╛рддреЗ рд╕рдордп test enabled рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
Live (real providers + real models)
- рдХрдорд╛рдВрдб:
pnpm test:live - рдХреЙрдиреНрдлрд╝рд┐рдЧ:
vitest.live.config.ts - рдлрд╝рд╛рдЗрд▓реЗрдВ:
src/**/*.live.test.ts,test/**/*.live.test.ts, рдФрд░extensions/рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдмрдВрдбрд▓ рдХрд┐рдП рдЧрдП Plugin рд▓рд╛рдЗрд╡ рдЯреЗрд╕реНрдЯ - рдбрд┐рдлрд╝реЙрд▓реНрдЯ:
pnpm test:liveрджреНрд╡рд╛рд░рд╛ рд╕рдХреНрд╖рдо (OPENCLAW_LIVE_TEST=1рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ) - рджрд╛рдпрд░рд╛:
- "рдХреНрдпрд╛ рдпрд╣ рдкреНрд░рджрд╛рддрд╛/рдореЙрдбрд▓ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдХреЗ рд╕рд╛рде рдЖрдЬ рд╕рдЪ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?"
- рдкреНрд░рджрд╛рддрд╛ рдлрд╝реЙрд░реНрдореИрдЯ рдмрджрд▓рд╛рд╡, рдЯреВрд▓-рдХреЙрд▓рд┐рдВрдЧ рдХреА рдмрд╛рд░реАрдХрд┐рдпрд╛рдВ, рдСрде рд╕рдорд╕реНрдпрд╛рдПрдВ, рдФрд░ рд░реЗрдЯ рд▓рд┐рдорд┐рдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрдХрдбрд╝рдирд╛
- рдЕрдкреЗрдХреНрд╖рд╛рдПрдВ:
- рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗ рдЕрдиреБрд╕рд╛рд░ CI-рд╕реНрдерд┐рд░ рдирд╣реАрдВ (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рджрд╛рддрд╛ рдиреАрддрд┐рдпрд╛рдВ, рдХреЛрдЯрд╛, рдЖрдЙрдЯреЗрдЬ)
- рдкреИрд╕реЗ рдЦрд░реНрдЪ рдХрд░рддрд╛ рд╣реИ / рд░реЗрдЯ рд▓рд┐рдорд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ
- "рд╕рдм рдХреБрдЫ" рдХреЗ рдмрдЬрд╛рдп рд╕реАрдорд┐рдд рдЙрдкрд╕рдореБрдЪреНрдЪрдп рдЪрд▓рд╛рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ
- рд▓рд╛рдЗрд╡ рд░рди рдкрд╣рд▓реЗ рд╕реЗ рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдХреА рдЧрдИ API рдХреБрдВрдЬрд┐рдпреЛрдВ рдФрд░ рд╕реНрдЯреЗрдЬ рдХрд┐рдП рдЧрдП рдСрде рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
- рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд▓рд╛рдЗрд╡ рд░рди рдлрд┐рд░ рднреА
HOMEрдХреЛ рдЕрд▓рдЧ рд░рдЦрддреЗ рд╣реИрдВ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧ/рдСрде рд╕рд╛рдордЧреНрд░реА рдХреЛ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдЯреЗрд╕реНрдЯ рд╣реЛрдо рдореЗрдВ рдХреЙрдкреА рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпреВрдирд┐рдЯ рдлрд╝рд┐рдХреНрд╕реНрдЪрд░ рдЖрдкрдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ~/.openclawрдХреЛ рдмрджрд▓ рди рд╕рдХреЗрдВред OPENCLAW_LIVE_USE_REAL_HOME=1рдХреЗрд╡рд▓ рддрдм рд╕реЗрдЯ рдХрд░реЗрдВ рдЬрдм рдЖрдк рдЬрд╛рдирдмреВрдЭрдХрд░ рдЪрд╛рд╣рддреЗ рд╣реЛрдВ рдХрд┐ рд▓рд╛рдЗрд╡ рдЯреЗрд╕реНрдЯ рдЖрдкрдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣реЛрдо рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВредpnpm test:liveрдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рд╢рд╛рдВрдд рдореЛрдб рдкрд░ рд░рд╣рддрд╛ рд╣реИ: рдпрд╣[live] ...рдкреНрд░рдЧрддрд┐ рдЖрдЙрдЯрдкреБрдЯ рд░рдЦрддрд╛ рд╣реИ рдФрд░ Gateway рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рд▓реЙрдЧ/Bonjour рд╢реЛрд░ рдХреЛ рдореНрдпреВрдЯ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдкреВрд░реЗ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рд▓реЙрдЧ рд╡рд╛рдкрд╕ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛOPENCLAW_LIVE_TEST_QUIET=0рд╕реЗрдЯ рдХрд░реЗрдВред- API рдХреБрдВрдЬреА рд░реЛрдЯреЗрд╢рди (рдкреНрд░рджрд╛рддрд╛-рд╡рд┐рд╢рд┐рд╖реНрдЯ): рдХреЙрдорд╛/рд╕реЗрдореАрдХреЛрд▓рди рдлрд╝реЙрд░реНрдореИрдЯ рдореЗрдВ
*_API_KEYSрдпрд╛*_API_KEY_1,*_API_KEY_2рд╕реЗрдЯ рдХрд░реЗрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдПOPENAI_API_KEYS,ANTHROPIC_API_KEYS,GEMINI_API_KEYS) рдпрд╛OPENCLAW_LIVE_*_KEYрдХреЗ рдЬрд╝рд░рд┐рдП рдкреНрд░рддрд┐-рд▓рд╛рдЗрд╡ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдВ; рдЯреЗрд╕реНрдЯ рд░реЗрдЯ рд▓рд┐рдорд┐рдЯ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдкрд░ рдлрд┐рд░ рд╕реЗ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред - рдкреНрд░рдЧрддрд┐/Heartbeat рдЖрдЙрдЯрдкреБрдЯ:
- рд▓рд╛рдЗрд╡ рд╕реВрдЯ рдЕрдм stderr рдкрд░ рдкреНрд░рдЧрддрд┐ рдкрдВрдХреНрддрд┐рдпрд╛рдВ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд▓рдВрдмреЗ рдкреНрд░рджрд╛рддрд╛ рдХреЙрд▓ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдХреНрд░рд┐рдп рджрд┐рдЦреЗрдВ, рднрд▓реЗ рд╣реА Vitest рдХрдВрд╕реЛрд▓ рдХреИрдкреНрдЪрд░ рд╢рд╛рдВрдд рд╣реЛред
vitest.live.config.tsVitest рдХрдВрд╕реЛрд▓ рдЗрдВрдЯрд░рд╕реЗрдкреНрд╢рди рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд▓рд╛рдЗрд╡ рд░рди рдХреЗ рджреМрд░рд╛рди рдкреНрд░рджрд╛рддрд╛/Gateway рдкреНрд░рдЧрддрд┐ рдкрдВрдХреНрддрд┐рдпрд╛рдВ рддреБрд░рдВрдд рд╕реНрдЯреНрд░реАрдо рд╣реЛрдВред- рдбрд╛рдпрд░реЗрдХреНрдЯ-рдореЙрдбрд▓ Heartbeat рдХреЛ
OPENCLAW_LIVE_HEARTBEAT_MSрд╕реЗ рдЯреНрдпреВрди рдХрд░реЗрдВред - Gateway/рдкреНрд░реЛрдм Heartbeat рдХреЛ
OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MSрд╕реЗ рдЯреНрдпреВрди рдХрд░реЗрдВред
рдореБрдЭреЗ рдХреМрди-рд╕рд╛ рд╕реВрдЯ рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?
рдпрд╣ рдирд┐рд░реНрдгрдп рддрд╛рд▓рд┐рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
- рд▓реЙрдЬрд┐рдХ/рдЯреЗрд╕реНрдЯ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛:
pnpm testрдЪрд▓рд╛рдПрдВ (рдФрд░ рдпрджрд┐ рдЖрдкрдиреЗ рдмрд╣реБрдд рдХреБрдЫ рдмрджрд▓рд╛ рд╣реИ рддреЛpnpm test:coverage) - Gateway рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ / WS рдкреНрд░реЛрдЯреЛрдХреЙрд▓ / рдкреЗрдпрд░рд┐рдВрдЧ рдХреЛ рдЫреВрдирд╛:
pnpm test:e2eрдЬреЛрдбрд╝реЗрдВ - "рдореЗрд░рд╛ рдмреЙрдЯ рдбрд╛рдЙрди рд╣реИ" / рдкреНрд░рджрд╛рддрд╛-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рдлрд▓рддрд╛рдУрдВ / рдЯреВрд▓ рдХреЙрд▓рд┐рдВрдЧ рдХреА рдбрд┐рдмрдЧрд┐рдВрдЧ: рд╕реАрдорд┐рдд
pnpm test:liveрдЪрд▓рд╛рдПрдВ
рд▓рд╛рдЗрд╡ (рдиреЗрдЯрд╡рд░реНрдХ-рдЫреВрдиреЗ рд╡рд╛рд▓реЗ) рдЯреЗрд╕реНрдЯ
рд▓рд╛рдЗрд╡ рдореЙрдбрд▓ рдореИрдЯреНрд░рд┐рдХреНрд╕, CLI рдмреИрдХрдПрдВрдб рд╕реНрдореЛрдХреНрд╕, ACP рд╕реНрдореЛрдХреНрд╕, Codex рдРрдк-рд╕рд░реНрд╡рд░ рд╣рд╛рд░реНрдиреЗрд╕, рдФрд░ рд╕рднреА рдореАрдбрд┐рдпрд╛-рдкреНрд░рджрд╛рддрд╛ рд▓рд╛рдЗрд╡ рдЯреЗрд╕реНрдЯ (Deepgram, BytePlus, ComfyUI, рдЗрдореЗрдЬ, рдореНрдпреВрдЬрд╝рд┐рдХ, рд╡реАрдбрд┐рдпреЛ, рдореАрдбрд┐рдпрд╛ рд╣рд╛рд░реНрдиреЗрд╕) - рд╕рд╛рде рд╣реА рд▓рд╛рдЗрд╡ рд░рди рдХреЗ рд▓рд┐рдП рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рд╣реИрдВрдбрд▓рд┐рдВрдЧ - рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрд╡ рд╕реВрдЯ рдЯреЗрд╕реНрдЯ рдХрд░рдирд╛ рджреЗрдЦреЗрдВред рд╕рдорд░реНрдкрд┐рдд рдЕрдкрдбреЗрдЯ рдФрд░ Plugin рд╡реИрд▓рд┐рдбреЗрд╢рди рдЪреЗрдХрд▓рд┐рд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдЕрдкрдбреЗрдЯ рдФрд░ Plugin рдЯреЗрд╕реНрдЯ рдХрд░рдирд╛ рджреЗрдЦреЗрдВред
Docker рд░рдирд░ (рд╡реИрдХрд▓реНрдкрд┐рдХ "Linux рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ" рдЪреЗрдХ)
рдпреЗ Docker рд░рдирд░ рджреЛ рдмрдХреЗрдЯ рдореЗрдВ рдмрдВрдЯрддреЗ рд╣реИрдВ:
- рд▓рд╛рдЗрд╡-рдореЙрдбрд▓ рд░рдирд░:
test:docker:live-modelsрдФрд░test:docker:live-gatewayrepo Docker рдЗрдореЗрдЬ рдХреЗ рдЕрдВрджрд░ рдХреЗрд╡рд▓ рдЕрдкрдиреА рдореЗрд▓ рдЦрд╛рддреА profile-key рд▓рд╛рдЗрд╡ рдлрд╝рд╛рдЗрд▓ рдЪрд▓рд╛рддреЗ рд╣реИрдВ (src/agents/models.profiles.live.test.tsрдФрд░src/gateway/gateway-models.profiles.live.test.ts), рдЖрдкрдХреА рд╕реНрдерд╛рдиреАрдп рдХреЙрдиреНрдлрд╝рд┐рдЧ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА, рд╡рд░реНрдХрд╕реНрдкреЗрд╕, рдФрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ env рдлрд╝рд╛рдЗрд▓ рдорд╛рдЙрдВрдЯ рдХрд░рддреЗ рд╣реБрдПред рдореЗрд▓ рдЦрд╛рддреЗ рд╕реНрдерд╛рдиреАрдп рдПрдВрдЯреНрд░реАрдкреЙрдЗрдВрдЯtest:live:models-profilesрдФрд░test:live:gateway-profilesрд╣реИрдВред - Docker рд▓рд╛рдЗрд╡ рд░рдирд░ рдЬрд╣рд╛рдВ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдЕрдкрдиреЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдХреИрдк рд░рдЦрддреЗ рд╣реИрдВ:
test:docker:live-modelsрдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЪреБрдиреЗ рд╣реБрдП рд╕рдорд░реНрдерд┐рдд рд╣рд╛рдИ-рд╕рд┐рдЧреНрдирд▓ рд╕реЗрдЯ рдкрд░ рд░рд╣рддрд╛ рд╣реИ, рдФрд░test:docker:live-gatewayрдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗOPENCLAW_LIVE_GATEWAY_SMOKE=1,OPENCLAW_LIVE_GATEWAY_MAX_MODELS=8,OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=45000, рдФрд░OPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000рдкрд░ рд░рд╣рддрд╛ рд╣реИред рдЬрдм рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЫреЛрдЯрд╛ рдХреИрдк рдпрд╛ рдмрдбрд╝рд╛ рд╕реНрдХреИрди рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛOPENCLAW_LIVE_MAX_MODELSрдпрд╛ Gateway env vars рд╕реЗрдЯ рдХрд░реЗрдВред test:docker:alltest:docker:live-buildрдХреЗ рдЬрд╝рд░рд┐рдП рд▓рд╛рдЗрд╡ Docker рдЗрдореЗрдЬ рдХреЛ рдПрдХ рдмрд╛рд░ рдмрдирд╛рддрд╛ рд╣реИ,scripts/package-openclaw-for-docker.mjsрдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ OpenClaw рдХреЛ npm tarball рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдмрд╛рд░ рдкреИрдХ рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рджреЛscripts/e2e/DockerfileрдЗрдореЗрдЬ рдмрдирд╛рддрд╛/рдлрд┐рд░ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдмреЗрдпрд░ рдЗрдореЗрдЬ рдХреЗрд╡рд▓ install/update/plugin-dependency рд▓реЗрди рдХреЗ рд▓рд┐рдП Node/Git рд░рдирд░ рд╣реИ; рд╡реЗ рд▓реЗрди рдкрд╣рд▓реЗ рд╕реЗ рдмрдиреЗ tarball рдХреЛ рдорд╛рдЙрдВрдЯ рдХрд░рддреЗ рд╣реИрдВред рдлрд╝рдВрдХреНрд╢рдирд▓ рдЗрдореЗрдЬ built-app рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд▓реЗрди рдХреЗ рд▓рд┐рдП рдЙрд╕реА tarball рдХреЛ/appрдореЗрдВ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рддреА рд╣реИред Docker рд▓реЗрди рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВscripts/lib/docker-e2e-scenarios.mjsрдореЗрдВ рд░рд╣рддреА рд╣реИрдВ; рдкреНрд▓рд╛рдирд░ рд▓реЙрдЬрд┐рдХscripts/lib/docker-e2e-plan.mjsрдореЗрдВ рд░рд╣рддрд╛ рд╣реИ;scripts/test-docker-all.mjsрдЪрдпрдирд┐рдд рдкреНрд▓рд╛рди рдЪрд▓рд╛рддрд╛ рд╣реИред рдПрдЧреНрд░реАрдЧреЗрдЯ weighted рд╕реНрдерд╛рдиреАрдп scheduler рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:OPENCLAW_DOCKER_ALL_PARALLELISMprocess slots рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ resource caps heavy live, npm-install, рдФрд░ multi-service lanes рдХреЛ рдПрдХ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдХреЛрдИ рдПрдХрд▓ lane active caps рд╕реЗ рднрд╛рд░реА рд╣реИ, рддреЛ scheduler pool empty рд╣реЛрдиреЗ рдкрд░ рдлрд┐рд░ рднреА рдЙрд╕реЗ рд╢реБрд░реВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ capacity рдлрд┐рд░ рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рддрдХ рдЙрд╕реЗ рдЕрдХреЗрд▓реЗ running рд░рдЦрддрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ 10 slots,OPENCLAW_DOCKER_ALL_LIVE_LIMIT=9,OPENCLAW_DOCKER_ALL_NPM_LIMIT=5, рдФрд░OPENCLAW_DOCKER_ALL_SERVICE_LIMIT=7рд╣реИрдВ;OPENCLAW_DOCKER_ALL_WEIGHT_LIMITрдпрд╛OPENCLAW_DOCKER_ALL_DOCKER_LIMITрдХреЗрд╡рд▓ рддрдм рдЯреНрдпреВрди рдХрд░реЗрдВ рдЬрдм Docker host рдХреЗ рдкрд╛рд╕ рдЕрдзрд┐рдХ headroom рд╣реЛред runner default рд░реВрдк рд╕реЗ Docker preflight рдХрд░рддрд╛ рд╣реИ, stale OpenClaw E2E containers рд╣рдЯрд╛рддрд╛ рд╣реИ, рд╣рд░ 30 seconds рдореЗрдВ status print рдХрд░рддрд╛ рд╣реИ, successful lane timings рдХреЛ.artifacts/docker-tests/lane-timings.jsonрдореЗрдВ stores рдХрд░рддрд╛ рд╣реИ, рдФрд░ later runs рдкрд░ longer lanes рдкрд╣рд▓реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрди timings рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред Docker build рдпрд╛ run рдХрд┐рдП рдмрд┐рдирд╛ weighted lane manifest print рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПOPENCLAW_DOCKER_ALL_DRY_RUN=1рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдпрд╛ selected lanes, package/image needs, рдФрд░ credentials рдХреЗ рд▓рд┐рдП CI plan print рдХрд░рдиреЗ рд╣реЗрддреБnode scripts/test-docker-all.mjs --plan-jsonрдЙрдкрдпреЛрдЧ рдХрд░реЗрдВредPackage Acceptance"рдХреНрдпрд╛ рдпрд╣ installable tarball product рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?" рдХреЗ рд▓рд┐рдП GitHub-native package gate рд╣реИред рдпрд╣source=npm,source=ref,source=url, рдпрд╛source=artifactрд╕реЗ рдПрдХ candidate package resolve рдХрд░рддрд╛ рд╣реИ, рдЙрд╕реЗpackage-under-testрдХреЗ рд░реВрдк рдореЗрдВ upload рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ selected ref рдХреЛ repack рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЙрд╕реА exact tarball рдХреЗ рдЦрд┐рд▓рд╛рдл reusable Docker E2E lanes рдЪрд▓рд╛рддрд╛ рд╣реИред Profiles breadth рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ ordered рд╣реИрдВ:smoke,package,product, рдФрд░fullред package/update/plugin contract, published-upgrade survivor matrix, release defaults, рдФрд░ failure triage рдХреЗ рд▓рд┐рдП рдЕрдкрдбреЗрдЯ рдФрд░ Plugin рдЯреЗрд╕реНрдЯ рдХрд░рдирд╛ рджреЗрдЦреЗрдВред- Build рдФрд░ release checks tsdown рдХреЗ рдмрд╛рдж
scripts/check-cli-bootstrap-imports.mjsрдЪрд▓рд╛рддреЗ рд╣реИрдВред guarddist/entry.jsрдФрд░dist/cli/run-main.jsрд╕реЗ static built graph walk рдХрд░рддрд╛ рд╣реИ рдФрд░ fail рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ pre-dispatch startup command dispatch рд╕реЗ рдкрд╣рд▓реЗ Commander, prompt UI, undici, рдпрд╛ logging рдЬреИрд╕реЗ package dependencies import рдХрд░рддрд╛ рд╣реИ; рдпрд╣ bundled Gateway run chunk рдХреЛ budget рдХреЗ рднреАрддрд░ рднреА рд░рдЦрддрд╛ рд╣реИ рдФрд░ known cold Gateway paths рдХреЗ static imports reject рдХрд░рддрд╛ рд╣реИред Packaged CLI smoke root help, onboard help, doctor help, status, config schema, рдФрд░ model-list command рднреА cover рдХрд░рддрд╛ рд╣реИред - Package Acceptance legacy compatibility
2026.4.25(2026.4.25-beta.*рд╢рд╛рдорд┐рд▓) рдкрд░ capped рд╣реИред рдЙрд╕ cutoff рддрдХ, harness рдХреЗрд╡рд▓ shipped-package metadata gaps tolerate рдХрд░рддрд╛ рд╣реИ: omitted private QA inventory entries, missinggateway install --wrapper, tarball-derived git fixture рдореЗрдВ missing patch files, missing persistedupdate.channel, legacy plugin install-record locations, missing marketplace install-record persistence, рдФрд░plugins updateрдХреЗ рджреМрд░рд╛рди config metadata migrationред2026.4.25рдХреЗ рдмрд╛рдж рдХреЗ packages рдХреЗ рд▓рд┐рдП, рдпреЗ paths strict failures рд╣реИрдВред - Container smoke runners:
test:docker:openwebui,test:docker:onboard,test:docker:npm-onboard-channel-agent,test:docker:release-user-journey,test:docker:release-typed-onboarding,test:docker:release-media-memory,test:docker:release-upgrade-user-journey,test:docker:release-plugin-marketplace,test:docker:skill-install,test:docker:update-channel-switch,test:docker:upgrade-survivor,test:docker:published-upgrade-survivor,test:docker:session-runtime-context,test:docker:agents-delete-shared-workspace,test:docker:gateway-network,test:docker:browser-cdp-snapshot,test:docker:mcp-channels,test:docker:agent-bundle-mcp-tools,test:docker:cron-mcp-cleanup,test:docker:plugins,test:docker:plugin-update,test:docker:plugin-lifecycle-matrix, рдФрд░test:docker:config-reloadрдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ containers boot рдХрд░рддреЗ рд╣реИрдВ рдФрд░ higher-level integration paths verify рдХрд░рддреЗ рд╣реИрдВред - Docker/Bash E2E lanes рдЬреЛ packed OpenClaw tarball рдХреЛ
scripts/lib/openclaw-e2e-instance.shрдХреЗ рдЬрд╝рд░рд┐рдП install рдХрд░рддреЗ рд╣реИрдВ,npm installрдХреЛOPENCLAW_E2E_NPM_INSTALL_TIMEOUTрдкрд░ cap рдХрд░рддреЗ рд╣реИрдВ (default600s; debugging рдХреЗ рд▓рд┐рдП wrapper disable рдХрд░рдиреЗ рд╣реЗрддреБ0set рдХрд░реЗрдВ)ред
рд▓рд╛рдЗрд╡-рдореЙрдбрд▓ Docker рд░рдирд░ рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ CLI auth homes (рдпрд╛ run narrowed рди рд╣реЛрдиреЗ рдкрд░ рд╕рднреА supported ones) рдХреЛ bind-mount рднреА рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ run рд╕реЗ рдкрд╣рд▓реЗ рдЙрдиреНрд╣реЗрдВ container home рдореЗрдВ copy рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ external-CLI OAuth host auth store рдХреЛ mutate рдХрд┐рдП рдмрд┐рдирд╛ tokens refresh рдХрд░ рд╕рдХреЗ:
-
рдбрд╛рдпрд░реЗрдХреНрдЯ рдореЙрдбрд▓:
pnpm test:docker:live-models(script:scripts/test-live-models-docker.sh) -
ACP bind smoke:
pnpm test:docker:live-acp-bind(script:scripts/test-live-acp-bind-docker.sh; default рд░реВрдк рд╕реЗ Claude, Codex, рдФрд░ Gemini cover рдХрд░рддрд╛ рд╣реИ, strict Droid/OpenCode coveragepnpm test:docker:live-acp-bind:droidрдФрд░pnpm test:docker:live-acp-bind:opencodeрдХреЗ рдЬрд╝рд░рд┐рдП) -
CLI backend smoke:
pnpm test:docker:live-cli-backend(script:scripts/test-live-cli-backend-docker.sh) -
Codex app-server harness smoke:
pnpm test:docker:live-codex-harness(script:scripts/test-live-codex-harness-docker.sh) -
Gateway + dev agent:
pnpm test:docker:live-gateway(script:scripts/test-live-gateway-models-docker.sh) -
Observability smokes:
pnpm qa:otel:smoke,pnpm qa:prometheus:smoke, рдФрд░pnpm qa:observability:smokeprivate QA source-checkout lanes рд╣реИрдВред рд╡реЗ рдЬрд╛рдирдмреВрдЭрдХрд░ package Docker release lanes рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ npm tarball QA Lab рдХреЛ omit рдХрд░рддрд╛ рд╣реИред -
Open WebUI live smoke:
pnpm test:docker:openwebui(script:scripts/e2e/openwebui-docker.sh) -
Onboarding wizard (TTY, full scaffolding):
pnpm test:docker:onboard(script:scripts/e2e/onboard-docker.sh) -
Npm tarball onboarding/channel/agent smoke:
pnpm test:docker:npm-onboard-channel-agentpacked OpenClaw tarball рдХреЛ Docker рдореЗрдВ globally install рдХрд░рддрд╛ рд╣реИ, env-ref onboarding рдХреЗ рдЬрд╝рд░рд┐рдП OpenAI рдФрд░ default рд░реВрдк рд╕реЗ Telegram configure рдХрд░рддрд╛ рд╣реИ, doctor рдЪрд▓рд╛рддрд╛ рд╣реИ, рдФрд░ рдПрдХ mocked OpenAI agent turn рдЪрд▓рд╛рддрд╛ рд╣реИред рдкрд╣рд▓реЗ рд╕реЗ рдмрдиреЗ tarball рдХреЛOPENCLAW_CURRENT_PACKAGE_TGZ=/path/to/openclaw-*.tgzрд╕реЗ reuse рдХрд░реЗрдВ, host rebuild рдХреЛOPENCLAW_NPM_ONBOARD_HOST_BUILD=0рд╕реЗ skip рдХрд░реЗрдВ, рдпрд╛ channel рдХреЛOPENCLAW_NPM_ONBOARD_CHANNEL=discordрдпрд╛OPENCLAW_NPM_ONBOARD_CHANNEL=slackрд╕реЗ switch рдХрд░реЗрдВред -
рд░рд┐рд▓реАрдЬрд╝ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпрд╛рддреНрд░рд╛ рд╕реНрдореЛрдХ:
pnpm test:docker:release-user-journeyрдкреИрдХ рдХрд┐рдП рдЧрдП OpenClaw tarball рдХреЛ рд╕рд╛рдл Docker home рдореЗрдВ рд╡реИрд╢реНрд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рддрд╛ рд╣реИ, onboarding рдЪрд▓рд╛рддрд╛ рд╣реИ, mocked OpenAI provider рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ, agent turn рдЪрд▓рд╛рддрд╛ рд╣реИ, рдмрд╛рд╣рд░реА plugins рдЗрдВрд╕реНрдЯреЙрд▓/рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рддрд╛ рд╣реИ, ClickClack рдХреЛ local fixture рдХреЗ рд╡рд┐рд░реБрджреНрдз рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ, outbound/inbound messaging рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ, Gateway рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рдХрд░рддрд╛ рд╣реИ, рдФрд░ doctor рдЪрд▓рд╛рддрд╛ рд╣реИред -
рд░рд┐рд▓реАрдЬрд╝ typed onboarding рд╕реНрдореЛрдХ:
pnpm test:docker:release-typed-onboardingрдкреИрдХ рдХрд┐рдП рдЧрдП tarball рдХреЛ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рддрд╛ рд╣реИ,openclaw onboardрдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ TTY рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛рддрд╛ рд╣реИ, OpenAI рдХреЛ env-ref provider рдХреЗ рд░реВрдк рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ, рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ raw key persistence рдирд╣реАрдВ рд╣реИ, рдФрд░ mocked agent turn рдЪрд▓рд╛рддрд╛ рд╣реИред -
рд░рд┐рд▓реАрдЬрд╝ media/memory рд╕реНрдореЛрдХ:
pnpm test:docker:release-media-memoryрдкреИрдХ рдХрд┐рдП рдЧрдП tarball рдХреЛ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рддрд╛ рд╣реИ, PNG attachment рд╕реЗ image understanding, OpenAI-compatible image generation output, memory search recall, рдФрд░ Gateway restart рдХреЗ рдмрд╛рдж recall survival рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред -
рд░рд┐рд▓реАрдЬрд╝ upgrade user journey рд╕реНрдореЛрдХ:
pnpm test:docker:release-upgrade-user-journeyрдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ candidate tarball рд╕реЗ рдкреБрд░рд╛рдирд╛ рд╕рдмрд╕реЗ рдирдпрд╛ published baseline рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рддрд╛ рд╣реИ, published package рдкрд░ provider/plugin/ClickClack state рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ, candidate tarball рдореЗрдВ upgrade рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ core agent/plugin/channel journey рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рдкреБрд░рд╛рдирд╛ published baseline рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ candidate version рдХрд╛ рдкреБрдирдГ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред Baseline рдХреЛOPENCLAW_RELEASE_UPGRADE_BASELINE_SPEC=openclaw@<version>рд╕реЗ override рдХрд░реЗрдВред -
рд░рд┐рд▓реАрдЬрд╝ Plugin marketplace рд╕реНрдореЛрдХ:
pnpm test:docker:release-plugin-marketplacelocal fixture marketplace рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рддрд╛ рд╣реИ, installed plugin рдХреЛ update рдХрд░рддрд╛ рд╣реИ, рдЙрд╕реЗ uninstall рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ install metadata prune рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде plugin CLI рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред -
Skill install рд╕реНрдореЛрдХ:
pnpm test:docker:skill-installpacked OpenClaw tarball рдХреЛ Docker рдореЗрдВ рд╡реИрд╢реНрд╡рд┐рдХ рд░реВрдк рд╕реЗ install рдХрд░рддрд╛ рд╣реИ, config рдореЗрдВ uploaded archive installs disable рдХрд░рддрд╛ рд╣реИ, search рд╕реЗ current live ClawHub skill slug resolve рдХрд░рддрд╛ рд╣реИ, рдЙрд╕реЗopenclaw skills installрд╕реЗ install рдХрд░рддрд╛ рд╣реИ, рдФрд░ installed skill рддрдерд╛.clawhuborigin/lock metadata рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред -
Update channel switch рд╕реНрдореЛрдХ:
pnpm test:docker:update-channel-switchpacked OpenClaw tarball рдХреЛ Docker рдореЗрдВ рд╡реИрд╢реНрд╡рд┐рдХ рд░реВрдк рд╕реЗ install рдХрд░рддрд╛ рд╣реИ, packagestableрд╕реЗ gitdevрдкрд░ switch рдХрд░рддрд╛ рд╣реИ, persisted channel рдФрд░ plugin post-update work рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ packagestableрдкрд░ рд╡рд╛рдкрд╕ switch рдХрд░рддрд╛ рд╣реИ рдФрд░ update status рдЬрд╛рдВрдЪрддрд╛ рд╣реИред -
Upgrade survivor рд╕реНрдореЛрдХ:
pnpm test:docker:upgrade-survivorpacked OpenClaw tarball рдХреЛ agents, channel config, plugin allowlists, stale plugin dependency state, рдФрд░ рдореМрдЬреВрджрд╛ workspace/session files рд╡рд╛рд▓реЗ dirty old-user fixture рдкрд░ install рдХрд░рддрд╛ рд╣реИред рдпрд╣ live provider рдпрд╛ channel keys рдХреЗ рдмрд┐рдирд╛ package update рдФрд░ non-interactive doctor рдЪрд▓рд╛рддрд╛ рд╣реИ, рдлрд┐рд░ loopback Gateway рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ рдФрд░ startup/status budgets рдХреЗ рд╕рд╛рде config/state preservation рдЬрд╛рдВрдЪрддрд╛ рд╣реИред -
Published upgrade survivor рд╕реНрдореЛрдХ:
pnpm test:docker:published-upgrade-survivorрдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗopenclaw@latestinstall рдХрд░рддрд╛ рд╣реИ, realistic existing-user files seed рдХрд░рддрд╛ рд╣реИ, baked command recipe рдХреЗ рд╕рд╛рде рдЙрд╕ baseline рдХреЛ configure рдХрд░рддрд╛ рд╣реИ, resulting config validate рдХрд░рддрд╛ рд╣реИ, рдЙрд╕ published install рдХреЛ candidate tarball рдореЗрдВ update рдХрд░рддрд╛ рд╣реИ, non-interactive doctor рдЪрд▓рд╛рддрд╛ рд╣реИ,.artifacts/upgrade-survivor/summary.jsonрд▓рд┐рдЦрддрд╛ рд╣реИ, рдлрд┐рд░ loopback Gateway рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ рдФрд░ configured intents, state preservation, startup,/healthz,/readyz, рдФрд░ RPC status budgets рдЬрд╛рдВрдЪрддрд╛ рд╣реИред рдПрдХ baseline рдХреЛOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECрд╕реЗ override рдХрд░реЗрдВ, aggregate scheduler рд╕реЗ exact local baselines expand рдХрд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдПOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECSрдЬреИрд╕реЗopenclaw@2026.5.2 openclaw@2026.4.23 openclaw@2026.4.15рджреЗрдВ, рдФрд░ issue-shaped fixtures рдХреЛOPENCLAW_UPGRADE_SURVIVOR_SCENARIOSрдЬреИрд╕реЗreported-issuesрд╕реЗ expand рдХрд░реЗрдВ; reported-issues set рдореЗрдВ automatic external OpenClaw plugin install repair рдХреЗ рд▓рд┐рдПconfigured-plugin-installsрд╢рд╛рдорд┐рд▓ рд╣реИред Package Acceptance рдЗрдиреНрд╣реЗрдВpublished_upgrade_survivor_baseline,published_upgrade_survivor_baselines, рдФрд░published_upgrade_survivor_scenariosрдХреЗ рд░реВрдк рдореЗрдВ expose рдХрд░рддрд╛ рд╣реИ,last-stable-4рдпрд╛all-since-2026.4.23рдЬреИрд╕реЗ meta baseline tokens resolve рдХрд░рддрд╛ рд╣реИ, рдФрд░ Full Release Validation release-soak package gate рдХреЛlast-stable-4 2026.4.23 2026.5.2 2026.4.15plusreported-issuesрддрдХ expand рдХрд░рддрд╛ рд╣реИред -
Session runtime context рд╕реНрдореЛрдХ:
pnpm test:docker:session-runtime-contexthidden runtime context transcript persistence рдФрд░ рдкреНрд░рднрд╛рд╡рд┐рдд duplicated prompt-rewrite branches рдХреА doctor repair рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред -
Bun global install рд╕реНрдореЛрдХ:
bash scripts/e2e/bun-global-install-smoke.shcurrent tree рдХреЛ pack рдХрд░рддрд╛ рд╣реИ, isolated home рдореЗрдВbun install -gрд╕реЗ install рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐openclaw infer image providers --jsonhang рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп bundled image providers рд▓реМрдЯрд╛рддрд╛ рд╣реИред Prebuilt tarball рдХреЛOPENCLAW_BUN_GLOBAL_SMOKE_PACKAGE_TGZ=/path/to/openclaw-*.tgzрд╕реЗ reuse рдХрд░реЗрдВ, host build рдХреЛOPENCLAW_BUN_GLOBAL_SMOKE_HOST_BUILD=0рд╕реЗ skip рдХрд░реЗрдВ, рдпрд╛ built Docker image рд╕реЗdist/рдХреЛOPENCLAW_BUN_GLOBAL_SMOKE_DIST_IMAGE=openclaw-dockerfile-smoke:localрд╕реЗ copy рдХрд░реЗрдВред -
Installer Docker рд╕реНрдореЛрдХ:
bash scripts/test-install-sh-docker.shрдЕрдкрдиреЗ root, update, рдФрд░ direct-npm containers рдореЗрдВ рдПрдХ npm cache share рдХрд░рддрд╛ рд╣реИред Update smoke candidate tarball рдореЗрдВ upgrade рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ stable baseline рдХреЗ рд░реВрдк рдореЗрдВ npmlatestрдкрд░ default рдХрд░рддрд╛ рд╣реИред LocallyOPENCLAW_INSTALL_SMOKE_UPDATE_BASELINE=2026.4.22рд╕реЗ override рдХрд░реЗрдВ, рдпрд╛ GitHub рдкрд░ Install Smoke workflow рдХреЗupdate_baseline_versioninput рд╕реЗред Non-root installer checks isolated npm cache рд░рдЦрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ root-owned cache entries user-local install behavior рдХреЛ mask рди рдХрд░реЗрдВред Local reruns рдореЗрдВ root/update/direct-npm cache reuse рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПOPENCLAW_INSTALL_SMOKE_NPM_CACHE_DIR=/path/to/cacheрд╕реЗрдЯ рдХрд░реЗрдВред -
Install Smoke CI duplicate direct-npm global update рдХреЛ
OPENCLAW_INSTALL_SMOKE_SKIP_NPM_GLOBAL=1рд╕реЗ skip рдХрд░рддрд╛ рд╣реИ; рдЬрдм directnpm install -gcoverage рдЪрд╛рд╣рд┐рдП рд╣реЛ, script рдХреЛ рдЙрд╕ env рдХреЗ рдмрд┐рдирд╛ locally рдЪрд▓рд╛рдПрдВред -
Agents delete shared workspace CLI рд╕реНрдореЛрдХ:
pnpm test:docker:agents-delete-shared-workspace(script:scripts/e2e/agents-delete-shared-workspace-docker.sh) рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ root Dockerfile image build рдХрд░рддрд╛ рд╣реИ, isolated container home рдореЗрдВ рдПрдХ workspace рд╡рд╛рд▓реЗ рджреЛ agents seed рдХрд░рддрд╛ рд╣реИ,agents delete --jsonрдЪрд▓рд╛рддрд╛ рд╣реИ, рдФрд░ valid JSON plus retained workspace behavior рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред Install-smoke image рдХреЛOPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_IMAGE=openclaw-dockerfile-smoke:local OPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_SKIP_BUILD=1рд╕реЗ reuse рдХрд░реЗрдВред -
Gateway networking (рджреЛ containers, WS auth + health):
pnpm test:docker:gateway-network(script:scripts/e2e/gateway-network-docker.sh) -
Browser CDP snapshot рд╕реНрдореЛрдХ:
pnpm test:docker:browser-cdp-snapshot(script:scripts/e2e/browser-cdp-snapshot-docker.sh) source E2E image plus Chromium layer build рдХрд░рддрд╛ рд╣реИ, raw CDP рдХреЗ рд╕рд╛рде Chromium рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ,browser doctor --deepрдЪрд▓рд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ CDP role snapshots link URLs, cursor-promoted clickables, iframe refs, рдФрд░ frame metadata cover рдХрд░рддреЗ рд╣реИрдВред -
OpenAI Responses web_search minimal reasoning regression:
pnpm test:docker:openai-web-search-minimal(script:scripts/e2e/openai-web-search-minimal-docker.sh) Gateway рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ mocked OpenAI server рдЪрд▓рд╛рддрд╛ рд╣реИ, рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐web_searchreasoning.effortрдХреЛminimalрд╕реЗlowрддрдХ рдмрдврд╝рд╛рддрд╛ рд╣реИ, рдлрд┐рд░ provider schema reject force рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ raw detail Gateway logs рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред -
MCP channel bridge (seeded Gateway + stdio bridge + raw Claude notification-frame рд╕реНрдореЛрдХ):
pnpm test:docker:mcp-channels(script:scripts/e2e/mcp-channels-docker.sh) -
OpenClaw bundle MCP tools (real stdio MCP server + embedded OpenClaw profile allow/deny рд╕реНрдореЛрдХ):
pnpm test:docker:agent-bundle-mcp-tools(script:scripts/e2e/agent-bundle-mcp-tools-docker.sh) -
Cron/subagent MCP cleanup (real Gateway + stdio MCP child teardown after isolated Cron and one-shot subagent runs):
pnpm test:docker:cron-mcp-cleanup(script:scripts/e2e/cron-mcp-cleanup-docker.sh) -
Plugins (local path,
file:, hoisted dependencies рд╡рд╛рд▓реА npm registry, malformed npm package metadata, git moving refs, ClawHub kitchen-sink, marketplace updates, рдФрд░ Claude-bundle enable/inspect рдХреЗ рд▓рд┐рдП install/update smoke):pnpm test:docker:plugins(script:scripts/e2e/plugins-docker.sh) ClawHub block skip рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПOPENCLAW_PLUGINS_E2E_CLAWHUB=0рд╕реЗрдЯ рдХрд░реЗрдВ, рдпрд╛ default kitchen-sink package/runtime pair рдХреЛOPENCLAW_PLUGINS_E2E_CLAWHUB_SPECрдФрд░OPENCLAW_PLUGINS_E2E_CLAWHUB_IDрд╕реЗ override рдХрд░реЗрдВредOPENCLAW_CLAWHUB_URL/CLAWHUB_URLрдХреЗ рдмрд┐рдирд╛, test hermetic local ClawHub fixture server рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред -
Plugin update unchanged рд╕реНрдореЛрдХ:
pnpm test:docker:plugin-update(script:scripts/e2e/plugin-update-unchanged-docker.sh) -
Plugin lifecycle matrix рд╕реНрдореЛрдХ:
pnpm test:docker:plugin-lifecycle-matrixbare container рдореЗрдВ packed OpenClaw tarball install рдХрд░рддрд╛ рд╣реИ, npm plugin install рдХрд░рддрд╛ рд╣реИ, enable/disable toggle рдХрд░рддрд╛ рд╣реИ, local npm registry рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрд╕реЗ upgrade рдФрд░ downgrade рдХрд░рддрд╛ рд╣реИ, installed code delete рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ uninstall рдЕрднреА рднреА stale state рд╣рдЯрд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рд╣рд░ lifecycle phase рдХреЗ рд▓рд┐рдП RSS/CPU metrics log рдХрд░рддрд╛ рд╣реИред -
Config reload metadata рд╕реНрдореЛрдХ:
pnpm test:docker:config-reload(script:scripts/e2e/config-reload-source-docker.sh) -
Plugins:
pnpm test:docker:pluginslocal path,file:, hoisted dependencies рд╡рд╛рд▓реА npm registry, git moving refs, ClawHub fixtures, marketplace updates, рдФрд░ Claude-bundle enable/inspect рдХреЗ рд▓рд┐рдП install/update smoke cover рдХрд░рддрд╛ рд╣реИредpnpm test:docker:plugin-updateinstalled plugins рдХреЗ рд▓рд┐рдП unchanged update behavior cover рдХрд░рддрд╛ рд╣реИредpnpm test:docker:plugin-lifecycle-matrixresource-tracked npm plugin install, enable, disable, upgrade, downgrade, рдФрд░ missing-code uninstall cover рдХрд░рддрд╛ рд╣реИред
Shared functional image рдХреЛ manually prebuild рдФрд░ reuse рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:
OPENCLAW_DOCKER_E2E_IMAGE=openclaw-docker-e2e-functional:local pnpm test:docker:e2e-buildOPENCLAW_DOCKER_E2E_IMAGE=openclaw-docker-e2e-functional:local OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:mcp-channelsSuite-specific image overrides рдЬреИрд╕реЗ OPENCLAW_GATEWAY_NETWORK_E2E_IMAGE рд╕реЗрдЯ рд╣реЛрдиреЗ рдкрд░ рдЕрднреА рднреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд▓реЗрддреЗ рд╣реИрдВред рдЬрдм OPENCLAW_SKIP_DOCKER_BUILD=1 рдХрд┐рд╕реА remote shared image рдХреА рдУрд░ point рдХрд░рддрд╛ рд╣реИ, рддреЛ scripts рдЙрд╕реЗ pull рдХрд░рддреЗ рд╣реИрдВ рдпрджрд┐ рд╡рд╣ рдкрд╣рд▓реЗ рд╕реЗ local рдирд╣реАрдВ рд╣реИред QR рдФрд░ installer Docker tests рдЕрдкрдиреЗ Dockerfiles рд░рдЦрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ shared built-app runtime рдХреЗ рдмрдЬрд╛рдп package/install behavior validate рдХрд░рддреЗ рд╣реИрдВред
рд▓рд╛рдЗрд╡-рдореЙрдбрд▓ Docker runners рдореМрдЬреВрджрд╛ checkout рдХреЛ read-only рд░реВрдк рдореЗрдВ bind-mount рднреА рдХрд░рддреЗ рд╣реИрдВ рдФрд░
рдЙрд╕реЗ container рдХреЗ рдЕрдВрджрд░ рдПрдХ temporary workdir рдореЗрдВ stage рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд╕реЗ runtime
image рд╣рд▓реНрдХреА рд░рд╣рддреА рд╣реИ, рдЬрдмрдХрд┐ Vitest рдлрд┐рд░ рднреА рдЖрдкрдХреЗ рдареАрдХ рд╕реНрдерд╛рдиреАрдп source/config рдХреЗ рд╡рд┐рд░реБрджреНрдз рдЪрд▓рддрд╛ рд╣реИред
staging рдЪрд░рдг рдмрдбрд╝реЗ local-only caches рдФрд░ app build outputs рдЬреИрд╕реЗ
.pnpm-store, .worktrees, __openclaw_vitest__, рдФрд░ app-local .build рдпрд╛
Gradle output directories рдХреЛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ, рддрд╛рдХрд┐ Docker live runs рдХреЛ
machine-specific artifacts рдХреЙрдкреА рдХрд░рдиреЗ рдореЗрдВ рдХрдИ рдорд┐рдирдЯ рди рд▓рдЧреЗрдВред
рд╡реЗ OPENCLAW_SKIP_CHANNELS=1 рднреА рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ gateway live probes container рдХреЗ рдЕрдВрджрд░
рд╡рд╛рд╕реНрддрд╡рд┐рдХ Telegram/Discord/рдЖрджрд┐ channel workers рд╢реБрд░реВ рди рдХрд░реЗрдВред
test:docker:live-models рдлрд┐рд░ рднреА pnpm test:live рдЪрд▓рд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬрдм рдЖрдкрдХреЛ рдЙрд╕ Docker lane рд╕реЗ gateway
live coverage рдХреЛ рд╕реАрдорд┐рдд рдпрд╛ рдмрд╛рд╣рд░ рдХрд░рдирд╛ рд╣реЛ, рддреЛ
OPENCLAW_LIVE_GATEWAY_* рднреА pass through рдХрд░реЗрдВред
test:docker:openwebui рдПрдХ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп compatibility smoke рд╣реИ: рдпрд╣ OpenAI-compatible HTTP endpoints enabled рдХреЗ рд╕рд╛рде рдПрдХ
OpenClaw gateway container рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ,
рдЙрд╕ gateway рдХреЗ рд╡рд┐рд░реБрджреНрдз рдПрдХ pinned Open WebUI container рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, Open WebUI рдХреЗ рдЬрд╝рд░рд┐рдП sign in рдХрд░рддрд╛ рд╣реИ,
рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ /api/models openclaw/default expose рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ Open WebUI рдХреЗ
/api/chat/completions proxy рдХреЗ рдЬрд╝рд░рд┐рдП рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ chat request рднреЗрдЬрддрд╛ рд╣реИред
release-path CI checks рдХреЗ рд▓рд┐рдП, рдЬрд┐рдиреНрд╣реЗрдВ Open WebUI sign-in рдФрд░ model discovery рдХреЗ рдмрд╛рдж
рдмрд┐рдирд╛ live model completion рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд┐рдП рд░реБрдХрдирд╛ рдЪрд╛рд╣рд┐рдП, OPENWEBUI_SMOKE_MODE=models рд╕реЗрдЯ рдХрд░реЗрдВред
рдкрд╣рд▓рд╛ run рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдзреАрдорд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ Docker рдХреЛ
Open WebUI image pull рдХрд░рдиреА рдкрдбрд╝ рд╕рдХрддреА рд╣реИ рдФрд░ Open WebUI рдХреЛ рдЕрдкрдирд╛ cold-start setup рдкреВрд░рд╛ рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣ lane рдПрдХ рдЙрдкрдпреЛрдЧреА live model key рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреА рд╣реИред рдЗрд╕реЗ process
environment, staged auth profiles, рдпрд╛ explicit OPENCLAW_PROFILE_FILE рдХреЗ рдЬрд╝рд░рд┐рдП рджреЗрдВред
рд╕рдлрд▓ runs { "ok": true, "model": "openclaw/default", ... } рдЬреИрд╕рд╛ рдПрдХ рдЫреЛрдЯрд╛ JSON payload print рдХрд░рддреЗ рд╣реИрдВред
test:docker:mcp-channels рдЬрд╛рдирдмреВрдЭрдХрд░ deterministic рд╣реИ рдФрд░ рдЗрд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ
Telegram, Discord, рдпрд╛ iMessage account рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реЛрддреАред рдпрд╣ seeded Gateway
container boot рдХрд░рддрд╛ рд╣реИ, рдПрдХ рджреВрд╕рд░рд╛ container рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ openclaw mcp serve spawn рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░
routed conversation discovery, transcript reads, attachment metadata,
live event queue behavior, outbound send routing, рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ stdio MCP bridge рдкрд░ Claude-style channel +
permission notifications verify рдХрд░рддрд╛ рд╣реИред notification check
raw stdio MCP frames рдХреЛ рд╕реАрдзреЗ inspect рдХрд░рддрд╛ рд╣реИ, рддрд╛рдХрд┐ smoke validate рдХрд░реЗ рдХрд┐
bridge рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ emit рдХрд░рддрд╛ рд╣реИ, рди рдХрд┐ рдХреЗрд╡рд▓ рдХреЛрдИ specific client SDK рдХреНрдпрд╛ surface рдХрд░рддрд╛ рд╣реИред
test:docker:agent-bundle-mcp-tools deterministic рд╣реИ рдФрд░ рдЗрд╕реЗ live
model key рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реЛрддреАред рдпрд╣ repo Docker image build рдХрд░рддрд╛ рд╣реИ, container рдХреЗ рдЕрдВрджрд░ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ stdio MCP probe server
рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рдЙрд╕ server рдХреЛ embedded OpenClaw bundle
MCP runtime рдХреЗ рдЬрд╝рд░рд┐рдП materialize рдХрд░рддрд╛ рд╣реИ, tool execute рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ verify рдХрд░рддрд╛ рд╣реИ рдХрд┐ coding рдФрд░ messaging
bundle-mcp tools рд░рдЦрддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ minimal рдФрд░ tools.deny: ["bundle-mcp"] рдЙрдиреНрд╣реЗрдВ filter рдХрд░рддреЗ рд╣реИрдВред
test:docker:cron-mcp-cleanup deterministic рд╣реИ рдФрд░ рдЗрд╕реЗ live model
key рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реЛрддреАред рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ stdio MCP probe server рдХреЗ рд╕рд╛рде рдПрдХ seeded Gateway рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рдПрдХ
isolated cron turn рдФрд░ рдПрдХ sessions_spawn one-shot child turn рдЪрд▓рд╛рддрд╛ рд╣реИ, рдлрд┐рд░ verify рдХрд░рддрд╛ рд╣реИ рдХрд┐
MCP child process рд╣рд░ run рдХреЗ рдмрд╛рдж exit рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
Manual ACP plain-language thread smoke (CI рдирд╣реАрдВ):
bun scripts/dev/discord-acp-plain-language-smoke.ts --channel <discord-channel-id> ...- рдЗрд╕ script рдХреЛ regression/debug workflows рдХреЗ рд▓рд┐рдП рд░рдЦреЗрдВред ACP thread routing validation рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдлрд┐рд░ рдЬрд╝рд░реВрд░рдд рдкрдбрд╝ рд╕рдХрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ delete рди рдХрд░реЗрдВред
рдЙрдкрдпреЛрдЧреА env vars:
OPENCLAW_CONFIG_DIR=...(default:~/.openclaw)/home/node/.openclawрдкрд░ mountedOPENCLAW_WORKSPACE_DIR=...(default:~/.openclaw/workspace)/home/node/.openclaw/workspaceрдкрд░ mountedOPENCLAW_PROFILE_FILE=...tests рдЪрд▓рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ mounted рдФрд░ sourcedOPENCLAW_DOCKER_PROFILE_ENV_ONLY=1рддрд╛рдХрд┐ рдХреЗрд╡рд▓OPENCLAW_PROFILE_FILEрд╕реЗ sourced env vars verify рд╣реЛрдВ, temporary config/workspace dirs рдФрд░ рдмрд┐рдирд╛ external CLI auth mounts рдХреЗOPENCLAW_DOCKER_CLI_TOOLS_DIR=...(default:~/.cache/openclaw/docker-cli-tools) Docker рдХреЗ рдЕрдВрджрд░ cached CLI installs рдХреЗ рд▓рд┐рдП/home/node/.npm-globalрдкрд░ mounted$HOMEрдХреЗ рдЕрдВрддрд░реНрдЧрдд external CLI auth dirs/files/host-auth...рдХреЗ рддрд╣рдд read-only mounted рд╣реЛрддреЗ рд╣реИрдВ, рдлрд┐рд░ tests рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ/home/node/...рдореЗрдВ copied рд╣реЛрддреЗ рд╣реИрдВ- Default dirs:
.minimax - Default files:
~/.codex/auth.json,~/.codex/config.toml,.claude.json,~/.claude/.credentials.json,~/.claude/settings.json,~/.claude/settings.local.json - Narrowed provider runs рдХреЗрд╡рд▓
OPENCLAW_LIVE_PROVIDERS/OPENCLAW_LIVE_GATEWAY_PROVIDERSрд╕реЗ inferred рдЬрд╝рд░реВрд░реА dirs/files mount рдХрд░рддреЗ рд╣реИрдВ OPENCLAW_DOCKER_AUTH_DIRS=all,OPENCLAW_DOCKER_AUTH_DIRS=none, рдпрд╛OPENCLAW_DOCKER_AUTH_DIRS=.claude,.codexрдЬреИрд╕реА comma list рд╕реЗ manually override рдХрд░реЗрдВ
- Default dirs:
- run рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
OPENCLAW_LIVE_GATEWAY_MODELS=.../OPENCLAW_LIVE_MODELS=... - in-container providers filter рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
OPENCLAW_LIVE_GATEWAY_PROVIDERS=.../OPENCLAW_LIVE_PROVIDERS=... - rebuild рдХреА рдЬрд╝рд░реВрд░рдд рди рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ reruns рдХреЗ рд▓рд┐рдП рдореМрдЬреВрджрд╛
openclaw:local-liveimage reuse рдХрд░рдиреЗ рд╣реЗрддреБOPENCLAW_SKIP_DOCKER_BUILD=1 - рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ creds profile store рд╕реЗ рдЖрдПрдВ (env рд╕реЗ рдирд╣реАрдВ),
OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1 - Open WebUI smoke рдХреЗ рд▓рд┐рдП gateway рджреНрд╡рд╛рд░рд╛ expose рдХрд┐рдпрд╛ рдЧрдпрд╛ model рдЪреБрдирдиреЗ рд╣реЗрддреБ
OPENCLAW_OPENWEBUI_MODEL=... - Open WebUI smoke рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП nonce-check prompt рдХреЛ override рдХрд░рдиреЗ рд╣реЗрддреБ
OPENCLAW_OPENWEBUI_PROMPT=... - pinned Open WebUI image tag override рдХрд░рдиреЗ рд╣реЗрддреБ
OPENWEBUI_IMAGE=...
Docs sanity
doc edits рдХреЗ рдмрд╛рдж docs checks рдЪрд▓рд╛рдПрдВ: pnpm check:docs.
рдЬрдм рдЖрдкрдХреЛ in-page heading checks рднреА рдЪрд╛рд╣рд┐рдП рд╣реЛрдВ, рддреЛ full Mintlify anchor validation рдЪрд▓рд╛рдПрдВ: pnpm docs:check-links:anchors.
Offline regression (CI-safe)
рдпреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ providers рдХреЗ рдмрд┐рдирд╛ "real pipeline" regressions рд╣реИрдВ:
- Gateway tool calling (mock OpenAI, рд╡рд╛рд╕реНрддрд╡рд┐рдХ gateway + agent loop):
src/gateway/gateway.test.ts(case: "runs a mock OpenAI tool call end-to-end via gateway agent loop") - Gateway wizard (WS
wizard.start/wizard.next, config writes + auth enforced):src/gateway/gateway.test.ts(case: "runs wizard over ws and writes auth token config")
Agent reliability evals (skills)
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рдХреБрдЫ CI-safe tests рд╣реИрдВ рдЬреЛ "agent reliability evals" рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ:
- рд╡рд╛рд╕реНрддрд╡рд┐рдХ gateway + agent loop рдХреЗ рдЬрд╝рд░рд┐рдП mock tool-calling (
src/gateway/gateway.test.ts)ред - End-to-end wizard flows рдЬреЛ session wiring рдФрд░ config effects validate рдХрд░рддреЗ рд╣реИрдВ (
src/gateway/gateway.test.ts)ред
skills рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдЬреЛ missing рд╣реИ (рджреЗрдЦреЗрдВ Skills):
- Decisioning: рдЬрдм skills prompt рдореЗрдВ listed рд╣реЛрдВ, рддреЛ рдХреНрдпрд╛ agent рд╕рд╣реА skill рдЪреБрдирддрд╛ рд╣реИ (рдпрд╛ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ ones рд╕реЗ рдмрдЪрддрд╛ рд╣реИ)?
- Compliance: рдХреНрдпрд╛ agent рдЙрдкрдпреЛрдЧ рд╕реЗ рдкрд╣рд▓реЗ
SKILL.mdрдкрдврд╝рддрд╛ рд╣реИ рдФрд░ required steps/args follow рдХрд░рддрд╛ рд╣реИ? - Workflow contracts: multi-turn scenarios рдЬреЛ tool order, session history carryover, рдФрд░ sandbox boundaries assert рдХрд░рддреЗ рд╣реИрдВред
Future evals рдХреЛ рдкрд╣рд▓реЗ deterministic рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдП:
- mock providers рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ scenario runner, рдЬреЛ tool calls + order, skill file reads, рдФрд░ session wiring assert рдХрд░реЗред
- skill-focused scenarios рдХрд╛ рдЫреЛрдЯрд╛ suite (use vs avoid, gating, prompt injection)ред
- optional live evals (opt-in, env-gated) рдХреЗрд╡рд▓ CI-safe suite рддреИрдпрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рджред
Contract tests (plugin рдФрд░ channel shape)
Contract tests verify рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рд░ registered plugin рдФрд░ channel рдЕрдкрдиреЗ
interface contract рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИред рд╡реЗ рд╕рднреА discovered plugins рдкрд░ iterate рдХрд░рддреЗ рд╣реИрдВ рдФрд░
shape рддрдерд╛ behavior assertions рдХрд╛ suite рдЪрд▓рд╛рддреЗ рд╣реИрдВред default pnpm test unit lane рдЬрд╛рдирдмреВрдЭрдХрд░
рдЗрди shared seam рдФрд░ smoke files рдХреЛ skip рдХрд░рддрд╛ рд╣реИ; рдЬрдм рдЖрдк shared channel рдпрд╛ provider surfaces рдЫреБрдПрдВ,
рддреЛ contract commands explicit рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдПрдВред
Commands
- рд╕рднреА contracts:
pnpm test:contracts - рдХреЗрд╡рд▓ channel contracts:
pnpm test:contracts:channels - рдХреЗрд╡рд▓ provider contracts:
pnpm test:contracts:plugins
Channel contracts
src/channels/plugins/contracts/*.contract.test.ts рдореЗрдВ рд╕реНрдерд┐рдд:
- plugin - basic plugin shape (id, name, capabilities)
- setup - setup wizard contract
- session-binding - session binding behavior
- outbound-payload - message payload structure
- inbound - inbound message handling
- actions - channel action handlers
- threading - thread ID handling
- directory - directory/roster API
- group-policy - group policy enforcement
Provider status contracts
src/plugins/contracts/*.contract.test.ts рдореЗрдВ рд╕реНрдерд┐рддред
- status - channel status probes
- registry - Plugin registry shape
Provider contracts
src/plugins/contracts/*.contract.test.ts рдореЗрдВ рд╕реНрдерд┐рдд:
- auth - auth flow contract
- auth-choice - auth choice/selection
- catalog - model catalog API
- discovery - Plugin discovery
- loader - Plugin loading
- runtime - provider runtime
- shape - Plugin shape/interface
- wizard - setup wizard
рдХрдм рдЪрд▓рд╛рдПрдВ
- plugin-sdk exports рдпрд╛ subpaths рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рдж
- channel рдпрд╛ provider plugin рдЬреЛрдбрд╝рдиреЗ рдпрд╛ modify рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж
- plugin registration рдпрд╛ discovery refactor рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж
Contract tests CI рдореЗрдВ рдЪрд▓рддреЗ рд╣реИрдВ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ API keys рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреАред
Regressions рдЬреЛрдбрд╝рдирд╛ (guidance)
рдЬрдм рдЖрдк live рдореЗрдВ рдорд┐рд▓рд╛ provider/model issue fix рдХрд░рддреЗ рд╣реИрдВ:
- рд╕рдВрднрд╡ рд╣реЛ рддреЛ CI-safe regression рдЬреЛрдбрд╝реЗрдВ (mock/stub provider, рдпрд╛ exact request-shape transformation capture рдХрд░реЗрдВ)
- рдЕрдЧрд░ рдпрд╣ inherently live-only рд╣реИ (rate limits, auth policies), рддреЛ live test рдХреЛ narrow рдФрд░ env vars рдХреЗ рдЬрд╝рд░рд┐рдП opt-in рд░рдЦреЗрдВ
- bug рдкрдХрдбрд╝рдиреЗ рд╡рд╛рд▓реА рд╕рдмрд╕реЗ рдЫреЛрдЯреА layer target рдХрд░рдирд╛ prefer рдХрд░реЗрдВ:
- provider request conversion/replay bug тЖТ direct models test
- gateway session/history/tool pipeline bug тЖТ gateway live smoke рдпрд╛ CI-safe gateway mock test
- SecretRef traversal guardrail:
src/secrets/exec-secret-ref-id-parity.test.tsregistry metadata (listSecretTargetRegistryEntries()) рд╕реЗ рд╣рд░ SecretRef class рдХреЗ рд▓рд┐рдП рдПрдХ sampled target derive рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ assert рдХрд░рддрд╛ рд╣реИ рдХрд┐ traversal-segment exec ids rejected рд╣реИрдВред- рдЕрдЧрд░ рдЖрдк
src/secrets/target-registry-data.tsрдореЗрдВ рдирдпрд╛includeInPlanSecretRef target family рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдЙрд╕ test рдореЗрдВclassifyTargetClassupdate рдХрд░реЗрдВред test рдЬрд╛рдирдмреВрдЭрдХрд░ unclassified target ids рдкрд░ fail рд╣реЛрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдирдИ classes silently skip рди рд╣реЛ рд╕рдХреЗрдВред