SOPHIA XT
Research · model architecture · preprint, September 2026 · under review

A routing collapse at N = 3, and what replaced it

The architecture before this one selected among specialists instead of combining them. It worked at two and fell apart past three. XE4-S composes thirty-one and selects nothing.

The earlier line packaged each capability as a rank-16 LoRA delta of about 16.7 MiB over a frozen pretrained base, shipped as an .ncn artifact carrying a capability capsule, a scope and exclusion list, a bound validation set and a provenance manifest. A pooled query embedding was scored against those capsules in closed form, by cosine similarity or by GSVD-routed capsule similarity, and the highest scorers became the active set. It was specified, measured and published as a failure before XE4-S was built, which is why both sides of the comparison below are the same lab's work on its own record.

Top-1 route accuracy, 30 held-out prompts
N = 2 100%
N = 3 23.3%
N = 4 36.7%
N = 5 36.7%
N = 6 46.7%

The ship gate was 85%. Clean at two specialists, 18 of 20 across bases. At three and above, over capsules from similar domains, it collapsed and stayed collapsed however the mechanism was varied.

collapse point
N = 3
100% at two specialists, 23.3% at three
learned replacement router
0.0 bits
every one of 30 prompts to a single node
XE4-S, in distribution
18 of 19
task shapes routed correctly at N = 31
twelve untrained specialists
0.000
mean and max weight, every probe
01 · The failure this paper starts from

Selection got harder as the bank grew

Routing was closed form and the ship gate was 85% top-1 route accuracy. At two specialists the router cleared it: 18 of 20 combined across bases, with both misroutes low-margin general-to-architecture confusions on the cross-base wrapper. At three and above, over capsules from similar domains, top-1 accuracy fell to 23.3% and never recovered past 46.7%. One specialist stopped being reachable at all. The code capsule was absorbed by the architecture capsule and sat at 0% from five specialists onward.

Figure 01 NCN capsule routing, similar-domain specialists
NCN capsule routing saturates as the active set grows0255075100offline separability of the same capsules, about 82% out to N = 48ship gate 85%10023.336.736.746.7the code specialist, absorbed by arch: 0% from N = 523456N specialists · top-1 route accuracy on 30 held-out prompts, similar-domain capsules
The dashed amber rule is what the same cosine signal achieves offline on the same capsules, about 82% out to N = 48, against a random floor falling from 12.5% to 2.1%, a ten-seed stability of 0.00 and mutual information reaching about 88% of maximum. The roughly thirty-point gap between that ceiling and deployment routing near 47% is the finding: the geometry holds and the deployment projection does not.

Three follow-ups were run to find the mechanism. Each sharpened the result rather than softening it, and the last one is the reason the line was stopped.

Section 7.1
Three attempts to fix the router
InterventionWhat it didOutcome
Mean-centre the capsulesTripled decision marginsAccuracy essentially flat. N = 6 rose only from 46.7% to 50.0%, so the failure is a query-to-capsule representation mismatch rather than a geometry problem.
Enlarge one specialist's corpus237 examples to 4,361N = 6 went down, 53.3% to 46.7%, and the diag and dialog capsule cosine collided to 0.926. A single mean-vector capsule gets more diffuse as its corpus broadens, not more discriminative.
Replace closed form with a learned routerThe NCN v2 routerWorse than closed form. All 30 prompts across all six specialists routed to one node, mutual information exactly 0.0 bits. Abandoned.
Four mechanisms were tried in that line, cosine-to-mean, GSVD, a learned router and shrinkage-LDA, without isolating a cause. The proposed remedy, a hierarchical gate that descends a topology region before selecting inside it, is specified and untested.
02 · What changed

Two mechanism differences, both load bearing

A mixture of experts computes w = gate(x). XE4-S computes w = compose(x, m), where m summarises where a beam descent through a runtime-written memory of user facts terminated. Everything else about the stack is kept.

It never selects

All thirty-one specialists receive non-zero weight and their outputs are summed. There is no active set to choose and nothing that has to learn to choose it, so there is no top-k in this system and no load-balancing loss anywhere in the work. As N grows, the router is not solving a harder discrimination, because it is not discriminating.

It never learns to route from geometry

