import type { AiFinding } from "../judge/engine.js"; import type { RegressionClaim, RegressionSet } from "./regression.js"; export interface Violation { kind: "re-filed" | "lost"; shotId: string; category: string; /** The panel the claim belongs to: the unit a lost claim is decided at. */ panel: string; why: string; } /** A claim its panel satisfied under a different label in the same lane. */ export interface Drift { shotId: string; panel: string; /** The category the claim was settled under. */ category: string; /** What the panel filed on that shot instead. */ filed: string[]; why: string; } export interface ReplayVerdict { violations: Violation[]; drift: Drift[]; } /** * The panel a claim belongs to. * * Freeze records it, so the committed manifest documents the unit the gate * decides at rather than leaving a reader to infer it. Today's partition is the * fallback, which is what makes manifests frozen before the field was added * grade correctly, and what keeps a renamed panel from silently marking every * claim in its lane lost. */ export declare function claimPanel(claim: RegressionClaim): string; /** * Did the candidate hold? Pure: given the settled claims and what the judge said * this time, name every way the two disagree, and every way they only appear to. */ export declare function evaluateReplay(set: RegressionSet, findings: AiFinding[]): ReplayVerdict; /** One violation's identity, for comparing one replay's verdict with another's. */ export declare function violationKey(v: Violation): string;