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.
# 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`.