nodebench-mcp 2.14.1 → 2.15.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.
Files changed (36) hide show
  1. package/NODEBENCH_AGENTS.md +19 -9
  2. package/README.md +42 -19
  3. package/dist/__tests__/critterCalibrationEval.d.ts +8 -0
  4. package/dist/__tests__/critterCalibrationEval.js +370 -0
  5. package/dist/__tests__/critterCalibrationEval.js.map +1 -0
  6. package/dist/__tests__/embeddingProvider.test.d.ts +1 -0
  7. package/dist/__tests__/embeddingProvider.test.js +86 -0
  8. package/dist/__tests__/embeddingProvider.test.js.map +1 -0
  9. package/dist/__tests__/gaiaCapabilityAudioEval.test.js +1 -1
  10. package/dist/__tests__/gaiaCapabilityAudioEval.test.js.map +1 -1
  11. package/dist/__tests__/gaiaCapabilityEval.test.js +541 -27
  12. package/dist/__tests__/gaiaCapabilityEval.test.js.map +1 -1
  13. package/dist/__tests__/gaiaCapabilityFilesEval.test.js +1 -1
  14. package/dist/__tests__/gaiaCapabilityFilesEval.test.js.map +1 -1
  15. package/dist/__tests__/gaiaCapabilityMediaEval.test.js +473 -4
  16. package/dist/__tests__/gaiaCapabilityMediaEval.test.js.map +1 -1
  17. package/dist/__tests__/tools.test.js +1010 -8
  18. package/dist/__tests__/tools.test.js.map +1 -1
  19. package/dist/db.js +64 -0
  20. package/dist/db.js.map +1 -1
  21. package/dist/index.js +70 -9
  22. package/dist/index.js.map +1 -1
  23. package/dist/tools/critterTools.d.ts +21 -0
  24. package/dist/tools/critterTools.js +230 -0
  25. package/dist/tools/critterTools.js.map +1 -0
  26. package/dist/tools/embeddingProvider.d.ts +67 -0
  27. package/dist/tools/embeddingProvider.js +299 -0
  28. package/dist/tools/embeddingProvider.js.map +1 -0
  29. package/dist/tools/progressiveDiscoveryTools.js +24 -7
  30. package/dist/tools/progressiveDiscoveryTools.js.map +1 -1
  31. package/dist/tools/reconTools.js +83 -33
  32. package/dist/tools/reconTools.js.map +1 -1
  33. package/dist/tools/toolRegistry.d.ts +30 -2
  34. package/dist/tools/toolRegistry.js +253 -25
  35. package/dist/tools/toolRegistry.js.map +1 -1
  36. package/package.json +13 -3
@@ -21,7 +21,7 @@ Add to `~/.claude/settings.json`:
21
21
  }
