oh-my-knowledge 0.18.0 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +596 -326
- package/README.zh.md +917 -0
- package/dist/src/analysis/failure-clusterer.d.ts +96 -0
- package/dist/src/analysis/failure-clusterer.d.ts.map +1 -0
- package/dist/src/analysis/failure-clusterer.js +298 -0
- package/dist/src/analysis/failure-clusterer.js.map +1 -0
- package/dist/src/analysis/sample-diagnostics.d.ts +78 -0
- package/dist/src/analysis/sample-diagnostics.d.ts.map +1 -0
- package/dist/src/analysis/sample-diagnostics.js +259 -0
- package/dist/src/analysis/sample-diagnostics.js.map +1 -0
- package/dist/src/analysis/saturation.d.ts +85 -0
- package/dist/src/analysis/saturation.d.ts.map +1 -0
- package/dist/src/analysis/saturation.js +174 -0
- package/dist/src/analysis/saturation.js.map +1 -0
- package/dist/src/cli.js +772 -18
- package/dist/src/cli.js.map +1 -1
- package/dist/src/eval-core/bootstrap.d.ts +72 -0
- package/dist/src/eval-core/bootstrap.d.ts.map +1 -0
- package/dist/src/eval-core/bootstrap.js +174 -0
- package/dist/src/eval-core/bootstrap.js.map +1 -0
- package/dist/src/eval-core/evaluation-execution.d.ts +15 -1
- package/dist/src/eval-core/evaluation-execution.d.ts.map +1 -1
- package/dist/src/eval-core/evaluation-execution.js +37 -3
- package/dist/src/eval-core/evaluation-execution.js.map +1 -1
- package/dist/src/eval-core/evaluation-job.d.ts +10 -2
- package/dist/src/eval-core/evaluation-job.d.ts.map +1 -1
- package/dist/src/eval-core/evaluation-job.js +9 -1
- package/dist/src/eval-core/evaluation-job.js.map +1 -1
- package/dist/src/eval-core/evaluation-reporting.d.ts.map +1 -1
- package/dist/src/eval-core/evaluation-reporting.js +90 -0
- package/dist/src/eval-core/evaluation-reporting.js.map +1 -1
- package/dist/src/eval-core/schema.d.ts.map +1 -1
- package/dist/src/eval-core/schema.js +69 -0
- package/dist/src/eval-core/schema.js.map +1 -1
- package/dist/src/eval-core/verdict.d.ts +74 -0
- package/dist/src/eval-core/verdict.d.ts.map +1 -0
- package/dist/src/eval-core/verdict.js +283 -0
- package/dist/src/eval-core/verdict.js.map +1 -0
- package/dist/src/eval-workflows/each-evaluation-workflow.d.ts +16 -3
- package/dist/src/eval-workflows/each-evaluation-workflow.d.ts.map +1 -1
- package/dist/src/eval-workflows/each-evaluation-workflow.js +10 -2
- package/dist/src/eval-workflows/each-evaluation-workflow.js.map +1 -1
- package/dist/src/eval-workflows/evaluation-pipeline.d.ts +17 -1
- package/dist/src/eval-workflows/evaluation-pipeline.d.ts.map +1 -1
- package/dist/src/eval-workflows/evaluation-pipeline.js +45 -3
- package/dist/src/eval-workflows/evaluation-pipeline.js.map +1 -1
- package/dist/src/eval-workflows/run-evaluation.d.ts +23 -2
- package/dist/src/eval-workflows/run-evaluation.d.ts.map +1 -1
- package/dist/src/eval-workflows/run-evaluation.js +104 -4
- package/dist/src/eval-workflows/run-evaluation.js.map +1 -1
- package/dist/src/grading/assertions.d.ts +16 -0
- package/dist/src/grading/assertions.d.ts.map +1 -1
- package/dist/src/grading/assertions.js +385 -111
- package/dist/src/grading/assertions.js.map +1 -1
- package/dist/src/grading/debias-validate.d.ts +84 -0
- package/dist/src/grading/debias-validate.d.ts.map +1 -0
- package/dist/src/grading/debias-validate.js +173 -0
- package/dist/src/grading/debias-validate.js.map +1 -0
- package/dist/src/grading/gold-cli.d.ts +88 -0
- package/dist/src/grading/gold-cli.d.ts.map +1 -0
- package/dist/src/grading/gold-cli.js +251 -0
- package/dist/src/grading/gold-cli.js.map +1 -0
- package/dist/src/grading/gold-dataset.d.ts +73 -0
- package/dist/src/grading/gold-dataset.d.ts.map +1 -0
- package/dist/src/grading/gold-dataset.js +161 -0
- package/dist/src/grading/gold-dataset.js.map +1 -0
- package/dist/src/grading/human-gold.d.ts +102 -0
- package/dist/src/grading/human-gold.d.ts.map +1 -0
- package/dist/src/grading/human-gold.js +188 -0
- package/dist/src/grading/human-gold.js.map +1 -0
- package/dist/src/grading/index.d.ts +27 -2
- package/dist/src/grading/index.d.ts.map +1 -1
- package/dist/src/grading/index.js +36 -18
- package/dist/src/grading/index.js.map +1 -1
- package/dist/src/grading/judge.d.ts +65 -2
- package/dist/src/grading/judge.d.ts.map +1 -1
- package/dist/src/grading/judge.js +280 -23
- package/dist/src/grading/judge.js.map +1 -1
- package/dist/src/inputs/eval-config.js +19 -0
- package/dist/src/inputs/eval-config.js.map +1 -1
- package/dist/src/observability/{production-analyzer.d.ts → skill-health-analyzer.d.ts} +24 -2
- package/dist/src/observability/skill-health-analyzer.d.ts.map +1 -0
- package/dist/src/observability/{production-analyzer.js → skill-health-analyzer.js} +61 -6
- package/dist/src/observability/skill-health-analyzer.js.map +1 -0
- package/dist/src/observability/trace-adapter.d.ts.map +1 -1
- package/dist/src/observability/trace-adapter.js +27 -1
- package/dist/src/observability/trace-adapter.js.map +1 -1
- package/dist/src/renderer/html-renderer.d.ts.map +1 -1
- package/dist/src/renderer/html-renderer.js +40 -6
- package/dist/src/renderer/html-renderer.js.map +1 -1
- package/dist/src/renderer/layout.d.ts.map +1 -1
- package/dist/src/renderer/layout.js +138 -4
- package/dist/src/renderer/layout.js.map +1 -1
- package/dist/src/renderer/skill-health-renderer.d.ts +2 -2
- package/dist/src/renderer/skill-health-renderer.d.ts.map +1 -1
- package/dist/src/renderer/skill-health-renderer.js +39 -4
- package/dist/src/renderer/skill-health-renderer.js.map +1 -1
- package/dist/src/renderer/summary.d.ts +28 -1
- package/dist/src/renderer/summary.d.ts.map +1 -1
- package/dist/src/renderer/summary.js +322 -8
- package/dist/src/renderer/summary.js.map +1 -1
- package/dist/src/renderer/table.d.ts.map +1 -1
- package/dist/src/renderer/table.js +63 -2
- package/dist/src/renderer/table.js.map +1 -1
- package/dist/src/server/report-server.d.ts +2 -1
- package/dist/src/server/report-server.d.ts.map +1 -1
- package/dist/src/server/report-server.js +397 -2
- package/dist/src/server/report-server.js.map +1 -1
- package/dist/src/types.d.ts +247 -0
- package/dist/src/types.d.ts.map +1 -1
- package/package.json +24 -6
- package/dist/src/observability/production-analyzer.d.ts.map +0 -1
- package/dist/src/observability/production-analyzer.js.map +0 -1
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Verdict — turn a finished report into a one-line ship/no-ship recommendation.
|
|
3
|
+
*
|
|
4
|
+
* Why this exists
|
|
5
|
+
* ---------------
|
|
6
|
+
* v0.21 makes the data trustworthy. v0.22 closes the last mile: senior
|
|
7
|
+
* engineers' #1 complaint is "the report has all the right numbers but I
|
|
8
|
+
* still need 30 minutes to read it before I can decide". This module
|
|
9
|
+
* aggregates the four data sources omk already produces — Bootstrap CI on
|
|
10
|
+
* the pairwise diff, three-layer CI gate, saturation curve, and (when
|
|
11
|
+
* available) Krippendorff α against gold — and emits one of four verdicts:
|
|
12
|
+
*
|
|
13
|
+
* - **PROGRESS** diff CI shows real positive shift, no layer regressed
|
|
14
|
+
* - **CAUTIOUS** positive shift but at least one layer broke its gate,
|
|
15
|
+
* or saturation says we're not powered yet
|
|
16
|
+
* - **REGRESS** diff CI clearly negative, or a layer dropped a gate
|
|
17
|
+
* - **NOISE** diff CI contains 0 — can't separate from noise
|
|
18
|
+
* - **UNDERPOWERED** N too small / saturation low confidence and no signal
|
|
19
|
+
* - **SOLO** single-variant report; nothing to compare against
|
|
20
|
+
*
|
|
21
|
+
* The output is intentionally text-template-driven so the same rule engine
|
|
22
|
+
* powers both `omk bench verdict` (CLI, terse) and the HTML report's
|
|
23
|
+
* top-of-page "verdict pill" (Phase v0.22.2). Both surfaces must agree.
|
|
24
|
+
*
|
|
25
|
+
* Subjectivity caveat: the ship recommendation is rule-based, not statistically
|
|
26
|
+
* proven optimal. Each rule's source (NIST AI 800-3 / Krippendorff thresholds /
|
|
27
|
+
* empirical) is documented inline so users can audit and override.
|
|
28
|
+
*/
|
|
29
|
+
import { evaluateCiGates } from './ci-gates.js';
|
|
30
|
+
/**
|
|
31
|
+
* Compute a verdict for a finished report. Pure function — no I/O.
|
|
32
|
+
*/
|
|
33
|
+
export function computeVerdict(report, options = {}) {
|
|
34
|
+
const { ciThreshold = 3.5, triviallySmallDiff = 0.1 } = options;
|
|
35
|
+
const variants = report.meta?.variants ?? [];
|
|
36
|
+
const summary = report.summary ?? {};
|
|
37
|
+
const sampleCount = report.meta?.sampleCount ?? 0;
|
|
38
|
+
if (variants.length < 2) {
|
|
39
|
+
// Single-variant — no comparison possible. Just report whether the variant
|
|
40
|
+
// passes its own three-layer gate.
|
|
41
|
+
const gate = evaluateCiGates(summary, ciThreshold);
|
|
42
|
+
return {
|
|
43
|
+
level: 'SOLO',
|
|
44
|
+
headline: gate.allPass
|
|
45
|
+
? `SOLO · single variant, three-layer gate PASS @ threshold ${ciThreshold}`
|
|
46
|
+
: `SOLO · single variant, three-layer gate FAIL — see ci output`,
|
|
47
|
+
rationale: {
|
|
48
|
+
layerWinners: gate.lines.join('; '),
|
|
49
|
+
sampleSize: `N=${sampleCount}`,
|
|
50
|
+
},
|
|
51
|
+
variants,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
// Build per-pair verdicts. Convention: variants[0] = control, [1..] = treatments.
|
|
55
|
+
// If --bootstrap wasn't used, pairComparisons is empty — synthesize pseudo-pairs
|
|
56
|
+
// (without CI) so verdictForPair's no-CI path runs and we still get a verdict.
|
|
57
|
+
const explicitPairs = report.meta?.pairComparisons ?? [];
|
|
58
|
+
const pairs = explicitPairs.length > 0
|
|
59
|
+
? explicitPairs
|
|
60
|
+
: variants.slice(1).map((treatment) => ({ control: variants[0], treatment }));
|
|
61
|
+
const perPair = pairs.map((p) => verdictForPair(p, summary, sampleCount, report, ciThreshold, triviallySmallDiff));
|
|
62
|
+
// Worst-case roll-up: REGRESS dominates, then CAUTIOUS, then NOISE/UNDERPOWERED, then PROGRESS.
|
|
63
|
+
const order = ['REGRESS', 'CAUTIOUS', 'UNDERPOWERED', 'NOISE', 'PROGRESS'];
|
|
64
|
+
let topLevel = 'PROGRESS';
|
|
65
|
+
for (const level of order) {
|
|
66
|
+
if (perPair.some((p) => p.level === level)) {
|
|
67
|
+
topLevel = level;
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Single representative pair for the top-level rationale (the worst one).
|
|
72
|
+
const representative = perPair.find((p) => p.level === topLevel) ?? perPair[0];
|
|
73
|
+
const significance = representative
|
|
74
|
+
? formatSignificance(representative)
|
|
75
|
+
: 'no pairwise comparison available — was --bootstrap used?';
|
|
76
|
+
const layerWinners = formatLayerWinners(summary, variants);
|
|
77
|
+
const sampleSize = formatSampleSize(report);
|
|
78
|
+
const judgeAgreement = formatJudgeAgreement(report);
|
|
79
|
+
const shipRecommendation = recommendation(topLevel, perPair);
|
|
80
|
+
return {
|
|
81
|
+
level: topLevel,
|
|
82
|
+
headline: representative
|
|
83
|
+
? `${topLevel} · ${representative.treatment} vs ${representative.control}: ${representative.headline}`
|
|
84
|
+
: `${topLevel} · ${variants.length} variants`,
|
|
85
|
+
perPair,
|
|
86
|
+
rationale: {
|
|
87
|
+
significance,
|
|
88
|
+
layerWinners,
|
|
89
|
+
sampleSize,
|
|
90
|
+
judgeAgreement,
|
|
91
|
+
shipRecommendation,
|
|
92
|
+
},
|
|
93
|
+
variants,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Per-pair verdict logic. The hierarchy of checks matters:
|
|
98
|
+
* 1. If a layer regressed past the gate → REGRESS (loudest signal).
|
|
99
|
+
* 2. If diff CI is clearly negative → REGRESS.
|
|
100
|
+
* 3. If diff CI contains 0:
|
|
101
|
+
* - and N is too small / saturation low confidence → UNDERPOWERED
|
|
102
|
+
* - otherwise → NOISE
|
|
103
|
+
* 4. If diff CI is positive but trivially small → CAUTIOUS.
|
|
104
|
+
* 5. If diff CI is positive AND treatment passes all gates → PROGRESS.
|
|
105
|
+
* 6. If diff CI is positive but treatment broke a gate → CAUTIOUS.
|
|
106
|
+
*/
|
|
107
|
+
function verdictForPair(pair, summary, sampleCount, report, ciThreshold, triviallySmallDiff) {
|
|
108
|
+
const { control, treatment, diffBootstrapCI: diff } = pair;
|
|
109
|
+
// Layer-gate check: did any layer fall below threshold for either variant?
|
|
110
|
+
const cGate = evaluateCiGates({ [control]: summary[control] }, ciThreshold);
|
|
111
|
+
const tGate = evaluateCiGates({ [treatment]: summary[treatment] }, ciThreshold);
|
|
112
|
+
// No bootstrap CI available → fall back to point-estimate diff comparison.
|
|
113
|
+
if (!diff) {
|
|
114
|
+
const cMean = avgComposite(summary[control]);
|
|
115
|
+
const tMean = avgComposite(summary[treatment]);
|
|
116
|
+
const delta = tMean - cMean;
|
|
117
|
+
const headline = `Δ=${delta >= 0 ? '+' : ''}${delta.toFixed(2)} (no CI; rerun with --bootstrap)`;
|
|
118
|
+
if (Math.abs(delta) < triviallySmallDiff) {
|
|
119
|
+
return { control, treatment, level: 'NOISE', headline };
|
|
120
|
+
}
|
|
121
|
+
return {
|
|
122
|
+
control,
|
|
123
|
+
treatment,
|
|
124
|
+
level: delta > 0 ? 'CAUTIOUS' : 'REGRESS',
|
|
125
|
+
headline,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
const headlineCore = `Δ=${diff.estimate >= 0 ? '+' : ''}${diff.estimate} CI=[${diff.low}, ${diff.high}]`;
|
|
129
|
+
if (!diff.significant) {
|
|
130
|
+
// Diff CI contains 0. Distinguish "underpowered (saturation says: more samples needed)"
|
|
131
|
+
// from "noise (saturation says: we're saturated, the effect just isn't there)".
|
|
132
|
+
const satVerdict = report.variance?.saturation?.verdicts?.[treatment];
|
|
133
|
+
const underpowered = sampleCount < 20 ||
|
|
134
|
+
(satVerdict && !satVerdict.saturated && satVerdict.confidence !== 'high');
|
|
135
|
+
if (underpowered) {
|
|
136
|
+
return {
|
|
137
|
+
control,
|
|
138
|
+
treatment,
|
|
139
|
+
level: 'UNDERPOWERED',
|
|
140
|
+
headline: `${headlineCore} · N=${sampleCount} likely too small`,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
return { control, treatment, level: 'NOISE', headline: `${headlineCore} · CI spans 0` };
|
|
144
|
+
}
|
|
145
|
+
// diff is significant.
|
|
146
|
+
if (diff.estimate < 0) {
|
|
147
|
+
return { control, treatment, level: 'REGRESS', headline: `${headlineCore} · treatment loses` };
|
|
148
|
+
}
|
|
149
|
+
// diff > 0 and significant. Did treatment break a gate?
|
|
150
|
+
if (!tGate.allPass) {
|
|
151
|
+
return {
|
|
152
|
+
control,
|
|
153
|
+
treatment,
|
|
154
|
+
level: 'CAUTIOUS',
|
|
155
|
+
headline: `${headlineCore} · gain real, but treatment broke layer gate`,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
// Trivially small diff?
|
|
159
|
+
if (diff.estimate < triviallySmallDiff) {
|
|
160
|
+
return {
|
|
161
|
+
control,
|
|
162
|
+
treatment,
|
|
163
|
+
level: 'CAUTIOUS',
|
|
164
|
+
headline: `${headlineCore} · significant but practically tiny`,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
// Did control break a gate? Then treatment winning isn't surprising — flag.
|
|
168
|
+
if (!cGate.allPass) {
|
|
169
|
+
return {
|
|
170
|
+
control,
|
|
171
|
+
treatment,
|
|
172
|
+
level: 'PROGRESS',
|
|
173
|
+
headline: `${headlineCore} · treatment recovers from broken control`,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
return { control, treatment, level: 'PROGRESS', headline: `${headlineCore} · clean win` };
|
|
177
|
+
}
|
|
178
|
+
function avgComposite(s) {
|
|
179
|
+
if (!s)
|
|
180
|
+
return 0;
|
|
181
|
+
if (typeof s.avgCompositeScore === 'number')
|
|
182
|
+
return s.avgCompositeScore;
|
|
183
|
+
// Fallback: average of the three layers when composite isn't on the summary.
|
|
184
|
+
const layers = [s.avgFactScore, s.avgBehaviorScore, s.avgJudgeScore].filter((x) => typeof x === 'number');
|
|
185
|
+
if (layers.length === 0)
|
|
186
|
+
return 0;
|
|
187
|
+
return layers.reduce((a, b) => a + b, 0) / layers.length;
|
|
188
|
+
}
|
|
189
|
+
function formatSignificance(p) {
|
|
190
|
+
return `${p.level} · ${p.headline}`;
|
|
191
|
+
}
|
|
192
|
+
function formatLayerWinners(summary, variants) {
|
|
193
|
+
if (variants.length < 2)
|
|
194
|
+
return '—';
|
|
195
|
+
const control = variants[0];
|
|
196
|
+
const treatment = variants[1];
|
|
197
|
+
const c = summary[control];
|
|
198
|
+
const t = summary[treatment];
|
|
199
|
+
if (!c || !t)
|
|
200
|
+
return '—';
|
|
201
|
+
const layers = [
|
|
202
|
+
['fact', c.avgFactScore, t.avgFactScore],
|
|
203
|
+
['behavior', c.avgBehaviorScore, t.avgBehaviorScore],
|
|
204
|
+
['judge', c.avgJudgeScore, t.avgJudgeScore],
|
|
205
|
+
];
|
|
206
|
+
return layers
|
|
207
|
+
.map(([name, cv, tv]) => {
|
|
208
|
+
if (typeof cv !== 'number' || typeof tv !== 'number')
|
|
209
|
+
return `${name}=—`;
|
|
210
|
+
const delta = tv - cv;
|
|
211
|
+
const sign = delta >= 0 ? '+' : '';
|
|
212
|
+
return `${name}: ${cv.toFixed(2)}→${tv.toFixed(2)} (${sign}${delta.toFixed(2)})`;
|
|
213
|
+
})
|
|
214
|
+
.join(', ');
|
|
215
|
+
}
|
|
216
|
+
function formatSampleSize(report) {
|
|
217
|
+
const n = report.meta?.sampleCount ?? 0;
|
|
218
|
+
const sat = report.variance?.saturation?.verdicts;
|
|
219
|
+
if (!sat)
|
|
220
|
+
return `N=${n}`;
|
|
221
|
+
const variants = report.meta?.variants ?? [];
|
|
222
|
+
const treatment = variants[1];
|
|
223
|
+
const v = treatment ? sat[treatment] : undefined;
|
|
224
|
+
if (!v)
|
|
225
|
+
return `N=${n}`;
|
|
226
|
+
if (v.saturated)
|
|
227
|
+
return `N=${n}, saturated @ N=${v.atN ?? '?'} (${v.confidence} confidence)`;
|
|
228
|
+
return `N=${n}, not yet saturated (${v.confidence} confidence)`;
|
|
229
|
+
}
|
|
230
|
+
function formatJudgeAgreement(report) {
|
|
231
|
+
const a = report.meta?.humanAgreement;
|
|
232
|
+
if (!a)
|
|
233
|
+
return undefined;
|
|
234
|
+
const verdict = Number.isNaN(a.alpha)
|
|
235
|
+
? 'undefined'
|
|
236
|
+
: a.alpha >= 0.8 ? 'strong'
|
|
237
|
+
: a.alpha >= 0.667 ? 'acceptable'
|
|
238
|
+
: a.alpha >= 0.4 ? 'weak'
|
|
239
|
+
: 'poor';
|
|
240
|
+
return `α=${Number.isNaN(a.alpha) ? 'NaN' : a.alpha.toFixed(2)} (${verdict}) vs gold ${a.goldAnnotator}`;
|
|
241
|
+
}
|
|
242
|
+
function recommendation(level, _perPair) {
|
|
243
|
+
switch (level) {
|
|
244
|
+
case 'PROGRESS':
|
|
245
|
+
return 'SHIP — treatment is significantly better and passes all layer gates.';
|
|
246
|
+
case 'CAUTIOUS':
|
|
247
|
+
return 'INVESTIGATE — the gain is real but at least one warning fired (broken gate, trivially small, or partial recovery). Do not ship blind.';
|
|
248
|
+
case 'REGRESS':
|
|
249
|
+
return 'DO NOT SHIP — treatment regresses. Check the worst layer and re-run with the fix.';
|
|
250
|
+
case 'NOISE':
|
|
251
|
+
return 'NO CALL — diff CI spans 0. The data shows no separable effect at this N.';
|
|
252
|
+
case 'UNDERPOWERED':
|
|
253
|
+
return 'INSUFFICIENT DATA — increase N (try 2× current) and re-run.';
|
|
254
|
+
case 'SOLO':
|
|
255
|
+
return 'ADD A CONTROL — single-variant report. Re-run with --control baseline --treatment <name>.';
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Plain-text formatter for `omk bench verdict <id>`. Stays under 6 lines per the
|
|
260
|
+
* v0.22 spec — one verdict + four rationale bullets + one ship recommendation.
|
|
261
|
+
*/
|
|
262
|
+
export function formatVerdictText(result, options = {}) {
|
|
263
|
+
const lines = [];
|
|
264
|
+
lines.push(`Verdict: ${result.level}`);
|
|
265
|
+
lines.push(` ${result.headline}`);
|
|
266
|
+
if (result.rationale.layerWinners)
|
|
267
|
+
lines.push(` Layer winners: ${result.rationale.layerWinners}`);
|
|
268
|
+
if (result.rationale.sampleSize)
|
|
269
|
+
lines.push(` Sample size: ${result.rationale.sampleSize}`);
|
|
270
|
+
if (result.rationale.judgeAgreement)
|
|
271
|
+
lines.push(` Judge α: ${result.rationale.judgeAgreement}`);
|
|
272
|
+
if (result.rationale.shipRecommendation)
|
|
273
|
+
lines.push(` ${result.rationale.shipRecommendation}`);
|
|
274
|
+
if (options.verbose && result.perPair && result.perPair.length > 1) {
|
|
275
|
+
lines.push('');
|
|
276
|
+
lines.push(' Per-pair detail:');
|
|
277
|
+
for (const p of result.perPair) {
|
|
278
|
+
lines.push(` ${p.level}: ${p.treatment} vs ${p.control} — ${p.headline}`);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return lines.join('\n');
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=verdict.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verdict.js","sourceRoot":"","sources":["../../../src/eval-core/verdict.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Artifact, JobStore, ProgressCallback, Report, VariantResult, VariantSummary } from '../types.js';
|
|
1
|
+
import type { Artifact, JobStore, ProgressCallback, Report, VarianceData, VariantResult, VariantSummary } from '../types.js';
|
|
2
2
|
interface RunSingleEvaluationOptions {
|
|
3
3
|
samplesPath: string;
|
|
4
4
|
skillDir: string;
|
|
@@ -17,6 +17,12 @@ interface RunSingleEvaluationOptions {
|
|
|
17
17
|
skipPreflight: boolean;
|
|
18
18
|
mcpConfig?: string;
|
|
19
19
|
verbose: boolean;
|
|
20
|
+
/** Forwarded to grade(); each sample × dimension is judged N times. Default 1. */
|
|
21
|
+
judgeRepeat?: number;
|
|
22
|
+
/** Forwarded to pipeline; ≥ 2 entries triggers multi-judge ensemble mode. */
|
|
23
|
+
judgeModels?: import('../types.js').JudgeConfig[];
|
|
24
|
+
/** v0.21 Phase 3a length-debias toggle. Default true. */
|
|
25
|
+
lengthDebias?: boolean;
|
|
20
26
|
}
|
|
21
27
|
export interface EachSkillResult {
|
|
22
28
|
name: string;
|
|
@@ -24,6 +30,8 @@ export interface EachSkillResult {
|
|
|
24
30
|
samplesPath: string;
|
|
25
31
|
sampleCount: number;
|
|
26
32
|
summary: Record<string, VariantSummary>;
|
|
33
|
+
/** repeat > 1 时由 runMultiple 聚合,承载三层独立 variance + t 检验 */
|
|
34
|
+
variance?: VarianceData;
|
|
27
35
|
results: Array<{
|
|
28
36
|
sample_id: string;
|
|
29
37
|
variants: {
|
|
@@ -32,7 +40,7 @@ export interface EachSkillResult {
|
|
|
32
40
|
};
|
|
33
41
|
}>;
|
|
34
42
|
}
|
|
35
|
-
export declare function buildEachReport({ skillDir, skillEntries, skillResults, model, judgeModel, noJudge, executorName, judgeExecutorName, project, owner, tags, dryRun, concurrency, timeoutMs, totalCostUSD, }: {
|
|
43
|
+
export declare function buildEachReport({ skillDir, skillEntries, skillResults, model, judgeModel, noJudge, executorName, judgeExecutorName, project, owner, tags, dryRun, concurrency, timeoutMs, totalCostUSD, repeat, }: {
|
|
36
44
|
skillDir: string;
|
|
37
45
|
skillEntries: Array<{
|
|
38
46
|
name: string;
|
|
@@ -52,6 +60,7 @@ export declare function buildEachReport({ skillDir, skillEntries, skillResults,
|
|
|
52
60
|
concurrency: number;
|
|
53
61
|
timeoutMs?: number;
|
|
54
62
|
totalCostUSD: number;
|
|
63
|
+
repeat?: number;
|
|
55
64
|
}): {
|
|
56
65
|
report: {
|
|
57
66
|
id: string;
|
|
@@ -91,7 +100,7 @@ export declare function buildEachReport({ skillDir, skillEntries, skillResults,
|
|
|
91
100
|
};
|
|
92
101
|
job: import("../types.js").EvaluationJob;
|
|
93
102
|
};
|
|
94
|
-
export declare function executeEachEvaluationRuns({ skillDir, skillEntries, model, judgeModel, outputDir, project, owner, tags, noJudge, concurrency, timeoutMs, executorName, judgeExecutorName, jobStore, persistJob, onProgress, onSkillProgress, skipPreflight, mcpConfig, verbose, runSingleEvaluation, }: {
|
|
103
|
+
export declare function executeEachEvaluationRuns({ skillDir, skillEntries, model, judgeModel, outputDir, project, owner, tags, noJudge, concurrency, timeoutMs, executorName, judgeExecutorName, jobStore, persistJob, onProgress, onSkillProgress, skipPreflight, mcpConfig, verbose, repeat, judgeRepeat, judgeModels, lengthDebias, runSingleEvaluation, }: {
|
|
95
104
|
skillDir: string;
|
|
96
105
|
skillEntries: Array<{
|
|
97
106
|
name: string;
|
|
@@ -121,6 +130,10 @@ export declare function executeEachEvaluationRuns({ skillDir, skillEntries, mode
|
|
|
121
130
|
skipPreflight?: boolean;
|
|
122
131
|
mcpConfig?: string;
|
|
123
132
|
verbose?: boolean;
|
|
133
|
+
repeat?: number;
|
|
134
|
+
judgeRepeat?: number;
|
|
135
|
+
judgeModels?: import('../types.js').JudgeConfig[];
|
|
136
|
+
lengthDebias?: boolean;
|
|
124
137
|
runSingleEvaluation: (options: RunSingleEvaluationOptions) => Promise<{
|
|
125
138
|
report: Report;
|
|
126
139
|
filePath: string | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"each-evaluation-workflow.d.ts","sourceRoot":"","sources":["../../../src/eval-workflows/each-evaluation-workflow.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"each-evaluation-workflow.d.ts","sourceRoot":"","sources":["../../../src/eval-workflows/each-evaluation-workflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,7 +22,7 @@ function buildEachOverview(skillResults, totalCostUSD) {
|
|
|
22
22
|
}),
|
|
23
23
|
};
|
|
24
24
|
}
|
|
25
|
-
export function buildEachReport({ skillDir, skillEntries, skillResults, model, judgeModel, noJudge, executorName, judgeExecutorName, project, owner, tags, dryRun, concurrency, timeoutMs, totalCostUSD, }) {
|
|
25
|
+
export function buildEachReport({ skillDir, skillEntries, skillResults, model, judgeModel, noJudge, executorName, judgeExecutorName, project, owner, tags, dryRun, concurrency, timeoutMs, totalCostUSD, repeat, }) {
|
|
26
26
|
const runId = generateRunId(['each']);
|
|
27
27
|
const request = buildEvaluationRequest({
|
|
28
28
|
samplesPath: '',
|
|
@@ -47,6 +47,8 @@ export function buildEachReport({ skillDir, skillEntries, skillResults, model, j
|
|
|
47
47
|
project,
|
|
48
48
|
owner,
|
|
49
49
|
tags,
|
|
50
|
+
repeat,
|
|
51
|
+
each: true,
|
|
50
52
|
});
|
|
51
53
|
const createdAt = new Date().toISOString();
|
|
52
54
|
const { run: initialRun, startedAt } = createEvaluationRun(runId, createdAt);
|
|
@@ -90,7 +92,7 @@ export function buildEachReport({ skillDir, skillEntries, skillResults, model, j
|
|
|
90
92
|
job,
|
|
91
93
|
};
|
|
92
94
|
}
|
|
93
|
-
export async function executeEachEvaluationRuns({ skillDir, skillEntries, model, judgeModel, outputDir = DEFAULT_OUTPUT_DIR, project, owner, tags, noJudge = false, concurrency = 1, timeoutMs, executorName, judgeExecutorName, jobStore = null, persistJob = true, onProgress = null, onSkillProgress = null, skipPreflight = false, mcpConfig, verbose = false, runSingleEvaluation, }) {
|
|
95
|
+
export async function executeEachEvaluationRuns({ skillDir, skillEntries, model, judgeModel, outputDir = DEFAULT_OUTPUT_DIR, project, owner, tags, noJudge = false, concurrency = 1, timeoutMs, executorName, judgeExecutorName, jobStore = null, persistJob = true, onProgress = null, onSkillProgress = null, skipPreflight = false, mcpConfig, verbose = false, repeat, judgeRepeat, judgeModels, lengthDebias, runSingleEvaluation, }) {
|
|
94
96
|
const skillResults = [];
|
|
95
97
|
let totalCostUSD = 0;
|
|
96
98
|
for (let i = 0; i < skillEntries.length; i++) {
|
|
@@ -122,6 +124,9 @@ export async function executeEachEvaluationRuns({ skillDir, skillEntries, model,
|
|
|
122
124
|
skipPreflight: skipPreflight || i > 0,
|
|
123
125
|
mcpConfig,
|
|
124
126
|
verbose,
|
|
127
|
+
judgeRepeat,
|
|
128
|
+
judgeModels,
|
|
129
|
+
lengthDebias,
|
|
125
130
|
});
|
|
126
131
|
skillResults.push({
|
|
127
132
|
name: entry.name,
|
|
@@ -132,6 +137,8 @@ export async function executeEachEvaluationRuns({ skillDir, skillEntries, model,
|
|
|
132
137
|
baseline: report.summary.baseline || {},
|
|
133
138
|
skill: (report.summary.skill || {}),
|
|
134
139
|
},
|
|
140
|
+
// runMultiple 跑 N 次后会把 variance 挂到 report.variance,这里搬到 skill 维度
|
|
141
|
+
...(report.variance ? { variance: report.variance } : {}),
|
|
135
142
|
results: report.results.map((result) => ({
|
|
136
143
|
sample_id: result.sample_id,
|
|
137
144
|
variants: {
|
|
@@ -159,6 +166,7 @@ export async function executeEachEvaluationRuns({ skillDir, skillEntries, model,
|
|
|
159
166
|
concurrency,
|
|
160
167
|
timeoutMs,
|
|
161
168
|
totalCostUSD,
|
|
169
|
+
repeat,
|
|
162
170
|
});
|
|
163
171
|
const filePath = persistReport(combinedReport, outputDir);
|
|
164
172
|
const resolvedJobStore = persistJob ? (jobStore ?? createFileJobStore(DEFAULT_JOBS_DIR)) : null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"each-evaluation-workflow.js","sourceRoot":"","sources":["../../../src/eval-workflows/each-evaluation-workflow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AACxG,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACxI,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"each-evaluation-workflow.js","sourceRoot":"","sources":["../../../src/eval-workflows/each-evaluation-workflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,8 +30,24 @@ export interface EvaluationPipelineOptions {
|
|
|
30
30
|
existingResults?: Record<string, Record<string, VariantResult>>;
|
|
31
31
|
requires?: DependencyRequirements;
|
|
32
32
|
layeredStats?: boolean;
|
|
33
|
+
/** 透传到 meta.request.repeat */
|
|
34
|
+
repeat?: number;
|
|
35
|
+
/** 透传到 meta.request.each */
|
|
36
|
+
each?: boolean;
|
|
37
|
+
/** 透传到 meta.request.judgeRepeat 与 grade(),每条 sample × dimension judge N 次 */
|
|
38
|
+
judgeRepeat?: number;
|
|
39
|
+
/** Multi-judge ensemble configs (≥ 2 entries triggers ensemble mode). */
|
|
40
|
+
judgeModels?: import('../types.js').JudgeConfig[];
|
|
41
|
+
/** --bootstrap. */
|
|
42
|
+
bootstrap?: boolean;
|
|
43
|
+
/** --bootstrap-samples N. Default 1000. */
|
|
44
|
+
bootstrapSamples?: number;
|
|
45
|
+
/** v0.21 length-debias toggle. Default true; --no-debias-length flips to false. */
|
|
46
|
+
lengthDebias?: boolean;
|
|
47
|
+
/** v0.22 — hard budget caps. */
|
|
48
|
+
budget?: import('../types.js').EvalBudget;
|
|
33
49
|
}
|
|
34
|
-
export declare function executeEvaluationPipeline({ samplesPath, skillDir, samples, tasks, artifacts, model, judgeModel, noJudge, executorName, judgeExecutorName, executor, judgeExecutor, outputDir, project, owner, tags, blind, concurrency, timeoutMs, noCache, jobStore, persistJob, onProgress, skipPreflight, verbose, retry, existingResults, requires, layeredStats, }: EvaluationPipelineOptions): Promise<{
|
|
50
|
+
export declare function executeEvaluationPipeline({ samplesPath, skillDir, samples, tasks, artifacts, model, judgeModel, noJudge, executorName, judgeExecutorName, executor, judgeExecutor, outputDir, project, owner, tags, blind, concurrency, timeoutMs, noCache, jobStore, persistJob, onProgress, skipPreflight, verbose, retry, existingResults, requires, layeredStats, repeat, each, judgeRepeat, judgeModels, bootstrap, bootstrapSamples, lengthDebias, budget, }: EvaluationPipelineOptions): Promise<{
|
|
35
51
|
report: Report;
|
|
36
52
|
filePath: string | null;
|
|
37
53
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluation-pipeline.d.ts","sourceRoot":"","sources":["../../../src/eval-workflows/evaluation-pipeline.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAgBjF,OAAO,KAAK,EACV,QAAQ,EAIR,UAAU,EACV,QAAQ,EACR,gBAAgB,EAChB,MAAM,EACN,MAAM,EACN,IAAI,EACJ,aAAa,EACd,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"evaluation-pipeline.d.ts","sourceRoot":"","sources":["../../../src/eval-workflows/evaluation-pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ import { preflightDependencies, formatDependencyErrors } from '../eval-core/depe
|
|
|
9
9
|
import { createFileJobStore, DEFAULT_JOBS_DIR, } from '../server/job-store.js';
|
|
10
10
|
import { stopAllServers } from '../inputs/mcp-resolver.js';
|
|
11
11
|
import { buildEvaluationRequest, createFailedJob, createEvaluationRun, createQueuedJob, createSucceededJob, finalizeEvaluationRun, markJobRunning, failEvaluationRun, } from '../eval-core/evaluation-job.js';
|
|
12
|
-
async function initializeEvaluationRunState({ samplesPath, skillDir, artifacts, model, judgeModel, noJudge, executorName, judgeExecutorName, concurrency, timeoutMs, noCache, blind, project, owner, tags, runId, jobStore, persistJob, }) {
|
|
12
|
+
async function initializeEvaluationRunState({ samplesPath, skillDir, artifacts, model, judgeModel, noJudge, executorName, judgeExecutorName, concurrency, timeoutMs, noCache, blind, project, owner, tags, runId, jobStore, persistJob, repeat, each, judgeRepeat, judgeModels, bootstrap, bootstrapSamples, lengthDebias, budget, }) {
|
|
13
13
|
const request = buildEvaluationRequest({
|
|
14
14
|
samplesPath,
|
|
15
15
|
skillDir,
|
|
@@ -27,6 +27,14 @@ async function initializeEvaluationRunState({ samplesPath, skillDir, artifacts,
|
|
|
27
27
|
project,
|
|
28
28
|
owner,
|
|
29
29
|
tags,
|
|
30
|
+
repeat,
|
|
31
|
+
each,
|
|
32
|
+
judgeRepeat,
|
|
33
|
+
judgeModels,
|
|
34
|
+
bootstrap,
|
|
35
|
+
bootstrapSamples,
|
|
36
|
+
lengthDebias,
|
|
37
|
+
budget,
|
|
30
38
|
});
|
|
31
39
|
const createdAt = new Date().toISOString();
|
|
32
40
|
const { run: initialRun, startedAt } = createEvaluationRun(runId, createdAt);
|
|
@@ -118,7 +126,7 @@ function finalizeEvaluationReport({ report, results, artifacts, variantNames, bl
|
|
|
118
126
|
}
|
|
119
127
|
return report;
|
|
120
128
|
}
|
|
121
|
-
export async function executeEvaluationPipeline({ samplesPath, skillDir, samples, tasks, artifacts, model, judgeModel, noJudge, executorName, judgeExecutorName, executor, judgeExecutor, outputDir = DEFAULT_OUTPUT_DIR, project, owner, tags, blind = false, concurrency = 1, timeoutMs, noCache = false, jobStore = null, persistJob = true, onProgress = null, skipPreflight = false, verbose = false, retry = 0, existingResults, requires, layeredStats = false, }) {
|
|
129
|
+
export async function executeEvaluationPipeline({ samplesPath, skillDir, samples, tasks, artifacts, model, judgeModel, noJudge, executorName, judgeExecutorName, executor, judgeExecutor, outputDir = DEFAULT_OUTPUT_DIR, project, owner, tags, blind = false, concurrency = 1, timeoutMs, noCache = false, jobStore = null, persistJob = true, onProgress = null, skipPreflight = false, verbose = false, retry = 0, existingResults, requires, layeredStats = false, repeat, each, judgeRepeat, judgeModels, bootstrap, bootstrapSamples, lengthDebias = true, budget, }) {
|
|
122
130
|
const variantNames = artifacts.map((artifact) => artifact.name);
|
|
123
131
|
const runState = await initializeEvaluationRunState({
|
|
124
132
|
samplesPath,
|
|
@@ -139,6 +147,14 @@ export async function executeEvaluationPipeline({ samplesPath, skillDir, samples
|
|
|
139
147
|
runId: generateRunId(variantNames),
|
|
140
148
|
jobStore,
|
|
141
149
|
persistJob,
|
|
150
|
+
repeat,
|
|
151
|
+
each,
|
|
152
|
+
judgeRepeat,
|
|
153
|
+
judgeModels,
|
|
154
|
+
bootstrap,
|
|
155
|
+
bootstrapSamples,
|
|
156
|
+
lengthDebias,
|
|
157
|
+
budget,
|
|
142
158
|
});
|
|
143
159
|
try {
|
|
144
160
|
if (!skipPreflight) {
|
|
@@ -155,7 +171,22 @@ export async function executeEvaluationPipeline({ samplesPath, skillDir, samples
|
|
|
155
171
|
throw new Error(formatDependencyErrors(depResult.missing));
|
|
156
172
|
}
|
|
157
173
|
}
|
|
158
|
-
|
|
174
|
+
// Pre-build a per-executor map for ensemble judges. Each unique executor name
|
|
175
|
+
// gets one ExecutorFn, shared across all judges using that executor. The default
|
|
176
|
+
// judge's executor is also included so single-judge fallbacks have it available.
|
|
177
|
+
let judgeExecutors;
|
|
178
|
+
if (judgeModels && judgeModels.length >= 2) {
|
|
179
|
+
const { createExecutor } = await import('../executors/index.js');
|
|
180
|
+
judgeExecutors = {};
|
|
181
|
+
const seen = new Set();
|
|
182
|
+
for (const jc of judgeModels) {
|
|
183
|
+
if (!seen.has(jc.executor)) {
|
|
184
|
+
seen.add(jc.executor);
|
|
185
|
+
judgeExecutors[jc.executor] = createExecutor(jc.executor);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
const { results, totalCostUSD, skipped, budgetExhausted } = await executeTasks({
|
|
159
190
|
tasks,
|
|
160
191
|
executor,
|
|
161
192
|
judgeExecutor,
|
|
@@ -170,6 +201,11 @@ export async function executeEvaluationPipeline({ samplesPath, skillDir, samples
|
|
|
170
201
|
onProgress,
|
|
171
202
|
retry,
|
|
172
203
|
existingResults,
|
|
204
|
+
judgeRepeat,
|
|
205
|
+
judgeModels,
|
|
206
|
+
judgeExecutors,
|
|
207
|
+
lengthDebias,
|
|
208
|
+
budget,
|
|
173
209
|
});
|
|
174
210
|
if (skipped > 0 && onProgress) {
|
|
175
211
|
onProgress({ phase: 'done', completed: tasks.length, total: tasks.length, sample_id: '', variant: '', skipped: true });
|
|
@@ -199,6 +235,12 @@ export async function executeEvaluationPipeline({ samplesPath, skillDir, samples
|
|
|
199
235
|
blind,
|
|
200
236
|
samplesPath,
|
|
201
237
|
});
|
|
238
|
+
if (budgetExhausted) {
|
|
239
|
+
report.meta.budgetExhausted = true;
|
|
240
|
+
}
|
|
241
|
+
if (budget) {
|
|
242
|
+
report.meta.budget = budget;
|
|
243
|
+
}
|
|
202
244
|
const filePath = persistReport(report, outputDir);
|
|
203
245
|
await persistSuccessfulJob(runState, job);
|
|
204
246
|
return { report, filePath };
|