import type { Violation } from './types.js'; export interface FingerprintInput { analyzer: string; rule: string; file: string; symbol: string; } /** * Produce a stable hex SHA-256 digest from the canonical four-tuple. * * The components are JSON-serialized in a fixed-order array so that a colon * or any other character inside a component cannot create an ambiguous * boundary. */ export declare function fingerprint(input: FingerprintInput): string; /** * Build the canonical {analyzer, rule, file, symbol} tuple for a violation. * * This is the ONE place rule-id resolution happens. If a violation stores its * rule identifier in a field not listed here, that violation fingerprints * with an empty rule — add the missing field to the chain below. * * Precedence (first populated wins): * 1. `violation.rule` — universal analyzers, invariants, react (hooks) * 2. `violation.principle` — CrossLanguageSOLID * 3. `violation.violationType` — SchemaValidator, reactAnalyzer * 4. `violation.contractType` — APIContractAnalyzer * 5. `violation.type` — structural type (rarely a rule id; last-resort) * 6. `violation.details?.rule` — nested rule (react) */ export declare function buildFingerprintInput(violation: Violation): FingerprintInput; //# sourceMappingURL=fingerprint.d.ts.map