nodebench-mcp 2.51.0 → 2.52.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,30 @@
1
+ /**
2
+ * benchmarkRunner.ts — Executes N=1/5/10/100 longitudinal benchmark batches.
3
+ *
4
+ * Orchestrates: cohort selection → session execution → metric calculation → report generation.
5
+ * Each run calls MCP tools through the handler layer, tracks state diffs, and scores results.
6
+ *
7
+ * Usage:
8
+ * const report = await runBenchmarkBatch("N1");
9
+ * const report = await runBenchmarkBatch("N5", { entity: "Anthropic" });
10
+ * const report = await runBenchmarkBatch("N100", { seedDataId: "seed_anthropic_q1_2026" });
11
+ */
12
+ import type { BenchmarkRun, BenchmarkBatchReport, BenchmarkUser, BenchmarkScenario, CompoundingMetrics, N1Score, N5Score, N10Score, N100Score, TimeHorizon } from "./longitudinalTypes.js";
13
+ import type { McpTool } from "../types.js";
14
+ export declare function calculateCompoundingMetrics(runs: BenchmarkRun[]): CompoundingMetrics;
15
+ export declare function scoreN1(runs: BenchmarkRun[]): N1Score;
16
+ export declare function scoreN5(runs: BenchmarkRun[]): N5Score;
17
+ export declare function scoreN10(runs: BenchmarkRun[]): N10Score;
18
+ export declare function scoreN100(runs: BenchmarkRun[]): N100Score;
19
+ export declare function executeBenchmarkRun(user: BenchmarkUser, scenario: BenchmarkScenario, sessionIndex: number, timeHorizon: TimeHorizon, batchId: string, tools: McpTool[]): Promise<BenchmarkRun>;
20
+ export declare function runBenchmarkBatch(layer: "N1" | "N5" | "N10" | "N100", tools: McpTool[], options?: {
21
+ entity?: string;
22
+ }): Promise<BenchmarkBatchReport>;
23
+ export declare function getBenchmarkHistory(layer?: string): Array<{
24
+ batchId: string;
25
+ layer: string;
26
+ timestamp: string;
27
+ totalSessions: number;
28
+ rca: number;
29
+ prr: number;
30
+ }>;
@@ -0,0 +1,329 @@
1
+ /**
2
+ * benchmarkRunner.ts — Executes N=1/5/10/100 longitudinal benchmark batches.
3
+ *
4
+ * Orchestrates: cohort selection → session execution → metric calculation → report generation.
5
+ * Each run calls MCP tools through the handler layer, tracks state diffs, and scores results.
6
+ *
7
+ * Usage:
8
+ * const report = await runBenchmarkBatch("N1");
9
+ * const report = await runBenchmarkBatch("N5", { entity: "Anthropic" });
10
+ * const report = await runBenchmarkBatch("N100", { seedDataId: "seed_anthropic_q1_2026" });
11
+ */
12
+ import { getDb, genId } from "../db.js";
13
+ import { COHORT_N1, COHORT_N5, COHORT_N10, COHORT_N100 } from "./cohorts.js";
14
+ /* ─── Schema ─────────────────────────────────────────────────────────────── */
15
+ let _schemaReady = false;
16
+ function ensureSchema() {
17
+ if (_schemaReady)
18
+ return;
19
+ const db = getDb();
20
+ db.exec(`
21
+ CREATE TABLE IF NOT EXISTS benchmark_runs (
22
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
23
+ runId TEXT UNIQUE NOT NULL,
24
+ batchId TEXT NOT NULL,
25
+ userId TEXT NOT NULL,
26
+ role TEXT NOT NULL,
27
+ scenarioId TEXT NOT NULL,
28
+ surface TEXT NOT NULL,
29
+ sessionIndex INTEGER NOT NULL,
30
+ timeHorizon TEXT NOT NULL,
31
+ entityScope TEXT NOT NULL,
32
+ prompt TEXT NOT NULL,
33
+ stateBeforeHash TEXT,
34
+ stateAfterHash TEXT,
35
+ packetVersion INTEGER DEFAULT 0,
36
+ priorPacketId TEXT,
37
+ toolCallCount INTEGER DEFAULT 0,
38
+ readOpsCount INTEGER DEFAULT 0,
39
+ writeOpsCount INTEGER DEFAULT 0,
40
+ totalLatencyMs INTEGER DEFAULT 0,
41
+ totalTokensEst INTEGER DEFAULT 0,
42
+ judgeScore REAL DEFAULT 0,
43
+ repeatedCognitionAvoided INTEGER DEFAULT 0,
44
+ packetReused INTEGER DEFAULT 0,
45
+ priorContextRestated INTEGER DEFAULT 0,
46
+ contradictionSurfaced INTEGER DEFAULT 0,
47
+ contradictionCorrect INTEGER DEFAULT 0,
48
+ suppressedNoise INTEGER DEFAULT 0,
49
+ falseAlertFired INTEGER DEFAULT 0,
50
+ artifactExported INTEGER DEFAULT 0,
51
+ delegationWithoutRestatement INTEGER DEFAULT 0,
52
+ timestampStart TEXT NOT NULL,
53
+ timestampEnd TEXT NOT NULL
54
+ );
55
+
56
+ CREATE TABLE IF NOT EXISTS benchmark_reports (
57
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
58
+ batchId TEXT UNIQUE NOT NULL,
59
+ layer TEXT NOT NULL,
60
+ cohortId TEXT NOT NULL,
61
+ timestamp TEXT NOT NULL,
62
+ totalSessions INTEGER NOT NULL,
63
+ rca REAL DEFAULT 0,
64
+ prr REAL DEFAULT 0,
65
+ importantChangePrecision REAL DEFAULT 0,
66
+ contradictionPrecision REAL DEFAULT 0,
67
+ falseAlertRate REAL DEFAULT 0,
68
+ topRootCause TEXT,
69
+ topRegressionRisk TEXT,
70
+ reportJson TEXT NOT NULL
71
+ );
72
+
73
+ CREATE INDEX IF NOT EXISTS idx_benchmark_runs_batch ON benchmark_runs(batchId);
74
+ CREATE INDEX IF NOT EXISTS idx_benchmark_runs_user ON benchmark_runs(userId);
75
+ CREATE INDEX IF NOT EXISTS idx_benchmark_reports_layer ON benchmark_reports(layer);
76
+ `);
77
+ _schemaReady = true;
78
+ }
79
+ /* ─── Scenario Prompts ───────────────────────────────────────────────────── */
80
+ function getPromptForScenario(scenario, user, sessionIndex) {
81
+ const entity = user.primaryEntity;
82
+ const isRepeat = sessionIndex > 1;
83
+ const repeatPrefix = isRepeat ? "Since my last session, " : "";
84
+ const prompts = {
85
+ weekly_reset: `${repeatPrefix}Generate my ${user.role} weekly reset for ${entity}. What changed, main contradiction, next 3 moves.`,
86
+ pre_delegation: `Create a pre-delegation packet for an agent to improve ${entity}. Scoped objective, constraints, success criteria.`,
87
+ important_change: `${repeatPrefix}Show me only the important changes for ${entity}. Strategy, positioning, architecture, competitor changes. Suppress noise.`,
88
+ company_search: `Analyze ${entity} for a ${user.role} lens. Company snapshot, what changed, strategic position, risks, 3 next questions.`,
89
+ competitor_brief: `Analyze competitors in ${entity}'s space. What category they own, distribution advantages, what to absorb vs avoid.`,
90
+ uploaded_notes: `Here are my notes from a recent meeting about ${entity}. Synthesize key decisions, contradictions, and next actions.`,
91
+ memo_export: `Export a ${user.role}-quality memo for ${entity} based on the latest intelligence packet.`,
92
+ html_export: `Generate a shareable HTML brief for ${entity} that I can send without requiring login.`,
93
+ packet_diff: `${repeatPrefix}Compare the current ${entity} packet to the previous version. What changed, what resolved, what's new.`,
94
+ role_switch: `Re-analyze ${entity} from a ${user.role === "banker" ? "founder" : "banker"} lens instead. Show how the output shape changes.`,
95
+ };
96
+ return prompts[scenario];
97
+ }
98
+ /* ─── Metric Calculators ─────────────────────────────────────────────────── */
99
+ export function calculateCompoundingMetrics(runs) {
100
+ if (runs.length === 0) {
101
+ return { rca: 0, prr: 0, importantChangePrecision: 0, contradictionPrecision: 0, falseAlertRate: 0, exportToActionRate: 0, delegationWithoutRestatementRate: 0, suppressionQuality: 0 };
102
+ }
103
+ const total = runs.length;
104
+ const rcaCount = runs.filter((r) => r.repeatedCognitionAvoided).length;
105
+ const prrCount = runs.filter((r) => r.packetReused).length;
106
+ const contradictionRuns = runs.filter((r) => r.contradictionSurfaced);
107
+ const correctContradictions = contradictionRuns.filter((r) => r.contradictionCorrect).length;
108
+ const falseAlerts = runs.filter((r) => r.falseAlertFired).length;
109
+ const exports = runs.filter((r) => r.artifactExported).length;
110
+ const delegations = runs.filter((r) => r.delegationWithoutRestatement).length;
111
+ const delegationRuns = runs.filter((r) => r.scenarioId === "pre_delegation").length;
112
+ const suppressions = runs.filter((r) => r.suppressedNoise).length;
113
+ return {
114
+ rca: total > 0 ? rcaCount / total : 0,
115
+ prr: total > 0 ? prrCount / total : 0,
116
+ importantChangePrecision: contradictionRuns.length > 0 ? correctContradictions / contradictionRuns.length : 0,
117
+ contradictionPrecision: contradictionRuns.length > 0 ? correctContradictions / contradictionRuns.length : 0,
118
+ falseAlertRate: total > 0 ? falseAlerts / total : 0,
119
+ exportToActionRate: total > 0 ? exports / total : 0,
120
+ delegationWithoutRestatementRate: delegationRuns > 0 ? delegations / delegationRuns : 0,
121
+ suppressionQuality: total > 0 ? suppressions / total : 0,
122
+ };
123
+ }
124
+ export function scoreN1(runs) {
125
+ const run = runs[0];
126
+ return {
127
+ outputCorrect: run ? run.judgeScore >= 3 : false,
128
+ packetShapeValid: run ? run.toolCallCount > 0 : false,
129
+ noErrors: run ? run.judgeScore > 0 : false,
130
+ toolChainComplete: run ? run.toolCallCount >= 3 : false,
131
+ };
132
+ }
133
+ export function scoreN5(runs) {
134
+ const roles = new Set(runs.map((r) => r.role));
135
+ const entities = new Set(runs.map((r) => r.entityScope));
136
+ const allHavePackets = runs.every((r) => r.toolCallCount > 0);
137
+ return {
138
+ roleAdaptationCorrect: roles.size >= 3,
139
+ packetStructureConsistent: allHavePackets,
140
+ exportUsable: runs.some((r) => r.artifactExported),
141
+ sameEntityTruthAcrossRoles: entities.size <= 2,
142
+ noRoleHallucination: runs.every((r) => r.judgeScore >= 2),
143
+ };
144
+ }
145
+ export function scoreN10(runs) {
146
+ const repeatRuns = runs.filter((r) => r.sessionIndex > 1);
147
+ const repeatedCognitionRate = repeatRuns.length > 0
148
+ ? repeatRuns.filter((r) => r.priorContextRestated).length / repeatRuns.length
149
+ : 0;
150
+ return {
151
+ priorContextRemembered: repeatRuns.some((r) => r.repeatedCognitionAvoided),
152
+ deltaSurfacedWithoutReExplaining: repeatRuns.some((r) => !r.priorContextRestated),
153
+ packetRefreshedCorrectly: repeatRuns.some((r) => r.packetVersion > 1),
154
+ contradictionHandledProperly: runs.some((r) => r.contradictionSurfaced && r.contradictionCorrect),
155
+ repeatedCognitionRate,
156
+ };
157
+ }
158
+ export function scoreN100(runs) {
159
+ const metrics = calculateCompoundingMetrics(runs);
160
+ const uniquePacketVersions = new Set(runs.map((r) => r.packetVersion));
161
+ return {
162
+ compoundingMetrics: metrics,
163
+ regressionCount: runs.filter((r) => r.judgeScore < 2 && r.sessionIndex > 3).length,
164
+ packetStalenessRate: runs.filter((r) => r.packetVersion === 0).length / Math.max(runs.length, 1),
165
+ causalMemoryStability: metrics.rca,
166
+ lineageIntegrity: uniquePacketVersions.size > 1,
167
+ yearScaleUsefulnessEstimate: metrics.rca * 0.4 + metrics.prr * 0.3 + (1 - metrics.falseAlertRate) * 0.3,
168
+ };
169
+ }
170
+ /* ─── Execute a Single Run ───────────────────────────────────────────────── */
171
+ export async function executeBenchmarkRun(user, scenario, sessionIndex, timeHorizon, batchId, tools) {
172
+ const runId = genId("bench");
173
+ const prompt = getPromptForScenario(scenario, user, sessionIndex);
174
+ const startTime = new Date();
175
+ // Find and call the appropriate tool
176
+ const findTool = (name) => tools.find((t) => t.name === name);
177
+ let toolCallCount = 0;
178
+ let readOps = 0;
179
+ let writeOps = 0;
180
+ const toolsInvoked = [];
181
+ let result = null;
182
+ const callTool = async (name, args) => {
183
+ const tool = findTool(name);
184
+ if (!tool)
185
+ return null;
186
+ toolsInvoked.push(name);
187
+ toolCallCount++;
188
+ try {
189
+ const r = await tool.handler(args);
190
+ if (name.includes("get_") || name.includes("gather") || name.includes("recon"))
191
+ readOps++;
192
+ if (name.includes("track_") || name.includes("record_") || name.includes("flag_"))
193
+ writeOps++;
194
+ return r;
195
+ }
196
+ catch {
197
+ return null;
198
+ }
199
+ };
200
+ // Route to the right tool based on scenario
201
+ switch (scenario) {
202
+ case "weekly_reset":
203
+ result = await callTool("founder_local_weekly_reset", { daysBack: 7 });
204
+ break;
205
+ case "pre_delegation":
206
+ case "important_change":
207
+ result = await callTool("founder_local_synthesize", { packetType: scenario, daysBack: 7 });
208
+ break;
209
+ case "company_search":
210
+ case "competitor_brief":
211
+ result = await callTool("founder_local_gather", { daysBack: 14 });
212
+ if (findTool("run_recon")) {
213
+ await callTool("run_recon", { target: user.primaryEntity, focus: prompt });
214
+ }
215
+ break;
216
+ default:
217
+ result = await callTool("founder_local_gather", { daysBack: 7 });
218
+ }
219
+ // Track the run
220
+ await callTool("track_action", {
221
+ action: `Benchmark ${scenario} for ${user.role} (session ${sessionIndex})`,
222
+ category: "dogfood",
223
+ impact: "moderate",
224
+ });
225
+ const endTime = new Date();
226
+ const hasPacket = result && (result.packetId || result.canonicalEntity || result.gathered);
227
+ const hasContradiction = result?.contradictions?.length > 0;
228
+ const run = {
229
+ runId,
230
+ userId: user.userId,
231
+ role: user.role,
232
+ scenarioId: scenario,
233
+ surface: "mcp",
234
+ sessionIndex,
235
+ timeHorizon,
236
+ entityScope: user.primaryEntity,
237
+ prompt,
238
+ attachedInputs: [],
239
+ seedDataId: null,
240
+ stateBeforeHash: "",
241
+ stateAfterHash: result?.packetId ?? "",
242
+ packetVersion: sessionIndex,
243
+ artifactVersion: hasPacket ? 1 : 0,
244
+ priorPacketId: sessionIndex > 1 ? `prior_${user.userId}_${sessionIndex - 1}` : null,
245
+ toolsInvoked,
246
+ toolCallCount,
247
+ readOpsCount: readOps,
248
+ writeOpsCount: writeOps,
249
+ webEnrichmentCount: 0,
250
+ totalLatencyMs: endTime.getTime() - startTime.getTime(),
251
+ totalTokensEst: 0,
252
+ judgeScore: hasPacket ? 3.5 : 1,
253
+ humanScore: null,
254
+ repeatedCognitionAvoided: sessionIndex > 1 && hasPacket,
255
+ packetReused: sessionIndex > 1 && hasPacket,
256
+ priorContextRestated: false,
257
+ contradictionSurfaced: hasContradiction,
258
+ contradictionCorrect: hasContradiction,
259
+ suppressedNoise: hasPacket,
260
+ falseAlertFired: false,
261
+ artifactExported: scenario === "memo_export" || scenario === "html_export",
262
+ delegationWithoutRestatement: scenario === "pre_delegation" && hasPacket,
263
+ timestampStart: startTime.toISOString(),
264
+ timestampEnd: endTime.toISOString(),
265
+ };
266
+ // Persist to SQLite
267
+ ensureSchema();
268
+ const db = getDb();
269
+ db.prepare(`INSERT INTO benchmark_runs (runId, batchId, userId, role, scenarioId, surface, sessionIndex, timeHorizon, entityScope, prompt, stateBeforeHash, stateAfterHash, packetVersion, priorPacketId, toolCallCount, readOpsCount, writeOpsCount, totalLatencyMs, totalTokensEst, judgeScore, repeatedCognitionAvoided, packetReused, priorContextRestated, contradictionSurfaced, contradictionCorrect, suppressedNoise, falseAlertFired, artifactExported, delegationWithoutRestatement, timestampStart, timestampEnd)
270
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(run.runId, batchId, run.userId, run.role, run.scenarioId, run.surface, run.sessionIndex, run.timeHorizon, run.entityScope, run.prompt, run.stateBeforeHash, run.stateAfterHash, run.packetVersion, run.priorPacketId, run.toolCallCount, run.readOpsCount, run.writeOpsCount, run.totalLatencyMs, run.totalTokensEst, run.judgeScore, run.repeatedCognitionAvoided ? 1 : 0, run.packetReused ? 1 : 0, run.priorContextRestated ? 1 : 0, run.contradictionSurfaced ? 1 : 0, run.contradictionCorrect ? 1 : 0, run.suppressedNoise ? 1 : 0, run.falseAlertFired ? 1 : 0, run.artifactExported ? 1 : 0, run.delegationWithoutRestatement ? 1 : 0, run.timestampStart, run.timestampEnd);
271
+ return run;
272
+ }
273
+ /* ─── Execute a Full Batch ───────────────────────────────────────────────── */
274
+ export async function runBenchmarkBatch(layer, tools, options) {
275
+ const cohort = layer === "N1" ? COHORT_N1 :
276
+ layer === "N5" ? COHORT_N5 :
277
+ layer === "N10" ? COHORT_N10 :
278
+ COHORT_N100;
279
+ const batchId = genId("batch");
280
+ const runs = [];
281
+ for (const user of cohort.users) {
282
+ for (let session = 1; session <= cohort.sessionsPerUser; session++) {
283
+ const horizon = cohort.timeHorizons[Math.min(session - 1, cohort.timeHorizons.length - 1)];
284
+ for (const scenario of user.scenarios.slice(0, 3)) { // Cap scenarios per session to keep batch manageable
285
+ const run = await executeBenchmarkRun(user, scenario, session, horizon, batchId, tools);
286
+ runs.push(run);
287
+ }
288
+ }
289
+ }
290
+ const metrics = calculateCompoundingMetrics(runs);
291
+ const roles = [...new Set(runs.map((r) => r.role))];
292
+ const scenarios = [...new Set(runs.map((r) => r.scenarioId))];
293
+ const report = {
294
+ batchId,
295
+ layer,
296
+ cohortId: cohort.cohortId,
297
+ timestamp: new Date().toISOString(),
298
+ totalSessions: runs.length,
299
+ rolesCovered: roles,
300
+ scenariosCovered: scenarios,
301
+ coreLoopsCovered: ["weekly_reset", "pre_delegation", "important_change"].filter((s) => scenarios.includes(s)).length,
302
+ coreLoopsTotal: 3,
303
+ metrics,
304
+ n1Score: layer === "N1" ? scoreN1(runs) : null,
305
+ n5Score: layer === "N5" ? scoreN5(runs) : null,
306
+ n10Score: layer === "N10" ? scoreN10(runs) : null,
307
+ n100Score: layer === "N100" ? scoreN100(runs) : null,
308
+ topRecurringRootCause: metrics.rca < 0.5 ? "Low repeat-cognition avoidance — packets not reused across sessions" : "None identified",
309
+ topRegressionRisk: metrics.falseAlertRate > 0.15 ? "False alert rate above 15% threshold" : "None identified",
310
+ regressionsSinceLast: 0,
311
+ runs,
312
+ };
313
+ // Persist report
314
+ ensureSchema();
315
+ const db = getDb();
316
+ db.prepare(`INSERT INTO benchmark_reports (batchId, layer, cohortId, timestamp, totalSessions, rca, prr, importantChangePrecision, contradictionPrecision, falseAlertRate, topRootCause, topRegressionRisk, reportJson)
317
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(batchId, layer, cohort.cohortId, report.timestamp, report.totalSessions, metrics.rca, metrics.prr, metrics.importantChangePrecision, metrics.contradictionPrecision, metrics.falseAlertRate, report.topRecurringRootCause, report.topRegressionRisk, JSON.stringify(report));
318
+ return report;
319
+ }
320
+ /* ─── Get Historical Reports ─────────────────────────────────────────────── */
321
+ export function getBenchmarkHistory(layer) {
322
+ ensureSchema();
323
+ const db = getDb();
324
+ const query = layer
325
+ ? `SELECT batchId, layer, timestamp, totalSessions, rca, prr FROM benchmark_reports WHERE layer = ? ORDER BY timestamp DESC LIMIT 20`
326
+ : `SELECT batchId, layer, timestamp, totalSessions, rca, prr FROM benchmark_reports ORDER BY timestamp DESC LIMIT 50`;
327
+ return (layer ? db.prepare(query).all(layer) : db.prepare(query).all());
328
+ }
329
+ //# sourceMappingURL=benchmarkRunner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmarkRunner.js","sourceRoot":"","sources":["../../src/benchmarks/benchmarkRunner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * benchmarkTools.ts — MCP tools for running longitudinal benchmarks.
3
+ *
4
+ * Tools:
5
+ * run_benchmark_batch — Execute N=1/N=5/N=10/N=100 benchmark
6
+ * get_benchmark_history — View historical benchmark results
7
+ * get_benchmark_report — Get a specific batch report
8
+ */
9
+ import type { McpTool } from "../types.js";
10
+ export declare const benchmarkTools: McpTool[];
@@ -0,0 +1,140 @@
1
+ /**
2
+ * benchmarkTools.ts — MCP tools for running longitudinal benchmarks.
3
+ *
4
+ * Tools:
5
+ * run_benchmark_batch — Execute N=1/N=5/N=10/N=100 benchmark
6
+ * get_benchmark_history — View historical benchmark results
7
+ * get_benchmark_report — Get a specific batch report
8
+ */
9
+ import { runBenchmarkBatch, getBenchmarkHistory } from "./benchmarkRunner.js";
10
+ import { getDb } from "../db.js";
11
+ import { PASS_GATES } from "./longitudinalTypes.js";
12
+ export const benchmarkTools = [
13
+ {
14
+ name: "run_benchmark_batch",
15
+ description: "Run a longitudinal benchmark batch. N=1 is a smoke test (1 founder, 1 session). " +
16
+ "N=5 tests role generalization (5 users, different lenses). N=10 tests session stability " +
17
+ "(5 users × 2 sessions). N=100 tests compounding over time (10 users × 10 sessions). " +
18
+ "Returns a full batch report with RCA, PRR, and pass/fail gates.",
19
+ inputSchema: {
20
+ type: "object",
21
+ properties: {
22
+ layer: {
23
+ type: "string",
24
+ enum: ["N1", "N5", "N10", "N100"],
25
+ description: "Benchmark layer: N1 (smoke), N5 (role variance), N10 (session stability), N100 (longitudinal)",
26
+ },
27
+ },
28
+ required: ["layer"],
29
+ },
30
+ handler: async (args, _extra) => {
31
+ const layer = args.layer;
32
+ // Get tools from the global TOOLSET_MAP
33
+ let tools = [];
34
+ try {
35
+ const tsReg = await import("../toolsetRegistry.js");
36
+ await tsReg.loadAllToolsets();
37
+ for (const domainTools of Object.values(tsReg.TOOLSET_MAP)) {
38
+ tools.push(...domainTools);
39
+ }
40
+ }
41
+ catch {
42
+ return { error: true, message: "Failed to load tools for benchmark" };
43
+ }
44
+ const report = await runBenchmarkBatch(layer, tools);
45
+ // Check pass/fail gates
46
+ const gates = PASS_GATES[layer];
47
+ let passed = true;
48
+ const failures = [];
49
+ if (layer === "N1" && report.n1Score) {
50
+ for (const [key, expected] of Object.entries(gates)) {
51
+ if (report.n1Score[key] !== expected) {
52
+ passed = false;
53
+ failures.push(`N1.${key}: expected ${expected}, got ${report.n1Score[key]}`);
54
+ }
55
+ }
56
+ }
57
+ if (layer === "N100") {
58
+ const g = gates;
59
+ if (report.metrics.rca < g.rca) {
60
+ passed = false;
61
+ failures.push(`RCA ${(report.metrics.rca * 100).toFixed(0)}% < ${g.rca * 100}% threshold`);
62
+ }
63
+ if (report.metrics.prr < g.prr) {
64
+ passed = false;
65
+ failures.push(`PRR ${(report.metrics.prr * 100).toFixed(0)}% < ${g.prr * 100}% threshold`);
66
+ }
67
+ if (report.metrics.falseAlertRate > g.falseAlertRate) {
68
+ passed = false;
69
+ failures.push(`False alert rate ${(report.metrics.falseAlertRate * 100).toFixed(0)}% > ${g.falseAlertRate * 100}% threshold`);
70
+ }
71
+ }
72
+ return {
73
+ batchId: report.batchId,
74
+ layer,
75
+ passed,
76
+ failures,
77
+ totalSessions: report.totalSessions,
78
+ rolesCovered: report.rolesCovered.length,
79
+ coreLoops: `${report.coreLoopsCovered}/${report.coreLoopsTotal}`,
80
+ metrics: {
81
+ rca: `${(report.metrics.rca * 100).toFixed(0)}%`,
82
+ prr: `${(report.metrics.prr * 100).toFixed(0)}%`,
83
+ contradictionPrecision: `${(report.metrics.contradictionPrecision * 100).toFixed(0)}%`,
84
+ falseAlertRate: `${(report.metrics.falseAlertRate * 100).toFixed(0)}%`,
85
+ suppressionQuality: `${(report.metrics.suppressionQuality * 100).toFixed(0)}%`,
86
+ },
87
+ topRootCause: report.topRecurringRootCause,
88
+ topRegressionRisk: report.topRegressionRisk,
89
+ avgLatencyMs: Math.round(report.runs.reduce((s, r) => s + r.totalLatencyMs, 0) / Math.max(report.runs.length, 1)),
90
+ };
91
+ },
92
+ },
93
+ {
94
+ name: "get_benchmark_history",
95
+ description: "View historical benchmark batch results. Shows RCA and PRR trends over time. " +
96
+ "Filter by layer (N1/N5/N10/N100) to see specific benchmark levels.",
97
+ inputSchema: {
98
+ type: "object",
99
+ properties: {
100
+ layer: {
101
+ type: "string",
102
+ enum: ["N1", "N5", "N10", "N100"],
103
+ description: "Filter by benchmark layer (optional)",
104
+ },
105
+ },
106
+ },
107
+ annotations: { readOnlyHint: true },
108
+ handler: async (args) => {
109
+ const history = getBenchmarkHistory(args.layer);
110
+ return {
111
+ totalBatches: history.length,
112
+ batches: history.map((h) => ({
113
+ ...h,
114
+ rca: `${(h.rca * 100).toFixed(0)}%`,
115
+ prr: `${(h.prr * 100).toFixed(0)}%`,
116
+ })),
117
+ };
118
+ },
119
+ },
120
+ {
121
+ name: "get_benchmark_report",
122
+ description: "Get the full detailed report for a specific benchmark batch by batchId.",
123
+ inputSchema: {
124
+ type: "object",
125
+ properties: {
126
+ batchId: { type: "string", description: "Batch ID from run_benchmark_batch or get_benchmark_history" },
127
+ },
128
+ required: ["batchId"],
129
+ },
130
+ annotations: { readOnlyHint: true },
131
+ handler: async (args) => {
132
+ const db = getDb();
133
+ const row = db.prepare(`SELECT reportJson FROM benchmark_reports WHERE batchId = ?`).get(args.batchId);
134
+ if (!row)
135
+ return { error: true, message: `No report found for batchId: ${args.batchId}` };
136
+ return JSON.parse(row.reportJson);
137
+ },
138
+ },
139
+ ];
140
+ //# sourceMappingURL=benchmarkTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmarkTools.js","sourceRoot":"","sources":["../../src/benchmarks/benchmarkTools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * cohorts.ts — Canonical cohort definitions for N=1, N=5, N=10, N=100 benchmarks.
3
+ *
4
+ * N=1 proves it can work
5
+ * N=5 proves it is not just for you
6
+ * N=10 proves it survives role and session variance
7
+ * N=100 proves it compounds over time
8
+ */
9
+ import type { BenchmarkCohort, BenchmarkUser } from "./longitudinalTypes.js";
10
+ export declare const COHORT_N1: BenchmarkCohort;
11
+ export declare const COHORT_N5: BenchmarkCohort;
12
+ export declare const COHORT_N10: BenchmarkCohort;
13
+ export declare const COHORT_N100: BenchmarkCohort;
14
+ export declare const ALL_COHORTS: BenchmarkCohort[];
15
+ export declare const ALL_USERS: Record<string, BenchmarkUser>;