# Testing | Tier | Tool | Scope | |---|---|---| | unit | node:test | pure policy: wake ordering, budget, retention, triggers, prompts | | property | fast-check | laws: ordering stability, retention partition, reserve arithmetic | | integration | node:test | service HTTP + worker on tmpdirs, spool drain, telegram runtime vs fake server, ZAI tools vs fake REST, worktree with real git, deploy/CI pollers vs fake APIs, end-to-end walking skeleton with fake session | | snapshot | node:test snapshot asserts | serialization contracts (see below) | | coverage | node built-in + ratchet | committed floor, only rises | | browser | Playwright | web e2e when web/ or service routes change | | boot | podman | two-container readiness within 60 s | | compatibility | CI | previous images -> candidate -> previous | | mutation | scheduled diagnostic | survivors killed or baselined | Ordinary release tests make no real model or ZAI calls; the scheduled canary (`scripts/zai-canary.ts`) checks provider drift with bounded cost. Snapshot contracts live in `src/shared/contracts.snapshot.ts`; they pin wire shapes without volatile values (deterministic ids and clocks are injected). Run everything locally with `npm test`; coverage with `npm run coverage`.