SOPHIA XT
Research · new architecture · technical report, 19 September 2026

XE5

A language model you can teach without breaking.

We built it from scratch. 147.5 million parameters, no pretrained base underneath, trained on one consumer GPU. It solves a problem the large labs spend real money mitigating: you can teach it something new and it provably cannot damage what it already knew.

Provably is a measurement here, not a turn of phrase. Attaching a new specialist to a running model moves its output by 5.96×10⁻⁷. Attaching the third ring moves it by exactly zero. Retracting a fact returns the model to baseline at exactly zero as well.

The name

XE5 expands to eXtended Episodic Sophia. Episodic because the memory holds what one user told it, written at runtime rather than learned at training time. Extended because that memory is part of the network rather than a retrieval step beside it.

Built by

Thomas Garren and Sophia, SOPHIA XT LLC. Architecture, training method and corpus design by Thomas Garren.

parameters, trained from scratch
147.5 M
No pretrained base under it. Counted off the evaluated checkpoint at 35 specialists, not estimated from a config.
Measured
specialists weighted, every token
35 of 35
Summed, not selected between. No top-k, no gating network, no load-balancing loss anywhere.
Measured
output change when a specialist attaches
5.96×10⁻⁷
Teaching it something new begins from a measured no-op on everything already there.
Measured
output change when the third ring attaches
0.000×10⁰
Exact, not small. A zero-initialised residual write contributes nothing by construction.
Measured
output change when a fact is forgotten
0.000×10⁰
Retraction returns the model to baseline exactly, and the symbolic path survives it.
Measured
CPU decode, held at 241 tokens
47.2 tok/s
The uncached path falls to 8.2 at the same length. There is no datacentre in this loop.
Measured
01 · The console

The model running, with its internals open

Five turns captured from the console. The conversation is on the left. On the right are the live composition weights over the specialist bank, the beam descent through memory that produced them, and what the turn cost.

Watch the leader change. A lookup puts 0.7394 on web_search. A closing pleasantry puts 0.8505 on no_tool. A calendar removal puts 0.6687 on own_business. Same weights on disk, a different mixture each time, and the whole vector is on screen rather than one selected name. Open any capture at full size and read the numbers off it.

Captured live Captures from the running console, not renderings of it.
A tool lookup web_search 0.7394
The console on a tool lookup. The composition panel lists web_search at 0.7394 ahead of tool_error at 0.1122 and seven more specialists, the reply pane shows a well-formed web_search call with the query argument, and the descent panel prints the route Travel / cars with a runner-up branch beside it.
utterance Look up the bin collection day.

The composer puts 0.7394 on web_search and the next eight specialists carry the rest, with 99% of the mass landing in twelve of the thirty-one. The model emits a well-formed call, the harness recovers the argument by pattern rather than trusting what was generated, and hands it back in its own panel. The descent prints the route the weights were composed under, with the runner-up branch kept alive at every level.

0.7394
web_search
9 of 31
above a 1% cut
77
tokens
3.2
tokens / s
Writing a fact no_tool 0.5090
The console on a memory-write utterance. The composition panel lists no_tool at 0.5090, blunt_answer at 0.2026 and seven more specialists above the cut, and the descent panel runs four levels to Travel / engine / route.
utterance Remember my commute is cycle.

What the panel shows is the whole weight vector at once: nine specialists above a 1% cut, 99% of the mass in fifteen, and every one of them carrying a real number rather than a selection. The descent runs four levels deep and keeps a second branch alive at each of them.

0.5090
no_tool
15
specialists hold 99%
1.42 s
for the turn
A calendar action own_business 0.6687
The console on a calendar action. own_business leads the composition at 0.6687 with no_tool at 0.1583 and four more above the cut, and the beam lands on Money at the first level before settling into Travel / engine / route.
utterance Take the dentist off the calendar, cheers.

A different utterance moves the mixture to a different shape: own_business takes 0.6687 where the previous turn put half its weight on no_tool. Six specialists sit above the cut, the beam takes Money at the first level, and the reply comes back in one word.

