wicked-crew 0.16.4 → 0.16.6

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.
Files changed (158) hide show
  1. package/dist/api/ask-paths.d.ts +5 -2
  2. package/dist/api/ask-paths.d.ts.map +1 -1
  3. package/dist/api/ask-paths.js +6 -3
  4. package/dist/api/ask-paths.js.map +1 -1
  5. package/dist/api/chat-scope.d.ts +8 -3
  6. package/dist/api/chat-scope.d.ts.map +1 -1
  7. package/dist/api/chat-scope.js +17 -5
  8. package/dist/api/chat-scope.js.map +1 -1
  9. package/dist/api/chat-workflow.d.ts +60 -0
  10. package/dist/api/chat-workflow.d.ts.map +1 -0
  11. package/dist/api/chat-workflow.js +80 -0
  12. package/dist/api/chat-workflow.js.map +1 -0
  13. package/dist/api/endpoint-manifest-live.d.ts.map +1 -1
  14. package/dist/api/endpoint-manifest-live.js +2 -0
  15. package/dist/api/endpoint-manifest-live.js.map +1 -1
  16. package/dist/api/needs.d.ts +116 -0
  17. package/dist/api/needs.d.ts.map +1 -0
  18. package/dist/api/needs.js +618 -0
  19. package/dist/api/needs.js.map +1 -0
  20. package/dist/api/routes.d.ts +23 -1
  21. package/dist/api/routes.d.ts.map +1 -1
  22. package/dist/api/routes.js +297 -25
  23. package/dist/api/routes.js.map +1 -1
  24. package/dist/api/run-liveness.d.ts +8 -0
  25. package/dist/api/run-liveness.d.ts.map +1 -1
  26. package/dist/api/run-liveness.js +39 -7
  27. package/dist/api/run-liveness.js.map +1 -1
  28. package/dist/api/run-timing-index.d.ts +6 -0
  29. package/dist/api/run-timing-index.d.ts.map +1 -1
  30. package/dist/api/run-timing-index.js +18 -0
  31. package/dist/api/run-timing-index.js.map +1 -1
  32. package/dist/api/server.d.ts +8 -0
  33. package/dist/api/server.d.ts.map +1 -1
  34. package/dist/api/server.js +149 -3
  35. package/dist/api/server.js.map +1 -1
  36. package/dist/api/system-snapshot.d.ts +7 -15
  37. package/dist/api/system-snapshot.d.ts.map +1 -1
  38. package/dist/api/system-snapshot.js +7 -115
  39. package/dist/api/system-snapshot.js.map +1 -1
  40. package/dist/core/run-identity.d.ts.map +1 -1
  41. package/dist/core/run-identity.js +3 -0
  42. package/dist/core/run-identity.js.map +1 -1
  43. package/dist/evals/capture.d.ts +93 -0
  44. package/dist/evals/capture.d.ts.map +1 -0
  45. package/dist/evals/capture.js +419 -0
  46. package/dist/evals/capture.js.map +1 -0
  47. package/dist/evals/replay.d.ts +33 -0
  48. package/dist/evals/replay.d.ts.map +1 -0
  49. package/dist/evals/replay.js +87 -0
  50. package/dist/evals/replay.js.map +1 -0
  51. package/dist/evals/routes.d.ts +48 -0
  52. package/dist/evals/routes.d.ts.map +1 -0
  53. package/dist/evals/routes.js +121 -0
  54. package/dist/evals/routes.js.map +1 -0
  55. package/dist/evals/run-cli.d.ts +31 -0
  56. package/dist/evals/run-cli.d.ts.map +1 -0
  57. package/dist/evals/run-cli.js +128 -0
  58. package/dist/evals/run-cli.js.map +1 -0
  59. package/dist/evals/runner.d.ts +34 -0
  60. package/dist/evals/runner.d.ts.map +1 -0
  61. package/dist/evals/runner.js +181 -0
  62. package/dist/evals/runner.js.map +1 -0
  63. package/dist/evals/score.d.ts +31 -0
  64. package/dist/evals/score.d.ts.map +1 -0
  65. package/dist/evals/score.js +191 -0
  66. package/dist/evals/score.js.map +1 -0
  67. package/dist/evals/seed-needs-you.d.ts +17 -0
  68. package/dist/evals/seed-needs-you.d.ts.map +1 -0
  69. package/dist/evals/seed-needs-you.js +57 -0
  70. package/dist/evals/seed-needs-you.js.map +1 -0
  71. package/dist/evals/seed-rig.d.ts +9 -0
  72. package/dist/evals/seed-rig.d.ts.map +1 -0
  73. package/dist/evals/seed-rig.js +156 -0
  74. package/dist/evals/seed-rig.js.map +1 -0
  75. package/dist/evals/stats.d.ts +31 -0
  76. package/dist/evals/stats.d.ts.map +1 -0
  77. package/dist/evals/stats.js +59 -0
  78. package/dist/evals/stats.js.map +1 -0
  79. package/dist/evals/steering.d.ts +9 -0
  80. package/dist/evals/steering.d.ts.map +1 -0
  81. package/dist/evals/steering.js +25 -0
  82. package/dist/evals/steering.js.map +1 -0
  83. package/dist/evals/store.d.ts +26 -0
  84. package/dist/evals/store.d.ts.map +1 -0
  85. package/dist/evals/store.js +96 -0
  86. package/dist/evals/store.js.map +1 -0
  87. package/dist/evals/synthetic.d.ts +17 -0
  88. package/dist/evals/synthetic.d.ts.map +1 -0
  89. package/dist/evals/synthetic.js +71 -0
  90. package/dist/evals/synthetic.js.map +1 -0
  91. package/dist/evals/types.d.ts +29 -0
  92. package/dist/evals/types.d.ts.map +1 -0
  93. package/dist/evals/types.js +25 -0
  94. package/dist/evals/types.js.map +1 -0
  95. package/dist/evals/workflow.d.ts +33 -0
  96. package/dist/evals/workflow.d.ts.map +1 -0
  97. package/dist/evals/workflow.js +66 -0
  98. package/dist/evals/workflow.js.map +1 -0
  99. package/dist/insights/analyze-cli.d.ts +18 -0
  100. package/dist/insights/analyze-cli.d.ts.map +1 -0
  101. package/dist/insights/analyze-cli.js +71 -0
  102. package/dist/insights/analyze-cli.js.map +1 -0
  103. package/dist/insights/analyze.d.ts +136 -0
  104. package/dist/insights/analyze.d.ts.map +1 -0
  105. package/dist/insights/analyze.js +358 -0
  106. package/dist/insights/analyze.js.map +1 -0
  107. package/dist/insights/review-service.d.ts +127 -0
  108. package/dist/insights/review-service.d.ts.map +1 -0
  109. package/dist/insights/review-service.js +392 -0
  110. package/dist/insights/review-service.js.map +1 -0
  111. package/dist/insights/routes.d.ts +15 -0
  112. package/dist/insights/routes.d.ts.map +1 -0
  113. package/dist/insights/routes.js +66 -0
  114. package/dist/insights/routes.js.map +1 -0
  115. package/dist/insights/run-facts.d.ts +64 -0
  116. package/dist/insights/run-facts.d.ts.map +1 -0
  117. package/dist/insights/run-facts.js +152 -0
  118. package/dist/insights/run-facts.js.map +1 -0
  119. package/dist/insights/stats.d.ts +38 -0
  120. package/dist/insights/stats.d.ts.map +1 -0
  121. package/dist/insights/stats.js +102 -0
  122. package/dist/insights/stats.js.map +1 -0
  123. package/dist/insights/store.d.ts +89 -0
  124. package/dist/insights/store.d.ts.map +1 -0
  125. package/dist/insights/store.js +87 -0
  126. package/dist/insights/store.js.map +1 -0
  127. package/dist/insights/workflow.d.ts +22 -0
  128. package/dist/insights/workflow.d.ts.map +1 -0
  129. package/dist/insights/workflow.js +39 -0
  130. package/dist/insights/workflow.js.map +1 -0
  131. package/dist/qe/ledger.d.ts +15 -0
  132. package/dist/qe/ledger.d.ts.map +1 -1
  133. package/dist/qe/ledger.js +24 -0
  134. package/dist/qe/ledger.js.map +1 -1
  135. package/dist/schedules/routes.d.ts +48 -0
  136. package/dist/schedules/routes.d.ts.map +1 -0
  137. package/dist/schedules/routes.js +72 -0
  138. package/dist/schedules/routes.js.map +1 -0
  139. package/dist/schedules/scheduler.d.ts +58 -0
  140. package/dist/schedules/scheduler.d.ts.map +1 -0
  141. package/dist/schedules/scheduler.js +194 -0
  142. package/dist/schedules/scheduler.js.map +1 -0
  143. package/dist/schedules/store.d.ts +67 -0
  144. package/dist/schedules/store.d.ts.map +1 -0
  145. package/dist/schedules/store.js +148 -0
  146. package/dist/schedules/store.js.map +1 -0
  147. package/dist/skills/runtime.d.ts +12 -2
  148. package/dist/skills/runtime.d.ts.map +1 -1
  149. package/dist/skills/runtime.js +27 -1
  150. package/dist/skills/runtime.js.map +1 -1
  151. package/dist/team/routes.d.ts +10 -0
  152. package/dist/team/routes.d.ts.map +1 -1
  153. package/dist/team/routes.js +3 -0
  154. package/dist/team/routes.js.map +1 -1
  155. package/endpoint-manifest.json +132 -1
  156. package/package.json +4 -3
  157. package/workflows/review-recent-work.json +54 -0
  158. package/workflows/run-evals.json +29 -0
