| 1-3 | v0.1-0.4 | memories table; basic CRUD; tier enum; FTS5 virtual. |
| 4-7 | v0.4-0.5 | memory_links; tags JSON; expires_at; embedding BLOB. |
| 8-10 | v0.5 | archived_memories; subscriptions; webhook dispatch_count. |
| 11-13 | v0.6.0-0.6.1 | pending_actions; sync_state; namespace_meta; governance policy in metadata; agent_id resolution. |
| 14 | v0.6.2 | SAL adapter prep; postgres_schema.sql; chunked_from metadata. |
| 15 | v0.6.3 | Hierarchy + KG additions. 4 new memory_links columns; entity_aliases table; 3 temporal indexes. Migration file → |
| 16-19 | v0.6.3.1 | governance.inherit backfill; embedding_dim guard; archive lossless; webhook event_types column. |
| 20-33 | v0.6.4 | Hooks 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. |
| 34 | v0.7.0 | V-4 closeout (#698): signed_events.prev_hash + sequence cross-row SHA-256 hash chain (tamper-evident audit log). |
| 35-37 | v0.7.0 | Shadow 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-44 | v0.7.0 | reflection_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. |
| 45 | v0.7.0 | Gap-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-47 | v0.7.0 | Per-namespace transcript lifecycle TTL + auto-extract policy columns; KG temporal-index v3; subscription HMAC-signed-only enforcement (R3-S1.HMAC; unsigned dispatch DISABLED). |
| 48 | v0.7.0 | federation_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. |
| 49 | v0.7.0 release | archived_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. |
| 50 | v0.7.0 release | Per-namespace K8 quotas (#1156): agent_quotas PRIMARY KEY extended (agent_id) → (agent_id, namespace); pre-v50 rows backfill to the _global sentinel namespace. |
| 51 | v0.7.0 release | federation_nonce_cache table (#1255): peer-replay-prevention nonces persist across daemon restarts. |
| 52 | v0.7.0 release | transcript_line_dedup table (#1389 L4): (host_pubkey_b64, line_sha256) composite key backing memory_capture_turn idempotency + the L2 recover_from_transcript replay path. |
| 53 | v0.7.0 release | memories_au FTS5 trigger scoping (#1418): sync trigger scoped to (title, content, tags) so non-FTS column updates no longer fire a needless sync. |
| 54 | v0.7.0 release | Tier-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. |
| 55 | v0.7.0 release | Sargable 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). |
| 56 | v0.7.0 release | Composite 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. |
| 57 | v0.7.0 release | Postgres 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. |
| 58 | v0.8.0 | recall_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. |
| 59 | v0.8.0 | Pillar-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). |
| 60 | v0.8.0 | signals table (#1709): typed, Ed25519-signed inter-agent messages (Pillar-1 signed signals). |
| 61 | v0.8.0 | checkpoints table (#1709): conditional coordination gates with Ed25519-attested resolution. |
| 62 | v0.8.0 | routines / routine_runs tables: scheduled-coordination substrate. |
| 63 | v0.8.0 | memory_links relation CHECK 6 → 9: closed-taxonomy extended for the Pillar-2 typed-cognition relations decomposes_into · depends_on · advances (#1709). |
| 64 | v0.8.0 | memories.lifecycle_state column (#1709, Pillar-2 Typed Cognition): the 27th Memory field; DEFAULT 'open' on legacy rows. Advertised tool count unchanged. |
| 65 | v0.8.0 | memory_links signature triggers restored: a prior full-table-rebuild migration silently dropped all triggers; v65 recreates them. |
| 66 | v0.8.0 | governance_rules.severity +escalate: CHECK extended refuse/warn/log → +escalate for the §22 PE-5 Decision::Escalate verdict. |
| 67 | v0.8.0 | target_agent_id_idx visibility column (#1720 A): owner-keyed scope=private visibility generated column. |
| 68 | v0.8.0 | encrypted_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. |
| 69 | v0.8.0 | kg_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. |
| 70 | v0.8.0 | archived_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. |
| 71 | v0.8.1 | forget_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. |
| 72 | v0.9.0 | memory_revisions table (#1823 / G6 append-only spine): identity-only revision log. |
| 73 | v0.9.0 | signed_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. |
| 74 | v0.9.0 | memories.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). |
| 75 | v0.9.0 | memory_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. |
| 76 | v0.9.0 | agent_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). |
| 77 | v0.9.0 | recall_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. |
| 78 | v0.9.0 | model_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. |