nodebench-mcp 2.38.0 → 2.40.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +135 -1001
- package/dist/benchmarks/dogfoodRunner.d.ts +12 -0
- package/dist/benchmarks/dogfoodRunner.js +421 -0
- package/dist/benchmarks/dogfoodRunner.js.map +1 -0
- package/dist/tools/dogfoodJudgeTools.js +203 -0
- package/dist/tools/dogfoodJudgeTools.js.map +1 -1
- package/dist/tools/toolRegistry.js +26 -0
- package/dist/tools/toolRegistry.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env npx tsx
|
|
2
|
+
/**
|
|
3
|
+
* dogfoodRunner.ts — 4-scenario MCP dogfood harness
|
|
4
|
+
*
|
|
5
|
+
* Imports tool handlers directly (no MCP transport), runs each scenario
|
|
6
|
+
* sequentially, records telemetry via record_dogfood_telemetry, and
|
|
7
|
+
* prints a summary table.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* cd packages/mcp-local && npx tsx src/benchmarks/dogfoodRunner.ts
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
#!/usr/bin/env npx tsx
|
|
2
|
+
/**
|
|
3
|
+
* dogfoodRunner.ts — 4-scenario MCP dogfood harness
|
|
4
|
+
*
|
|
5
|
+
* Imports tool handlers directly (no MCP transport), runs each scenario
|
|
6
|
+
* sequentially, records telemetry via record_dogfood_telemetry, and
|
|
7
|
+
* prints a summary table.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* cd packages/mcp-local && npx tsx src/benchmarks/dogfoodRunner.ts
|
|
11
|
+
*/
|
|
12
|
+
import { dogfoodJudgeTools } from "../tools/dogfoodJudgeTools.js";
|
|
13
|
+
import { createMetaTools } from "../tools/metaTools.js";
|
|
14
|
+
import { createProgressiveDiscoveryTools } from "../tools/progressiveDiscoveryTools.js";
|
|
15
|
+
import { loadToolsets, ALL_DOMAIN_KEYS, TOOLSET_MAP } from "../toolsetRegistry.js";
|
|
16
|
+
import { getDb } from "../db.js";
|
|
17
|
+
import { _setDbAccessor } from "../tools/toolRegistry.js";
|
|
18
|
+
// ── Helpers ──────────────────────────────────────────────────────────────
|
|
19
|
+
/** Find a tool by name in a flat array */
|
|
20
|
+
function findTool(tools, name) {
|
|
21
|
+
const t = tools.find((t) => t.name === name);
|
|
22
|
+
if (!t)
|
|
23
|
+
throw new Error(`Tool "${name}" not found. Available: ${tools.map((t) => t.name).join(", ").slice(0, 200)}...`);
|
|
24
|
+
return t;
|
|
25
|
+
}
|
|
26
|
+
/** Safely call a handler, returning { ok, result, error, ms } */
|
|
27
|
+
async function callTool(tool, args = {}) {
|
|
28
|
+
const start = Date.now();
|
|
29
|
+
try {
|
|
30
|
+
const result = await tool.handler(args);
|
|
31
|
+
return { ok: true, result, ms: Date.now() - start };
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
return {
|
|
35
|
+
ok: false,
|
|
36
|
+
result: null,
|
|
37
|
+
error: err?.message ?? String(err),
|
|
38
|
+
ms: Date.now() - start,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/** Extract text from MCP content blocks */
|
|
43
|
+
function extractText(result) {
|
|
44
|
+
if (!result)
|
|
45
|
+
return "(null)";
|
|
46
|
+
if (typeof result === "string")
|
|
47
|
+
return result;
|
|
48
|
+
if (Array.isArray(result)) {
|
|
49
|
+
const texts = result
|
|
50
|
+
.filter((b) => b?.type === "text")
|
|
51
|
+
.map((b) => b.text);
|
|
52
|
+
if (texts.length)
|
|
53
|
+
return texts.join("\n");
|
|
54
|
+
}
|
|
55
|
+
if (typeof result === "object") {
|
|
56
|
+
return JSON.stringify(result).slice(0, 500);
|
|
57
|
+
}
|
|
58
|
+
return String(result);
|
|
59
|
+
}
|
|
60
|
+
// ── Main ─────────────────────────────────────────────────────────────────
|
|
61
|
+
async function main() {
|
|
62
|
+
console.log("=== NodeBench MCP Dogfood Runner ===\n");
|
|
63
|
+
// Init DB (creates ~/.nodebench/ if needed)
|
|
64
|
+
getDb();
|
|
65
|
+
_setDbAccessor(getDb);
|
|
66
|
+
// Load all toolsets so we have the full catalog for meta/discovery tools
|
|
67
|
+
console.log("Loading all toolsets...");
|
|
68
|
+
const domainTools = await loadToolsets(ALL_DOMAIN_KEYS);
|
|
69
|
+
console.log(` Loaded ${domainTools.length} domain tools across ${ALL_DOMAIN_KEYS.length} domains\n`);
|
|
70
|
+
// Build meta tools (check_mcp_setup etc.)
|
|
71
|
+
const metaTools = createMetaTools(domainTools);
|
|
72
|
+
// Build progressive discovery tools
|
|
73
|
+
const allToolsFlat = [...domainTools, ...metaTools, ...dogfoodJudgeTools];
|
|
74
|
+
const discoveryTools = createProgressiveDiscoveryTools(allToolsFlat.map((t) => ({ name: t.name, description: t.description })));
|
|
75
|
+
// Grand combined tool list
|
|
76
|
+
const allTools = [...allToolsFlat, ...discoveryTools];
|
|
77
|
+
console.log(`Total tools assembled: ${allTools.length}\n`);
|
|
78
|
+
const results = [];
|
|
79
|
+
// ════════════════════════════════════════════════════════════════════
|
|
80
|
+
// Scenario 1: Setup sanity + preset confirmation
|
|
81
|
+
// ════════════════════════════════════════════════════════════════════
|
|
82
|
+
{
|
|
83
|
+
console.log("── Scenario 1: Setup sanity + preset confirmation ──");
|
|
84
|
+
const scenarioStart = Date.now();
|
|
85
|
+
const errors = [];
|
|
86
|
+
let toolCalls = 0;
|
|
87
|
+
// 1a. check_mcp_setup
|
|
88
|
+
const setup = await callTool(findTool(allTools, "check_mcp_setup"), {});
|
|
89
|
+
toolCalls++;
|
|
90
|
+
if (!setup.ok)
|
|
91
|
+
errors.push(`check_mcp_setup: ${setup.error}`);
|
|
92
|
+
else
|
|
93
|
+
console.log(` check_mcp_setup: OK (${setup.ms}ms)`);
|
|
94
|
+
// 1b. list_available_toolsets — this tool is inline in index.ts,
|
|
95
|
+
// so we simulate it by listing TOOLSET_MAP keys
|
|
96
|
+
const toolsetNames = ALL_DOMAIN_KEYS;
|
|
97
|
+
const loadedToolsets = Object.keys(TOOLSET_MAP);
|
|
98
|
+
toolCalls++;
|
|
99
|
+
console.log(` list_available_toolsets (simulated): ${loadedToolsets.length} loaded of ${toolsetNames.length} total (${0}ms)`);
|
|
100
|
+
// 1c. discover_tools
|
|
101
|
+
const discover = await callTool(findTool(allTools, "discover_tools"), {
|
|
102
|
+
query: "preset recommendation founder operator banker researcher starter",
|
|
103
|
+
});
|
|
104
|
+
toolCalls++;
|
|
105
|
+
if (!discover.ok)
|
|
106
|
+
errors.push(`discover_tools: ${discover.error}`);
|
|
107
|
+
else
|
|
108
|
+
console.log(` discover_tools: OK (${discover.ms}ms)`);
|
|
109
|
+
// 1d. Record telemetry
|
|
110
|
+
const telemetry = await callTool(findTool(allTools, "record_dogfood_telemetry"), {
|
|
111
|
+
scenarioId: "mcp_setup_sanity",
|
|
112
|
+
userRole: "founder",
|
|
113
|
+
primaryPrompt: "Setup sanity check: verify MCP health, list presets, discover preset-related tools",
|
|
114
|
+
surface: "mcp",
|
|
115
|
+
toolsInvoked: ["check_mcp_setup", "list_available_toolsets", "discover_tools"],
|
|
116
|
+
toolCallCount: toolCalls,
|
|
117
|
+
latencyMs: Date.now() - scenarioStart,
|
|
118
|
+
});
|
|
119
|
+
toolCalls++;
|
|
120
|
+
if (!telemetry.ok)
|
|
121
|
+
errors.push(`record_dogfood_telemetry: ${telemetry.error}`);
|
|
122
|
+
const totalMs = Date.now() - scenarioStart;
|
|
123
|
+
const pass = errors.length === 0;
|
|
124
|
+
results.push({ scenarioId: "mcp_setup_sanity", userRole: "founder", surface: "mcp", toolCalls, totalMs, errors, pass });
|
|
125
|
+
console.log(` Result: ${pass ? "PASS" : "FAIL"} (${totalMs}ms, ${toolCalls} calls, ${errors.length} errors)\n`);
|
|
126
|
+
}
|
|
127
|
+
// ════════════════════════════════════════════════════════════════════
|
|
128
|
+
// Scenario 2: Founder preset weekly reset
|
|
129
|
+
// ════════════════════════════════════════════════════════════════════
|
|
130
|
+
{
|
|
131
|
+
console.log("── Scenario 2: Founder preset weekly reset ──");
|
|
132
|
+
const scenarioStart = Date.now();
|
|
133
|
+
const errors = [];
|
|
134
|
+
let toolCalls = 0;
|
|
135
|
+
// 2a. founder_deep_context_gather
|
|
136
|
+
const gather = await callTool(findTool(allTools, "founder_deep_context_gather"), {
|
|
137
|
+
rawInput: "NodeBench is the local-first operating-memory and entity-context layer for agent-native businesses. We just shipped Phase 10-14: causal memory, ambient intelligence, provider bus, dogfood judge system, dynamic imports, starter preset. Main contradiction: too many surfaces before proving the 3 core habits (weekly reset, pre-delegation brief, important-change review). Public narrative still lags internal thesis.",
|
|
138
|
+
});
|
|
139
|
+
toolCalls++;
|
|
140
|
+
if (!gather.ok)
|
|
141
|
+
errors.push(`founder_deep_context_gather: ${gather.error}`);
|
|
142
|
+
else
|
|
143
|
+
console.log(` founder_deep_context_gather: OK (${gather.ms}ms)`);
|
|
144
|
+
// 2b. extract_variables
|
|
145
|
+
const extractVars = await callTool(findTool(allTools, "extract_variables"), {
|
|
146
|
+
context: extractText(gather.result),
|
|
147
|
+
});
|
|
148
|
+
toolCalls++;
|
|
149
|
+
if (!extractVars.ok)
|
|
150
|
+
errors.push(`extract_variables: ${extractVars.error}`);
|
|
151
|
+
else
|
|
152
|
+
console.log(` extract_variables: OK (${extractVars.ms}ms)`);
|
|
153
|
+
// 2c. build_claim_graph
|
|
154
|
+
const claimGraph = await callTool(findTool(allTools, "build_claim_graph"), {
|
|
155
|
+
variables: extractText(extractVars.result),
|
|
156
|
+
});
|
|
157
|
+
toolCalls++;
|
|
158
|
+
if (!claimGraph.ok)
|
|
159
|
+
errors.push(`build_claim_graph: ${claimGraph.error}`);
|
|
160
|
+
else
|
|
161
|
+
console.log(` build_claim_graph: OK (${claimGraph.ms}ms)`);
|
|
162
|
+
// 2d. rank_interventions
|
|
163
|
+
const rankInt = await callTool(findTool(allTools, "rank_interventions"), {
|
|
164
|
+
claimGraph: extractText(claimGraph.result),
|
|
165
|
+
});
|
|
166
|
+
toolCalls++;
|
|
167
|
+
if (!rankInt.ok)
|
|
168
|
+
errors.push(`rank_interventions: ${rankInt.error}`);
|
|
169
|
+
else
|
|
170
|
+
console.log(` rank_interventions: OK (${rankInt.ms}ms)`);
|
|
171
|
+
// 2e. render_decision_memo
|
|
172
|
+
const memo = await callTool(findTool(allTools, "render_decision_memo"), {
|
|
173
|
+
interventions: extractText(rankInt.result),
|
|
174
|
+
context: extractText(gather.result),
|
|
175
|
+
});
|
|
176
|
+
toolCalls++;
|
|
177
|
+
if (!memo.ok)
|
|
178
|
+
errors.push(`render_decision_memo: ${memo.error}`);
|
|
179
|
+
else
|
|
180
|
+
console.log(` render_decision_memo: OK (${memo.ms}ms)`);
|
|
181
|
+
// 2f. founder_packet_validate
|
|
182
|
+
// This tool requires Convex gateway. Treat gateway-missing as soft pass.
|
|
183
|
+
const validate = await callTool(findTool(allTools, "founder_packet_validate"), {
|
|
184
|
+
packet: extractText(memo.result),
|
|
185
|
+
});
|
|
186
|
+
toolCalls++;
|
|
187
|
+
if (!validate.ok) {
|
|
188
|
+
const isGatewayMissing = validate.error?.includes("Cannot call Deep Sim backend") || validate.error?.includes("CONVEX");
|
|
189
|
+
if (isGatewayMissing) {
|
|
190
|
+
console.log(` founder_packet_validate: SKIP (no Convex gateway — expected in local-only mode, ${validate.ms}ms)`);
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
errors.push(`founder_packet_validate: ${validate.error}`);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
// Also handle gateway error returned as a successful result with error flag
|
|
198
|
+
const resultStr = JSON.stringify(validate.result);
|
|
199
|
+
if (resultStr.includes('"error":true') && resultStr.includes("Cannot call Deep Sim backend")) {
|
|
200
|
+
console.log(` founder_packet_validate: SKIP (no Convex gateway — expected in local-only mode, ${validate.ms}ms)`);
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
console.log(` founder_packet_validate: OK (${validate.ms}ms)`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// 2g. Record telemetry
|
|
207
|
+
const telemetry = await callTool(findTool(allTools, "record_dogfood_telemetry"), {
|
|
208
|
+
scenarioId: "founder_weekly_reset",
|
|
209
|
+
userRole: "founder",
|
|
210
|
+
primaryPrompt: "Founder weekly reset: deep context gather -> extract variables -> claim graph -> rank interventions -> decision memo -> validate",
|
|
211
|
+
surface: "mcp",
|
|
212
|
+
toolsInvoked: [
|
|
213
|
+
"founder_deep_context_gather", "extract_variables", "build_claim_graph",
|
|
214
|
+
"rank_interventions", "render_decision_memo", "founder_packet_validate",
|
|
215
|
+
],
|
|
216
|
+
toolCallCount: toolCalls,
|
|
217
|
+
latencyMs: Date.now() - scenarioStart,
|
|
218
|
+
});
|
|
219
|
+
toolCalls++;
|
|
220
|
+
if (!telemetry.ok)
|
|
221
|
+
errors.push(`record_dogfood_telemetry: ${telemetry.error}`);
|
|
222
|
+
const totalMs = Date.now() - scenarioStart;
|
|
223
|
+
const pass = errors.length === 0;
|
|
224
|
+
results.push({ scenarioId: "founder_weekly_reset", userRole: "founder", surface: "mcp", toolCalls, totalMs, errors, pass });
|
|
225
|
+
console.log(` Result: ${pass ? "PASS" : "FAIL"} (${totalMs}ms, ${toolCalls} calls, ${errors.length} errors)\n`);
|
|
226
|
+
}
|
|
227
|
+
// ════════════════════════════════════════════════════════════════════
|
|
228
|
+
// Scenario 3: Banker blank-state company search
|
|
229
|
+
// ════════════════════════════════════════════════════════════════════
|
|
230
|
+
{
|
|
231
|
+
console.log("── Scenario 3: Banker blank-state company search ──");
|
|
232
|
+
const scenarioStart = Date.now();
|
|
233
|
+
const errors = [];
|
|
234
|
+
let toolCalls = 0;
|
|
235
|
+
// 3a. run_recon
|
|
236
|
+
const recon = await callTool(findTool(allTools, "run_recon"), {
|
|
237
|
+
target: "Anthropic",
|
|
238
|
+
scope: "company",
|
|
239
|
+
});
|
|
240
|
+
toolCalls++;
|
|
241
|
+
if (!recon.ok)
|
|
242
|
+
errors.push(`run_recon: ${recon.error}`);
|
|
243
|
+
else
|
|
244
|
+
console.log(` run_recon: OK (${recon.ms}ms)`);
|
|
245
|
+
// 3b. extract_variables
|
|
246
|
+
const extractVars = await callTool(findTool(allTools, "extract_variables"), {
|
|
247
|
+
context: extractText(recon.result),
|
|
248
|
+
});
|
|
249
|
+
toolCalls++;
|
|
250
|
+
if (!extractVars.ok)
|
|
251
|
+
errors.push(`extract_variables: ${extractVars.error}`);
|
|
252
|
+
else
|
|
253
|
+
console.log(` extract_variables: OK (${extractVars.ms}ms)`);
|
|
254
|
+
// 3c. build_claim_graph
|
|
255
|
+
const claimGraph = await callTool(findTool(allTools, "build_claim_graph"), {
|
|
256
|
+
variables: extractText(extractVars.result),
|
|
257
|
+
});
|
|
258
|
+
toolCalls++;
|
|
259
|
+
if (!claimGraph.ok)
|
|
260
|
+
errors.push(`build_claim_graph: ${claimGraph.error}`);
|
|
261
|
+
else
|
|
262
|
+
console.log(` build_claim_graph: OK (${claimGraph.ms}ms)`);
|
|
263
|
+
// 3d. rank_interventions
|
|
264
|
+
const rankInt = await callTool(findTool(allTools, "rank_interventions"), {
|
|
265
|
+
claimGraph: extractText(claimGraph.result),
|
|
266
|
+
});
|
|
267
|
+
toolCalls++;
|
|
268
|
+
if (!rankInt.ok)
|
|
269
|
+
errors.push(`rank_interventions: ${rankInt.error}`);
|
|
270
|
+
else
|
|
271
|
+
console.log(` rank_interventions: OK (${rankInt.ms}ms)`);
|
|
272
|
+
// 3e. render_decision_memo (banker lens)
|
|
273
|
+
const memo = await callTool(findTool(allTools, "render_decision_memo"), {
|
|
274
|
+
interventions: extractText(rankInt.result),
|
|
275
|
+
context: extractText(recon.result),
|
|
276
|
+
lens: "banker",
|
|
277
|
+
});
|
|
278
|
+
toolCalls++;
|
|
279
|
+
if (!memo.ok)
|
|
280
|
+
errors.push(`render_decision_memo: ${memo.error}`);
|
|
281
|
+
else
|
|
282
|
+
console.log(` render_decision_memo: OK (${memo.ms}ms)`);
|
|
283
|
+
// 3f. Record telemetry
|
|
284
|
+
const telemetry = await callTool(findTool(allTools, "record_dogfood_telemetry"), {
|
|
285
|
+
scenarioId: "banker_anthropic_search",
|
|
286
|
+
userRole: "banker",
|
|
287
|
+
primaryPrompt: "Banker blank-state company search: recon Anthropic -> extract variables -> claim graph -> rank interventions -> decision memo (banker lens)",
|
|
288
|
+
surface: "mcp",
|
|
289
|
+
toolsInvoked: [
|
|
290
|
+
"run_recon", "extract_variables", "build_claim_graph",
|
|
291
|
+
"rank_interventions", "render_decision_memo",
|
|
292
|
+
],
|
|
293
|
+
toolCallCount: toolCalls,
|
|
294
|
+
latencyMs: Date.now() - scenarioStart,
|
|
295
|
+
});
|
|
296
|
+
toolCalls++;
|
|
297
|
+
if (!telemetry.ok)
|
|
298
|
+
errors.push(`record_dogfood_telemetry: ${telemetry.error}`);
|
|
299
|
+
const totalMs = Date.now() - scenarioStart;
|
|
300
|
+
const pass = errors.length === 0;
|
|
301
|
+
results.push({ scenarioId: "banker_anthropic_search", userRole: "banker", surface: "mcp", toolCalls, totalMs, errors, pass });
|
|
302
|
+
console.log(` Result: ${pass ? "PASS" : "FAIL"} (${totalMs}ms, ${toolCalls} calls, ${errors.length} errors)\n`);
|
|
303
|
+
}
|
|
304
|
+
// ════════════════════════════════════════════════════════════════════
|
|
305
|
+
// Scenario 4: Public-doc drift detection
|
|
306
|
+
// ════════════════════════════════════════════════════════════════════
|
|
307
|
+
{
|
|
308
|
+
console.log("── Scenario 4: Public-doc drift detection ──");
|
|
309
|
+
const scenarioStart = Date.now();
|
|
310
|
+
const errors = [];
|
|
311
|
+
let toolCalls = 0;
|
|
312
|
+
// 4a. founder_deep_context_gather
|
|
313
|
+
const gather = await callTool(findTool(allTools, "founder_deep_context_gather"), {
|
|
314
|
+
rawInput: "Internal thesis: NodeBench is the operating memory for agent-native businesses — local-first, MCP-native, 304 tools with progressive discovery. Public positioning (README, landing page, npm description): still says 'Development Methodology Edition' and '6-Phase Verification'. The internal product has evolved past the public narrative. Need to detect and flag this drift before it causes confusion with early adopters.",
|
|
315
|
+
});
|
|
316
|
+
toolCalls++;
|
|
317
|
+
if (!gather.ok)
|
|
318
|
+
errors.push(`founder_deep_context_gather: ${gather.error}`);
|
|
319
|
+
else
|
|
320
|
+
console.log(` founder_deep_context_gather: OK (${gather.ms}ms)`);
|
|
321
|
+
// 4b. extract_variables
|
|
322
|
+
const extractVars = await callTool(findTool(allTools, "extract_variables"), {
|
|
323
|
+
context: extractText(gather.result),
|
|
324
|
+
});
|
|
325
|
+
toolCalls++;
|
|
326
|
+
if (!extractVars.ok)
|
|
327
|
+
errors.push(`extract_variables: ${extractVars.error}`);
|
|
328
|
+
else
|
|
329
|
+
console.log(` extract_variables: OK (${extractVars.ms}ms)`);
|
|
330
|
+
// 4c. build_claim_graph
|
|
331
|
+
const claimGraph = await callTool(findTool(allTools, "build_claim_graph"), {
|
|
332
|
+
variables: extractText(extractVars.result),
|
|
333
|
+
});
|
|
334
|
+
toolCalls++;
|
|
335
|
+
if (!claimGraph.ok)
|
|
336
|
+
errors.push(`build_claim_graph: ${claimGraph.error}`);
|
|
337
|
+
else
|
|
338
|
+
console.log(` build_claim_graph: OK (${claimGraph.ms}ms)`);
|
|
339
|
+
// 4d. render_decision_memo
|
|
340
|
+
const memo = await callTool(findTool(allTools, "render_decision_memo"), {
|
|
341
|
+
claimGraph: extractText(claimGraph.result),
|
|
342
|
+
context: extractText(gather.result),
|
|
343
|
+
});
|
|
344
|
+
toolCalls++;
|
|
345
|
+
if (!memo.ok)
|
|
346
|
+
errors.push(`render_decision_memo: ${memo.error}`);
|
|
347
|
+
else
|
|
348
|
+
console.log(` render_decision_memo: OK (${memo.ms}ms)`);
|
|
349
|
+
// 4e. flag_important_change
|
|
350
|
+
const flag = await callTool(findTool(allTools, "flag_important_change"), {
|
|
351
|
+
changeCategory: "contradiction_found",
|
|
352
|
+
impactScore: 0.85,
|
|
353
|
+
impactReason: "Internal product thesis (operating memory for agent-native businesses, 304 tools, progressive discovery, causal memory) has diverged from public-facing copy (Development Methodology Edition, 6-Phase Verification). Public narrative lags by ~3 major phases.",
|
|
354
|
+
affectedEntities: [
|
|
355
|
+
{ entityType: "document", entityId: "nodebench-readme" },
|
|
356
|
+
{ entityType: "document", entityId: "nodebench-landing-page" },
|
|
357
|
+
{ entityType: "document", entityId: "npm-package-description" },
|
|
358
|
+
],
|
|
359
|
+
suggestedAction: "Update README, landing page hero copy, and npm description to reflect current product identity: operating memory for agent-native businesses.",
|
|
360
|
+
});
|
|
361
|
+
toolCalls++;
|
|
362
|
+
if (!flag.ok)
|
|
363
|
+
errors.push(`flag_important_change: ${flag.error}`);
|
|
364
|
+
else
|
|
365
|
+
console.log(` flag_important_change: OK (${flag.ms}ms)`);
|
|
366
|
+
// 4f. Record telemetry
|
|
367
|
+
const telemetry = await callTool(findTool(allTools, "record_dogfood_telemetry"), {
|
|
368
|
+
scenarioId: "public_doc_drift",
|
|
369
|
+
userRole: "founder",
|
|
370
|
+
primaryPrompt: "Public-doc drift detection: deep context gather about internal vs public positioning mismatch -> extract variables -> claim graph -> decision memo -> flag important change",
|
|
371
|
+
surface: "mcp",
|
|
372
|
+
toolsInvoked: [
|
|
373
|
+
"founder_deep_context_gather", "extract_variables", "build_claim_graph",
|
|
374
|
+
"render_decision_memo", "flag_important_change",
|
|
375
|
+
],
|
|
376
|
+
toolCallCount: toolCalls,
|
|
377
|
+
latencyMs: Date.now() - scenarioStart,
|
|
378
|
+
});
|
|
379
|
+
toolCalls++;
|
|
380
|
+
if (!telemetry.ok)
|
|
381
|
+
errors.push(`record_dogfood_telemetry: ${telemetry.error}`);
|
|
382
|
+
const totalMs = Date.now() - scenarioStart;
|
|
383
|
+
const pass = errors.length === 0;
|
|
384
|
+
results.push({ scenarioId: "public_doc_drift", userRole: "founder", surface: "mcp", toolCalls, totalMs, errors, pass });
|
|
385
|
+
console.log(` Result: ${pass ? "PASS" : "FAIL"} (${totalMs}ms, ${toolCalls} calls, ${errors.length} errors)\n`);
|
|
386
|
+
}
|
|
387
|
+
// ════════════════════════════════════════════════════════════════════
|
|
388
|
+
// Summary Table
|
|
389
|
+
// ════════════════════════════════════════════════════════════════════
|
|
390
|
+
console.log("╔══════════════════════════════╦═══════════╦═══════════╦════════════╦════════╗");
|
|
391
|
+
console.log("║ Scenario ║ Tool Calls║ Latency ║ Errors ║ Result ║");
|
|
392
|
+
console.log("╠══════════════════════════════╬═══════════╬═══════════╬════════════╬════════╣");
|
|
393
|
+
for (const r of results) {
|
|
394
|
+
const name = r.scenarioId.padEnd(28);
|
|
395
|
+
const calls = String(r.toolCalls).padStart(9);
|
|
396
|
+
const ms = `${r.totalMs}ms`.padStart(9);
|
|
397
|
+
const errs = String(r.errors.length).padStart(10);
|
|
398
|
+
const status = r.pass ? " PASS " : " FAIL ";
|
|
399
|
+
console.log(`║ ${name} ║${calls} ║${ms} ║${errs} ║${status}║`);
|
|
400
|
+
}
|
|
401
|
+
console.log("╚══════════════════════════════╩═══════════╩═══════════╩════════════╩════════╝");
|
|
402
|
+
const totalPass = results.filter((r) => r.pass).length;
|
|
403
|
+
const totalFail = results.filter((r) => !r.pass).length;
|
|
404
|
+
console.log(`\nTotal: ${totalPass} passed, ${totalFail} failed out of ${results.length} scenarios`);
|
|
405
|
+
// Print errors if any
|
|
406
|
+
for (const r of results) {
|
|
407
|
+
if (r.errors.length > 0) {
|
|
408
|
+
console.log(`\n Errors in ${r.scenarioId}:`);
|
|
409
|
+
for (const e of r.errors) {
|
|
410
|
+
console.log(` - ${e}`);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
console.log("\nDone. Telemetry recorded to ~/.nodebench/nodebench.db");
|
|
415
|
+
process.exit(totalFail > 0 ? 1 : 0);
|
|
416
|
+
}
|
|
417
|
+
main().catch((err) => {
|
|
418
|
+
console.error("Fatal error:", err);
|
|
419
|
+
process.exit(2);
|
|
420
|
+
});
|
|
421
|
+
//# sourceMappingURL=dogfoodRunner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dogfoodRunner.js","sourceRoot":"","sources":["../../src/benchmarks/dogfoodRunner.ts"],"names":[],"mappings":"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"}
|