One uint8 per token, aligned element for element with the token stream and written when the corpus is built. The same bytes mask the loss that trains specialist i in stage C and supervise the composer that weights it in stage E. The assignment was fixed in the data, so nothing has to recover it from embedding geometry.

Prior art, stated by the paper
Corpus-label routing of this kind is not new. DEMix assigned every token in a sequence to an expert by domain label, dismissed load balancing outright and mixed densely over the whole bank at inference, in 2021. What the paper claims as its own is the per-token granularity, the dual use of one channel as both partition and regression target, and the setting being assistant behaviour rather than document domain.
03 · The result

At thirty-one specialists, nothing collapsed

The composer routes 18 of 19 task shapes correctly in distribution. The bank it does that in is thirty-one wide. Twelve of those thirty-one are knowledge specialists that were never trained, because XE4-S ran with no knowledge corpus, and the composer gives all twelve exactly 0.000 weight, mean and max, on every probe. No mechanism asks it to. There is no dead attractor and nothing absorbing the mass of a neighbour.

That is fifteen times the specialist count at which the previous architecture stopped working. It is also a different quantity from the one in Figure 01, and the paper says so before anyone else can. Panel (a) of its own figure measures top-1 selection accuracy over a sparse active set chosen by capsule geometry; the N = 31 result measures whether a dense composer that selects nothing puts its mass on the right specialist. What transfers between them is the direction of the curve, not the axis.

What the comparison does not establish
The two systems are not a controlled head-to-head. NCN routed LoRA deltas over frozen pretrained bases, selected by geometry, scored on 30 held-out prompts over two to six similar-domain specialists. XE4-S trains a bank from scratch at thirty-one and its routing is supervised. The collapse that stopped one architecture does not appear in the other, and the two mechanism changes above are the candidate reasons. Which of the two is responsible is not established, and the experiment that would settle it, supervised routing against geometric selection on one bank, has not been run.
04 · The other half of the result

The knowledge axis collapsed in exactly the old pattern

A companion run of the same architecture did have a knowledge corpus, and its composer routed 12 of 12 knowledge branches to one specialist, know:Home. One destination for every input, which is the zero-bit failure of the NCN v2 router in different notation.

The cause was found by arithmetic rather than inferred. The batch sampler walked a sequential cursor from block zero. Stage E runs 2,500 steps, half of them on knowledge at batch 24, so its knowledge stream consumes 30,000 blocks of 512 tokens, 15.4 M tokens, starting at block zero. The knowledge corpus is laid out branch by branch and Home occupies blocks 0 through 34,921. The stream never left Home. Eleven of twelve labels were never once shown.

Measured directly against the real corpus over the exact 1,250 steps at batch 24 the stage uses: a sequential cursor shows 1 of 12 labels with Home at 100.00%. Random block draws show 12 of 12 with Home at 9.00%, and after the fix every branch appears in proportion to its size, from Person at 3.10% to Nature at 9.42%.

Section 7.4
After the sampler fix, real and partial
MeasureBeforeAfter
Branches routed to their own specialist1 of 123 of 12
Mean mass on own specialistnot reported0.111, against a uniform 0.032
Mean cost of composing against the best single specialist−0.3093 nats−0.1923 nats
Where the collapse sitsknow:Homeknow:Society
The collapse moved rather than dispersing. Stage E gives the knowledge half 15.4 M tokens to learn a twelve-way split on top of a nineteen-way one, and that remains unresolved. The difference from the NCN case is that here the cause was data exposure rather than routing machinery, and it was isolated.

One parallel cuts against both architectures. In the NCN line the obvious remedy made things worse: a corpus nearly twenty times larger dropped N = 6 accuracy. In the XE4-S line the obvious remedy made things worse too, and three separate attempts to train the composer harder are the record of it. Neither system's routing problem was ever short of the thing intuition said it was short of.

05 · The system

130.6 M parameters, one consumer GPU, no pretrained base

Tokens enter a trunk of six pre-norm decoder blocks at d = 384, six heads of width 64, a 4d GELU feed-forward and a head weight-tied to the token embedding. The trunk's hidden states go three places: they are queried against the memory tree, they drive the composer, and they are the input to every specialist. The composer emits thirty-one weights, the specialist outputs are scaled and summed, the sum passes through the retrieval stage, and the head decodes it.

