The handbook
TenantsUsers and rolesApplicationsScopesAgentsContext (graphium)CultivatorsChatsTracingAudit log
Concepts

Concepts: Context (graphium)

Graphium is AcasoOS's memory layer. Agent context is organised as a four-level taxonomy — Family → Genus → Specimen → ContextStatement — layered on top of DataHub.

The console exposes this through the Context page.

The four levels

LevelTablePurpose
Familydh_familiesTop-level grouping (performance, relationships, goals). Holds a running summary_embedding updated on every ingest.
Genusdh_generaSub-grouping within a family (performance-history, feedback).
Specimendh_specimensA concrete subject (a person, a project, a system).
ContextStatementacaso:MemoryStatement (KG) + kg_embeddingsAn atomic sentence about the specimen, classified and HNSW-indexed for ANN search.

The structural taxonomy (families, genera, specimens) is mirrored into the tenant's AGE graph as :Family, :Genus, :Specimen vertices with :HAS_GENUS, :HAS_SPECIMEN, and :CONTAINS_SPECIMEN edges. Statements stay relational-only — Cypher traversal queries see the structure; vector search sees the statements.

Classification

Every statement is classified deterministically by a regex pipeline in datahub.graphium.classifier. Two axes:

  • memory_typeone of fact, event, discovery, preference, advice, decision.
  • layer_kindpreloaded (pulled by wake_up_context at session boot) or on_demand (default; fetched only by search_context / recall_context).

Classification runs at ingest time. The console surfaces these as badges on every statement card. A template that wants richer extraction should run its own LLM upstream and call ingest_context(statements=[...]) with pre-split atoms.

Dedup

ingest_context skips inserting a statement whose embedding sits within 0.999 cosine similarity of an existing one in the same family. Instead it bumps access_count on the matched row.

Re-ingesting the same fact is therefore safe and idempotent-ish; the UI surfaces a "Dedup: matched existing statement" pill when this happens.

Scope gating

Statements, specimens, and families carry an optional required_scopes TEXT[] column. The RLS policy is tenant_and_scope_isolation — a row is visible when any of these holds:

  • cardinality(required_scopes) = 0 (no gating).
  • 'public' = ANY(required_scopes).
  • The caller's session scopes match at least one entry.

Editing required_scopes is one of the few mutations the console allows on a statement.

Symbiosis

dh_symbioses rows are cross-family edges of kind related_to, contradicts, or supersedes. Search results follow symbiosis edges after the primary ANN scan and surface hits tagged is_symbiosis=true.

Note: v1 is read-only for symbiosis; pipelines do not create them automatically.

Content edits

The content field of a statement is NOT editable in v1. Changing the content would require re-embedding the vector, which has correctness and performance implications worth their own design. To change content, delete the statement and re-ingest the new wording.

PreviousConceptsAgentsNext ConceptsCultivators