0.6687
own_business
6 of 31
above the cut
3.8
tokens / s
Declining to act no_tool 0.8505
The console on a closing pleasantry. no_tool takes 0.8505, the sharpest single weight in the set, with no_caveat second at 0.0429, and the descent runs three levels from Home.
utterance Thanks, that's all.

A closing pleasantry puts 0.8505 on no_tool, the sharpest single weight in the set, with no_caveat second at 0.0429. Nothing is selected and nothing is zeroed. The mixture simply concentrates, which is what a dense composition does when the evidence is one-sided.

0.8505
no_tool
0.0429
no_caveat, second
4.7
tokens / s
The same turn, light theme identical panels
The same closing turn rendered in the console's light theme, with identical composition, descent and cost panels.
utterance Thanks, that's all.

The console ships both themes and the three panels read identically in each. It is here because the numbers are the product rather than the chrome, and because a reader should be able to check one capture against the other.

0.8505
no_tool, unchanged
6
tokens
1.27 s
for the turn

The header strip in each capture names the checkpoint that produced it, the predecessor build at 130.6 M with 31 specialists, a 512-token window and a store of 6,752 nodes. XE5 is the same architecture carried forward: rotary positions in place of that build's learned position table, 147.5 M parameters across 35 specialists, a 1,024-token window and 4,013 memory nodes after curation.

02 · The mechanism

Why a gate cannot do this at any scale

A mixture of experts computes w = gate(x). The weights are a function of the input alone, so the same sentence routes the same way for ever, and a router that has never read your memory decides which expert answers you.

XE5 computes w = compose(x, m). Here m is where a beam descent through a tree of stored facts terminates. Fix the input and the weights still move, because m moves as the memory changes. Scale does not give a gate that property, because the information is not in the thing a gate reads.

Figure 01 Illustrative
One sentence, two memory states
A gate cannot move when only the memory changes; the composer doesINPUT, FIXED“how many do I have?”MEMORY, WRITTEN AT RUNTIME{ cats }w = gate(x)MIXTURE OF EXPERTSS₀0S₁1S₂0S₃0identical: the input did not changew = compose(x, m)COMPOSITION, THIS WORKS₀.22S₁.48S₂.17S₃.13every specialist carries weightm is where a beam descent through the memory terminates. Fixing the input does not fix it.
Memory holds
The same sentence asked twice. A gate must produce identical weights in both rows, so anything that moves on the right is information a gate does not have. The values illustrate the mechanism; the measured form of the test is validation loss with the memory term live at 0.4112 against 0.4201 ablated.

Where m comes from is a descent, and the descent prints. Each level scores the frontier against node keys, keeps the best two and expands their children, so a wrong first hop is recoverable. The region of memory an answer was composed under can be read straight off the screen.

Figure 02 Measured
One beam descent, at width two
Beam descent at width two, with the runner-up kept aliveLEVEL 0LEVEL 1LEVEL 2FRONTIER⟨root⟩Travel.31Home.82Person.64Money.22boiler.40bin.91diet.58shoe.19bin / daydiet / notem = mean of the surviving keys, weighted by route confidenceprintable path: Home / bin / dayfilled = beam winner · pale = runner-up kept alive · outline = pruned · 14 nodes visited against 41 for a flat scan
Home scores 0.82 and Person 0.64, so both survive; Travel and Money are pruned. The path is what conditions the mixture, and it is also the audit trail. This is the panel the console prints on every turn.

Thirty-one specialists are summed rather than selected between, so every one of them carries a weight on every token. There is no top-k anywhere in the model and no load-balancing loss, because nothing in it is learning to route.

