/**
 * `PredictiveValidityResearcher` — concrete `Researcher` implementation
 * that drives selection from outcome-anchored predictive validity.
 *
 * Each method:
 *
 *   - `inspectFailures(runs)` — synthesizes failure modes from the
 *     bottom-quartile of `RunRecord`s on the configured proxy reward.
 *   - `proposeChange(failures)` — proposes steering changes that target
 *     the rubrics with the lowest predictive validity (decorative ones).
 *     Either reduce their weight in the composite, or recalibrate them.
 *   - `applyChange(changes, baseline)` — merges the proposed steering
 *     into the experiment plan.
 *   - `evaluateChange(plan)` — re-runs the predictive-validity check on
 *     the post-change runs and reports the delta.
 *
 * The result is a closed loop: the rubric weights drift toward the ones
 * that actually predict deployment outcomes, automatically. Pair with
 * `runRLCampaign` for the full auto-research story.
 */
import type { OutcomeStore } from '../meta-eval/outcome-store';
import { type RubricPredictiveValidityReport } from '../meta-eval/rubric-predictive-validity';
import type { ExperimentPlan, ExperimentResult, FailureMode, Researcher, SteeringChange } from '../researcher';
import type { RunRecord } from '../run-record';
export interface PredictiveValidityResearcherOptions {
    outcomes: OutcomeStore;
    outcomeMetrics: string[];
    /** Score threshold below which a run counts as a "failure." Default 0.5. */
    failureThreshold?: number;
    /** Spearman bucket below which a rubric is "decorative." Default 0.4. */
    decorativeThreshold?: number;
    /** Optional steering-namespace prefix for proposed changes. Default `'rubric_weight'`. */
    steeringNamespace?: string;
    /** Override the rubric set the researcher inspects. Default: every numeric `outcome.raw` key seen. */
    rubrics?: string[];
    /**
     * Snapshot stash hook — called with the most recent predictive-validity
     * report. Useful when a downstream system wants to log rubric drift over
     * time. Default no-op.
     */
    onReport?: (report: RubricPredictiveValidityReport) => void | Promise<void>;
}
/**
 * Concrete `Researcher` driven by `rubricPredictiveValidity`. The brain:
 * rubrics that don't predict deployment outcomes don't earn weight.
 */
export declare class PredictiveValidityResearcher implements Researcher {
    private opts;
    private lastReport;
    constructor(opts: PredictiveValidityResearcherOptions);
    inspectFailures(runs: RunRecord[]): Promise<FailureMode[]>;
    proposeChange(failures: FailureMode[]): Promise<SteeringChange[]>;
    applyChange(changes: SteeringChange[], baseline: ExperimentPlan): Promise<ExperimentPlan>;
    evaluateChange(plan: ExperimentPlan): Promise<ExperimentResult>;
    /**
     * Run the predictive-validity check explicitly against a fresh RunRecord
     * set. Updates the researcher's cached report so subsequent
     * `proposeChange` calls have evidence to draw from.
     */
    runValidityCheck(runs: RunRecord[]): Promise<RubricPredictiveValidityReport>;
    /**
     * Force-feed a predictive-validity report into the researcher state —
     * useful when the consumer ran the report out-of-band and wants the
     * researcher's later proposals informed by it.
     */
    setReport(report: RubricPredictiveValidityReport): void;
    getLastReport(): RubricPredictiveValidityReport | null;
}
//# sourceMappingURL=predictive-validity-researcher.d.ts.map