import type { AuthoredWindtunnelVerdict } from './windtunnel-scorer-authored.js'; /** Per-survivor Gate-2 legibility — one row per surviving (non-culled) authored rule. */ export interface Gate2SurvivorRecord { ruleId: string; /** Held-out non-control activation count (the §5.3 O3 metric). Absent-from-map is reported as 0. */ heldOutActivations: number; /** Eligible ⟺ NOT window-disqualified AND `heldOutActivations > 0` (§1(k)). */ gate2Eligible: boolean; } /** The Gate-2 eligibility emission — a report field sibling to `heldOutActivationsByRule` (Q2). */ export interface Gate2Eligibility { /** The eligible rule ids — survivors with > 0 held-out activations in a non-disqualified window. */ eligibleRuleIds: string[]; /** Every survivor considered (the audit trail; (k) exclusions are legible here, not silent). */ survivors: Gate2SurvivorRecord[]; /** True ⟺ `authoredControlGate.illegitimate > 0` — the whole window is FAIL-equivalent (Q4). */ windowDisqualified: boolean; } /** * Derive the Gate-2-eligible set from a scored authored verdict + the run's minted * rule ids. Pure + deterministic (Tenet-15): output preserves `mintedRuleIds` order; * no Set/Map iteration leaks into the result. * * `mintedRuleIds` is NOT a verdict field (the verdict carries only `mintedRuleCount`) * — it is the run's minted set, threaded from the engine result. Keys align: an * authored rule's `mintedRuleId` IS its `heldOutActivationsByRule` key (both are the * persisted `ruleId`; C2a `firingLabelId ← ruleId`). */ export declare function deriveGate2Eligibility(input: { mintedRuleIds: readonly string[]; verdict: Pick; }): Gate2Eligibility; //# sourceMappingURL=gate2-eligibility.d.ts.map