Position enters as a learned embedding table with one row per index, which is why the context window is exactly 512 and cannot be moved without retraining. There is no row for position 513, and asking for one raises an index error rather than degrading.

Table 1
Parameter budget, measured rather than estimated
ComponentParamsNote
Trunk, 6 blocks and embedding17.1 Mtrained once, stage A
Specialist, each3.55 M×31 = 110.0 M
Output head6.29 Mtied to token embedding
Composer24,638two linear maps
Memory query projections0.15 Mnot a specialist
Memory value vectors+384 / nodegrows when written to
MemK scorer129a submodule of the model
Bank total, 31 specialists127.5 Mall resident as trained
Evaluated checkpoint130.6 M6,752 memory nodes written
Two totals were carried in our documents, 127.5 M and 130.6 M, and both are right under the convention each was using. Reloading the checkpoint settles it: model.parameters() returns 130.57 M, of which 2.59 M is the per-fact memory values, leaving 127.98 M of architecture. A further 5.19 M of derived keys and latent slots are buffers and not parameters.

The memory is part of the network

Node keys are the l2-normalised mean of the trunk's token embeddings for the words of a node's breadcrumb. No trained parameter appears in that formula, so inserting a fact cannot move the key of any existing fact. A beam descent with a margin gate keeps two candidates per level and produces both the context vector m and a printable path; each hop contributes a log-probability and the hops compose along the route, so on a five-fact tree a survivor's weight is 0.868 against 0.132 where a flat mean gave 0.500 against 0.500. Retrieved nodes are prepended to the keys and values every block attends over, so a fact stays attendable after the turn that produced it has left the window.

Writing is gradient-free and sub-millisecond, addressed by breadcrumb, rewriteable at that address and retractable. Writing moves the output by 7.7×10⁻², rewriting the same address a further 1.17×10⁻¹, and forgetting returns the model to baseline at exactly 0.000×10⁺⁰⁰ with the symbolic path intact. Memory columns are gated rather than merely zeroed, because a zero value still takes attention mass out of the softmax: a zero value perturbs the output by 0.3, an additive logit bias of −10 on the memory columns by 2.6×10⁻⁵. The gate opens to 0.34 once trained.

The composer is the smallest thing in the system

Two linear maps and a softmax, 24,638 parameters, an order of magnitude smaller than anything else here. The claim is not that it has capacity, it is that m is in its argument list. W_m is zero-initialised, so an untrained model is exactly a router and the memory term has to earn its contribution rather than arriving as noise. It earned it: norm 11.22 against W_x's 12.14, which is 48% of the routing signal. A use bias is written by use and never by gradient, one scalar per specialist, step 0.0085 and cap 0.20, so one interaction moves a specialist's weight by under 0.2%, a hundred consistent ones move it about 4%, and then it stops.

Table 2
Growth points, measured on a live system
OperationMeasured
Attach a specialist5.96e−07 output change
Deepen a specialist in place0.000e+00 output change
Write a fact, gate at init2.6e−05 output change
Write two facts5 nodes, +1,920 params
Cost of one specialist3.55 M params, 14.2 MB
Attach and swap time0.074 s, 3.0 ms
Attach appends a specialist with its composer row zeroed and its bias at −12, which puts its mixture weight near 10⁻⁵. Promotion is a distinct stage and the design fails without it: with the composer frozen while the specialist trains and no promotion stage, the specialist is trained, admitted, and contributes nothing. The gradient mask on promotion is not optional either, because training the whole composer would let a new capability silently reweight every existing one.
06 · Curriculum and data

Five stages, three corpora, one label channel