22
22
  ```
23
23
 
24
- Restart Claude Code. 89+ tools available immediately.
24
+ Restart Claude Code. 163 tools available immediately.
25
25
 
26
26
  ### Preset Selection
27
27
 
@@ -264,7 +264,7 @@ Use `getMethodology("overview")` to see all available workflows.
264
264
  | Category | Tools | When to Use |
265
265
  |----------|-------|-------------|
266
266
  | **Web** | `web_search`, `fetch_url` | Research, reading docs, market validation |
267
- | **Local Files** | `read_pdf_text`, `pdf_search_text`, `read_xlsx_file`, `xlsx_select_rows`, `xlsx_aggregate`, `read_csv_file`, `csv_select_rows`, `csv_aggregate`, `read_text_file`, `read_json_file`, `json_select`, `read_jsonl_file`, `zip_list_files`, `zip_read_text_file`, `zip_extract_file`, `read_docx_text`, `read_pptx_text` | Deterministic parsing and aggregation of local attachments (GAIA file-backed lane) |
267
+ | **Local Files** | `read_pdf_text`, `pdf_search_text`, `read_xlsx_file`, `xlsx_select_rows`, `xlsx_aggregate`, `read_csv_file`, `csv_select_rows`, `csv_aggregate`, `read_text_file`, `read_json_file`, `json_select`, `read_jsonl_file`, `zip_list_files`, `zip_read_text_file`, `zip_extract_file`, `read_docx_text`, `read_pptx_text`, `read_image_ocr_text`, `transcribe_audio_file` | Deterministic parsing and aggregation of local attachments (GAIA file-backed lane) |
268
268
  | **GitHub** | `search_github`, `analyze_repo` | Finding libraries, studying implementations |
269
269
  | **Verification** | `start_cycle`, `log_phase`, `complete_cycle` | Tracking the flywheel process |
270
270
  | **Eval** | `start_eval_run`, `log_test_result` | Test case management |
@@ -273,11 +273,18 @@ Use `getMethodology("overview")` to see all available workflows.
273
273
  | **Vision** | `analyze_screenshot`, `capture_ui_screenshot` | UI/UX verification |
274
274
  | **Bootstrap** | `discover_infrastructure`, `triple_verify`, `self_implement` | Self-setup, triple verification |
275
275
  | **Autonomous** | `assess_risk`, `decide_re_update`, `run_self_maintenance` | Risk-aware execution, self-maintenance |
276
- | **Parallel Agents** | `claim_agent_task`, `release_agent_task`, `list_agent_tasks`, `assign_agent_role`, `get_agent_role`, `log_context_budget`, `run_oracle_comparison`, `get_parallel_status` | Multi-agent coordination, task locking, role specialization, oracle testing |
276
+ | **Parallel Agents** | `claim_agent_task`, `release_agent_task`, `list_agent_tasks`, `assign_agent_role`, `get_agent_role`, `log_context_budget`, `run_oracle_comparison`, `get_parallel_status`, `bootstrap_parallel_agents`, `generate_parallel_agents_md`, `send_agent_message`, `check_agent_inbox`, `broadcast_agent_update` | Multi-agent coordination, task locking, role specialization, oracle testing, agent mailbox |
277
277
  | **LLM** | `call_llm`, `extract_structured_data`, `benchmark_models` | LLM calling, structured extraction, model comparison |
278
278
  | **Security** | `scan_dependencies`, `run_code_analysis` | Dependency auditing, static code analysis |
279
279
  | **Platform** | `query_daily_brief`, `query_funding_entities`, `query_research_queue`, `publish_to_queue` | Convex platform bridge: intelligence, funding, research, publishing |
280
280
  | **Meta** | `findTools`, `getMethodology` | Discover tools, get workflow guides |
281
+ | **TOON** | `toon_encode`, `toon_decode` | Token-Oriented Object Notation — ~40% token savings vs JSON |
282
+ | **Pattern** | `mine_session_patterns`, `predict_risks_from_patterns` | Session sequence analysis, risk prediction from history |
283
+ | **Git Workflow** | `check_git_compliance`, `review_pr_checklist`, `enforce_merge_gate` | Branch validation, PR checklist, merge gates |
284
+ | **SEO** | `seo_audit_url`, `check_page_performance`, `analyze_seo_content`, `check_wordpress_site`, `scan_wordpress_updates` | Technical SEO audit, performance, WordPress |
285
+ | **Voice Bridge** | `design_voice_pipeline`, `analyze_voice_config`, `generate_voice_scaffold`, `benchmark_voice_latency` | Voice pipeline design, config, scaffolding, latency |
286
+ | **GAIA Solvers** | `solve_red_green_deviation_average_from_image`, `solve_green_polygon_area_from_image`, `grade_fraction_quiz_from_image`, `extract_fractions_and_simplify_from_image`, `solve_bass_clef_age_from_image`, `solve_storage_upgrade_cost_per_file_from_image` | GAIA media image solvers |
287
+ | **Session Memory** | `save_session_note`, `load_session_notes`, `refresh_task_context` | Compaction-resilient notes, attention refresh |
281
288
  | **Discovery** | `discover_tools`, `get_tool_quick_ref`, `get_workflow_chain` | Hybrid search, quick refs, workflow chains |
282
289
 
283
290
  Meta + Discovery tools (5 total) are **always included** regardless of preset. See [Toolset Gating & Presets](#toolset-gating--presets).
@@ -295,9 +302,9 @@ NodeBench MCP supports 4 presets that control which domain toolsets are loaded a
295
302
  | Preset | Domain Toolsets | Domain Tools | Total (with meta+discovery) | Use Case |
296
303
  |--------|----------------|-------------|----------------------------|----------|
297
304
  | **meta** | 0 | 0 | 5 | Discovery-only front door. Agents start here and self-escalate. |
298
- | **lite** | 7 | ~35 | ~40 | Lightweight verification-focused workflows. CI bots, quick checks. |
299
- | **core** | 16 | ~75 | ~80 | Full development workflow. Most agent sessions. |
300
- | **full** | all | 89+ | 94+ | Everything enabled. Benchmarking, exploration, advanced use. |
305
+ | **lite** | 8 | 38 | 43 | Lightweight verification-focused workflows. CI bots, quick checks. |
306
+ | **core** | 23 | 105 | 110 | Full development workflow. Most agent sessions. |
307
+ | **full** | 31 | 158 | 163 | Everything enabled. Benchmarking, exploration, advanced use. |
301
308
 
302
309
  ### Usage
303
310
 
@@ -338,11 +345,11 @@ This is the recommended starting point for autonomous agents. The self-escalatio
338
345
 
339
346
  **meta** (0 domains): No domain tools. Meta + Discovery only.
340
347
 
341
- **lite** (7 domains): `verification`, `eval`, `quality_gate`, `learning`, `recon`, `security`, `boilerplate`
348
+ **lite** (8 domains): `verification`, `eval`, `quality_gate`, `learning`, `flywheel`, `recon`, `security`, `boilerplate`
342
349
 
343
- **core** (16 domains): Everything in lite plus `flywheel`, `bootstrap`, `self_eval`, `llm`, `platform`, `research_writing`, `flicker_detection`, `figma_flow`, `benchmark`
350
+ **core** (22 domains): Everything in lite plus `bootstrap`, `self_eval`, `llm`, `platform`, `research_writing`, `flicker_detection`, `figma_flow`, `benchmark`, `session_memory`, `toon`, `pattern`, `git_workflow`, `seo`, `voice_bridge`
344
351
 
345
- **full** (all domains): All toolsets in TOOLSET_MAP including `ui_capture`, `vision`, `local_file`, `web`, `github`, `docs`, `parallel`, and everything in core.
352
+ **full** (30 domains): All toolsets in TOOLSET_MAP including `ui_capture`, `vision`, `local_file`, `web`, `github`, `docs`, `parallel`, `gaia_solvers`, and everything in core.
346
353
 
347
354
  **→ Quick Refs:** Check current toolset: `findTools({ query: "*" })` | Self-escalate: restart with `--preset core` | See [MCP Tool Categories](#mcp-tool-categories) | CLI help: `npx nodebench-mcp --help`
348
355
 
@@ -699,6 +706,9 @@ Available via `getMethodology({ topic: "..." })`:
699
706
  | `parallel_agent_teams` | Multi-agent coordination, task locking, oracle testing | [Parallel Agent Teams](#parallel-agent-teams) |
700
707
  | `self_reinforced_learning` | Trajectory analysis, self-eval, improvement recs | [Self-Reinforced Learning](#self-reinforced-learning-loop) |
701
708
  | `toolset_gating` | 4 presets (meta, lite, core, full) and self-escalation | [Toolset Gating & Presets](#toolset-gating--presets) |
709
+ | `toon_format` | TOON encoding — ~40% token savings vs JSON | TOON is on by default since v2.14.1 |
710
+ | `seo_audit` | Full SEO audit workflow (technical + performance + content) | `seo_audit_url`, `check_page_performance`, `analyze_seo_content` |
711
+ | `voice_bridge` | Voice pipeline design, config analysis, scaffolding | `design_voice_pipeline`, `analyze_voice_config` |
702
712
 
703
713
  **→ Quick Refs:** Find tools: `findTools({ query: "..." })` | Get any methodology: `getMethodology({ topic: "..." })` | See [MCP Tool Categories](#mcp-tool-categories)
704
714
 
package/README.md CHANGED
@@ -39,7 +39,7 @@ Every additional tool call produces a concrete artifact — an issue found, a ri
39
39
 
40
40
  **QA engineer** — Transitioned a manual QA workflow website into an AI agent-driven app for a pet care messaging platform. Uses NodeBench's quality gates, verification cycles, and eval runs to ensure the AI agent handles edge cases that manual QA caught but bare AI agents miss.
41
41
 
42
- Both found different subsets of the 143 tools useful — which is why NodeBench ships with 4 `--preset` levels to load only what you need.
42
+ Both found different subsets of the 163 tools useful — which is why NodeBench ships with 4 `--preset` levels to load only what you need.
43
43
 
44
44
  ---
45
45
 
@@ -77,7 +77,7 @@ Tasks 1-3 start with zero prior knowledge. By task 9, the agent finds 2+ relevan
77
77
  ### Install (30 seconds)
78
78
 
79
79
  ```bash
