Design: Predicates & ontology (open model)
A closed “durable predicate allowlist” cannot keep up with personal knowledge such as `breed`, `allergy`, or `jersey_number`. Doso does not download a giant schema catalog. It denies noise, lets extraction invent useful predicates, and
remembers good names in the user ontology.
Two graphs, one rule for edges#
| Layer | Role |
|---|---|
| Triples | Any short snake_case / verb-phrase predicate may be stored (with provenance). |
| Ontology doc | Preferred types + predicates that shape extract prompts and UI. Grows over time. Not a Memories allowlist. |
| Memories UI | Groomed first-person projection of verified durable facts (see Memory Groom). |
What is durable?#
is_durable_thought_predicate is a denylist, not an allowlist:
Hide (noise):
- Mention / thread filler —
mentioned,cc, … - Soft contact —
emailed,met_with,scheduled, … - Workflow chatter —
requested,follow_up, … - Underspecified glue — bare
is,has,related_to,of, …
Show (via Memory Groom): everything else that is verified and reachable from the owner — owner on the edge, or durable attributes of entities the owner links to via any durable outbound edge — with first-person inbound skips. Not a per-pet predicate list.
There is no complete downloadable list of “good” personal predicates. Schema.org / Wikidata are too large and too generic; personal graphs need open attributes.
How new predicates appear#
- Extract is told: prefer ontology names; invent short snake_case when nothing fits.
- Canonicalization still maps common slop (
has+dog →has_dog,live in→lives_in,is a/is an→instance_of) — write-time convenience, not a Memories allowlist. Extract should emit specific predicates (breed, …) when it knows them. - On chat assemble, each durable predicate written is
ontology::ensure_predicate’d with inferred domain/range from endpoint types. - Next extract prompts include the new name under “Preferred predicates”.
Users can also define types/predicates in chat (In my world…, Order ships_to Location) via apply_chat_ontology.
What we deliberately do not do#
- Maintain a growing Rust allowlist of every personal attribute (
breed,age, …) for Memories. - Import a full public ontology as the write schema.
- Treat “LLM understood it in chat” as a graph write without remember/ingest (see Ask, chat & live).
Product consequences#
- Saying “Pixel's breed is …” can create
breedwithout a code change. - Memories will show
allergy,birthday, etc. once verified — as long as they are not denylisted noise. - Prefer promoting user-asserted chat triples to
verified(remember path) so open predicates are actually visible.