superemotion
Ontology
The ontology is the map superemotion keeps of your life — the people in it, the places, what happened and what is still owed. Everything you mention becomes a typed object on that map instead of another line of chat history.
Most assistants keep your conversations as text and hope the model notices a pattern on the way past. This is a typed graph instead: four object types with real schemas, named edges that carry their own state, and every fact stamped with the moment it became true.
SELF
you
sibling
PERSON
sister
3 missed calls · 3 weeks
parent
PERSON
mum
surgery · 4 March
partner
PERSON
Jennifer
moved in · August
lives in
PLACE
Berlin
since 2024
Jenniferlives inBerlinAn edge that never passes through you.
One turn’s worth of graph. Asserted relationships carry a name; derived facts hang off their subject and carry a date. Jennifer connects to Berlin without going through you — which is the whole point of a graph over a profile.
01 / Types
Four types, and a schema for each.
A person is a person. Not a string that happened to sit near other strings, and not a row in a vector table that scored well this turn.
PERSON
Someone you have mentioned. Resolved by reference, not by string match — “my sister”, “her” and a first name collapse into one node.
- label
- string
- relation
- edge → self
- first_seen
- timestamp
- last_mentioned
- timestamp
- salience
- float
PLACE
Somewhere with a bearing on the conversation: a city you moved to, a room you avoid, a country someone left.
- label
- string
- kind
- city | home | other
- since
- timestamp?
EVENT
Something that happened at a time. Recurrence is a property, which is how “again” becomes answerable.
- label
- string
- subject
- edge → entity
- occurred_at
- timestamp
- recurrence
- int
COMMITMENT
Something owed, by you or to you. The only type with a due date, and the only one that can quietly expire.
- label
- string
- owed_to
- edge → person
- due
- timestamp?
- state
- open | met | lapsed
02 / Edges
The edge carries state too.
An edge is not a pointer. The one between you and your sister has its own distance, its own rhythm, and its own count of things left unfinished.
edge: you → sister
- kind
- family · romantic · friend · school · lives_at · works_at
- since
- when the edge was first asserted
- last_contact
- stamped on every mention
- frequency
- rolling mentions per month
- unresolved
- count of open threads on this edge
This is what lets the model say “that’s the third time this month” without being told. The count is on the edge, not inferred from a transcript it happened to still have in the window.
It is also what keeps it quiet. An edge with nothing unresolved and a normal rhythm produces no retrieval at all — there is nothing to bring up.
03 / Time
Facts supersede. They don’t overwrite.
When something stops being true the new fact wins, but the old one keeps its dates. The shape of a change is often the only thing worth knowing.
- 01lives_at → LondonJan 2023superseded
- 02lives_at → BerlinMar 2024active
Only the active row is retrievable. The superseded one is still readable in Memory, with the date it was retired — nothing is silently rewritten, and every row is yours to delete.
04 / Retrieval
Three facts, chosen by the turn.
Three is a ceiling, not a target. Most turns retrieve one, plenty retrieve none, and a turn that needs nothing gets nothing.
01
Entities in the turn
Who and what you just referred to, resolved against the graph rather than matched as text.
02
Edge state
Whether anything on those edges is unusual: a broken rhythm, an unresolved thread, a lapsed commitment.
03
Recency and weight
A fact from March beats one from two years ago unless the old one is the reason the new one matters.
Stuffing the window with everything it knows is what makes an assistant sound like it is reading a file on you. The ceiling is the feature.
It already knows who your people are.
You just have to mention them once.