import type { AuthoredControls } from './authored-controls.js'; import type { PerRuleControlResult } from './windtunnel-firing.js'; import type { RuleFiring, ScorerInput, WindtunnelVerdict } from './windtunnel-scorer.js'; /** * Input to the authored scorer. Extends the mined `ScorerInput` MINUS * `positiveControlTargets` (that field is DERIVED here from `authoredControls`), * plus the §6 answer key and the held-out partition for the O3 metric. * * `firings` carries the MERGED train + held-out firings — a train-side FP fails the * whole window (a window-wide verdict), and `heldOutPrs` partitions them for the O3 * metric only. `exposureFloors` and the first two `actualExposure` legs pass straight * through to the mined scorer; the THIRD leg (`positiveControlsExercised`) is * OVERRIDDEN with |authoredControls.positive| (the option-(i) ruling — the §4 * differential at emission is the exercise proof; held-out activations never * inflate it because they are not emissions). */ export interface AuthoredScorerInput extends Omit { /** The §6 answer key from `deriveAuthoredControls` — the emitted positives + the kept non-emissions. */ authoredControls: Pick; /** Held-out (scored-slice) PR numbers — the O3 partition. Supplied from `split.heldOutPrs` at D4. */ heldOutPrs: ReadonlySet; } /** How the non-emission gate demoted the mined verdict ('none' = the mined verdict already met/exceeded the gate). */ export type AuthoredControlGateEffect = 'none' | 'fail-illegitimate' | 'honest-negative-not-certifiable'; /** * The non-emission gate's audit record — observable so a consumed non-emission is * NEVER a silent skip (Tenet-4). The counts report the raw `nonEmissions[]` tally * regardless of `effect`; `effect` reports the demotion actually APPLIED to the * mined verdict (so a more-severe mined FAIL can coexist with `effect: 'none'` * while `illegitimate > 0` — the counts, not `effect`, are the presence signal). */ export interface AuthoredControlGate { illegitimate: number; undecidable: number; deferred: number; effect: AuthoredControlGateEffect; } /** The mined verdict + the two authored additions (both never re-consulted for the verdict). */ export interface AuthoredWindtunnelVerdict extends WindtunnelVerdict { /** O3 (verdict-inert): `targetRuleId → held-out non-control activation count`. Join-back keyed. */ heldOutActivationsByRule: Record; /** The non-emission gate's audit record (§6 fold). */ authoredControlGate: AuthoredControlGate; } /** * Score an AUTHORED wind-tunnel run. Pure function: no IO, no clock, no * randomness, byte-identical across re-runs for identical inputs (Tenet-15). * Reduces to `scoreWindtunnel` after normalizing the §6 controls, applies the * non-emission gate (demote-only), and appends the verdict-inert O3 metric. */ export declare function scoreAuthoredWindtunnel(input: AuthoredScorerInput): AuthoredWindtunnelVerdict; /** * The AUTHORED sibling of `computePerRuleControlResults` (option-(i) ruling, * operator 2026-07-04 / #2291): a rule's per-rule positive-control verdict is * the §4 preimage-differential HELD AT EMISSION — the rule has ≥1 entry in * `authoredControls.positive[]` (only `differential-holds` fixtures reach it) — * never fire-on-window-diff (pre-window anchors have no window substrate by * §5.2 design). The negative leg and the cull axis are IDENTICAL to the mined * sibling: a rule firing on any negative control is culled (not a survivor, * never stamped); survivors fired on none, so `negativeControl` is invariantly * true. `evidenceRefs` carry §6-emission locus refs (`§6-emission:` prefixed) — * record-only, deliberately NOT shaped like 64-hex firing labelIds so they can * never be mistaken for (or joined against) the ground-truth key space. */ export declare function computeAuthoredPerRuleControlResults(input: { firings: RuleFiring[]; mintedRuleIds: string[]; authoredControls: Pick; }): Map; //# sourceMappingURL=windtunnel-scorer-authored.d.ts.map