peeksafe 0.0.0-stage → 0.2.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/CHANGELOG.md +325 -0
- package/LICENSE +190 -0
- package/NOTICE +78 -0
- package/README.md +490 -2
- package/RESEARCH-NOTES.md +274 -0
- package/dist/baseline.d.ts +45 -0
- package/dist/baseline.d.ts.map +1 -0
- package/dist/baseline.js +49 -0
- package/dist/baseline.js.map +1 -0
- package/dist/check.d.ts +64 -0
- package/dist/check.d.ts.map +1 -0
- package/dist/check.js +172 -0
- package/dist/check.js.map +1 -0
- package/dist/cluster.d.ts +328 -0
- package/dist/cluster.d.ts.map +1 -0
- package/dist/cluster.js +606 -0
- package/dist/cluster.js.map +1 -0
- package/dist/errors.d.ts +108 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +192 -0
- package/dist/errors.js.map +1 -0
- package/dist/evidence.d.ts +15 -0
- package/dist/evidence.d.ts.map +1 -0
- package/dist/evidence.js +30 -0
- package/dist/evidence.js.map +1 -0
- package/dist/frontier.d.ts +271 -0
- package/dist/frontier.d.ts.map +1 -0
- package/dist/frontier.js +505 -0
- package/dist/frontier.js.map +1 -0
- package/dist/gate.d.ts +175 -0
- package/dist/gate.d.ts.map +1 -0
- package/dist/gate.js +200 -0
- package/dist/gate.js.map +1 -0
- package/dist/index.d.ts +60 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +79 -0
- package/dist/index.js.map +1 -0
- package/dist/plan.d.ts +280 -0
- package/dist/plan.d.ts.map +1 -0
- package/dist/plan.js +626 -0
- package/dist/plan.js.map +1 -0
- package/dist/rand.d.ts +17 -0
- package/dist/rand.d.ts.map +1 -0
- package/dist/rand.js +104 -0
- package/dist/rand.js.map +1 -0
- package/dist/stats.d.ts +401 -0
- package/dist/stats.d.ts.map +1 -0
- package/dist/stats.js +1304 -0
- package/dist/stats.js.map +1 -0
- package/dist/stop.d.ts +164 -0
- package/dist/stop.d.ts.map +1 -0
- package/dist/stop.js +270 -0
- package/dist/stop.js.map +1 -0
- package/package.json +62 -3
- package/src/baseline.ts +72 -0
- package/src/check.ts +238 -0
- package/src/cluster.ts +842 -0
- package/src/errors.ts +275 -0
- package/src/evidence.ts +62 -0
- package/src/frontier.ts +837 -0
- package/src/gate.ts +363 -0
- package/src/index.ts +206 -0
- package/src/plan.ts +968 -0
- package/src/rand.ts +137 -0
- package/src/stats.ts +1663 -0
- package/src/stop.ts +464 -0
package/dist/frontier.js
ADDED
|
@@ -0,0 +1,505 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* frontier.ts: what *is* certifiable at coding-agent prices, and how.
|
|
3
|
+
*
|
|
4
|
+
* ## Why this module exists
|
|
5
|
+
*
|
|
6
|
+
* At $1 a run a 200-case suite at a 15-point MDE is $1,320 a pull request, so
|
|
7
|
+
* peeksafe is not a per-PR gate for a coding-agent benchmark at that size. That
|
|
8
|
+
* is true and it is half an answer. The other half, the one a
|
|
9
|
+
* buyer actually needs, is **which configurations *are* affordable**, and
|
|
10
|
+
* nobody had drawn it.
|
|
11
|
+
*
|
|
12
|
+
* A configuration is a point in five dimensions:
|
|
13
|
+
*
|
|
14
|
+
* suite size m × MDE δ × design × screening × baseline runs n_b
|
|
15
|
+
*
|
|
16
|
+
* and it is usable only if it is *both* affordable and **certifiable**. Those
|
|
17
|
+
* are different constraints, and a plan that conflates them quotes the wrong
|
|
18
|
+
* numbers. Cheap is easy: run fewer cases. Cheap *and able to decide anything* is
|
|
19
|
+
* the hard part, because `evidenceCeilingLogE` says a case whose unpaired
|
|
20
|
+
* ceiling sits under the e-BH bar cannot be certified at any budget, and the
|
|
21
|
+
* bar `m/q` moves with the suite size, so shrinking the suite raises the
|
|
22
|
+
* ceiling's odds *and* lowers the bar at the same time. That interaction is not
|
|
23
|
+
* something you can eyeball.
|
|
24
|
+
*
|
|
25
|
+
* ## The cost model, and the term the plan was missing
|
|
26
|
+
*
|
|
27
|
+
* `plan.ts` prices an observation at one number, `costPerRunUsd`. That is wrong
|
|
28
|
+
* in two ways at coding-agent prices, and both matter:
|
|
29
|
+
*
|
|
30
|
+
* 1. **Grading is not free.** An LLM judge is a model call; a coding-agent
|
|
31
|
+
* grader is a test suite in a container. So
|
|
32
|
+
*
|
|
33
|
+
* cost(observation) = costPerRunUsd + costPerGradeUsd
|
|
34
|
+
*
|
|
35
|
+
* and the second term is the *only* one a cheap proxy grader can reduce.
|
|
36
|
+
* When `costPerGradeUsd` is 0, which is the default,
|
|
37
|
+
* matching this package's own free graders, a proxy screen saves exactly
|
|
38
|
+
* nothing, and this module says so instead of offering it as an economy.
|
|
39
|
+
*
|
|
40
|
+
* 2. **The baseline is not free either, and it is not amortised over
|
|
41
|
+
* infinity.** The README calls the baseline "amortised, you pay it once on
|
|
42
|
+
* main". At $0.002 a run that is a rounding error. At $1 a run, a 200-case
|
|
43
|
+
* suite with a 240-run baseline is 48,000 runs, **$48,000**, and spread
|
|
44
|
+
* over a hundred pull requests it is still $480 each, which is larger than
|
|
45
|
+
* everything else in the bill put together. The unpaired design's evidence
|
|
46
|
+
* ceiling is bought with baseline runs, so *the amortised baseline is the
|
|
47
|
+
* dominant cost of the unpaired design at coding-agent prices*, and the
|
|
48
|
+
* paired design's headline advantage is not variance reduction. It is that
|
|
49
|
+
* it does not need to buy a ceiling.
|
|
50
|
+
*
|
|
51
|
+
* ## What this module will not do
|
|
52
|
+
*
|
|
53
|
+
* It will not recommend a screened configuration whose **recall cost has not
|
|
54
|
+
* been measured**. Screening is the largest cost lever available and it is paid
|
|
55
|
+
* for in missed regressions, which the caller supplies as `screenRecall`
|
|
56
|
+
* against planted ground truth, and until someone has, the honest price of a
|
|
57
|
+
* screened plan is unknown rather than low.
|
|
58
|
+
*/
|
|
59
|
+
import { PeeksafeError, requireErrorRates, requireOpenProbability, requireProbability, requireRunCeiling, requireTrialGrid, } from "./errors.js";
|
|
60
|
+
import { DEFAULT_PLAN, expectedSettlePairs, requireSettleConfidence } from "./plan.js";
|
|
61
|
+
import { betaQuantile, ebhSoloThreshold, evidenceCeilingLogE, mcnemarSamplesForEvidence, samplesForEvidence, sprtExpectedN, } from "./stats.js";
|
|
62
|
+
export const DEFAULT_AXES = {
|
|
63
|
+
cases: [10, 20, 50, 100, 200],
|
|
64
|
+
mdes: [0.1, 0.15, 0.25, 0.35],
|
|
65
|
+
baselineRuns: [30, 60, 120, 240, 480],
|
|
66
|
+
designs: ["unpaired", "paired"],
|
|
67
|
+
screens: ["none", "expensive", "proxy"],
|
|
68
|
+
screenRuns: [4, 8],
|
|
69
|
+
};
|
|
70
|
+
export const DEFAULT_FRONTIER = {
|
|
71
|
+
budgetUsd: 100,
|
|
72
|
+
basis: "typical",
|
|
73
|
+
costPerRunUsd: 1,
|
|
74
|
+
costPerGradeUsd: 0,
|
|
75
|
+
baselineRate: 0.85,
|
|
76
|
+
fdr: 0.05,
|
|
77
|
+
pairCoupling: DEFAULT_PLAN.pairCoupling,
|
|
78
|
+
amortisePrs: 100,
|
|
79
|
+
pairedBaselineRuns: 20,
|
|
80
|
+
screenKeepFraction: 0.15,
|
|
81
|
+
runsPerCaseCeiling: DEFAULT_PLAN.runsPerCaseCeiling,
|
|
82
|
+
screenRecall: { expensive: null, proxy: null },
|
|
83
|
+
screenRecallSource: "not measured",
|
|
84
|
+
alpha: DEFAULT_PLAN.alpha,
|
|
85
|
+
beta: DEFAULT_PLAN.beta,
|
|
86
|
+
minTrials: DEFAULT_PLAN.minTrials,
|
|
87
|
+
maxTrials: DEFAULT_PLAN.maxTrials,
|
|
88
|
+
batchSize: DEFAULT_PLAN.batchSize,
|
|
89
|
+
nullQuantile: DEFAULT_PLAN.nullQuantile,
|
|
90
|
+
};
|
|
91
|
+
const RUNS_PER_OBS = { unpaired: 1, paired: 2 };
|
|
92
|
+
const SCREENS = ["none", "expensive", "proxy"];
|
|
93
|
+
/** $1.00, but $0.0021 rather than $0.00, a per-run price rounds to nothing. */
|
|
94
|
+
export const fmtRate = (x) => !Number.isFinite(x)
|
|
95
|
+
? Number.isNaN(x)
|
|
96
|
+
? "$?"
|
|
97
|
+
: "$∞"
|
|
98
|
+
: x >= 0.01 || x === 0
|
|
99
|
+
? `$${x.toFixed(2)}`
|
|
100
|
+
: `$${x.toPrecision(2)}`;
|
|
101
|
+
/** Cost of `runs` runs, all of them graded by the real grader. */
|
|
102
|
+
const graded = (runs, cfg) => runs * (cfg.costPerRunUsd + cfg.costPerGradeUsd);
|
|
103
|
+
function requireBaselineRuns(v, name, where) {
|
|
104
|
+
if (!Number.isInteger(v) || v < 1) {
|
|
105
|
+
throw new PeeksafeError("PEEKSAFE_E_CONFIG", `${where}: ${name} must be a positive integer, got ${v}`, {
|
|
106
|
+
detail: { [name]: v, where },
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* The budget, the prices, the screen's keep fraction and `amortisePrs`.
|
|
112
|
+
* `enumerateFrontier` checked these and `evaluatePoint` did not, so a direct
|
|
113
|
+
* call recommended a point at a negative bill and priced a screen that kept
|
|
114
|
+
* twice the suite.
|
|
115
|
+
*/
|
|
116
|
+
function requirePricing(cfg, where) {
|
|
117
|
+
const finiteCost = (v) => Number.isFinite(v) && v >= 0;
|
|
118
|
+
if (!(cfg.budgetUsd >= 0) || !finiteCost(cfg.costPerRunUsd) || !finiteCost(cfg.costPerGradeUsd)) {
|
|
119
|
+
throw new PeeksafeError("PEEKSAFE_E_CONFIG", `${where}: budget must be ≥ 0 and costs finite and ≥ 0`, {
|
|
120
|
+
detail: {
|
|
121
|
+
budgetUsd: cfg.budgetUsd,
|
|
122
|
+
costPerRunUsd: cfg.costPerRunUsd,
|
|
123
|
+
costPerGradeUsd: cfg.costPerGradeUsd,
|
|
124
|
+
where,
|
|
125
|
+
},
|
|
126
|
+
hint: "an infinite cost fits an infinite budget, so the frontier recommended a point on an infinite bill",
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
if (!(cfg.screenKeepFraction > 0) || !(cfg.screenKeepFraction <= 1)) {
|
|
130
|
+
throw new PeeksafeError("PEEKSAFE_E_CONFIG", `${where}: screenKeepFraction must be in (0,1], got ${cfg.screenKeepFraction}`, {
|
|
131
|
+
detail: { screenKeepFraction: cfg.screenKeepFraction, where },
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
if (!Number.isInteger(cfg.amortisePrs) || cfg.amortisePrs < 1) {
|
|
135
|
+
throw new PeeksafeError("PEEKSAFE_E_CONFIG", `${where}: amortisePrs must be a positive integer, got ${cfg.amortisePrs}`, {
|
|
136
|
+
detail: { amortisePrs: cfg.amortisePrs, where },
|
|
137
|
+
hint: 'a baseline spread over "infinity" pull requests is how the baseline cost disappears from a plan',
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Observations per case on a pull request where nothing moved, clamped onto the
|
|
143
|
+
* gate's own batch grid.
|
|
144
|
+
*/
|
|
145
|
+
export function typicalObservationsPerCase(rate, mde, cfg, baselineRuns) {
|
|
146
|
+
// `makePlan` reaches this quantile through `baselineNullRate`, which refuses
|
|
147
|
+
// one outside (0,1). This handed it to `betaQuantile` directly, which answers
|
|
148
|
+
// 0 for a quantile at or below 0, 1 at or above 1, and about 0 for NaN, so the
|
|
149
|
+
// frontier priced the typical bill against a null rate nobody chose.
|
|
150
|
+
requireOpenProbability(cfg.nullQuantile, "nullQuantile", "typicalObservationsPerCase");
|
|
151
|
+
requireTrialGrid(cfg, "typicalObservationsPerCase");
|
|
152
|
+
// Unchecked, an mde of 0 or below priced a bill for an effect nobody can detect, and a bad rate or run count was refused under betaQuantile's name.
|
|
153
|
+
requireOpenProbability(rate, "rate", "typicalObservationsPerCase");
|
|
154
|
+
requireOpenProbability(mde, "mde", "typicalObservationsPerCase");
|
|
155
|
+
requireBaselineRuns(baselineRuns, "baselineRuns", "typicalObservationsPerCase");
|
|
156
|
+
const s = Math.round(rate * baselineRuns);
|
|
157
|
+
const p0 = betaQuantile(1 + s, 1 + baselineRuns - s, cfg.nullQuantile);
|
|
158
|
+
const p1 = Math.max(0.005, p0 - mde);
|
|
159
|
+
const raw = sprtExpectedN(rate, p0, p1, cfg.alpha, cfg.beta);
|
|
160
|
+
const n = Number.isFinite(raw) && raw > 0
|
|
161
|
+
? Math.min(cfg.maxTrials, Math.max(cfg.minTrials, Math.ceil(raw)))
|
|
162
|
+
: cfg.maxTrials;
|
|
163
|
+
const batched = cfg.minTrials + Math.ceil(Math.max(0, n - cfg.minTrials) / cfg.batchSize) * cfg.batchSize;
|
|
164
|
+
return Math.min(cfg.maxTrials, batched);
|
|
165
|
+
}
|
|
166
|
+
export function evaluatePoint(cases, mde, baselineRuns, design, screen, screenRunsPerCase, cfg) {
|
|
167
|
+
// Strictly open: an MDE of 0 means "detect a zero-point drop", which every
|
|
168
|
+
// design correctly refuses, but it refuses with a message about the evidence
|
|
169
|
+
// ceiling, which sends the reader looking for a baseline problem that is not
|
|
170
|
+
// there. Same for a baseline rate of 0 or 1.
|
|
171
|
+
requireOpenProbability(mde, "mde", "evaluatePoint");
|
|
172
|
+
requireOpenProbability(cfg.baselineRate, "baselineRate", "evaluatePoint");
|
|
173
|
+
// `makePlan` refuses these two and this did not, so one options object was a
|
|
174
|
+
// refusal through the planner and a priced frontier through here. Both end up
|
|
175
|
+
// in `sprtExpectedN`, which answers NaN or Infinity outside (0,1), and
|
|
176
|
+
// `typicalObservationsPerCase` reads either as "cannot price this" and falls
|
|
177
|
+
// back to the run ceiling.
|
|
178
|
+
requireErrorRates(cfg.alpha, cfg.beta, "evaluatePoint");
|
|
179
|
+
requireProbability(cfg.pairCoupling, "pairCoupling", "evaluatePoint");
|
|
180
|
+
requireOpenProbability(cfg.nullQuantile, "nullQuantile", "evaluatePoint");
|
|
181
|
+
requireSettleConfidence(cfg, "evaluatePoint");
|
|
182
|
+
// makePlan refuses it; unchecked, an fdr of 2 cut the bar and 0 was blamed on the ceiling.
|
|
183
|
+
requireOpenProbability(cfg.fdr, "fdr", "evaluatePoint");
|
|
184
|
+
requireRunCeiling(cfg.runsPerCaseCeiling, "evaluatePoint");
|
|
185
|
+
requirePricing(cfg, "evaluatePoint");
|
|
186
|
+
if (!Number.isInteger(cases) || cases < 1) {
|
|
187
|
+
throw new PeeksafeError("PEEKSAFE_E_CONFIG", `frontier: cases must be a positive integer, got ${cases}`, {
|
|
188
|
+
detail: { cases },
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
// The paired design prices its baseline from this one, and 0 or 2.5 runs priced a cheaper frontier than any real baseline.
|
|
192
|
+
requireBaselineRuns(cfg.pairedBaselineRuns, "pairedBaselineRuns", "evaluatePoint");
|
|
193
|
+
requireBaselineRuns(baselineRuns, "baselineRuns", "evaluatePoint");
|
|
194
|
+
requireTrialGrid(cfg, "evaluatePoint");
|
|
195
|
+
// An unknown design fell through to the paired branch with no runs per observation and came back feasible on an infinite bill.
|
|
196
|
+
if (!Object.hasOwn(RUNS_PER_OBS, design)) {
|
|
197
|
+
throw new PeeksafeError("PEEKSAFE_E_CONFIG", `frontier: design must be one of ${Object.keys(RUNS_PER_OBS).join(", ")}, got "${String(design)}"`, {
|
|
198
|
+
detail: { design },
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
// An unknown screen was priced and recommended as the expensive one.
|
|
202
|
+
if (!SCREENS.includes(screen)) {
|
|
203
|
+
throw new PeeksafeError("PEEKSAFE_E_CONFIG", `frontier: screen must be one of ${SCREENS.join(", ")}, got "${String(screen)}"`, {
|
|
204
|
+
detail: { screen },
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
// Only null withholds a recommendation, so a NaN recall (0 of 0 regressions caught) recommended the screen.
|
|
208
|
+
for (const kind of ["expensive", "proxy"]) {
|
|
209
|
+
const recall = cfg.screenRecall[kind];
|
|
210
|
+
if (recall !== null)
|
|
211
|
+
requireProbability(recall, `screenRecall.${kind}`, "evaluatePoint");
|
|
212
|
+
}
|
|
213
|
+
if (screen !== "none" && (!Number.isInteger(screenRunsPerCase) || screenRunsPerCase < 1)) {
|
|
214
|
+
throw new PeeksafeError("PEEKSAFE_E_CONFIG", `frontier: a ${screen} screen needs at least one run per case, got ${screenRunsPerCase}`, {
|
|
215
|
+
detail: { screen, screenRunsPerCase },
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
const rate = cfg.baselineRate;
|
|
219
|
+
const barLogE = Math.log(ebhSoloThreshold(cases, cfg.fdr));
|
|
220
|
+
// The baseline this design actually needs. The paired design's null is exact,
|
|
221
|
+
// so its stored baseline only tunes the stopping rule: a short one suffices,
|
|
222
|
+
// and pretending it needs the same n_b as the unpaired design would price a
|
|
223
|
+
// ceiling it never buys.
|
|
224
|
+
const effectiveBaselineRuns = design === "paired" ? cfg.pairedBaselineRuns : baselineRuns;
|
|
225
|
+
const s = Math.round(rate * effectiveBaselineRuns);
|
|
226
|
+
let ceilingLogE = null;
|
|
227
|
+
let certifyObservations;
|
|
228
|
+
let infeasibleBecause = null;
|
|
229
|
+
if (rate <= mde) {
|
|
230
|
+
infeasibleBecause =
|
|
231
|
+
`a case at ${(rate * 100).toFixed(0)}% cannot lose ${(mde * 100).toFixed(0)} points, ` +
|
|
232
|
+
"the effect is arithmetically impossible, not merely expensive";
|
|
233
|
+
certifyObservations = Infinity;
|
|
234
|
+
}
|
|
235
|
+
else if (design === "unpaired") {
|
|
236
|
+
const pTrue = Math.max(1e-6, Math.min(1 - 1e-6, rate - mde));
|
|
237
|
+
ceilingLogE = evidenceCeilingLogE(pTrue, s, effectiveBaselineRuns, mde);
|
|
238
|
+
certifyObservations = samplesForEvidence(pTrue, s, effectiveBaselineRuns, mde, barLogE, cfg.runsPerCaseCeiling * 8);
|
|
239
|
+
if (!Number.isFinite(certifyObservations)) {
|
|
240
|
+
infeasibleBecause =
|
|
241
|
+
`unpaired evidence ceiling e^${ceilingLogE.toFixed(1)} is below the bar e^${barLogE.toFixed(1)} ` +
|
|
242
|
+
`at a ${effectiveBaselineRuns}-run baseline, no candidate budget certifies it`;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
const pairs = mcnemarSamplesForEvidence(rate, mde, cfg.pairCoupling, barLogE, cfg.runsPerCaseCeiling * 8);
|
|
247
|
+
certifyObservations = pairs;
|
|
248
|
+
if (!Number.isFinite(pairs)) {
|
|
249
|
+
infeasibleBecause = `paired: no number of pairs reaches the bar at ρ = ${cfg.pairCoupling.toFixed(2)}`;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
const runsPerObs = RUNS_PER_OBS[design];
|
|
253
|
+
if (infeasibleBecause === null && certifyObservations * runsPerObs > cfg.runsPerCaseCeiling) {
|
|
254
|
+
infeasibleBecause =
|
|
255
|
+
`${Math.ceil(certifyObservations * runsPerObs)} runs for one case, past the ` +
|
|
256
|
+
`${cfg.runsPerCaseCeiling}-run per-case ceiling`;
|
|
257
|
+
}
|
|
258
|
+
const feasible = infeasibleBecause === null;
|
|
259
|
+
// A paired case counts the pairs `shouldStopPaired` takes to settle, as `makePlan` does; the SPRT figure ignores the coupling.
|
|
260
|
+
const typicalObservations = design === "paired"
|
|
261
|
+
? expectedSettlePairs(rate, cfg.pairCoupling, mde, cfg)
|
|
262
|
+
: typicalObservationsPerCase(rate, mde, cfg, effectiveBaselineRuns);
|
|
263
|
+
const keep = screen === "none" ? cases : Math.max(1, Math.ceil(cases * cfg.screenKeepFraction));
|
|
264
|
+
// Screening runs are graded by whichever grader the screen uses. A proxy
|
|
265
|
+
// screen still *executes* the agent, it only skips the grade, so it saves
|
|
266
|
+
// `costPerGradeUsd` per screening run and not one cent more.
|
|
267
|
+
//
|
|
268
|
+
// And a screening *observation* costs `runsPerObs` runs, exactly as a test
|
|
269
|
+
// observation does, since a paired screen runs both arms too. Charging it one
|
|
270
|
+
// run an observation would understate it by 2×, in the direction that makes
|
|
271
|
+
// pairing look cheaper.
|
|
272
|
+
const screenRuns = screen === "none" ? 0 : cases * screenRunsPerCase * runsPerObs;
|
|
273
|
+
const screenUsd = screen === "none"
|
|
274
|
+
? 0
|
|
275
|
+
: screen === "proxy"
|
|
276
|
+
? screenRuns * cfg.costPerRunUsd
|
|
277
|
+
: graded(screenRuns, cfg);
|
|
278
|
+
// The baseline. Unpaired buys its ceiling here; paired does not.
|
|
279
|
+
const baselineRunsTotal = cases * effectiveBaselineRuns;
|
|
280
|
+
const baselineRunsAmortised = baselineRunsTotal / cfg.amortisePrs;
|
|
281
|
+
const baselineUsd = graded(baselineRunsAmortised, cfg);
|
|
282
|
+
const costFor = (obsPerCase) => {
|
|
283
|
+
const testRuns = Number.isFinite(obsPerCase) ? keep * obsPerCase * runsPerObs : Infinity;
|
|
284
|
+
const testUsd = Number.isFinite(testRuns) ? graded(testRuns, cfg) : Infinity;
|
|
285
|
+
return {
|
|
286
|
+
screenRuns,
|
|
287
|
+
screenUsd,
|
|
288
|
+
testRuns,
|
|
289
|
+
testUsd,
|
|
290
|
+
baselineRunsAmortised,
|
|
291
|
+
baselineUsd,
|
|
292
|
+
totalUsd: screenUsd + testUsd + baselineUsd,
|
|
293
|
+
};
|
|
294
|
+
};
|
|
295
|
+
const typical = costFor(typicalObservations);
|
|
296
|
+
const certifyAll = costFor(certifyObservations);
|
|
297
|
+
// The per-case cap this configuration would have to run under.
|
|
298
|
+
//
|
|
299
|
+
// `samplesForEvidence` can answer more runs than `cfg.maxTrials`, and a plan
|
|
300
|
+
// quoting those prices a design the configured cap never executes. So the cap
|
|
301
|
+
// is whatever this configuration *needs*, and `requiresMaxRuns` says so.
|
|
302
|
+
const capObservations = Number.isFinite(certifyObservations)
|
|
303
|
+
? Math.max(cfg.maxTrials, Math.ceil(certifyObservations))
|
|
304
|
+
: cfg.maxTrials;
|
|
305
|
+
// The gate stops paying for a case at that cap, so this is a real upper
|
|
306
|
+
// bound rather than a scenario, and scenarios do not bound anything.
|
|
307
|
+
const ceiling = costFor(capObservations);
|
|
308
|
+
const screenRecall = screen === "none"
|
|
309
|
+
? 1
|
|
310
|
+
: screen === "proxy"
|
|
311
|
+
? cfg.screenRecall.proxy
|
|
312
|
+
: cfg.screenRecall.expensive;
|
|
313
|
+
// A lookup, not a `?:` chain with `typical` on the else branch. A typo'd
|
|
314
|
+
// basis silently selecting the cheapest bill is precisely the
|
|
315
|
+
// malformed-input-becomes-the-most-permissive-result failure this codebase
|
|
316
|
+
// keeps finding in itself.
|
|
317
|
+
const BILLS = {
|
|
318
|
+
typical,
|
|
319
|
+
"certify-all": certifyAll,
|
|
320
|
+
ceiling,
|
|
321
|
+
};
|
|
322
|
+
// `hasOwn`, as in `costShares`: `BILLS.toString` is inherited, so "toString" passed an `undefined` check.
|
|
323
|
+
if (!Object.hasOwn(BILLS, cfg.basis)) {
|
|
324
|
+
throw new PeeksafeError("PEEKSAFE_E_CONFIG", `frontier: basis must be one of ${Object.keys(BILLS).join(", ")}, got "${String(cfg.basis)}"`, {
|
|
325
|
+
detail: { basis: cfg.basis },
|
|
326
|
+
hint: "an unrecognised basis silently defaulting to the cheaper bill is how a budget becomes fiction",
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
const basisCost = BILLS[cfg.basis];
|
|
330
|
+
const withinBudget = feasible && basisCost.totalUsd <= cfg.budgetUsd;
|
|
331
|
+
// Reportable and recommendable are different. A screen whose recall nobody
|
|
332
|
+
// measured is cheap in a way we cannot price, and a proxy screen at zero
|
|
333
|
+
// grading cost is cheaper than nothing at all, which is to say, it is not.
|
|
334
|
+
let caveat = null;
|
|
335
|
+
if (screen !== "none" && screenRecall === null) {
|
|
336
|
+
caveat = `the ${screen} screen's recall cost is unmeasured, it drops regressions at an unknown rate`;
|
|
337
|
+
}
|
|
338
|
+
else if (screen === "proxy" && cfg.costPerGradeUsd <= 0) {
|
|
339
|
+
caveat =
|
|
340
|
+
"a proxy screen saves only grading cost, and grading here is free, it buys nothing and costs recall";
|
|
341
|
+
}
|
|
342
|
+
return {
|
|
343
|
+
cases,
|
|
344
|
+
mde,
|
|
345
|
+
baselineRuns,
|
|
346
|
+
design,
|
|
347
|
+
screen,
|
|
348
|
+
screenRunsPerCase: screen === "none" ? 0 : screenRunsPerCase,
|
|
349
|
+
keep,
|
|
350
|
+
barLogE,
|
|
351
|
+
ceilingLogE,
|
|
352
|
+
feasible,
|
|
353
|
+
infeasibleBecause,
|
|
354
|
+
certifyObservations,
|
|
355
|
+
typicalObservations,
|
|
356
|
+
requiresMaxRuns: capObservations,
|
|
357
|
+
exceedsGateCap: capObservations > cfg.maxTrials,
|
|
358
|
+
typical,
|
|
359
|
+
certifyAll,
|
|
360
|
+
ceiling,
|
|
361
|
+
basisCostUsd: basisCost.totalUsd,
|
|
362
|
+
withinBudget,
|
|
363
|
+
screenRecall,
|
|
364
|
+
recommendable: withinBudget && caveat === null,
|
|
365
|
+
caveat,
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
/** Every point in the swept space, feasible or not. */
|
|
369
|
+
export function enumerateFrontier(cfg, axes = DEFAULT_AXES) {
|
|
370
|
+
requirePricing(cfg, "frontier");
|
|
371
|
+
for (const [name, xs] of Object.entries(axes)) {
|
|
372
|
+
if (!Array.isArray(xs) || xs.length === 0) {
|
|
373
|
+
throw new PeeksafeError("PEEKSAFE_E_CONFIG", `frontier: axis "${name}" is empty, nothing to sweep`, {
|
|
374
|
+
detail: { axis: name },
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
const out = [];
|
|
379
|
+
for (const m of axes.cases) {
|
|
380
|
+
for (const mde of axes.mdes) {
|
|
381
|
+
for (const design of axes.designs) {
|
|
382
|
+
// The baseline axis is real for the unpaired design and a fiction for
|
|
383
|
+
// the paired one, which uses `pairedBaselineRuns` whatever this says.
|
|
384
|
+
// Sweeping it anyway would emit five identical paired rows and make the
|
|
385
|
+
// frontier look like it had five times the evidence it has.
|
|
386
|
+
const baselines = design === "paired" ? [cfg.pairedBaselineRuns] : axes.baselineRuns;
|
|
387
|
+
for (const nb of baselines) {
|
|
388
|
+
for (const screen of axes.screens) {
|
|
389
|
+
const ks = screen === "none" ? [0] : axes.screenRuns;
|
|
390
|
+
for (const k of ks)
|
|
391
|
+
out.push(evaluatePoint(m, mde, nb, design, screen, k, cfg));
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
return out;
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* A cell (m, δ) dominates (m', δ') when it covers at least as many cases and
|
|
401
|
+
* detects at least as small a drop, and is strictly better on one of them. The
|
|
402
|
+
* frontier is what survives.
|
|
403
|
+
*/
|
|
404
|
+
function paretoCells(cells) {
|
|
405
|
+
return cells.filter((a) => !cells.some((b) => b !== a && b.cases >= a.cases && b.mde <= a.mde && (b.cases > a.cases || b.mde < a.mde)));
|
|
406
|
+
}
|
|
407
|
+
export function computeFrontier(cfg, axes = DEFAULT_AXES) {
|
|
408
|
+
const points = enumerateFrontier(cfg, axes);
|
|
409
|
+
const feasible = points.filter((p) => p.feasible);
|
|
410
|
+
const affordable = points.filter((p) => p.recommendable);
|
|
411
|
+
const cheaper = (a, b) => a.basisCostUsd <= b.basisCostUsd ? a : b;
|
|
412
|
+
const byCell = new Map();
|
|
413
|
+
for (const p of affordable) {
|
|
414
|
+
const key = `${p.cases}|${p.mde}`;
|
|
415
|
+
const cur = byCell.get(key);
|
|
416
|
+
if (!cur)
|
|
417
|
+
byCell.set(key, { cases: p.cases, mde: p.mde, best: p, cheapestReported: null });
|
|
418
|
+
else
|
|
419
|
+
cur.best = cheaper(cur.best, p);
|
|
420
|
+
}
|
|
421
|
+
// For each cell on the frontier, also name the cheapest *reported* option, so
|
|
422
|
+
// an operator can see what the "unmeasured recall" rule cost them.
|
|
423
|
+
for (const cell of byCell.values()) {
|
|
424
|
+
const reported = points
|
|
425
|
+
.filter((p) => p.cases === cell.cases && p.mde === cell.mde && p.withinBudget)
|
|
426
|
+
.reduce((best, p) => (best === null ? p : cheaper(best, p)), null);
|
|
427
|
+
cell.cheapestReported =
|
|
428
|
+
reported && reported.basisCostUsd < cell.best.basisCostUsd ? reported : null;
|
|
429
|
+
}
|
|
430
|
+
const frontier = paretoCells([...byCell.values()]).sort((a, b) => b.cases - a.cases || a.mde - b.mde);
|
|
431
|
+
const cheapestFeasible = feasible.reduce((best, p) => (best === null || p.basisCostUsd < best.basisCostUsd ? p : best), null);
|
|
432
|
+
// The smallest budget at which *something* becomes recommendable. `caveat`
|
|
433
|
+
// is exactly the recommendable rule minus the budget test, so reusing it here
|
|
434
|
+
// means the headline and the recommendation cannot disagree about what counts.
|
|
435
|
+
const cleanFeasible = feasible.filter((p) => p.caveat === null);
|
|
436
|
+
const minimumViableBudgetUsd = cleanFeasible.length === 0 ? null : Math.min(...cleanFeasible.map((p) => p.basisCostUsd));
|
|
437
|
+
const headline = frontier.length === 0
|
|
438
|
+
? minimumViableBudgetUsd === null
|
|
439
|
+
? `nothing in the swept space is certifiable at ${(cfg.baselineRate * 100).toFixed(0)}% baseline rate, ` +
|
|
440
|
+
"every configuration is either arithmetically impossible or past the per-case run ceiling"
|
|
441
|
+
: `nothing fits $${cfg.budgetUsd.toFixed(2)} at ${fmtRate(cfg.costPerRunUsd)}/run on the ${cfg.basis} bill. ` +
|
|
442
|
+
`The cheapest certifiable configuration is $${minimumViableBudgetUsd.toFixed(2)} per pull request` +
|
|
443
|
+
(cheapestFeasible
|
|
444
|
+
? `, ${cheapestFeasible.cases} cases at ${(cheapestFeasible.mde * 100).toFixed(0)} points, ${cheapestFeasible.design}.`
|
|
445
|
+
: ".")
|
|
446
|
+
: (() => {
|
|
447
|
+
const widest = frontier[0];
|
|
448
|
+
const tightest = [...frontier].sort((a, b) => a.mde - b.mde)[0];
|
|
449
|
+
return (`at ${fmtRate(cfg.costPerRunUsd)}/run and $${cfg.budgetUsd.toFixed(2)} a pull request (${cfg.basis} bill) you can certify ` +
|
|
450
|
+
`${widest.cases} cases at ${(widest.mde * 100).toFixed(0)} points ` +
|
|
451
|
+
`($${widest.best.basisCostUsd.toFixed(2)}, ${widest.best.design})` +
|
|
452
|
+
(tightest !== widest
|
|
453
|
+
? `, or ${tightest.cases} cases at ${(tightest.mde * 100).toFixed(0)} points ` +
|
|
454
|
+
`($${tightest.best.basisCostUsd.toFixed(2)}, ${tightest.best.design})`
|
|
455
|
+
: "") +
|
|
456
|
+
".");
|
|
457
|
+
})();
|
|
458
|
+
return {
|
|
459
|
+
config: cfg,
|
|
460
|
+
axes,
|
|
461
|
+
points,
|
|
462
|
+
affordable,
|
|
463
|
+
frontier,
|
|
464
|
+
cheapestFeasible,
|
|
465
|
+
minimumViableBudgetUsd,
|
|
466
|
+
headline,
|
|
467
|
+
};
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* Where the money goes, for one configuration. Printed under the frontier
|
|
471
|
+
* because the shares are the actual finding: at coding-agent prices the
|
|
472
|
+
* unpaired design's amortised baseline is usually the largest line, and it is
|
|
473
|
+
* the one the README used to call free.
|
|
474
|
+
*/
|
|
475
|
+
export function costShares(p, basis = "typical") {
|
|
476
|
+
// A lookup and a refusal, for the same reason `evaluatePoint` uses one: this
|
|
477
|
+
// was a `?:` chain with `p.typical` on the else branch, so any basis it did
|
|
478
|
+
// not recognise was reported as the typical bill. `FrontierPoint` names the
|
|
479
|
+
// field `certifyAll` and the basis `certify-all`, so reaching for the field
|
|
480
|
+
// name is the obvious slip, and it put the baseline at 6.6% of the money
|
|
481
|
+
// where the certify-all bill puts it at 1.1%.
|
|
482
|
+
const BILLS = {
|
|
483
|
+
typical: p.typical,
|
|
484
|
+
"certify-all": p.certifyAll,
|
|
485
|
+
ceiling: p.ceiling,
|
|
486
|
+
};
|
|
487
|
+
// `hasOwn` rather than an `undefined` check: `BILLS['toString']` is inherited
|
|
488
|
+
// from Object.prototype, so it is not undefined and would slip through one.
|
|
489
|
+
if (!Object.hasOwn(BILLS, basis)) {
|
|
490
|
+
throw new PeeksafeError("PEEKSAFE_E_CONFIG", `costShares: basis must be one of ${Object.keys(BILLS).join(", ")}, got "${String(basis)}"`, {
|
|
491
|
+
detail: { basis },
|
|
492
|
+
hint: "an unrecognised basis silently reporting the typical bill is how a cost breakdown describes a different plan than the one you asked about",
|
|
493
|
+
});
|
|
494
|
+
}
|
|
495
|
+
const cost = BILLS[basis];
|
|
496
|
+
const t = cost.totalUsd;
|
|
497
|
+
if (!(t > 0) || !Number.isFinite(t))
|
|
498
|
+
return { screen: 0, test: 0, baseline: 0 };
|
|
499
|
+
return {
|
|
500
|
+
screen: cost.screenUsd / t,
|
|
501
|
+
test: cost.testUsd / t,
|
|
502
|
+
baseline: cost.baselineUsd / t,
|
|
503
|
+
};
|
|
504
|
+
}
|
|
505
|
+
//# sourceMappingURL=frontier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontier.js","sourceRoot":"","sources":["../src/frontier.ts"],"names":[],"mappings":"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"}
|