LTMi-XT
Layered Topological Memory Indexing. A file format that stores knowledge as single-claim records, indexes them by hashing their own hierarchy, and serves retrieval and fine-tuning from the same artifact.
Each record, a locus, is one self-contained statement with a four-level breadcrumb, a coordinate on a 64-cell lattice derived by hashing the breadcrumb prefix, byte offsets back to its source, a horizon that decays or consolidates, and a confidence score. Because the coordinate is a hash of the hierarchy, related loci cluster without an embedding model, the position can be re-derived and checked by anyone holding the file, and retrieval needs no GPU. The page below runs the whole pipeline in your browser on text you paste.
What the format is for
Retrieval-augmented systems must commit to a representation of retrieved knowledge. Embedding chunks and retrieving by cosine similarity fragments claims at chunk boundaries, gates retrieval behind a learned similarity function, and leaves the system with no explicit handle on atomicity, provenance or temporal validity. Atomic-fact decomposition fixes the first problem and not the others. LTMi-XT is the format SOPHIA XT converged on after building several retrieval pipelines that needed to support both breadcrumb-anchored retrieval at inference time and anchor-token-masked fine-tuning from the same data.
The format prioritises atomicity, reproducible indexing with coordinates derived from content, provenance by byte offset, an explicit short-term and long-term horizon with consolidation rules, JSONL portability with no service dependency, and dual consumption: the same bundle serves retrieval and training rows.
The record
A bundle is a manifest and an array of loci, serialised as one JSON document or as JSONL with the manifest on the first line. The file extension is .ltmi, the recommended MIME type application/x-ltmi+json, and the JSONL form may use .ltmi.jsonl. Identifiers are content-addressed: a locus id is the BLAKE2b-128 digest of its canonical JSON, a source id the digest of the source bytes, a corpus id the digest of the sorted locus ids.
| Field | Value |
|---|---|
| v | "ltmi/0.1" |
| kind | "manifest" |
| corpus_id | "c-<blake2b-128-hex>" |
| loci | <integer count> |
| lattice | { "dim": 64, "shape": "cube" } |
| created | <ISO-8601 datetime> |
| sources | ["s-<source-id>", ...] |
| producer | <tool name + version> |
| crystallizer_model | <model identifier> |
| topologizer_model | <model identifier> |
| Field | Required | Type | Description |
|---|---|---|---|
| id | Yes | string | a- prefix + BLAKE2b-128 hex of canonical locus JSON |
| breadcrumb | Yes | array | Exactly 4 strings: topic > subtopic > concept > claim |
| lattice | Yes | array | 3 integers in [0, 63], derived from breadcrumb prefix hashes |
| statement | Yes | string | The atomic claim as a complete natural-language sentence |
| kind | Yes | enum | fact, rule, or definition |
| confidence | Yes | float | Crystallizer's confidence in the claim's faithfulness to source |
| horizon | Yes | enum | short (decaying), long (consolidated), or archived |
| decay | Yes | float | Current decay weight; reset to 1.0 on creation, multiplied per access pattern |
| source.id | Yes | string | Source document identifier (s- prefix) |
| source.offset | Yes | array | [byte_start, byte_end] in source document |
| first_seen | Yes | datetime | When the locus first entered the bundle |
| last_referenced | Yes | datetime | When the locus was last accessed by retrieval |
| references | Yes | integer | Count of retrievals; threshold-triggers horizon promotion |
A coordinate you can recompute
The lattice field is a pure function of the breadcrumb. Each axis hashes one more level of the path, so loci sharing k breadcrumb levels share k coordinates by construction.
p_k = \mathrm{lower}\big(b_1 / b_2 / \cdots / b_k\big), \qquad k \in \{1, 2, 3\}c_k = \mathrm{int}_{\mathrm{BE}}\!\Big(\mathrm{BLAKE2b}_{16}(p_k)[0{:}4]\Big) \bmod 64\mathrm{lattice} = (c_1, c_2, c_3) \in [0, 63]^3The x axis depends on the topic alone, y on topic and subtopic, z on topic, subtopic and concept. The claim level is not part of the cell address, so several claims about one concept share a cell.
def lattice_for(breadcrumb: list[str]) -> tuple[int, int, int]:
assert len(breadcrumb) == 4
coords = []
for axis_idx, prefix_levels in [(0, 1), (1, 2), (2, 3)]:
prefix = "/".join(breadcrumb[:prefix_levels]).lower()
h = blake2b(prefix.encode("utf-8"), digest_size=16).digest()
coord = int.from_bytes(h[:4], "big") % 64
coords.append(coord)
return tuple(coords)Hash-derived coordinates are a third option beside vector embeddings and graph edges: embedding-free positioning that respects hierarchical structure. The same input gives the same position, always; nothing learned sits in the retrieval path; a position can be re-derived from the data and verified; neighbourhoods compose through Chebyshev distance without recomputing similarities. The trade-off is semantic flexibility. Two loci about one idea under different breadcrumbs land apart, so for retrieval that needs cross-hierarchy similarity the lattice acts as a pre-filter ahead of a finer semantic step.
The pipeline, in this tab
Three figures share one bundle. The first crystallises what you paste and prints the record beside the specification's schema. The second places every locus on the lattice with the derivation shown for the selected one. The third runs a query through the reference retriever's lattice walk with its shipped weights. The BLAKE2b in use is a plain TypeScript implementation checked against the standard test vectors, because browsers do not ship the hash.
{"v":"ltmi/0.1","kind":"manifest","corpus_id":"c-14f47293215e5edc8b40a61a06af7025","loci":12,"lattice":{"dim":64,"shape":"cube"},"created":"2026-09-14T00:00:00Z","sources":["s-ed8a75a5ef78f423773b328e1480fd56"],"producer":"sophiaxt.com/research/ltmi-xt browser demo","crystallizer_model":"rule: sentence splitter (no model call)","topologizer_model":"rule: heading walker (no model call)"}
{"id":"a-976ea82c69a73b5853cd757296bd4b82","breadcrumb":["LTMi-XT Format","Loci","Locus","locus single self-contained"],"lattice":[31,51,36],"statement":"A locus is a single self-contained factual claim written as one complete sentence.","kind":"definition","confidence":1,"horizon":"short","decay":1,"source":{"id":"s-ed8a75a5ef78f423773b328e1480fd56","offset":[21,103]},"first_seen":"2026-09-14T00:00:00Z","last_referenced":"2026-09-14T00:00:00Z","references":0}{
"id": "a-<blake2b-128-hex>",
"breadcrumb": ["topic", "subtopic", "concept", "claim"],
"lattice": [x, y, z],
"statement": "<atomic factual claim as natural language>",
"kind": "fact" | "rule" | "definition",
"confidence": <float in [0, 1]>,
"horizon": "short" | "long" | "archived",
"decay": <float in [0, 1]>,
"source": { "id": "s-<source-id>", "offset": [<byte-start>, <byte-end>] },
"first_seen": "<ISO-8601 datetime>",
"last_referenced": "<ISO-8601 datetime>",
"references": <integer count>
}- 01 LTMi-XT Format > Lattice > Lattice d=0 · depth 3 0.925The lattice is a cube of 64 cells on each axis, which gives 262144 cells in total.
- 02 LTMi-XT Format > Lattice > Chebyshev d=2 · depth 2 0.650Retrieval walks a Chebyshev neighbourhood of radius 4 around the query cell before ranking.
Facts go stale on a schedule
\mathrm{decay}(t) = \mathrm{decay}_0 \cdot \exp\!\Big(-\ln 2 \cdot \frac{t - t_{\mathrm{last\ ref}}}{\text{half\_life}}\Big)Reference half-lives: 1 hour for the short horizon, 30 days for the long horizon. Both are implementation-configurable.
| Event | Rule |
|---|---|
| Retrieval hit | decay ×= 1.05, capped at 1.0 |
| Retrieval miss | decay ×= 0.98 |
| Promotion, short to long | when references ≥ 3 (configurable) |
| Demotion, long to archived | when now − last_referenced > 90 days (configurable) |
| Archived | excluded from default retrieval, retrievable by explicit id, retained for provenance |
Explicit horizon and decay give a retrieval layer a principled way to down-weight stale claims without deleting them, promote claims that keep being referenced to a longer half-life, and retire claims while keeping the audit trail. The model is drawn from accounts of episodic and semantic memory consolidation; the claim made for it is mechanical usefulness for agentic retrieval, not biological plausibility.
Why these choices
Three levels could not separate closely related claims; five produced very thin cell populations. Four was the empirical sweet spot in internal benchmarks: domain, subdomain, concept, and the most specific identifier of the claim.
Any consumer can re-read the source range to check faithfulness, highlight the span in a user interface, detect that a source was edited because the offset no longer matches, and satisfy attribution requirements that need auditable sources.
The same bundle loads into a retrieval system to serve queries and into a training pipeline as question and answer pairs templated from the breadcrumb, which is how anchor-token-masked fine-tuning gets its anchors. That removes a class of conversion plumbing and keeps training and retrieval data in lockstep.
FActScore and AFEV decompose text into atomic facts for verification; LTMi-XT adds indexing and a temporal model and is format-compatible with AFEV. Agent memory products solve overlapping problems with internal formats. GraphRAG could take loci as graph nodes. Against standard vector RAG the format trades semantic flexibility for reproducibility and provenance.
What the committed benchmarks show
The repository ships its benchmark corpora, queries, raw logs and the scripts that produced every number below. Three corpora of 783, 1,056 and 1,059 bytes yield 10, 23 and 15 loci; the operations memo spans eight top-level topics and the topologiser keeps them apart while holding every architecture sentence under one topic.
| Method | Top-1 hit | Top-3 hit | Average latency |
|---|---|---|---|
| LTMi-XT, live, Mercury 2 provider | 12 / 15 = 80.0% (13 / 15 = 86.7% corrected) | 12 / 15 = 80.0% | 1,202 ms |
| BM25 (Okapi) | 9 / 15 = 60.0% | 10 / 15 = 66.7% | 0.05 ms |
| Keyword overlap | 9 / 15 = 60.0% | 10 / 15 = 66.7% | 0.18 ms |
| Operation | Result |
|---|---|
| Lattice coordinate stability, locus id stability, canonical JSON sort, JSONL round trip | 10,000 trials each, 100% stable |
| latticeCoord(breadcrumb) | 17.0 µs per call, single-thread Node 22, pure JavaScript |
| deriveLocusId(breadcrumb, statement, source) | 14.8 µs |
| canonicalJson(object) | 4.2 µs |
| chebyshev(a, b) | 0.34 µs |
| 10,000 random breadcrumbs from about 100 topics × 100 subtopics × 100 concepts | 200 distinct cells occupied of 262,144, by design: one cell per distinct topic, subtopic, concept tuple |
| Model | Ordering | K = 3 | K = 10 | K = 30 | K = all | K = 3 to 30 |
|---|---|---|---|---|---|---|
| Phi-3-mini 3.8B, 4K context | relevance | 10/15 | 9/15 | 11/15 | 9/15 | +6.7 pp |
| chrono | 10/15 | 12/15 | 10/15 | 9/15 | +0.0 pp | |
| topo | 10/15 | 11/15 | 10/15 | 9/15 | +0.0 pp | |
| Gemma 4 E2B 4.6B, 128K context | relevance | 9/15 | 11/15 | 13/15 | 12/15 | +26.7 pp |
| chrono | 9/15 | 11/15 | 13/15 | 12/15 | +26.7 pp | |
| topo | 10/15 | 12/15 | 12/15 | 11/15 | +13.3 pp |
| Mode | Strict grader | Lenient grader | Average latency | Anchor preserved |
|---|---|---|---|---|
| Baseline, broken model alone | 0 / 15 | 0 / 15 = 0.0% | 1,387 ms | n/a |
| Baseline + LTMi-XT forced anchors | 2 / 15 | 9 / 15 = 60.0% | 1,307 ms | 100.0% |
| LoRA on LTMi-XT data, no anchors | 0 / 15 | 0 / 15 = 0.0% | 2,309 ms | n/a |
| LoRA + LTMi-XT forced anchors | 2 / 15 | 9 / 15 = 60.0% | 2,133 ms | 100.0% |
What ships
The TypeScript reference implementation is released under Apache 2.0 with a command-line tool for crystallisation, indexing, retrieval and training export, Python and TypeScript SDKs, an HTTP server with retrieval endpoints, a web interface for inspecting bundles, and the benchmark scripts. This site runs the same implementation behind its LTMi-XT routes, and the hosted tool crystallises with a model of your choice.
npm install @sophiaxt/ltmi-xt sophiaxt-cli crystallize --input ./docs/ --output ./bundle.ltmi sophiaxt-cli retrieve --bundle ./bundle.ltmi --query "What is X?"
git clone https://github.com/Chorozion/LTMi-XT.git cd LTMi-XT && npm install && npm run build node examples/benchmarks/micro_bench.mjs # 10,000-trial invariant suite python3 examples/benchmarks/run_bench.py # live API, about 5 minutes python3 examples/benchmarks/compare.py # BM25 and keyword baselines
Stability
This is LTMi-XT v0.1. Backward-incompatible changes increment the major or minor version; forward-compatible additions of optional fields may occur within a minor version. The manifest's v field carries the format version and consumers should reject bundles with an unknown major version. The specification document is CC BY 4.0; the reference implementation is Apache 2.0.
@techreport{garren2026ltmixt,
author = {Garren, Thomas},
title = {LTMi-XT v0.1: A Retrieval Format with Hash-Derived
Topological Indexing},
institution = {SOPHIA XT LLC},
year = {2026},
month = {May},
url = {https://sophiaxt.com/research/ltmi-xt}
}