1.6 KiB
1.6 KiB
id, epic, title, type, status, feature, depends-on, blocks
| id | epic | title | type | status | feature | depends-on | blocks | ||
|---|---|---|---|---|---|---|---|---|---|
| 04-ci-drift-gate | conformance-system-v1 | CI drift gate — pnpm conformance with cross-feature event closure | technical-story | done | scripts |
|
|
Goal
pnpm conformance aggregates cross-feature checks that no single-file
ESLint rule can perform — most importantly, event closure: every event
declared in any manifest's consumes must have at least one matching
publishes somewhere in the repo.
Why
Per-file lint can't see cross-feature contracts. Without this gate, a
feature can declare it consumes X while no feature publishes X —
silent until the broken handler is exercised in prod.
Done when
pnpm conformanceexits 0 when manifests are consistent; non-zero with a clear error message on orphan consumers- Wired into
turbo.jsonas theconformancetask - Wired into
.github/workflows/ci.ymlafterpnpm lint
In scope
scripts/conformance.mjs— orphan-consumer check- Tests via vitest
- turbo.json + CI wiring
Out of scope
- Scaffold drift check (regenerate via
turbo gen feature, diff against on-disk state) — depends on generator updates landing - Repository write outside use-cases check — separate concern
- Reverse check (orphan publishers — events nothing consumes) — many events are intentionally "fire and forget"; not a closure violation
Tasks
- Story scaffold
scripts/conformance.mjsimplementation- Tests for the script
- Wire into root package.json + turbo.json
- Wire into ci.yml
- Final verification + closeout