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.

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.