/**
 * Measure how much the judge's scores shift when the length-debias instruction
 * is toggled.
 *
 * What it actually measures
 * -------------------------
 * Given a finished report, this command re-judges every (sample, variant) pair
 * using the OPPOSITE length-debias setting from the original run. It then
 * compares the two score distributions with a bootstrap CI on the mean
 * difference.
 *
 * If the original report ran with debias-on (v3-cot-length), we re-judge with
 * v2-cot (legacy). If the original ran with debias-off, we re-judge with
 * v3-cot-length. Significant difference → the prompt change moves scores → the
 * judge is sensitive to the length-debias instruction. That's *consistent with*
 * length bias being present, but it doesn't prove it directly — a perfectly
 * length-neutral judge could in principle also be sensitive to the wording for
 * other reasons. We label the verdict accordingly.
 *
 * Cost
 * ----
 * Re-judging is a full second pass over all (sample, variant) cells. Cost
 * doubles vs the original run. The CLI surfaces this so users running on
 * large/expensive evaluations can opt in deliberately.
 */
import type { ExecutorFn, Report, Sample } from '../types/index.js';
import { type BootstrapDiffCI } from '../eval-core/bootstrap.js';
export interface DebiasValidateInput {
    report: Report;
    samples: Sample[];
    judgeExecutor: ExecutorFn;
    judgeModel: string;
    /** Variant to validate. Defaults to first variant. */
    variant?: string;
    /** Bootstrap iterations for the diff CI. Default 1000. */
    bootstrapSamples?: number;
    seed?: number;
    /** Progress hook. */
    onProgress?: (info: {
        sample_id: string;
        completed: number;
        total: number;
    }) => void;
}
export interface DebiasValidateResult {
    variant: string;
    /** Original lengthDebias setting (true if debias-on at run time). */
    originalLengthDebias: boolean;
    /** Pairs of (originalScore, alternateScore) per sample. */
    pairs: Array<{
        sample_id: string;
        originalScore: number;
        alternateScore: number;
    }>;
    meanOriginal: number;
    meanAlternate: number;
    /** Mean of (alternate - original). Positive = alternate prompt scored higher. */
    diffCI: BootstrapDiffCI;
    /** Verdict in the {未检测, 弱, 中, 强} bucket plus an English shadow. */
    verdict: {
        zh: string;
        en: string;
        level: 'none' | 'weak' | 'medium' | 'strong';
    };
    /** Total cost burned re-judging. */
    alternateJudgeCostUSD: number;
    /** Sample_ids that the report had but lacked judge scores. */
    unscored: string[];
    /** Sample_ids in the samples file that are missing from the report. */
    missing: string[];
}
/**
 * Re-judge every sample of `variant` in the given report with the OPPOSITE
 * lengthDebias setting and compute the bootstrap CI on the mean difference.
 *
 * The judge call uses the rubric from the samples file and the output stored
 * in the report — we do NOT re-execute the model. Only judging is repeated.
 *
 * Multi-dimensional samples currently use the rubric as fallback when there's
 * no top-level rubric. Per-dimension validation can be added later if needed.
 */
export declare function validateLengthDebias(input: DebiasValidateInput): Promise<DebiasValidateResult>;
export declare function formatDebiasValidate(result: DebiasValidateResult): string;
//# sourceMappingURL=debias-validate.d.ts.map