/** * 解析 `--control` / `--treatment` 与 eval.yaml `variants` 的优先级合并。 * * 三态精度: * - CLI roles 出现(--control 或 --treatment 任一) → 完全替换 config.variants * (no merging)。CLI 跟 yaml 同时给意味着用户在 override yaml,合并会让 * control / treatment 角色和「跑哪些 variant」两件事纠缠 * - 仅 yaml → 用 `configVariantsToSpecs` 转换 * - 仅 batch 模式 → 留空,batch workflow 自己生成(baseline vs 每个 skill) * - 都没有 → throw,附带 skill-dir 下候选 variant 提示,引导显式声明 * * 之后做 variant 唯一性检查 —— 同一个物理 variant 不能同时在 --control 和 * --treatment,也不能 --treatment 内重复。按 `variantIdentity`(规范化后的物理身份, * 路径 resolve、目录与 SKILL.md 折叠、cwd 纳入)判重,而非派生短名,也不是裸 expr 字面量: * - `v1/greeter.md` 与 `v2/greeter.md` 短名都是 greeter 却是两个 variant —— 不该误判重复, * 最终唯一名由 resolveArtifacts 的 ensureUniqueVariantNames 消歧。 * - `./x.md` 与 `x.md`、`dir` 与 `dir/SKILL.md` 是同一份 skill —— 必须判为重复, * 否则会被解析成两个 artifact 后用 `x` / `x#2` 消歧,变成同一份 skill 自比, * 悄悄废掉「control 不能等于 treatment」的测量保护。 */ import type { EvalConfig, VariantSpec } from '../../../types/index.js'; export declare function resolveVariantSpecs(values: Record, evalConfig: EvalConfig | null, skillDir: string): VariantSpec[];