Skip to main content

The Z3rno Verbs

Z3rno’s public API is built around seven verbs. Together they cover the entire lifecycle of an agent’s memory — from accepting raw input, through extracting structure, retrieving relevant context, improving the graph over time, and proving what happened when. Every other endpoint composes these seven primitives. The verb names are deliberately Z3rno-native — they’re built from how the system actually thinks about memory, not borrowed from any external vocabulary.

Verb Table

The seven verbs split naturally into two layers:
  • Primary (store, recall, forget, audit) — the day-one Z3rno surface every SDK has supported since v0.1.0.
  • Forge (ingest, distill, refine) — the structure-building layer added in Phases A–D. SDK wrappers landed in v0.4.0 (Python + TypeScript).

When to Use Which

A typical agent integration uses three of the seven verbs in a tight loop:
The remaining four verbs come in as the system matures:

store — Write a Memory

See: Memory Types, Multi-Tenancy.

recall — Retrieve Memories

recall defaults to strategy=AUTO — an LLM routes the query to one of ten retrieval strategies (VECTOR, LEXICAL, GRAPH, TRIPLET, TRACE, TEMPORAL, ASK, CYPHER, CODE, plus AUTO itself) based on its shape. You can also pin a strategy explicitly.
See: the full retrieval surface in PHASE-C-IMPLEMENTATION.md.

forget — Soft-Delete

forget performs an SCD-2 soft delete: the row is closed (valid_to = now(), deleted_at = now()) but historical versions remain visible to audit. There is no destructive DELETE in the public surface.
See: Temporal Versioning.

audit — Inspect the Trail

Every store, recall, forget, ingest, distill, and refine writes one or more rows to the immutable audit log. audit queries it with the usual filters.
The audit table carries an immutability trigger (Migration 014) so even a privileged DB role cannot rewrite history.

ingest — Accept Raw Input

ingest is the Forge’s front door. Text, URLs, files (PDF / DOCX / CSV / Markdown / code / image / audio), and Tavily-driven search results all land here.
For file uploads, use the multipart endpoint directly (not yet wrapped in the SDKs):
When INGEST_AUTO_DISTILL=true (default) every successful ingest chains into distill automatically — drop in a PDF, get a graph. Operator reference: PHASE-B1-IMPLEMENTATION.md, PHASE-B2-IMPLEMENTATION.md.

distill — Build the Graph

distill runs the Forge: chunks the stored memories, runs LLM-driven entity + relationship extraction, and writes typed Memo graph nodes and edges. Idempotent — re-running over already-distilled memories is a no-op.
Returns 202 + job_id; poll get_distill_status for the final state. Operator reference: PHASE-A-IMPLEMENTATION.md.

refine — Improve the Graph

refine is the self-improvement loop. One refine pass executes:
  1. dedupe — merge Memos sharing an ontology_uri or (memo_type, normalized_name). SCD-2 supersede preserves audit.
  2. infer (opt-in) — LLM proposes plausible edges between under-connected Memos.
  3. summarize (opt-in) — LLM emits one SUMMARY Memo per cluster, cached by cluster hash.
  4. reweight — drain the feedback table, EMA-blend edge weights from accumulated +1/0/-1 signals.
  5. prune — drop edges that have decayed below threshold.
Refine pairs with POST /v1/feedback — agents (or eval harnesses) post signals there; refine drains them into edge weight updates. Together they make the graph learn from how it’s actually used. Operator reference: PHASE-D-IMPLEMENTATION.md.

SDK Coverage

The Forge verbs (ingest / distill / refine) are operator-flagged on the server (INGEST_ENABLED, DISTILL_ENABLED, REFINE_ENABLED) and dormant by default. Until they’re enabled, those routes are not even registered — OpenAPI byte-identical, SDK calls raise NotFoundError.

Why These Verbs

A few design choices worth calling out:
  • No update. Memories are SCD-2 versioned, so an “update” is really a store of a new version. The old row stays visible at its valid_to timestamp.
  • No delete. forget is soft by design. Z3rno keeps the audit trail intact; right-to-be-forgotten is enforced by RLS + retention policies, not by destructive deletes.
  • No query. recall covers semantic retrieval; the ASK and CYPHER strategies cover structured graph queries through the same endpoint.
  • No train. The graph improves through refine, not by retraining a model. Feedback signals → edge weight updates → better recall, all without LLM fine-tuning.
This is the canonical surface. Everything else is either composition (e.g. agents stringing recall + store into chat loops) or operator plumbing (datasets, sessions, API keys, health probes).