@tangle-network/agent-eval 0.32.0 → 0.33.1
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 +30 -0
- package/dist/benchmarks/index.d.ts +2 -2
- package/dist/chunk-DCZXFOQN.js +489 -0
- package/dist/chunk-DCZXFOQN.js.map +1 -0
- package/dist/{chunk-B73G44OH.js → chunk-FT3IAMQR.js} +5 -5
- package/dist/chunk-FT3IAMQR.js.map +1 -0
- package/dist/{chunk-GVQT44CS.js → chunk-KE7TDJUO.js} +2 -2
- package/dist/{chunk-4L3WJXQJ.js → chunk-KHZRNY3F.js} +163 -2
- package/dist/{chunk-4L3WJXQJ.js.map → chunk-KHZRNY3F.js.map} +1 -1
- package/dist/{chunk-WGXZAQLR.js → chunk-LGAPK7NA.js} +2 -2
- package/dist/{chunk-DTEJNZYK.js → chunk-SQYRO3BT.js} +47 -4
- package/dist/chunk-SQYRO3BT.js.map +1 -0
- package/dist/{chunk-CXJOVDJR.js → chunk-TQL7BAOY.js} +5 -175
- package/dist/chunk-TQL7BAOY.js.map +1 -0
- package/dist/{chunk-M6RZ5LJN.js → chunk-VXNVVBZO.js} +34 -5
- package/dist/chunk-VXNVVBZO.js.map +1 -0
- package/dist/{chunk-S4Y5VXMS.js → chunk-WRGHMGWT.js} +2 -2
- package/dist/{chunk-SMSGXM74.js → chunk-YU3G6I7F.js} +2 -2
- package/dist/cli.js +2 -2
- package/dist/{control-p2ns7elI.d.ts → control-C3k02SCP.d.ts} +1 -1
- package/dist/control.d.ts +2 -2
- package/dist/control.js +3 -2
- package/dist/governance/index.d.ts +2 -1
- package/dist/{index-DPILdKbP.d.ts → index-CN2agEaO.d.ts} +2 -142
- package/dist/{index-BTqhGHJT.d.ts → index-ClMxVqe_.d.ts} +1 -1
- package/dist/index.d.ts +39 -486
- package/dist/index.js +75 -68
- package/dist/index.js.map +1 -1
- package/dist/judge-calibration-DilmB3Ml.d.ts +142 -0
- package/dist/meta-eval/index.d.ts +2 -2
- package/dist/openapi.json +1 -1
- package/dist/optimization.d.ts +3 -3
- package/dist/optimization.js +6 -6
- package/dist/pipelines/index.js +2 -2
- package/dist/release-report-ChfmCmLi.d.ts +713 -0
- package/dist/reporting.d.ts +6 -4
- package/dist/reporting.js +10 -9
- package/dist/{researcher-BRHa5Jxo.d.ts → researcher-CfnL3HEb.d.ts} +34 -3
- package/dist/rl.d.ts +5 -5
- package/dist/rl.js +6 -6
- package/dist/rl.js.map +1 -1
- package/dist/{rubric-predictive-validity-CMHypZ_M.d.ts → rubric-predictive-validity-BvaNwfBE.d.ts} +1 -1
- package/dist/{run-record-BfX5y68A.d.ts → run-record-YinVdFwu.d.ts} +78 -2
- package/dist/{summary-report-D7AQS7eB.d.ts → summary-report-BPJVzIeW.d.ts} +2 -2
- package/dist/wire/index.js +2 -2
- package/docs/product-eval-adoption.md +18 -0
- package/package.json +22 -12
- package/dist/chunk-B73G44OH.js.map +0 -1
- package/dist/chunk-CXJOVDJR.js.map +0 -1
- package/dist/chunk-DTEJNZYK.js.map +0 -1
- package/dist/chunk-M6RZ5LJN.js.map +0 -1
- package/dist/chunk-ZN2CMQIW.js +0 -208
- package/dist/chunk-ZN2CMQIW.js.map +0 -1
- package/dist/release-report-DLWbBPtH.d.ts +0 -292
- /package/dist/{chunk-GVQT44CS.js.map → chunk-KE7TDJUO.js.map} +0 -0
- /package/dist/{chunk-WGXZAQLR.js.map → chunk-LGAPK7NA.js.map} +0 -0
- /package/dist/{chunk-S4Y5VXMS.js.map → chunk-WRGHMGWT.js.map} +0 -0
- /package/dist/{chunk-SMSGXM74.js.map → chunk-YU3G6I7F.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/run-record.ts"],"sourcesContent":["/**\n * Paper-grade RunRecord schema + runtime validator.\n *\n * Every run that participates in a promotion gate, paper table, or\n * researcher loop SHOULD be recorded as a `RunRecord`. The mandatory\n * fields are exactly those the paper \"Two Loops, Three Roles\" requires\n * for reproducibility: who/what/when/cost/seed/hash, plus the search vs\n * holdout split tag and either a `searchScore` or a `holdoutScore`.\n *\n * This is intentionally NOT a replacement for the rich `Run` /\n * `ProposeReviewReport` / `ScenarioResult` types already in the\n * package. Those are runtime structures with full provenance. A\n * `RunRecord` is the analysis-time projection — the JSON-friendly\n * row you'd put in a parquet file or paste into a notebook.\n *\n * Validate at the boundary:\n *\n * const rec = validateRunRecord(rawJson) // throws on missing\n * const ok = isRunRecord(rawJson) // boolean check\n * const rec = parseRunRecordSafe(rawJson) // { ok, value | error }\n *\n * The validator runs in pure TS — zod is intentionally NOT a\n * dependency. Round-trip tested in `tests/run-record.test.ts`.\n */\n\n/** Search/dev/holdout split tag. 'search' is the paper-grade alias for the\n * combined train+test pool that the optimizer is allowed to read. */\nexport type RunSplitTag = 'search' | 'dev' | 'holdout'\n\nexport interface RunTokenUsage {\n input: number\n output: number\n cached?: number\n}\n\nexport interface RunJudgeMetadata {\n model: string\n promptVersion: string\n /** [0,1] confidence the judge declared. Constant judge confidence\n * across many runs is a fallback signal (see `canary.ts`). */\n confidence: number\n /** True if the judge degraded to a fallback path (rules-only,\n * prior-call cache, etc.). The canary uses this to alert. */\n fallback: boolean\n}\n\n/**\n * Per-judge / per-dimension breakdown for runs scored by an ensemble of\n * judges over a multi-dimensional rubric.\n *\n * The collapsed `outcome.searchScore` / `holdoutScore` carries the\n * composite the gate uses. The full breakdown belongs here so consumers\n * can answer \"which judge disagreed?\", \"which dimension dragged the\n * composite down?\", and \"did half the panel fail?\" without re-running.\n *\n * `perJudge[judgeId][dim]` is the canonical source; `perDimMean` and\n * `composite` are convenience projections — derivable but precomputed so\n * downstream IRR primitives (`interRaterReliability`,\n * `corpusInterRaterAgreement`) and reporters don't pay the same\n * aggregation twice.\n *\n * Fail-loud discipline: judges that errored out land in `failedJudges`\n * by id. A missing key in `perJudge` is ambiguous (silent zero vs not\n * run); the explicit list makes a partial-failure recorded as such.\n */\nexport interface JudgeScoresRecord {\n /** Per-judge per-dimension scores. `{ \"kimi-k2.6\": { helpfulness: 0.8, clarity: 0.7 }, ... }`. */\n perJudge: Record<string, Record<string, number>>\n /** Per-dim mean across judges. Convenience — derivable from `perJudge`. */\n perDimMean: Record<string, number>\n /** Composite mean across all dims and judges. Mirrors the score\n * the gate sees on `outcome.searchScore` / `holdoutScore`. */\n composite: number\n /** Judges that errored or returned an unparseable verdict. Recorded\n * by id (e.g. `['glm-5.1']`) so a partial-failure case is explicit,\n * not inferred from missing keys in `perJudge`. */\n failedJudges?: string[]\n /** Free-form notes the judges emitted (joined across judges or\n * first-judge only — consumer's choice). */\n notes?: string\n}\n\nexport interface RunOutcome {\n /** Score on the search/optimization split. Optional because a\n * holdout-only evaluation only fills `holdoutScore`. */\n searchScore?: number\n /** Score on the held-out split. Optional because a search-only run\n * only fills `searchScore`. At least one must be present. */\n holdoutScore?: number\n /** Bag of any other metric the run produced — judge dimensions,\n * pass/fail counters, latency stats, etc. Numeric only — keeps\n * reporters honest. */\n raw: Record<string, number>\n /** Per-judge / per-dim breakdown. Consumers writing ensemble\n * judgements populate this; substrate primitives like\n * `interRaterReliability` and `corpusInterRaterAgreement` accept\n * these records as input. Optional — single-judge or scalar-only\n * runs leave it unset. */\n judgeScores?: JudgeScoresRecord\n}\n\n/**\n * Mandatory paper-grade fields for a single evaluation run. Optional\n * fields are extension points; mandatory fields throw if missing.\n *\n * Hash discipline:\n * - `promptHash` is the sha256 of the EFFECTIVE prompt sent to the\n * model (after any steering bundle merge).\n * - `configHash` is the sha256 of the effective run config (model,\n * temperature, tools, judges, splits). The pair (promptHash,\n * configHash) uniquely identifies an experimental cell.\n *\n * Model snapshot discipline:\n * - `model` MUST encode a snapshot version. Bare aliases like\n * `claude-sonnet-4` or `gpt-4o` are banned — they remap silently.\n * Use `claude-sonnet-4-6@2025-04-15` or `gpt-4o-2024-11-20`.\n */\nexport interface RunRecord {\n /** UUID for the run. */\n runId: string\n /** Logical experiment grouping (a treatment vs a baseline within\n * the same sweep should share `experimentId`). */\n experimentId: string\n /** Stable identifier for the candidate (variant) being run. The\n * promotion gate compares two `candidateId`s on matched items. */\n candidateId: string\n /** RNG seed for the run. Always recorded — silent re-seeding is\n * the most common cause of non-reproducible numbers. */\n seed: number\n /** Model identifier WITH snapshot version. */\n model: string\n /** sha256 of the effective prompt (post-steering). */\n promptHash: string\n /** sha256 of the effective config. */\n configHash: string\n /** Git SHA the harness was run from. */\n commitSha: string\n /** End-to-end wall-clock duration in milliseconds. */\n wallMs: number\n /** Time spent queued before execution started, if known. */\n queueMs?: number\n /** Total USD cost. Mandatory — runs without a cost number are\n * unbounded by definition and must not be admitted into the gate. */\n costUsd: number\n /** Token usage breakdown. */\n tokenUsage: RunTokenUsage\n /** Judge-side metadata, if a judge was used. */\n judgeMetadata?: RunJudgeMetadata\n /** Per-split scores + raw bag. */\n outcome: RunOutcome\n /** Categorical failure tag, when the run failed and the harness\n * classified it. Free-form string; standard tags live in\n * `failure-taxonomy.ts`. */\n failureMode?: string\n /** Which split this run was drawn from. */\n splitTag: RunSplitTag\n /**\n * Stable scenario identifier the run was scored against. Optional for\n * backwards compatibility, but **strongly recommended**: every primitive\n * that pairs runs by scenario (preferences, paired stats, BT tournament)\n * keys on this. The campaign artifact populates it canonically; legacy\n * runs without it fall back to inference from `outcome.raw.scenario_id`\n * or `experimentId`.\n */\n scenarioId?: string\n}\n\n// ── Validation ───────────────────────────────────────────────────────\n\nconst MANDATORY_TOP_LEVEL = [\n 'runId',\n 'experimentId',\n 'candidateId',\n 'seed',\n 'model',\n 'promptHash',\n 'configHash',\n 'commitSha',\n 'wallMs',\n 'costUsd',\n 'tokenUsage',\n 'outcome',\n 'splitTag',\n] as const\n\nimport { ValidationError } from './errors'\n\nconst SPLIT_TAGS: ReadonlyArray<RunSplitTag> = ['search', 'dev', 'holdout']\n\nexport class RunRecordValidationError extends ValidationError {\n readonly path: string\n constructor(message: string, path = '') {\n super(path ? `${message} (at ${path})` : message)\n this.path = path\n }\n}\n\n/**\n * Strict validator. Throws `RunRecordValidationError` on the first\n * missing or wrongly-typed field. Returns the input cast to\n * `RunRecord` on success — the validator does not coerce.\n */\nexport function validateRunRecord(input: unknown): RunRecord {\n if (input === null || typeof input !== 'object') {\n throw new RunRecordValidationError('expected object')\n }\n const obj = input as Record<string, unknown>\n\n for (const key of MANDATORY_TOP_LEVEL) {\n if (!(key in obj)) {\n throw new RunRecordValidationError(`missing mandatory field \"${key}\"`)\n }\n }\n\n expectString(obj.runId, 'runId')\n expectString(obj.experimentId, 'experimentId')\n expectString(obj.candidateId, 'candidateId')\n expectFiniteNumber(obj.seed, 'seed')\n expectString(obj.model, 'model')\n expectString(obj.promptHash, 'promptHash')\n expectString(obj.configHash, 'configHash')\n expectString(obj.commitSha, 'commitSha')\n expectFiniteNumber(obj.wallMs, 'wallMs')\n if (obj.queueMs !== undefined) expectFiniteNumber(obj.queueMs, 'queueMs')\n expectFiniteNumber(obj.costUsd, 'costUsd')\n\n // Snapshot discipline: bare model aliases are not paper-grade.\n if (!modelHasSnapshot(obj.model as string)) {\n throw new RunRecordValidationError(\n `model \"${obj.model}\" lacks a snapshot version (use 'name@YYYY-MM-DD' or 'name-YYYYMMDD')`,\n 'model',\n )\n }\n\n // Token usage.\n const tu = obj.tokenUsage\n if (tu === null || typeof tu !== 'object') {\n throw new RunRecordValidationError('tokenUsage must be an object', 'tokenUsage')\n }\n const tuRec = tu as Record<string, unknown>\n expectFiniteNumber(tuRec.input, 'tokenUsage.input')\n expectFiniteNumber(tuRec.output, 'tokenUsage.output')\n if (tuRec.cached !== undefined) expectFiniteNumber(tuRec.cached, 'tokenUsage.cached')\n\n // Judge metadata, optional.\n if (obj.judgeMetadata !== undefined) {\n const jm = obj.judgeMetadata\n if (jm === null || typeof jm !== 'object') {\n throw new RunRecordValidationError('judgeMetadata must be an object', 'judgeMetadata')\n }\n const jmRec = jm as Record<string, unknown>\n expectString(jmRec.model, 'judgeMetadata.model')\n expectString(jmRec.promptVersion, 'judgeMetadata.promptVersion')\n expectFiniteNumber(jmRec.confidence, 'judgeMetadata.confidence')\n if (typeof jmRec.fallback !== 'boolean') {\n throw new RunRecordValidationError(\n 'judgeMetadata.fallback must be boolean',\n 'judgeMetadata.fallback',\n )\n }\n }\n\n // Outcome.\n const out = obj.outcome\n if (out === null || typeof out !== 'object') {\n throw new RunRecordValidationError('outcome must be an object', 'outcome')\n }\n const outRec = out as Record<string, unknown>\n if (outRec.searchScore !== undefined)\n expectFiniteNumber(outRec.searchScore, 'outcome.searchScore')\n if (outRec.holdoutScore !== undefined)\n expectFiniteNumber(outRec.holdoutScore, 'outcome.holdoutScore')\n if (outRec.searchScore === undefined && outRec.holdoutScore === undefined) {\n throw new RunRecordValidationError(\n 'outcome must define searchScore or holdoutScore (or both)',\n 'outcome',\n )\n }\n const raw = outRec.raw\n if (raw === null || typeof raw !== 'object') {\n throw new RunRecordValidationError('outcome.raw must be an object', 'outcome.raw')\n }\n for (const [k, v] of Object.entries(raw as Record<string, unknown>)) {\n expectFiniteNumber(v, `outcome.raw.${k}`)\n }\n\n // Per-judge / per-dim breakdown, optional.\n if (outRec.judgeScores !== undefined) {\n validateJudgeScores(outRec.judgeScores, 'outcome.judgeScores')\n }\n\n // Failure mode optional.\n if (obj.failureMode !== undefined) expectString(obj.failureMode, 'failureMode')\n\n // Split tag.\n if (typeof obj.splitTag !== 'string' || !SPLIT_TAGS.includes(obj.splitTag as RunSplitTag)) {\n throw new RunRecordValidationError(\n `splitTag must be one of ${SPLIT_TAGS.join(', ')}, got ${String(obj.splitTag)}`,\n 'splitTag',\n )\n }\n\n return input as RunRecord\n}\n\n/** Boolean validator — convenience for filtering arrays. */\nexport function isRunRecord(input: unknown): input is RunRecord {\n try {\n validateRunRecord(input)\n return true\n } catch {\n return false\n }\n}\n\n/** Non-throwing validator — returns a discriminated union. */\nexport function parseRunRecordSafe(\n input: unknown,\n): { ok: true; value: RunRecord } | { ok: false; error: RunRecordValidationError } {\n try {\n return { ok: true, value: validateRunRecord(input) }\n } catch (e) {\n if (e instanceof RunRecordValidationError) return { ok: false, error: e }\n throw e\n }\n}\n\n/** Round-trip helper — `JSON.parse(JSON.stringify(record))` then validate. */\nexport function roundTripRunRecord(record: RunRecord): RunRecord {\n const json = JSON.stringify(record)\n return validateRunRecord(JSON.parse(json))\n}\n\n// ── Internals ────────────────────────────────────────────────────────\n\nfunction expectString(value: unknown, path: string): void {\n if (typeof value !== 'string' || value.length === 0) {\n throw new RunRecordValidationError(`expected non-empty string`, path)\n }\n}\n\nfunction expectFiniteNumber(value: unknown, path: string): void {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n throw new RunRecordValidationError(`expected finite number`, path)\n }\n}\n\nfunction validateJudgeScores(value: unknown, path: string): void {\n if (value === null || typeof value !== 'object') {\n throw new RunRecordValidationError('judgeScores must be an object', path)\n }\n const rec = value as Record<string, unknown>\n\n const perJudge = rec.perJudge\n if (perJudge === null || typeof perJudge !== 'object') {\n throw new RunRecordValidationError('perJudge must be an object', `${path}.perJudge`)\n }\n for (const [judgeId, dims] of Object.entries(perJudge as Record<string, unknown>)) {\n if (dims === null || typeof dims !== 'object') {\n throw new RunRecordValidationError(\n 'per-judge entry must be an object of dimension scores',\n `${path}.perJudge.${judgeId}`,\n )\n }\n for (const [dim, score] of Object.entries(dims as Record<string, unknown>)) {\n expectFiniteNumber(score, `${path}.perJudge.${judgeId}.${dim}`)\n }\n }\n\n const perDimMean = rec.perDimMean\n if (perDimMean === null || typeof perDimMean !== 'object') {\n throw new RunRecordValidationError('perDimMean must be an object', `${path}.perDimMean`)\n }\n for (const [dim, mean] of Object.entries(perDimMean as Record<string, unknown>)) {\n expectFiniteNumber(mean, `${path}.perDimMean.${dim}`)\n }\n\n expectFiniteNumber(rec.composite, `${path}.composite`)\n\n if (rec.failedJudges !== undefined) {\n if (!Array.isArray(rec.failedJudges)) {\n throw new RunRecordValidationError(\n 'failedJudges must be an array of strings',\n `${path}.failedJudges`,\n )\n }\n for (let i = 0; i < rec.failedJudges.length; i++) {\n const id = rec.failedJudges[i]\n if (typeof id !== 'string' || id.length === 0) {\n throw new RunRecordValidationError(\n 'failedJudges entry must be a non-empty string',\n `${path}.failedJudges[${i}]`,\n )\n }\n }\n }\n\n if (rec.notes !== undefined && typeof rec.notes !== 'string') {\n throw new RunRecordValidationError('notes must be a string', `${path}.notes`)\n }\n}\n\n/**\n * Heuristic snapshot check. Accepts:\n * - `name@YYYY-MM-DD` (Anthropic style: `claude-sonnet-4-6@2025-04-15`)\n * - `name-YYYYMMDD` (OpenAI style: `gpt-4o-2024-11-20`)\n * - `name@<arbitrary-token>` (allow opaque snapshots like `@v3`)\n * - explicit `:date-...` Vertex-style tags\n *\n * Rejects bare aliases like `claude-sonnet-4` or `gpt-4o` that remap\n * silently as providers ship new snapshots.\n */\nfunction modelHasSnapshot(model: string): boolean {\n if (model.includes('@')) return true\n if (/-\\d{8}$/.test(model)) return true\n if (/-\\d{4}-\\d{2}-\\d{2}$/.test(model)) return true\n if (/:date-/.test(model)) return true\n return false\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,292 +0,0 @@
|
|
|
1
|
-
import { D as DatasetSplit, b as DatasetManifest, a as DatasetScenario } from './dataset-ueRVTUoY.js';
|
|
2
|
-
import { a3 as GateDecision, A as ActionableSideInfo, m as MultiShotTrialResult } from './summary-report-D7AQS7eB.js';
|
|
3
|
-
import { R as RunRecord, a as RunSplitTag } from './run-record-BfX5y68A.js';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Release confidence gate.
|
|
7
|
-
*
|
|
8
|
-
* This is the production-facing composition layer over the lower-level
|
|
9
|
-
* primitives:
|
|
10
|
-
* - Dataset manifests prove corpus/version coverage.
|
|
11
|
-
* - RunRecord rows prove reproducible search/holdout outcomes.
|
|
12
|
-
* - Multi-shot trace evidence carries turn counts and ASI diagnostics.
|
|
13
|
-
* - HeldOutGate decisions remain the paired promotion authority.
|
|
14
|
-
*
|
|
15
|
-
* The gate is intentionally pure and conservative. Missing declared evidence
|
|
16
|
-
* fails closed instead of being treated as a neutral zero.
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
type ReleaseConfidenceStatus = 'pass' | 'warn' | 'fail';
|
|
20
|
-
type ReleaseConfidenceAxisName = 'corpus' | 'quality' | 'generalization' | 'diagnostics' | 'efficiency';
|
|
21
|
-
interface ReleaseTraceEvidence {
|
|
22
|
-
scenarioId: string;
|
|
23
|
-
candidateId?: string;
|
|
24
|
-
split?: RunSplitTag;
|
|
25
|
-
score?: number;
|
|
26
|
-
ok?: boolean;
|
|
27
|
-
turnCount?: number;
|
|
28
|
-
costUsd?: number;
|
|
29
|
-
durationMs?: number;
|
|
30
|
-
failureMode?: string;
|
|
31
|
-
asi?: ActionableSideInfo[];
|
|
32
|
-
metadata?: Record<string, unknown>;
|
|
33
|
-
}
|
|
34
|
-
interface ReleaseConfidenceThresholds {
|
|
35
|
-
/** Require a Dataset manifest or explicit scenarios. Default true. */
|
|
36
|
-
requireCorpus?: boolean;
|
|
37
|
-
minScenarioCount?: number;
|
|
38
|
-
minSearchRuns?: number;
|
|
39
|
-
minHoldoutRuns?: number;
|
|
40
|
-
/** Require at least one holdout scenario/run. Default true. */
|
|
41
|
-
requireHoldout?: boolean;
|
|
42
|
-
minPassRate?: number;
|
|
43
|
-
minMeanScore?: number;
|
|
44
|
-
/** Search mean may exceed holdout mean by at most this much. */
|
|
45
|
-
maxOverfitGap?: number;
|
|
46
|
-
maxMeanCostUsd?: number;
|
|
47
|
-
maxP95WallMs?: number;
|
|
48
|
-
/** Low-score/failed rows must carry ASI. Default true. */
|
|
49
|
-
requireAsiForFailures?: boolean;
|
|
50
|
-
/** Score below this is considered a failure for ASI coverage. Default 0.5. */
|
|
51
|
-
failureScoreThreshold?: number;
|
|
52
|
-
}
|
|
53
|
-
interface ReleaseConfidenceInput {
|
|
54
|
-
target: string;
|
|
55
|
-
candidateId?: string;
|
|
56
|
-
baselineId?: string;
|
|
57
|
-
dataset?: DatasetManifest;
|
|
58
|
-
scenarios?: readonly DatasetScenario[];
|
|
59
|
-
runs?: readonly RunRecord[];
|
|
60
|
-
traces?: readonly ReleaseTraceEvidence[];
|
|
61
|
-
gateDecision?: GateDecision | null;
|
|
62
|
-
thresholds?: ReleaseConfidenceThresholds;
|
|
63
|
-
}
|
|
64
|
-
interface ReleaseConfidenceAxis {
|
|
65
|
-
name: ReleaseConfidenceAxisName;
|
|
66
|
-
status: ReleaseConfidenceStatus;
|
|
67
|
-
score: number;
|
|
68
|
-
detail: string;
|
|
69
|
-
}
|
|
70
|
-
interface ReleaseConfidenceIssue {
|
|
71
|
-
axis: ReleaseConfidenceAxisName;
|
|
72
|
-
severity: 'critical' | 'warning';
|
|
73
|
-
code: string;
|
|
74
|
-
detail: string;
|
|
75
|
-
}
|
|
76
|
-
interface ReleaseConfidenceMetrics {
|
|
77
|
-
scenarioCount: number;
|
|
78
|
-
searchRuns: number;
|
|
79
|
-
holdoutRuns: number;
|
|
80
|
-
passRate: number;
|
|
81
|
-
meanScore: number;
|
|
82
|
-
searchMeanScore: number;
|
|
83
|
-
holdoutMeanScore: number;
|
|
84
|
-
overfitGap: number;
|
|
85
|
-
meanCostUsd: number;
|
|
86
|
-
p95WallMs: number;
|
|
87
|
-
failedRows: number;
|
|
88
|
-
failuresWithAsi: number;
|
|
89
|
-
singleShotTraces: number;
|
|
90
|
-
multiShotTraces: number;
|
|
91
|
-
splitCounts: Record<DatasetSplit, number>;
|
|
92
|
-
domainCounts: Record<string, number>;
|
|
93
|
-
failureModeCounts: Record<string, number>;
|
|
94
|
-
responsibleSurfaceCounts: Record<string, number>;
|
|
95
|
-
}
|
|
96
|
-
interface ReleaseConfidenceScorecard {
|
|
97
|
-
target: string;
|
|
98
|
-
candidateId: string | null;
|
|
99
|
-
baselineId: string | null;
|
|
100
|
-
status: ReleaseConfidenceStatus;
|
|
101
|
-
promote: boolean;
|
|
102
|
-
axes: ReleaseConfidenceAxis[];
|
|
103
|
-
issues: ReleaseConfidenceIssue[];
|
|
104
|
-
metrics: ReleaseConfidenceMetrics;
|
|
105
|
-
dataset: DatasetManifest | null;
|
|
106
|
-
gateDecision: GateDecision | null;
|
|
107
|
-
summary: string;
|
|
108
|
-
}
|
|
109
|
-
declare function releaseTraceEvidenceFromMultiShotTrials(trials: readonly MultiShotTrialResult[]): ReleaseTraceEvidence[];
|
|
110
|
-
declare function evaluateReleaseConfidence(input: ReleaseConfidenceInput): ReleaseConfidenceScorecard;
|
|
111
|
-
declare function assertReleaseConfidence(input: ReleaseConfidenceInput): ReleaseConfidenceScorecard;
|
|
112
|
-
|
|
113
|
-
/**
|
|
114
|
-
* Paper-grade paired statistics for held-out promotion gates.
|
|
115
|
-
*
|
|
116
|
-
* The promotion gate (`HeldOutGate`) needs three things:
|
|
117
|
-
*
|
|
118
|
-
* 1. A bootstrap confidence interval on the per-item paired delta
|
|
119
|
-
* (`pairedBootstrap`). Median delta is the headline number; the
|
|
120
|
-
* CI lower bound is what the gate checks against `pairedDeltaThreshold`.
|
|
121
|
-
* 2. A non-parametric significance test on the paired deltas
|
|
122
|
-
* (`pairedWilcoxon` — re-export of `wilcoxonSignedRank` under the
|
|
123
|
-
* paper-style name).
|
|
124
|
-
* 3. False-discovery-rate correction across simultaneously-tested
|
|
125
|
-
* candidate variants (`bhAdjust` — re-export of `benjaminiHochberg`).
|
|
126
|
-
*
|
|
127
|
-
* Why a separate file: every existing primitive lives in `statistics.ts`
|
|
128
|
-
* (general) or `power-analysis.ts` (correction). Paired-bootstrap is
|
|
129
|
-
* paired-only, paper-grade, and load-bearing for the promotion gate.
|
|
130
|
-
* Putting it next to `statistics.ts` would require editing that file;
|
|
131
|
-
* the brief forbids that. New file, new exports, no surface change.
|
|
132
|
-
*/
|
|
133
|
-
interface PairedBootstrapResult {
|
|
134
|
-
/** Number of paired observations (after dropping unequal lengths is rejected). */
|
|
135
|
-
n: number;
|
|
136
|
-
/** Median of paired deltas (after − before). */
|
|
137
|
-
median: number;
|
|
138
|
-
/** Mean of paired deltas. */
|
|
139
|
-
mean: number;
|
|
140
|
-
/** Lower bound of the bootstrap CI on the median delta. */
|
|
141
|
-
low: number;
|
|
142
|
-
/** Upper bound of the bootstrap CI on the median delta. */
|
|
143
|
-
high: number;
|
|
144
|
-
/** Confidence level used (e.g. 0.95). */
|
|
145
|
-
confidence: number;
|
|
146
|
-
/** Number of bootstrap resamples used. */
|
|
147
|
-
resamples: number;
|
|
148
|
-
}
|
|
149
|
-
interface PairedBootstrapOptions {
|
|
150
|
-
/** Confidence level. Default 0.95. */
|
|
151
|
-
confidence?: number;
|
|
152
|
-
/** Bootstrap resample count. Default 2000. */
|
|
153
|
-
resamples?: number;
|
|
154
|
-
/** Statistic to bootstrap. Default 'median'. */
|
|
155
|
-
statistic?: 'median' | 'mean';
|
|
156
|
-
/** Deterministic seed. If omitted, uses Math.random(). */
|
|
157
|
-
seed?: number;
|
|
158
|
-
}
|
|
159
|
-
/**
|
|
160
|
-
* Paired bootstrap on (after - before) deltas. Returns a CI on the
|
|
161
|
-
* chosen statistic (median by default). Pairs are resampled with
|
|
162
|
-
* replacement. The lower bound is what the promotion gate checks: if
|
|
163
|
-
* `low > pairedDeltaThreshold`, the gain is real at the chosen
|
|
164
|
-
* confidence level.
|
|
165
|
-
*
|
|
166
|
-
* Throws on unequal sample sizes — caller must align pairs upstream.
|
|
167
|
-
*/
|
|
168
|
-
declare function pairedBootstrap(before: number[], after: number[], opts?: PairedBootstrapOptions): PairedBootstrapResult;
|
|
169
|
-
/**
|
|
170
|
-
* Paper-style alias for `wilcoxonSignedRank`. The signed-rank test on
|
|
171
|
-
* paired deltas is the standard non-parametric significance test for
|
|
172
|
-
* "candidate beats baseline on matched items." Use alongside the
|
|
173
|
-
* bootstrap CI: bootstrap gives effect size, Wilcoxon gives p.
|
|
174
|
-
*/
|
|
175
|
-
declare function pairedWilcoxon(before: number[], after: number[]): {
|
|
176
|
-
w: number;
|
|
177
|
-
p: number;
|
|
178
|
-
};
|
|
179
|
-
/**
|
|
180
|
-
* Paper-style alias for `benjaminiHochberg`. Use to correct p-values
|
|
181
|
-
* across multiple candidate-vs-baseline comparisons run in the same
|
|
182
|
-
* promotion sweep. Returns BH-adjusted q-values and significance at
|
|
183
|
-
* the requested FDR (default 0.05).
|
|
184
|
-
*/
|
|
185
|
-
declare function bhAdjust(pValues: number[], fdr?: number): {
|
|
186
|
-
qValues: number[];
|
|
187
|
-
significant: boolean[];
|
|
188
|
-
};
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* Bootstrap-CI promotion gate.
|
|
192
|
-
*
|
|
193
|
-
* In any iterative-improvement loop (GEPA, prompt evolution, dataset
|
|
194
|
-
* curation), the question is "did this generation actually improve, or are
|
|
195
|
-
* we celebrating noise?". With small N and noisy outcomes, point-estimate
|
|
196
|
-
* deltas lie. Bootstrap confidence intervals tell the operator whether the
|
|
197
|
-
* delta is real before code or prompts get promoted.
|
|
198
|
-
*
|
|
199
|
-
* This module is pure functions — no I/O, no model calls. Easy to unit-test
|
|
200
|
-
* and to compose into any verdict gate.
|
|
201
|
-
*
|
|
202
|
-
* Default gate:
|
|
203
|
-
* - Bootstrap mean baseline vs candidate (1k resamples).
|
|
204
|
-
* - Compute the delta distribution; pass if the lower CI bound > 0.
|
|
205
|
-
* - Tunable confidence (default 95%) and resample count.
|
|
206
|
-
*
|
|
207
|
-
* Verdict semantics intentionally match the existing `experiments.jsonl`
|
|
208
|
-
* vocabulary:
|
|
209
|
-
* - ADVANCE: candidate's CI lower bound > baseline mean (real win)
|
|
210
|
-
* - KEEP: overlap, but candidate point estimate >= baseline (neutral)
|
|
211
|
-
* - REVERT: candidate's CI upper bound < baseline mean (real regression)
|
|
212
|
-
* - INCONCLUSIVE: not enough samples or CI straddles zero with no signal
|
|
213
|
-
*/
|
|
214
|
-
type Verdict = 'ADVANCE' | 'KEEP' | 'REVERT' | 'INCONCLUSIVE';
|
|
215
|
-
interface BootstrapResult {
|
|
216
|
-
baselineMean: number;
|
|
217
|
-
candidateMean: number;
|
|
218
|
-
/** candidateMean - baselineMean, point estimate. */
|
|
219
|
-
delta: number;
|
|
220
|
-
/** Lower bound of the (1 - alpha) CI on the delta. */
|
|
221
|
-
ciLower: number;
|
|
222
|
-
/** Upper bound of the (1 - alpha) CI on the delta. */
|
|
223
|
-
ciUpper: number;
|
|
224
|
-
/** Number of bootstrap resamples used. */
|
|
225
|
-
iterations: number;
|
|
226
|
-
alpha: number;
|
|
227
|
-
verdict: Verdict;
|
|
228
|
-
}
|
|
229
|
-
interface BootstrapOptions {
|
|
230
|
-
/** Confidence level alpha (default 0.05 → 95% CI). */
|
|
231
|
-
alpha?: number;
|
|
232
|
-
/** Number of resamples (default 1000). */
|
|
233
|
-
iterations?: number;
|
|
234
|
-
/**
|
|
235
|
-
* Minimum total samples (baseline + candidate) below which we always
|
|
236
|
-
* return INCONCLUSIVE — bootstrap with too few samples is meaningless.
|
|
237
|
-
* Default 6 (combined).
|
|
238
|
-
*/
|
|
239
|
-
minTotalSamples?: number;
|
|
240
|
-
/** RNG seed for reproducibility. Default: Math.random. */
|
|
241
|
-
seed?: number;
|
|
242
|
-
}
|
|
243
|
-
/**
|
|
244
|
-
* Compute the bootstrap CI on (candidateMean - baselineMean) and a verdict.
|
|
245
|
-
*
|
|
246
|
-
* Uses simple percentile bootstrap on the difference of resampled means.
|
|
247
|
-
* That's the standard non-parametric primitive — no distributional
|
|
248
|
-
* assumptions, robust to skew, easy to reason about.
|
|
249
|
-
*/
|
|
250
|
-
declare function bootstrapCi(baseline: number[], candidate: number[], options?: BootstrapOptions): BootstrapResult;
|
|
251
|
-
/**
|
|
252
|
-
* Judge-replay promotion gate.
|
|
253
|
-
*
|
|
254
|
-
* The cheap inner-loop judge that drives an evolution run is by definition
|
|
255
|
-
* fast and noisy. When you're about to promote a winning variant to the
|
|
256
|
-
* canonical default, you want a STRONGER judge (a more expensive model, a
|
|
257
|
-
* human grader, a separately-trained reward model) to confirm the win
|
|
258
|
-
* generalises beyond the inner loop.
|
|
259
|
-
*
|
|
260
|
-
* This helper takes raw winner + baseline outputs, scores both through the
|
|
261
|
-
* stronger judge, and applies `bootstrapCi`. ADVANCE means the stronger
|
|
262
|
-
* judge agrees the winner is real with the configured confidence. Doesn't
|
|
263
|
-
* matter what shape your "output" is — pass a string, an object, anything
|
|
264
|
-
* the judge can read.
|
|
265
|
-
*/
|
|
266
|
-
interface JudgeReplayGateArgs<TOutput> {
|
|
267
|
-
baselineOutputs: TOutput[];
|
|
268
|
-
candidateOutputs: TOutput[];
|
|
269
|
-
/** Stronger judge — async to allow LLM calls. Return a 0..N scalar score. */
|
|
270
|
-
judge: (output: TOutput) => Promise<number> | number;
|
|
271
|
-
alpha?: number;
|
|
272
|
-
iterations?: number;
|
|
273
|
-
/** RNG seed for reproducibility. */
|
|
274
|
-
seed?: number;
|
|
275
|
-
/** Maximum concurrent judge calls. Default 4. */
|
|
276
|
-
judgeConcurrency?: number;
|
|
277
|
-
}
|
|
278
|
-
declare function judgeReplayGate<TOutput>(args: JudgeReplayGateArgs<TOutput>): Promise<BootstrapResult & {
|
|
279
|
-
baselineSamples: number;
|
|
280
|
-
candidateSamples: number;
|
|
281
|
-
}>;
|
|
282
|
-
|
|
283
|
-
interface RenderReleaseReportOptions {
|
|
284
|
-
title?: string;
|
|
285
|
-
runs?: readonly RunRecord[];
|
|
286
|
-
comparator?: string;
|
|
287
|
-
traceAnalystFindings?: readonly string[];
|
|
288
|
-
nextActions?: readonly string[];
|
|
289
|
-
}
|
|
290
|
-
declare function renderReleaseReport(scorecard: ReleaseConfidenceScorecard, options?: RenderReleaseReportOptions): string;
|
|
291
|
-
|
|
292
|
-
export { type BootstrapOptions as B, type JudgeReplayGateArgs as J, type PairedBootstrapOptions as P, type ReleaseConfidenceAxis as R, type Verdict as V, type BootstrapResult as a, type PairedBootstrapResult as b, type ReleaseConfidenceAxisName as c, type ReleaseConfidenceInput as d, type ReleaseConfidenceIssue as e, type ReleaseConfidenceMetrics as f, type ReleaseConfidenceScorecard as g, type ReleaseConfidenceStatus as h, type ReleaseConfidenceThresholds as i, type ReleaseTraceEvidence as j, type RenderReleaseReportOptions as k, assertReleaseConfidence as l, bhAdjust as m, bootstrapCi as n, evaluateReleaseConfidence as o, judgeReplayGate as p, pairedBootstrap as q, pairedWilcoxon as r, releaseTraceEvidenceFromMultiShotTrials as s, renderReleaseReport as t };
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|