Figure 03 Measured
The data path
Trunk, memory descent, composer, thirty-one specialists, tied headtokensx ∈ ℕ^(B×T)Trunk L6 blocks, d = 384rotary positions17.1 M, then frozenhHierarchical memoryderived keys, never trainedbeam descent, width 2route weights by confidenceprints as Home / bin / daymComposerw = softmax( Wx · LN(h) + Wm · m )Wm zero-initialisedunder 0.03 M parametersw31 specialists2 blocks each, 3.55 MS₀blunt_answerS₁calendar_add⋮behaviour axis, 19S₁₈web_searchS₁₉know:Home⋮topic axis, 12S₃₀know:HealthΣheadtied Wᵀlogitssolid = activations · dashed = the memory term · every specialist is scaled and summed, none is zeroed
Hidden states do three jobs: they query the memory, they drive the composer, and they feed every specialist. The dashed edges carry the memory term and are the only structural difference from a routed mixture of experts.
03 · Growth

Add to it and nothing already there moves

Catastrophic forgetting is normally fought with regularisation: penalise the weights that mattered, replay the old data, hope the penalty was tuned right. Here the problem does not arise. Only the new specialist carries a gradient, so an update has no path by which to reach an existing capability.

The model grows in four places and each one starts from a measured no-op. Two of the four are exact zeros rather than small numbers, because a pre-norm block whose output projections are zero is algebraically the identity.

A · Attach a specialist
3.55 M parameters, composer row zeroed, bias −12
5.96×10⁻⁷ Δ logits, measured

A new capability can be attached to a running system and watched doing nothing. Its softmax weight is about 10⁻⁵ until one composer row, its own, is unfrozen under a gradient mask that zeroes every other row.

earns weight at promotion
B · Deepen one in place
+1,772,928 parameters, depth 2 to 3, output projections zeroed
0.000×10⁰ Δ logits, exact

Capacity is a different axis from capability. A pre-norm block whose two output projections are zero is algebraically the identity, so a specialist carrying more traffic than it was sized for takes another block rather than a retrain.

earns weight at stage C
C · Write a fact
+384 parameters per node, behind a −10 logit bias
2.645×10⁻⁵ Δ logits, measured

Two facts create five nodes and add 1,920 parameters, so the model is larger after being written to than before. Zeroing a memory value would not be enough: empty columns still take attention mass out of the softmax, so the bias hides them instead.

earns weight at stage D2
D · The composer's memory term
Wm zero-initialised
0 by construction Δ logits, exact

An untrained model is precisely a router, so any memory-on against memory-off difference in it would be an artifact. An earlier version of the code lost this zero-init to a blanket initialisation call and the first composition demonstration was showing noise.

earns weight at stage E
What the operations cost
5.96×10⁻⁷
Max logit change on attach
0.074 s
Attach a specialist
3.55 M
Specialist parameters
14.2 MB
Specialist on disk, fp32
0.022 s
Load from disk
3.0 ms
Swap weights

Timings are CPU and therefore upper bounds. A specialist ships as a 14.2 MB file, and rolling one back is removing a path from a list rather than retraining, because the previous one is still on disk.

Figure 04. Maximum change in output logits at the moment of addition, taken on the live model. A capability can be attached to a running system and watched doing nothing until its named stage gives it weight.

Facts behave the same way. A fact is written to an address, rewritten at that address, and retracted from it, and only the third of those is exact.

Writing, rewriting and retracting one fact
7.7×10⁻²
Write a fact to an address measured

One projection. No gradient, no optimiser state, and it costs the same at ten facts or ten thousand.

1.17×10⁻¹
Rewrite the same address measured

A wrong fact is replaced where it lives rather than argued down by later evidence.

0.000×10⁰
Forget that address exact

Back to baseline exactly, with the symbolic breadcrumb intact, so the system still knows the fact was recorded.

Curation does not lose facts either. The scorer that maintains the tree collapsed nearly three thousand nodes on the training run and the fact count came out where it went in.

Memory curation, on the training run
6,879 → 4,013
nodes after curation
2,866
collapsed
3,637 → 3,637
facts, before and after
Slot held open Not yet run
Held-out accuracy on the existing capabilities, measured before and after a new specialist is added
The pair belongs here and the run has not been taken yet. Until it is, the case rests on the deltas above, which are measured: a new capability enters at 5.96×10⁻⁷, capacity enters at exactly zero, and a retracted fact returns the model to baseline at exactly zero. Those are the mechanism. The pair will be the outcome.

