Migration Guide

This guide covers the public upgrade path from Zaxy 0.4 through 2.x. Eventloom logs are append-only; migrations should add events, projection metadata, indexes, docs, or compatibility shims instead of rewriting historical records.

Upgrade Checklist

Before and after each upgrade:

  1. Back up .eventloom/, projection directories, and any sidecar database.
  2. Run zaxy memory status --graph to verify Eventloom integrity and graph projection lag before changing code.
  3. Run zaxy doctor --beta-readiness from the target checkout.
  4. Rebuild or refresh projections with zaxy refresh-context or zaxy reproject when the release notes mention projection changes.
  5. Re-run the documented examples or mission smoke that your integration uses.
  6. Capture the final command evidence in Eventloom with verification.recorded or your normal lifecycle capture path.

From 0.4 to 0.5

0.5 reframed the public path around Coordinator Memory for Agent Teams. The memory substrate remains compatible with 0.4 Eventloom logs, but docs and examples now expect the first-run flow to prove install, init, bootstrap, checkout, doctor, and example timing.

Required actions:

From 0.5 to 0.6

0.6 introduced the shared native integration contract and stronger MCP response shape checks. Existing MCP clients should keep working, but code that parses checkout metadata should expect the zaxy.native.v0.6 contract in native adapter responses.

Required actions:

From 0.6 to 0.7

0.7 added Zaxy Coordinate mission workflows. This is additive for single-agent memory users, but multi-agent clients should move from informal transcript-only coordination to explicit mission, worker, assignment, finding, review, promotion, approval, checkout, and handoff events.

Required actions:

From 0.7 to 0.8

0.8 added outside-MCP model-call wrappers and provider-neutral trace export. These paths are optional; MCP remains the framework-neutral integration route.

Required actions:

From 1.0 to 1.1

1.1 adds StateRecoveryBench and replay-derived Coordinate accepted-state resolution. This is additive for existing memory users, but Coordinate clients should treat parent-promoted accepted state as the only answerable mission state by default.

Required actions:

From 0.8 to 0.9

0.9 was the API freeze candidate. The main migration task is to compare your client usage with docs/api-inventory.md and remove dependencies on surfaces marked Internal. Surfaces marked Experimental can remain in prototypes, but they should not be required for a production 1.0 rollout.

Required actions:

From 0.9 to 2.0

The frozen v0.9 surfaces carry forward; 1.x and 2.0 changes are additive or follow the freeze policy in docs/api-inventory.md. Notable upgrade items:

From 2.0 to 2.1+

The 2.1–2.3 agent-experience and cognitive-memory surfaces are entirely additive — no Eventloom envelope changes, no projection migrations, no removed or renamed tools — but 2.1.0 flips two defaults, each promoted by its measurement lane per the roadmap:

  1. MCP_TOOL_PROFILE defaults to core (was full). The internal tool-adoption lane measured the listed tool surface at 8,165 → 1,344 estimated tokens (an 83.5% reduction) with memory_checkout listed first. Profiles change listing only; dispatch is never filtered, so every tool stays callable by name. Opt out: MCP_TOOL_PROFILE=full (or zaxy serve --profile full). Affected: clients that snapshot tool listings or pin the listed-tool count — refresh snapshots or pin full.
  2. RETRIEVAL_PROFILE defaults to cognitive (was local_fast). The internal forgetting lane measured exact cold-start parity (zero-reinforcement corpora rank byte-identically to plain), no-recall-loss 1.0 (attenuated memories stay reachable by explicit query, labeled in diagnostics), pin/authority exemptions 1.0, and ranking lift 1.0 vs 0.0. The cognitive profile composes the same local retrieval stack as local_fast plus the salience-ranking, cue-blending, and graph-walk flags. Opt out: RETRIEVAL_PROFILE=local_fast for the previous plain default. Affected: users with reinforcement history or graph structure the walk can traverse may see ranking shifts; cold-start users (no reinforcement events) see identical ranking. Settings that leave the profile unset but explicitly customize embedding/reranker/scoring knobs keep resolving to the custom profile exactly as before the flip.

