export type ExperimentStopReason = "verified-success-drop" | "rework-increase" | "cost-increase-without-quality-benefit" | "safety-incident" | "sample-corruption" | "provider-drift" | "model-drift" | "manual" | "completed"; export interface StopLossInput { successDrop: number; reworkIncrease: number; costIncrease: number; qualityBenefit?: boolean; safetyIncident: boolean; sampleCorruption: boolean; providerDrift?: boolean; modelDrift?: boolean; } export function experimentStopReason(input: StopLossInput, thresholds = { successDrop: 0.05, costIncrease: 0.2 }): ExperimentStopReason | undefined { if (input.safetyIncident) return "safety-incident"; if (input.sampleCorruption || ![input.successDrop, input.reworkIncrease, input.costIncrease].every(Number.isFinite)) return "sample-corruption"; if (input.providerDrift) return "provider-drift"; if (input.modelDrift) return "model-drift"; if (input.successDrop > thresholds.successDrop) return "verified-success-drop"; if (input.reworkIncrease > 0) return "rework-increase"; if (input.costIncrease > thresholds.costIncrease && !input.qualityBenefit) return "cost-increase-without-quality-benefit"; return undefined; } export function shouldStopExperiment(input: StopLossInput, thresholds = { successDrop: 0.05, costIncrease: 0.2 }): boolean { return experimentStopReason(input, thresholds) !== undefined; }