This is what makes an open ecosystem possible. Anyone can build a specialist for their own domain, attach it, and nothing else in the model moves. Rolling one back is removing a path from a list rather than retraining, because the model it was attached to was never altered.

04 · Guarantees

It cannot fabricate a tool call, and it runs on hardware you own

Typed tool calls
A fabricated call is not caught. It is unwritable.

The tool name comes from a fixed choice. The arguments are masked at decode time to spans the user actually said, so while the model is inside an argument value the only admissible next tokens continue a contiguous span of the prompt.

Hand it “bin day” and it cannot emit “quill_day”, because “quill” is not in front of it. The argument grammar is a span of the input, and it is enforced rather than hoped for.

Where it runs
Decoding is measured on a CPU, not a rented cluster.

With the key/value cache the model holds 47.2 tok/s at 241 tokens of context, where the uncached path has fallen to 8.2. The cache is verified token-identical to the uncached path, because a cache that changes the text is a defect with a speed-up attached.

The batched specialist bank runs 11.5× the sequential loop at k = 31 and agrees with it to 1.55×10⁻⁶.

Decode throughput on CPU against context length Measured
ContextNo cacheKV cacheRatio
20 tokens25.2 tok/s58.4 tok/s2.3×
105 tokens13.5 tok/s43.6 tok/s3.2×
241 tokens8.2 tok/s47.2 tok/s5.8×
The uncached column is the structural point: it collapses as context grows because the work per token grows with the sequence, while the cached column is flat.
05 · What it is for

A model the people who use it can extend

The zero in section 03 is not a nice property. It is a precondition. A model where adding capability can damage what is already there can only be extended by the people who own it, because every addition is a risk to everything else. A model where attaching a specialist moves the rest by exactly zero can accept work from people who have never met each other. That is the difference between a product and a substrate, and it is what the rest of this is for.

Specialists anyone can train
Bring a corpus, get a specialist, attach it.

The bank is 35 specialists over one taxonomy: 23 behavioural shapes and 12 topical branches. Training one is a bounded job against a corpus you supply, not a retraining of the model. We are building that path so it does not require us: your domain, your data, your specialist.

Attachment is the part that is already settled. A new specialist arrives at a measured no-op and earns its weight through training, so nothing anyone else contributed moves when yours lands.

It grows with use
What you tell it becomes part of how it composes.

Memory here is written at runtime, without a gradient step or optimiser state, and it is part of the network rather than a document fetched beside it. Facts are written, rewritten and retracted by address, and retraction returns the model to baseline at exactly zero.

Because the composition weights read that memory, the same question composes differently as the store fills. The model a person has been using for a month is not the model they started with.

The routing is the technology
No learned router, and nothing to game.

The composition target is supervised by a label channel carried in the data itself, so there is no gating network deciding who gets the work, no top-k, and no load-balancing loss anywhere in the model. The decision is legible: every specialist has a weight on every token and the whole vector is printable, which is what the captures in section 01 show.

A contributor can see exactly what their specialist was asked to do and how much of the answer it carried. That is a requirement for an open bank, not a diagnostic nicety.

Next: semantic ordering
Where the work goes from here.

The taxonomy the memory descends and the bank is addressed by is the lever. Semantic ordering is the next step: arranging that space so related capability sits together, so a specialist someone contributes lands where it belongs rather than where a label happened to put it.

That is stated here as the direction of the work rather than as a result. The measurements on this page are what exists today.

06 · Scope

Where it stands

One end-to-end number exists and it is behind. On 178 held-out probes scored by exact tool-choice match under greedy decoding, the report gives 57.9% against 82.6% for a dense monolith of comparable size trained on the same task corpus.

That run predates two corpus fixes that are already in code, and the probe format it used appears nowhere in the training data. Full benchmarks are due this week.

The benchmark also cannot yet separate this architecture from a gate. This corpus determines the specialist from the input alone, so consulting memory buys nothing on it and a router would score the same. The task that separates them is memory-contingent, the same utterance needing a different specialist depending on what is stored, and building it is next.