Table 3
The five stages
StageWhat trainsBudget
Atrunk, general English2.11 B tokens, 200,000 steps
Btrunk, transcripts4,000 steps
C19 task specialists, trunk frozen1,200 to 3,000 steps each
Dmemory, 3,582 keys to 6,752 nodesquery projection on 4,000 pairs, similarity 0.992
Ecomposer, task corpus2,500 steps
The trunk is frozen from stage C onward, so a specialist trained in month three cannot renegotiate what the language layer learned in month one. Stage E is the only stage that trains anything shared across specialists: 2,500 steps against stage A's 200,000, so the hardest discrete choice in the model receives about 1.25% of the training budget.
Table 4
The three corpora
CorpusSourceTokensJob
generalFineWeb-Edu2,107 Mhow English sounds
taskour construction grammar199 Mhow to answer
knowledgeWikipedia205 Mwhat is true
XE4-S trained on the first two. The twelve knowledge branches were present in the bank and never trained. An earlier attempt interleaved general prose with task transcripts in one run and produced no measurable language ability, because a mixed corpus is two objectives competing for one gradient rather than a language layer.

Specialist sampling was got wrong twice before it was got right. Interleaved masking gives full input coverage and roughly 10% gradient density, which is 14.7 M effective tokens per specialist, 4.2 tokens per parameter against the trunk's 123. Contiguous slicing gives roughly 100% density and only ever shows a specialist hidden states produced by its own shape, which scored worse end to end, 36.5% against 57.9%. Stage C reads the grouped corpus and stage E reads the interleaved one, and that is not a convenience: the composer's routing loss needs several shapes inside one window to discriminate between, and on a grouped corpus the stage collapses at loss 10.08 against 0.5153 with identical specialists.

A corpus filter decided the model's alphabet
The tokenizer is a 16,384-entry byte-level BPE fitted once on general English. The general corpus filter drops any paragraph containing braces or angle brackets as markup, so the tokenizer was fitted on 1.5 B words containing not one brace and the byte never entered the alphabet. XE4-S learned to emit tool calls in the right shape and has no character with which to write them: every opening brace encodes as an unknown token, every tool call it emits is malformed as text, and the harness's balanced-brace stop condition never fires. This is a real defect and it is not the reason for the accuracy gap below. The scorer has carried a brace-tolerant regular-expression fallback for the whole life of the project, applied to every model equally, so the missing brace was checked as a cause and rejected.
07 · Evaluation

The rest of the paper is the model, and the model does not work

178 held-out probes, tool-choice exact match, greedy decoding. The dense baseline is a 17 M monolith trained on the same 700,000 sessions under an 8,192-entry BPE fitted on the task corpus, so the content is matched and the tokenizers are not.

Table 5
Standing accuracy on 178 probes
ModelAccuracyNote
mono1, dense monolith, 17 M82.6%Wilson interval [76–87]
clm2, predecessor60.1%different tokenizer, memory inert
XE4-S, memory path off57.9%103 / 178
XE4-S, memory path live57.3%102 / 178, [50–64]
XE4-S, after the read fix36.5%the fix that made it worse, section 08
Making the memory path live moved the score by one probe. Composed against ablated validation loss at the end of the run is 0.3898 against 0.4055, which is the cleaner statement of what memory contributes to the loss.

The deficit is one failure mode rather than a spread. XE4-S emits no call at all on 50 probes and the wrong tool on 25; the baseline emits no call on 0 and the wrong tool on 31. On wrong-tool confusions XE4-S is ahead of the dense baseline. The entire deficit is failing to act.

Four causes were tested and rejected before the real one surfaced: not the tokenizer, not the prompt format, not the frozen trunk, and not dilution by the abstaining tail. What remains is where the composer puts its mass. On the 128 probes it gets right, 0.883 of the mixture sits on specialists that would open a call. On the 50 it fails, 0.285. Of those 50, seventeen put top weight on blunt_answer and fifteen put it on memory_read, which is the right shape and fails anyway.

Figure 02 Single path, one specialist run alone on the 178 held-out probes
Single-path opening rate by specialist shape, 178 held-out probes0%25%50%75%100%composed over all 31: 71.9%ACTS ON A STATEMENTmemory_write99.4count_write99.4tool_error99.4calendar_add98.9web_search98.3memory_update96.1ANSWERS A QUESTIONmemory_read40.4calendar_query31.5calendar_empty25.8count_read23.6multi_step11.2one specialist run alone · the seven no-tool shapes sit at 0.0%, correctly, and are not plotted
Every specialist whose shape acts on a statement opens a tool call on 96 to 99% of held-out phrasings. Every specialist whose shape answers a question manages 11 to 40%. The training corpora open at near-identical rates across that divide, memory_read 60.2% against memory_write 61.2%, calendar_query 62.0% against calendar_add 61.0%, count_read 54.9% against count_write 55.9%, so this is not a label-frequency artefact. Read turns in training are predominantly questions and the probes are statements that imply a read, so the write specialists are trained on statements and meet a statement while the read specialists are trained on questions and meet a statement.

