@miller-tech/uap 1.50.1 → 1.52.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/dist/.tsbuildinfo +1 -1
- package/dist/benchmarks/paired/ablation.d.ts +36 -0
- package/dist/benchmarks/paired/ablation.d.ts.map +1 -0
- package/dist/benchmarks/paired/ablation.js +96 -0
- package/dist/benchmarks/paired/ablation.js.map +1 -0
- package/dist/benchmarks/paired/adapter.d.ts +95 -0
- package/dist/benchmarks/paired/adapter.d.ts.map +1 -0
- package/dist/benchmarks/paired/adapter.js +456 -0
- package/dist/benchmarks/paired/adapter.js.map +1 -0
- package/dist/benchmarks/paired/index.d.ts +17 -0
- package/dist/benchmarks/paired/index.d.ts.map +1 -0
- package/dist/benchmarks/paired/index.js +17 -0
- package/dist/benchmarks/paired/index.js.map +1 -0
- package/dist/benchmarks/paired/report.d.ts +61 -0
- package/dist/benchmarks/paired/report.d.ts.map +1 -0
- package/dist/benchmarks/paired/report.js +204 -0
- package/dist/benchmarks/paired/report.js.map +1 -0
- package/dist/benchmarks/paired/runner.d.ts +25 -0
- package/dist/benchmarks/paired/runner.d.ts.map +1 -0
- package/dist/benchmarks/paired/runner.js +125 -0
- package/dist/benchmarks/paired/runner.js.map +1 -0
- package/dist/benchmarks/paired/scaffold.d.ts +28 -0
- package/dist/benchmarks/paired/scaffold.d.ts.map +1 -0
- package/dist/benchmarks/paired/scaffold.js +74 -0
- package/dist/benchmarks/paired/scaffold.js.map +1 -0
- package/dist/benchmarks/paired/stats.d.ts +68 -0
- package/dist/benchmarks/paired/stats.d.ts.map +1 -0
- package/dist/benchmarks/paired/stats.js +182 -0
- package/dist/benchmarks/paired/stats.js.map +1 -0
- package/dist/benchmarks/paired/suite.d.ts +43 -0
- package/dist/benchmarks/paired/suite.d.ts.map +1 -0
- package/dist/benchmarks/paired/suite.js +117 -0
- package/dist/benchmarks/paired/suite.js.map +1 -0
- package/dist/benchmarks/paired/types.d.ts +195 -0
- package/dist/benchmarks/paired/types.d.ts.map +1 -0
- package/dist/benchmarks/paired/types.js +111 -0
- package/dist/benchmarks/paired/types.js.map +1 -0
- package/dist/bin/cli.js +22 -0
- package/dist/bin/cli.js.map +1 -1
- package/dist/cli/bench.d.ts +21 -0
- package/dist/cli/bench.d.ts.map +1 -0
- package/dist/cli/bench.js +94 -0
- package/dist/cli/bench.js.map +1 -0
- package/dist/cli/hooks.d.ts.map +1 -1
- package/dist/cli/hooks.js +4 -0
- package/dist/cli/hooks.js.map +1 -1
- package/docs/benchmarks/PAIRED_HARNESS.md +112 -0
- package/docs/benchmarks/README.md +1 -0
- package/package.json +1 -1
- package/src/policies/enforcers/__pycache__/_common.cpython-312.pyc +0 -0
- package/templates/hooks/coordinate-file.sh +94 -0
- package/templates/hooks/pre-tool-use-edit-write.sh +36 -1
- package/templates/hooks/session-end.sh +29 -6
- package/templates/hooks/session-start.sh +17 -1
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analysis + reporting.
|
|
3
|
+
*
|
|
4
|
+
* Turns raw paired RunRecords into the credible result shape the research
|
|
5
|
+
* prescribes: NOT a single headline number, but a vector of paired deltas with
|
|
6
|
+
* confidence intervals (accuracy AND efficiency), a McNemar 2x2 for gate value,
|
|
7
|
+
* and a cost-accuracy Pareto view. Treatment arms are always compared against
|
|
8
|
+
* the baseline cell-for-cell (same task + seed).
|
|
9
|
+
*/
|
|
10
|
+
import { mcnemar, mean, pairedDelta, } from './stats.js';
|
|
11
|
+
import { CONTINUOUS_METRICS } from './types.js';
|
|
12
|
+
function cellKey(r) {
|
|
13
|
+
return `${r.taskId}#${r.seed}`;
|
|
14
|
+
}
|
|
15
|
+
function byCondition(records) {
|
|
16
|
+
const m = new Map();
|
|
17
|
+
for (const r of records) {
|
|
18
|
+
const arr = m.get(r.condition) ?? [];
|
|
19
|
+
arr.push(r);
|
|
20
|
+
m.set(r.condition, arr);
|
|
21
|
+
}
|
|
22
|
+
return m;
|
|
23
|
+
}
|
|
24
|
+
function summarize(label, recs) {
|
|
25
|
+
const correct = recs.map((r) => (r.metrics.correct ? 1 : 0));
|
|
26
|
+
const numeric = (sel) => {
|
|
27
|
+
const vals = recs.map((r) => sel(r.metrics)).filter((v) => v != null);
|
|
28
|
+
return vals.length ? mean(vals) : null;
|
|
29
|
+
};
|
|
30
|
+
return {
|
|
31
|
+
label,
|
|
32
|
+
n: recs.length,
|
|
33
|
+
successRate: recs.length ? mean(correct) : NaN,
|
|
34
|
+
meanTokens: numeric((m) => m.tokens),
|
|
35
|
+
meanTurns: numeric((m) => m.turns),
|
|
36
|
+
meanCostUsd: numeric((m) => m.costUsd),
|
|
37
|
+
meanLatencyMs: numeric((m) => m.latencyMs) ?? NaN,
|
|
38
|
+
errorRate: recs.length ? mean(recs.map((r) => (r.metrics.error ? 1 : 0))) : NaN,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/** Build the paired delta arrays between a treatment and baseline cell map. */
|
|
42
|
+
function pairCells(baseline, treatment) {
|
|
43
|
+
const keys = [];
|
|
44
|
+
const base = [];
|
|
45
|
+
const treat = [];
|
|
46
|
+
for (const [k, b] of baseline) {
|
|
47
|
+
const t = treatment.get(k);
|
|
48
|
+
if (t) {
|
|
49
|
+
keys.push(k);
|
|
50
|
+
base.push(b);
|
|
51
|
+
treat.push(t);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return { keys, base, treat };
|
|
55
|
+
}
|
|
56
|
+
function toCellMap(recs) {
|
|
57
|
+
const m = new Map();
|
|
58
|
+
for (const r of recs)
|
|
59
|
+
m.set(cellKey(r), r);
|
|
60
|
+
return m;
|
|
61
|
+
}
|
|
62
|
+
export function analyze(output, opts = {}) {
|
|
63
|
+
const baselineLabel = opts.baselineLabel ?? 'baseline';
|
|
64
|
+
const grouped = byCondition(output.records);
|
|
65
|
+
const conditions = [...grouped.keys()];
|
|
66
|
+
if (!grouped.has(baselineLabel)) {
|
|
67
|
+
throw new Error(`analyze: baseline condition '${baselineLabel}' not present (have: ${conditions.join(', ')})`);
|
|
68
|
+
}
|
|
69
|
+
const perCondition = conditions.map((label) => summarize(label, grouped.get(label)));
|
|
70
|
+
const baseMap = toCellMap(grouped.get(baselineLabel));
|
|
71
|
+
const taskCount = new Set(output.records.map((r) => r.taskId)).size;
|
|
72
|
+
const comparisons = [];
|
|
73
|
+
for (const label of conditions) {
|
|
74
|
+
if (label === baselineLabel)
|
|
75
|
+
continue;
|
|
76
|
+
const treatMap = toCellMap(grouped.get(label));
|
|
77
|
+
const { base, treat } = pairCells(baseMap, treatMap);
|
|
78
|
+
// Correctness: paired binary deltas (+1 fixed, -1 regressed, 0 same).
|
|
79
|
+
const correctnessDeltas = base.map((b, i) => num(treat[i].metrics.correct) - num(b.metrics.correct));
|
|
80
|
+
const delta = pairedDelta(correctnessDeltas, opts);
|
|
81
|
+
const mc = mcnemar(treat.map((t) => t.metrics.correct), base.map((b) => b.metrics.correct));
|
|
82
|
+
// Continuous metrics: paired deltas where BOTH arms reported the value.
|
|
83
|
+
const metrics = {};
|
|
84
|
+
for (const metric of CONTINUOUS_METRICS) {
|
|
85
|
+
const deltas = [];
|
|
86
|
+
for (let i = 0; i < base.length; i++) {
|
|
87
|
+
const bv = base[i].metrics[metric];
|
|
88
|
+
const tv = treat[i].metrics[metric];
|
|
89
|
+
if (bv != null && tv != null)
|
|
90
|
+
deltas.push(tv - bv);
|
|
91
|
+
}
|
|
92
|
+
if (deltas.length > 0)
|
|
93
|
+
metrics[metric] = pairedDelta(deltas, opts);
|
|
94
|
+
}
|
|
95
|
+
comparisons.push({
|
|
96
|
+
label,
|
|
97
|
+
baseline: baselineLabel,
|
|
98
|
+
correctness: {
|
|
99
|
+
baselineRate: mean(base.map((b) => num(b.metrics.correct))),
|
|
100
|
+
treatmentRate: mean(treat.map((t) => num(t.metrics.correct))),
|
|
101
|
+
delta,
|
|
102
|
+
mcnemar: mc,
|
|
103
|
+
},
|
|
104
|
+
metrics,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
meta: {
|
|
109
|
+
model: output.model,
|
|
110
|
+
adapter: output.adapter,
|
|
111
|
+
epochs: output.epochs,
|
|
112
|
+
taskCount,
|
|
113
|
+
conditions,
|
|
114
|
+
baseline: baselineLabel,
|
|
115
|
+
startedAt: output.startedAt,
|
|
116
|
+
finishedAt: output.finishedAt,
|
|
117
|
+
},
|
|
118
|
+
perCondition,
|
|
119
|
+
comparisons,
|
|
120
|
+
pareto: perCondition.map((c) => ({
|
|
121
|
+
label: c.label,
|
|
122
|
+
successRate: c.successRate,
|
|
123
|
+
meanTokens: c.meanTokens,
|
|
124
|
+
})),
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
function num(b) {
|
|
128
|
+
return b ? 1 : 0;
|
|
129
|
+
}
|
|
130
|
+
// ---------------------------------------------------------------------------
|
|
131
|
+
// Markdown renderer
|
|
132
|
+
// ---------------------------------------------------------------------------
|
|
133
|
+
function pct(x) {
|
|
134
|
+
return Number.isFinite(x) ? `${(x * 100).toFixed(1)}%` : 'n/a';
|
|
135
|
+
}
|
|
136
|
+
function fixed(x, d = 0) {
|
|
137
|
+
return x == null || !Number.isFinite(x) ? 'n/a' : x.toFixed(d);
|
|
138
|
+
}
|
|
139
|
+
function ciStr(ci, d = 3) {
|
|
140
|
+
return `[${ci.lower.toFixed(d)}, ${ci.upper.toFixed(d)}]`;
|
|
141
|
+
}
|
|
142
|
+
function sig(p) {
|
|
143
|
+
return p.significant ? '✅' : '–';
|
|
144
|
+
}
|
|
145
|
+
export function renderMarkdown(r) {
|
|
146
|
+
const L = [];
|
|
147
|
+
L.push(`# UAP Paired Benchmark Report`);
|
|
148
|
+
L.push('');
|
|
149
|
+
L.push(`**Model:** ${r.meta.model} · **Adapter:** ${r.meta.adapter} · ` +
|
|
150
|
+
`**Tasks:** ${r.meta.taskCount} · **Epochs:** ${r.meta.epochs} · ` +
|
|
151
|
+
`**Baseline:** \`${r.meta.baseline}\``);
|
|
152
|
+
L.push(`*${r.meta.startedAt} → ${r.meta.finishedAt}*`);
|
|
153
|
+
L.push('');
|
|
154
|
+
L.push(`## Per-condition summary`);
|
|
155
|
+
L.push('');
|
|
156
|
+
L.push(`| Condition | n | Success | Tokens | Turns | Cost $ | Latency ms | Err |`);
|
|
157
|
+
L.push(`|---|--:|--:|--:|--:|--:|--:|--:|`);
|
|
158
|
+
for (const c of r.perCondition) {
|
|
159
|
+
L.push(`| \`${c.label}\` | ${c.n} | ${pct(c.successRate)} | ${fixed(c.meanTokens)} | ` +
|
|
160
|
+
`${fixed(c.meanTurns, 1)} | ${fixed(c.meanCostUsd, 4)} | ${fixed(c.meanLatencyMs)} | ${pct(c.errorRate)} |`);
|
|
161
|
+
}
|
|
162
|
+
L.push('');
|
|
163
|
+
L.push(`## Paired comparisons vs \`${r.meta.baseline}\``);
|
|
164
|
+
L.push('');
|
|
165
|
+
for (const cmp of r.comparisons) {
|
|
166
|
+
L.push(`### \`${cmp.label}\``);
|
|
167
|
+
L.push('');
|
|
168
|
+
const cd = cmp.correctness;
|
|
169
|
+
L.push(`**Correctness:** ${pct(cd.baselineRate)} → ${pct(cd.treatmentRate)} ` +
|
|
170
|
+
`(Δ ${(cd.delta.meanDelta * 100).toFixed(1)}pp, 95% CI ${ciStr(cd.delta.ci)}, ` +
|
|
171
|
+
`p=${cd.delta.pValue.toFixed(3)}) ${sig(cd.delta)}`);
|
|
172
|
+
const m = cd.mcnemar;
|
|
173
|
+
L.push('');
|
|
174
|
+
L.push(`**Gate value (McNemar 2×2):** fixed ${m.onlyTreatment}, regressed ${m.onlyBaseline}, ` +
|
|
175
|
+
`net ${m.netGain >= 0 ? '+' : ''}${m.netGain} (p=${m.pValue.toFixed(3)}); ` +
|
|
176
|
+
`both✓ ${m.bothCorrect}, both✗ ${m.bothWrong}`);
|
|
177
|
+
L.push('');
|
|
178
|
+
L.push(`| Metric | Δ mean | 95% CI | p | sig |`);
|
|
179
|
+
L.push(`|---|--:|--:|--:|:-:|`);
|
|
180
|
+
for (const metric of CONTINUOUS_METRICS) {
|
|
181
|
+
const pd = cmp.metrics[metric];
|
|
182
|
+
if (!pd)
|
|
183
|
+
continue;
|
|
184
|
+
const d = metric === 'costUsd' ? 4 : 1;
|
|
185
|
+
L.push(`| ${metric} | ${pd.meanDelta.toFixed(d)} | ${ciStr(pd.ci, d)} | ` +
|
|
186
|
+
`${pd.pValue.toFixed(3)} | ${sig(pd)} |`);
|
|
187
|
+
}
|
|
188
|
+
L.push('');
|
|
189
|
+
}
|
|
190
|
+
L.push(`## Cost–accuracy Pareto`);
|
|
191
|
+
L.push('');
|
|
192
|
+
L.push(`| Condition | Success | Mean tokens |`);
|
|
193
|
+
L.push(`|---|--:|--:|`);
|
|
194
|
+
for (const p of [...r.pareto].sort((a, b) => b.successRate - a.successRate)) {
|
|
195
|
+
L.push(`| \`${p.label}\` | ${pct(p.successRate)} | ${fixed(p.meanTokens)} |`);
|
|
196
|
+
}
|
|
197
|
+
L.push('');
|
|
198
|
+
L.push(`> Interpretation: a credible UAP win is a **positive net gate value** and ` +
|
|
199
|
+
`**non-inferior success** at **lower tokens/turns** — or higher success at acceptable cost. ` +
|
|
200
|
+
`Single-arm point estimates without overlapping-zero CIs are not claims.`);
|
|
201
|
+
L.push('');
|
|
202
|
+
return L.join('\n');
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/benchmarks/paired/report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Paired runner — the experiment engine.
|
|
3
|
+
*
|
|
4
|
+
* For every (task, condition, seed) cell it: materializes a fresh isolated copy
|
|
5
|
+
* of the task's failing repo, runs optional setup, drives the agent adapter
|
|
6
|
+
* (which injects the UAP surface for non-baseline arms), then applies the
|
|
7
|
+
* deterministic verify command to score correctness. The SAME seed is used for
|
|
8
|
+
* the same task across all conditions, so records pair up cell-for-cell — the
|
|
9
|
+
* key to the paired statistics in ./stats.ts.
|
|
10
|
+
*/
|
|
11
|
+
import { RunRecord, RunnerConfig } from './types.js';
|
|
12
|
+
export interface RunnerOutput {
|
|
13
|
+
records: RunRecord[];
|
|
14
|
+
model: string;
|
|
15
|
+
adapter: string;
|
|
16
|
+
epochs: number;
|
|
17
|
+
startedAt: string;
|
|
18
|
+
finishedAt: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Execute the full (tasks × conditions × epochs) grid.
|
|
22
|
+
* `suiteDir` is required so the runner can locate each task's fixture repo.
|
|
23
|
+
*/
|
|
24
|
+
export declare function runPaired(cfg: RunnerConfig, suiteDir: string, startedAtIso: string): Promise<RunnerOutput>;
|
|
25
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/benchmarks/paired/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAAgB,SAAS,EAAE,YAAY,EAAuB,MAAM,YAAY,CAAC;AAQxF,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,GAAG,EAAE,YAAY,EACjB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,YAAY,CAAC,CAgCvB"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Paired runner — the experiment engine.
|
|
3
|
+
*
|
|
4
|
+
* For every (task, condition, seed) cell it: materializes a fresh isolated copy
|
|
5
|
+
* of the task's failing repo, runs optional setup, drives the agent adapter
|
|
6
|
+
* (which injects the UAP surface for non-baseline arms), then applies the
|
|
7
|
+
* deterministic verify command to score correctness. The SAME seed is used for
|
|
8
|
+
* the same task across all conditions, so records pair up cell-for-cell — the
|
|
9
|
+
* key to the paired statistics in ./stats.ts.
|
|
10
|
+
*/
|
|
11
|
+
import { concurrentMap } from '../../utils/concurrency-pool.js';
|
|
12
|
+
import { materializeWorkdir, runSetup, runVerify } from './suite.js';
|
|
13
|
+
/**
|
|
14
|
+
* Execute the full (tasks × conditions × epochs) grid.
|
|
15
|
+
* `suiteDir` is required so the runner can locate each task's fixture repo.
|
|
16
|
+
*/
|
|
17
|
+
export async function runPaired(cfg, suiteDir, startedAtIso) {
|
|
18
|
+
const cells = [];
|
|
19
|
+
for (const task of cfg.tasks) {
|
|
20
|
+
for (let seed = 0; seed < cfg.epochs; seed++) {
|
|
21
|
+
for (const condition of cfg.conditions) {
|
|
22
|
+
cells.push({ task, condition, seed });
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
let done = 0;
|
|
27
|
+
const total = cells.length;
|
|
28
|
+
const records = await concurrentMap(cells, async (cell) => {
|
|
29
|
+
const rec = await executeCell(cell, cfg, suiteDir);
|
|
30
|
+
done++;
|
|
31
|
+
cfg.onProgress?.(done, total, `${cell.task.id}/${cell.condition.label}#${cell.seed}`);
|
|
32
|
+
return rec;
|
|
33
|
+
}, { maxConcurrent: cfg.concurrency, mode: 'cpu' });
|
|
34
|
+
return {
|
|
35
|
+
records,
|
|
36
|
+
model: cfg.model,
|
|
37
|
+
adapter: cfg.adapter.id,
|
|
38
|
+
epochs: cfg.epochs,
|
|
39
|
+
startedAt: startedAtIso,
|
|
40
|
+
finishedAt: nowIso(),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
async function executeCell(cell, cfg, suiteDir) {
|
|
44
|
+
const { task, condition, seed } = cell;
|
|
45
|
+
const t0 = Date.now();
|
|
46
|
+
const baseMetrics = () => ({
|
|
47
|
+
correct: false,
|
|
48
|
+
tokens: null,
|
|
49
|
+
costUsd: null,
|
|
50
|
+
turns: null,
|
|
51
|
+
toolCalls: null,
|
|
52
|
+
latencyMs: Date.now() - t0,
|
|
53
|
+
wellFormed: null,
|
|
54
|
+
error: null,
|
|
55
|
+
});
|
|
56
|
+
let workdir;
|
|
57
|
+
try {
|
|
58
|
+
workdir = materializeWorkdir(suiteDir, task, cfg.workRoot);
|
|
59
|
+
}
|
|
60
|
+
catch (e) {
|
|
61
|
+
return record(cell, cfg, { ...baseMetrics(), error: `materialize failed: ${errMsg(e)}` });
|
|
62
|
+
}
|
|
63
|
+
// Optional setup; a failed setup means the cell can't be scored fairly.
|
|
64
|
+
try {
|
|
65
|
+
const setup = runSetup(task, workdir);
|
|
66
|
+
if (setup && !setup.passed) {
|
|
67
|
+
return record(cell, cfg, {
|
|
68
|
+
...baseMetrics(),
|
|
69
|
+
error: `setup failed (exit ${setup.exitCode})`,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
return record(cell, cfg, { ...baseMetrics(), error: `setup error: ${errMsg(e)}` });
|
|
75
|
+
}
|
|
76
|
+
// Drive the agent (adapters capture their own failures in `error`).
|
|
77
|
+
let agent;
|
|
78
|
+
try {
|
|
79
|
+
agent = await cfg.adapter.run({ task, condition, workdir, seed, model: cfg.model });
|
|
80
|
+
}
|
|
81
|
+
catch (e) {
|
|
82
|
+
return record(cell, cfg, { ...baseMetrics(), error: `adapter threw: ${errMsg(e)}` });
|
|
83
|
+
}
|
|
84
|
+
// Score with the deterministic ground-truth verify command.
|
|
85
|
+
let correct = false;
|
|
86
|
+
let verifyErr = agent.error;
|
|
87
|
+
try {
|
|
88
|
+
const v = runVerify(task, workdir);
|
|
89
|
+
correct = v.passed;
|
|
90
|
+
if (!correct && !verifyErr) {
|
|
91
|
+
verifyErr = v.timedOut ? 'verify timed out' : `verify failed (exit ${v.exitCode})`;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch (e) {
|
|
95
|
+
verifyErr = `verify error: ${errMsg(e)}`;
|
|
96
|
+
}
|
|
97
|
+
const metrics = {
|
|
98
|
+
correct,
|
|
99
|
+
tokens: agent.tokens,
|
|
100
|
+
costUsd: agent.costUsd,
|
|
101
|
+
turns: agent.turns,
|
|
102
|
+
toolCalls: agent.toolCalls,
|
|
103
|
+
latencyMs: Date.now() - t0,
|
|
104
|
+
wellFormed: agent.wellFormed,
|
|
105
|
+
error: verifyErr,
|
|
106
|
+
};
|
|
107
|
+
return record(cell, cfg, metrics);
|
|
108
|
+
}
|
|
109
|
+
function record(cell, cfg, metrics) {
|
|
110
|
+
return {
|
|
111
|
+
taskId: cell.task.id,
|
|
112
|
+
condition: cell.condition.label,
|
|
113
|
+
seed: cell.seed,
|
|
114
|
+
metrics,
|
|
115
|
+
adapter: cfg.adapter.id,
|
|
116
|
+
model: cfg.model,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
function errMsg(e) {
|
|
120
|
+
return e instanceof Error ? e.message : String(e);
|
|
121
|
+
}
|
|
122
|
+
function nowIso() {
|
|
123
|
+
return new Date().toISOString();
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../src/benchmarks/paired/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAkBrE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,GAAiB,EACjB,QAAgB,EAChB,YAAoB;IAEpB,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAC7B,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;YAC7C,KAAK,MAAM,SAAS,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;gBACvC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;IAE3B,MAAM,OAAO,GAAG,MAAM,aAAa,CACjC,KAAK,EACL,KAAK,EAAE,IAAI,EAAsB,EAAE;QACjC,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;QACnD,IAAI,EAAE,CAAC;QACP,GAAG,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACtF,OAAO,GAAG,CAAC;IACb,CAAC,EACD,EAAE,aAAa,EAAE,GAAG,CAAC,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,CAChD,CAAC;IAEF,OAAO;QACL,OAAO;QACP,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE;QACvB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,SAAS,EAAE,YAAY;QACvB,UAAU,EAAE,MAAM,EAAE;KACrB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAAU,EAAE,GAAiB,EAAE,QAAgB;IACxE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IACvC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEtB,MAAM,WAAW,GAAG,GAAiB,EAAE,CAAC,CAAC;QACvC,OAAO,EAAE,KAAK;QACd,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,IAAI;QACX,SAAS,EAAE,IAAI;QACf,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE;QAC1B,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,IAAI;KACZ,CAAC,CAAC;IAEH,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,kBAAkB,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,GAAG,WAAW,EAAE,EAAE,KAAK,EAAE,uBAAuB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,wEAAwE;IACxE,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACtC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAC3B,OAAO,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;gBACvB,GAAG,WAAW,EAAE;gBAChB,KAAK,EAAE,sBAAsB,KAAK,CAAC,QAAQ,GAAG;aAC/C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,GAAG,WAAW,EAAE,EAAE,KAAK,EAAE,gBAAgB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACrF,CAAC;IAED,oEAAoE;IACpE,IAAI,KAAK,CAAC;IACV,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;IACtF,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,GAAG,WAAW,EAAE,EAAE,KAAK,EAAE,kBAAkB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,4DAA4D;IAC5D,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,SAAS,GAAkB,KAAK,CAAC,KAAK,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACnC,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC;QACnB,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;YAC3B,SAAS,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,QAAQ,GAAG,CAAC;QACrF,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,SAAS,GAAG,iBAAiB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3C,CAAC;IAED,MAAM,OAAO,GAAiB;QAC5B,OAAO;QACP,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE;QAC1B,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,KAAK,EAAE,SAAS;KACjB,CAAC;IACF,OAAO,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,MAAM,CAAC,IAAU,EAAE,GAAiB,EAAE,OAAqB;IAClE,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE;QACpB,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK;QAC/B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,OAAO;QACP,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE;QACvB,KAAK,EAAE,GAAG,CAAC,KAAK;KACjB,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CAAC,CAAU;IACxB,OAAO,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,MAAM;IACb,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UAP scaffolding injection — the actual on/off mechanism for the A/B.
|
|
3
|
+
*
|
|
4
|
+
* A controlled experiment must change exactly ONE thing between arms: the
|
|
5
|
+
* presence of the UAP layer. For a real coding agent, "UAP" is the instruction
|
|
6
|
+
* surface + component config the agent's installed hooks consume. This module
|
|
7
|
+
* writes that surface into the scratch repo for the enabled components, and
|
|
8
|
+
* nothing for the baseline. Everything else (model, prompt, repo state, seed)
|
|
9
|
+
* is held identical by the runner.
|
|
10
|
+
*
|
|
11
|
+
* The injected files are deliberately plain-text and inspectable so a reviewer
|
|
12
|
+
* can audit precisely what the "treatment" was (HAL-style log/scaffold audit),
|
|
13
|
+
* pre-empting the "asymmetric prompt" critique that sank prior memory-layer
|
|
14
|
+
* benchmarks.
|
|
15
|
+
*/
|
|
16
|
+
import { Condition, UapComponent } from './types.js';
|
|
17
|
+
export interface ScaffoldManifest {
|
|
18
|
+
components: UapComponent[];
|
|
19
|
+
injectedFiles: string[];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Write the UAP instruction surface for `condition` into `workdir`.
|
|
23
|
+
* Returns a manifest of what was injected (empty for the baseline).
|
|
24
|
+
*/
|
|
25
|
+
export declare function applyScaffolding(workdir: string, condition: Condition): ScaffoldManifest;
|
|
26
|
+
/** Environment variables exported to the agent describing the active condition. */
|
|
27
|
+
export declare function scaffoldEnv(condition: Condition): NodeJS.ProcessEnv;
|
|
28
|
+
//# sourceMappingURL=scaffold.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../../src/benchmarks/paired/scaffold.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,OAAO,EAAE,SAAS,EAAkB,YAAY,EAAE,MAAM,YAAY,CAAC;AAyBrE,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,gBAAgB,CA6BxF;AAED,mFAAmF;AACnF,wBAAgB,WAAW,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAAC,UAAU,CAQnE"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UAP scaffolding injection — the actual on/off mechanism for the A/B.
|
|
3
|
+
*
|
|
4
|
+
* A controlled experiment must change exactly ONE thing between arms: the
|
|
5
|
+
* presence of the UAP layer. For a real coding agent, "UAP" is the instruction
|
|
6
|
+
* surface + component config the agent's installed hooks consume. This module
|
|
7
|
+
* writes that surface into the scratch repo for the enabled components, and
|
|
8
|
+
* nothing for the baseline. Everything else (model, prompt, repo state, seed)
|
|
9
|
+
* is held identical by the runner.
|
|
10
|
+
*
|
|
11
|
+
* The injected files are deliberately plain-text and inspectable so a reviewer
|
|
12
|
+
* can audit precisely what the "treatment" was (HAL-style log/scaffold audit),
|
|
13
|
+
* pre-empting the "asymmetric prompt" critique that sank prior memory-layer
|
|
14
|
+
* benchmarks.
|
|
15
|
+
*/
|
|
16
|
+
import { writeFileSync } from 'fs';
|
|
17
|
+
import { join } from 'path';
|
|
18
|
+
import { UAP_COMPONENTS } from './types.js';
|
|
19
|
+
/** Human-readable instruction block injected per enabled component. */
|
|
20
|
+
const COMPONENT_INSTRUCTIONS = {
|
|
21
|
+
gates: '## Completion Gates\nBefore claiming the task is done, you MUST run the build, ' +
|
|
22
|
+
'the test suite, and the linter, and confirm all pass. Do not stop while any ' +
|
|
23
|
+
'gate is failing. Re-verify at least once after your final edit.',
|
|
24
|
+
worktree: '## Isolation\nMake all edits within this repository only. Do not touch files ' +
|
|
25
|
+
'outside the working directory. Keep changes scoped and atomic.',
|
|
26
|
+
memory: '## Memory\nRelevant prior context and learned patterns for this repository are ' +
|
|
27
|
+
'available. Consult them before editing and prefer established patterns over ad-hoc ones.',
|
|
28
|
+
experts: '## Expert Routing\nFor specialized sub-problems (security, performance, tests), ' +
|
|
29
|
+
'apply the matching expert discipline and review the change against its checklist.',
|
|
30
|
+
skills: '## Skills\nWhen a domain-specific workflow matches the task, follow its ' +
|
|
31
|
+
'structured procedure rather than improvising.',
|
|
32
|
+
patterns: '## Patterns\nMatch the task to a known execution pattern; in particular always ' +
|
|
33
|
+
'verify the produced output actually exists and the decoder/contract is satisfied.',
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Write the UAP instruction surface for `condition` into `workdir`.
|
|
37
|
+
* Returns a manifest of what was injected (empty for the baseline).
|
|
38
|
+
*/
|
|
39
|
+
export function applyScaffolding(workdir, condition) {
|
|
40
|
+
const enabled = UAP_COMPONENTS.filter((c) => condition.components.has(c));
|
|
41
|
+
if (enabled.length === 0) {
|
|
42
|
+
return { components: [], injectedFiles: [] };
|
|
43
|
+
}
|
|
44
|
+
const injectedFiles = [];
|
|
45
|
+
// AGENTS.md is the cross-agent instruction file (Claude, opencode, Codex, etc.
|
|
46
|
+
// all read it). This is the primary, honest treatment surface.
|
|
47
|
+
const header = '# UAP Operating Protocol\n\n' +
|
|
48
|
+
'The following protocol is active for this task. Follow it precisely.\n';
|
|
49
|
+
const body = enabled.map((c) => COMPONENT_INSTRUCTIONS[c]).join('\n\n');
|
|
50
|
+
const agentsMd = `${header}\n${body}\n`;
|
|
51
|
+
writeFileSync(join(workdir, 'AGENTS.md'), agentsMd, 'utf-8');
|
|
52
|
+
injectedFiles.push('AGENTS.md');
|
|
53
|
+
// Machine-readable manifest that installed UAP hooks can consume to enable the
|
|
54
|
+
// corresponding enforcement (gates/memory/reactor) at runtime.
|
|
55
|
+
const manifest = {
|
|
56
|
+
enabled,
|
|
57
|
+
condition: condition.label,
|
|
58
|
+
generatedBy: 'uap-paired-bench',
|
|
59
|
+
};
|
|
60
|
+
writeFileSync(join(workdir, '.uap-bench.json'), JSON.stringify(manifest, null, 2), 'utf-8');
|
|
61
|
+
injectedFiles.push('.uap-bench.json');
|
|
62
|
+
return { components: enabled, injectedFiles };
|
|
63
|
+
}
|
|
64
|
+
/** Environment variables exported to the agent describing the active condition. */
|
|
65
|
+
export function scaffoldEnv(condition) {
|
|
66
|
+
const enabled = UAP_COMPONENTS.filter((c) => condition.components.has(c));
|
|
67
|
+
return {
|
|
68
|
+
UAP_BENCH_CONDITION: condition.label,
|
|
69
|
+
UAP_BENCH_COMPONENTS: enabled.join(','),
|
|
70
|
+
// Enable/disable the real delivery-enforcement surface to match the arm.
|
|
71
|
+
UAP_DELIVER_ACTIVE: enabled.includes('gates') ? '1' : '0',
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=scaffold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../../src/benchmarks/paired/scaffold.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAa,cAAc,EAAgB,MAAM,YAAY,CAAC;AAErE,uEAAuE;AACvE,MAAM,sBAAsB,GAAiC;IAC3D,KAAK,EACH,iFAAiF;QACjF,8EAA8E;QAC9E,iEAAiE;IACnE,QAAQ,EACN,+EAA+E;QAC/E,gEAAgE;IAClE,MAAM,EACJ,iFAAiF;QACjF,0FAA0F;IAC5F,OAAO,EACL,kFAAkF;QAClF,mFAAmF;IACrF,MAAM,EACJ,0EAA0E;QAC1E,+CAA+C;IACjD,QAAQ,EACN,iFAAiF;QACjF,mFAAmF;CACtF,CAAC;AAOF;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,SAAoB;IACpE,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC;IAC/C,CAAC;IAED,MAAM,aAAa,GAAa,EAAE,CAAC;IAEnC,+EAA+E;IAC/E,+DAA+D;IAC/D,MAAM,MAAM,GACV,8BAA8B;QAC9B,wEAAwE,CAAC;IAC3E,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxE,MAAM,QAAQ,GAAG,GAAG,MAAM,KAAK,IAAI,IAAI,CAAC;IACxC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC7D,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAEhC,+EAA+E;IAC/E,+DAA+D;IAC/D,MAAM,QAAQ,GAAG;QACf,OAAO;QACP,SAAS,EAAE,SAAS,CAAC,KAAK;QAC1B,WAAW,EAAE,kBAAkB;KAChC,CAAC;IACF,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC5F,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAEtC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;AAChD,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,WAAW,CAAC,SAAoB;IAC9C,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,OAAO;QACL,mBAAmB,EAAE,SAAS,CAAC,KAAK;QACpC,oBAAoB,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;QACvC,yEAAyE;QACzE,kBAAkB,EAAE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;KAC1D,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Paired-comparison statistics for the UAP benchmark.
|
|
3
|
+
*
|
|
4
|
+
* The research is explicit: agent evals are stochastic, so a point estimate is
|
|
5
|
+
* meaningless without a variance measure, and the *paired* design (same task &
|
|
6
|
+
* seed in both arms) is what gives statistical power — it removes between-task
|
|
7
|
+
* variance, the dominant noise source. This module implements:
|
|
8
|
+
*
|
|
9
|
+
* - mean / std / standard error
|
|
10
|
+
* - paired bootstrap confidence interval on a delta (percentile method)
|
|
11
|
+
* - paired permutation test (two-sided) for significance of a delta
|
|
12
|
+
* - McNemar contingency for paired binary outcomes (the gate-value 2x2)
|
|
13
|
+
* - pass@k reducer
|
|
14
|
+
*
|
|
15
|
+
* All randomized procedures take an explicit seed so reports are reproducible
|
|
16
|
+
* (the Mem0/Zep scandal lesson: single-run, non-reproducible numbers are the #1
|
|
17
|
+
* credibility red flag).
|
|
18
|
+
*/
|
|
19
|
+
export declare function mulberry32(seed: number): () => number;
|
|
20
|
+
export declare function mean(xs: number[]): number;
|
|
21
|
+
export declare function variance(xs: number[]): number;
|
|
22
|
+
export declare function std(xs: number[]): number;
|
|
23
|
+
export declare function stderr(xs: number[]): number;
|
|
24
|
+
export interface CI {
|
|
25
|
+
lower: number;
|
|
26
|
+
upper: number;
|
|
27
|
+
}
|
|
28
|
+
export interface PairedDeltaResult {
|
|
29
|
+
/** Mean of (treatment - baseline) over paired observations. */
|
|
30
|
+
meanDelta: number;
|
|
31
|
+
/** Bootstrap percentile CI on the mean delta. */
|
|
32
|
+
ci: CI;
|
|
33
|
+
/** Two-sided permutation p-value for H0: delta == 0. */
|
|
34
|
+
pValue: number;
|
|
35
|
+
/** Number of paired observations. */
|
|
36
|
+
n: number;
|
|
37
|
+
/** True when the CI excludes 0 at the configured level. */
|
|
38
|
+
significant: boolean;
|
|
39
|
+
}
|
|
40
|
+
export interface PairedOptions {
|
|
41
|
+
/** Bootstrap/permutation iterations (default 10000). */
|
|
42
|
+
iterations?: number;
|
|
43
|
+
/** Confidence level for the CI, e.g. 0.95 (default). */
|
|
44
|
+
confidence?: number;
|
|
45
|
+
/** RNG seed for reproducibility (default 1). */
|
|
46
|
+
seed?: number;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Paired analysis of a treatment vs baseline metric. `deltas[i]` is
|
|
50
|
+
* (treatment_i - baseline_i) for the i-th paired observation. Returns the mean
|
|
51
|
+
* delta, a bootstrap CI, and a permutation p-value (sign-flip, the correct null
|
|
52
|
+
* for a paired design).
|
|
53
|
+
*/
|
|
54
|
+
export declare function pairedDelta(deltas: number[], opts?: PairedOptions): PairedDeltaResult;
|
|
55
|
+
export interface McNemarResult {
|
|
56
|
+
bothCorrect: number;
|
|
57
|
+
onlyTreatment: number;
|
|
58
|
+
onlyBaseline: number;
|
|
59
|
+
bothWrong: number;
|
|
60
|
+
/** Net correctness gain from treatment: (onlyTreatment - onlyBaseline). */
|
|
61
|
+
netGain: number;
|
|
62
|
+
/** Two-sided exact McNemar p-value on the discordant pairs. */
|
|
63
|
+
pValue: number;
|
|
64
|
+
n: number;
|
|
65
|
+
}
|
|
66
|
+
export declare function mcnemar(treatment: boolean[], baseline: boolean[]): McNemarResult;
|
|
67
|
+
export declare function passAtK(numSamples: number, numCorrect: number, k: number): number;
|
|
68
|
+
//# sourceMappingURL=stats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../../src/benchmarks/paired/stats.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,MAAM,CASrD;AAKD,wBAAgB,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,MAAM,CAGzC;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,MAAM,CAI7C;AAED,wBAAgB,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,MAAM,CAExC;AAED,wBAAgB,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,MAAM,CAG3C;AAED,MAAM,WAAW,EAAE;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,+DAA+D;IAC/D,SAAS,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,EAAE,EAAE,EAAE,CAAC;IACP,wDAAwD;IACxD,MAAM,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,CAAC,EAAE,MAAM,CAAC;IACV,2DAA2D;IAC3D,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gDAAgD;IAChD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAYD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,aAAkB,GAAG,iBAAiB,CAgDzF;AAQD,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,2EAA2E;IAC3E,OAAO,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,MAAM,EAAE,MAAM,CAAC;IACf,CAAC,EAAE,MAAM,CAAC;CACX;AAuBD,wBAAgB,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,aAAa,CAyBhF;AAMD,wBAAgB,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAQjF"}
|