@smurfy92/product-invariants
v0.7.0
Published
Standard Datalog invariants catalogue for product specs — drop-in rules for @smurfy92/product-graph.
Maintainers
Readme
@smurfy92/product-invariants
Standard Datalog rules catalogue for product specs. Drop-in for
@smurfy92/product-graph. Ships only.dlfiles — no runtime code.
Install
npm install --save-dev @smurfy92/product-invariants@smurfy92/product-graph check command resolves --rules-dir to the
invariants/ folder of this package by default.
Rules
| Rule | Detects |
|---|---|
| no-orphan-story | User story with no path: / api: binding in its frontmatter. Either an unimplemented feature or a missing doc/code link. |
| no-untested-critical | Domain marked status: "critical" whose pages/APIs are not referenced in any test file. |
| no-missing-translation | i18n key present in one locale but missing from another (FR vs EN, etc.). |
| no-rls-gap | Supabase table with no CREATE POLICY — risk of deny-all (feature broken) or open-all (data leak). |
| composite-domain-bloat | Domain accumulating more than 12 user stories — candidate to split. Count is derived in TS (DomainStoryCount), since @smurfy92/datalog has no .count aggregation. |
Each rule is heavily commented (why / how / ratchet pattern) — read the .dl source for context.
Grandfather pattern
Each rule ships with an <X>Grandfathered decl. Add tuples in a project-local
.dl file to silence specific cases:
// project-rules/grandfathers.dl
OrphanStoryGrandfathered("infra.sentry").
OrphanStoryGrandfathered("infra.rgaa-aa").
RlsGapGrandfathered("audit_log").Then point product-graph check --rules-dir at a comma-separated list of
folders, or use the multi-dir mode of @smurfy92/datalog runFromDirs.
Schema
The _schema.dl file declares every .input relation. Adding a new extractor
to @smurfy92/product-graph means declaring its output relation here.
License
MIT. See LICENSE.
