/**
 * Symbol-preflight report — the deterministic half of the W0198 two-stage
 * grader. Built per candidate output by `computePreflight()` in
 * `packages/eval/src/pipeline/preflight/`; consumed by the scoring bridge
 * (Phase 5) and emitted as an artifact (Phase 4) so reviewers can audit
 * which surface a deduction was computed against.
 *
 * The shape is a deliberate three-way discriminated union — `exists`,
 * `missing`, `unresolved` — not a binary plus a `confident` flag. Treating
 * the lanes as structurally distinct is load-bearing for measurement
 * integrity: collapsing `unresolved` into `missing` would re-introduce
 * hallucination in deterministic disguise, which is the whole failure
 * mode this tier exists to fix.
 *
 * Score impact, by lane:
 * - `exists`     — no deduction; LLM rubric is told the binding exists
 *                  and instructed not to litigate its existence.
 * - `missing`    — deterministic deduction in `code-correctness`; LLM
 *                  does not re-judge the existence question.
 * - `unresolved` — no deduction; grading for that binding falls through
 *                  to the W0196 / W0197 LLM-rubric path.
 *
 * @see docs/design-docs/two-stage-grader-symbol-preflight.md
 */
/**
 * Reason an `unresolved` finding was emitted. Each value names a specific
 * resolver-side limit; collapsing these into a single bucket would lose
 * the measurement-quality signal CI surfaces back to the framework's
 * authors.
 */
export type SymbolPreflightUnresolvedReason = "package-not-installed" | "types-entry-missing" | "parse-failed" | "reexport-hop-unfollowed";
export type SymbolPreflightFinding = {
    readonly result: "exists";
    readonly pkg: string;
    readonly version: string;
    readonly binding: string;
    readonly source: "types" | "runtime";
} | {
    readonly result: "missing";
    readonly pkg: string;
    readonly version: string;
    readonly binding: string;
} | {
    readonly result: "unresolved";
    readonly pkg: string;
    readonly binding: string;
    readonly reason: SymbolPreflightUnresolvedReason;
};
/**
 * Deduction roll-up — `total = min(missing_count * perMissing, cap)`.
 * The score the rubric merges in is `1 - total / cap`, computed in the
 * scoring bridge (Phase 5) so this report stays a pure data artifact.
 */
export interface SymbolPreflightDeduction {
    readonly perMissing: number;
    readonly cap: number;
    readonly total: number;
}
export interface SymbolPreflightReport {
    readonly candidate: {
        readonly taskId: string;
        readonly testIndex: number;
    };
    readonly findings: readonly SymbolPreflightFinding[];
    readonly deduction: SymbolPreflightDeduction;
}
