The schema, table by table.

Every SQLite table ai-memory creates, every column, every index, every foreign key. Postgres mirror via the SAL adapter (--features sal,sal-postgres; Apache AGE Cypher graph backend). Schema version: v71 at v0.8.1 (was v57 at v0.7.0, v33 at v0.6.4). The v34 → v57 ladder shipped V-4 cross-row hash chain, recursive-learning depth columns, Batman Form-4/5 provenance + confidence, optimistic-concurrency version column at v45, federation_push_dlq table at v48, archive_memories +14 columns at v49, per-namespace K8 quota dimension extension at v50 #1156, federation_nonce_cache at v51 #1255, transcript_line_dedup at v52 #1389, memories_au FTS5 trigger scoping at v53 #1418, tier-default expiry backfill at v54 #1466, the sargable list_memories_updated_since rewrite + idx_memories_updated_at at v55 #1476, composite list-ordering indexes at v56 + the postgres stored tsvector at v57 (both #1579). The v58 → v71 ladder is the v0.8.0/v0.8.1 coordination + typed-cognition + encryption-prep work: recall-observations identity binding at v58 #1705, the actions / action_edges / leases coordination substrate at v59, signed signals at v60, attested checkpoints at v61 (all #1709), routines / routine_runs at v62, the memory_links relation CHECK 6→9 at v63, the memories.lifecycle_state column at v64, signature-trigger restore at v65, governance-rule +escalate severity at v66, owner-visibility index at v67 #1720, postgres/archive encrypted_envelope parity at v68 #228/#1728, the kg_projection_outbox cold-path queue at v69 #1735, the archived_memory_links edge-preservation snapshot at v70 #1771, and the signed forget_tombstones table at v71 #1821 (W2/G30). Migration is automatic on first daemon start.

34 tables 65+ indexes v71 schema SQLite + Postgres mirror
Table-relationship map

34 first-class tables at v0.8.0.

