/** * SynthesisResult: the ranked output of synthesize() (ranking shape, not * pass/fail — contrast with EvalResult returned by reconcile()). */ export interface SynthesisResult { /** The approach with the highest aggregate score across all lenses. */ winner: string; /** * All approaches ordered descending by total score. * Deterministic tie-break: lower original index in `approaches` wins * when two approaches have equal totals (i.e. the approach that appeared * earlier in the caller's list is ranked higher). */ ranking: Array<{ approach: string; perLensScores: Record; total: number; }>; /** * Placeholder collection slot for cross-approach ideas worth grafting into * the winner. This sprint uses runner-up approach names as a simple default; * future sprints may populate this with extracted proposal fragments. */ graftedIdeas: string[]; /** * Lenses whose individual top-scored approach differs from the overall winner. * Each entry is a human-readable string identifying the lens and its preferred * approach, e.g. "scalability: prefers approach-B". */ dissent: string[]; } /** * Pure ranking reducer over per-lens approach scores (sibling of reconcile()). * No Date.now / new Date / Math.random / fs — this function is deterministic * given the same inputs. * * Tie-break rule (documented): when two approaches have equal aggregate totals, * the approach whose index is LOWER in the original `approaches` array wins. * This is achieved by capturing original indices before sorting and using them * as a stable comparator secondary key. * * @param approaches - Ordered list of approach identifiers to rank. * @param lensScores - Per-lens score maps: each entry has a lens name and a * `scores` record mapping approach → numeric score. Missing approach keys * contribute 0 for that lens. * @throws {Error} if `approaches` is empty (mirrors reconcile() guard). */ export declare function synthesize(approaches: string[], lensScores: Array<{ lens: string; scores: Record; }>): SynthesisResult; //# sourceMappingURL=synthesizer.d.ts.map