{ "spec": "JouleClaw Elicitor v1 — deterministic structured intake", "schema_id": "elicitor/1", "note": "SlotWalker.next() and .submit() drive a deterministic state machine: pending required slots become Ask gaps in declared order; once every required slot has been filled (in any order), the walker emits Done with the filled list in submit-order. Every implementer MUST produce the same ElicitorStep (byte-equal under serde_json) for every (slots, submit-sequence) pair below.", "vector_count": 5, "vectors": [ { "n": 1, "description": "Empty slot list → Done immediately with no filled answers.", "input": { "request_text": "anything", "slots": [], "submits": [] }, "expected_final_step": { "kind": "done", "draft": {"summary": "anything", "filled": []} } }, { "n": 2, "description": "Single required Text slot, unanswered → Ask gap for it.", "input": { "request_text": "hello", "slots": [ {"id": "msg", "name": "Message", "prompt": "Your message", "kind": {"kind": "text"}, "required": true} ], "submits": [] }, "expected_final_step": { "kind": "ask", "gap": { "slot_id": "msg", "name": "Message", "prompt": "Your message", "kind": {"kind": "text"}, "required": true } } }, { "n": 3, "description": "Two required slots, fill the first → Ask for the second.", "input": { "request_text": "demo", "slots": [ {"id": "a", "name": "A", "prompt": "What is a?", "kind": {"kind": "text"}, "required": true}, {"id": "b", "name": "B", "prompt": "What is b?", "kind": {"kind": "integer"}, "required": true} ], "submits": [ {"slot_id": "a", "value": {"kind": "text", "text": "alpha"}} ] }, "expected_final_step": { "kind": "ask", "gap": { "slot_id": "b", "name": "B", "prompt": "What is b?", "kind": {"kind": "integer"}, "required": true } } }, { "n": 4, "description": "Two required slots, fill both → Done with both answers in submit-order.", "input": { "request_text": "demo", "slots": [ {"id": "a", "name": "A", "prompt": "What is a?", "kind": {"kind": "text"}, "required": true}, {"id": "b", "name": "B", "prompt": "What is b?", "kind": {"kind": "boolean"}, "required": true} ], "submits": [ {"slot_id": "a", "value": {"kind": "text", "text": "alpha"}}, {"slot_id": "b", "value": {"kind": "boolean", "b": true}} ] }, "expected_final_step": { "kind": "done", "draft": { "summary": "demo", "filled": [ {"slot_id": "a", "value": {"kind": "text", "text": "alpha"}}, {"slot_id": "b", "value": {"kind": "boolean", "b": true}} ] } } }, { "n": 5, "description": "Optional slot is never asked about; once the one required slot is filled the walker is Done even if the optional remains empty.", "input": { "request_text": "demo", "slots": [ {"id": "opt", "name": "Opt", "prompt": "Optional?", "kind": {"kind": "text"}, "required": false}, {"id": "req", "name": "Req", "prompt": "Required?", "kind": {"kind": "text"}, "required": true} ], "submits": [ {"slot_id": "req", "value": {"kind": "text", "text": "yes"}} ] }, "expected_final_step": { "kind": "done", "draft": { "summary": "demo", "filled": [ {"slot_id": "req", "value": {"kind": "text", "text": "yes"}} ] } } } ] }