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.
- package/NODEBENCH_AGENTS.md +19 -9
- package/README.md +42 -19
- package/dist/__tests__/critterCalibrationEval.d.ts +8 -0
- package/dist/__tests__/critterCalibrationEval.js +370 -0
- package/dist/__tests__/critterCalibrationEval.js.map +1 -0
- package/dist/__tests__/embeddingProvider.test.d.ts +1 -0
- package/dist/__tests__/embeddingProvider.test.js +86 -0
- package/dist/__tests__/embeddingProvider.test.js.map +1 -0
- package/dist/__tests__/gaiaCapabilityAudioEval.test.js +1 -1
- package/dist/__tests__/gaiaCapabilityAudioEval.test.js.map +1 -1
- package/dist/__tests__/gaiaCapabilityEval.test.js +541 -27
- package/dist/__tests__/gaiaCapabilityEval.test.js.map +1 -1
- package/dist/__tests__/gaiaCapabilityFilesEval.test.js +1 -1
- package/dist/__tests__/gaiaCapabilityFilesEval.test.js.map +1 -1
- package/dist/__tests__/gaiaCapabilityMediaEval.test.js +473 -4
- package/dist/__tests__/gaiaCapabilityMediaEval.test.js.map +1 -1
- package/dist/__tests__/tools.test.js +1010 -8
- package/dist/__tests__/tools.test.js.map +1 -1
- package/dist/db.js +64 -0
- package/dist/db.js.map +1 -1
- package/dist/index.js +70 -9
- package/dist/index.js.map +1 -1
- package/dist/tools/critterTools.d.ts +21 -0
- package/dist/tools/critterTools.js +230 -0
- package/dist/tools/critterTools.js.map +1 -0
- package/dist/tools/embeddingProvider.d.ts +67 -0
- package/dist/tools/embeddingProvider.js +299 -0
- package/dist/tools/embeddingProvider.js.map +1 -0
- package/dist/tools/progressiveDiscoveryTools.js +24 -7
- package/dist/tools/progressiveDiscoveryTools.js.map +1 -1
- package/dist/tools/reconTools.js +83 -33
- package/dist/tools/reconTools.js.map +1 -1
- package/dist/tools/toolRegistry.d.ts +30 -2
- package/dist/tools/toolRegistry.js +253 -25
- package/dist/tools/toolRegistry.js.map +1 -1
- package/package.json +13 -3
package/NODEBENCH_AGENTS.md
CHANGED
|
@@ -21,7 +21,7 @@ Add to `~/.claude/settings.json`:
|
|
|
21
21
|
}
|
|
22
22
|
```
|
|
23
23
|
|
|
24
|
-
Restart Claude Code.
|
|
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** |
|
|
299
|
-
| **core** |
|
|
300
|
-
| **full** |
|
|
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** (
|
|
348
|
+
**lite** (8 domains): `verification`, `eval`, `quality_gate`, `learning`, `flywheel`, `recon`, `security`, `boilerplate`
|
|
342
349
|
|
|
343
|
-
**core** (
|
|
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** (
|
|
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
|
|
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
|
|
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
|
-
|
|
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 **
|
|
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
|
-
|
|
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` |
|
|
246
|
-
| `self_setup` |
|
|
247
|
-
| `flicker_detection` |
|
|
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` |
|
|
250
|
-
| `contract_compliance` |
|
|
251
|
-
| `ablation_eval` |
|
|
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` |
|
|
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
|
|
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
|
-
|
|
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` |
|
|
325
|
-
| `full` |
|
|
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 —
|
|
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
|
|
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 |
|
|
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,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 {};
|