/** * 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