Repository navigation
Memory Bundle Format Compatibility
Spector stores each partition and each namespace runtime in a single mmap'd bundle file. This page states which bundle format versions a release reads and writes, and what happens when it meets one it does not recognise.
| Release | Writes | Reads | Refuses |
|---|---|---|---|
current main
|
1 |
1 |
anything outside [1, 1]
|
The range is declared in code, not in documentation, by two constants in
BundleFileLayout:
public static final int SCHEMA_VERSION = 1; // the version this binary writes
public static final int MIN_READABLE_SCHEMA_VERSION = 1; // the oldest it will readBundleDirectory.read accepts a bundle only when its recorded version falls in the closed interval
[MIN_READABLE_SCHEMA_VERSION, SCHEMA_VERSION]. The table above is generated by reading those constants, so
it cannot drift from the code without a test failing.
The open is refused, with a SpectorStorageException carrying FILE_FORMAT_INVALID and a message naming
the file's version, the readable range, and the remedy:
| Situation | Message says |
|---|---|
| Version above the range | The bundle was written by a newer Spector; upgrade this binary to read it. |
| Version below the floor | The bundle predates the oldest supported format; migrate it with an older release first. |
| The two recorded copies disagree | Refuses rather than guessing which copy is authoritative. |
| Partition bundle opened as runtime, or vice versa | Names both roles, so it is clear which file was pointed at what. |
The bundle directory records where every region begins. Misreading it does not produce a clean error at the point of the mistake — it produces records read from the wrong offsets, which surfaces much later as corrupt data with no obvious cause.
There is a second, sharper reason. A bundle is opened READ_WRITE, and close() rewrites the directory with
the current version. Before this gate existed, an unfamiliar bundle was not merely accepted: it was
relabelled as the current version on close, destroying the only evidence that another binary had written
it. The next open then saw a well-formed, current-version file whose regions had been laid out by a different
writer.
This matches the discipline already applied elsewhere in the kernel — HebbianGraphMemory throws on an
unrecognised magic rather than starting fresh, and RegionPreamble.readShape throws on an unknown shape
ordinal.
Every on-disk version in the kernel is a single int. There is deliberately no major/minor split in any
binary header: introducing one would mean either reinterpreting bytes already written or claiming reserved
space, for no gain over a declared readable range.
note: Not to be confused with
SchemaVersion
`SchemaVersion` — which does have major, minor and patch — versions the **namespace directory layout** and
is persisted as a JSON string (`{"schemaVersion": "2.0.0"}`). It never appears in a bundle header. The two
version schemes are independent.
A bundle stores its format version twice, and both copies are checked:
| Location | Offset | Written by |
|---|---|---|
Bundle RegionPreamble
|
file offset 0, field at +4 | BundleDirectory.write |
BundleSubHeader |
file offset 64, field at +4 | BundleDirectory.write |
They are written together, so a disagreement means one was rewritten independently — corruption worth refusing rather than silently resolving.
Beyond the bundle-level version, each region carries its own version, also stored twice — once in its
RegionEntry in the directory and once in the region's own preamble. A partition bundle has five such regions
(SEMANTIC, EPISODIC, PROCEDURAL, TEXT, STRENGTH); runtime bundles have more.
As of PR #1015, RegionVersionRegistry.validateRegionVersions() is called during BundleDirectory.read() to
validate that each region slice's preamble schema version agrees with its directory entry and is at least 1.
Regions whose preambles use non-SMKM magic (e.g., graph regions with custom headers) are skipped rather than
rejected, preserving backward compatibility.
When the first layout version bump occurs, RegionVersionRegistry should be extended with explicit per-RegionId
acceptable version ranges (currently all layouts declare schemaVersion() == 1).
V4 bundles replaced the earlier layout of one file per region. That migration still works, and is detected by directory shape, not by any version field:
| Condition | Meaning |
|---|---|
partition.bundle present |
Already V4; nothing to do |
partition.bundle absent and any of semantic.mem, episodic.mem, procedural.mem, text.dat present |
V3 store; migrate |
| Neither present | Empty partition; nothing to do |
PartitionManager.openFrozenPartition invokes BundleMigrationCli.migratePartition reflectively — the
reflection exists only so spector-memory needs no dependency on spector-cli. Migration copies each region
into a new bundle, verifies record counts, and renames the originals with a .v3bak suffix rather than
deleting them.
Because a V3 store has no partition.bundle at all, it never reaches the bundle open path, and the version
gate cannot affect the migration.
The frozen-bundle fixtures in BundleFormatCompatibilityTest are real bundle files checked into the
repository and opened on every CI run, on x86_64 and aarch64. A fixture written on one architecture and
opened on the same architecture would prove nothing about byte order or alignment; opening it on both is what
makes it a compatibility test.
- Home
-
Getting Started
- Quick Start
- Installation
- Developer Guide
- JDK API Status
- MCP Server
- Java SDK
- Java API Reference
- Python SDK
- TypeScript SDK
- Spring AI Integration
- CLI Reference
- REST API
- API Playground
- Error Codes
- Configuration
- Deployment
-
Cognitive Memory
- Overview
- Getting Started
- Use Cases
- API Reference
- Concepts
- Pathways
- Scoring features
- Profiles
- Experimental
- Internals
- Design ancestry
-
Memory Kernel
- Overview
- Bundle Architecture
- Memory Shapes
- Binary Layouts & Tags
- WAL & Durability
-
Region Reference
- Overview & Index
- Partition Regions
-
Runtime Regions
- Working Memory
- Co-Activation Matrix
- Index MIDX
- Index IDPL
- Hebbian Graph
- Temporal Chains
- Temporal Facts
- Entity Directory
- Entity Names Pool
- HyperEntity Graph
- Entity Types Registry
- Relation Types Registry
- BM25 Lexical Index
- Checkpoint
- Insula (Somatic Self-Model)
- Continuity
- Provenance
- SPLADE Sparse Index
- Entity Reverse Index
- Identity Regions
- Synapse & Cortex
-
Architecture
- System Overview
- Core Concepts
- Ingestion Pipeline
- MCP Integration
- Distributed Mode
- Event Notifications
- Namespace Sharding
- Single-Namespace Scale & Capacity Limits
- Scale Benchmark Empirical Results
- Writer Quiesce Pause Empirical Results
- Kill-Owner Failover Empirical Results
- Salience & Importance Architecture
- GPU Acceleration
- Performance Tuning
- Test Framework & LLM Judge
- Chat & Visual Test Infrastructure
- Security & Data
-
Architecture Decision Records (ADRs)
- Overview
- Template
- Master Catalog (0001-0085)
-
Memory Kernel & Storage Formats
- ADR-0001: Graph Compression Strategy for Entity Graph
- ADR-0002: Multi-Partition Recall Fan-Out & Frozen Reten...
- ADR-0003: Completing Hypergraph Entity-Graph Graduation
- ADR-0004: Mmap Bundle Architecture & File Descriptor Sc...
- ADR-0005: spector-memory Technical Debt Hardening
- ADR-0042: Graph Recall Architecture and Cognitive Trave...
- ADR-0043: Single-VMA Bundle Layout Specification
- ADR-0044: Memory Kernel Isolation, Composition, and Layout
- ADR-0045: Spector Memory Import & Export Pipeline
- ADR-0046: Single Engram, Four Stores Storage Architecture
- ADR-0047: Episodic Memory and Engram Model Hierarchy
- ADR-0057: Remediation of Hardcoded Memory Offsets and Alignment Constants
- ADR-0062: Spector Memory Organization — Three-Plane Architecture
- ADR-0082: Index Plane Lifecycle, Derived Views, and Reconciliation
-
Active Inference Self-Model Engine (AISME)
- ADR-0006: Episodic Conversation Architecture
- ADR-0007: ReflectPathway — Biological Sleep Consolidation
- ADR-0008: Cognitive Substrate Evolution (TANGLE, GPM, M...
- ADR-0009: AISME Phase 1 — Homeostatic Affective Core
- ADR-0010: AISME Phase 2 — Free-Energy Guided Recall
- ADR-0011: AISME Phase 3 — Modern Hopfield Associative M...
- ADR-0012: AISME Phase 4 — Neural Manifold Distance (NMD)
- ADR-0013: AISME Phase 5 — Predictive Coding Narrative Self
- ADR-0014: AISME Phase 6 — Consciousness Continuity Metr...
- ADR-0015: AISME Phase 7 — Synaptic Relay Wiring & Pathw...
- ADR-0016: AISME Phase 8 — Closed-Loop Epistemic Learning
- ADR-0017: AISME Phase 9 — Generative Counterfactuals & ...
- ADR-0018: AISME Phase 10 — WanderPathway & Kernel Conti...
- ADR-0019: AISME Phase 11 — Expected Free Energy Policy ...
- ADR-0020: AISME Phase 12 — Continuous Self-Dynamics
- ADR-0023: AISME Complete Loop Closure & CognitiveVector...
- ADR-0024: Polymorphic SoulContext Hierarchy in AISME
- ADR-0027: Soul-Conditioned & Salience-Modulated Persona...
- ADR-0048: Cross-Capture Graph & CoActivation Kernel
- ADR-0049: Identity Trajectory Lyapunov Stability
- ADR-0050: Event Density Gating and Dynamic Epistemic Co...
- ADR-0051: Bayesian Online Change-Point Episode Segmenta...
- ADR-0052: Differential Privacy and Edge Anonymization
- ADR-0053: Multimodal Composite Importance Scoring
- ADR-0054: Lifespan-Adaptive Forgetting & Retention Kernel
- ADR-0055: LSR & RFF Dense Associative Memory Engineerin...
- ADR-0056: Log-Sum-ReLU (LSR) & Random Fourier Features ...
- ADR-0058: Linguistic & Vocal Prosody Expression Engine
- ADR-0063: Spacetime Vector Search and Synaptic Relay Architecture
- ADR-0064: Spacetime Simulation on Wander, Dream, and Express Pathways
- ADR-0071: Remember Cognitive Pathway Architecture
- ADR-0072: Six-Phase Fused Cognitive Scoring Pipeline
- ADR-0073: Recall Cognitive Pathway and Multi-Phase Retrieval Architecture
- ADR-0074: Reflect Cognitive Pathway and Sleep Consolidation Architecture
- ADR-0078: Salience Network and Thalamic Cognitive Profiles Architecture
-
Platform, Synapse & Clustering
- ADR-0021: Nucleus Symmetric Hardware Abstraction Layer ...
- ADR-0022: Embodied Kinesics & Phenomenological MCP Engine
- ADR-0025: Declarative MCP Tool Definitions via JSON Sch...
- ADR-0026: Dual-Plane Concurrency & Async Queue Backpres...
- ADR-0028: Dual-Plane Memory Audit Architecture (Separat...
- ADR-0029: Episodic→Semantic Lineage Provenance Region
- ADR-0030: Unified Engram Encoding Header Architecture
- ADR-0031: Unified Configuration Architecture & Bypass E...
- ADR-0032: Persona Enactment — Soul as Policy over Memory
- ADR-0033: Decoupling Cognitive & Mathematical Kernels t...
- ADR-0034: Cell Topology, Namespace Ownership, and HA Cl...
- ADR-0035: Cognitive Pathway Framework Rearchitecture
- ADR-0036: Pathway Error Handling, Isolation, and Circui...
- ADR-0037: Ingestion Boundary and Sensory Relocation
- ADR-0038: SIMD-Accelerated BM25 Lexical Scoring Optimiz...
- ADR-0039: Robust Unified Rate Limiting Architecture
- ADR-0040: Universal Apache Camel Messaging Channels
- ADR-0041: Unified Connector Architecture for Ingestion
- ADR-0059: Java 27 Upgrade Strategy and Value Class Migration
- ADR-0060: Cognitive Continuity Layer and Decoded Mind Streams
- ADR-0061: In-Memory Multi-Tenant Quartz Scheduler
- ADR-0065: Client SDK Architecture, OpenAPI, and MCP Integration
- ADR-0066: Engine & CLI Stabilization — Issue #727 Hardening
- ADR-0067: Cell-Based High Availability and Namespace-Sticky Sharding
- ADR-0068: Phileas PII Redaction Engine for Spector Synapse
- ADR-0069: Synapse-Owned Tool Access Policy
- ADR-0070: Unified Error Taxonomy and Exception Handling Architecture
- ADR-0075: Extensible LLM and Multimodal Embedding Provider SPI
- ADR-0076: Zero-Dependency Pluggable Cache Abstraction
- ADR-0077: Model B Asynchronous Task Queue and Concurrency
- ADR-0079: Asynchronous Memory Event and Telemetry Notification Bus
- ADR-0080: Observed Memory and Pathway Metrics Telemetry Architecture
- ADR-0081: Dedicated Reactive Ingress and In-Process Path Router
- ADR-0083: Namespace-Isolated Memory Analytics & Telemetry
- ADR-0084: Dual-Plane Conversation Persistence
- ADR-0085: Dynamic Synapse Configuration Overrides and Runtime Propagation
-
Modules Registry
- Overview
- Foundation Layer (/nucleus)
- Cognitive Layer (/memory)
- Gateway Layer (/synapse)
- Benchmarks & UI
- Deep Dives
-
Community
- Governance
- Contributing
- FAQ
- Glossary
- Roadmap
- 🔬 Labs
- Third-Party Legal