80
- # Claude Code CLI — all 143 tools
80
+ # Claude Code CLI — all 163 tools (TOON encoding on by default for ~40% token savings)
81
81
  claude mcp add nodebench -- npx -y nodebench-mcp
82
82
 
83
83
  # Or start with discovery only — 5 tools, agents self-escalate to what they need
@@ -189,7 +189,7 @@ Notes:
189
189
 
190
190
  ## Progressive Discovery
191
191
 
192
- 143 tools is a lot. The progressive disclosure system helps agents find exactly what they need:
192
+ 163 tools is a lot. The progressive disclosure system helps agents find exactly what they need:
193
193
 
194
194
  ### Multi-modal search engine
195
195
 
@@ -197,7 +197,7 @@ Notes:
197
197
  > discover_tools("verify my implementation")
198
198
  ```
199
199
 
200
- The `discover_tools` search engine scores tools using **9 parallel strategies**:
200
+ The `discover_tools` search engine scores tools using **14 parallel strategies** (including Agent-as-a-Graph bipartite embedding search):
201
201
 
202
202
  | Strategy | What it does | Example |
203
203
  |---|---|---|
@@ -210,6 +210,7 @@ The `discover_tools` search engine scores tools using **9 parallel strategies**:
210
210
  | Regex | Pattern matching | `"^run_.*loop$"` → `run_closed_loop` |
211
211
  | Bigram | Phrase matching | "quality gate" matched as unit |
212
212
  | Domain boost | Related categories boosted together | verification + quality_gate cluster |
213
+ | Dense | TF-IDF cosine similarity for vector-like ranking | "audit compliance" surfaces related tools |
213
214
 
214
215
  **7 search modes**: `hybrid` (default, all strategies), `fuzzy`, `regex`, `prefix`, `semantic`, `exact`, `dense`
215
216
 
@@ -227,7 +228,7 @@ Call `get_tool_quick_ref("tool_name")` for any tool's guidance.
227
228
 
228
229
  ### Workflow chains — step-by-step recipes
229
230
 
230
- 21 pre-built chains for common workflows:
231
+ 24 pre-built chains for common workflows:
231
232
 
232
233
  | Chain | Steps | Use case |
233
234
  |---|---|---|
@@ -242,16 +243,19 @@ Call `get_tool_quick_ref("tool_name")` for any tool's guidance.
242
243
  | `code_review` | 8 | Structured code review |
243
244
  | `deployment` | 8 | Ship with full verification |
244
245
  | `migration` | 10 | SDK/framework upgrade |
245
- | `coordinator_spawn` | 6 | Parallel coordinator setup |
246
- | `self_setup` | 5 | Agent self-onboarding |
247
- | `flicker_detection` | 5 | Android flicker analysis |
246
+ | `coordinator_spawn` | 10 | Parallel coordinator setup |
247
+ | `self_setup` | 8 | Agent self-onboarding |
248
+ | `flicker_detection` | 7 | Android flicker analysis |
248
249
  | `figma_flow_analysis` | 5 | Figma prototype flow audit |
249
- | `agent_eval` | 6 | Evaluate agent performance |
250
- | `contract_compliance` | 4 | Check agent contract adherence |
251
- | `ablation_eval` | 6 | Ablation experiment design |
250
+ | `agent_eval` | 9 | Evaluate agent performance |
251
+ | `contract_compliance` | 5 | Check agent contract adherence |
252
+ | `ablation_eval` | 10 | Ablation experiment design |
252
253
  | `session_recovery` | 6 | Recover context after compaction |
253
254
  | `attention_refresh` | 4 | Reload bearings mid-session |
254
- | `task_bank_setup` | 5 | Create evaluation task banks |
255
+ | `task_bank_setup` | 9 | Create evaluation task banks |
256
+ | `pr_review` | 5 | Pull request review |
257
+ | `seo_audit` | 6 | Full SEO audit |
258
+ | `voice_pipeline` | 6 | Voice pipeline implementation |
255
259
 
256
260
  Call `get_workflow_chain("new_feature")` to get the step-by-step sequence.
257
261
 
@@ -282,7 +286,7 @@ Research → Risk → Implement → Test (3 layers) → Eval → Gate → Learn
282
286
  **Outer loop** (over time): Eval-driven development ensures improvement.
283
287
  **Together**: The AI Flywheel — every verification produces eval artifacts, every regression triggers verification.
284
288
 
285
- Ask the agent: `Use getMethodology("overview")` to see all 19 methodology topics.
289
+ Ask the agent: `Use getMethodology("overview")` to see all 20 methodology topics.
286
290
 
287
291
  ---
288
292
 
@@ -313,7 +317,7 @@ Based on Anthropic's ["Building a C Compiler with Parallel Claudes"](https://www
313
317
 
314
318
  ## Toolset Gating
315
319
 
316
- 143 tools means tens of thousands of tokens of schema per API call. If you only need core methodology, gate the toolset:
320
+ 163 tools means tens of thousands of tokens of schema per API call. If you only need core methodology, gate the toolset:
317
321
 
318
322
  ### Presets
319
323
 
@@ -321,8 +325,8 @@ Based on Anthropic's ["Building a C Compiler with Parallel Claudes"](https://www
321
325
  |---|---|---|---|
322
326
  | `meta` | 5 | 0 | Discovery-only front door — agents start here and self-escalate via `discover_tools` |
323
327
  | `lite` | 43 | 8 | Core methodology — verification, eval, flywheel, learning, recon, security, boilerplate |
324
- | `core` | 93 | 17 | Full workflow — adds bootstrap, self-eval, llm, platform, research_writing, flicker_detection, figma_flow, benchmark, session_memory |
325
- | `full` | 143 | 25 | Everything — adds vision, UI capture, web, GitHub, docs, parallel, local files, GAIA solvers |
328
+ | `core` | 110 | 23 | Full workflow — adds bootstrap, self-eval, llm, platform, research_writing, flicker_detection, figma_flow, benchmark, session_memory, toon, pattern, git_workflow, seo, voice_bridge, critter |
329
+ | `full` | 163 | 31 | Everything — adds vision, UI capture, web, GitHub, docs, parallel, local files, GAIA solvers |
326
330
 
327
331
  ```bash
