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
| Verb | Endpoint | Method | Purpose |
|---|---|---|---|
store | /v1/memories | POST | Write a memory directly. The lowest-level primitive — bytes in, Memo out. |
recall | /v1/memories/recall | POST | Retrieve relevant memories for a query. Defaults to strategy=AUTO. |
forget | /v1/memories/forget | POST | Soft-delete one or more memories. SCD-2 preserves the audit trail. |
audit | /v1/audit | GET | Inspect the immutable audit log — who did what, when, with what. |
ingest | /v1/ingest | POST | Accept raw input (text, URL, file, multimodal) into the Forge. |
distill | /v1/distill | POST | Build or extend the knowledge graph from stored memories. |
refine | /v1/refine | POST | Improve the graph in place — dedupe, infer edges, summarize, reweight. |
- 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:| You want to… | Reach for |
|---|---|
| Hand Z3rno a PDF, URL, or transcript and have it figured out for you | ingest |
| Turn unstructured memory into a queryable knowledge graph | distill |
| Keep the graph clean as it grows: merge dupes, infer missing edges, summarize clusters | refine |
| Remove a specific memory (right-to-be-forgotten, retention sweep) | forget |
| Prove to a regulator or yourself what an agent saw and did | audit |
store — Write a Memory
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.
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.
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.
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.
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.
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:
- dedupe — merge Memos sharing an
ontology_urior(memo_type, normalized_name). SCD-2 supersede preserves audit. - infer (opt-in) — LLM proposes plausible edges between under-connected Memos.
- summarize (opt-in) — LLM emits one
SUMMARYMemo per cluster, cached by cluster hash. - reweight — drain the
feedbacktable, EMA-blend edge weights from accumulated +1/0/-1 signals. - prune — drop edges that have decayed below threshold.
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
| Verb | Python SDK | TypeScript SDK | HTTP |
|---|---|---|---|
store | ✅ | ✅ | ✅ |
recall | ✅ | ✅ | ✅ |
forget | ✅ | ✅ | ✅ |
audit | ✅ | ✅ | ✅ |
ingest | ✅ (0.4.0+) | ✅ (0.4.0+) | ✅ |
distill | ✅ (0.4.0+) | ✅ (0.4.0+) | ✅ |
refine | ✅ (0.4.0+) | ✅ (0.4.0+) | ✅ |
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 astoreof a new version. The old row stays visible at itsvalid_totimestamp. - No
delete.forgetis 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.recallcovers semantic retrieval; theASKandCYPHERstrategies cover structured graph queries through the same endpoint. - No
train. The graph improves throughrefine, not by retraining a model. Feedback signals → edge weight updates → better recall, all without LLM fine-tuning.
recall + store into chat loops) or operator plumbing (datasets, sessions, API keys, health probes).