Repository navigation
Kernel Layouts
Hardware cache-line-aligned binary layouts optimizing CPU memory bus saturation, zero-false-sharing concurrency, and sub-microsecond candidate pre-screening.
In cognitive memory systems, forming a memory trace (encoding) and recalling it (retrieval dynamics) represent distinct computational concerns. In an off-heap engine, combining these two concerns into a single record layout causes severe concurrency bottlenecks:
-
The False Sharing Problem: When multiple worker threads execute high-throughput vector similarity scans over thousands of memory records, any thread that mutates a recall counter or access timestamp on an engram invalidates the entire CPU cache line (
L1/L2/L3) across all CPU cores. - The Spector Solution: A physical split between immutable engram encoding metadata and mutable recall telemetry.
graph TD
subgraph "Pure Engram Record (64B Cache Line + Vector)"
EH["Encoding Header (64 Bytes)<br/><i>Immutable Creation Metadata & 128-bit Bloom Tags</i>"]
VEC["Quantized Vector Payload (N Bytes)<br/><i>INT8 / INT4 Embedding Codes</i>"]
EH --- VEC
end
subgraph "Strength Region (Dedicated Partition Region)"
ST["Strength State (96 Bytes)<br/><i>Mutable Access Counters, Storage Strength S(t), ACT-R Ring</i>"]
end
EH -.->|Mapped via Physical Offset| ST
style EH fill:#27ae60,color:white
style VEC fill:#2ecc71,color:white
style ST fill:#e67e22,color:white
-
Pure Encoding Identity: The primary engram record contains only immutable or read-mostly attributes established during memory ingestion. It remains static during search operations.
-
Strength Region: All mutable metrics—including Bjork storage strength, explicit agent reinforcement counts, passive auto-LTP retrieval counts, and ACT-R recall timestamp history—are relocated to an independent 96-byte record within the dedicated Strength Region (
RegionId.STRENGTH).
The engram header is aligned to exactly one 64-byte CPU cache line, ensuring that a sequential memory scan reads one complete header per memory bus burst with zero split-line penalties.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ver(1B)|flg(1B)| val(1B)| aro(1B)| importance (4B) | 0x00
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ timestamp_ms (8B) + 0x08
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| exact_norm (4B) | centroid (2B)| pad0 (2B) | 0x10
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ synaptic_tags_lo (8B) + 0x18
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ synaptic_tags_hi (8B) + 0x20
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|consol(1B)|prof(1B)|alpha| beta | soul_version | reserved_geo | 0x28
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| encoding_surprise (4B) | reserved block (12B) | 0x30
| | | 0x38
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Offset | Size | Field Name | Type | Description |
|---|---|---|---|---|
0x00 |
1B | header_version |
uint8 | Encoding header version (Current: 2). |
0x01 |
1B | flags |
uint8 | Bitfield flags: tombstone, tier type, consolidated, pinned, resolved, modality. |
0x02 |
1B | valence |
int8 | Signed emotional valence at ingestion ( |
0x03 |
1B | arousal |
uint8 | Unsigned emotional intensity at ingestion ( |
0x04 |
4B | importance |
float32 | Initial base importance score derived from intrinsic properties ( |
0x08 |
8B | timestamp_ms |
int64 | Epoch milliseconds when the memory was initially encoded. |
0x10 |
4B | exact_norm |
float32 | Unquantized L2 vector norm for exact cosine reconstruction. |
0x14 |
2B | centroid_id |
int16 | Cluster centroid index for coarse inverted index (IVF) routing. |
0x16 |
2B | _pad0 |
bytes | Alignment padding. |
0x18 |
8B | synaptic_tags_lo |
uint64 | Low 64 bits of the 128-bit Synaptic Bloom Filter. |
0x20 |
8B | synaptic_tags_hi |
uint64 | High 64 bits of the 128-bit Synaptic Bloom Filter. |
0x28 |
1B | consolidation_flags |
uint8 | Provenance bits (simulated, crystallized, dreamed, circadian-promoted). |
0x29 |
1B | encoding_profile |
uint8 | Active cognitive profile identifier during ingestion. |
0x2A |
1B | encoding_alpha |
uint8 | Quantized associative attention weight ( |
0x2B |
1B | encoding_beta |
uint8 | Quantized contextual balance weight ( |
0x2C |
2B | soul_version |
uint16 | Monotonic generation counter of the agent persona configuration. |
0x2E |
2B | _reserved_geo |
bytes | Reserved for hyperbolic manifold coordinates. |
0x30 |
4B | encoding_surprise |
float32 | Bayesian surprise |
0x34 |
12B | _reserved |
bytes | Zero-padded reserved block for future tensor invariants. |
Synaptic tagging is modeled after biological synaptic tagging and capture (Frey & Morris, 1997). When a memory is stored with tags (e.g. preferences, ui, billing), these strings are hashed into a compact bitset.
flowchart LR
TAGS["Context Tags:<br/>['preferences', 'ui']"] --> HASH["MurmurHash3 (128-bit)"]
HASH --> BITS["128-Bit Bloom Filter<br/><i>Offsets 0x18 - 0x27</i>"]
QUERY["Query Filter:<br/>'preferences'"] --> QHASH["MurmurHash3"]
QHASH --> TEST{"Bitwise AND Test<br/>(candidate & query == query)"}
BITS --> TEST
TEST -->|Match| SCAN["Pass to Vector Scoring"]
TEST -->|Mismatch| SKIP["Skip (Zero Vector Math)"]
-
Capacity: A 64-bit filter begins experiencing severe false positive degradation beyond 3–4 tags. At 8 tags, a 64-bit filter exhibits a false positive rate exceeding
$15%$ . -
Precision: Expanding the filter to 128 bits (16 bytes, spanning
synaptic_tags_loandsynaptic_tags_hi) slashes the false positive probability by approximately 60× across typical tag sets ($k=4$ hash functions). -
Sub-Microsecond Screening: During candidate retrieval, thousands of memories can be pre-screened using two 64-bit CPU register bitwise
ANDinstructions. Non-matching engrams are discarded immediately without loading dense vector embeddings into SIMD registers.
Mutable telemetry is isolated in an independent 96-byte record within partition bundles (RegionId.STRENGTH), aligned to 32 bytes to ensure atomic word updates across concurrent virtual threads:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|flags(1B)|prof(1B)|val(1B)|pad0 | agent_recall_count (4B) | 0x00
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| spector_recall_cnt (4B) | effective_importance (4B) | 0x08
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| storage_strength (4B) | last_agent_hash (4B) | 0x10
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ last_auto_ltp (8B) + 0x18
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ last_recall_ts (8B) + 0x20
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ act_r_ring_buffer (8 × int32, 32B) + 0x28
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| reconsolidation_delta (8B) | 0x48
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| _reserved (16B) | 0x50
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
Storage Strength
$S(t)$ (storage_strength, 4B float32): Models the Bjork & Bjork Two-Factor Memory Model. While retrieval strength decays rapidly, storage strength accumulates monotonically upon repeated, spaced recalls, slowing subsequent decay rates ($S(t) \in [1.0, 5.0]$ ). -
ACT-R Recall Timestamp Ring Buffer (
act_r_ring_buffer, 32B): Stores the 8 most recent recall timestamps (expressed in relative delta seconds). Used by the scoring engine to evaluate the ACT-R power-law retention equation:$$A_i = \ln \left( \sum_{k=1}^{n} t_k^{-d} \right)$$ where$t_k$ represents the elapsed time since the$k$ -th retrieval and$d$ is the decay exponent. -
Dual Recall Counters:
-
agent_recall_count: Incremented when an external agent or user explicitly reinforces an engram (client.memory.reinforce(...)). -
spector_recall_cnt: Incremented passively by the system when the engram is retrieved as relevant context during a query, subject to cooldown timers to prevent runaway reinforcement loops.
-
The Insular Sub-Header (InsularLayout, identifier 0x494E534C / 'INSL') governs the storage of the agent's dynamic self-model within runtime.bundle (RegionId.INSULA). It sits immediately after the standard 64-byte RegionPreamble (starting at byte offset 64), establishing a 96-byte header boundary before the variable-length JSON self-model begins.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| version (4B) | data_length (4B) | 0x40 (rel 0x00)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ updated_at (8B) + 0x48 (rel 0x08)
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| checksum (4B) | flags (4B) | 0x50 (rel 0x10)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| reserved (8B) | 0x58 (rel 0x18)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ Variable-Length UTF-8 JSON Payload + 0x60 (rel 0x20)
| |
| Offset | Size | Field Name | Type | Description |
|---|---|---|---|---|
0x00 |
4B | version |
int32 | Monotonically increasing version counter incremented on every mutation or clear. |
0x04 |
4B | data_length |
int32 | Byte length of the active UTF-8 JSON self-model payload. |
0x08 |
8B | updated_at |
int64 | Epoch milliseconds timestamp when the self-model was last written. |
0x10 |
4B | checksum |
int32 | CRC-32C checksum computed over the UTF-8 JSON payload bytes. |
0x14 |
4B | flags |
int32 | Presence indicator: 0 = FLAG_EMPTY (no model), 1 = FLAG_PRESENT. |
0x18 |
8B | _reserved |
bytes | Zero-padded reserved block for future self-model telemetry fields. |
0x20 |
Var | payload |
bytes | Raw UTF-8 JSON payload containing the active self-model and dynamic salience markers. |
-
Hardware CRC-32C Integrity: Every write calculates a castagnoli CRC-32C checksum over the JSON payload. On read, the checksum is verified before decoding to guarantee corruption-free state recovery.
-
Atomic Region Synchronization: Upon updating the insular sub-header, the enclosing
RegionPreambleitem count and timestamp are atomically refreshed, and the underlying memory-mapped file slice is flushed (force()). -
Capacity Guardrails: Payloads larger than the allocated region capacity (typically 512 KB in standard namespaces) are rejected immediately to protect contiguous bundle alignment.
Every memory region has a dedicated documentation page with full wire diagrams, field specifications, and access patterns. See the Region Reference for the complete index.
| Region | ID | Bundle | Layout Class | Shape | Page |
|---|---|---|---|---|---|
| Semantic | 0 | partition | SemanticLayout |
Record | [[→ |
| Episodic | 1 | partition | EpisodicLayout |
Record | [[→ |
| Procedural | 2 | partition | ProceduralLayout |
Record | [[→ |
| Text | 3 | partition | TextBlobLayout |
Append | [[→ |
| Strength | 4 | partition | StrengthLayout |
Record | [[→ |
| Working | 10 | runtime | WorkingLayout |
Record | [[→ |
| CoActivation | 11 | runtime | CoActivationLayout |
HashTable | [[→ |
| Index MIDX | 12 | runtime | IndexEntryLayout |
Record | [[→ |
| Index IDPL | 13 | runtime | IdBlobLayout |
Append | [[→ |
| Hebbian | 14 | runtime | HebbianLayout |
Graph | [[→ |
| Temporal Chain | 15 | runtime | TemporalLayout |
Chain | [[→ |
| Temporal Facts | 16 | runtime | TemporalFactLayout |
Append | [[→ |
| Entity Directory | 17 | runtime | EntityDirectoryLayout |
Record | [[→ |
| Entity Names | 18 | runtime | RegistryLayout |
Registry | [[→ |
| HyperGraph | 19 | runtime | HyperEntityLayout |
Graph | [[→ |
| Entity Types | 20 | runtime | RegistryLayout |
Registry | [[→ |
| Relation Types | 21 | runtime | RegistryLayout |
Registry | [[→ |
| BM25 | 22 | runtime | — | Append | [[→ |
| Checkpoint | 23 | runtime | — | — | [[→ |
| Insula | 24 | runtime | InsularLayout |
Insular | [[→ |
| Continuity | 25 | runtime | ContinuityLayout |
Record | [[→ |
| Provenance | 26 | runtime | ProvenanceLayout |
Record | [[→ |
| SPLADE | 27 | runtime | — | Append | [[→ |
| Entity Reverse | 28 | runtime | — | — | [[→ |
| Header | 0 | identity | BundleFileLayout |
Bundle | [[→ |
| Soul | 1 | identity | InsularLayout |
Insular | [[→ |
| Salience | 2 | identity | — | Record | [[→ |
| Continuity | 3 | identity | ContinuityLayout |
Record | [[→ |
| Policy | 4 | identity | — | Record | [[→ |
| Org Directory | 5 | identity | — | Record | [[→ |
- 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