The corpus then routes the four held-out syntactic frames straight at the specialists that abstain. Reported is 100% memory_read, oblique is 37% calendar_query and 28% memory_read, cleft is 38% memory_read. Routing a probe correctly hands it to a specialist that ends the turn six times in ten, which is why 15 of the 50 failures route to the right shape and fail regardless.

A benchmark that measured a tokenizer

Every accuracy figure in the project before this one was tool-choice exact match, and nothing had ever scored the arguments. Two live outputs make the gap concrete. Asked for a bin day, the checkpoint produces memory_get with the key user.allotments. Asked for the opening hours of a leisure centre, it produces web_search with the query "the opening hours of the the stonework centre". Right tool both times, useless both times, and counted as successes by every number the project had published.

Table 7
Four-level argument score, invented entities
ModelCallToolKeysValues
XE4-S, 130.6 M67.1%50.0%0.0%0.0%
mono1, 17 M dense100.0%81.4%81.4%81.4%
The last two columns are the ones nobody had ever looked at. Four candidate causes were killed first: composition blurring the copy, the memory key-value path displacing the prompt, stage C masking away the argument tokens, and the model being unable to copy at all.
Table 9
The same evaluation on entities a real user would say
ModelTool choiceQuery exact
XE4-S62%0%
mono1100%0%
The baseline also scores 0%. Its 81.4% was its tokenizer having memorised a synthetic generator rather than an ability of the model.

The cause is subword length and whose tokenizer had seen the probe generator. Our BPE was fitted on 2.11 B tokens of real English, which contains no "Quillwick", so the generator's inventions shatter into five rare pieces where the baseline's own BPE encodes them in two. Copying two tokens is a different task from reproducing five rare subwords in exact sequence. On real text our tokenizer is the better of the two, 36 tokens against 44 for ten real entities, and worse only on the invented ones, 37 against 28. The paper calls this its most important methodological finding: a benchmark generated by the same machinery that produced one model's tokenizer measured that tokenizer. The tokenizer is not being rebuilt to match the generator, because that trades real-world quality for a benchmark number.

Stored memory does not change behaviour

The memory-contingent benchmark exists to separate a model with state from a model without one. Two of its arms have the fact outside the 512-token window and one never stored it at all, so the visible context is identical. A model whose only state is its context must answer both alike, right on one and wrong on the other, which is 50% by construction at any size and any training budget.

Table 10
The memory-contingent arms, 60 probes each
ArmCorrectWhat it said
in-window, control58.3%memory_get 35, no call 25
out-of-window51.7%memory_get 31, no call 18, web_search 7
no-fact35.0%memory_get 31, no call 21, web_search 6
The finding is in the third column rather than in the totals. memory_get is emitted 31 times in each measured arm, identical whether the fact was stored or was never stored at all. The two measured arms score 43.3% against the 50% cap, a margin of −6.7 points, and the in-window control at 58.3% is a failing control, which is why −6.7 should not be quoted as precise.

The likely cause is not a defect in the mechanism. Every memory_read session in the corpus has the fact present in context and the tool result hands the value back, so calling memory is never wrong and never informative. The model learned that a question about a personal fact calls memory_get, as a property of the phrasing. It was never given a case where the same phrasing needed a different answer depending on what was stored. The fact is written, the tree is navigable, the key-value path is live, and none of it reaches the decision.

Growth by use moves nothing

The use loop is the architecture's central claim, that serving a user improves the model. Two arms ran over an identical interaction stream under the same seed, one writing stated facts to memory and nudging the specialist that served each turn, the other doing neither. No gradient, no optimiser, no training step in either. The mechanism does run and had never run before: the use bias was 0 of 31 nonzero in every checkpoint in the project and after 20 interactions it was 17 of 31, with memory growing from 6,752 to 6,753 nodes. Over 300 interactions, held-out accuracy in both arms sat at 0.5167 at every checkpoint measured, at 0, 75, 150, 225 and 300. The live arm moved +0.0 against the frozen one.

