Sophia custom-edition — HiveJournal intent catalog
Purpose: the concrete intent list a Sophia (Aquila Labs) custom edition would classify for HiveJournal, grounded 1:1 in the adapter seams already shipped in this repo. Sophia is a deterministic, on-device NLU: an utterance maps to an intent (+ extracted slots), with high precision and sub-second latency, and the utterance never leaves the device. This doc is the build-target — what to cover and how precise each intent must be. It is technical only; it maps to the code paths below so the two stay in sync.
Where these live in code (the seams that call Sophia today, disabled-by-default):
- Glasses —
apps/glasses/src/intent.ts+sophia.ts(JSON-RPCinterpret, verb-category prefix routing, ≤400 ms budget, keyword fallback on any miss). - Family Wall "Ask JQ" —
family-wall-ask.ts→sophiaClassify()(POST /classify→{ intent }), withfamily-wall-prefilter.tsas the built-in stand-in. - Kid-chat safety —
family-kid-safety-core.ts(SafetyVerdict).
Two integration shapes Sophia already supports and we already speak:
interpret(glasses) — returns verb/noun clauses whose tokens carry acategories: string[]taxonomy path (e.g.verbs/action/travel/depart), matched by prefix. We map category prefixes → our intents.classify(wall) — returns a single{ intent }string from a known set.
Either shape is fine per domain; the list below is what each must resolve.
Domain 1 — Glasses coach/nudge occasions (query → occasion)
Ambient, low-stakes; a wrong guess just picks a different encouragement. Today mapped by verb-category prefix.
| Intent | What it means | Example utterances |
|---|---|---|
morning | start-of-day intention | "good morning", "start my day", "set my intention" |
next_step | ask for the next action | "what's next", "give me a push", "nudge me", "what do I do now" |
at_risk | self-check on progress | "how am I doing", "where am I at", "am I on track", "my streak" |
step_complete | report completion | "I did it", "done", "finished", "completed that" |
Domain 2 — Glasses commands (command → action; HIGH precision)
These do things — some fire a camera. The hard constraint: they must not trigger on passing conversational speech. Today each requires an explicit verb + a scoped noun.
| Intent | Slots | Fires camera? | Example utterances |
|---|---|---|---|
soundtrack_start / soundtrack_stop | — | no | "play some focus music" / "stop the music" |
mantras_play | — | no | "play my mantras", "read my mantras" |
posture_check | — | no | "how's my posture", "check my posture" |
posture_grade | value (int 1–10) | no | "posture seven", "grade my posture an eight" |
capture_note | note (text, optional) | no | "capture this", "note: call the plumber" |
study_start | — | no | "start studying", "study mode" |
secondset_bind | — | yes | "scan the job code", "bind me to this job" (noun job required) |
shopping_next | — | no | "what's next on my list", "next item" |
shopping_got_it | — | no | "got it", "grabbed that", "check it off" |
shopping_recap | — | no | "what do I still need", "read me the rest of my list" |
shopping_add | item (text) | no | "add butter to my list", "put eggs on the list" |
shopping_scan_aisle | — | yes | "scan this aisle", "which section is this" |
shopping_scan_recipe | — | yes | "scan this recipe", "import this recipe" |
shopping_scan_deal | — | yes | "capture this deal", "read that price tag" |
lever_set | name (text), level (text, optional) | no | "set my energy lever to high", "log a walk" |
device_link | code (6 digits, may be spoken as words) | no | "link my glasses, code four seven two nine one six" |
Domain 3 — Family Wall "Ask JQ" queries (query → deterministic answer, NO cloud LLM)
Returned as a single intent string; the wall answers locally from on-screen state. Known set today:
| Intent | Answer source | Example utterances |
|---|---|---|
dinner | tonight's planned meal | "what's for dinner", "what are we eating" |
presence | who's home / out | "who's home", "is anyone here", "who's out" |
pets | pets still needing feeding | "did anyone feed the dog", "is the cat fed" |
weather | today's weather / what to wear | "do I need a jacket", "is it cold out", "will it rain" |
calendar | today's events | "what's on today", "what's happening", "any appointments" |
shopping | the shopping list | "what's on the shopping list", "what do we need from the store" |
points | kids' points / allowance | "how many points do I have", "what did I earn" |
routines | chores / homework left | "what chores are left", "what do I still have to do today" |
Domain 4 — Family Wall "Ask JQ" actions (command → mutate state)
Voice edits to shared family state. Shipped today:
| Intent | Slots | Example utterances |
|---|---|---|
shopping_add | item (text) | "add milk", "put paper towels on the list" |
meal_set | title (text) | "dinner is tacos", "set dinner to spaghetti" |
note_add | body (text) | "leave a note: soccer moved to 4", "note that the plumber comes Tuesday" |
reminder_add | text, who (person, optional) | "remind me to sign the form", "remind Maya about her dentist" |
Roadmap (not yet in code — include if scoping ahead): calendar_add (event + time),
alarm_add (time + label), chore_add (task + assignee), intercom_send (message + room/target).
Domain 5 — Kid-chat safety pre-filter (verdict, not a coach intent)
A block | pass verdict on a child's message. The design law is the block/flag split, and it is
non-negotiable:
- BLOCK (real external-safety risk): grooming / stranger-contact, secrecy-from-parents ("don't tell your mom"), a child about to hand PII to a stranger.
- FLAG, never block (emotional distress): sadness, anger, "I want to die"-type self-harm signals are routed to a trusted adult — never auto-blocked. A false block on a distressed child is itself a harm. The classifier must distinguish external danger (block) from the child needs a person (flag).
Slots / entities we need extracted
item (free-text noun phrase) · meal/title (free text) · note/body (free text) ·
who (family-member name) · value (int 1–10) · code (6 digits, spoken as digits or
number-words) · level/name (lever + level label) · plus the roadmap slots (time, assignee, target room).
Design constraints (all domains)
- Deterministic + reproducible — same utterance → same intent, every run (the property the test suite validates).
- High precision on commands — camera-firing and state-mutating intents must not trigger on passing speech; prefer a miss (→ our keyword fallback) over a false fire.
- On-device — no network round-trip; the utterance stays local.
- Latency — ≤400 ms on glasses (we bail to keywords past the budget); snappy on the wall.
- Fail-safe null — "inconclusive" is a valid, expected answer; every seam already falls back to a built-in classifier, so Sophia can only add accuracy, never break behavior.
- English-first; other locales are a later ask.
Intent → slots (required/optional) — the quote sheet
The precise intent → slots table an OEM needs to scope a custom edition (Aquila/Sophia format:
each slot marked Required or Optional). Slotless intents resolve on the verb alone. int 1–10
and 6-digit code slots benefit directly from Sophia's built-in numeric normalization (any spoken
form → digits) — we do no number parsing on our side.
Glasses — coach cues (all slotless): morning · next_step · at_risk · step_complete
Glasses — commands
| Intent | Slots (R/O) |
|---|---|
soundtrack_start, soundtrack_stop | — |
mantras_play | — |
posture_check | — |
posture_grade | value int 1–10 R |
capture_note | note text O (empty ⇒ "capture what I'm looking at") |
study_start | — |
secondset_bind | — (requires the noun job to fire; no extracted slot) |
shopping_next, shopping_got_it, shopping_recap | — |
shopping_add | item text R |
shopping_scan_aisle, shopping_scan_recipe, shopping_scan_deal | — (fire a camera) |
lever_set | name text R · level text O |
device_link | code 6-digit R (spoken any numeric form) |
Wall — Ask JQ queries (all slotless — classify only): dinner · presence · pets · weather · calendar · shopping · points · routines
Wall — Ask JQ actions
| Intent | Slots (R/O) |
|---|---|
shopping_add | item text R |
meal_set | title text R |
note_add | body text R |
reminder_add | text text R · who person O |
calendar_add (roadmap) | title text R · time datetime R |
alarm_add (roadmap) | time datetime R · label text O |
chore_add (roadmap) | task text R · assignee person O |
intercom_send (roadmap) | message text R · target room/person O |
Kid-chat safety — not intent+slots; a block | pass verdict with a category label
(grooming / stranger_contact / secrecy_from_parents = block; distress/self-harm = flag, never block).
OCR note (glasses): OCR is on our side — the glasses capture + OCR signs/forms/labels and pass
text to Sophia; the engine never receives an image. So Sophia's numeric normalization covers the
spoken code/value slots, and OCR'd digits arrive as plain text.