/**
 * Shared campaign-score reductions used by every optimizer preset
 * (`runOptimization`, `runSkillOpt`, `compareProposers`). ONE definition of
 * "composite of a campaign" and "per-scenario / per-dimension breakdown" so
 * the optimizers cannot drift on how a surface's score is computed.
 */
import type { CampaignResult, Scenario } from './types';
/** Mean composite across a campaign: per cell, the mean of its judges'
 *  composites; then the mean across cells. Cells with no judge scores are
 *  skipped. Empty ⇒ 0. */
export declare function campaignMeanComposite<TArtifact, TScenario extends Scenario>(campaign: CampaignResult<TArtifact, TScenario>): number;
export interface CampaignBreakdown {
    /** Mean score per judge dimension across all cells. */
    dimensions: Record<string, number>;
    /** Per-scenario composite (mean over reps + judges) + the judge's free-form
     *  `notes` for that scenario (the "why" a reflective proposer grounds on). */
    scenarios: Array<{
        scenarioId: string;
        composite: number;
        notes?: string;
    }>;
}
/** Per-candidate evidence a reflective/patch proposer grounds its next proposal
 *  on: mean score per judge dimension + per-scenario composite. */
export declare function campaignBreakdown<TArtifact, TScenario extends Scenario>(campaign: CampaignResult<TArtifact, TScenario>): CampaignBreakdown;
//# sourceMappingURL=score-utils.d.ts.map