@@ -0,0 +1,121 @@
1
+ /**
2
+ * `/api/v1/testing/default-evals*` (DES-DEFAULT-EVALS-001 §7): run the default evals over this daemon's own run
3
+ * store, per project or across projects, and read the history.
4
+ *
5
+ * GET /testing/default-evals/suites what each suite checks, and whether crew can replay it
6
+ * POST /testing/default-evals/run {project?: string | "all", suites?: SuiteId[], baseline?: boolean}
7
+ * GET /testing/default-evals the history, newest first
8
+ * GET /testing/default-evals/:id one run's report and its cases
9
+ *
10
+ * Everything is read from the run store (sessions, events, decisions, QE ledgers, the latest steering eval); the
11
+ * only write is the report itself, under `<home>/evals/default/`.
12
+ */
13
+ import { randomUUID } from 'node:crypto';
14
+ import { z } from 'zod';
15
+ import { API_PREFIX } from '../api/api-prefix.js';
16
+ import { readRunVerdicts, runQeLedgerRoot } from '../qe/ledger.js';
17
+ import { captureAll } from './capture.js';
18
+ import { runDefaultEvals, SUITE_TITLES } from './runner.js';
19
+ import { needsYouSeed } from './seed-needs-you.js';
20
+ import { RIG_SEED } from './seed-rig.js';
21
+ import { steeringCasesFrom } from './steering.js';
22
+ import { syntheticSuites } from './synthetic.js';
23
+ import { SUITE_IDS } from './types.js';
24
+ const V = API_PREFIX;
25
+ const RunBody = z
26
+ .object({
27
+ project: z.string().trim().min(1).max(200).optional(),
28
+ suites: z.array(z.enum(SUITE_IDS)).min(1).optional(),
29
+ baseline: z.boolean().optional(),
30
+ })
31
+ .strict();
32
+ /** The cases this daemon's own store yields right now (and the baseline, when asked for). */
33
+ export async function gatherCases(deps, opts) {
34
+ const runs = await deps.runs();
35
+ const events = new Map();
36
+ const qeVerdicts = [];
37
+ for (const run of runs) {
38
+ const id = typeof run.session['id'] === 'string' ? run.session['id'] : null;
39
+ if (id === null)
40
+ continue;
41
+ events.set(id, (await deps.events(id)) ?? []);
42
+ const root = runQeLedgerRoot(run.session, null);
43
+ if (root === null)
44
+ continue;
45
+ try {
46
+ for (const v of readRunVerdicts(root, id))
47
+ qeVerdicts.push({ runId: id, ...v });
48
+ }
49
+ catch {
50
+ // an unreadable ledger is that run's QE cases missing, never the eval failing
51
+ }
52
+ }
53
+ const input = { runs, events: (id) => events.get(id) ?? [], decisions: deps.decisions(), qeVerdicts };
54
+ const live = captureAll(input);
55
+ let steering = [];
56
+ if (deps.steeringEvals !== undefined) {
57
+ const latest = (await deps.steeringEvals.list())[0];
58
+ if (latest !== undefined)
59
+ steering = steeringCasesFrom(await deps.steeringEvals.get(latest.id));
60
+ }
61
+ const baseline = opts.baseline ? [...RIG_SEED, ...needsYouSeed()] : [];
62
+ // Live cases come last: a live capture of a baseline case replaces it (same id), so nothing counts twice.
63
+ const liveIds = new Set(live.map((c) => c.id));
64
+ return [...baseline.filter((c) => !liveIds.has(c.id)), ...live, ...steering];
65
+ }
66
+ /** Run the default evals over this daemon's store and keep the report: the one path the route, the `run-evals`
67
+ * workflow's launch and the schedule share. */
68
+ export async function runAndRecord(deps, opts) {
69
+ const cases = await gatherCases(deps, { baseline: opts.baseline });
70
+ const { report, cases: scored } = await runDefaultEvals({
71
+ id: opts.id,
72
+ now: opts.now,
73
+ project: opts.project,
74
+ cases,
75
+ replay: deps.replay,
76
+ previous: deps.store !== undefined ? await deps.store.previous(opts.project) : {},
77
+ ...(opts.suites !== undefined ? { suites: opts.suites } : {}),
78
+ });
79
+ if (deps.store !== undefined)
80
+ await deps.store.record({ report, cases: scored });
81
+ return report;
82
+ }
83
+ export function registerDefaultEvalRoutes(app, deps) {
84
+ const now = deps.now ?? (() => new Date());
85
+ const newId = deps.newId ?? (() => randomUUID());
86
+ app.get(`${V}/testing/default-evals/suites`, { config: { manifest: { responseType: 'DefaultEvalSuitesResponse', statusCodes: [200] } } }, async () => {
87
+ const synth = new Set(syntheticSuites());
88
+ return {
89
+ suites: SUITE_IDS.map((id) => ({
90
+ id,
91
+ title: SUITE_TITLES[id],
92
+ replay: deps.replay.adapters[id] !== undefined || id === 'steering',
93
+ synthetic: synth.has(id),
94
+ note: deps.replay.missing[id] ?? null,
95
+ })),
96
+ };
97
+ });
98
+ app.post(`${V}/testing/default-evals/run`, { config: { manifest: { requestType: 'RunDefaultEvalsBody', responseType: 'DefaultEvalReport', statusCodes: [200, 400] } } }, async (req, reply) => {
99
+ const parsed = RunBody.safeParse(req.body ?? {});
100
+ if (!parsed.success)
101
+ return reply.code(400).send({ error: 'invalid default-evals run body', details: parsed.error.issues });
102
+ const project = parsed.data.project === undefined || parsed.data.project === 'all' ? null : parsed.data.project;
103
+ const report = await runAndRecord(deps, {
104
+ project,
105
+ baseline: parsed.data.baseline === true,
106
+ ...(parsed.data.suites !== undefined ? { suites: parsed.data.suites } : {}),
107
+ id: newId(),
108
+ now: now(),
109
+ });
110
+ return report;
111
+ });
112
+ app.get(`${V}/testing/default-evals`, { config: { manifest: { responseType: 'ListDefaultEvalRunsResponse', statusCodes: [200] } } }, async () => ({ runs: deps.store !== undefined ? await deps.store.list() : [] }));
113
+ app.get(`${V}/testing/default-evals/:id`, { config: { manifest: { responseType: 'DefaultEvalDetail', statusCodes: [200, 404] } } }, async (req, reply) => {
114
+ const { id } = req.params;
115
+ const detail = deps.store !== undefined ? await deps.store.get(id) : null;
116
+ if (detail === null)
117
+ return reply.code(404).send({ error: `no default-eval run ${id}` });
118
+ return detail;
119
+ });
120
+ }
121
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/evals/routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * `run-evals` (DES-DEFAULT-EVALS-001 §7): the Tool step of the `run-evals` workflow, and a plain command.
4
+ *
5
+ * node dist/evals/run-cli.js [--daemon <url>] [--project <id>|all] [--baseline] [--out <file>]
6
+ * node dist/evals/run-cli.js --runs-dir <dir> (the workflow's Tool step)
7
+ *
8
+ * From a shell, the daemon is `--daemon`, else `$WICKED_CREW_URL`; with neither it refuses (it never guesses a port).
9
+ * As the `run-evals` workflow's Tool step it calls nothing: the daemon ran the evals when it launched the run and
10
+ * wrote `<dir>/$WICKED_RUN_ID/report.json`; the step reads that back and prints its summary.
11
+ *
12
+ * It asks the daemon to run the default evals (`POST /api/v1/testing/default-evals/run`), so the daemon's own store
13
+ * is what gets scored and the report is stored where studio reads it. It prints a short plain summary, writes the
14
+ * full report to `--out` when given, and exits 0 on a completed run (a regression is a finding, not a failure),
15
+ * 1 when the daemon refused or could not be reached.
16
+ */
17
+ import type { DefaultEvalReport } from './types.js';
18
+ export interface CliArgs {
19
+ /** `null` until named: the CLI never guesses a port, since a default could reach another daemon. */
20
+ daemon: string | null;
21
+ project: string | null;
22
+ baseline: boolean;
23
+ out: string | null;
24
+ /** The workflow's mode: read `<runsDir>/$WICKED_RUN_ID/report.json` back instead of calling a daemon. */
25
+ runsDir: string | null;
26
+ }
27
+ export declare function parseArgs(argv: readonly string[], env?: NodeJS.ProcessEnv): CliArgs;
28
+ /** The plain summary: one line per suite, too-few marked, then the drift keys. */
29
+ export declare function summaryLines(r: DefaultEvalReport): string[];
30
+ export declare function main(argv: readonly string[], fetchImpl?: typeof fetch, env?: NodeJS.ProcessEnv): Promise<number>;
31
+ //# sourceMappingURL=run-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-cli.d.ts","sourceRoot":"","sources":["../../src/evals/run-cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG;AAKH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,WAAW,OAAO;IACtB,oGAAoG;IACpG,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,yGAAyG;IACzG,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CA0BhG;AAMD,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,CAAC,EAAE,iBAAiB,GAAG,MAAM,EAAE,CAc3D;AAED,wBAAsB,IAAI,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,SAAS,GAAE,OAAO,KAAa,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgD1I"}
@@ -0,0 +1,128 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * `run-evals` (DES-DEFAULT-EVALS-001 §7): the Tool step of the `run-evals` workflow, and a plain command.
4
+ *
5
+ * node dist/evals/run-cli.js [--daemon <url>] [--project <id>|all] [--baseline] [--out <file>]
6
+ * node dist/evals/run-cli.js --runs-dir <dir> (the workflow's Tool step)
7
+ *
8
+ * From a shell, the daemon is `--daemon`, else `$WICKED_CREW_URL`; with neither it refuses (it never guesses a port).
9
+ * As the `run-evals` workflow's Tool step it calls nothing: the daemon ran the evals when it launched the run and
10
+ * wrote `<dir>/$WICKED_RUN_ID/report.json`; the step reads that back and prints its summary.
11
+ *
12
+ * It asks the daemon to run the default evals (`POST /api/v1/testing/default-evals/run`), so the daemon's own store
13
+ * is what gets scored and the report is stored where studio reads it. It prints a short plain summary, writes the
14
+ * full report to `--out` when given, and exits 0 on a completed run (a regression is a finding, not a failure),
15
+ * 1 when the daemon refused or could not be reached.
16
+ */
17
+ import { readFileSync, writeFileSync } from 'node:fs';
18
+ import { join } from 'node:path';
19
+ export function parseArgs(argv, env = process.env) {
20
+ const args = {
21
+ daemon: env['WICKED_CREW_URL'] !== undefined && env['WICKED_CREW_URL'] !== '' ? env['WICKED_CREW_URL'].replace(/\/+$/, '') : null,
22
+ project: null,
23
+ baseline: false,
24
+ out: null,
25
+ runsDir: null,
26
+ };
27
+ for (let i = 0; i < argv.length; i += 1) {
28
+ const a = argv[i];
29
+ const next = () => {
30
+ const v = argv[i + 1];
31
+ if (v === undefined)
32
+ throw new Error(`${a} needs a value`);
33
+ i += 1;
34
+ return v;
35
+ };
36
+ if (a === '--daemon')
37
+ args.daemon = next().replace(/\/+$/, '');
38
+ else if (a === '--project') {
39
+ const p = next();
40
+ args.project = p === 'all' ? null : p;
41
+ }
42
+ else if (a === '--baseline')
43
+ args.baseline = true;
44
+ else if (a === '--out')
45
+ args.out = next();
46
+ else if (a === '--runs-dir')
47
+ args.runsDir = next();
48
+ else
49
+ throw new Error(`unknown argument ${String(a)}`);
50
+ }
51
+ return args;
52
+ }
53
+ function pct(v) {
54
+ return v === null ? '—' : `${Math.round(v * 100)}%`;
55
+ }
56
+ /** The plain summary: one line per suite, too-few marked, then the drift keys. */
57
+ export function summaryLines(r) {
58
+ const lines = [
59
+ `default evals ${r.id} (${r.project ?? 'every project'}): ${r.counts.real} real, ${r.counts.synthetic} synthetic` +
60
+ `${r.counts.baseline > 0 ? `, ${r.counts.baseline} from the shipped baseline` : ''}, ${r.counts.unscored} not scored`,
61
+ ];
62
+ for (const s of r.suites) {
63
+ const a = s.combined.agreement;
64
+ const figure = a.n === 0 ? 'no cases' : a.tooFew ? `too few cases (n=${a.n})` : `${pct(a.value)} agree (${pct(a.lo)}–${pct(a.hi)}, n=${a.n})`;
65
+ lines.push(` ${s.suite}: ${figure}; trend ${s.trend.word}`);
66
+ }
67
+ for (const d of r.drift) {
68
+ lines.push(` drift ${d.suite} ${d.inputKey} by ${d.axis}: ${Object.entries(d.observed).map(([p, v]) => `${p}=${v.join('|')}`).join(', ')}`);
69
+ }
70
+ return lines;
71
+ }
72
+ export async function main(argv, fetchImpl = fetch, env = process.env) {
73
+ let args;
74
+ try {
75
+ args = parseArgs(argv, env);
76
+ }
77
+ catch (err) {
78
+ process.stderr.write(`run-evals: ${err instanceof Error ? err.message : String(err)}\n`);
79
+ return 1;
80
+ }
81
+ if (args.runsDir !== null) {
82
+ const runId = env['WICKED_RUN_ID'];
83
+ if (runId === undefined || runId === '' || !/^[A-Za-z0-9_.-]+$/.test(runId)) {
84
+ process.stderr.write('run-evals: --runs-dir needs the run id in WICKED_RUN_ID (the engine hands it to every Tool step)\n');
85
+ return 1;
86
+ }
87
+ let report;
88
+ try {
89
+ report = JSON.parse(readFileSync(join(args.runsDir, runId, 'report.json'), 'utf8'));
90
+ }
91
+ catch (err) {
92
+ process.stderr.write(`run-evals: the daemon prepared no report for run ${runId}: ${err instanceof Error ? err.message : String(err)}\n`);
93
+ return 1;
94
+ }
95
+ process.stdout.write(`${summaryLines(report).join('\n')}\n`);
96
+ return 0;
97
+ }
98
+ if (args.daemon === null) {
99
+ process.stderr.write('run-evals: no daemon named: pass --daemon <url> or set WICKED_CREW_URL (it never guesses a port)\n');
100
+ return 1;
101
+ }
102
+ const body = { ...(args.project !== null ? { project: args.project } : {}), ...(args.baseline ? { baseline: true } : {}) };
103
+ let res;
104
+ try {
105
+ res = await fetchImpl(`${args.daemon}/api/v1/testing/default-evals/run`, {
106
+ method: 'POST',
107
+ headers: { 'content-type': 'application/json' },
108
+ body: JSON.stringify(body),
109
+ });
110
+ }
111
+ catch (err) {
112
+ process.stderr.write(`run-evals: the daemon at ${args.daemon} did not answer: ${err instanceof Error ? err.message : String(err)}\n`);
113
+ return 1;
114
+ }
115
+ if (!res.ok) {
116
+ process.stderr.write(`run-evals: the daemon refused (${res.status}): ${(await res.text()).slice(0, 300)}\n`);
117
+ return 1;
118
+ }
119
+ const report = (await res.json());
120
+ if (args.out !== null)
121
+ writeFileSync(args.out, JSON.stringify(report, null, 2));
122
+ process.stdout.write(`${summaryLines(report).join('\n')}\n`);
123
+ return 0;
124
+ }
125
+ if (process.argv[1] !== undefined && /run-cli\.(js|ts)$/.test(process.argv[1])) {
126
+ void main(process.argv.slice(2)).then((code) => process.exit(code));
127
+ }
128
+ //# sourceMappingURL=run-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-cli.js","sourceRoot":"","sources":["../../src/evals/run-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * The default-evals runner (DES-DEFAULT-EVALS-001 §5): one project, or every project, scored suite by suite, with
3
+ * synthetic cases filling the gaps and the normalization drift a cross-project run surfaces. Deterministic given its
4
+ * inputs: the clock and the run id are passed in, and the only side effect is the replay adapters' subprocesses.
5
+ */
6
+ import type { ReplaySet } from './replay.js';
7
+ import { type DefaultEvalReport, type DefaultEvalSummary, type EvalCase, type SuiteId, type SuiteScore } from './types.js';
8
+ export declare const SUITE_TITLES: Record<SuiteId, string>;
9
+ export type PreviousScores = Partial<Record<SuiteId, {
10
+ runId: string;
11
+ score: SuiteScore;
12
+ }>>;
13
+ /** The most recent score of each suite across stored reports, newest first. */
14
+ export declare function previousScores(reports: readonly DefaultEvalReport[]): PreviousScores;
15
+ export interface RunInput {
16
+ id: string;
17
+ now: Date;
18
+ /** `null` = every project. */
19
+ project: string | null;
20
+ /** Real cases (captured and seeded) and the steering eval's cases. Synthetic ones are generated here. */
21
+ cases: EvalCase[];
22
+ replay: ReplaySet;
23
+ /** Per suite, the most recent stored score of the same scope and its run id (a run that skipped the suite is
24
+ * passed over), for the trend. */
25
+ previous: PreviousScores;
26
+ /** Limit to these suites (all when absent). */
27
+ suites?: SuiteId[];
28
+ }
29
+ export declare function runDefaultEvals(input: RunInput): Promise<{
30
+ report: DefaultEvalReport;
31
+ cases: EvalCase[];
32
+ }>;
33
+ export declare function summarize(report: DefaultEvalReport): DefaultEvalSummary;
34
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/evals/runner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAa,KAAK,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,KAAK,QAAQ,EAAmB,KAAK,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAEvJ,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAShD,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,CAAC,CAAC,CAAC;AAE5F,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,OAAO,EAAE,SAAS,iBAAiB,EAAE,GAAG,cAAc,CAIpF;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,IAAI,CAAC;IACV,8BAA8B;IAC9B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,yGAAyG;IACzG,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,MAAM,EAAE,SAAS,CAAC;IAClB;uCACmC;IACnC,QAAQ,EAAE,cAAc,CAAC;IACzB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;CACpB;AAyBD,wBAAsB,eAAe,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,iBAAiB,CAAC;IAAC,KAAK,EAAE,QAAQ,EAAE,CAAA;CAAE,CAAC,CA0GhH;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,iBAAiB,GAAG,kBAAkB,CAevE"}
@@ -0,0 +1,181 @@
1
+ /**
2
+ * The default-evals runner (DES-DEFAULT-EVALS-001 §5): one project, or every project, scored suite by suite, with
3
+ * synthetic cases filling the gaps and the normalization drift a cross-project run surfaces. Deterministic given its
4
+ * inputs: the clock and the run id are passed in, and the only side effect is the replay adapters' subprocesses.
5
+ */
6
+ import { driftKeys, normalizationRate, scoreSlice, slices } from './score.js';
7
+ import { rate, trendOf, MIN_CALIBRATION, MIN_CASES } from './stats.js';
8
+ import { generateSynthetic } from './synthetic.js';
9
+ import { SUITE_IDS } from './types.js';
10
+ export const SUITE_TITLES = {
11
+ 'needs-you': 'What needs you: what counts, and what is one item',
12
+ 'floor-class': 'Floor decisions: pass, real failure, base red, inconclusive, boundary deny',
13
+ 'qe-verdict': 'QE verdicts: pass, fail, inconclusive, and one answer per tree',
14
+ attribution: 'Who built it: authors and the creator a review checks',
15
+ steering: 'Steering rules: block the bad, leave the good alone',
16
+ recall: 'Memory recall: the memories a step needs surface',
17
+ archetype: 'Prompt routing: which kind of work a prompt asks for',
18
+ normalization: 'Normalizing: the same input judged the same in every project and surface',
19
+ };
20
+ /** The most recent score of each suite across stored reports, newest first. */
21
+ export function previousScores(reports) {
22
+ const out = {};
23
+ for (const r of reports)
24
+ for (const sc of r.suites)
25
+ if (out[sc.suite] === undefined)
26
+ out[sc.suite] = { runId: r.id, score: sc };
27
+ return out;
28
+ }
29
+ function dedupe(cases) {
30
+ const by = new Map();
31
+ for (const c of cases)
32
+ by.set(c.id, c);
33
+ return [...by.values()].sort((a, b) => a.id.localeCompare(b.id));
34
+ }
35
+ function inScope(c, project) {
36
+ return project === null || c.project === project || (c.source === 'synthetic' && c.project === null);
37
+ }
38
+ function group(cases, keyOf) {
39
+ const by = new Map();
40
+ for (const c of cases) {
41
+ const k = keyOf(c);
42
+ if (k === null)
43
+ continue;
44
+ by.set(k, [...(by.get(k) ?? []), c]);
45
+ }
46
+ if (by.size === 0)
47
+ return undefined;
48
+ const out = {};
49
+ for (const [k, cs] of [...by.entries()].sort(([a], [b]) => a.localeCompare(b)))
50
+ out[k] = scoreSlice(cs);
51
+ return out;
52
+ }
53
+ export async function runDefaultEvals(input) {
54
+ const wanted = new Set(input.suites ?? SUITE_IDS);
55
+ // Normalization is computed over every other suite's cases, so asking for it keeps them all (codex/agy r1);
56
+ // otherwise only the asked-for suites' cases are read.
57
+ const reads = (c) => wanted.has('normalization') || wanted.has(c.suite);
58
+ const given = dedupe(input.cases).filter((c) => inScope(c, input.project) && reads(c));
59
+ const givenIds = new Set(given.map((c) => c.id));
60
+ const synthetic = generateSynthetic(given).filter((c) => reads(c) && !givenIds.has(c.id));
61
+ let cases = [...given, ...synthetic];
62
+ // Replay: the current classifier answers every case that has no recorded answer.
63
+ const notes = new Map();
64
+ const note = (s, line) => {
65
+ notes.set(s, [...(notes.get(s) ?? []), line]);
66
+ };
67
+ for (const suite of SUITE_IDS) {
68
+ const waiting = cases.filter((c) => c.suite === suite && c.observed === null);
69
+ if (waiting.length === 0)
70
+ continue;
71
+ const adapter = input.replay.adapters[suite];
72
+ if (adapter === undefined) {
73
+ note(suite, `${waiting.length} case(s) not scored: ${input.replay.missing[suite] ?? 'no replay adapter'}`);
74
+ continue;
75
+ }
76
+ try {
77
+ const answers = await adapter.replay(waiting);
78
+ cases = cases.map((c) => (c.observed === null && answers.has(c.id) ? { ...c, observed: answers.get(c.id) } : c));
79
+ const left = waiting.length - answers.size;
80
+ if (left > 0)
81
+ note(suite, `${left} case(s) the replay adapter could not answer`);
82
+ }
83
+ catch (err) {
84
+ note(suite, `replay failed, ${waiting.length} case(s) not scored: ${err instanceof Error ? err.message : String(err)}`);
85
+ }
86
+ }
87
+ const drift = driftKeys(cases);
88
+ const suites = [];
89
+ for (const suite of SUITE_IDS) {
90
+ if (!wanted.has(suite))
91
+ continue;
92
+ const prevEntry = input.previous[suite];
93
+ const prev = prevEntry?.score ?? null;
94
+ const prevId = prevEntry?.runId ?? null;
95
+ if (suite === 'normalization') {
96
+ const { compared, consistent } = normalizationRate(cases, drift);
97
+ const real = scoreSlice([]);
98
+ real.cases = compared;
99
+ real.agreement = rate(consistent, compared);
100
+ const empty = scoreSlice([]);
101
+ suites.push({
102
+ suite,
103
+ title: SUITE_TITLES[suite],
104
+ real,
105
+ synthetic: empty,
106
+ combined: real,
107
+ model: empty,
108
+ trend: { word: trendOf(real.agreement, prev ? { value: prev.combined.agreement.value, n: prev.combined.agreement.n } : null), previous: prev?.combined.agreement.value ?? null, previousRunId: prevId },
109
+ notes: [
110
+ `${compared} input(s) were judged in two or more places; ${drift.length} were judged differently`,
111
+ ...(input.project !== null ? ['a single-project run compares nothing across places; run every project to compare projects and surfaces'] : []),
112
+ ],
113
+ });
114
+ continue;
115
+ }
116
+ const mine = cases.filter((c) => c.suite === suite);
117
+ const s = slices(mine);
118
+ const extra = notes.get(suite) ?? [];
119
+ if (mine.length === 0)
120
+ extra.push('no cases yet');
121
+ if (suite === 'needs-you' && input.project !== null)
122
+ extra.push('what needs you is daemon-wide: run every project to score it');
123
+ if (suite === 'recall' && mine.length === 0) {
124
+ extra.push('no labelled recall cases: run the steering eval with a memory store and samples that name expected_memories');
125
+ }
126
+ const score = {
127
+ suite,
128
+ title: SUITE_TITLES[suite],
129
+ ...s,
130
+ trend: {
131
+ word: trendOf(s.combined.agreement, prev ? { value: prev.combined.agreement.value, n: prev.combined.agreement.n } : null),
132
+ previous: prev?.combined.agreement.value ?? null,
133
+ previousRunId: prevId,
134
+ },
135
+ notes: extra,
136
+ };
137
+ if (input.project === null) {
138
+ const byProject = group(mine.filter((c) => !c.expected.by.startsWith('model:')), (c) => c.project);
139
+ if (byProject !== undefined && Object.keys(byProject).length > 1)
140
+ score.byProject = byProject;
141
+ }
142
+ const bySurface = group(mine.filter((c) => !c.expected.by.startsWith('model:')), (c) => c.surface ?? null);
143
+ if (bySurface !== undefined)
144
+ score.bySurface = bySurface;
145
+ suites.push(score);
146
+ }
147
+ const people = cases.filter((c) => !c.expected.by.startsWith('model:'));
148
+ const report = {
149
+ id: input.id,
150
+ createdAt: input.now.toISOString(),
151
+ project: input.project,
152
+ suites,
153
+ drift,
154
+ counts: {
155
+ real: people.filter((c) => c.source === 'real').length,
156
+ synthetic: people.filter((c) => c.source === 'synthetic').length,
157
+ modelLabelled: cases.length - people.length,
158
+ unscored: cases.filter((c) => c.observed === null).length,
159
+ baseline: cases.filter((c) => c.baseline === true).length,
160
+ },
161
+ minimums: { rate: MIN_CASES, calibration: MIN_CALIBRATION },
162
+ };
163
+ return { report, cases };
164
+ }
165
+ export function summarize(report) {
166
+ return {
167
+ id: report.id,
168
+ createdAt: report.createdAt,
169
+ project: report.project,
170
+ suites: report.suites.map((s) => ({
171
+ suite: s.suite,
172
+ agreement: s.combined.agreement.value,
173
+ n: s.combined.agreement.n,
174
+ tooFew: s.combined.agreement.tooFew,
175
+ trend: s.trend.word,
176
+ })),
177
+ drift: report.drift.length,
178
+ counts: report.counts,
179
+ };
180
+ }
181
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/evals/runner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAC9E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,OAAO,EAAE,SAAS,EAAkH,MAAM,YAAY,CAAC;AAEvJ,MAAM,CAAC,MAAM,YAAY,GAA4B;IACnD,WAAW,EAAE,mDAAmD;IAChE,aAAa,EAAE,4EAA4E;IAC3F,YAAY,EAAE,gEAAgE;IAC9E,WAAW,EAAE,uDAAuD;IACpE,QAAQ,EAAE,qDAAqD;IAC/D,MAAM,EAAE,kDAAkD;IAC1D,SAAS,EAAE,sDAAsD;IACjE,aAAa,EAAE,0EAA0E;CAC1F,CAAC;AAIF,+EAA+E;AAC/E,MAAM,UAAU,cAAc,CAAC,OAAqC;IAClE,MAAM,GAAG,GAAmB,EAAE,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,OAAO;QAAE,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,MAAM;YAAE,IAAI,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,SAAS;gBAAE,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAChI,OAAO,GAAG,CAAC;AACb,CAAC;AAiBD,SAAS,MAAM,CAAC,KAA0B;IACxC,MAAM,EAAE,GAAG,IAAI,GAAG,EAAoB,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,OAAO,CAAC,CAAW,EAAE,OAAsB;IAClD,OAAO,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,IAAI,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC;AACvG,CAAC;AAED,SAAS,KAAK,CAAmB,KAA0B,EAAE,KAAgC;IAC3F,MAAM,EAAE,GAAG,IAAI,GAAG,EAAsB,CAAC;IACzC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,CAAC,KAAK,IAAI;YAAE,SAAS;QACzB,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;IACD,IAAI,EAAE,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACpC,MAAM,GAAG,GAA+B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QAAE,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;IACxG,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAAe;IACnD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAU,KAAK,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC;IAC3D,4GAA4G;IAC5G,uDAAuD;IACvD,MAAM,KAAK,GAAG,CAAC,CAAW,EAAW,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC3F,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACvF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1F,IAAI,KAAK,GAAG,CAAC,GAAG,KAAK,EAAE,GAAG,SAAS,CAAC,CAAC;IAErC,iFAAiF;IACjF,MAAM,KAAK,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC3C,MAAM,IAAI,GAAG,CAAC,CAAU,EAAE,IAAY,EAAQ,EAAE;QAC9C,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC;IACF,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC;QAC9E,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACnC,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,IAAI,CAAC,KAAK,EAAE,GAAG,OAAO,CAAC,MAAM,wBAAwB,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,mBAAmB,EAAE,CAAC,CAAC;YAC3G,SAAS;QACX,CAAC;QACD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC9C,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAClH,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAC3C,IAAI,IAAI,GAAG,CAAC;gBAAE,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,8CAA8C,CAAC,CAAC;QACnF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,EAAE,kBAAkB,OAAO,CAAC,MAAM,wBAAwB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1H,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,SAAS;QACjC,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,SAAS,EAAE,KAAK,IAAI,IAAI,CAAC;QACtC,MAAM,MAAM,GAAG,SAAS,EAAE,KAAK,IAAI,IAAI,CAAC;QACxC,IAAI,KAAK,KAAK,eAAe,EAAE,CAAC;YAC9B,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACjE,MAAM,IAAI,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;YAC5B,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;YACtB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAC5C,MAAM,KAAK,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK;gBACL,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC;gBAC1B,IAAI;gBACJ,SAAS,EAAE,KAAK;gBAChB,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE;gBACvM,KAAK,EAAE;oBACL,GAAG,QAAQ,gDAAgD,KAAK,CAAC,MAAM,0BAA0B;oBACjG,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,yGAAyG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC/I;aACF,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;QACpD,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QACvB,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAClD,IAAI,KAAK,KAAK,WAAW,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;QAChI,IAAI,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5C,KAAK,CAAC,IAAI,CAAC,6GAA6G,CAAC,CAAC;QAC5H,CAAC;QACD,MAAM,KAAK,GAAe;YACxB,KAAK;YACL,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC;YAC1B,GAAG,CAAC;YACJ,KAAK,EAAE;gBACL,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;gBACzH,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI;gBAChD,aAAa,EAAE,MAAM;aACtB;YACD,KAAK,EAAE,KAAK;SACb,CAAC;QACF,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YAC3B,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YACnG,IAAI,SAAS,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC;gBAAE,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;QAChG,CAAC;QACD,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC;QAC3G,IAAI,SAAS,KAAK,SAAS;YAAE,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxE,MAAM,MAAM,GAAsB;QAChC,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE;QAClC,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,MAAM;QACN,KAAK;QACL,MAAM,EAAE;YACN,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM;YACtD,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,MAAM;YAChE,aAAa,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM;YAC3C,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,MAAM;YACzD,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,MAAM;SAC1D;QACD,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE;KAC5D,CAAC;IACF,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,MAAyB;IACjD,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAChC,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK;YACrC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YACzB,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM;YACnC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI;SACpB,CAAC,CAAC;QACH,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;QAC1B,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * The scorer (DES-DEFAULT-EVALS-001 §3, §6): cases in, figures out. Deterministic code only: no model, no clock, no
3
+ * I/O. A case with no observation is `unscored` and is never counted as right or wrong.
4
+ */
5
+ import type { DriftKey, EvalCase, SliceScore } from './types.js';
6
+ /** Did the system get this case right? `null` when it gave no answer. */
7
+ export declare function isCorrect(c: EvalCase): boolean | null;
8
+ export declare function isModelLabelled(c: EvalCase): boolean;
9
+ export declare function scoreSlice(cases: readonly EvalCase[]): SliceScore;
10
+ /** The four slices every suite reports (DES §4): real, synthetic, combined (both, no model labels), model. */
11
+ export declare function slices(cases: readonly EvalCase[]): {
12
+ real: SliceScore;
13
+ synthetic: SliceScore;
14
+ combined: SliceScore;
15
+ model: SliceScore;
16
+ };
17
+ /**
18
+ * The normalization figure (S8): of the inputs observed in two or more places (projects, or surfaces), the share
19
+ * judged the same everywhere. Computed from the same grouping as {@link driftKeys}.
20
+ */
21
+ export declare function normalizationRate(cases: readonly EvalCase[], drift: readonly DriftKey[]): {
22
+ compared: number;
23
+ consistent: number;
24
+ };
25
+ /**
26
+ * Normalization drift (DES §5): the same input judged differently by place. Cases are grouped by suite and
27
+ * `inputKey`; a key whose observed answers differ across projects (or across surfaces, when the cases carry one)
28
+ * is drift. A place where the answers already differ among themselves still counts once per distinct answer.
29
+ */
30
+ export declare function driftKeys(cases: readonly EvalCase[]): DriftKey[];
31
+ //# sourceMappingURL=score.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"score.d.ts","sourceRoot":"","sources":["../../src/evals/score.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAc,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAW,MAAM,YAAY,CAAC;AAQtF,yEAAyE;AACzE,wBAAgB,SAAS,CAAC,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,IAAI,CAMrD;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,QAAQ,GAAG,OAAO,CAEpD;AAkDD,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,UAAU,CAgBjE;AAED,8GAA8G;AAC9G,wBAAgB,MAAM,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,CAQvI;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAalI;AASD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAyChE"}