Typed questions, typed answers
Last reviewed: July 2026.
When an AI agent needs a human decision mid-task, the dominant pattern is prose: the
agent asks in text, the human answers in text, and the agent re-parses the reply –
hoping "roll it out to a quarter of prod, but gently" means canary=25, environment=production. Re-parsing is where meaning dies, and it fails silently.
Fuaran's wire format specifies an alternative: the elicitation envelope. The agent emits its question as a live UI – an ordinary canonical tree – together with a declared answer contract: which fields constitute the answer, each typed by a value space (an integer range, an enum, a length-bounded string). The interaction resolves to exactly one typed outcome from a closed set:
- Answered – a typed answer object, every field already validated against its declared space;
- Declined – the human refused, as a first-class outcome rather than an error;
- TimedOut – the envelope's deadline passed (the timeout is data; the presenting host's clock enforces it);
- Superseded – the agent replaced the question with a newer one.
The properties worth arguing about:
- A non-conforming answer never reaches the agent. The gate runs on the answering side: out-of-range values, undeclared keys, and type mismatches are refused in place with typed errors, and the human corrects the form. The agent reads fields by name, each already in its declared space. No prose, no coercion, no guessing.
- The whole exchange is wire data. The question tree, the contract, the answer, and the outcome all have canonical encodings and conformance fixtures – so the exchange is loggable, replayable, and auditable like any other Fuaran artefact, and any conformant host can present it.
- The contract is inspectable before answering. The human (or their tooling) can see exactly which fields the agent will receive and what spaces bound them – the answer surface is closed by shape, which is a safety property rather than a convenience.
This is shipped, not speculative: the fuaran_ask tool in the
@fuaran-ui/mcp server gives any MCP-speaking agent
rich typed elicitation as a single tool call, and the
playground's agent can suspend mid-run to ask a typed
question in the transcript – try to cheat its contract and watch the refusal name the
exact rule you broke.
The general point: human-in-the-loop is usually treated as a UX problem. Making the question a typed artefact turns it into a protocol – one whose answers are data you can trust, log, and replay, which is what "in the loop" should have meant all along.