That is a real null on the thing the architecture is for. It is also the one test a dense transformer cannot produce a difference on, since its behaviour on turn one and turn ten thousand is identical by construction, so the test is worth keeping and re-running against a model whose read path works.

output novelty
0.00
by token 144, in a 48-token window
throughput
4.6 tok/s
batch 1; 7.2 at batch 4, 7.7 at batch 8
peak VRAM
537–555 MB
a 130.6 M model on one RTX 3090
batched bank, unused
11.5×
verified at k = 31, agrees to 1.55e−6, imported by nothing

The acceptance test: three of seven

Table 11
Seven owner-written criteria, first run
CheckResult
English replypass
Right tool for a calendar addfail
A paragraph, not a fragmentfail
Search, with a query from the requestpass
Faster than 20 tok/sfail, 4.2
The model changed through usepass
Reached for memory past the windowfail
Check seven failed cleanly: with the name 900 tokens outside a 512-token window, the model hallucinated a calendar lookup rather than consulting memory. The use loop moved memory from 6,752 to 6,754 nodes and use-bias from 0 to 3 of 31 specialists with no gradient and no retraining.
What passed, quoted rather than scored
Two mechanisms. A bimetallic strip bends as it heats and trips on sustained overload; an electromagnet trips near-instantly on a short. That's why a slow overload takes seconds and a dead short takes milliseconds.

Unedited, from 130.6 M parameters trained from scratch on one consumer GPU with no pretrained base. Every remaining failure in the paper sits above the language layer.

08 · Ablations

Two of our own claims come back off the table

Composition is worth something on the opening decision. Over the 178 probes, composed across all 31 specialists opens a tool call 71.9% of the time, the mean trained single path 43.1%, and an untrained specialist 36.9%. An untrained specialist is a residual block at initialisation and therefore approximately the trunk's own prediction, which makes that last row a trunk control rather than a weak expert. Where routing is correct, composition also beats the best single specialist: on Home, the one knowledge branch the companion run's composer could route, composed scores 5.0303 against best-single 5.1764, a gain of +0.1461 nats that a top-1 gate cannot reach by construction.

The bank is differentiated. Across twelve knowledge branches, own-branch mean loss is 5.4786 against 5.8999 on every other branch, a gap of +0.4212 nats, and 12 of 12 branches are best served by their own specialist. The task-axis equivalents, a +1.81 nat own-against-other gap and composition beating the best single specialist on all 19 domains at a mean +0.91 nats, appear only in a summary with no detail table or cited artifact behind them, and the paper flags them as needing re-derivation before anyone leans on them.

Table 12 · retraction
Truncation is free
top_pSpecialists keptCall recall
1.003171.9%
0.991571.9%
0.951072.5%
0.90873.0%
0.80572.5%
0.60365.7%
This was previously reported the other way, at a cost of 11.8 points at p = 0.99 and 21.3 at 0.90, and that figure went into a paper as the sharpest evidence that dense composition beats top-k. It was our own bug: the kept set was selected by cumulative sum over each specialist's maximum weight across positions, which is not a distribution and sums to roughly 9 over 31 experts, so the threshold was crossed after about three. The claim is withdrawn. What replaces it is smaller and true: serving can truncate to eight of thirty-one with no loss, which prices the 3.7× speed-up from truncation, 22.0 to 79.3 tok/s on GPU, at zero accuracy.
Table 13 · retraction
The ordering result does not replicate
SeedSystemMatched monolithMargin
420.78770.7350+5.27
1010.75360.8285−7.48
2020.81450.7828+3.18
3030.74050.7875−4.70
mean−0.93
Four seeds per arm, identical data, only initialisation and batch order differing. The original +5.27 was the best draw of four and was quoted for months as +5.3. The spread is 12.8 points, the sign flips twice and two of four arms win. A compositional system does not beat a parameter-matched monolith here, and the paper does not claim it does. What survives is that the eleven ordering arms produce a large spread from ordering alone, and the specialist-first collapse to 0.62 through 0.65 is far outside this seed variance, which remains the reason the language layer goes first.