328
332
  # Meta — 5 tools (discovery-only: findTools, getMethodology, discover_tools, get_tool_quick_ref, get_workflow_chain)
@@ -332,10 +336,10 @@ claude mcp add nodebench -- npx -y nodebench-mcp --preset meta
332
336
  # Lite — 43 tools (verification, eval, flywheel, learning, recon, security, boilerplate + meta + discovery)
333
337
  claude mcp add nodebench -- npx -y nodebench-mcp --preset lite
334
338
 
335
- # Core — 93 tools (adds bootstrap, self-eval, llm, platform, research_writing, flicker_detection, figma_flow, benchmark, session_memory + meta + discovery)
339
+ # Core — 110 tools (adds bootstrap, self-eval, llm, platform, research_writing, flicker_detection, figma_flow, benchmark, session_memory, toon, pattern, git_workflow, seo, voice_bridge, critter + meta + discovery)
336
340
  claude mcp add nodebench -- npx -y nodebench-mcp --preset core
337
341
 
338
- # Full — all 143 tools (default)
342
+ # Full — all 163 tools (default, TOON encoding on by default)
339
343
  claude mcp add nodebench -- npx -y nodebench-mcp
340
344
  ```
341
345
 
@@ -377,7 +381,7 @@ npx nodebench-mcp --help
377
381
  | flywheel | 4 | Mandatory flywheel, promote, investigate |
378
382
  | bootstrap | 11 | Project setup, agents.md, self-implement, autonomous, test runner |
379
383
  | self_eval | 9 | Trajectory analysis, health reports, task banks, grading, contract compliance |
380
- | parallel | 10 | Task locks, roles, context budget, oracle |
384
+ | parallel | 13 | Task locks, roles, context budget, oracle, agent mailbox (point-to-point + broadcast) |
381
385
  | vision | 4 | Screenshot analysis, UI capture, diff |
382
386
  | ui_capture | 2 | Playwright-based capture |
383
387
  | web | 2 | Web search, URL fetch |
@@ -394,6 +398,11 @@ npx nodebench-mcp --help
394
398
  | benchmark | 3 | Autonomous benchmark lifecycle (C-compiler pattern) |
395
399
  | session_memory | 3 | Compaction-resilient notes, attention refresh, context reload |
396
400
  | gaia_solvers | 6 | GAIA media image solvers (red/green deviation, polygon area, fraction quiz, bass clef, storage cost) |
401
+ | toon | 2 | TOON encode/decode — Token-Oriented Object Notation (~40% token savings) |
402
+ | pattern | 2 | Session pattern mining + risk prediction from historical sequences |
403
+ | git_workflow | 3 | Branch compliance, PR checklist review, merge gate enforcement |
404
+ | seo | 5 | Technical SEO audit, page performance, content analysis, WordPress detection + updates |
405
+ | voice_bridge | 4 | Voice pipeline design, config analysis, scaffold generation, latency benchmarking |
397
406
 
398
407
  Always included (regardless of gating) — these 5 tools form the `meta` preset:
399
408
  - Meta: `findTools`, `getMethodology`
@@ -401,6 +410,20 @@ Always included (regardless of gating) — these 5 tools form the `meta` preset:
401
410
 
402
411
  The `meta` preset loads **only** these 5 tools (0 domain tools). Agents use `discover_tools` to find what they need and self-escalate.
403
412
 
413
+ ### TOON Format — Token Savings
414
+
415
+ TOON (Token-Oriented Object Notation) is **on by default** since v2.14.1. Every tool response is TOON-encoded for ~40% fewer tokens vs JSON. Disable with `--no-toon` if your client can't handle non-JSON responses.
416
+
417
+ ```bash
418
+ # TOON on (default)
419
+ claude mcp add nodebench -- npx -y nodebench-mcp
420
+
421
+ # TOON off
422
+ claude mcp add nodebench -- npx -y nodebench-mcp --no-toon
423
+ ```
424
+
425
+ Use the `toon_encode` and `toon_decode` tools to convert between TOON and JSON in your own workflows.
426
+
404
427
  ---
405
428
 
406
429
  ## Build from Source
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Critter Tool Calibration Eval — tests how useful the scoring really is.
3
+ *
4
+ * 19 scenarios across 4 tiers. Scoring logic mirrored from critterTools.ts.
5
+ *
6
+ * Run: npx tsx packages/mcp-local/src/__tests__/critterCalibrationEval.ts
7
+ */
8
+ export {};
@@ -0,0 +1,370 @@
1
+ /**
2
+ * Critter Tool Calibration Eval — tests how useful the scoring really is.
3
+ *
4
+ * 19 scenarios across 4 tiers. Scoring logic mirrored from critterTools.ts.
5
+ *
6
+ * Run: npx tsx packages/mcp-local/src/__tests__/critterCalibrationEval.ts
7
+ */
8
+ // ── Mirror of critterTools.ts scoreCritterCheck — keep in sync! ──────────
9
+ function scoreCritterCheck(input) {
10
+ const feedback = [];
11
+ let score = 100;
12
+ const taskLower = input.task.toLowerCase().trim();
13
+ const whyLower = input.why.toLowerCase().trim();
14
+ const whoLower = input.who.toLowerCase().trim();
15
+ // 1: Circular reasoning (threshold 0.5)
16
+ const taskWords = new Set(taskLower.split(/\s+/).filter((w) => w.length > 3));
17
+ const whyWords = whyLower.split(/\s+/).filter((w) => w.length > 3);
18
+ const overlap = whyWords.filter((w) => taskWords.has(w));
19
+ if (whyWords.length > 0 && overlap.length / whyWords.length > 0.5) {
20
+ score -= 30;
21
+ feedback.push("Circular");
22
+ }
23
+ // 2: Vague audience
24
+ const vagueAudiences = ["users", "everyone", "people", "the team", "stakeholders", "clients", "customers", "developers"];
25
+ if (vagueAudiences.includes(whoLower)) {
26
+ score -= 20;
27
+ feedback.push(`Vague: "${input.who}"`);
28
+ }
29
+ // 3: Empty or too short
30
+ if (whyLower.length === 0) {
31
+ score -= 40;
32
+ feedback.push("Empty why");
33
+ }
34
+ else if (whyLower.length < 10) {
35
+ score -= 25;
36
+ feedback.push("Why too short");
37
+ }
38
+ if (whoLower.length < 3) {
39
+ score -= 25;
40
+ feedback.push("Who too short");
41
+ }
42
+ // 4: Deference
43
+ const deferPatterns = [
44
+ "was told", "asked to", "ticket says", "was asked", "requirement says",
45
+ "spec says", "jira", "because I was", "they said", "assigned to me",
46
+ ];
47
+ if (deferPatterns.some((p) => whyLower.includes(p))) {
48
+ score -= 15;
49
+ feedback.push("Deference");
50
+ }
51
+ // 5: Non-answer (count matches, -20 each, cap -40)
52
+ const nonAnswerPatterns = [
53
+ "just because", "don't know", "not sure", "why not", "might need it",
54
+ "no reason", "no idea", "whatever", "idk", "tbd",
55
+ ];
56
+ const nonAnswerHits = nonAnswerPatterns.filter((p) => whyLower.includes(p)).length;
57
+ if (nonAnswerHits > 0) {
58
+ const penalty = Math.min(nonAnswerHits * 20, 40);
59
+ score -= penalty;
60
+ feedback.push(`Non-answer x${nonAnswerHits} (-${penalty})`);
61
+ }
62
+ // 6: Repetitive padding (why + who)
63
+ const whyAllWords = whyLower.split(/\s+/).filter((w) => w.length > 2);
64
+ if (whyAllWords.length >= 5) {
65
+ const whyUniqueWords = new Set(whyAllWords);
66
+ if (whyUniqueWords.size / whyAllWords.length < 0.4) {
67
+ score -= 25;
68
+ feedback.push("Why repetitive");
69
+ }
70
+ }
71
+ const whoAllWords = whoLower.split(/\s+/).filter((w) => w.length > 2);
72
+ if (whoAllWords.length >= 5) {
73
+ const whoUniqueWords = new Set(whoAllWords);
74
+ if (whoUniqueWords.size / whoAllWords.length < 0.4) {
75
+ score -= 25;
76
+ feedback.push("Who repetitive");
77
+ }
78
+ }
79
+ // 7: Buzzword-heavy (scans why + who, graduated: 3+ = -30, 2 = -20)
80
+ const buzzwords = [
81
+ "leverage", "synergies", "synergy", "paradigm", "holistic", "alignment",
82
+ "transformation", "innovative", "disruptive", "best practices",
83
+ "streamline", "ecosystem", "actionable", "circle back",
84
+ ];
85
+ const allText = `${whyLower} ${whoLower}`;
86
+ const buzzCount = buzzwords.filter((b) => allText.includes(b)).length;
87
+ if (buzzCount >= 4) {
88
+ score -= 35;
89
+ feedback.push(`Buzzwords x${buzzCount}`);
90
+ }
91
+ else if (buzzCount >= 3) {
92
+ score -= 30;
93
+ feedback.push(`Buzzwords x${buzzCount}`);
94
+ }
95
+ else if (buzzCount >= 2) {
96
+ score -= 20;
97
+ feedback.push(`Buzzwords x${buzzCount}`);
98
+ }
99
+ // 8: Hedging language
100
+ const hedgeWords = ["could", "potentially", "maybe", "possibly", "might", "perhaps", "hopefully"];
101
+ const hedgeCount = hedgeWords.filter((h) => {
102
+ const regex = new RegExp(`\\b${h}\\b`, "i");
103
+ return regex.test(whyLower);
104
+ }).length;
105
+ if (hedgeCount >= 2) {
106
+ score -= 15;
107
+ feedback.push(`Hedging x${hedgeCount}`);
108
+ }
109
+ // 9: Task-word echo
110
+ for (const tw of taskWords) {
111
+ const twCount = whyWords.filter((w) => w === tw).length;
112
+ if (twCount >= 3) {
113
+ score -= 20;
114
+ feedback.push(`Echo: "${tw}" x${twCount}`);
115
+ break;
116
+ }
117
+ }
118
+ // 10: Bonuses
119
+ if (input.success_looks_like && input.success_looks_like.length > 20) {
120
+ score += 10;
121
+ feedback.push("+success");
122
+ }
123
+ if (input.simplest_version && input.simplest_version.length > 20) {
124
+ score += 10;
125
+ feedback.push("+simplest");
126
+ }
127
+ score = Math.max(0, Math.min(100, score));
128
+ let verdict;
129
+ if (score >= 70)
130
+ verdict = "proceed";
131
+ else if (score >= 40)
132
+ verdict = "reconsider";
133
+ else
134
+ verdict = "stop";
135
+ return { score, verdict, feedback };
136
+ }
137
+ const scenarios = [
138
+ // ── GOOD — should proceed ────────────────────────────────────────────
139
+ {
140
+ label: "GOOD-1: Clear purpose, specific audience",
141
+ input: {
142
+ task: "Add rate limiting to the public API endpoints",
143
+ why: "Our API is getting hammered by a scraper bot causing 503s for real customers — rate limiting protects availability",
144
+ who: "E-commerce customers who see checkout failures during bot attacks",
145
+ },
146
+ expectedVerdict: "proceed",
147
+ expectedScoreRange: [80, 100],
148
+ },
149
+ {
150
+ label: "GOOD-2: With both bonuses",
151
+ input: {
152
+ task: "Migrate from REST to GraphQL",
153
+ why: "Mobile app makes 12 API calls per screen because REST endpoints return fixed shapes — GraphQL lets us fetch exactly what each screen needs in one round trip",
154
+ who: "Mobile team (3 iOS + 2 Android devs) who spend 40% of sprint on pagination workarounds",
155
+ success_looks_like: "Screen load API calls drop from 12 to 1-2, mobile team velocity increases by at least 20%",
156
+ simplest_version: "Start with the 3 highest-traffic screens, keep REST alive for backwards compat",
157
+ },
158
+ expectedVerdict: "proceed",
159
+ expectedScoreRange: [100, 100],
160
+ },
161
+ {
162
+ label: "GOOD-3: Short but specific",
163
+ input: {
164
+ task: "Fix the dark mode toggle",
165
+ why: "Toggle doesn't persist across page reloads — users report losing their setting every time",
166
+ who: "Users with visual sensitivities who rely on dark mode for comfort",
167
+ },
168
+ expectedVerdict: "proceed",
169
+ expectedScoreRange: [80, 100],
170
+ },
171
+ {
172
+ label: "GOOD-4: Infra task with system audience",
173
+ input: {
174
+ task: "Add a health check endpoint",
175
+ why: "Kubernetes needs a liveness probe to restart crashed pods",
176
+ who: "The Kubernetes orchestration layer",
177
+ },
178
+ expectedVerdict: "proceed",
179
+ expectedScoreRange: [80, 100],
180
+ },
181
+ {
182
+ label: "GOOD-5: Shares domain words but isn't circular",
183
+ input: {
184
+ task: "Add password reset flow to the authentication module",
185
+ why: "Users who forget their password currently have to email support and wait 24h for a manual reset — this is our #1 support ticket category",
186
+ who: "End users who lock themselves out (estimated 15% of monthly active users)",
187
+ },
188
+ expectedVerdict: "proceed",
189
+ expectedScoreRange: [80, 100],
190
+ },
191
+ // ── MEDIOCRE — should reconsider ──────────────────────────────────────
192
+ {
193
+ label: "MED-1: Circular + vague",
194
+ input: {
195
+ task: "Add user authentication and login system to the application",
196
+ why: "Because we need user authentication and login system in the application",
197
+ who: "users",
198
+ },
199
+ expectedVerdict: "reconsider",
200
+ expectedScoreRange: [40, 55],
201
+ },
202
+ {
203
+ label: "MED-2: Deference + vague",
204
+ input: {
205
+ task: "Refactor the payment module",
206
+ why: "The ticket says we need to refactor payments before Q3",
207
+ who: "the team",
208
+ },
209
+ expectedVerdict: "reconsider",
210
+ expectedScoreRange: [45, 69],
211
+ },
212
+ {
213
+ label: "MED-3: Good who but lazy why",
214
+ input: {
215
+ task: "Add caching to the dashboard API",
216
+ why: "For speed",
217
+ who: "Internal analytics team who refreshes dashboards 50+ times daily",
218
+ },
219
+ expectedVerdict: "proceed", // Borderline — score 75 with warning is acceptable
220
+ expectedScoreRange: [70, 80],
221
+ },
222
+ {
223
+ label: "MED-4: Deference rescued by specificity",
224
+ input: {
225
+ task: "Add WebSocket support",
226
+ why: "The PM asked to add real-time updates because customer support agents currently poll every 30 seconds, causing delayed responses to urgent tickets",
227
+ who: "Customer support team handling 200+ tickets/day",
228
+ success_looks_like: "Ticket updates appear within 1 second instead of up to 30 seconds",
229
+ },
230
+ expectedVerdict: "proceed",
231
+ expectedScoreRange: [85, 100],
232
+ },
233
+ {
234
+ label: "MED-5: Good why but vague 'stakeholders'",
235
+ input: {
236
+ task: "Add audit logging to the admin panel",
237
+ why: "SOC2 compliance requires immutable audit trails for all admin actions — we fail the next audit without this",
238
+ who: "stakeholders",
239
+ },
240
+ expectedVerdict: "proceed",
241
+ expectedScoreRange: [70, 85],
242
+ },
243
+ // ── BAD ──────────────────────────────────────────────────────────────
244
+ {
245
+ label: "BAD-1: Deference + vague",
246
+ input: { task: "Do the thing", why: "Was told to", who: "everyone" },
247
+ expectedVerdict: "reconsider",
248
+ expectedScoreRange: [40, 69],
249
+ },
250
+ {
251
+ label: "BAD-2: Empty why",
252
+ input: { task: "Add a new endpoint", why: "", who: "me" },
253
+ expectedVerdict: "stop",
254
+ expectedScoreRange: [0, 39],
255
+ },
256
+ {
257
+ label: "BAD-3: Circular + vague (threshold 0.5)",
258
+ input: {
259
+ task: "Update the user interface for the dashboard component",
260
+ why: "We need to update the user interface for the dashboard component to make it better",
261
+ who: "people",
262
+ },
263
+ expectedVerdict: "reconsider",
264
+ expectedScoreRange: [40, 55],
265
+ },
266
+ // ── EDGE CASES ──────────────────────────────────────────────────────
267
+ {
268
+ label: "EDGE-1: Buzzwords masking emptiness (why + who scanned)",
269
+ input: {
270
+ task: "Implement the new feature",
271
+ why: "To leverage synergies and drive engagement through digital transformation and innovation paradigms",
272
+ who: "Cross-functional stakeholder alignment team",
273
+ },
274
+ // 4+ buzzwords in why+who (leverage, synergies, transformation, paradigm, alignment) → -30
275
+ expectedVerdict: "reconsider",
276
+ expectedScoreRange: [50, 69],
277
+ },
278
+ {
279
+ label: "EDGE-2: Padding with repetition (why + who)",
280
+ input: {
281
+ task: "Fix the bug",
282
+ why: "need need need need need need need need need need need need",
283
+ who: "test test test test test test test test test test test test",
284
+ },
285
+ // Why repetition (-25) + who repetition (-25) = 50 → reconsider
286
+ expectedVerdict: "reconsider",
287
+ expectedScoreRange: [40, 55],
288
+ },
289
+ {
290
+ label: "EDGE-3: Double non-answer ('just because' + 'might need it')",
291
+ input: {
292
+ task: "Add a new database table",
293
+ why: "Just because we might need it later",
294
+ who: "Maybe someone eventually",
295
+ },
296
+ // 2 non-answer hits × -20 = -40 → score 60 → reconsider
297
+ expectedVerdict: "reconsider",
298
+ expectedScoreRange: [40, 65],
299
+ },
300
+ {
301
+ label: "EDGE-4: Hedging with good audience",
302
+ input: {
303
+ task: "Build a recommendation engine",
304
+ why: "It could potentially maybe help with user retention if people use it",
305
+ who: "Product manager who wants to try ML features",
306
+ },
307
+ // Hedging (could+potentially+maybe) = -15 → score 85 → proceed with warning
308
+ expectedVerdict: "proceed",
309
+ expectedScoreRange: [80, 90],
310
+ },
311
+ {
312
+ label: "EDGE-5: Long vacuous echo + vague audience",
313
+ input: {
314
+ task: "Refactor the codebase",
315
+ why: "We need to refactor the codebase because the codebase needs refactoring and the current state of the codebase is such that refactoring would be beneficial for the overall quality of the codebase moving forward in the future",
316
+ who: "developers",
317
+ },
318
+ // Echo: 'codebase' x4 (-20) + vague 'developers' (-20) = 60 → reconsider
319
+ expectedVerdict: "reconsider",
320
+ expectedScoreRange: [40, 69],
321
+ },
322
+ {
323
+ label: "EDGE-6: 'customers' now vague",
324
+ input: {
325
+ task: "Deploy to production",
326
+ why: "Performance improvements need to reach production for customer benefit today",
327
+ who: "customers",
328
+ },
329
+ // Vague 'customers' (-20) → 80 → proceed with warning
330
+ expectedVerdict: "proceed",
331
+ expectedScoreRange: [70, 85],
332
+ },
333
+ ];
334
+ // ── Run ────────────────────────────────────────────────────────────────────
335
+ console.log("═══════════════════════════════════════════════════════════════");
336
+ console.log(`CRITTER CALIBRATION EVAL — ${scenarios.length} scenarios`);
337
+ console.log("═══════════════════════════════════════════════════════════════\n");
338
+ let passed = 0;
339
+ let failed = 0;
340
+ const gaps = [];
341
+ for (const tc of scenarios) {
342
+ const r = scoreCritterCheck(tc.input);
343
+ const vOk = r.verdict === tc.expectedVerdict;
344
+ const sOk = r.score >= tc.expectedScoreRange[0] && r.score <= tc.expectedScoreRange[1];
345
+ const ok = vOk && sOk;
346
+ const status = ok ? " PASS" : " FAIL";
347
+ console.log(`${status} ${tc.label}`);
348
+ console.log(` Score: ${r.score}${sOk ? "" : ` (expected ${tc.expectedScoreRange[0]}-${tc.expectedScoreRange[1]})`}, Verdict: ${r.verdict}${vOk ? "" : ` (expected ${tc.expectedVerdict})`}`);
349
+ console.log(` Checks: [${r.feedback.join("; ")}]`);
350
+ if (!ok) {
351
+ failed++;
352
+ gaps.push(`${tc.label}: score=${r.score} verdict=${r.verdict}`);
353
+ }
354
+ else {
355
+ passed++;
356
+ }
357
+ console.log();
358
+ }
359
+ console.log("═══════════════════════════════════════════════════════════════");
360
+ console.log(`RESULTS: ${passed}/${scenarios.length} passed, ${failed} failed`);
361
+ console.log(`CALIBRATION: ${Math.round(passed / scenarios.length * 100)}%`);
362
+ console.log("═══════════════════════════════════════════════════════════════");
363
+ if (gaps.length > 0) {
364
+ console.log("\nREMAINING GAPS:");
365
+ for (const g of gaps)
366
+ console.log(` -> ${g}`);
367
+ }
368
+ process.exit(failed > 0 ? 1 : 0);
369
+ export {};
370
+ //# sourceMappingURL=critterCalibrationEval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"critterCalibrationEval.js","sourceRoot":"","sources":["../../src/__tests__/critterCalibrationEval.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};