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<AuthoredWindtunnelVerdict, 'cullLedger' | 'heldOutActivationsByRule' | 'authoredControlGate'>;
}): Gate2Eligibility;
//# sourceMappingURL=gate2-eligibility.d.ts.map