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,598 @@
1
+ #!/usr/bin/env npx tsx
2
+ /**
3
+ * longitudinalHarness.ts — Longitudinal dogfood benchmark harness for NodeBench MCP.
4
+ *
5
+ * Orchestrates N=1, N=5, N=10, N=100 cohort evaluations to measure whether
6
+ * NodeBench compounds value across users, roles, sessions, and time horizons.
7
+ *
8
+ * Core metrics:
9
+ * RCA — Repeated Cognition Avoided (% of sessions not restating prior context)
10
+ * PRR — Packet Reuse Rate (% of sessions reusing a prior packet)
11
+ *
12
+ * Usage:
13
+ * cd packages/mcp-local && npx tsx src/benchmarks/longitudinalHarness.ts [n1|n5|n10|n100|all]
14
+ */
15
+ import { getDb } from "../db.js";
16
+ import { genId } from "../db.js";
17
+ import { _setDbAccessor } from "../tools/toolRegistry.js";
18
+ import { loadToolsets, ALL_DOMAIN_KEYS } from "../toolsetRegistry.js";
19
+ import { deepSimTools } from "../tools/deepSimTools.js";
20
+ import { reconTools } from "../tools/reconTools.js";
21
+ import { founderTools } from "../tools/founderTools.js";
22
+ import { founderTrackingTools } from "../tools/founderTrackingTools.js";
23
+ import { dogfoodJudgeTools } from "../tools/dogfoodJudgeTools.js";
24
+ import { learningTools } from "../tools/learningTools.js";
25
+ import { flywheelTools } from "../tools/flywheelTools.js";
26
+ import { createMetaTools } from "../tools/metaTools.js";
27
+ import { createProgressiveDiscoveryTools } from "../tools/progressiveDiscoveryTools.js";
28
+ // ═══════════════════════════════════════════════════════════════════════════
29
+ // Constants
30
+ // ═══════════════════════════════════════════════════════════════════════════
31
+ const PASS_THRESHOLDS = {
32
+ n1: { judgeScore: 3.5 },
33
+ n5: { rca: 40, prr: 20 },
34
+ n10: { rca: 55, prr: 35 },
35
+ n100: { rca: 70, prr: 50 },
36
+ };
37
+ const TIME_HORIZONS = [
38
+ "same_session", "same_day", "next_day", "weekly", "monthly", "quarterly", "yearly",
39
+ ];
40
+ const SURFACES = ["mcp", "ai_app", "local_dashboard", "engine_api"];
41
+ /** Seeded cohort of 10 users. */
42
+ const COHORT_USERS = [
43
+ { userId: "user_founder_01", role: "founder", preset: "founder", typicalScenarios: ["weekly_reset", "pre_delegation", "important_change"] },
44
+ { userId: "user_banker_02", role: "banker", preset: "banker", typicalScenarios: ["company_search", "memo_export"] },
45
+ { userId: "user_ceo_03", role: "ceo", preset: "founder", typicalScenarios: ["weekly_reset", "company_search", "competitor_brief"] },
46
+ { userId: "user_researcher_04", role: "researcher", preset: "researcher", typicalScenarios: ["competitor_brief", "company_search"] },
47
+ { userId: "user_student_05", role: "student", preset: "starter", typicalScenarios: ["company_search", "memo_export"] },
48
+ { userId: "user_legal_06", role: "legal", preset: "starter", typicalScenarios: ["company_search", "important_change"] },
49
+ { userId: "user_pm_07", role: "pm", preset: "core", typicalScenarios: ["pre_delegation", "important_change"] },
50
+ { userId: "user_contractor_08", role: "contractor", preset: "starter", typicalScenarios: ["pre_delegation"] },
51
+ { userId: "user_investor_09", role: "investor", preset: "banker", typicalScenarios: ["company_search", "competitor_brief"] },
52
+ { userId: "user_content_10", role: "content", preset: "starter", typicalScenarios: ["memo_export", "weekly_reset"] },
53
+ ];
54
+ /** Scenario → tool chain mapping. Each scenario declares which tools to call in sequence. */
55
+ const SCENARIO_TOOL_CHAINS = {
56
+ weekly_reset: [
57
+ "check_mcp_setup",
58
+ "recon_entity",
59
+ "extract_variables",
60
+ "render_decision_memo",
61
+ "record_event",
62
+ ],
63
+ pre_delegation: [
64
+ "check_mcp_setup",
65
+ "recon_entity",
66
+ "render_decision_memo",
67
+ "track_milestone",
68
+ "record_event",
69
+ ],
70
+ important_change: [
71
+ "recon_entity",
72
+ "extract_variables",
73
+ "build_claim_graph",
74
+ "rank_interventions",
75
+ "record_event",
76
+ ],
77
+ company_search: [
78
+ "check_mcp_setup",
79
+ "recon_entity",
80
+ "extract_variables",
81
+ "build_claim_graph",
82
+ "render_decision_memo",
83
+ "record_event",
84
+ ],
85
+ competitor_brief: [
86
+ "recon_entity",
87
+ "extract_variables",
88
+ "generate_countermodels",
89
+ "render_decision_memo",
90
+ "record_event",
91
+ ],
92
+ memo_export: [
93
+ "recon_entity",
94
+ "extract_variables",
95
+ "render_decision_memo",
96
+ "record_event",
97
+ ],
98
+ };
99
+ // ═══════════════════════════════════════════════════════════════════════════
100
+ // SQLite Schema
101
+ // ═══════════════════════════════════════════════════════════════════════════
102
+ const LONGITUDINAL_SCHEMA = `
103
+ CREATE TABLE IF NOT EXISTS longitudinal_sessions (
104
+ runId TEXT PRIMARY KEY,
105
+ batchId TEXT NOT NULL,
106
+ cohortSize INTEGER NOT NULL,
107
+ userId TEXT NOT NULL,
108
+ role TEXT NOT NULL,
109
+ scenarioId TEXT NOT NULL,
110
+ sessionIndex INTEGER NOT NULL,
111
+ timeHorizon TEXT NOT NULL,
112
+ surface TEXT NOT NULL,
113
+ toolCallCount INTEGER NOT NULL DEFAULT 0,
114
+ latencyMs INTEGER NOT NULL DEFAULT 0,
115
+ packetGenerated INTEGER NOT NULL DEFAULT 0,
116
+ packetReused INTEGER NOT NULL DEFAULT 0,
117
+ repeatQuestionDetected INTEGER NOT NULL DEFAULT 0,
118
+ contextRestated INTEGER NOT NULL DEFAULT 0,
119
+ exportProduced INTEGER NOT NULL DEFAULT 0,
120
+ judgeScore REAL NOT NULL DEFAULT 0,
121
+ errors TEXT NOT NULL DEFAULT '[]',
122
+ createdAt TEXT NOT NULL DEFAULT (datetime('now'))
123
+ );
124
+
125
+ CREATE INDEX IF NOT EXISTS idx_longitudinal_batch ON longitudinal_sessions(batchId);
126
+ CREATE INDEX IF NOT EXISTS idx_longitudinal_user ON longitudinal_sessions(userId);
127
+ CREATE INDEX IF NOT EXISTS idx_longitudinal_cohort ON longitudinal_sessions(cohortSize);
128
+ `;
129
+ function ensureSchema() {
130
+ const db = getDb();
131
+ db.exec(LONGITUDINAL_SCHEMA);
132
+ }
133
+ // ═══════════════════════════════════════════════════════════════════════════
134
+ // Tool Assembly
135
+ // ═══════════════════════════════════════════════════════════════════════════
136
+ let _allTools = null;
137
+ async function getAllTools() {
138
+ if (_allTools)
139
+ return _allTools;
140
+ getDb();
141
+ _setDbAccessor(getDb);
142
+ const domainTools = await loadToolsets(ALL_DOMAIN_KEYS);
143
+ const metaTools = createMetaTools(domainTools);
144
+ const allToolsFlat = [
145
+ ...domainTools,
146
+ ...metaTools,
147
+ ...deepSimTools,
148
+ ...reconTools,
149
+ ...founderTools,
150
+ ...founderTrackingTools,
151
+ ...dogfoodJudgeTools,
152
+ ...learningTools,
153
+ ...flywheelTools,
154
+ ];
155
+ const discoveryTools = createProgressiveDiscoveryTools(allToolsFlat.map((t) => ({ name: t.name, description: t.description })));
156
+ _allTools = [...allToolsFlat, ...discoveryTools];
157
+ return _allTools;
158
+ }
159
+ // ═══════════════════════════════════════════════════════════════════════════
160
+ // Helpers
161
+ // ═══════════════════════════════════════════════════════════════════════════
162
+ function findTool(tools, name) {
163
+ return tools.find((t) => t.name === name) ?? null;
164
+ }
165
+ async function callTool(tool, args = {}) {
166
+ const start = Date.now();
167
+ try {
168
+ const result = await tool.handler(args);
169
+ return { ok: true, result, ms: Date.now() - start };
170
+ }
171
+ catch (err) {
172
+ const message = err instanceof Error ? err.message : String(err);
173
+ return { ok: false, result: null, error: message, ms: Date.now() - start };
174
+ }
175
+ }
176
+ function persistSession(session, batchId, cohortSize) {
177
+ const db = getDb();
178
+ db.prepare(`
179
+ INSERT OR REPLACE INTO longitudinal_sessions
180
+ (runId, batchId, cohortSize, userId, role, scenarioId, sessionIndex,
181
+ timeHorizon, surface, toolCallCount, latencyMs, packetGenerated,
182
+ packetReused, repeatQuestionDetected, contextRestated, exportProduced,
183
+ judgeScore, errors)
184
+ VALUES
185
+ (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
186
+ `).run(session.runId, batchId, cohortSize, session.userId, session.role, session.scenarioId, session.sessionIndex, session.timeHorizon, session.surface, session.toolCallCount, session.latencyMs, session.packetGenerated ? 1 : 0, session.packetReused ? 1 : 0, session.repeatQuestionDetected ? 1 : 0, session.contextRestated ? 1 : 0, session.exportProduced ? 1 : 0, session.judgeScore, JSON.stringify(session.errors));
187
+ }
188
+ /**
189
+ * Check if a prior session exists for the same user + entity combination.
190
+ * If so, the current session can reuse the prior packet.
191
+ */
192
+ function hasPriorPacket(userId, scenarioId, sessionIndex) {
193
+ if (sessionIndex <= 1)
194
+ return false;
195
+ const db = getDb();
196
+ const row = db.prepare(`
197
+ SELECT COUNT(*) as c FROM longitudinal_sessions
198
+ WHERE userId = ? AND scenarioId = ? AND sessionIndex < ? AND packetGenerated = 1
199
+ `).get(userId, scenarioId, sessionIndex);
200
+ return (row?.c ?? 0) > 0;
201
+ }
202
+ // ═══════════════════════════════════════════════════════════════════════════
203
+ // Session Simulation
204
+ // ═══════════════════════════════════════════════════════════════════════════
205
+ async function simulateSession(user, scenarioId, sessionIndex, timeHorizon, batchId, cohortSize) {
206
+ const tools = await getAllTools();
207
+ const chain = SCENARIO_TOOL_CHAINS[scenarioId];
208
+ if (!chain) {
209
+ throw new Error(`Unknown scenario "${scenarioId}". Known: ${Object.keys(SCENARIO_TOOL_CHAINS).join(", ")}`);
210
+ }
211
+ const runId = genId("lh");
212
+ const sessionStart = Date.now();
213
+ let toolCallCount = 0;
214
+ const errors = [];
215
+ let packetGenerated = false;
216
+ let exportProduced = false;
217
+ // Determine packet reuse: if a prior session generated a packet for this user+scenario,
218
+ // the system should reuse it instead of regenerating.
219
+ const priorPacketExists = hasPriorPacket(user.userId, scenarioId, sessionIndex);
220
+ const packetReused = priorPacketExists;
221
+ // Context restatement: if sessionIndex > 1 and no prior packet exists, user had to restate.
222
+ const contextRestated = sessionIndex > 1 && !priorPacketExists;
223
+ // Repeat question: if context was restated, the user likely re-asked old questions.
224
+ const repeatQuestionDetected = contextRestated;
225
+ // Run the tool chain
226
+ for (const toolName of chain) {
227
+ const tool = findTool(tools, toolName);
228
+ if (!tool) {
229
+ errors.push(`tool_not_found:${toolName}`);
230
+ toolCallCount++;
231
+ continue;
232
+ }
233
+ // Build scenario-appropriate args
234
+ const args = buildToolArgs(toolName, user, scenarioId);
235
+ const result = await callTool(tool, args);
236
+ toolCallCount++;
237
+ if (!result.ok) {
238
+ errors.push(`${toolName}:${result.error?.slice(0, 120)}`);
239
+ }
240
+ // Detect packet generation from memo/export tools
241
+ if (toolName === "render_decision_memo" && result.ok) {
242
+ packetGenerated = true;
243
+ exportProduced = true;
244
+ }
245
+ }
246
+ const latencyMs = Date.now() - sessionStart;
247
+ // Judge score: base 3.0, +0.5 if no errors, +0.5 if packet generated,
248
+ // +0.5 if packet reused, -0.5 per error (floor 1.0)
249
+ let judgeScore = 3.0;
250
+ if (errors.length === 0)
251
+ judgeScore += 0.5;
252
+ if (packetGenerated)
253
+ judgeScore += 0.5;
254
+ if (packetReused)
255
+ judgeScore += 0.5;
256
+ judgeScore -= errors.length * 0.5;
257
+ judgeScore = Math.max(1.0, Math.min(5.0, judgeScore));
258
+ // Pick a surface based on scenario
259
+ const surface = scenarioId === "memo_export"
260
+ ? "local_dashboard"
261
+ : scenarioId === "important_change"
262
+ ? "engine_api"
263
+ : "mcp";
264
+ const session = {
265
+ runId,
266
+ userId: user.userId,
267
+ role: user.role,
268
+ scenarioId,
269
+ sessionIndex,
270
+ timeHorizon,
271
+ surface,
272
+ toolCallCount,
273
+ latencyMs,
274
+ packetGenerated,
275
+ packetReused,
276
+ repeatQuestionDetected,
277
+ contextRestated,
278
+ exportProduced,
279
+ judgeScore,
280
+ errors,
281
+ };
282
+ persistSession(session, batchId, cohortSize);
283
+ return session;
284
+ }
285
+ function buildToolArgs(toolName, user, scenarioId) {
286
+ const entity = "Anthropic";
287
+ switch (toolName) {
288
+ case "check_mcp_setup":
289
+ return {};
290
+ case "recon_entity":
291
+ return { entity, scope: scenarioId };
292
+ case "extract_variables":
293
+ return { text: `${entity} analysis for ${user.role} — scenario ${scenarioId}` };
294
+ case "build_claim_graph":
295
+ return { variables: `${entity} key metrics, funding, headcount, product roadmap` };
296
+ case "generate_countermodels":
297
+ return { claimGraph: `${entity} competitive position claim graph` };
298
+ case "rank_interventions":
299
+ return { claimGraph: `${entity} interventions for ${scenarioId}` };
300
+ case "render_decision_memo":
301
+ return {
302
+ interventions: `Top interventions for ${entity}`,
303
+ context: `${user.role} perspective on ${entity} — ${scenarioId}`,
304
+ };
305
+ case "record_event":
306
+ return {
307
+ eventType: `longitudinal.${scenarioId}`,
308
+ actorType: "system",
309
+ entityId: entity.toLowerCase(),
310
+ entityType: "company",
311
+ summary: `Longitudinal harness: ${user.role} ran ${scenarioId} (session ${user.userId})`,
312
+ };
313
+ case "track_milestone":
314
+ return {
315
+ title: `${scenarioId} completed by ${user.role}`,
316
+ category: "longitudinal_benchmark",
317
+ };
318
+ default:
319
+ return {};
320
+ }
321
+ }
322
+ // ═══════════════════════════════════════════════════════════════════════════
323
+ // Metric Computation
324
+ // ═══════════════════════════════════════════════════════════════════════════
325
+ /**
326
+ * Repeated Cognition Avoided (RCA): % of sessions where the user did NOT
327
+ * restate context or re-ask old questions.
328
+ */
329
+ export function computeRCA(sessions) {
330
+ if (sessions.length === 0)
331
+ return 0;
332
+ const avoided = sessions.filter((s) => !s.contextRestated && !s.repeatQuestionDetected).length;
333
+ return (avoided / sessions.length) * 100;
334
+ }
335
+ /**
336
+ * Packet Reuse Rate (PRR): % of sessions where a prior packet was reused
337
+ * rather than regenerated from scratch.
338
+ */
339
+ export function computePRR(sessions) {
340
+ if (sessions.length === 0)
341
+ return 0;
342
+ const reused = sessions.filter((s) => s.packetReused).length;
343
+ return (reused / sessions.length) * 100;
344
+ }
345
+ /**
346
+ * Aggregate all metrics from a batch of sessions into a CohortReport.
347
+ */
348
+ export function generateCohortReport(sessions, cohortSize, layer) {
349
+ const rca = computeRCA(sessions);
350
+ const prr = computePRR(sessions);
351
+ const roles = [...new Set(sessions.map((s) => s.role))];
352
+ const scenarios = [...new Set(sessions.map((s) => s.scenarioId))];
353
+ // Important-change precision: for sessions running "important_change",
354
+ // how many had no errors (simulated precision).
355
+ const importantChangeSessions = sessions.filter((s) => s.scenarioId === "important_change");
356
+ const importantChangePrecision = importantChangeSessions.length > 0
357
+ ? (importantChangeSessions.filter((s) => s.errors.length === 0).length / importantChangeSessions.length) * 100
358
+ : 100;
359
+ // Contradiction precision: simulated as % of sessions with judgeScore >= 3
360
+ const contradictionSessions = sessions.filter((s) => s.judgeScore >= 3);
361
+ const contradictionPrecision = sessions.length > 0
362
+ ? (contradictionSessions.length / sessions.length) * 100
363
+ : 100;
364
+ // False alert rate: inverse of contradiction precision, floored at 0
365
+ const falseAlertRate = Math.max(0, 100 - contradictionPrecision);
366
+ // Export-to-action rate: % of sessions that produced an export
367
+ const exportToActionRate = sessions.length > 0
368
+ ? (sessions.filter((s) => s.exportProduced).length / sessions.length) * 100
369
+ : 0;
370
+ // Find recurring root cause: most common error prefix
371
+ const errorCounts = {};
372
+ for (const s of sessions) {
373
+ for (const e of s.errors) {
374
+ const prefix = e.split(":")[0];
375
+ errorCounts[prefix] = (errorCounts[prefix] ?? 0) + 1;
376
+ }
377
+ }
378
+ const sortedErrors = Object.entries(errorCounts).sort((a, b) => b[1] - a[1]);
379
+ const topRecurringRootCause = sortedErrors.length > 0
380
+ ? `${sortedErrors[0][0]} (${sortedErrors[0][1]} occurrences)`
381
+ : "none";
382
+ // Regression risk: scenarios with lowest avg judge score
383
+ const scenarioScores = {};
384
+ for (const s of sessions) {
385
+ if (!scenarioScores[s.scenarioId])
386
+ scenarioScores[s.scenarioId] = [];
387
+ scenarioScores[s.scenarioId].push(s.judgeScore);
388
+ }
389
+ const scenarioAvgs = Object.entries(scenarioScores).map(([id, scores]) => ({
390
+ id,
391
+ avg: scores.reduce((a, b) => a + b, 0) / scores.length,
392
+ })).sort((a, b) => a.avg - b.avg);
393
+ const topRegressionRisk = scenarioAvgs.length > 0
394
+ ? `${scenarioAvgs[0].id} (avg ${scenarioAvgs[0].avg.toFixed(1)}/5)`
395
+ : "none";
396
+ // Pass/fail evaluation
397
+ const thresholds = PASS_THRESHOLDS[layer];
398
+ let passed = true;
399
+ if (layer === "n1") {
400
+ const avgScore = sessions.length > 0
401
+ ? sessions.reduce((a, s) => a + s.judgeScore, 0) / sessions.length
402
+ : 0;
403
+ passed = avgScore >= thresholds.judgeScore;
404
+ }
405
+ else {
406
+ if (rca < (thresholds.rca ?? 0))
407
+ passed = false;
408
+ if (prr < (thresholds.prr ?? 0))
409
+ passed = false;
410
+ }
411
+ return {
412
+ cohortSize,
413
+ totalSessions: sessions.length,
414
+ rolesCovered: roles,
415
+ coreLoopsCovered: scenarios.length,
416
+ repeatedCognitionAvoided: Math.round(rca * 10) / 10,
417
+ packetReuseRate: Math.round(prr * 10) / 10,
418
+ importantChangePrecision: Math.round(importantChangePrecision * 10) / 10,
419
+ contradictionPrecision: Math.round(contradictionPrecision * 10) / 10,
420
+ falseAlertRate: Math.round(falseAlertRate * 10) / 10,
421
+ exportToActionRate: Math.round(exportToActionRate * 10) / 10,
422
+ topRecurringRootCause,
423
+ topRegressionRisk,
424
+ passed,
425
+ passThresholds: thresholds,
426
+ };
427
+ }
428
+ // ═══════════════════════════════════════════════════════════════════════════
429
+ // N-level Runners
430
+ // ═══════════════════════════════════════════════════════════════════════════
431
+ /**
432
+ * N=1: Single golden-path founder run.
433
+ * Validates that the core tool chain works end-to-end for one scenario.
434
+ */
435
+ export async function runN1() {
436
+ const batchId = genId("batch");
437
+ const user = COHORT_USERS[0]; // founder
438
+ const scenario = user.typicalScenarios[0]; // weekly_reset
439
+ console.log(`\n=== N=1: Golden Path — ${user.role} / ${scenario} ===\n`);
440
+ const session = await simulateSession(user, scenario, 1, "same_session", batchId, 1);
441
+ const report = generateCohortReport([session], 1, "n1");
442
+ printSessionLine(session);
443
+ printReport(report, "N=1");
444
+ return { session, report };
445
+ }
446
+ /**
447
+ * N=5: 5 users (founder, banker, ceo, researcher, student), 1 session each.
448
+ * All against the same entity "Anthropic".
449
+ */
450
+ export async function runN5() {
451
+ const batchId = genId("batch");
452
+ const users = COHORT_USERS.slice(0, 5);
453
+ console.log(`\n=== N=5: Role Generalization — ${users.map((u) => u.role).join(", ")} ===\n`);
454
+ const sessions = [];
455
+ for (const user of users) {
456
+ const scenario = user.typicalScenarios[0];
457
+ const session = await simulateSession(user, scenario, 1, "same_session", batchId, 5);
458
+ sessions.push(session);
459
+ printSessionLine(session);
460
+ }
461
+ const report = generateCohortReport(sessions, 5, "n5");
462
+ printReport(report, "N=5");
463
+ return report;
464
+ }
465
+ /**
466
+ * N=10: 10 users x 1 session each OR 5 users x 2 sessions.
467
+ * Tests session-continuity metrics.
468
+ */
469
+ export async function runN10() {
470
+ const batchId = genId("batch");
471
+ const users = COHORT_USERS.slice(0, 5);
472
+ console.log(`\n=== N=10: Session Continuity — 5 users x 2 sessions ===\n`);
473
+ const sessions = [];
474
+ for (const user of users) {
475
+ for (let sessionIdx = 1; sessionIdx <= 2; sessionIdx++) {
476
+ const scenario = user.typicalScenarios[(sessionIdx - 1) % user.typicalScenarios.length];
477
+ const horizon = sessionIdx === 1 ? "same_session" : "next_day";
478
+ const session = await simulateSession(user, scenario, sessionIdx, horizon, batchId, 10);
479
+ sessions.push(session);
480
+ printSessionLine(session);
481
+ }
482
+ }
483
+ const report = generateCohortReport(sessions, 10, "n10");
484
+ printReport(report, "N=10");
485
+ return report;
486
+ }
487
+ /**
488
+ * N=100: 10 users x 10 sessions each (simulated across time horizons).
489
+ * Measures RCA + PRR compounding over time.
490
+ */
491
+ export async function runN100() {
492
+ const batchId = genId("batch");
493
+ console.log(`\n=== N=100: Longitudinal Compounding — 10 users x 10 sessions ===\n`);
494
+ const sessions = [];
495
+ for (const user of COHORT_USERS) {
496
+ for (let sessionIdx = 1; sessionIdx <= 10; sessionIdx++) {
497
+ const scenario = user.typicalScenarios[(sessionIdx - 1) % user.typicalScenarios.length];
498
+ // Spread sessions across time horizons to simulate real usage patterns
499
+ const horizonIdx = Math.min(sessionIdx - 1, TIME_HORIZONS.length - 1);
500
+ const horizon = TIME_HORIZONS[horizonIdx];
501
+ const session = await simulateSession(user, scenario, sessionIdx, horizon, batchId, 100);
502
+ sessions.push(session);
503
+ printSessionLine(session);
504
+ }
505
+ }
506
+ const report = generateCohortReport(sessions, 100, "n100");
507
+ printReport(report, "N=100");
508
+ return report;
509
+ }
510
+ // ═══════════════════════════════════════════════════════════════════════════
511
+ // Output Formatting
512
+ // ═══════════════════════════════════════════════════════════════════════════
513
+ function printSessionLine(s) {
514
+ const status = s.errors.length === 0 ? "OK" : `ERR(${s.errors.length})`;
515
+ const reuse = s.packetReused ? "REUSE" : s.packetGenerated ? "NEW" : "NONE";
516
+ const restated = s.contextRestated ? "RESTATED" : "FRESH";
517
+ console.log(` [${s.role.padEnd(10)}] sess=${s.sessionIndex} ${s.scenarioId.padEnd(18)} ` +
518
+ `tools=${s.toolCallCount} ${s.latencyMs}ms judge=${s.judgeScore.toFixed(1)} ` +
519
+ `packet=${reuse} ctx=${restated} ${status}`);
520
+ }
521
+ function printReport(report, label) {
522
+ const passLabel = report.passed ? "PASS" : "FAIL";
523
+ console.log(`
524
+ ╔══════════════════════════════════════════════════════════════╗
525
+ ║ ${label} COHORT REPORT ${passLabel.padStart(6)} ║
526
+ ╠══════════════════════════════════════════════════════════════╣
527
+ ║ Cohort size: ${String(report.cohortSize).padStart(6)} ║
528
+ ║ Total sessions: ${String(report.totalSessions).padStart(6)} ║
529
+ ║ Roles covered: ${String(report.rolesCovered.length).padStart(6)} ║
530
+ ║ Core loops covered: ${String(report.coreLoopsCovered).padStart(6)} ║
531
+ ╠══════════════════════════════════════════════════════════════╣
532
+ ║ RCA (Repeated Cognition Avoided): ${String(report.repeatedCognitionAvoided).padStart(6)}% ║
533
+ ║ PRR (Packet Reuse Rate): ${String(report.packetReuseRate).padStart(6)}% ║
534
+ ║ Important-Change Precision: ${String(report.importantChangePrecision).padStart(6)}% ║
535
+ ║ Contradiction Precision: ${String(report.contradictionPrecision).padStart(6)}% ║
536
+ ║ False Alert Rate: ${String(report.falseAlertRate).padStart(6)}% ║
537
+ ║ Export-to-Action Rate: ${String(report.exportToActionRate).padStart(6)}% ║
538
+ ╠══════════════════════════════════════════════════════════════╣
539
+ ║ Top recurring root cause: ${report.topRecurringRootCause.slice(0, 32).padEnd(32)} ║
540
+ ║ Top regression risk: ${report.topRegressionRisk.slice(0, 32).padEnd(32)} ║
541
+ ╠══════════════════════════════════════════════════════════════╣
542
+ ║ Pass thresholds: ${JSON.stringify(report.passThresholds).slice(0, 40).padEnd(40)} ║
543
+ ╚══════════════════════════════════════════════════════════════╝
544
+ `);
545
+ }
546
+ // ═══════════════════════════════════════════════════════════════════════════
547
+ // CLI Entry Point
548
+ // ═══════════════════════════════════════════════════════════════════════════
549
+ async function main() {
550
+ const arg = process.argv[2]?.toLowerCase() ?? "n5";
551
+ console.log("=== NodeBench Longitudinal Dogfood Harness ===");
552
+ console.log(`Mode: ${arg}\n`);
553
+ ensureSchema();
554
+ switch (arg) {
555
+ case "n1": {
556
+ await runN1();
557
+ break;
558
+ }
559
+ case "n5": {
560
+ await runN5();
561
+ break;
562
+ }
563
+ case "n10": {
564
+ await runN10();
565
+ break;
566
+ }
567
+ case "n100": {
568
+ await runN100();
569
+ break;
570
+ }
571
+ case "all": {
572
+ const results = [];
573
+ const r1 = await runN1();
574
+ results.push({ layer: "N=1", passed: r1.report.passed });
575
+ const r5 = await runN5();
576
+ results.push({ layer: "N=5", passed: r5.passed });
577
+ const r10 = await runN10();
578
+ results.push({ layer: "N=10", passed: r10.passed });
579
+ const r100 = await runN100();
580
+ results.push({ layer: "N=100", passed: r100.passed });
581
+ console.log("\n=== ALL LAYERS SUMMARY ===");
582
+ for (const r of results) {
583
+ console.log(` ${r.layer}: ${r.passed ? "PASS" : "FAIL"}`);
584
+ }
585
+ const allPassed = results.every((r) => r.passed);
586
+ console.log(`\nOverall: ${allPassed ? "ALL PASSED" : "SOME FAILED"}`);
587
+ break;
588
+ }
589
+ default:
590
+ console.error(`Unknown mode "${arg}". Use: n1, n5, n10, n100, all`);
591
+ process.exit(1);
592
+ }
593
+ }
594
+ main().catch((err) => {
595
+ console.error("Fatal:", err);
596
+ process.exit(1);
597
+ });
598
+ //# sourceMappingURL=longitudinalHarness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"longitudinalHarness.js","sourceRoot":"","sources":["../../src/benchmarks/longitudinalHarness.ts"],"names":[],"mappings":"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"}