The truncation defect was found because an adversarial prior-art search went looking for papers that would embarrass us. It surfaced a 2026 result arguing that most reported top-k truncation cost is a renormalisation artefact, and the search found our own bug instead.

Fixes that reliably make things worse

Most of one long day went on the assumption that the composer was at fault. Three independent attempts to improve routing each raised training routing accuracy and each lowered the benchmark. Longer plain training went 71.9 to 73.6 to 70.2 with no trend while training routing accuracy rose 0.760 to 0.795. Frame-weighted sampling went 71.9 to 69.1 to 69.1 to 67.4 to 66.9, monotonically down, while training accuracy rose to 0.791. A hidden path with real capacity took training accuracy to 0.863 and held-out opening down to 62.9%, the worst of the three. A fix that reliably makes things worse is a fix to something that was not broken. The hidden path stays in the code defaulting to absent, because a negative result that is reachable is worth more than one taken on trust.

Weighting the one position where a specialist decides whether to act 8× for 1,500 steps took the four read specialists from 23.6–40.4% opening to 84.3–98.3% in 10.7 minutes of training, and memory_read crossed 90% within 300 steps and 31 seconds. End to end that is a regression from 57.3% to 36.5%. No-call misses fell from 50 to 31 and wrong-tool misses rose from 26 to 82. The specialists learned to open without learning what to open with, because the weight sat on the opening token and left the tool-name token immediately after it at 1. Silent abstention was converted into confident wrong answers.

Volume was measured directly rather than assumed, at eight times the stage C allocation on one read specialist. Right-tool rate goes 28.3% at stage C only, 53.3% after 3,000 additional steps, then oscillates between 35.0% and 53.3% for the next 21,000 while training loss moves 0.1954 to 0.1831. Doubling stage C is worth about +25 points and everything past that is noise. The specialists were undertrained by roughly 2×, not by the 10× the token-per-parameter ratio implies. Volume is not the reason held-out phrasing fails: a module that has converged on its own distribution and still cannot handle unseen phrasing is reporting that the distribution lacks the phrasing.

09 · Four bugs of one class

State that is not a fixed-shape buffer, silently out of step with what it indexes

Loading a checkpoint without strict key matching drops an entry that has no destination in a freshly built model and says nothing. Python-side collections never enter the state dict at all. Nothing errors, and the numbers quietly mean something else. The same class produced four separate bugs in one system.

Section 8
The four instances
WhereWhat happened
The memory treePlain Python, so it never entered the state dict, and the memory context short-circuits to null when the node list is empty. That quietly demotes the composer to a plain router. Found and fixed months before the others, after which the search stopped.
Per-node values and latent slots on loadA checkpoint's 6,752 value entries had no destination in a fresh model and every one was discarded, so the memory-as-persistent-key-value path was inactive in every evaluation this project has ever run, the 57.9% included. After the fix a reloaded checkpoint reports 6,752 nodes, 6,752 values and a latent block of 6,752 rows, accessor active at slot norm 32.24.
The same tensors on pruneThe curation rebuild reindexed nodes, depths, leaf flags, keys, children and roots and did not reindex values, latents or affinities. After any prune, node i carried whatever node i used to be, so its learned value belonged to a different fact, and the facts-lost count of zero was measuring the symbolic tree only. Verified after the fix on a 19-node tree pruned to 13.
Checkpoints with no record of context lengthThe positional flag is a plain boolean and the context length is only implied by a tensor shape, so loading through a loader hardcoded to the other setting drops the positional table on a shape mismatch and would have scored a model nobody trained. Fixed by writing a config block on save.
Two adjacent classes produced the rest. A sampler assumption that holds for interleaved data and fails for grouped data appeared twice, as the knowledge cursor above and as stage E collapsing on the grouped corpus. And a filter upstream silently deciding something downstream produced the tokenizer alphabet. Guardrails are in place for each: the loader prints the value count beside the node count and flags a mismatch, the batch sampler takes a randomisation argument, the byte alphabet is seeded explicitly, and the truncation selection rule sums over the mean.
10 · Limits

What this does not claim

