Declarative rule descriptor — the row of the catalogue, minus the predicate implementation (which lives in scan.ts).

interface RuleDescriptor {
    detectorTest: string;
    guideSection: string;
    id: RuleId;
    predicate: string;
    severity: Severity;
    source: RuleSource;
    specRef: string;
    title: string;
}

Properties

detectorTest: string

Path to the dedicated detector test (relative to package root).

guideSection: string

Migration-guide heading slug, or 'cross-source'.

id: RuleId
predicate: string

One-sentence description of when the predicate fires.

severity: Severity
source: RuleSource
specRef: string

Anchor into the engine's design rationale (e.g. "§5", "§9.1 row N", "§13"). Each rule earns its place by mapping to a load-bearing design commitment — typically the §3 denotational foundation (commits as the only way time advances, glitch-freedom as a theorem), the §4 two-primitive surface (Inputs and Derivations, everything else is composition), the §5 single-mutation API (graph.commit(intent, tx => …)), the §7 model/controller/engine layering, the §8 MVU front door (typed Msg union dispatched through update), the §9 discriminated-union "make impossible states impossible" discipline including the §9.1 race-class catalogue, the §12.4 in-flight surface additions, or the §13 deferred-symbol list. Stamped into every emitted finding so report consumers can trace a flagged pattern back to the design decision that motivates the migration.

title: string