Every relation flows from the central memories table. Foreign-key cascade-on-delete protects against orphan rows. memory_links is the KG primitive; pending_actions is the governance queue; sync_state is the federation cursor table; audit_log + signed_events are the V-4 tamper-evident chain; signed_events_dlq + federation_push_dlq are the reliability DLQs (Track D #933). The v0.8.0 Pillar-1 distributed-coordination substrate adds actions / action_edges / leases (state machine + typed DAG + lease/heartbeat), signals (Ed25519-signed inter-agent messages), checkpoints (attested coordination gates), and routines / routine_runs (scheduled coordination); archived_memory_links snapshots KG edges for lossless archive→restore (#1771). Table list authoritative against src/storage/migrations.rs CREATE TABLE statements at CURRENT_SCHEMA_VERSION = 78.

memories id (PK) · 28 fields tier · namespace · title memory_kind · entity_id reflection_depth · version citations · confidence_* memory_links source_id (FK) target_id (FK) relation (9 variants) valid_from / valid_until signature · attest_level archived_memories id (PK) · mirror shape archived_at · archive_reason +14 cols @ v49 (#1025) entity_aliases PK (entity_id, alias) alias (idx) created_at pending_actions id (PK) action_type · namespace requested_by approvals (JSON) status · decided_by namespace_meta namespace (PK) standard_id (FK) parent_namespace · updated_at subscriptions id (PK) url · events · event_types secret_hash dispatch/failure_count subscription_events id · subscription_id (FK) event_type · payload delivered_at · delivery_status sync_state agent_id · peer_id (PK) last_pulled_at last_pushed_at audit_log id · event_type agent_id · requested_family granted · attestation_tier · timestamp signed_events id · sequence · prev_hash payload_hash · signature (Ed25519) V-4 chain (v34) signed_events_dlq id · failure_reason agent_id · failed_at signed-event drainer DLQ federation_push_dlq peer-rejected writes (v48) confidence_shadow_observations memory_id (FK) · observed_at Form 5 calibration sweep schema_version version = 71 (v0.8.1) FK source_id / target_id → memories.id archive ← memories (mirror shape) shadow memory_id FK → memories.id aliases → entity memory.id FK standard_id → memories.id events → subscriptions.id

Plus governance + identity + lifecycle + coordination tables introduced across the v34–v71 ladder (and visible via SELECT name FROM sqlite_master WHERE type='table' on a fresh DB): agent_quotas (K8 per-agent quotas; per-namespace PK dimension at v50 #1156), governance_rules (K11 substrate rules engine; +escalate severity at v66), skills + skill_resources (Agent Skills, L1-5), recall_observations (Form-5 recall ledger; identity binding at v58 #1705), offloaded_blobs (QW-3 context-offload), memory_transcripts + memory_transcript_links (sidechain transcripts, I2), subscription_dlq (K7 webhook DLQ), federation_nonce_cache (v51 #1255 replay-prevention persistence), transcript_line_dedup (v52 #1389 L4 idempotency), and the v0.8.0 Pillar-1 coordination set actions / action_edges / leases (v59), signals (v60), checkpoints (v61), routines / routine_runs (v62) — all #1709 — plus kg_projection_outbox (v69 #1735, postgres-only AGE cold-path queue), archived_memory_links (v70 #1771), and the signed forget_tombstones table (v71 #1821), plus migration tracking (schema_version shown above). Agents, entities, personas, and namespace standards are NOT side tables — they are memories (reserved namespaces / standard memories) resolved via namespace_meta + entity_aliases. Verified against src/storage/migrations.rs CREATE TABLE census at v0.8.0 release HEAD.

Core tables

memories & memory_links · the heart.

memories ▸ CORE · ALL TIERS since v0.1
The primary memory store. One row per stored memory. tier determines lifecycle (short / mid / long / archived). FTS5 virtual table mirrors title+content for keyword search.
ColumnTypeNotes
PKidTEXTUUIDv4 stringified. Stable across federation.
tierTEXT NOT NULLOne of short · mid · long (canonical Tier enum in src/models/memory.rs; archived rows move to the archived_memories table, there is no archived tier value). Drives TTL + visibility.
namespaceTEXT NOT NULLHierarchical path with / delimiter (v0.6.3 Stream A). Max length 512 chars, max depth 8 segments.
titleTEXT NOT NULLHuman-readable summary, ≤ 512 chars (MAX_TITLE_LEN). FTS5-indexed.
contentTEXT NOT NULLBody text. Up to 65,536 bytes (MAX_CONTENT_SIZE = 64 KiB). FTS5-indexed.
tagsTEXTJSON array. Validator caps count at 50 (MAX_TAGS_COUNT), length at 128 bytes each (MAX_TAG_LEN).
priorityINTEGER1-10 scale. Drives auto-promote eligibility.
confidenceREAL0.0-1.0. Displayed as % when < 1.0.
sourceTEXTOrigin tag (VALID_SOURCES in src/validate.rs): user · nhi (v0.7 vendor-neutral default) · claude (deprecated, back-compat) · hook · api · cli · import · consolidation · system · chaos · notify.
access_countINTEGERBumped on each recall hit. Triggers auto-promote at ≥ 5.
created_atTEXTRFC3339 UTC. Immutable.
updated_atTEXTRFC3339 UTC. Bumped on update.
last_accessed_atTEXT NULLRFC3339. Touched on recall. Drives recency-decay scoring.
expires_atTEXT NULLRFC3339. NULL = never. GC sweep purges past-due.
embeddingBLOB NULLf32 array — 384 dims (all-MiniLM-L6-v2, local candle) or 768 dims (nomic-embed-text-v1.5 via Ollama); declared per row by embedding_dim. Set if semantic+ tier.
embedding_dimINTEGER NULLv0.6.3.1 data-integrity guard — declared dimension of the stored embedding (384 or 768) so mixed-model rows can't cross-contaminate cosine scoring.
metadataTEXTJSON. Holds agent_id, scope, governance policy, chunked_from.
v0.7reflection_depthINTEGERRecursive-learning Task 1/8 — depth in the reflection recursion tree; 0 for caller-minted rows.
v0.7memory_kindTEXT NULLBatman Form-6 vocabulary: Observation / Reflection / Persona / Concept / Entity / Claim / Relation / Event / Conversation / Decision.
v0.7atomised_into / atom_ofTEXT NULLWT-1 atomisation provenance (parent → atoms, atom → parent).
v0.7entity_id / persona_versionTEXT / INTEGER NULLQW-2 persona-as-artifact columns.
v0.7citations / source_uri / source_spanTEXT NULLForm-4 fact provenance.
v0.7confidence_source / confidence_signals / confidence_decayed_atTEXT NULLForm-5 confidence calibration + decay.
v0.7mentioned_entity_idTEXT NULLEntity-mention back-reference.
v0.7encrypted_envelopeBLOB NULLSchema v44 (#228) — E2E content encryption at rest: X25519 ephemeral pubkey + ChaCha20-Poly1305 AEAD-sealed ciphertext envelope.
v0.7versionBIGINTSchema v45 Gap-1 optimistic concurrency for memory_update; defaults to 1 on legacy rows.
v0.8lifecycle_stateTEXT NOT NULLSchema v64 (#1709, Pillar-2 Typed Cognition) — the 27th field. Closed-set lifecycle for Goal/Plan/Step typed-cognition memories; DEFAULT 'open' on legacy rows. Canonical LifecycleState enum in src/models/memory.rs.
▸ idx_memories_namespace · ▸ idx_memories_tier · ▸ idx_memories_priority · ▸ idx_memories_expires · ▸ idx_memories_updated_at (v55) · ▸ idx_memories_title_ns · ▸ idx_memories_agent_id · ▸ memories_fts (FTS5 virtual)
memory_links ▸ KNOWLEDGE GRAPH extended v0.6.3 (temporal) + v0.7.0 (6 variants, Ed25519 populated) + v0.8.0 (9 variants, typed cognition)
Typed directed links between memories. The KG primitive. v0.6.3 added temporal-validity columns (valid_from, valid_until, observed_by, signature); v0.7.0 populates signature with Ed25519 per-link attestation (was placeholder pre-v0.7). 9 link variants at v0.8.0 (was 6 at v0.7.0, 4 at v0.6.x) — the v63 migration extended the relation CHECK to 9 for the Pillar-2 typed-cognition plan spine.
ColumnTypeNotes
FKsource_idTEXT NOT NULLmemories(id) ON DELETE CASCADE
FKtarget_idTEXT NOT NULLmemories(id) ON DELETE CASCADE
relationTEXT NOT NULL9 variants at v0.8.0: related_to, supersedes, contradicts, derived_from, reflects_on (v0.7 recursive learning Task 1/8), derives_from (v0.7 atomisation atom→parent), plus the v0.8.0 Pillar-2 typed-cognition trio decomposes_into (parent→child: Goal→Plan→Step), depends_on (Step→prerequisite Step), advances (child→ancestor progress rollup) — all #1709, schema v63. Canonical enum in src/models/link.rs::MemoryLinkRelation (COUNT = 9).
created_atTEXT NOT NULLRFC3339 UTC.
valid_fromTIMESTAMP NULLv0.6.3: when the assertion became true. Backfilled to source's created_at on migration.
valid_untilTIMESTAMP NULLv0.6.3: when the assertion was superseded. NULL = still valid.
observed_byTEXT NULLv0.6.3: agent_id of the observer. Powers per-agent visibility filter.
v0.7signatureBLOB NULLv0.7.0 POPULATED: Ed25519 signature for attested provenance (was v0.6.3 placeholder). Per-row Ed25519 sig population gated on the resolved daemon agent_id having a *.priv keypair on disk.
v0.7attest_levelTEXT NULLv0.7.0 (H4 AttestLevel enum, src/models/link.rs): one of unsigned · self_signed · peer_attested · signed_by_peer · daemon_signed.
▸ idx_links_temporal_src (source_id, valid_from, valid_until) · ▸ idx_links_temporal_tgt · ▸ idx_links_relation
schema_version ▸ MIGRATION
Single-row table. Tracks current schema version. Daemon checks at startup; runs forward migrations idempotently. Current version: 71 at v0.8.1 (was 57 at v0.7.0, 33 at v0.6.4 — the v58 → v71 ladder is the v0.8.0/v0.8.1 coordination + typed-cognition + encryption-prep work).
versionINTEGER NOT NULLCurrently 78 (v0.9.0). Canonical: CURRENT_SCHEMA_VERSION = 78 in src/storage/migrations.rs. Bumped only on additive migrations. The v34 → v57 ladder covered V-4 cross-row hash chain, recursive-learning depth columns, Batman Form-4/5 provenance + confidence, the optimistic-concurrency version column at v45, federation_push_dlq at v48, archive_memories +14 columns at v49, per-namespace K8 quota dimension at v50 (#1156), federation_nonce_cache at v51 (#1255), transcript_line_dedup at v52 (#1389), memories_au FTS5 trigger scoping at v53 (#1418), tier-default expiry backfill at v54 (#1466), the sargable list_memories_updated_since rewrite + idx_memories_updated_at at v55 (#1476), composite ordering indexes at v56 (#1579), and the postgres stored tsvector at v57 (#1579). The v0.8.0/v0.8.1 v58 → v71 ladder: recall-observations identity binding at v58 (#1705); the actions / action_edges / leases coordination substrate at v59, signed signals at v60, attested checkpoints at v61 (all #1709); routines / routine_runs at v62; the memory_links.relation CHECK extended 6→9 at v63; the memories.lifecycle_state column at v64; memory_links signature-trigger restore at v65; governance_rules.severity +escalate at v66 (§22 PE-5); the target_agent_id_idx owner-visibility generated column at v67 (#1720); encrypted_envelope postgres + archive parity at v68 (#228/#1728); the kg_projection_outbox AGE cold-path queue at v69 (#1735, postgres-only); the archived_memory_links edge-preservation snapshot at v70 (#1771); and the signed forget_tombstones table at v71 (#1821 / W2 / G30, v0.8.1). The v0.9.0 v72 → v78 ladder: signed memory_revisions append-only spine at v72 (#1823 / G6); signed_events.cause_hash audit cause-binding at v73 (#1822 / G5a); the additive BLAKE3 content-id memories.cid/cid_genesis at v74 (#1825 / G8); the lineage-DAG memory_links.source_cid/target_cid at v75 (#1859 / G13-mem); the signed succession agent_lineage table at v76 (#1828 / G13); the recall-purity recall_observations.folded column at v77 (#1869 / P0-1); and the model_attestations table at v78 (#1870 / §25.3 S1 / D3-012).
Archive & metadata

Soft-delete + namespace policy.

archived_memories ▸ SOFT DELETE TIER
Same shape as memories table. Memories transition here on memory_delete or curator soft-delete. Excluded from default reads. Restorable.
Mirrors memories schema column-for-column, plus:
archived_atTEXT NOT NULLRFC3339 UTC. Drives archive purge --older-than N.
archived_reasonTEXT NULLFree-form (e.g. "user_deleted", "consolidation_supersede", "auto_curator_dedup").
namespace_meta ▸ POLICY
Per-namespace policy attached via a "standard memory" — a special memory whose JSON metadata holds the governance policy for that namespace and its descendants.
ColumnTypeNotes
PKnamespaceTEXTHierarchical path. Inheriting children walk up.
FKstandard_idTEXT NULLmemories(id). The memory holding the policy in metadata.
parentTEXT NULLAncestor namespace (computed for fast walk).
created_atTEXT NOT NULLRFC3339 UTC.
entity_aliases ▸ ENTITY REGISTRY v0.6.3 Stream B
Alias → canonical-entity resolution side table. Each entity is a memory (in any namespace); this table holds zero-or-more alternate names per entity.
ColumnTypeNotes
PKentity_idTEXT NOT NULLmemories(id) (the canonical entity memory).
PKaliasTEXT NOT NULLAlternate name. Composite PK (entity_id, alias).
created_atTEXT NOT NULLRFC3339 UTC.
▸ idx_entity_aliases_alias (alias) — fast reverse lookup
Governance & federation

pending_actions · sync_state · subscriptions.

pending_actions ▸ GOVERNANCE QUEUE
When governance policy says "Approve", the requested action lands here instead of executing immediately. Cleared on approve (executes the action) or reject.
ColumnTypeNotes
PKidTEXTUUIDv4 of the pending action.
action_typeTEXT NOT NULLOne of store · delete · promote · reflect (the GovernedAction enum; reflect added at v0.7.0 L1-8 for the memory_reflect approval gate).
namespaceTEXT NOT NULLTarget namespace (drives policy lookup).
requested_byTEXT NOT NULLagent_id of the caller.
requested_atTEXT NOT NULLRFC3339 UTC.
payloadTEXT NOT NULLJSON. The full memory + context to execute on approval.
approvalsTEXT NOT NULLJSON array of {agent_id, approved_at}. Consensus mode counts entries.
decisionTEXT NULLNULL = pending · "approved" · "rejected".
decided_atTEXT NULLRFC3339 UTC when decision finalized.
sync_state ▸ FEDERATION CURSOR
Per-(local-agent, peer-URL) sync cursors. Drives the catchup loop. last_pulled_at advances after successful /api/v1/sync/since pulls.
ColumnTypeNotes
PKagent_idTEXT NOT NULLLocal node's agent_id.
PKpeer_urlTEXT NOT NULLFederation peer's HTTPS URL.
last_pulled_atTEXT NULLRFC3339 UTC of last successful pull from this peer.
last_pushed_atTEXT NULLRFC3339 UTC of last push.
subscriptions ▸ WEBHOOKS
Outbound webhook subscriptions. Each row spawns a dispatch thread on matching event. HMAC-SHA256 signed bodies. Retry-on-5xx with bounded attempts.
ColumnTypeNotes
PKidTEXTUUIDv4.
urlTEXT NOT NULLWebhook endpoint. Validated against SSRF guard (validate_url_dns).
eventsTEXT NOT NULLComma-separated or *. e.g. store,delete,contradiction.
namespace_filterTEXT NULLGlob pattern. NULL = all namespaces.
agent_filterTEXT NULLFilter by metadata.agent_id. NULL = all agents.
secret_hashTEXT NULLSHA-256 of the plaintext shared secret. Plaintext returned once on subscribe.
created_byTEXT NULLagent_id of subscriber.
created_atTEXT NOT NULLRFC3339 UTC.
dispatch_countINTEGERSuccessful dispatches.
failure_countINTEGERFailed dispatches (non-2xx OR connect timeout).
Migrations

Schema is versioned. Migrations are idempotent.

Every schema change is a forward migration applied at daemon startup. Idempotent so re-runs are safe. v15 was the v0.6.3 Stream B addition (KG temporal-validity columns + entity_aliases). v0.6.3.1 added the v17/v18/v19 ladder: v17 adds governance.inherit backfill (`migrations/sqlite/0012_governance_inherit.sql`), v18 adds embedding_dim guard + archive lossless (`0011_v0631_data_integrity.sql`), v19 adds webhook event_types column + index (`0013_webhook_event_types.sql`). Older versions (≤ v14) remain inline in src/storage/migrations.rs::migrate.

Version timeline
VersionReleaseChange
1-3v0.1-0.4memories table; basic CRUD; tier enum; FTS5 virtual.
4-7v0.4-0.5memory_links; tags JSON; expires_at; embedding BLOB.
8-10v0.5archived_memories; subscriptions; webhook dispatch_count.
11-13v0.6.0-0.6.1pending_actions; sync_state; namespace_meta; governance policy in metadata; agent_id resolution.
14v0.6.2SAL adapter prep; postgres_schema.sql; chunked_from metadata.
15v0.6.3Hierarchy + KG additions. 4 new memory_links columns; entity_aliases table; 3 temporal indexes. Migration file →
16-19v0.6.3.1governance.inherit backfill; embedding_dim guard; archive lossless; webhook event_types column.
20-33v0.6.4Hooks pipeline (25 events); sidechain transcripts (zstd-3 BLOB); subscription DLQ; consolidated_from_agents array; KG temporal-index v2; tier-promotion metadata; A2A correlation; smart-load veto; agent quotas; signed_events audit table.
34v0.7.0V-4 closeout (#698): signed_events.prev_hash + sequence cross-row SHA-256 hash chain (tamper-evident audit log).
35-37v0.7.0Shadow retention columns on calibration tables; memory_kind Batman Form-6 vocabulary column on memories; entity_id + persona_version (QW-2 persona artefact); citations + source_uri + source_span (Form-4 fact provenance).
38-44v0.7.0reflection_depth column on memories (recursive-learning Task 1/8); atomised_into + atom_of columns (atomisation links); confidence_source + confidence_signals + confidence_decayed_at (Form-5 auto-confidence + shadow + decay); mentioned_entity_id column; link attest_level enum column.
45v0.7.0Gap-1 optimistic concurrency: version BIGINT column on memories (defaults to 1 on legacy rows via SQL DEFAULT + serde default). Powers memory_update expected_version race-detection.
46-47v0.7.0Per-namespace transcript lifecycle TTL + auto-extract policy columns; KG temporal-index v3; subscription HMAC-signed-only enforcement (R3-S1.HMAC; unsigned dispatch DISABLED).
48v0.7.0federation_push_dlq table (Track D #933): captures peer-rejected federation writes with retry-with-backoff replay. Pairs with memory_subscription_dlq_list / memory_subscription_replay MCP tools.
49v0.7.0 releasearchived_memories +14 nullable columns (#1025): reflection_depth, atomised_into, atom_of, memory_kind, entity_id, persona_version, citations, source_uri, source_span, confidence_source, confidence_signals, confidence_decayed_at, mentioned_entity_id, version. Archive → restore is now LOSSLESS for the full v0.7.0 Memory shape on both backends.
50v0.7.0 releasePer-namespace K8 quotas (#1156): agent_quotas PRIMARY KEY extended (agent_id)(agent_id, namespace); pre-v50 rows backfill to the _global sentinel namespace.
51v0.7.0 releasefederation_nonce_cache table (#1255): peer-replay-prevention nonces persist across daemon restarts.
52v0.7.0 releasetranscript_line_dedup table (#1389 L4): (host_pubkey_b64, line_sha256) composite key backing memory_capture_turn idempotency + the L2 recover_from_transcript replay path.
53v0.7.0 releasememories_au FTS5 trigger scoping (#1418): sync trigger scoped to (title, content, tags) so non-FTS column updates no longer fire a needless sync.
54v0.7.0 releaseTier-default expiry backfill (#1466): legacy NULL-expiry mid/short rows get created_at + tier TTL, closing the TTL-leak immortal-rows class. In-code arm, no new .sql file.
55v0.7.0 releaseSargable federation catchup (#1476): list_memories_updated_since predicate split for a true index range scan; SQLite adds idx_memories_updated_at; postgres is a version-stamp no-op (bootstrap already ships memories_updated_at_idx).
56v0.7.0 releaseComposite list/archive ordering indexes (#1579 A2 + B6d): idx_memories_list_order, idx_memories_ns_list_order, idx_archived_ns_archived_at paired with the sargable storage::list rewrite (141 ms → 0.06 ms at 100k rows); postgres is a version-stamp no-op.
57v0.7.0 releasePostgres stored generated tsvector (#1579 B2): tsv GENERATED ALWAYS STORED column + memories_tsv_gin GIN index; match AND rank read the column (kills the per-matched-row recompute, ~305 of 306 ms at 8k rows); legacy expression index dropped; ACCESS EXCLUSIVE table rewrite on apply. SQLite is a version-stamp no-op.
58v0.8.0recall_observations identity binding (#1705): additive nullable agent_id + namespace columns + indexes so the ledger stamps the recalling agent/namespace and rejects cross-agent recall_id replay.
59v0.8.0Pillar-1 coordination substrate (#1709): the actions / action_edges / leases tables — state machine + typed DAG + lease/heartbeat. Pure CREATE TABLE/INDEX IF NOT EXISTS (replay-safe).
60v0.8.0signals table (#1709): typed, Ed25519-signed inter-agent messages (Pillar-1 signed signals).
61v0.8.0checkpoints table (#1709): conditional coordination gates with Ed25519-attested resolution.
62v0.8.0routines / routine_runs tables: scheduled-coordination substrate.
63v0.8.0memory_links relation CHECK 6 → 9: closed-taxonomy extended for the Pillar-2 typed-cognition relations decomposes_into · depends_on · advances (#1709).
64v0.8.0memories.lifecycle_state column (#1709, Pillar-2 Typed Cognition): the 27th Memory field; DEFAULT 'open' on legacy rows. Advertised tool count unchanged.
65v0.8.0memory_links signature triggers restored: a prior full-table-rebuild migration silently dropped all triggers; v65 recreates them.
66v0.8.0governance_rules.severity +escalate: CHECK extended refuse/warn/log+escalate for the §22 PE-5 Decision::Escalate verdict.
67v0.8.0target_agent_id_idx visibility column (#1720 A): owner-keyed scope=private visibility generated column.
68v0.8.0encrypted_envelope parity (#228/#1728): adds the at-rest-encryption ciphertext column to memories on postgres (sqlite had it at v44) AND to archived_memories on both backends, so archive → restore round-trips an encrypted memory losslessly.
69v0.8.0kg_projection_outbox table (#1735 Pillar-4): the staggered AGE cold-path projection queue for AI_MEMORY_AGE_PROJECTION_MODE=deferred. Postgres-only (AGE is postgres-only); the SQLite ladder stamps v69 as a no-op.
70v0.8.0archived_memory_links table (#1771): the archive-link edge-preservation snapshot — mirrors memory_links sans the FK plus an archived_at stamp; explicit delete paths snapshot edges before the cascade reaps them, restore re-inserts edges whose both endpoints survive.
71v0.8.1forget_tombstones table (#1821 / W2.3 / gap G30): signed FORGET-tombstone table — a forget emits an owner-signed tombstone (identity + time + signature ONLY, no content fingerprint) that the federation receive funnel checks before accepting an inbound write, so a forgotten row cannot be resurrected via LWW.
72v0.9.0memory_revisions table (#1823 / G6 append-only spine): identity-only revision log.
73v0.9.0signed_events.cause_hash column (#1822 / G5a audit cause-binding): additive nullable 32-byte SHA-256 over a secret-screened, identity-only pre-image of the triggering cause; folded into the cross-row canonical bytes and the per-row Ed25519 signing input.
74v0.9.0memories.cid + cid_genesis columns (#1825 / G8 additive content-id): the 28th Memory field — an additive, content-addressed b3:<hex> BLAKE3 identity minted from a memory's GENESIS fields, alongside the UUID id (which stays the PK / every FK / the federation LWW tiebreak).
75v0.9.0memory_links.source_cid + target_cid columns (#1859 / G13-mem memory-derivation lineage-DAG): each edge mirrors the schema-v74 cid of its endpoints at link-creation time so lineage traversal resolves stable node identity even after a source is tombstoned.
76v0.9.0agent_lineage table (#1828 / G13 identity-lineage succession): one signed succession record per (agent_id, epoch) with a composite PRIMARY KEY anti-equivocation constraint; scope is single-node key-rotation survival only (not key-loss recovery).
77v0.9.0recall_observations.folded column (#1869 / P0-1 recall purity): fold-state column + partial unfolded index; recall is now PURE by default (zero writes to memories on every recall path) and a periodic FOLD job batch-applies the legacy touch ladders.
78v0.9.0model_attestations table (#1870 / §25.3 S1 / D3-012 model-attestation substrate): append-only, write-once (TOFU) record of which model family produced a generation; loader coverage hard-caps at ~40% (only substrate-invoked generation is attestable). Current = CURRENT_SCHEMA_VERSION = 78.