SOPHIA XT
Research · retrieval format · specification v0.1, May 2026 · Apache 2.0 code · CC BY 4.0 specification

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.

lattice
64³
262,144 cells, coordinate in [0, 63]³
coordinate rule
BLAKE2b-128
of each lowercased breadcrumb prefix, no learned parameter
record
12 fields
all required; JSON or JSONL, .ltmi
top-1 retrieval
13 / 15
grader-corrected, 15 queries over three corpora
Abstract

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.

Format · section 2

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.

Specification 2.2
Manifest fields
FieldValue
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>
The corpus_id is the BLAKE2b-128 of the canonical concatenated source content. A bundle may be one JSON document or JSONL with the manifest on the first line; the two are equivalent at the data level.
Specification 2.3
Locus fields
FieldRequiredTypeDescription
idYesstringa- prefix + BLAKE2b-128 hex of canonical locus JSON
breadcrumbYesarrayExactly 4 strings: topic > subtopic > concept > claim
latticeYesarray3 integers in [0, 63], derived from breadcrumb prefix hashes
statementYesstringThe atomic claim as a complete natural-language sentence
kindYesenumfact, rule, or definition
confidenceYesfloatCrystallizer's confidence in the claim's faithfulness to source
horizonYesenumshort (decaying), long (consolidated), or archived
decayYesfloatCurrent decay weight; reset to 1.0 on creation, multiplied per access pattern
source.idYesstringSource document identifier (s- prefix)
source.offsetYesarray[byte_start, byte_end] in source document
first_seenYesdatetimeWhen the locus first entered the bundle
last_referencedYesdatetimeWhen the locus was last accessed by retrieval
referencesYesintegerCount of retrievals; threshold-triggers horizon promotion
Lattice · section 2.4

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.

Coordinate rule
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]^3

The 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.

Specification pseudocodePython
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.

Demo

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.

