/** * The disposition ledger — nobody's silence goes uncounted. * * Pattern: small mutable accumulator behind a read-only report, the * context-ledger ingestion shape (accumulate during, read after). * Role: every Context Integrity check files one disposition per * encounter here. The ledger's two jobs: * * 1. THE INVARIANT — for every check that was registered, an encounter * count of zero is itself reportable. `assertAlive()` fails when a * registered check saw work available and filed nothing at all — * which is the wiring-rot failure mode ("the checker was unhooked and * the suite stayed green"), distinct from a clean run (encounters * with zero findings — healthy) and from a quiet run (no applicable * work — also healthy, and stated as such). * * 2. THE CANARY — in dev posture, a run mints one deliberately * contradictory synthetic encounter per registered check at start. * A checker that cannot catch its own canary is dead, and the run * says so by name instead of shipping a green report. Synthetic * findings are counted apart and never touch the real numbers. * * Everything here is plain data; `report()` returns fresh POJOs safe for * events, snapshots, and recordings. */ import type { CheckReport, Disposition, IntegritySeam } from './types.js'; /** Thrown by `assertAlive()` when a registered check demonstrably never ran. */ export declare class CheckerDeadError extends Error { readonly check: string; readonly seam: IntegritySeam; constructor(check: string, seam: IntegritySeam, detail: string); } export interface DispositionLedger { /** Declare a check exists at a seam. Registration is what makes silence auditable. */ register(check: string, seam: IntegritySeam): void; /** File one encounter's disposition. `at` = epoch ms of a `checked-fail`. */ note(check: string, seam: IntegritySeam, disposition: Disposition, at?: number): void; /** * File the dev-posture canary pair: the mint (a synthetic contradictory * encounter was created) and, when the check catches it, the catch. * Synthetic counts never touch the real ones. */ noteSynthetic(check: string, seam: IntegritySeam, event: 'minted' | 'caught'): void; /** Fresh POJO rows, one per registered (check, seam). */ report(): readonly CheckReport[]; /** * The T9 theorems, both: * (i) a registered check with real work available (`checked + findings + * notApplicable + unreachable === 0` while the caller states work * existed) is dead — the wiring rotted; * (ii) in dev posture, a check whose canary was minted and never caught * is dead — it runs but cannot fire. * Throws {@link CheckerDeadError} naming the first dead check. */ assertAlive(opts?: { workExisted?: boolean; }): void; } /** Start an empty ledger. One per run; feed it from every seam adapter. */ export declare function dispositionLedger(): DispositionLedger;