/**
 * Arm validation — the teaching refusals.
 *
 * Every refusal here fires BEFORE a single model call. That is the whole design
 * rule: an incoherent comparison must cost nothing. The engine's other refusals
 * (an unstable baseline, an arm that did not take effect) can only be known
 * after the runs, and those refuse a VERDICT rather than throw — refusing after
 * spending N model calls would be hostile. These six can be known from the
 * declaration alone, so they throw.
 */
import type { ArmFacets, StrategyArm } from './types.js';
/**
 * A canonical key for one arm's CONFIGURATION (facets + removals), used only to
 * detect two arms that are secretly the same arm. Hand-rolled rather than
 * `JSON.stringify` because key order in an object literal is authoring
 * accident, and two arms written `{model, scorer}` and `{scorer, model}` are
 * the same arm.
 */
export declare function armConfigKey(arm: StrategyArm): string;
/** How many facet leaves an arm declares — 0 means it names no configuration. */
export declare function declaredFacetCount(facets: ArmFacets | undefined): number;
/**
 * Refuse every comparison that cannot mean anything, and resolve which arm is
 * the incumbent. Returns the resolved baseline arm id.
 */
export declare function validateStrategyArms(arms: readonly StrategyArm[], baselineArmId: string | undefined): string;
//# sourceMappingURL=validate.d.ts.map