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#

LayerRole
TriplesAny short snake_case / verb-phrase predicate may be stored (with provenance).
Ontology docPreferred types + predicates that shape extract prompts and UI. Grows over time. Not a Memories allowlist.
Memories UIGroomed 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#

  1. Extract is told: prefer ontology names; invent short snake_case when nothing fits.
  2. Canonicalization still maps common slop (has+dog → has_dog, live inlives_in, is a / is aninstance_of) — write-time convenience, not a Memories allowlist. Extract should emit specific predicates (breed, …) when it knows them.
  3. On chat assemble, each durable predicate written is ontology::ensure_predicate’d with inferred domain/range from endpoint types.
  4. 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 breed without 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.