Every accuracy figure in the paper other than the argument scores is tool-choice exact match. Models were compared like for like, so the gap to the dense baseline is real, but the absolute numbers overstate how usable the model is by an amount nobody has established. The context window is 512 tokens and cannot be widened without retraining. Multi-turn conversation has never been run against a trained checkpoint. Serving is 4.6 tok/s.

The bare contrast between a gate and a composer is not a novelty statement. Retrieval-conditioned routing already exists in the literature; what survives here is that the retrieved object is runtime-written user content rather than a cached routing decision, and that the output is dense rather than sparse. Corpus-label routing with dense mixing and no balancing loss is not ours either. Dense mixtures beating sparse ones is established across at least three papers, and our own measurement of it turned out to be a bug. Gradient-free retraction of one named memory has a two-year-old answer in Larimar. Admitting a new expert into a trained bank by training only the router is a promotion stage in everything but name and is published; what is ours there is the 10⁻⁵ measurement that says what happens without one.

Two measurements come from neighbouring runs rather than from the evaluated checkpoint and are labelled where they appear: every knowledge-axis number comes from a companion run with a knowledge corpus, and the volume sweep was run on a later checkpoint of the same specialist geometry. The memory-contingent margin is measured through a read path that opens on 40.4% of held-out phrasings and has to be rescored once that path works. The curation result buys structure and not yet retrieval cost, because descent visits moved by under one node and both arms saturate the probe at 100% recall.

The one claim with no prior-art exposure
Both sides of the routing comparison were measured by this lab, on its own record, with the failing side documented before the succeeding one was built. That is a narrower property than a benchmark win and it has one advantage over every other claim in the paper: no prior-art clearance is required to state it, and nothing published later can retroactively occupy it.
11 · What follows

One diagnosis covers nearly all of it

The training corpus is template-generated, the specialists fit it closely, and what they learned was the templates rather than the behaviours. Four of the five remaining failures are things the training data never required. Copying, because every slot has a typical filler and learning the filler scores as well as copying the entity. Consulting, because every read session sets the fact earlier in the same session and the tool result hands the value back. The hard frames, which sit at 0.09 to 0.30% of user turns and are among the construction families that do not transfer from any other. And saying more, because template answers are short and repetitive, so repetition is what the loss rewards. The fifth failure, 4.6 tok/s, is not a data problem at all: it is a verified 11.5× speed-up that nothing imports.

The architecture has not been shown to fail. The memory mechanism is built and separately verified, the growth points are measurably safe, and the specialists are measurably differentiated. What is missing is training that makes using any of it necessary, and the evidence for that is the same measurement in three places: behaviour identical across memory states, a use loop that moves nothing, and arguments that are never copied because the corpus never required copying.

So the next corpus is built so the easy strategy fails, not larger. Stage C goes to 6,000 steps, because doubling it is worth about +25 points on right-tool rate and the current 1,200 to 3,000 was never anything but a default. The batched bank gets imported. Arguments become a standing metric, because the distance between the right tool and an answer that works was invisible for the life of the project. The knowledge axis gets a stage E budget that matches the decision it makes, since it is the one place the collapse has not been cleared. And nothing gets claimed before it is replicated; the ordering result is the cautionary case, four seeds and a mean of −0.93 quoted for months as +5.3.

One structural item on that list is not a corpus fix. Nothing shared sits between the sum and the retrieval stage: thirty-one hidden states are added and decoded with no layer in between to reconcile them, so a weighted sum of vectors meaning "call a tool" and vectors meaning "end the turn" is a point between them rather than a vote. Blending after the head instead, scored as a rescore with the same weights and never as a trained configuration, recovers 8 of the 50 failures and loses 2 of the 128 successes, a net +3.4 points. Attaching such a stack to a trained checkpoint is verified to be exactly the identity, so it can be added under the same growth discipline as everything else. It has never been trained here, and nothing in the paper depends on it.

Section 12 of the paper lists the script behind each measurement, one script per question, from the headline accuracy figures and the memory ablation through the truncation and temperature sweeps to the growth-by-use arms and the seed sweep. Of the systems in this neighbourhood that actually train a model rather than wrapping a commercial API, the paper notes that exactly one published weights.