Figure L1
Crystallised document
loci
bundle.ltmi · manifest line, then the selected locusJSONL
{"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}
Specification section 2.3 · locus schemaspec
{
  "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>
}
loci
12
cells used
11
sections
3
source bytes
1,081
topic
LTMi-XT Format
source id
s-ed8a75a5ef78f423773b328e1480fd56
corpus id
c-14f47293215e5edc8b40a61a06af7025
Paste any text. Headings become the subtopic level, sentences become loci, and the topic is the first heading. The reference implementation makes the same split with a model call and resolves pronouns; this page splits by rule so it runs without one, and lowers the confidence of a statement that starts with an unresolved pronoun. Byte offsets are computed on the UTF-8 encoding of the source, as the format requires. Select a locus to follow it through the next two figures.
Figure L2
The lattice index, 64 cells to a side
loci placed
12
cells occupied
11
cells in cube
262,144
in query radius
2
selected locus derivation · spec 2.4
x · blake2b("ltmi-xt format", 16)
28b32a9f894176519caf99e87a9b73b0
bytes 0..4 big-endian mod 64 = 31
y · blake2b("ltmi-xt format/loci", 16)
bff18cf3fea6b8f7a0a8651a2a930c7e
bytes 0..4 big-endian mod 64 = 51
z · blake2b("ltmi-xt format/loci/locus", 16)
6421766492032dec075b8e8b112a9db4
bytes 0..4 big-endian mod 64 = 36
Every locus sits at the cell its breadcrumb hashes to. The x axis depends on the topic alone, so a single document occupies one x plane; y adds the subtopic, so each section is a line in that plane; z adds the concept, so claims about one concept share a cell. Related loci cluster by construction, with no embedding model and no learned parameter. The amber cube is the Chebyshev neighbourhood of radius 4 the retriever searches; loci outside it are dimmed. The selected locus is ringed.
Figure L3
Retrieval walk
  1. 01 LTMi-XT Format > Lattice > Lattice d=0 · depth 3 0.925
    The lattice is a cube of 64 cells on each axis, which gives 262144 cells in total.
  2. 02 LTMi-XT Format > Lattice > Chebyshev d=2 · depth 2 0.650
    Retrieval walks a Chebyshev neighbourhood of radius 4 around the query cell before ranking.
lattice proximity shared breadcrumb depth confidence decay
path
lattice
query cell
[31,47,31]
candidates
2
decay factor
1.000
query breadcrumb
LTMi-XT Format > Lattice > Lattice
query tokens
many · cells · lattice
The retriever derives a breadcrumb for the query, hashes it to a cell, keeps only loci within Chebyshev radius 4, and ranks them by 0.4 × lattice proximity + 0.2 × confidence + 0.1 × decay + 0.3 × shared breadcrumb depth, the weights the reference retriever ships with. The reference implementation asks the model for the query breadcrumb; this page reads it off the locus whose words and path overlap the query most. When no locus overlaps at all the retriever falls back to keyword scoring, exactly as the reference does. Move the slider to age every short-horizon locus and watch the decay term shrink. The half-life is 7 days, the value the reference chronologizer uses; long-horizon loci do not decay at all.
Horizon and decay · section 2.5

Facts go stale on a schedule

Continuous-time exponential decay
\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.

EventRule
Retrieval hitdecay ×= 1.05, capped at 1.0
Retrieval missdecay ×= 0.98
Promotion, short to longwhen references ≥ 3 (configurable)
Demotion, long to archivedwhen now − last_referenced > 90 days (configurable)
Archivedexcluded 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.

Design · section 3

Why these choices

Four breadcrumb levels

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.

Byte-offset provenance

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.

One artifact, two consumers

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.

Where it sits

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.

Measurements · reference repository

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.

Figure L4
Top-1 hit rate against two lexical baselines
03691215queries answered at rank one, of 15LTMi-XT12/15 (13 corrected) · 1,202 msBM25 (Okapi)9/15 · 0.05 msKeyword overlap9/15 · 0.18 ms
Fifteen natural-language questions over three hand-written corpora, each graded against an expected keyword set that must appear in the top result. LTMi-XT with a model-derived query breadcrumb hits 12 of 15 at rank one, 13 of 15 once a grader artefact is removed, where the query asked for "KV" and the locus said "key-value". BM25 and plain keyword overlap both hit 9 of 15. The lexical baselines answer in a fraction of a millisecond; the LTMi-XT figure of 1,202 ms is the model round-trip that derives the breadcrumb.
benchmarks-v0.1.md · sections 2 and 5
Retrieval and latency
MethodTop-1 hitTop-3 hitAverage latency
LTMi-XT, live, Mercury 2 provider12 / 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 overlap9 / 15 = 60.0%10 / 15 = 66.7%0.18 ms
Median wall-clock over the live API with the Mercury 2 provider: 4,370 ms for crystallize on 700 to 1,100 character inputs (n = 3), 1,228 ms for a single retrieve at k = 6 (n = 15). Both floors are provider latency; the lattice walk and the keyword fallback run in microseconds. Both real misses share one cause: model-side breadcrumb derivation silently fails on short queries and the keyword fallback then misses loci whose wording differs from the question.
benchmarks-v0.1.md · section 3
Format invariants and per-call cost
OperationResult
Lattice coordinate stability, locus id stability, canonical JSON sort, JSONL round trip10,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 concepts200 distinct cells occupied of 262,144, by design: one cell per distinct topic, subtopic, concept tuple
Figure L5
Ordering the same loci by breadcrumb against context stuffing
03691215K = 3K = 10K = 30K = all 48hits of 15loci in the prompt · TinyLlama 1.1B, 2K contextrelevance orderchronological ordertopological order
Same 15 queries and the same 48-locus pool, with K loci placed in the prompt in three orders: by retrieval score, by source byte order, and by breadcrumb hierarchy. On the smallest model the topological order holds 11 of 15 from K = 3 to K = 30 while relevance order falls from 12 to 8 and chronological from 11 to 9. At K = 48 every order reaches 0 of 15 because the 2K context saturates. On larger models the orderings converge; the effect belongs to small context windows.
stress_report.md · other models
Hits of 15 by ordering and K, larger models
ModelOrderingK = 3K = 10K = 30K = allK = 3 to 30
Phi-3-mini 3.8B, 4K contextrelevance10/159/1511/159/15+6.7 pp
chrono10/1512/1510/159/15+0.0 pp
topo10/1511/1510/159/15+0.0 pp
Gemma 4 E2B 4.6B, 128K contextrelevance9/1511/1513/1512/15+26.7 pp
chrono9/1511/1513/1512/15+26.7 pp
topo10/1512/1512/1511/15+13.3 pp
TinyLlama, the model in the chart: relevance 12, 10, 8, 0; chronological 11, 11, 9, 0; topological 11, 12, 11, 0 at K = 3, 10, 30, 48. With enough capacity the ordering stops mattering; on the 128K-context model relevance and chronological orders edge out topological by one query at K = 30.
Cassandra T1 repository · eval/ltmi-xt-rescue.md
A 1.3B model that outputs noise, given anchors
ModeStrict graderLenient graderAverage latencyAnchor preserved
Baseline, broken model alone0 / 150 / 15 = 0.0%1,387 msn/a
Baseline + LTMi-XT forced anchors2 / 159 / 15 = 60.0%1,307 ms100.0%
LoRA on LTMi-XT data, no anchors0 / 150 / 15 = 0.0%2,309 msn/a
LoRA + LTMi-XT forced anchors2 / 159 / 15 = 60.0%2,133 ms100.0%
Same three corpora and 15 queries as the benchmark above, on an undertrained masked-diffusion checkpoint whose unconditional output is random tokens. Locking the retrieved locus into the diffusion mask takes the lenient grader from 0 of 15 to 9 of 15 with every locked token surviving to the output; the six remaining misses are retrieval picking the wrong locus, not generation. The LoRA on 144 templated pairs, 5.96M trainable parameters, trained in 2.4 minutes at a 2.8 GB memory peak on one consumer GPU; it shifts unforced output toward topical English without passing the keyword grader.
Scope of the measurements
Fifteen queries over three corpora under 1.1 KB, one provider exercised, no adversarial or multi-hop queries, no head-to-head against an embedding index. The specification's own reading of the baselines is that lattice retrieval matches or modestly exceeds keyword baselines on queries that carry hierarchical terms and that BM25 wins on open-ended free text; the format's reproducibility and provenance properties are not what a hit-rate benchmark measures.
Reference implementation · section 4

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.

Quick startshell
npm install @sophiaxt/ltmi-xt
sophiaxt-cli crystallize --input ./docs/ --output ./bundle.ltmi
sophiaxt-cli retrieve --bundle ./bundle.ltmi --query "What is X?"
Reproduce the benchmarksshell
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
Versioning and license · sections 6 and 8

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.

CiteBibTeX
@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}
}
Related pages
The format's largest empirical contribution so far is as training substrate: the breadcrumb and statement structure is what lets anchor-token masking produce its out-of-distribution advantage. The memory lane of the Constellation router reads and writes loci.