From 4a389b29eb6f86f5a03c5da9faa9fd5911a49c2c Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 16 Jun 2026 09:14:05 +0000 Subject: [PATCH] feat: add lowestToThirdRatio to cast explanation (CCCCCCCCC) https://claude.ai/code/session_015M28YVKoN414NZLpFbLSU5 --- src/aggregator.ts | 3 +- ...cast-explain-lowest-to-third-ratio.test.ts | 261 ++++++++++++++++++ 2 files changed, 263 insertions(+), 1 deletion(-) create mode 100644 test/ccccccccc-cast-explain-lowest-to-third-ratio.test.ts diff --git a/src/aggregator.ts b/src/aggregator.ts index 425104f..e1c03e5 100644 --- a/src/aggregator.ts +++ b/src/aggregator.ts @@ -387,6 +387,7 @@ export class Aggregator { 'explanation also includes lowestToNonWinnerMassRatio: number — the lowest candidate score as a fraction of total non-winner pool mass: lowestCandidateScore / (candidateScoreEntropyTotal - winnerScore). Present when >= 2 candidates, total > 0, non-winner mass > 0, and lowestCandidateScore > 0. Absent on cast:no_match, single candidate, zero total, zero non-winner mass, or zero lowest score. Always in (0, 1]: the lowest score is at most the entire non-winner mass, with equality exactly at n=2. For n=2: lowestToNonWinnerMassRatio === 1, because the lowest-ranked candidate is the only non-winner. Always <= runnerUpToNonWinnerMassRatio: the lowest score is at most the runner-up score, and both share the same denominator. Identity: lowestToNonWinnerMassRatio === lowestCandidateScoreHeavinessRatio / nonWinnerScoreHeavinessRatio when all three are present. Complements runnerUpToNonWinnerMassRatio by anchoring the lower end of the non-winner pool distribution. ' + 'explanation also includes lowestToRunnerUpRatio: number — the lowest candidate score divided by the runner-up score: lowestCandidateScore / runnerUpScore. Present when >= 2 candidates, runnerUpScore > 0, and lowestCandidateScore > 0. Absent on cast:no_match, single candidate, zero runner-up score, or zero lowest score. Always in (0, 1]: the lowest score is at most the runner-up score. For n=2: equals 1, because the lowest-ranked candidate is the runner-up when n=2. Identity: lowestToRunnerUpRatio * runnerUpScore === lowestCandidateScore. Measures how tightly clustered the weakest candidate is to the runner-up — values near 1 indicate a tight non-winner pack; low values indicate a large gap between the runner-up and the tail of the field. ' + 'explanation also includes thirdToRunnerUpRatio: number — the third-ranked candidate score divided by the runner-up score: thirdCandidateScore / runnerUpScore. Present when >= 3 candidates, runnerUpScore > 0, and thirdCandidateScore > 0. Absent on cast:no_match, fewer than 3 candidates, zero runner-up score, or zero third score. Always in (0, 1]: the third-ranked score is at most the runner-up score. For n=3: equals lowestToRunnerUpRatio, because the third candidate is also the lowest when n=3. Always >= lowestToRunnerUpRatio when both are present: the third-ranked score is at most the runner-up but at least the lowest. Identity: thirdToRunnerUpRatio * runnerUpScore === thirdCandidateScore. Complements lowestToRunnerUpRatio by anchoring the third position relative to the runner-up. ' + + 'explanation also includes lowestToThirdRatio: number — the lowest candidate score divided by the third-ranked score: lowestCandidateScore / thirdCandidateScore. Present when >= 3 candidates, thirdCandidateScore > 0, and lowestCandidateScore > 0. Absent on cast:no_match, fewer than 3 candidates, zero third score, or zero lowest score. Always in (0, 1]: the lowest score is at most the third-ranked score (ranking is descending). For n=3: the lowest-ranked candidate is also the third-ranked candidate, so lowestToThirdRatio === 1 always when n=3. Always <= lowestToRunnerUpRatio when both are present: since runnerUpScore >= thirdCandidateScore, dividing the same lowest by the smaller thirdCandidateScore gives lowest/third >= lowest/runnerUp; equivalently the chain is lowestCandidateScoreRatio (lowest/winner) <= lowestToRunnerUpRatio (lowest/runnerUp) <= lowestToThirdRatio (lowest/third) — the denominator shrinks at each step so the ratio grows. Always >= lowestCandidateScoreRatio (lowest/winner): since winner >= third, lowest/third >= lowest/winner. Complements thirdToRunnerUpRatio (third/runnerUp) and lowestToRunnerUpRatio (lowest/runnerUp) by completing the "floor-relative-to-rank-N" family. A value near 1 means the lowest candidate is nearly as strong as the 3rd-ranked; a value near 0 means the floor falls far below the 3rd-ranked tool. Identity: lowestToThirdRatio * thirdCandidateScore === lowestCandidateScore always holds when present. ' + 'explanation also includes candidateScoreNonWinnerGeometricMean: number — the geometric mean of all non-winner candidate scores: (product of non-winner scores)^(1/(n-1)). Present when >= 3 candidates and all non-winner scores are positive. Absent on cast:no_match, fewer than 3 candidates, or when any non-winner score is zero. Always > 0 when present. Always <= candidateScoreNonWinnerMean: the arithmetic mean is always >= the geometric mean (AM-GM inequality). Always >= lowestCandidateScore: the geometric mean is always >= the minimum of the values. For n=3: equals sqrt(runnerUpScore * thirdCandidateScore), the geometric mean of the two non-winner scores. Identity: candidateScoreNonWinnerGeometricMean^(n-1) === product of all non-winner scores. Complements candidateScoreNonWinnerMean and candidateScoreNonWinnerStdDev by providing a multiplicative-scale summary of the non-winner pool. ' + 'explanation also includes candidateScoreNonWinnerHarmonicMean: number — the harmonic mean of all non-winner candidate scores: (n-1) / sum(1/score_i for non-winner i). Present when >= 3 candidates and all non-winner scores are positive. Absent on cast:no_match, fewer than 3 candidates, or when any non-winner score is zero. Always > 0 when present. Always <= candidateScoreNonWinnerGeometricMean: the HM-GM-AM inequality holds, so harmonic <= geometric <= arithmetic mean. Always >= lowestCandidateScore: the harmonic mean is at least the minimum value. For n=3: equals 2 * runnerUpScore * thirdCandidateScore / (runnerUpScore + thirdCandidateScore). Completes the Pythagorean means trio alongside candidateScoreNonWinnerMean (AM) and candidateScoreNonWinnerGeometricMean (GM); the spread between all three indicates distributional skewness within the non-winner pool. ' + 'explanation also includes candidateScoreNonWinnerMidRange: number — the midpoint between the highest and lowest non-winner scores: (runnerUpScore + lowestCandidateScore) / 2. Present when >= 3 candidates, runnerUpScore > 0, and lowestCandidateScore > 0. Absent on cast:no_match, fewer than 3 candidates, or when either boundary score is zero. Always > 0 when present. Always in [lowestCandidateScore, runnerUpScore]: bounded by the non-winner extremes. For n=3: equals candidateScoreNonWinnerMean, because the midrange and arithmetic mean coincide for a two-element set. Identity: 2 * candidateScoreNonWinnerMidRange === runnerUpScore + lowestCandidateScore. Complements candidateScoreNonWinnerMean by providing a range-center view robust to interior outliers alongside the mass-center view. ' + @@ -2348,7 +2349,7 @@ function buildCastExplanation( ...(brainMs !== undefined ? { brainMs } : {}), candidateCount: scoredTools.length, ...(best !== undefined ? { winnerScore: best.score, winnerServer: best.namespacedName.split('/')[0], winnerCategory: best.category, topCandidatesMeanScore: topCandidates.reduce((s, c) => s + c.score, 0) / topCandidates.length, ...(candidateScoreEntropyTotal > 0 ? { scoreDominanceIndex: best.score / candidateScoreEntropyTotal } : {}), ...(scoredTools.length >= 2 && candidateScoreEntropyTotal > 0 ? { nonWinnerScoreHeavinessRatio: (candidateScoreEntropyTotal - best.score) / candidateScoreEntropyTotal } : {}) } : {}), - ...(topCandidates.length > 1 ? { runnerUpScore: topCandidates[1].score, runnerUpTool: topCandidates[1].tool, runnerUpServer: topCandidates[1].tool.split('/')[0], runnerUpCategory: scoredTools[1].category, candidateScoreSpread: scoredTools[0].score - scoredTools[scoredTools.length - 1].score, lowestCandidateScore: scoredTools[scoredTools.length - 1].score, ...(scoredTools.length >= 3 ? { thirdCandidateScore: scoredTools[2].score } : {}), ...(scoredTools.length >= 3 && scoredTools[0].score > 0 ? { thirdCandidateScoreToWinnerRatio: scoredTools[2].score / scoredTools[0].score } : {}), ...(scoredTools.length >= 3 && scoredTools[0].score > scoredTools[scoredTools.length - 1].score ? { winnerThirdGapToSpreadRatio: (scoredTools[0].score - scoredTools[2].score) / (scoredTools[0].score - scoredTools[scoredTools.length - 1].score) } : {}), ...(scoredTools.length >= 3 ? { winnerThirdGap: scoredTools[0].score - scoredTools[2].score } : {}), ...(scoredTools.length >= 3 && scoredTools[0].score > scoredTools[scoredTools.length - 1].score ? { runnerUpThirdGapToSpreadRatio: (topCandidates[1].score - scoredTools[2].score) / (scoredTools[0].score - scoredTools[scoredTools.length - 1].score) } : {}), ...(scoredTools.length >= 3 && candidateScoreStdDev !== undefined && candidateScoreStdDev > 0 ? { thirdCandidateScoreZScore: (scoredTools[2].score - candidateScoreEntropyTotal / scoredTools.length) / candidateScoreStdDev } : {}), ...(candidateScoreStdDev !== undefined && candidateScoreStdDev > 0 ? { lowestCandidateScoreZScore: (scoredTools[scoredTools.length - 1].score - candidateScoreEntropyTotal / scoredTools.length) / candidateScoreStdDev } : {}), ...(candidateScoreStdDev !== undefined && candidateScoreStdDev > 0 ? { candidateScoreStandardizedRange: (scoredTools[0].score - scoredTools[scoredTools.length - 1].score) / candidateScoreStdDev } : {}), ...(scoredTools.length >= 3 ? { runnerUpThirdGap: topCandidates[1].score - scoredTools[2].score } : {}), ...(scoredTools.length >= 3 && candidateScoreEntropyTotal > 0 ? { thirdCandidateScoreToMeanRatio: scoredTools[2].score / (candidateScoreEntropyTotal / scoredTools.length) } : {}), ...(scoredTools.length >= 3 && topCandidates[1].score > 0 ? { thirdCandidateScoreToRunnerUpRatio: scoredTools[2].score / topCandidates[1].score } : {}), ...(candidateScoreEntropy !== undefined ? { candidateScoreEntropy } : {}), ...(candidateGiniCoefficient !== undefined ? { candidateGiniCoefficient } : {}), ...(candidateScoreSkewness !== undefined ? { candidateScoreSkewness } : {}), ...(candidateScoreKurtosis !== undefined ? { candidateScoreKurtosis } : {}), ...(candidateScoreVariance !== undefined ? { candidateScoreVariance } : {}), ...(candidateScoreStdDev !== undefined ? { candidateScoreStdDev } : {}), candidateScoreMean: candidateScoreEntropyTotal / scoredTools.length, ...(medianCandidateScore !== undefined ? { medianCandidateScore } : {}), ...(scoredTools[0].score > 0 ? { candidateScoreMeanRatio: (candidateScoreEntropyTotal / scoredTools.length) / scoredTools[0].score } : {}), ...(candidateScoreStdDev !== undefined && candidateScoreEntropyTotal > 0 ? { candidateScoreCoefficientOfVariation: candidateScoreStdDev / (candidateScoreEntropyTotal / scoredTools.length) } : {}), ...(medianCandidateScore !== undefined && candidateScoreEntropyTotal > 0 ? { medianToMeanRatio: medianCandidateScore / (candidateScoreEntropyTotal / scoredTools.length) } : {}), ...(medianCandidateScore !== undefined && medianCandidateScore > 0 ? { winnerToMedianRatio: scoredTools[0].score / medianCandidateScore } : {}), ...(candidateScoreStdDev !== undefined && candidateScoreStdDev > 0 ? { winnerScoreZScore: (scoredTools[0].score - candidateScoreEntropyTotal / scoredTools.length) / candidateScoreStdDev } : {}), ...(candidateScoreStdDev !== undefined && candidateScoreStdDev > 0 ? { runnerUpScoreZScore: (topCandidates[1].score - candidateScoreEntropyTotal / scoredTools.length) / candidateScoreStdDev } : {}), ...(candidateScoreStdDev !== undefined && candidateScoreStdDev > 0 ? { zScoreGap: (scoredTools[0].score - topCandidates[1].score) / candidateScoreStdDev } : {}), ...(candidateScoreStdDev !== undefined && candidateScoreStdDev > 0 ? { nonWinnerMeanZScore: ((candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1) - candidateScoreEntropyTotal / scoredTools.length) / candidateScoreStdDev } : {}), ...(candidateScoreEntropyTotal > 0 ? { candidateScoreNormalizedRange: (scoredTools[0].score - scoredTools[scoredTools.length - 1].score) / (candidateScoreEntropyTotal / scoredTools.length) } : {}), ...(scoredTools[0].score > 0 ? { lowestCandidateScoreRatio: scoredTools[scoredTools.length - 1].score / scoredTools[0].score } : {}), ...(candidateScoreEntropyTotal > 0 ? { candidateScoreLowestToMeanRatio: scoredTools[scoredTools.length - 1].score / (candidateScoreEntropyTotal / scoredTools.length) } : {}), ...(medianCandidateScore !== undefined && medianCandidateScore > 0 ? { candidateScoreLowestToMedianRatio: scoredTools[scoredTools.length - 1].score / medianCandidateScore } : {}), ...(candidateScoreGeometricMean !== undefined && candidateScoreGeometricMean > 0 ? { candidateScoreLowestToGeometricMeanRatio: scoredTools[scoredTools.length - 1].score / candidateScoreGeometricMean } : {}), ...(candidateScoreHarmonicMean !== undefined && candidateScoreHarmonicMean > 0 ? { candidateScoreLowestToHarmonicMeanRatio: scoredTools[scoredTools.length - 1].score / candidateScoreHarmonicMean } : {}), ...(nonZeroCandidateFraction !== undefined ? { nonZeroCandidateFraction } : {}), ...(topHeavinessRatio !== undefined ? { topHeavinessRatio } : {}), ...(candidateScoreHerfindahlIndex !== undefined ? { candidateScoreHerfindahlIndex } : {}), ...(effectiveN !== undefined ? { effectiveN } : {}), ...(scoreEntropyNormalized !== undefined ? { scoreEntropyNormalized } : {}), ...(candidateScoreIQR !== undefined ? { candidateScoreIQR } : {}), ...(candidateScoreIQRRatio !== undefined ? { candidateScoreIQRRatio } : {}), ...(candidateScoreIQR !== undefined && scoredTools[0].score > scoredTools[scoredTools.length - 1].score ? { candidateScoreIQRCoverage: candidateScoreIQR / (scoredTools[0].score - scoredTools[scoredTools.length - 1].score) } : {}), ...(candidateScoreEntropyTotal > 0 ? { top2HeavinessRatio: (scoredTools[0].score + topCandidates[1].score) / candidateScoreEntropyTotal } : {}), ...(candidateScoreEntropyTotal > 0 && topCandidates[1].score > 0 ? { runnerUpScoreHeavinessRatio: topCandidates[1].score / candidateScoreEntropyTotal } : {}), ...(candidateScoreEntropyTotal > 0 && scoredTools[scoredTools.length - 1].score > 0 ? { lowestCandidateScoreHeavinessRatio: scoredTools[scoredTools.length - 1].score / candidateScoreEntropyTotal } : {}), ...(scoredTools.length >= 3 && candidateScoreEntropyTotal > 0 && scoredTools[2].score > 0 ? { thirdCandidateScoreHeavinessRatio: scoredTools[2].score / candidateScoreEntropyTotal } : {}), ...(candidateScoreEntropyTotal > 0 && (candidateScoreEntropyTotal - scoredTools[0].score) > 0 ? { winnerToNonWinnerMassRatio: scoredTools[0].score / (candidateScoreEntropyTotal - scoredTools[0].score) } : {}), ...(candidateScoreEntropyTotal > 0 && (candidateScoreEntropyTotal - scoredTools[0].score) > 0 && topCandidates[1].score > 0 ? { runnerUpToNonWinnerMassRatio: topCandidates[1].score / (candidateScoreEntropyTotal - scoredTools[0].score) } : {}), ...(candidateScoreEntropyTotal > 0 && (candidateScoreEntropyTotal - scoredTools[0].score) > 0 && scoredTools[scoredTools.length - 1].score > 0 ? { lowestToNonWinnerMassRatio: scoredTools[scoredTools.length - 1].score / (candidateScoreEntropyTotal - scoredTools[0].score) } : {}), ...(topCandidates[1].score > 0 && scoredTools[scoredTools.length - 1].score > 0 ? { lowestToRunnerUpRatio: scoredTools[scoredTools.length - 1].score / topCandidates[1].score } : {}), ...(scoredTools.length >= 3 && topCandidates[1].score > 0 && scoredTools[2].score > 0 ? { thirdToRunnerUpRatio: scoredTools[2].score / topCandidates[1].score } : {}), ...(scoredTools.length >= 3 && scoredTools.slice(1).every(t => t.score > 0) ? { candidateScoreNonWinnerGeometricMean: Math.exp(scoredTools.slice(1).reduce((s, t) => s + Math.log(t.score), 0) / (scoredTools.length - 1)) } : {}), ...(scoredTools.length >= 3 && scoredTools.slice(1).every(t => t.score > 0) ? { candidateScoreNonWinnerHarmonicMean: (scoredTools.length - 1) / scoredTools.slice(1).reduce((s, t) => s + 1 / t.score, 0) } : {}), ...(scoredTools.length >= 3 && topCandidates[1].score > 0 && scoredTools[scoredTools.length - 1].score > 0 ? { candidateScoreNonWinnerMidRange: (topCandidates[1].score + scoredTools[scoredTools.length - 1].score) / 2 } : {}), ...(scoredTools.length >= 3 ? { runnerUpToNonWinnerMeanGap: topCandidates[1].score - (candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1) } : {}), ...(scoredTools.length >= 3 ? { lowestToNonWinnerMeanGap: (candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1) - scoredTools[scoredTools.length - 1].score } : {}), ...(scoredTools.length >= 3 && topCandidates[1].score > 0 && scoredTools[scoredTools.length - 1].score > 0 ? (() => { const midRange = (topCandidates[1].score + scoredTools[scoredTools.length - 1].score) / 2; return { candidateScoreNonWinnerMeanToMidRangeRatio: ((candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1)) / midRange }; })() : {}), ...(scoredTools.length >= 3 && scoredTools.slice(1).every(t => t.score > 0) ? (() => { const nwMean = (candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1); const nwGM = Math.exp(scoredTools.slice(1).reduce((s, t) => s + Math.log(t.score), 0) / (scoredTools.length - 1)); return { candidateScoreNonWinnerAMGMGap: nwMean - nwGM }; })() : {}), ...(scoredTools.length >= 3 && scoredTools.slice(1).every(t => t.score > 0) ? (() => { const nwMean = (candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1); const nwHM = (scoredTools.length - 1) / scoredTools.slice(1).reduce((s, t) => s + 1 / t.score, 0); return { candidateScoreNonWinnerAMHMGap: nwMean - nwHM }; })() : {}), ...(scoredTools.length >= 3 && scoredTools.slice(1).every(t => t.score > 0) ? (() => { const nwGM = Math.exp(scoredTools.slice(1).reduce((s, t) => s + Math.log(t.score), 0) / (scoredTools.length - 1)); const nwHM = (scoredTools.length - 1) / scoredTools.slice(1).reduce((s, t) => s + 1 / t.score, 0); return { candidateScoreNonWinnerGMHMGap: nwGM - nwHM }; })() : {}), ...(scoredTools.length >= 3 && scoredTools.slice(1).every(t => t.score > 0) ? (() => { const nwGM = Math.exp(scoredTools.slice(1).reduce((s, t) => s + Math.log(t.score), 0) / (scoredTools.length - 1)); const nwHM = (scoredTools.length - 1) / scoredTools.slice(1).reduce((s, t) => s + 1 / t.score, 0); return { candidateScoreNonWinnerGMHMRatio: nwGM / nwHM }; })() : {}), ...(scoredTools.length >= 3 && scoredTools.slice(1).every(t => t.score > 0) ? (() => { const nwMean = (candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1); const nwGM = Math.exp(scoredTools.slice(1).reduce((s, t) => s + Math.log(t.score), 0) / (scoredTools.length - 1)); return { candidateScoreNonWinnerAMGMRatio: nwMean / nwGM }; })() : {}), ...(scoredTools.length >= 3 && scoredTools.slice(1).every(t => t.score > 0) ? (() => { const nwMean = (candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1); const nwHM = (scoredTools.length - 1) / scoredTools.slice(1).reduce((s, t) => s + 1 / t.score, 0); return { candidateScoreNonWinnerAMHMRatio: nwMean / nwHM }; })() : {}), ...(scoredTools.length >= 3 ? { candidateScoreNonWinnerQuadraticMean: Math.sqrt(scoredTools.slice(1).reduce((s, t) => s + t.score ** 2, 0) / (scoredTools.length - 1)) } : {}), ...(scoredTools.length >= 3 ? (() => { const nwMean = (candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1); if (nwMean <= 0) return {}; const nwQM = Math.sqrt(scoredTools.slice(1).reduce((s, t) => s + t.score ** 2, 0) / (scoredTools.length - 1)); return { candidateScoreNonWinnerQMToAMRatio: nwQM / nwMean }; })() : {}), ...(scoredTools.length >= 3 ? (() => { const nwMean = (candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1); const nwQM = Math.sqrt(scoredTools.slice(1).reduce((s, t) => s + t.score ** 2, 0) / (scoredTools.length - 1)); return { candidateScoreNonWinnerQMGap: nwQM - nwMean }; })() : {}), ...(scoredTools.length >= 3 && scoredTools.slice(1).every(t => t.score > 0) ? (() => { const nwQM = Math.sqrt(scoredTools.slice(1).reduce((s, t) => s + t.score ** 2, 0) / (scoredTools.length - 1)); const nwHM = (scoredTools.length - 1) / scoredTools.slice(1).reduce((s, t) => s + 1 / t.score, 0); return { candidateScoreNonWinnerQMHMRatio: nwQM / nwHM }; })() : {}), ...(scoredTools.length >= 3 && scoredTools.slice(1).every(t => t.score > 0) ? (() => { const nwQM = Math.sqrt(scoredTools.slice(1).reduce((s, t) => s + t.score ** 2, 0) / (scoredTools.length - 1)); const nwGM = Math.exp(scoredTools.slice(1).reduce((s, t) => s + Math.log(t.score), 0) / (scoredTools.length - 1)); return { candidateScoreNonWinnerQMGMRatio: nwQM / nwGM }; })() : {}), ...(scoredTools.length >= 3 && scoredTools.slice(1).every(t => t.score > 0) ? (() => { const nwQM = Math.sqrt(scoredTools.slice(1).reduce((s, t) => s + t.score ** 2, 0) / (scoredTools.length - 1)); const nwHM = (scoredTools.length - 1) / scoredTools.slice(1).reduce((s, t) => s + 1 / t.score, 0); return { candidateScoreNonWinnerQMHMGap: nwQM - nwHM }; })() : {}), ...(candidateScoreEntropyTotal > 0 ? { candidateScoreTop3HeavinessRatio: scoredTools.slice(0, 3).reduce((s, t) => s + t.score, 0) / candidateScoreEntropyTotal } : {}), ...(candidateScoreEntropyTotal > 0 ? { candidateScoreTop4HeavinessRatio: scoredTools.slice(0, 4).reduce((s, t) => s + t.score, 0) / candidateScoreEntropyTotal } : {}), ...{ winnerMeanGap: scoredTools[0].score - candidateScoreEntropyTotal / scoredTools.length }, ...{ winnerRunnerUpGap: scoredTools[0].score - topCandidates[1].score }, ...(scoredTools[0].score > scoredTools[scoredTools.length - 1].score ? { winnerRunnerUpGapToSpreadRatio: (scoredTools[0].score - topCandidates[1].score) / (scoredTools[0].score - scoredTools[scoredTools.length - 1].score) } : {}), ...(scoredTools[0].score > scoredTools[scoredTools.length - 1].score ? { runnerUpLowestGapToSpreadRatio: (topCandidates[1].score - scoredTools[scoredTools.length - 1].score) / (scoredTools[0].score - scoredTools[scoredTools.length - 1].score) } : {}), ...{ runnerUpMeanGap: topCandidates[1].score - candidateScoreEntropyTotal / scoredTools.length }, ...(candidateScoreGeometricMean !== undefined ? { candidateScoreGeometricMean } : {}), ...(candidateScoreHarmonicMean !== undefined ? { candidateScoreHarmonicMean } : {}), ...(candidateScoreP90 !== undefined ? { candidateScoreP90 } : {}), ...(candidateScoreP10 !== undefined ? { candidateScoreP10 } : {}), ...(candidateScoreP90 !== undefined && candidateScoreP10 !== undefined ? { candidateScoreP80Range: candidateScoreP90 - candidateScoreP10 } : {}), ...(candidateScoreMAD !== undefined ? { candidateScoreMAD } : {}), ...(candidateScoreMADRatio !== undefined ? { candidateScoreMADRatio } : {}), ...(candidateScoreRobustSkewness !== undefined ? { candidateScoreRobustSkewness } : {}), ...(candidateScoreQuantileSkewness !== undefined ? { candidateScoreQuantileSkewness } : {}), ...(candidateScoreWinsorizedMean !== undefined ? { candidateScoreWinsorizedMean } : {}), ...(candidateScoreJainFairnessIndex !== undefined ? { candidateScoreJainFairnessIndex } : {}), ...(candidateScoreP75 !== undefined ? { candidateScoreP75 } : {}), ...(candidateScoreP25 !== undefined ? { candidateScoreP25 } : {}), ...(candidateScoreP95 !== undefined ? { candidateScoreP95 } : {}), ...(candidateScoreP05 !== undefined ? { candidateScoreP05 } : {}), ...(candidateScoreP95 !== undefined && candidateScoreP05 !== undefined ? { candidateScoreP90Range: candidateScoreP95 - candidateScoreP05 } : {}), ...(candidateScoreTrimmedMean !== undefined ? { candidateScoreTrimmedMean } : {}), ...{ candidateScoreNonWinnerMean: (candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1) }, ...(scoredTools.length >= 3 ? (() => { const nwMean = (candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1); const nwVariance = scoredTools.slice(1).reduce((s, t) => s + (t.score - nwMean) ** 2, 0) / (scoredTools.length - 1); return { candidateScoreNonWinnerStdDev: Math.sqrt(nwVariance) }; })() : {}), ...(scoredTools.length >= 3 ? (() => { const nwMean = (candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1); if (nwMean <= 0) return {}; const nwVariance = scoredTools.slice(1).reduce((s, t) => s + (t.score - nwMean) ** 2, 0) / (scoredTools.length - 1); return { candidateScoreNonWinnerCoefficientOfVariation: Math.sqrt(nwVariance) / nwMean }; })() : {}), ...(scoredTools.length >= 3 ? (() => { const nwMean = (candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1); const nwVariance = scoredTools.slice(1).reduce((s, t) => s + (t.score - nwMean) ** 2, 0) / (scoredTools.length - 1); const nwStdDev = Math.sqrt(nwVariance); if (nwStdDev <= 0) return {}; return { winnerNonWinnerZScore: (scoredTools[0].score - nwMean) / nwStdDev }; })() : {}), ...(scoredTools.length >= 3 ? (() => { const nwMean = (candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1); const nwVariance = scoredTools.slice(1).reduce((s, t) => s + (t.score - nwMean) ** 2, 0) / (scoredTools.length - 1); const nwStdDev = Math.sqrt(nwVariance); if (nwStdDev < 1e-10) return {}; return { runnerUpNonWinnerZScore: (topCandidates[1].score - nwMean) / nwStdDev }; })() : {}), ...(scoredTools.length >= 3 ? (() => { const nwMean = (candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1); const nwVariance = scoredTools.slice(1).reduce((s, t) => s + (t.score - nwMean) ** 2, 0) / (scoredTools.length - 1); const nwStdDev = Math.sqrt(nwVariance); if (nwStdDev < 1e-10) return {}; return { lowestNonWinnerZScore: (scoredTools[scoredTools.length - 1].score - nwMean) / nwStdDev }; })() : {}), ...(scoredTools.length >= 3 ? { candidateScoreNonWinnerSpread: topCandidates[1].score - scoredTools[scoredTools.length - 1].score } : {}), ...(scoredTools.length >= 3 && scoredTools[0].score > scoredTools[scoredTools.length - 1].score ? { candidateScoreNonWinnerSpreadRatio: (topCandidates[1].score - scoredTools[scoredTools.length - 1].score) / (scoredTools[0].score - scoredTools[scoredTools.length - 1].score) } : {}), ...(scoredTools.length >= 3 ? (() => { const nwMean = (candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1); if (nwMean <= 0) return {}; return { candidateScoreNonWinnerSpreadToMeanRatio: (topCandidates[1].score - scoredTools[scoredTools.length - 1].score) / nwMean }; })() : {}), ...{ candidateScoreWinnerFieldGap: scoredTools[0].score - (candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1) }, ...(scoredTools[0].score > 0 ? { candidateScoreFieldStrengthRatio: (candidateScoreEntropyTotal - scoredTools[0].score) / ((scoredTools.length - 1) * scoredTools[0].score) } : {}), ...(topCandidates[1].score > 0 ? { winnerScoreToNonWinnerMeanRatio: scoredTools[0].score / ((candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1)) } : {}), ...(topCandidates[1].score > 0 ? { runnerUpScoreToNonWinnerMeanRatio: topCandidates[1].score / ((candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1)) } : {}), ...(candidateScoreP95 !== undefined && candidateScoreP95 > 0 ? { winnerScoreToP95Ratio: scoredTools[0].score / candidateScoreP95 } : {}), ...(candidateScoreP05 !== undefined && candidateScoreP05 > 0 ? { winnerScoreToP05Ratio: scoredTools[0].score / candidateScoreP05 } : {}), ...(candidateScoreP95 !== undefined && candidateScoreP05 !== undefined && candidateScoreP05 > 0 ? { candidateScoreTailAsymmetryRatio: candidateScoreP95 / candidateScoreP05 } : {}), ...(candidateScoreP75 !== undefined && candidateScoreP25 !== undefined && candidateScoreP25 > 0 ? { candidateScoreP75P25Ratio: candidateScoreP75 / candidateScoreP25 } : {}), ...(medianCandidateScore !== undefined && candidateScoreP90 !== undefined && candidateScoreP90 > 0 ? { candidateScoreMedianToP90Ratio: medianCandidateScore / candidateScoreP90 } : {}), ...(candidateScoreP90 !== undefined && candidateScoreP10 !== undefined && candidateScoreP10 > 0 ? { candidateScoreP90P10Ratio: candidateScoreP90 / candidateScoreP10 } : {}), ...(candidateScoreP90 !== undefined && candidateScoreP90 > 0 ? { winnerScoreToP90Ratio: scoredTools[0].score / candidateScoreP90 } : {}), ...(candidateScoreP10 !== undefined && candidateScoreP10 > 0 ? { winnerScoreToP10Ratio: scoredTools[0].score / candidateScoreP10 } : {}), ...(candidateScoreP75 !== undefined && candidateScoreP75 > 0 ? { winnerScoreToP75Ratio: scoredTools[0].score / candidateScoreP75 } : {}), ...(candidateScoreP25 !== undefined && candidateScoreP25 > 0 ? { winnerScoreToP25Ratio: scoredTools[0].score / candidateScoreP25 } : {}), ...(medianCandidateScore !== undefined && candidateScoreP10 !== undefined && candidateScoreP10 > 0 ? { candidateScoreMedianToP10Ratio: medianCandidateScore / candidateScoreP10 } : {}), ...(medianCandidateScore !== undefined && candidateScoreP75 !== undefined && candidateScoreP75 > 0 ? { candidateScoreMedianToP75Ratio: medianCandidateScore / candidateScoreP75 } : {}), ...(medianCandidateScore !== undefined && candidateScoreP25 !== undefined && candidateScoreP25 > 0 ? { candidateScoreMedianToP25Ratio: medianCandidateScore / candidateScoreP25 } : {}), ...(medianCandidateScore !== undefined && candidateScoreP05 !== undefined && candidateScoreP05 > 0 ? { candidateScoreMedianToP05Ratio: medianCandidateScore / candidateScoreP05 } : {}), ...(medianCandidateScore !== undefined && candidateScoreP95 !== undefined && candidateScoreP95 > 0 ? { candidateScoreMedianToP95Ratio: medianCandidateScore / candidateScoreP95 } : {}), ...(candidateScoreP95 !== undefined && candidateScoreP75 !== undefined && candidateScoreP75 > 0 ? { candidateScoreP95P75Ratio: candidateScoreP95 / candidateScoreP75 } : {}), ...(candidateScoreP25 !== undefined && candidateScoreP05 !== undefined && candidateScoreP05 > 0 ? { candidateScoreP25P05Ratio: candidateScoreP25 / candidateScoreP05 } : {}), ...(candidateScoreP90 !== undefined && candidateScoreP75 !== undefined && candidateScoreP75 > 0 ? { candidateScoreP90P75Ratio: candidateScoreP90 / candidateScoreP75 } : {}), ...(candidateScoreP25 !== undefined && candidateScoreP10 !== undefined && candidateScoreP10 > 0 ? { candidateScoreP25P10Ratio: candidateScoreP25 / candidateScoreP10 } : {}), ...(candidateScoreP90 !== undefined && candidateScoreP25 !== undefined && candidateScoreP25 > 0 ? { candidateScoreP90P25Ratio: candidateScoreP90 / candidateScoreP25 } : {}), ...(candidateScoreP95 !== undefined && candidateScoreP10 !== undefined && candidateScoreP10 > 0 ? { candidateScoreP95P10Ratio: candidateScoreP95 / candidateScoreP10 } : {}), ...(candidateScoreP95 !== undefined && candidateScoreP25 !== undefined && candidateScoreP25 > 0 ? { candidateScoreP95P25Ratio: candidateScoreP95 / candidateScoreP25 } : {}), ...(candidateScoreP75 !== undefined && candidateScoreP10 !== undefined && candidateScoreP10 > 0 ? { candidateScoreP75P10Ratio: candidateScoreP75 / candidateScoreP10 } : {}), ...(candidateScoreP90 !== undefined && candidateScoreP05 !== undefined && candidateScoreP05 > 0 ? { candidateScoreP90P05Ratio: candidateScoreP90 / candidateScoreP05 } : {}), ...(candidateScoreP75 !== undefined && candidateScoreP05 !== undefined && candidateScoreP05 > 0 ? { candidateScoreP75P05Ratio: candidateScoreP75 / candidateScoreP05 } : {}), ...(candidateScoreP10 !== undefined && candidateScoreP05 !== undefined && candidateScoreP05 > 0 ? { candidateScoreP10P05Ratio: candidateScoreP10 / candidateScoreP05 } : {}), ...(candidateScoreP95 !== undefined && candidateScoreP90 !== undefined && candidateScoreP90 > 0 ? { candidateScoreP95P90Ratio: candidateScoreP95 / candidateScoreP90 } : {}), ...(candidateScoreP90 !== undefined && medianCandidateScore !== undefined && medianCandidateScore > 0 ? { candidateScoreP90MedianRatio: candidateScoreP90 / medianCandidateScore } : {}), ...(candidateScoreP75 !== undefined && medianCandidateScore !== undefined && medianCandidateScore > 0 ? { candidateScoreP75MedianRatio: candidateScoreP75 / medianCandidateScore } : {}), ...(candidateScoreP95 !== undefined && medianCandidateScore !== undefined && medianCandidateScore > 0 ? { candidateScoreP95MedianRatio: candidateScoreP95 / medianCandidateScore } : {}), ...(candidateScoreP10 !== undefined && medianCandidateScore !== undefined && medianCandidateScore > 0 ? { candidateScoreP10MedianRatio: candidateScoreP10 / medianCandidateScore } : {}), ...(candidateScoreP25 !== undefined && medianCandidateScore !== undefined && medianCandidateScore > 0 ? { candidateScoreP25MedianRatio: candidateScoreP25 / medianCandidateScore } : {}), ...(candidateScoreP05 !== undefined && medianCandidateScore !== undefined && medianCandidateScore > 0 ? { candidateScoreP05MedianRatio: candidateScoreP05 / medianCandidateScore } : {}), ...(candidateScoreP90 !== undefined && scoredTools[0].score > 0 ? { candidateScoreP90ToWinnerRatio: candidateScoreP90 / scoredTools[0].score } : {}), ...(candidateScoreP75 !== undefined && scoredTools[0].score > 0 ? { candidateScoreP75ToWinnerRatio: candidateScoreP75 / scoredTools[0].score } : {}), ...(candidateScoreP95 !== undefined && scoredTools[0].score > 0 ? { candidateScoreP95ToWinnerRatio: candidateScoreP95 / scoredTools[0].score } : {}), ...(candidateScoreP25 !== undefined && scoredTools[0].score > 0 ? { candidateScoreP25ToWinnerRatio: candidateScoreP25 / scoredTools[0].score } : {}), ...(candidateScoreP10 !== undefined && scoredTools[0].score > 0 ? { candidateScoreP10ToWinnerRatio: candidateScoreP10 / scoredTools[0].score } : {}), ...(candidateScoreP05 !== undefined && scoredTools[0].score > 0 ? { candidateScoreP05ToWinnerRatio: candidateScoreP05 / scoredTools[0].score } : {}), ...(candidateScoreP90 !== undefined && candidateScoreEntropyTotal > 0 ? { candidateScoreP90ToMeanRatio: candidateScoreP90 / (candidateScoreEntropyTotal / scoredTools.length) } : {}), ...(candidateScoreP75 !== undefined && candidateScoreEntropyTotal > 0 ? { candidateScoreP75ToMeanRatio: candidateScoreP75 / (candidateScoreEntropyTotal / scoredTools.length) } : {}), ...(candidateScoreP95 !== undefined && candidateScoreEntropyTotal > 0 ? { candidateScoreP95ToMeanRatio: candidateScoreP95 / (candidateScoreEntropyTotal / scoredTools.length) } : {}), ...(candidateScoreP10 !== undefined && candidateScoreEntropyTotal > 0 ? { candidateScoreP10ToMeanRatio: candidateScoreP10 / (candidateScoreEntropyTotal / scoredTools.length) } : {}), ...(candidateScoreP25 !== undefined && candidateScoreEntropyTotal > 0 ? { candidateScoreP25ToMeanRatio: candidateScoreP25 / (candidateScoreEntropyTotal / scoredTools.length) } : {}), ...(candidateScoreP05 !== undefined && candidateScoreEntropyTotal > 0 ? { candidateScoreP05ToMeanRatio: candidateScoreP05 / (candidateScoreEntropyTotal / scoredTools.length) } : {}), ...(candidateScoreP90 !== undefined && candidateScoreP90 > 0 ? { candidateScoreMeanToP90Ratio: (candidateScoreEntropyTotal / scoredTools.length) / candidateScoreP90 } : {}), ...(candidateScoreP75 !== undefined && candidateScoreP75 > 0 ? { candidateScoreMeanToP75Ratio: (candidateScoreEntropyTotal / scoredTools.length) / candidateScoreP75 } : {}), ...(candidateScoreP95 !== undefined && candidateScoreP95 > 0 ? { candidateScoreMeanToP95Ratio: (candidateScoreEntropyTotal / scoredTools.length) / candidateScoreP95 } : {}), ...(candidateScoreP10 !== undefined && candidateScoreP10 > 0 ? { candidateScoreMeanToP10Ratio: (candidateScoreEntropyTotal / scoredTools.length) / candidateScoreP10 } : {}), ...(candidateScoreP25 !== undefined && candidateScoreP25 > 0 ? { candidateScoreMeanToP25Ratio: (candidateScoreEntropyTotal / scoredTools.length) / candidateScoreP25 } : {}), ...(candidateScoreP05 !== undefined && candidateScoreP05 > 0 ? { candidateScoreMeanToP05Ratio: (candidateScoreEntropyTotal / scoredTools.length) / candidateScoreP05 } : {}), ...(candidateScoreP90 !== undefined && candidateScoreP90 > 0 ? { runnerUpScoreToP90Ratio: topCandidates[1].score / candidateScoreP90 } : {}), ...(candidateScoreP75 !== undefined && candidateScoreP75 > 0 ? { runnerUpScoreToP75Ratio: topCandidates[1].score / candidateScoreP75 } : {}), ...(candidateScoreP95 !== undefined && candidateScoreP95 > 0 ? { runnerUpScoreToP95Ratio: topCandidates[1].score / candidateScoreP95 } : {}), ...(candidateScoreP10 !== undefined && candidateScoreP10 > 0 ? { runnerUpScoreToP10Ratio: topCandidates[1].score / candidateScoreP10 } : {}), ...(candidateScoreP25 !== undefined && candidateScoreP25 > 0 ? { runnerUpScoreToP25Ratio: topCandidates[1].score / candidateScoreP25 } : {}), ...(candidateScoreP05 !== undefined && candidateScoreP05 > 0 ? { runnerUpScoreToP05Ratio: topCandidates[1].score / candidateScoreP05 } : {}), ...(candidateScoreP90 !== undefined && topCandidates[1].score > 0 ? { candidateScoreP90ToRunnerUpRatio: candidateScoreP90 / topCandidates[1].score } : {}), ...(candidateScoreP75 !== undefined && topCandidates[1].score > 0 ? { candidateScoreP75ToRunnerUpRatio: candidateScoreP75 / topCandidates[1].score } : {}), ...(candidateScoreP95 !== undefined && topCandidates[1].score > 0 ? { candidateScoreP95ToRunnerUpRatio: candidateScoreP95 / topCandidates[1].score } : {}), ...(candidateScoreP10 !== undefined && topCandidates[1].score > 0 ? { candidateScoreP10ToRunnerUpRatio: candidateScoreP10 / topCandidates[1].score } : {}), ...(candidateScoreP25 !== undefined && topCandidates[1].score > 0 ? { candidateScoreP25ToRunnerUpRatio: candidateScoreP25 / topCandidates[1].score } : {}), ...(candidateScoreP05 !== undefined && topCandidates[1].score > 0 ? { candidateScoreP05ToRunnerUpRatio: candidateScoreP05 / topCandidates[1].score } : {}), ...(candidateScoreEntropyTotal > 0 ? { runnerUpScoreToMeanRatio: topCandidates[1].score / (candidateScoreEntropyTotal / scoredTools.length) } : {}), ...(topCandidates[1].score > 0 ? { candidateScoreMeanToRunnerUpRatio: (candidateScoreEntropyTotal / scoredTools.length) / topCandidates[1].score } : {}), ...(candidateScoreEntropyTotal > 0 ? { winnerScoreToMeanRatio: scoredTools[0].score / (candidateScoreEntropyTotal / scoredTools.length) } : {}), ...(candidateScoreGeometricMean !== undefined && candidateScoreGeometricMean > 0 ? { winnerScoreToGeometricMeanRatio: scoredTools[0].score / candidateScoreGeometricMean } : {}), ...(candidateScoreGeometricMean !== undefined && candidateScoreGeometricMean > 0 && scoredTools[0].score > 0 ? { candidateScoreGeometricMeanToWinnerRatio: candidateScoreGeometricMean / scoredTools[0].score } : {}), ...(candidateScoreHarmonicMean !== undefined && candidateScoreHarmonicMean > 0 ? { winnerScoreToHarmonicMeanRatio: scoredTools[0].score / candidateScoreHarmonicMean } : {}), ...(candidateScoreHarmonicMean !== undefined && candidateScoreHarmonicMean > 0 && scoredTools[0].score > 0 ? { candidateScoreHarmonicMeanToWinnerRatio: candidateScoreHarmonicMean / scoredTools[0].score } : {}), ...(candidateScoreHarmonicMean !== undefined && candidateScoreHarmonicMean > 0 ? { runnerUpScoreToHarmonicMeanRatio: topCandidates[1].score / candidateScoreHarmonicMean } : {}), ...(candidateScoreHarmonicMean !== undefined && candidateScoreHarmonicMean > 0 && topCandidates[1].score > 0 ? { candidateScoreHarmonicMeanToRunnerUpRatio: candidateScoreHarmonicMean / topCandidates[1].score } : {}), ...(candidateScoreGeometricMean !== undefined && candidateScoreGeometricMean > 0 ? { runnerUpScoreToGeometricMeanRatio: topCandidates[1].score / candidateScoreGeometricMean } : {}), ...(candidateScoreGeometricMean !== undefined && candidateScoreGeometricMean > 0 && topCandidates[1].score > 0 ? { candidateScoreGeometricMeanToRunnerUpRatio: candidateScoreGeometricMean / topCandidates[1].score } : {}), ...(candidateScoreGeometricMean !== undefined && candidateScoreEntropyTotal > 0 ? { candidateScoreGeometricMeanToMeanRatio: candidateScoreGeometricMean / (candidateScoreEntropyTotal / scoredTools.length) } : {}), ...(candidateScoreGeometricMean !== undefined && candidateScoreGeometricMean > 0 ? { candidateScoreMeanToGeometricMeanRatio: (candidateScoreEntropyTotal / scoredTools.length) / candidateScoreGeometricMean } : {}), ...(medianCandidateScore !== undefined && medianCandidateScore > 0 ? { runnerUpScoreToMedianRatio: topCandidates[1].score / medianCandidateScore } : {}), ...(medianCandidateScore !== undefined && topCandidates[1].score > 0 ? { candidateScoreMedianToRunnerUpRatio: medianCandidateScore / topCandidates[1].score } : {}), ...(medianCandidateScore !== undefined && scoredTools[0].score > 0 ? { candidateScoreMedianToWinnerRatio: medianCandidateScore / scoredTools[0].score } : {}), ...(candidateScoreHarmonicMean !== undefined && candidateScoreHarmonicMean > 0 && candidateScoreEntropyTotal > 0 ? { candidateScoreHarmonicMeanToMeanRatio: candidateScoreHarmonicMean / (candidateScoreEntropyTotal / scoredTools.length) } : {}), ...(candidateScoreHarmonicMean !== undefined && candidateScoreHarmonicMean > 0 ? { candidateScoreMeanToHarmonicMeanRatio: (candidateScoreEntropyTotal / scoredTools.length) / candidateScoreHarmonicMean } : {}), ...(candidateScoreHarmonicMean !== undefined && candidateScoreHarmonicMean > 0 && candidateScoreGeometricMean !== undefined && candidateScoreGeometricMean > 0 ? { candidateScoreHarmonicMeanToGeometricMeanRatio: candidateScoreHarmonicMean / candidateScoreGeometricMean } : {}), ...(candidateScoreHarmonicMean !== undefined && candidateScoreHarmonicMean > 0 && candidateScoreGeometricMean !== undefined && candidateScoreGeometricMean > 0 ? { candidateScoreGeometricMeanToHarmonicMeanRatio: candidateScoreGeometricMean / candidateScoreHarmonicMean } : {}), ...(medianCandidateScore !== undefined && medianCandidateScore > 0 && candidateScoreGeometricMean !== undefined && candidateScoreGeometricMean > 0 ? { candidateScoreMedianToGeometricMeanRatio: medianCandidateScore / candidateScoreGeometricMean } : {}), ...(medianCandidateScore !== undefined && medianCandidateScore > 0 && candidateScoreHarmonicMean !== undefined && candidateScoreHarmonicMean > 0 ? { candidateScoreMedianToHarmonicMeanRatio: medianCandidateScore / candidateScoreHarmonicMean } : {}), ...(candidateScoreGeometricMean !== undefined && candidateScoreGeometricMean > 0 && medianCandidateScore !== undefined && medianCandidateScore > 0 ? { candidateScoreGeometricMeanToMedianRatio: candidateScoreGeometricMean / medianCandidateScore } : {}), ...(candidateScoreHarmonicMean !== undefined && candidateScoreHarmonicMean > 0 && medianCandidateScore !== undefined && medianCandidateScore > 0 ? { candidateScoreHarmonicMeanToMedianRatio: candidateScoreHarmonicMean / medianCandidateScore } : {}), ...(medianCandidateScore !== undefined && medianCandidateScore > 0 && candidateScoreEntropyTotal > 0 ? { candidateScoreMeanToMedianRatio: (candidateScoreEntropyTotal / scoredTools.length) / medianCandidateScore } : {}), ...(topCandidates[1].score > 0 ? { winnerScoreRatio: topCandidates[0].score / topCandidates[1].score } : {}), topCandidatesScoreVariance: (() => { const mean = topCandidates.reduce((s, c) => s + c.score, 0) / topCandidates.length; return topCandidates.reduce((s, c) => s + (c.score - mean) ** 2, 0) / topCandidates.length; })(), topCandidatesScoreStdDev: (() => { const mean = topCandidates.reduce((s, c) => s + c.score, 0) / topCandidates.length; return Math.sqrt(topCandidates.reduce((s, c) => s + (c.score - mean) ** 2, 0) / topCandidates.length); })(), ...(topCandidatesScoreSkewness !== undefined ? { topCandidatesScoreSkewness } : {}), ...(topCandidatesKurtosis !== undefined ? { topCandidatesKurtosis } : {}), ...(topCandidatesGiniCoefficient !== undefined ? { topCandidatesGiniCoefficient } : {}) } : {}), + ...(topCandidates.length > 1 ? { runnerUpScore: topCandidates[1].score, runnerUpTool: topCandidates[1].tool, runnerUpServer: topCandidates[1].tool.split('/')[0], runnerUpCategory: scoredTools[1].category, candidateScoreSpread: scoredTools[0].score - scoredTools[scoredTools.length - 1].score, lowestCandidateScore: scoredTools[scoredTools.length - 1].score, ...(scoredTools.length >= 3 ? { thirdCandidateScore: scoredTools[2].score } : {}), ...(scoredTools.length >= 3 && scoredTools[0].score > 0 ? { thirdCandidateScoreToWinnerRatio: scoredTools[2].score / scoredTools[0].score } : {}), ...(scoredTools.length >= 3 && scoredTools[0].score > scoredTools[scoredTools.length - 1].score ? { winnerThirdGapToSpreadRatio: (scoredTools[0].score - scoredTools[2].score) / (scoredTools[0].score - scoredTools[scoredTools.length - 1].score) } : {}), ...(scoredTools.length >= 3 ? { winnerThirdGap: scoredTools[0].score - scoredTools[2].score } : {}), ...(scoredTools.length >= 3 && scoredTools[0].score > scoredTools[scoredTools.length - 1].score ? { runnerUpThirdGapToSpreadRatio: (topCandidates[1].score - scoredTools[2].score) / (scoredTools[0].score - scoredTools[scoredTools.length - 1].score) } : {}), ...(scoredTools.length >= 3 && candidateScoreStdDev !== undefined && candidateScoreStdDev > 0 ? { thirdCandidateScoreZScore: (scoredTools[2].score - candidateScoreEntropyTotal / scoredTools.length) / candidateScoreStdDev } : {}), ...(candidateScoreStdDev !== undefined && candidateScoreStdDev > 0 ? { lowestCandidateScoreZScore: (scoredTools[scoredTools.length - 1].score - candidateScoreEntropyTotal / scoredTools.length) / candidateScoreStdDev } : {}), ...(candidateScoreStdDev !== undefined && candidateScoreStdDev > 0 ? { candidateScoreStandardizedRange: (scoredTools[0].score - scoredTools[scoredTools.length - 1].score) / candidateScoreStdDev } : {}), ...(scoredTools.length >= 3 ? { runnerUpThirdGap: topCandidates[1].score - scoredTools[2].score } : {}), ...(scoredTools.length >= 3 && candidateScoreEntropyTotal > 0 ? { thirdCandidateScoreToMeanRatio: scoredTools[2].score / (candidateScoreEntropyTotal / scoredTools.length) } : {}), ...(scoredTools.length >= 3 && topCandidates[1].score > 0 ? { thirdCandidateScoreToRunnerUpRatio: scoredTools[2].score / topCandidates[1].score } : {}), ...(candidateScoreEntropy !== undefined ? { candidateScoreEntropy } : {}), ...(candidateGiniCoefficient !== undefined ? { candidateGiniCoefficient } : {}), ...(candidateScoreSkewness !== undefined ? { candidateScoreSkewness } : {}), ...(candidateScoreKurtosis !== undefined ? { candidateScoreKurtosis } : {}), ...(candidateScoreVariance !== undefined ? { candidateScoreVariance } : {}), ...(candidateScoreStdDev !== undefined ? { candidateScoreStdDev } : {}), candidateScoreMean: candidateScoreEntropyTotal / scoredTools.length, ...(medianCandidateScore !== undefined ? { medianCandidateScore } : {}), ...(scoredTools[0].score > 0 ? { candidateScoreMeanRatio: (candidateScoreEntropyTotal / scoredTools.length) / scoredTools[0].score } : {}), ...(candidateScoreStdDev !== undefined && candidateScoreEntropyTotal > 0 ? { candidateScoreCoefficientOfVariation: candidateScoreStdDev / (candidateScoreEntropyTotal / scoredTools.length) } : {}), ...(medianCandidateScore !== undefined && candidateScoreEntropyTotal > 0 ? { medianToMeanRatio: medianCandidateScore / (candidateScoreEntropyTotal / scoredTools.length) } : {}), ...(medianCandidateScore !== undefined && medianCandidateScore > 0 ? { winnerToMedianRatio: scoredTools[0].score / medianCandidateScore } : {}), ...(candidateScoreStdDev !== undefined && candidateScoreStdDev > 0 ? { winnerScoreZScore: (scoredTools[0].score - candidateScoreEntropyTotal / scoredTools.length) / candidateScoreStdDev } : {}), ...(candidateScoreStdDev !== undefined && candidateScoreStdDev > 0 ? { runnerUpScoreZScore: (topCandidates[1].score - candidateScoreEntropyTotal / scoredTools.length) / candidateScoreStdDev } : {}), ...(candidateScoreStdDev !== undefined && candidateScoreStdDev > 0 ? { zScoreGap: (scoredTools[0].score - topCandidates[1].score) / candidateScoreStdDev } : {}), ...(candidateScoreStdDev !== undefined && candidateScoreStdDev > 0 ? { nonWinnerMeanZScore: ((candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1) - candidateScoreEntropyTotal / scoredTools.length) / candidateScoreStdDev } : {}), ...(candidateScoreEntropyTotal > 0 ? { candidateScoreNormalizedRange: (scoredTools[0].score - scoredTools[scoredTools.length - 1].score) / (candidateScoreEntropyTotal / scoredTools.length) } : {}), ...(scoredTools[0].score > 0 ? { lowestCandidateScoreRatio: scoredTools[scoredTools.length - 1].score / scoredTools[0].score } : {}), ...(candidateScoreEntropyTotal > 0 ? { candidateScoreLowestToMeanRatio: scoredTools[scoredTools.length - 1].score / (candidateScoreEntropyTotal / scoredTools.length) } : {}), ...(medianCandidateScore !== undefined && medianCandidateScore > 0 ? { candidateScoreLowestToMedianRatio: scoredTools[scoredTools.length - 1].score / medianCandidateScore } : {}), ...(candidateScoreGeometricMean !== undefined && candidateScoreGeometricMean > 0 ? { candidateScoreLowestToGeometricMeanRatio: scoredTools[scoredTools.length - 1].score / candidateScoreGeometricMean } : {}), ...(candidateScoreHarmonicMean !== undefined && candidateScoreHarmonicMean > 0 ? { candidateScoreLowestToHarmonicMeanRatio: scoredTools[scoredTools.length - 1].score / candidateScoreHarmonicMean } : {}), ...(nonZeroCandidateFraction !== undefined ? { nonZeroCandidateFraction } : {}), ...(topHeavinessRatio !== undefined ? { topHeavinessRatio } : {}), ...(candidateScoreHerfindahlIndex !== undefined ? { candidateScoreHerfindahlIndex } : {}), ...(effectiveN !== undefined ? { effectiveN } : {}), ...(scoreEntropyNormalized !== undefined ? { scoreEntropyNormalized } : {}), ...(candidateScoreIQR !== undefined ? { candidateScoreIQR } : {}), ...(candidateScoreIQRRatio !== undefined ? { candidateScoreIQRRatio } : {}), ...(candidateScoreIQR !== undefined && scoredTools[0].score > scoredTools[scoredTools.length - 1].score ? { candidateScoreIQRCoverage: candidateScoreIQR / (scoredTools[0].score - scoredTools[scoredTools.length - 1].score) } : {}), ...(candidateScoreEntropyTotal > 0 ? { top2HeavinessRatio: (scoredTools[0].score + topCandidates[1].score) / candidateScoreEntropyTotal } : {}), ...(candidateScoreEntropyTotal > 0 && topCandidates[1].score > 0 ? { runnerUpScoreHeavinessRatio: topCandidates[1].score / candidateScoreEntropyTotal } : {}), ...(candidateScoreEntropyTotal > 0 && scoredTools[scoredTools.length - 1].score > 0 ? { lowestCandidateScoreHeavinessRatio: scoredTools[scoredTools.length - 1].score / candidateScoreEntropyTotal } : {}), ...(scoredTools.length >= 3 && candidateScoreEntropyTotal > 0 && scoredTools[2].score > 0 ? { thirdCandidateScoreHeavinessRatio: scoredTools[2].score / candidateScoreEntropyTotal } : {}), ...(candidateScoreEntropyTotal > 0 && (candidateScoreEntropyTotal - scoredTools[0].score) > 0 ? { winnerToNonWinnerMassRatio: scoredTools[0].score / (candidateScoreEntropyTotal - scoredTools[0].score) } : {}), ...(candidateScoreEntropyTotal > 0 && (candidateScoreEntropyTotal - scoredTools[0].score) > 0 && topCandidates[1].score > 0 ? { runnerUpToNonWinnerMassRatio: topCandidates[1].score / (candidateScoreEntropyTotal - scoredTools[0].score) } : {}), ...(candidateScoreEntropyTotal > 0 && (candidateScoreEntropyTotal - scoredTools[0].score) > 0 && scoredTools[scoredTools.length - 1].score > 0 ? { lowestToNonWinnerMassRatio: scoredTools[scoredTools.length - 1].score / (candidateScoreEntropyTotal - scoredTools[0].score) } : {}), ...(topCandidates[1].score > 0 && scoredTools[scoredTools.length - 1].score > 0 ? { lowestToRunnerUpRatio: scoredTools[scoredTools.length - 1].score / topCandidates[1].score } : {}), ...(scoredTools.length >= 3 && scoredTools[2].score > 0 && scoredTools[scoredTools.length - 1].score > 0 ? { lowestToThirdRatio: scoredTools[scoredTools.length - 1].score / scoredTools[2].score } : {}), ...(scoredTools.length >= 3 && topCandidates[1].score > 0 && scoredTools[2].score > 0 ? { thirdToRunnerUpRatio: scoredTools[2].score / topCandidates[1].score } : {}), ...(scoredTools.length >= 3 && scoredTools.slice(1).every(t => t.score > 0) ? { candidateScoreNonWinnerGeometricMean: Math.exp(scoredTools.slice(1).reduce((s, t) => s + Math.log(t.score), 0) / (scoredTools.length - 1)) } : {}), ...(scoredTools.length >= 3 && scoredTools.slice(1).every(t => t.score > 0) ? { candidateScoreNonWinnerHarmonicMean: (scoredTools.length - 1) / scoredTools.slice(1).reduce((s, t) => s + 1 / t.score, 0) } : {}), ...(scoredTools.length >= 3 && topCandidates[1].score > 0 && scoredTools[scoredTools.length - 1].score > 0 ? { candidateScoreNonWinnerMidRange: (topCandidates[1].score + scoredTools[scoredTools.length - 1].score) / 2 } : {}), ...(scoredTools.length >= 3 ? { runnerUpToNonWinnerMeanGap: topCandidates[1].score - (candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1) } : {}), ...(scoredTools.length >= 3 ? { lowestToNonWinnerMeanGap: (candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1) - scoredTools[scoredTools.length - 1].score } : {}), ...(scoredTools.length >= 3 && topCandidates[1].score > 0 && scoredTools[scoredTools.length - 1].score > 0 ? (() => { const midRange = (topCandidates[1].score + scoredTools[scoredTools.length - 1].score) / 2; return { candidateScoreNonWinnerMeanToMidRangeRatio: ((candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1)) / midRange }; })() : {}), ...(scoredTools.length >= 3 && scoredTools.slice(1).every(t => t.score > 0) ? (() => { const nwMean = (candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1); const nwGM = Math.exp(scoredTools.slice(1).reduce((s, t) => s + Math.log(t.score), 0) / (scoredTools.length - 1)); return { candidateScoreNonWinnerAMGMGap: nwMean - nwGM }; })() : {}), ...(scoredTools.length >= 3 && scoredTools.slice(1).every(t => t.score > 0) ? (() => { const nwMean = (candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1); const nwHM = (scoredTools.length - 1) / scoredTools.slice(1).reduce((s, t) => s + 1 / t.score, 0); return { candidateScoreNonWinnerAMHMGap: nwMean - nwHM }; })() : {}), ...(scoredTools.length >= 3 && scoredTools.slice(1).every(t => t.score > 0) ? (() => { const nwGM = Math.exp(scoredTools.slice(1).reduce((s, t) => s + Math.log(t.score), 0) / (scoredTools.length - 1)); const nwHM = (scoredTools.length - 1) / scoredTools.slice(1).reduce((s, t) => s + 1 / t.score, 0); return { candidateScoreNonWinnerGMHMGap: nwGM - nwHM }; })() : {}), ...(scoredTools.length >= 3 && scoredTools.slice(1).every(t => t.score > 0) ? (() => { const nwGM = Math.exp(scoredTools.slice(1).reduce((s, t) => s + Math.log(t.score), 0) / (scoredTools.length - 1)); const nwHM = (scoredTools.length - 1) / scoredTools.slice(1).reduce((s, t) => s + 1 / t.score, 0); return { candidateScoreNonWinnerGMHMRatio: nwGM / nwHM }; })() : {}), ...(scoredTools.length >= 3 && scoredTools.slice(1).every(t => t.score > 0) ? (() => { const nwMean = (candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1); const nwGM = Math.exp(scoredTools.slice(1).reduce((s, t) => s + Math.log(t.score), 0) / (scoredTools.length - 1)); return { candidateScoreNonWinnerAMGMRatio: nwMean / nwGM }; })() : {}), ...(scoredTools.length >= 3 && scoredTools.slice(1).every(t => t.score > 0) ? (() => { const nwMean = (candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1); const nwHM = (scoredTools.length - 1) / scoredTools.slice(1).reduce((s, t) => s + 1 / t.score, 0); return { candidateScoreNonWinnerAMHMRatio: nwMean / nwHM }; })() : {}), ...(scoredTools.length >= 3 ? { candidateScoreNonWinnerQuadraticMean: Math.sqrt(scoredTools.slice(1).reduce((s, t) => s + t.score ** 2, 0) / (scoredTools.length - 1)) } : {}), ...(scoredTools.length >= 3 ? (() => { const nwMean = (candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1); if (nwMean <= 0) return {}; const nwQM = Math.sqrt(scoredTools.slice(1).reduce((s, t) => s + t.score ** 2, 0) / (scoredTools.length - 1)); return { candidateScoreNonWinnerQMToAMRatio: nwQM / nwMean }; })() : {}), ...(scoredTools.length >= 3 ? (() => { const nwMean = (candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1); const nwQM = Math.sqrt(scoredTools.slice(1).reduce((s, t) => s + t.score ** 2, 0) / (scoredTools.length - 1)); return { candidateScoreNonWinnerQMGap: nwQM - nwMean }; })() : {}), ...(scoredTools.length >= 3 && scoredTools.slice(1).every(t => t.score > 0) ? (() => { const nwQM = Math.sqrt(scoredTools.slice(1).reduce((s, t) => s + t.score ** 2, 0) / (scoredTools.length - 1)); const nwHM = (scoredTools.length - 1) / scoredTools.slice(1).reduce((s, t) => s + 1 / t.score, 0); return { candidateScoreNonWinnerQMHMRatio: nwQM / nwHM }; })() : {}), ...(scoredTools.length >= 3 && scoredTools.slice(1).every(t => t.score > 0) ? (() => { const nwQM = Math.sqrt(scoredTools.slice(1).reduce((s, t) => s + t.score ** 2, 0) / (scoredTools.length - 1)); const nwGM = Math.exp(scoredTools.slice(1).reduce((s, t) => s + Math.log(t.score), 0) / (scoredTools.length - 1)); return { candidateScoreNonWinnerQMGMRatio: nwQM / nwGM }; })() : {}), ...(scoredTools.length >= 3 && scoredTools.slice(1).every(t => t.score > 0) ? (() => { const nwQM = Math.sqrt(scoredTools.slice(1).reduce((s, t) => s + t.score ** 2, 0) / (scoredTools.length - 1)); const nwHM = (scoredTools.length - 1) / scoredTools.slice(1).reduce((s, t) => s + 1 / t.score, 0); return { candidateScoreNonWinnerQMHMGap: nwQM - nwHM }; })() : {}), ...(candidateScoreEntropyTotal > 0 ? { candidateScoreTop3HeavinessRatio: scoredTools.slice(0, 3).reduce((s, t) => s + t.score, 0) / candidateScoreEntropyTotal } : {}), ...(candidateScoreEntropyTotal > 0 ? { candidateScoreTop4HeavinessRatio: scoredTools.slice(0, 4).reduce((s, t) => s + t.score, 0) / candidateScoreEntropyTotal } : {}), ...{ winnerMeanGap: scoredTools[0].score - candidateScoreEntropyTotal / scoredTools.length }, ...{ winnerRunnerUpGap: scoredTools[0].score - topCandidates[1].score }, ...(scoredTools[0].score > scoredTools[scoredTools.length - 1].score ? { winnerRunnerUpGapToSpreadRatio: (scoredTools[0].score - topCandidates[1].score) / (scoredTools[0].score - scoredTools[scoredTools.length - 1].score) } : {}), ...(scoredTools[0].score > scoredTools[scoredTools.length - 1].score ? { runnerUpLowestGapToSpreadRatio: (topCandidates[1].score - scoredTools[scoredTools.length - 1].score) / (scoredTools[0].score - scoredTools[scoredTools.length - 1].score) } : {}), ...{ runnerUpMeanGap: topCandidates[1].score - candidateScoreEntropyTotal / scoredTools.length }, ...(candidateScoreGeometricMean !== undefined ? { candidateScoreGeometricMean } : {}), ...(candidateScoreHarmonicMean !== undefined ? { candidateScoreHarmonicMean } : {}), ...(candidateScoreP90 !== undefined ? { candidateScoreP90 } : {}), ...(candidateScoreP10 !== undefined ? { candidateScoreP10 } : {}), ...(candidateScoreP90 !== undefined && candidateScoreP10 !== undefined ? { candidateScoreP80Range: candidateScoreP90 - candidateScoreP10 } : {}), ...(candidateScoreMAD !== undefined ? { candidateScoreMAD } : {}), ...(candidateScoreMADRatio !== undefined ? { candidateScoreMADRatio } : {}), ...(candidateScoreRobustSkewness !== undefined ? { candidateScoreRobustSkewness } : {}), ...(candidateScoreQuantileSkewness !== undefined ? { candidateScoreQuantileSkewness } : {}), ...(candidateScoreWinsorizedMean !== undefined ? { candidateScoreWinsorizedMean } : {}), ...(candidateScoreJainFairnessIndex !== undefined ? { candidateScoreJainFairnessIndex } : {}), ...(candidateScoreP75 !== undefined ? { candidateScoreP75 } : {}), ...(candidateScoreP25 !== undefined ? { candidateScoreP25 } : {}), ...(candidateScoreP95 !== undefined ? { candidateScoreP95 } : {}), ...(candidateScoreP05 !== undefined ? { candidateScoreP05 } : {}), ...(candidateScoreP95 !== undefined && candidateScoreP05 !== undefined ? { candidateScoreP90Range: candidateScoreP95 - candidateScoreP05 } : {}), ...(candidateScoreTrimmedMean !== undefined ? { candidateScoreTrimmedMean } : {}), ...{ candidateScoreNonWinnerMean: (candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1) }, ...(scoredTools.length >= 3 ? (() => { const nwMean = (candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1); const nwVariance = scoredTools.slice(1).reduce((s, t) => s + (t.score - nwMean) ** 2, 0) / (scoredTools.length - 1); return { candidateScoreNonWinnerStdDev: Math.sqrt(nwVariance) }; })() : {}), ...(scoredTools.length >= 3 ? (() => { const nwMean = (candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1); if (nwMean <= 0) return {}; const nwVariance = scoredTools.slice(1).reduce((s, t) => s + (t.score - nwMean) ** 2, 0) / (scoredTools.length - 1); return { candidateScoreNonWinnerCoefficientOfVariation: Math.sqrt(nwVariance) / nwMean }; })() : {}), ...(scoredTools.length >= 3 ? (() => { const nwMean = (candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1); const nwVariance = scoredTools.slice(1).reduce((s, t) => s + (t.score - nwMean) ** 2, 0) / (scoredTools.length - 1); const nwStdDev = Math.sqrt(nwVariance); if (nwStdDev <= 0) return {}; return { winnerNonWinnerZScore: (scoredTools[0].score - nwMean) / nwStdDev }; })() : {}), ...(scoredTools.length >= 3 ? (() => { const nwMean = (candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1); const nwVariance = scoredTools.slice(1).reduce((s, t) => s + (t.score - nwMean) ** 2, 0) / (scoredTools.length - 1); const nwStdDev = Math.sqrt(nwVariance); if (nwStdDev < 1e-10) return {}; return { runnerUpNonWinnerZScore: (topCandidates[1].score - nwMean) / nwStdDev }; })() : {}), ...(scoredTools.length >= 3 ? (() => { const nwMean = (candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1); const nwVariance = scoredTools.slice(1).reduce((s, t) => s + (t.score - nwMean) ** 2, 0) / (scoredTools.length - 1); const nwStdDev = Math.sqrt(nwVariance); if (nwStdDev < 1e-10) return {}; return { lowestNonWinnerZScore: (scoredTools[scoredTools.length - 1].score - nwMean) / nwStdDev }; })() : {}), ...(scoredTools.length >= 3 ? { candidateScoreNonWinnerSpread: topCandidates[1].score - scoredTools[scoredTools.length - 1].score } : {}), ...(scoredTools.length >= 3 && scoredTools[0].score > scoredTools[scoredTools.length - 1].score ? { candidateScoreNonWinnerSpreadRatio: (topCandidates[1].score - scoredTools[scoredTools.length - 1].score) / (scoredTools[0].score - scoredTools[scoredTools.length - 1].score) } : {}), ...(scoredTools.length >= 3 ? (() => { const nwMean = (candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1); if (nwMean <= 0) return {}; return { candidateScoreNonWinnerSpreadToMeanRatio: (topCandidates[1].score - scoredTools[scoredTools.length - 1].score) / nwMean }; })() : {}), ...{ candidateScoreWinnerFieldGap: scoredTools[0].score - (candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1) }, ...(scoredTools[0].score > 0 ? { candidateScoreFieldStrengthRatio: (candidateScoreEntropyTotal - scoredTools[0].score) / ((scoredTools.length - 1) * scoredTools[0].score) } : {}), ...(topCandidates[1].score > 0 ? { winnerScoreToNonWinnerMeanRatio: scoredTools[0].score / ((candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1)) } : {}), ...(topCandidates[1].score > 0 ? { runnerUpScoreToNonWinnerMeanRatio: topCandidates[1].score / ((candidateScoreEntropyTotal - scoredTools[0].score) / (scoredTools.length - 1)) } : {}), ...(candidateScoreP95 !== undefined && candidateScoreP95 > 0 ? { winnerScoreToP95Ratio: scoredTools[0].score / candidateScoreP95 } : {}), ...(candidateScoreP05 !== undefined && candidateScoreP05 > 0 ? { winnerScoreToP05Ratio: scoredTools[0].score / candidateScoreP05 } : {}), ...(candidateScoreP95 !== undefined && candidateScoreP05 !== undefined && candidateScoreP05 > 0 ? { candidateScoreTailAsymmetryRatio: candidateScoreP95 / candidateScoreP05 } : {}), ...(candidateScoreP75 !== undefined && candidateScoreP25 !== undefined && candidateScoreP25 > 0 ? { candidateScoreP75P25Ratio: candidateScoreP75 / candidateScoreP25 } : {}), ...(medianCandidateScore !== undefined && candidateScoreP90 !== undefined && candidateScoreP90 > 0 ? { candidateScoreMedianToP90Ratio: medianCandidateScore / candidateScoreP90 } : {}), ...(candidateScoreP90 !== undefined && candidateScoreP10 !== undefined && candidateScoreP10 > 0 ? { candidateScoreP90P10Ratio: candidateScoreP90 / candidateScoreP10 } : {}), ...(candidateScoreP90 !== undefined && candidateScoreP90 > 0 ? { winnerScoreToP90Ratio: scoredTools[0].score / candidateScoreP90 } : {}), ...(candidateScoreP10 !== undefined && candidateScoreP10 > 0 ? { winnerScoreToP10Ratio: scoredTools[0].score / candidateScoreP10 } : {}), ...(candidateScoreP75 !== undefined && candidateScoreP75 > 0 ? { winnerScoreToP75Ratio: scoredTools[0].score / candidateScoreP75 } : {}), ...(candidateScoreP25 !== undefined && candidateScoreP25 > 0 ? { winnerScoreToP25Ratio: scoredTools[0].score / candidateScoreP25 } : {}), ...(medianCandidateScore !== undefined && candidateScoreP10 !== undefined && candidateScoreP10 > 0 ? { candidateScoreMedianToP10Ratio: medianCandidateScore / candidateScoreP10 } : {}), ...(medianCandidateScore !== undefined && candidateScoreP75 !== undefined && candidateScoreP75 > 0 ? { candidateScoreMedianToP75Ratio: medianCandidateScore / candidateScoreP75 } : {}), ...(medianCandidateScore !== undefined && candidateScoreP25 !== undefined && candidateScoreP25 > 0 ? { candidateScoreMedianToP25Ratio: medianCandidateScore / candidateScoreP25 } : {}), ...(medianCandidateScore !== undefined && candidateScoreP05 !== undefined && candidateScoreP05 > 0 ? { candidateScoreMedianToP05Ratio: medianCandidateScore / candidateScoreP05 } : {}), ...(medianCandidateScore !== undefined && candidateScoreP95 !== undefined && candidateScoreP95 > 0 ? { candidateScoreMedianToP95Ratio: medianCandidateScore / candidateScoreP95 } : {}), ...(candidateScoreP95 !== undefined && candidateScoreP75 !== undefined && candidateScoreP75 > 0 ? { candidateScoreP95P75Ratio: candidateScoreP95 / candidateScoreP75 } : {}), ...(candidateScoreP25 !== undefined && candidateScoreP05 !== undefined && candidateScoreP05 > 0 ? { candidateScoreP25P05Ratio: candidateScoreP25 / candidateScoreP05 } : {}), ...(candidateScoreP90 !== undefined && candidateScoreP75 !== undefined && candidateScoreP75 > 0 ? { candidateScoreP90P75Ratio: candidateScoreP90 / candidateScoreP75 } : {}), ...(candidateScoreP25 !== undefined && candidateScoreP10 !== undefined && candidateScoreP10 > 0 ? { candidateScoreP25P10Ratio: candidateScoreP25 / candidateScoreP10 } : {}), ...(candidateScoreP90 !== undefined && candidateScoreP25 !== undefined && candidateScoreP25 > 0 ? { candidateScoreP90P25Ratio: candidateScoreP90 / candidateScoreP25 } : {}), ...(candidateScoreP95 !== undefined && candidateScoreP10 !== undefined && candidateScoreP10 > 0 ? { candidateScoreP95P10Ratio: candidateScoreP95 / candidateScoreP10 } : {}), ...(candidateScoreP95 !== undefined && candidateScoreP25 !== undefined && candidateScoreP25 > 0 ? { candidateScoreP95P25Ratio: candidateScoreP95 / candidateScoreP25 } : {}), ...(candidateScoreP75 !== undefined && candidateScoreP10 !== undefined && candidateScoreP10 > 0 ? { candidateScoreP75P10Ratio: candidateScoreP75 / candidateScoreP10 } : {}), ...(candidateScoreP90 !== undefined && candidateScoreP05 !== undefined && candidateScoreP05 > 0 ? { candidateScoreP90P05Ratio: candidateScoreP90 / candidateScoreP05 } : {}), ...(candidateScoreP75 !== undefined && candidateScoreP05 !== undefined && candidateScoreP05 > 0 ? { candidateScoreP75P05Ratio: candidateScoreP75 / candidateScoreP05 } : {}), ...(candidateScoreP10 !== undefined && candidateScoreP05 !== undefined && candidateScoreP05 > 0 ? { candidateScoreP10P05Ratio: candidateScoreP10 / candidateScoreP05 } : {}), ...(candidateScoreP95 !== undefined && candidateScoreP90 !== undefined && candidateScoreP90 > 0 ? { candidateScoreP95P90Ratio: candidateScoreP95 / candidateScoreP90 } : {}), ...(candidateScoreP90 !== undefined && medianCandidateScore !== undefined && medianCandidateScore > 0 ? { candidateScoreP90MedianRatio: candidateScoreP90 / medianCandidateScore } : {}), ...(candidateScoreP75 !== undefined && medianCandidateScore !== undefined && medianCandidateScore > 0 ? { candidateScoreP75MedianRatio: candidateScoreP75 / medianCandidateScore } : {}), ...(candidateScoreP95 !== undefined && medianCandidateScore !== undefined && medianCandidateScore > 0 ? { candidateScoreP95MedianRatio: candidateScoreP95 / medianCandidateScore } : {}), ...(candidateScoreP10 !== undefined && medianCandidateScore !== undefined && medianCandidateScore > 0 ? { candidateScoreP10MedianRatio: candidateScoreP10 / medianCandidateScore } : {}), ...(candidateScoreP25 !== undefined && medianCandidateScore !== undefined && medianCandidateScore > 0 ? { candidateScoreP25MedianRatio: candidateScoreP25 / medianCandidateScore } : {}), ...(candidateScoreP05 !== undefined && medianCandidateScore !== undefined && medianCandidateScore > 0 ? { candidateScoreP05MedianRatio: candidateScoreP05 / medianCandidateScore } : {}), ...(candidateScoreP90 !== undefined && scoredTools[0].score > 0 ? { candidateScoreP90ToWinnerRatio: candidateScoreP90 / scoredTools[0].score } : {}), ...(candidateScoreP75 !== undefined && scoredTools[0].score > 0 ? { candidateScoreP75ToWinnerRatio: candidateScoreP75 / scoredTools[0].score } : {}), ...(candidateScoreP95 !== undefined && scoredTools[0].score > 0 ? { candidateScoreP95ToWinnerRatio: candidateScoreP95 / scoredTools[0].score } : {}), ...(candidateScoreP25 !== undefined && scoredTools[0].score > 0 ? { candidateScoreP25ToWinnerRatio: candidateScoreP25 / scoredTools[0].score } : {}), ...(candidateScoreP10 !== undefined && scoredTools[0].score > 0 ? { candidateScoreP10ToWinnerRatio: candidateScoreP10 / scoredTools[0].score } : {}), ...(candidateScoreP05 !== undefined && scoredTools[0].score > 0 ? { candidateScoreP05ToWinnerRatio: candidateScoreP05 / scoredTools[0].score } : {}), ...(candidateScoreP90 !== undefined && candidateScoreEntropyTotal > 0 ? { candidateScoreP90ToMeanRatio: candidateScoreP90 / (candidateScoreEntropyTotal / scoredTools.length) } : {}), ...(candidateScoreP75 !== undefined && candidateScoreEntropyTotal > 0 ? { candidateScoreP75ToMeanRatio: candidateScoreP75 / (candidateScoreEntropyTotal / scoredTools.length) } : {}), ...(candidateScoreP95 !== undefined && candidateScoreEntropyTotal > 0 ? { candidateScoreP95ToMeanRatio: candidateScoreP95 / (candidateScoreEntropyTotal / scoredTools.length) } : {}), ...(candidateScoreP10 !== undefined && candidateScoreEntropyTotal > 0 ? { candidateScoreP10ToMeanRatio: candidateScoreP10 / (candidateScoreEntropyTotal / scoredTools.length) } : {}), ...(candidateScoreP25 !== undefined && candidateScoreEntropyTotal > 0 ? { candidateScoreP25ToMeanRatio: candidateScoreP25 / (candidateScoreEntropyTotal / scoredTools.length) } : {}), ...(candidateScoreP05 !== undefined && candidateScoreEntropyTotal > 0 ? { candidateScoreP05ToMeanRatio: candidateScoreP05 / (candidateScoreEntropyTotal / scoredTools.length) } : {}), ...(candidateScoreP90 !== undefined && candidateScoreP90 > 0 ? { candidateScoreMeanToP90Ratio: (candidateScoreEntropyTotal / scoredTools.length) / candidateScoreP90 } : {}), ...(candidateScoreP75 !== undefined && candidateScoreP75 > 0 ? { candidateScoreMeanToP75Ratio: (candidateScoreEntropyTotal / scoredTools.length) / candidateScoreP75 } : {}), ...(candidateScoreP95 !== undefined && candidateScoreP95 > 0 ? { candidateScoreMeanToP95Ratio: (candidateScoreEntropyTotal / scoredTools.length) / candidateScoreP95 } : {}), ...(candidateScoreP10 !== undefined && candidateScoreP10 > 0 ? { candidateScoreMeanToP10Ratio: (candidateScoreEntropyTotal / scoredTools.length) / candidateScoreP10 } : {}), ...(candidateScoreP25 !== undefined && candidateScoreP25 > 0 ? { candidateScoreMeanToP25Ratio: (candidateScoreEntropyTotal / scoredTools.length) / candidateScoreP25 } : {}), ...(candidateScoreP05 !== undefined && candidateScoreP05 > 0 ? { candidateScoreMeanToP05Ratio: (candidateScoreEntropyTotal / scoredTools.length) / candidateScoreP05 } : {}), ...(candidateScoreP90 !== undefined && candidateScoreP90 > 0 ? { runnerUpScoreToP90Ratio: topCandidates[1].score / candidateScoreP90 } : {}), ...(candidateScoreP75 !== undefined && candidateScoreP75 > 0 ? { runnerUpScoreToP75Ratio: topCandidates[1].score / candidateScoreP75 } : {}), ...(candidateScoreP95 !== undefined && candidateScoreP95 > 0 ? { runnerUpScoreToP95Ratio: topCandidates[1].score / candidateScoreP95 } : {}), ...(candidateScoreP10 !== undefined && candidateScoreP10 > 0 ? { runnerUpScoreToP10Ratio: topCandidates[1].score / candidateScoreP10 } : {}), ...(candidateScoreP25 !== undefined && candidateScoreP25 > 0 ? { runnerUpScoreToP25Ratio: topCandidates[1].score / candidateScoreP25 } : {}), ...(candidateScoreP05 !== undefined && candidateScoreP05 > 0 ? { runnerUpScoreToP05Ratio: topCandidates[1].score / candidateScoreP05 } : {}), ...(candidateScoreP90 !== undefined && topCandidates[1].score > 0 ? { candidateScoreP90ToRunnerUpRatio: candidateScoreP90 / topCandidates[1].score } : {}), ...(candidateScoreP75 !== undefined && topCandidates[1].score > 0 ? { candidateScoreP75ToRunnerUpRatio: candidateScoreP75 / topCandidates[1].score } : {}), ...(candidateScoreP95 !== undefined && topCandidates[1].score > 0 ? { candidateScoreP95ToRunnerUpRatio: candidateScoreP95 / topCandidates[1].score } : {}), ...(candidateScoreP10 !== undefined && topCandidates[1].score > 0 ? { candidateScoreP10ToRunnerUpRatio: candidateScoreP10 / topCandidates[1].score } : {}), ...(candidateScoreP25 !== undefined && topCandidates[1].score > 0 ? { candidateScoreP25ToRunnerUpRatio: candidateScoreP25 / topCandidates[1].score } : {}), ...(candidateScoreP05 !== undefined && topCandidates[1].score > 0 ? { candidateScoreP05ToRunnerUpRatio: candidateScoreP05 / topCandidates[1].score } : {}), ...(candidateScoreEntropyTotal > 0 ? { runnerUpScoreToMeanRatio: topCandidates[1].score / (candidateScoreEntropyTotal / scoredTools.length) } : {}), ...(topCandidates[1].score > 0 ? { candidateScoreMeanToRunnerUpRatio: (candidateScoreEntropyTotal / scoredTools.length) / topCandidates[1].score } : {}), ...(candidateScoreEntropyTotal > 0 ? { winnerScoreToMeanRatio: scoredTools[0].score / (candidateScoreEntropyTotal / scoredTools.length) } : {}), ...(candidateScoreGeometricMean !== undefined && candidateScoreGeometricMean > 0 ? { winnerScoreToGeometricMeanRatio: scoredTools[0].score / candidateScoreGeometricMean } : {}), ...(candidateScoreGeometricMean !== undefined && candidateScoreGeometricMean > 0 && scoredTools[0].score > 0 ? { candidateScoreGeometricMeanToWinnerRatio: candidateScoreGeometricMean / scoredTools[0].score } : {}), ...(candidateScoreHarmonicMean !== undefined && candidateScoreHarmonicMean > 0 ? { winnerScoreToHarmonicMeanRatio: scoredTools[0].score / candidateScoreHarmonicMean } : {}), ...(candidateScoreHarmonicMean !== undefined && candidateScoreHarmonicMean > 0 && scoredTools[0].score > 0 ? { candidateScoreHarmonicMeanToWinnerRatio: candidateScoreHarmonicMean / scoredTools[0].score } : {}), ...(candidateScoreHarmonicMean !== undefined && candidateScoreHarmonicMean > 0 ? { runnerUpScoreToHarmonicMeanRatio: topCandidates[1].score / candidateScoreHarmonicMean } : {}), ...(candidateScoreHarmonicMean !== undefined && candidateScoreHarmonicMean > 0 && topCandidates[1].score > 0 ? { candidateScoreHarmonicMeanToRunnerUpRatio: candidateScoreHarmonicMean / topCandidates[1].score } : {}), ...(candidateScoreGeometricMean !== undefined && candidateScoreGeometricMean > 0 ? { runnerUpScoreToGeometricMeanRatio: topCandidates[1].score / candidateScoreGeometricMean } : {}), ...(candidateScoreGeometricMean !== undefined && candidateScoreGeometricMean > 0 && topCandidates[1].score > 0 ? { candidateScoreGeometricMeanToRunnerUpRatio: candidateScoreGeometricMean / topCandidates[1].score } : {}), ...(candidateScoreGeometricMean !== undefined && candidateScoreEntropyTotal > 0 ? { candidateScoreGeometricMeanToMeanRatio: candidateScoreGeometricMean / (candidateScoreEntropyTotal / scoredTools.length) } : {}), ...(candidateScoreGeometricMean !== undefined && candidateScoreGeometricMean > 0 ? { candidateScoreMeanToGeometricMeanRatio: (candidateScoreEntropyTotal / scoredTools.length) / candidateScoreGeometricMean } : {}), ...(medianCandidateScore !== undefined && medianCandidateScore > 0 ? { runnerUpScoreToMedianRatio: topCandidates[1].score / medianCandidateScore } : {}), ...(medianCandidateScore !== undefined && topCandidates[1].score > 0 ? { candidateScoreMedianToRunnerUpRatio: medianCandidateScore / topCandidates[1].score } : {}), ...(medianCandidateScore !== undefined && scoredTools[0].score > 0 ? { candidateScoreMedianToWinnerRatio: medianCandidateScore / scoredTools[0].score } : {}), ...(candidateScoreHarmonicMean !== undefined && candidateScoreHarmonicMean > 0 && candidateScoreEntropyTotal > 0 ? { candidateScoreHarmonicMeanToMeanRatio: candidateScoreHarmonicMean / (candidateScoreEntropyTotal / scoredTools.length) } : {}), ...(candidateScoreHarmonicMean !== undefined && candidateScoreHarmonicMean > 0 ? { candidateScoreMeanToHarmonicMeanRatio: (candidateScoreEntropyTotal / scoredTools.length) / candidateScoreHarmonicMean } : {}), ...(candidateScoreHarmonicMean !== undefined && candidateScoreHarmonicMean > 0 && candidateScoreGeometricMean !== undefined && candidateScoreGeometricMean > 0 ? { candidateScoreHarmonicMeanToGeometricMeanRatio: candidateScoreHarmonicMean / candidateScoreGeometricMean } : {}), ...(candidateScoreHarmonicMean !== undefined && candidateScoreHarmonicMean > 0 && candidateScoreGeometricMean !== undefined && candidateScoreGeometricMean > 0 ? { candidateScoreGeometricMeanToHarmonicMeanRatio: candidateScoreGeometricMean / candidateScoreHarmonicMean } : {}), ...(medianCandidateScore !== undefined && medianCandidateScore > 0 && candidateScoreGeometricMean !== undefined && candidateScoreGeometricMean > 0 ? { candidateScoreMedianToGeometricMeanRatio: medianCandidateScore / candidateScoreGeometricMean } : {}), ...(medianCandidateScore !== undefined && medianCandidateScore > 0 && candidateScoreHarmonicMean !== undefined && candidateScoreHarmonicMean > 0 ? { candidateScoreMedianToHarmonicMeanRatio: medianCandidateScore / candidateScoreHarmonicMean } : {}), ...(candidateScoreGeometricMean !== undefined && candidateScoreGeometricMean > 0 && medianCandidateScore !== undefined && medianCandidateScore > 0 ? { candidateScoreGeometricMeanToMedianRatio: candidateScoreGeometricMean / medianCandidateScore } : {}), ...(candidateScoreHarmonicMean !== undefined && candidateScoreHarmonicMean > 0 && medianCandidateScore !== undefined && medianCandidateScore > 0 ? { candidateScoreHarmonicMeanToMedianRatio: candidateScoreHarmonicMean / medianCandidateScore } : {}), ...(medianCandidateScore !== undefined && medianCandidateScore > 0 && candidateScoreEntropyTotal > 0 ? { candidateScoreMeanToMedianRatio: (candidateScoreEntropyTotal / scoredTools.length) / medianCandidateScore } : {}), ...(topCandidates[1].score > 0 ? { winnerScoreRatio: topCandidates[0].score / topCandidates[1].score } : {}), topCandidatesScoreVariance: (() => { const mean = topCandidates.reduce((s, c) => s + c.score, 0) / topCandidates.length; return topCandidates.reduce((s, c) => s + (c.score - mean) ** 2, 0) / topCandidates.length; })(), topCandidatesScoreStdDev: (() => { const mean = topCandidates.reduce((s, c) => s + c.score, 0) / topCandidates.length; return Math.sqrt(topCandidates.reduce((s, c) => s + (c.score - mean) ** 2, 0) / topCandidates.length); })(), ...(topCandidatesScoreSkewness !== undefined ? { topCandidatesScoreSkewness } : {}), ...(topCandidatesKurtosis !== undefined ? { topCandidatesKurtosis } : {}), ...(topCandidatesGiniCoefficient !== undefined ? { topCandidatesGiniCoefficient } : {}) } : {}), ...(focusName && focus ? { focus: focusName, focusBoost, diff --git a/test/ccccccccc-cast-explain-lowest-to-third-ratio.test.ts b/test/ccccccccc-cast-explain-lowest-to-third-ratio.test.ts new file mode 100644 index 0000000..69dae7e --- /dev/null +++ b/test/ccccccccc-cast-explain-lowest-to-third-ratio.test.ts @@ -0,0 +1,261 @@ +/** + * CCCCCCCCC: explanation.lowestToThirdRatio in ch1tty/cast when explain:true. + * + * lowestToThirdRatio: number — lowestCandidateScore / thirdCandidateScore. + * Measures how compressed the distribution floor is relative to the 3rd-ranked tool. + * + * Present when: >= 3 candidates, thirdCandidateScore > 0, lowestCandidateScore > 0. + * Absent when: no_match, < 3 candidates, zero third or zero lowest. + * Always in (0, 1]: lowest <= third by ranking. + * For n=3: always 1 (lowest IS the third). + * Chain: lowestCandidateScoreRatio <= lowestToRunnerUpRatio <= lowestToThirdRatio. + * Identity: lowestToThirdRatio * thirdCandidateScore === lowestCandidateScore. + * + * Covered: + * CCCCCCCCC-1: present when >= 3 candidates with positive scores + * CCCCCCCCC-2: always in (0, 1] when present + * CCCCCCCCC-3: absent on cast:no_match + * CCCCCCCCC-4: for n=3 always equals 1 + * CCCCCCCCC-5: absent when only 2 candidates + * CCCCCCCCC-6: identity: ratio * thirdCandidateScore === lowestCandidateScore + * CCCCCCCCC-7: always >= lowestToRunnerUpRatio when both present + * CCCCCCCCC-8: tool description documents lowestToThirdRatio + */ +import assert from 'node:assert/strict'; +import { tmpdir } from 'node:os'; +import { join } from 'node:path'; +import test from 'node:test'; +import { Aggregator } from '../src/aggregator.js'; +import { SessionCoordinator } from '../src/coordinator.js'; +import type { Backend, BackendStatus, ServerConfig, ToolCallResult, ToolEntry } from '../src/types.js'; + +function dlqPath(label: string): string { + return join(tmpdir(), `ch1tty-ccccccccc-ltt-${label}-${Date.now()}.jsonl`); +} + +const STRIPE_CFG: ServerConfig = { + id: 'stripe', name: 'Stripe Payments', type: 'remote', access: 'readwrite', + category: 'ecosystem', endpoint: 'https://stripe.test/mcp', +}; +const NEON_CFG: ServerConfig = { + id: 'neon', name: 'Neon Database', type: 'remote', access: 'readwrite', + category: 'code', endpoint: 'https://neon.test/mcp', +}; +const GITHUB_CFG: ServerConfig = { + id: 'github', name: 'GitHub', type: 'remote', access: 'readwrite', + category: 'code', endpoint: 'https://github.test/mcp', +}; + +function makeBackend(tools: ToolEntry[]): Backend { + return { + registerServer: () => {}, + isRegistered: () => true, + getStatus: (): BackendStatus => ({ connected: true, toolCount: tools.length, toolCacheAge: 0 }), + listTools: async () => tools, + callTool: async (): Promise => ({ content: [{ type: 'text', text: 'ok' }] }), + listResources: async () => ({ resources: [], templates: [] }), + readResource: async () => ({ contents: [] }), + listPrompts: async () => [], + getPrompt: async () => ({ messages: [] }), + shutdown: async () => {}, + }; +} + +class FallbackCoordinator extends SessionCoordinator { + constructor(dlq?: string) { super({}, { enabled: false }, dlq); } + override async routeIntent(): Promise { return null; } +} + +function buildAgg(label: string, configs: ServerConfig[], toolMap: Record): Aggregator { + const path = dlqPath(label); + return new Aggregator(configs, { + backendFactory: (cfg) => makeBackend(toolMap[cfg.id] ?? []), + focusProfiles: { profiles: {} }, + suggestionsCatalog: {}, + ledgerDlqPath: path, + coordinator: new FallbackCoordinator(path), + }); +} + +test('CCCCCCCCC-1: present when >= 3 candidates with positive scores', async () => { + const stripeTools: ToolEntry[] = [ + { name: 'create_invoice', description: 'billing invoice payment charge', inputSchema: { type: 'object', properties: {} } }, + ]; + const neonTools: ToolEntry[] = [ + { name: 'run_sql', description: 'billing sql query database', inputSchema: { type: 'object', properties: {} } }, + ]; + const githubTools: ToolEntry[] = [ + { name: 'list_repos', description: 'billing repositories code', inputSchema: { type: 'object', properties: {} } }, + ]; + const agg = buildAgg('c1', [STRIPE_CFG, NEON_CFG, GITHUB_CFG], { stripe: stripeTools, neon: neonTools, github: githubTools }); + try { + const r = await agg.callTool('ch1tty/cast', { intent: 'billing invoice payment', explain: true }); + const parsed = JSON.parse((r.content[0] as { text: string }).text); + assert.ok('explanation' in parsed, 'explanation absent'); + const { explanation } = parsed; + if (explanation.candidateCount >= 3 && explanation.thirdCandidateScore > 0 && explanation.lowestCandidateScore > 0) { + assert.ok('lowestToThirdRatio' in explanation, + `lowestToThirdRatio should be present; keys: ${Object.keys(explanation).join(', ')}`); + assert.equal(typeof explanation.lowestToThirdRatio, 'number'); + } + } finally { + await agg.shutdown(); + } +}); + +test('CCCCCCCCC-2: always in (0, 1] when present', async () => { + const stripeTools: ToolEntry[] = [ + { name: 'create_invoice', description: 'billing invoice payment charge', inputSchema: { type: 'object', properties: {} } }, + ]; + const neonTools: ToolEntry[] = [ + { name: 'run_sql', description: 'billing sql query database', inputSchema: { type: 'object', properties: {} } }, + ]; + const githubTools: ToolEntry[] = [ + { name: 'list_repos', description: 'billing repositories code', inputSchema: { type: 'object', properties: {} } }, + ]; + const agg = buildAgg('c2', [STRIPE_CFG, NEON_CFG, GITHUB_CFG], { stripe: stripeTools, neon: neonTools, github: githubTools }); + try { + const r = await agg.callTool('ch1tty/cast', { intent: 'billing invoice payment', explain: true }); + const parsed = JSON.parse((r.content[0] as { text: string }).text); + const { explanation } = parsed; + if ('lowestToThirdRatio' in explanation) { + assert.ok(Number.isFinite(explanation.lowestToThirdRatio), + `should be finite, got ${explanation.lowestToThirdRatio}`); + assert.ok(explanation.lowestToThirdRatio > -1e-9, + `should be > 0, got ${explanation.lowestToThirdRatio}`); + assert.ok(explanation.lowestToThirdRatio <= 1 + 1e-9, + `should be <= 1, got ${explanation.lowestToThirdRatio}`); + } + } finally { + await agg.shutdown(); + } +}); + +test('CCCCCCCCC-3: absent on cast:no_match', async () => { + const agg = buildAgg('c3', [STRIPE_CFG], { stripe: [] }); + try { + const r = await agg.callTool('ch1tty/cast', { intent: 'zzz_utterly_unrelated_xyzzy_nomatch', explain: true }); + const parsed = JSON.parse((r.content[0] as { text: string }).text); + if ('explanation' in parsed) { + assert.ok(!('lowestToThirdRatio' in parsed.explanation), + `should be absent on no_match; got ${parsed.explanation.lowestToThirdRatio}`); + } + } finally { + await agg.shutdown(); + } +}); + +test('CCCCCCCCC-4: for n=3 always equals 1', async () => { + const stripeTools: ToolEntry[] = [ + { name: 'create_invoice', description: 'billing invoice payment charge', inputSchema: { type: 'object', properties: {} } }, + ]; + const neonTools: ToolEntry[] = [ + { name: 'run_sql', description: 'billing sql query database', inputSchema: { type: 'object', properties: {} } }, + ]; + const githubTools: ToolEntry[] = [ + { name: 'list_repos', description: 'billing repositories code', inputSchema: { type: 'object', properties: {} } }, + ]; + const agg = buildAgg('c4', [STRIPE_CFG, NEON_CFG, GITHUB_CFG], { stripe: stripeTools, neon: neonTools, github: githubTools }); + try { + const r = await agg.callTool('ch1tty/cast', { intent: 'billing invoice payment', explain: true }); + const parsed = JSON.parse((r.content[0] as { text: string }).text); + const { explanation } = parsed; + if ('lowestToThirdRatio' in explanation && explanation.candidateCount === 3) { + assert.ok(Math.abs(explanation.lowestToThirdRatio - 1) < 1e-9, + `for n=3, ratio should be 1 (lowest IS third), got ${explanation.lowestToThirdRatio}`); + } + } finally { + await agg.shutdown(); + } +}); + +test('CCCCCCCCC-5: absent when only 2 candidates', async () => { + const stripeTools: ToolEntry[] = [ + { name: 'create_invoice', description: 'billing invoice payment charge', inputSchema: { type: 'object', properties: {} } }, + ]; + const neonTools: ToolEntry[] = [ + { name: 'run_sql', description: 'billing sql query database', inputSchema: { type: 'object', properties: {} } }, + ]; + const agg = buildAgg('c5', [STRIPE_CFG, NEON_CFG], { stripe: stripeTools, neon: neonTools }); + try { + const r = await agg.callTool('ch1tty/cast', { intent: 'billing invoice payment', explain: true }); + const parsed = JSON.parse((r.content[0] as { text: string }).text); + const { explanation } = parsed; + if (explanation.candidateCount === 2) { + assert.ok(!('lowestToThirdRatio' in explanation), + `should be absent with only 2 candidates`); + } + } finally { + await agg.shutdown(); + } +}); + +test('CCCCCCCCC-6: identity: ratio * thirdCandidateScore === lowestCandidateScore', async () => { + const stripeTools: ToolEntry[] = [ + { name: 'create_invoice', description: 'billing invoice payment charge', inputSchema: { type: 'object', properties: {} } }, + ]; + const neonTools: ToolEntry[] = [ + { name: 'run_sql', description: 'billing sql query database', inputSchema: { type: 'object', properties: {} } }, + ]; + const githubTools: ToolEntry[] = [ + { name: 'list_repos', description: 'billing repositories code', inputSchema: { type: 'object', properties: {} } }, + ]; + const agg = buildAgg('c6', [STRIPE_CFG, NEON_CFG, GITHUB_CFG], { stripe: stripeTools, neon: neonTools, github: githubTools }); + try { + const r = await agg.callTool('ch1tty/cast', { intent: 'billing invoice payment', explain: true }); + const parsed = JSON.parse((r.content[0] as { text: string }).text); + const { explanation } = parsed; + if ( + 'lowestToThirdRatio' in explanation && + 'thirdCandidateScore' in explanation && + 'lowestCandidateScore' in explanation + ) { + const reconstructed = explanation.lowestToThirdRatio * explanation.thirdCandidateScore; + assert.ok(Math.abs(reconstructed - explanation.lowestCandidateScore) < 1e-9, + `ratio * third (${reconstructed}) should equal lowest (${explanation.lowestCandidateScore})`); + } + } finally { + await agg.shutdown(); + } +}); + +test('CCCCCCCCC-7: always >= lowestToRunnerUpRatio when both present (runnerUp >= third)', async () => { + const stripeTools: ToolEntry[] = [ + { name: 'create_invoice', description: 'billing invoice payment charge', inputSchema: { type: 'object', properties: {} } }, + ]; + const neonTools: ToolEntry[] = [ + { name: 'run_sql', description: 'billing sql query database', inputSchema: { type: 'object', properties: {} } }, + ]; + const githubTools: ToolEntry[] = [ + { name: 'list_repos', description: 'billing repositories code', inputSchema: { type: 'object', properties: {} } }, + ]; + const agg = buildAgg('c7', [STRIPE_CFG, NEON_CFG, GITHUB_CFG], { stripe: stripeTools, neon: neonTools, github: githubTools }); + try { + const r = await agg.callTool('ch1tty/cast', { intent: 'billing invoice payment', explain: true }); + const parsed = JSON.parse((r.content[0] as { text: string }).text); + const { explanation } = parsed; + if ('lowestToThirdRatio' in explanation && 'lowestToRunnerUpRatio' in explanation) { + assert.ok( + explanation.lowestToThirdRatio >= explanation.lowestToRunnerUpRatio - 1e-9, + `lowest/third (${explanation.lowestToThirdRatio}) should be >= lowest/runnerUp (${explanation.lowestToRunnerUpRatio})`, + ); + } + } finally { + await agg.shutdown(); + } +}); + +test('CCCCCCCCC-8: tool description documents lowestToThirdRatio', async () => { + const agg = buildAgg('c8', [STRIPE_CFG], { stripe: [] }); + try { + const { tools } = await agg.listAllTools(); + const castTool = tools.find((t) => t.name === 'ch1tty/cast'); + assert.ok(castTool, 'ch1tty/cast tool not found'); + assert.ok( + castTool.description?.includes('lowestToThirdRatio'), + `cast description should mention lowestToThirdRatio`, + ); + } finally { + await agg.shutdown(); + } +});