Unchanged defaults: the write-time encoding gate stays off (ENCODING_GATE_ENABLED=false, unmeasured) and vector quantization stays none. One default moved defensively: VECTOR_ANN_THRESHOLD rose from 50000 to 1000000 because the internal vector-scale lane measured the HNSW path below exact search on both recall and latency at 10^5 vectors — the raise prevents auto-engaging a measured-worse path; lower it explicitly to opt in. The feeling-of-knowing surface remains experimental (its calibration lane Brier margin over the base-rate predictor is +0.001–0.006 — too thin for promotion). Beyond the two flips above, existing clients upgrade without action; everything below is opt-in.

New settings (all documented in configuration.md):

New MCP tools (additive; no existing tool was removed or renamed):

Both profiles now list memory_checkout first, and every core-profile tool description names checkout as the front door. Clients that snapshot tool listings or descriptions should refresh against docs/examples/mcp-tool-contract.json.

New CLI surfaces:

New event kinds and payload conventions (additive Eventloom payloads):

The cognitive retrieval profile (the default since 2.1.0) enables salience-blended ranking, cue-overlap blending, and personalized-PageRank graph-walk retrieval over the unchanged immutable log. Attenuation is projection policy only — labeled in diagnostics.attenuation, exempting pinned and authority-bearing memories, and reversible by switching to RETRIEVAL_PROFILE=local_fast. See retrieval.md. The lean core tool listing is likewise the default since 2.1.0; restore the full listing with MCP_TOOL_PROFILE=full or zaxy serve --profile full; memory_capabilities reports the active profile and the available-but-unlisted tools.

2.2: ANN engagement defaults

2.2 changes when the embedded backend's HNSW vector path engages — nothing else in the upgrade path changes. VECTOR_ANN_THRESHOLD drops from 1000000 to 100000, gated by a new dimension ceiling VECTOR_ANN_MAX_DIMENSION (default 64), and engagement gains a second clause: within the ceiling, a (session, version) vector scope also engages ANN when its exact float64 matrix (count × dimension × 8 bytes) would exceed the 256 MiB vector index cache byte budget — above 524,288 rows at dimension 64. The lowered count default is backed by two consecutive vector-scale lane passes at exactly 10^5 vectors (dimension 64) with recall@10 of 1.0 on both the strict and tie-aware metrics, ANN p50 at-or-better than exact in-run, and resident bytes improved (docs/research/artifacts/ann-2026-06/ann3-d64-100k-r1.json/-r2.json); the ceiling is that evidence's measured envelope — at dimension 1536/50k gaussian the lane measured HNSW recall@10 of 0.6 against exact at 22ms p50 (ann3-d1536-50k-gauss-crossover.json; 0.6344 on a rerun, and 0.8438 at efs 800 with worse-than-exact latency), so higher-dimensional scopes stay on exact (or opted-in int8) search regardless of size. Opt out: VECTOR_ANN_THRESHOLD=1000000 restores the 2.1 count behavior, and VECTOR_ANN_BYTE_BUDGET_ENGAGEMENT=false disables the byte clause; a single over-budget exact matrix stays resident as a cache of one (the budget bounds multi-scope cache totals). An explicit VECTOR_QUANTIZATION=int8 opt-in keeps its precedence below the count threshold and is exempt from the byte clause. memory_capabilities reports the effective rule under vector_search.

From 2.2 to 2.3: embedded engine moves to LadybugDB

2.3 replaces the embedded projection engine. The Kuzu project was archived upstream in October 2025 with 0.11.3 as its final release: it already ships no macOS or Windows wheels for Python 3.14, and no Python 3.15 wheels will ever exist (3.15 lands ~October 2026), so staying was a countdown, not an option — there is no opt-out. Zaxy now exact-pins LadybugDB (ladybug==0.17.1), the actively maintained fork of the same engine. The adoption was gated on re-running Zaxy's own defect reproductions and the full vector-scale and graph-walk lanes against the fork.

What changes for you:

Compatibility Tests

The compatibility suite should prove that old public behavior still works or that a migration path is documented:

When a compatibility break is intentional, update this guide, the changelog, the API inventory, and the narrow test that proves the old behavior is rejected or migrated. For stable or beta surfaces listed in docs/examples/v1-schema-freeze.json, record the change with schema.migration.proposed before implementation and schema.migration.applied after verification.

Rollback Policy

Rollback should restore code and projections without rewriting Eventloom:

Related references: api-inventory.md, testing.md, runbook.md, and README.md.