Stop your AI from making up facts about your own data. A pre-generation gate that decides whether an LLM may summarize, based on evidence coverage, freshness, and quality.
Two well-named tools with comprehensive descriptions and detailed input schemas. check_evidence and verify_claims follow verb_noun naming and include rich parameter documentation. Schemas are present and typed. However, output schemas are not documented in the tool definitions, LLMs cannot see what fields to expect in responses. Error handling guidance is absent; tools do not explain what to do if evidence is missing or claims fail. Parameter descriptions are strong (72 - 194 chars average), but the lack of output documentation and recovery guidance prevents a higher score.
Before answering from data, check whether the evidence is good enough. Returns whether you may summarize, the data status (available/quality_warning/fallback/missing), and caveats you must respect. Call this first; if summarize is false, say you cannot answer.
After you draft an answer, check whether it stands on the evidence you were given. Returns pass and a verdict (supported | misquoted_values | unsupported_claims | no_citations | phantom_citations): every [ev:N] citation must resolve to a real record, every claim-looking sentence must carry a citation, and — when records carry `facts` — every number in a cited sentence must match those facts exactly (misquoted numbers block). Pass the SAME records array you gave check_evidence, in the same order. If pass is false, fix the answer using `caveats` and try again before you speak.
Output schemas not documented. Tool definitions lack return type documentation. LLMs cannot infer what fields (summarize, status, caveats, decision, verdict, pass) are in the response, forcing them to guess or make assumptions about downstream data flow.
No error handling guidance. Descriptions do not explain what happens if evidence is missing, records are malformed, or verification fails. LLMs receive no recovery hints (e.g., 'If summarize is false, ask the user for better evidence').
Parameter 'records' accepts generic objects with no schema constraints. Description says 'Evidence records: { date, qualityScore?, quality?, flags?, tier? }' but does not enforce these fields or their types. LLMs may pass malformed records.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
Preset parameter lacks enum constraint. Description lists 'FINANCE | HEALTH | SUPPORT' but does not declare them as an enum. LLMs may hallucinate other preset names.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Both tools are read-only and idempotent, but this is not declared in the schema. Agents cannot infer safety properties.