Estimate: 30m · Depends on: 6.6.3, 6.6.5, 6.6.6
The story-closing verification (Principle #18; the epic-wide journey stays Story 6.7 — do not duplicate it).
Vitest (integration, real Postgres + the in-process job harness): the engine matrix — every (trigger × config-narrowing) × (condition pass / fail / empty / Epic-5 row) × (action) cell against seeded data, DRIVEN FROM the registries (a new entry without a matrix case fails the suite — the 6.1.6 totality-guard pattern), incl. ordered multi-action rules and per-action failure isolation; the loop-prevention proofs (self-trigger, A-triggers-B via provenance — neither cascades); idempotency (replay / retry per event × rule); failure ops (counter, auto-disable at 10, reset on success + re-enable, the first-failure-only email via the email harness); caps + retention (101st rule / 11th action / 21st row 422s; the sweep's >90d boundary); attribution (revision/comment rows carry the owner).
Playwright E2E (tests/e2e/automation.spec.ts): the recipe journey — create the Bug-to-Done rule in the editor (trigger config + condition row + two actions), fire it from the board, await the async effects (watcher + comment + Success audit row), assert the no-actions path on a non-matching item, drive a Failure (illegal transition target) through to the audit detail + banner, and verify the viewer lockout. a11y: the strict axe sweep over list, editor (every row kind open once), and audit log.
pnpm test:coverage keeps all 6.6 files ≥90%.tests/integration/ + tests/e2e/ conventions; the E2E harness/OOM/selector memories