A deterministic what-if engine for exposure data: clones a sealed exposure graph, applies bounded interventions, recomputes weighted risk and reachable attack surface, then ranks the resulting futures and marks the Pareto-efficient ones before production changes.
All three tools have minimal descriptions (20-25 chars) and severely underdeveloped schemas. Input schemas declare only object types with no property descriptions, violating the requirement that every parameter have a description. No output schema is documented. Parameter names ('graph', 'scenario', 'scenarios') are vague and lack type hints or constraints. No error handling guidance. Tools lack verb-noun naming (exposure_baseline, exposure_simulate, exposure_rank are noun-heavy). The codebase shows no parameter validation, no enum constraints, and no recovery guidance for failures.
Measure a sealed exposure graph without mutating it
Rank multiple counterfactual scenarios deterministically and identify Pareto-efficient options
Simulate one intervention scenario against current exposure state
Parameter descriptions completely missing. Input schemas declare {graph:{type:'object'}} with no description of what 'graph' contains, its required fields, or expected structure. LLMs cannot infer parameter meaning from names alone.
No output schema documented. Tools return JSON via structuredContent but LLMs have no schema to understand what fields to expect (e.g., does baseline() return {metrics:{...}, graphSeal:...}?). Downstream tool chaining is impossible without guessing.
Tool descriptions are 20-25 characters, below the 34-char p10 baseline. 'Measure a sealed exposure graph without mutating it' lacks context on WHEN to use this vs simulate/rank, what prerequisites exist, or what the return value contains.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 33 | 2025-06-18+ | v2 |
Naming lacks action verbs. 'exposure_baseline', 'exposure_simulate', 'exposure_rank' are noun-heavy and do not follow verb_noun convention (get_*, measure_*, compute_*). LLMs struggle to infer intent from these names alone.
No error handling guidance. If a graph is malformed or a scenario references a non-existent finding, the error response is a raw JSON-RPC error with no recovery hint. LLMs cannot self-correct.