Problem
Closed-vocabulary errors don't enumerate the valid values, and the JSON schemas read like open lists — so agents invent values and retry-guess synonyms in cascades.
Numbers (audit of 13,105 sessions)
- link: 996 errors (7.5%, biggest offender). ~62% — invented edge_type:
related_to ×390(!), related, relates_to, supports, involves and ~40 more variants — the related_* family alone produced 482 retry errors, because unknown edge type: related_to (graph/edge.rs FromStr) doesn't name the valid types.
- supersede: 18/84 = 21.4% error rate, worst in the product. 14 of 18 —
unknown node type: observation: the agent picks a word kaeru's own surface legitimizes (episode kind=observation, jot's auto-tag kind:observation, the tagged description lists observation) — but NodeType::from_str (kaeru-core/src/graph/node.rs:122-139) doesn't know it. 2 more — unknown tier "warm": the agent extrapolates the thermal layer metaphor (hot/cold) onto tier (operational/archival).
- Aggravating factor: the LinkParams doc-comment says "Common values: …" — open-vocabulary phrasing; the full edge-type list in .with_instructions lies beyond the client truncation point and is invisible in sessions.
Proposal
- All closed-vocabulary FromStr errors enumerate valid values:
unknown edge type: related_to; valid: refers_to, derived_from, causal, part_of, blocks, targets, contradicts, supersedes, verifies, falsifies, temporal, consolidated_to. Same for node type and tier. Three format! calls — cheap.
- In params.rs schemas: "Common values" → "Valid values (closed set): …" or a real enum in the JSON schema (the client then validates before the server).
- Optional: accept frequent synonyms (observation→episode) or answer with did-you-mean.
Problem
Closed-vocabulary errors don't enumerate the valid values, and the JSON schemas read like open lists — so agents invent values and retry-guess synonyms in cascades.
Numbers (audit of 13,105 sessions)
related_to×390(!),related,relates_to,supports,involvesand ~40 more variants — the related_* family alone produced 482 retry errors, becauseunknown edge type: related_to(graph/edge.rs FromStr) doesn't name the valid types.unknown node type: observation: the agent picks a word kaeru's own surface legitimizes (episode kind=observation, jot's auto-tag kind:observation, the tagged description lists observation) — but NodeType::from_str (kaeru-core/src/graph/node.rs:122-139) doesn't know it. 2 more —unknown tier "warm": the agent extrapolates the thermal layer metaphor (hot/cold) onto tier (operational/archival).Proposal
unknown edge type: related_to; valid: refers_to, derived_from, causal, part_of, blocks, targets, contradicts, supersedes, verifies, falsifies, temporal, consolidated_to. Same for node type and tier. Three format! calls — cheap.