Story-1722 Command Vocabulary — 5 typed intent classes
RFD-AGT-002 D-7. Atlas turns one counsel turn into a typed intent. Every command maps to exactly one of a closed set of 5 intent classes; a phrasing catalog seeds the eval set with success cases, per-op refusal twins, Clarify cases, and flagged-unbuildable utterances.
The 5 intent classes (command_vocabulary.IntentClass)
| Class | Meaning | Existing wire intent |
|---|---|---|
navigate | Move to a declared surface | navigation.NavigateTo |
answer | Grounded reply, no page mutation | answer turn |
reshape_view | View family: filter / sort / group / count | SetFilter / OpenView / Find |
propose_operation | Confirm-first create / edit / archive | broker-executed proposal |
clarify | Ask-which disambiguation — NOT a refusal | clarify turn |
The set is closed: adding a class is a deliberate vocabulary change, mirroring the closed capability universe of D-1.
AC1 — Clarify is a class, and disambiguation is not a refusal
- Exactly 5 members;
CLARIFYis first-class. - Every Clarify phrasing has
disposition == "execute"— asking which thing was meant is a normal turn, never a guardrail refusal. - Disposition is modelled separately from intent (
execute/refuse/unbuildable) so a Propose command can be refused without changing its class.
AC2 — hi / en / Hinglish map to the same intent
- Catalog rows carry a
grouptying the same request across languages. - Every group is language-consistent (same
intent+op). - All 5 classes are reachable in
en,hiandhinglish(e.g.take me to my clients/मेरे मुवक्किल दिखाओ/mere clients ka page kholo→navigate).
AC3 — phrasing catalog: refusal twins + unbuildable flags
command_catalog.jsonlholds the example utterances, loaded loudly (a malformed row aborts the load — no silent drop).- Each v1 write op (
create,edit,archive) carries both a success phrasing and a per-op refusal twin (silent-write, cross-tenant, bulk). deleteis refusal-only — v1 writes are reversible (RFD §4.3); the model validator rejects adeletesuccess.- Unbuildable utterances are flagged with
disposition: "unbuildable"and a reason (canonical example:show matters due in the next 3 days— no backend deadline filter today).
Files
agents/atlas/command_vocabulary.py—IntentClass,CommandPhrasing, loud loader,catalog_invariants().agents/atlas/command_catalog.jsonl— the phrasing catalog (the eval seed).agents/atlas/tests/test_command_vocabulary.py— 18 deterministic, model-free tests pinning the 3 ACs.
Verification
ruff check agents/python scripts/check_brain_egress.pycd agents/atlas && pytest tests/test_command_vocabulary.py -q→ 18 passed