UOR-R4 documentation
Read online (planned; live once the site workflow deploys): https://uor-foundation.github.io/uor-r4/. The earlier Studio web app moves to https://uor-foundation.github.io/uor-r4/studio/.
In one paragraph. This is the map of the UOR-R4 documentation. UOR-R4 is an open research project building a language model that predicts text with geometry and whole-number arithmetic instead of a transformer's large grids of decimal multiplications, so that it can run fast on a laptop or in a browser. It is pre-alpha: 0 of its 8 milestones are complete, and no model built under its rules holds a useful conversation yet (where we are). The pages here explain what the project is, where it stands and where it is going in plain words first, then give the evidence for every claim so an expert can check it. Use the table below to jump to the page that answers your question. The same pages build into a book site, whose table of contents is SUMMARY.md.
flowchart LR S["Start here<br/>what, where, where next"] --> P["Products<br/>model, web, desktop"] S --> M["The model<br/>end to end"] M --> MB["Mechanism board<br/>27 parts, one page each"] MB --> G["Geometry<br/>the mathematics"] M --> R["Research<br/>findings, open questions,<br/>history, lines, notebooks"] R --> A["Archive<br/>every dated record"] S --> RU["Rules<br/>the charter explained"] RU --> REF["Reference<br/>vocabulary, configuration"]
How the sections connect. Read left to right for more depth; every section links back to its sources.
Find your way
| You want to… | Start here |
|---|---|
| Understand the project in five minutes | What UOR-R4 is, then the glossary and FAQ |
| Know where the project stands, with numbers | Where we are and the short STATUS page |
| Know where it is going | Where we're going and the milestone table in ROADMAP |
| See which transformer part each mechanism replaces | Transformer vs geometry |
| Learn what will ship | The three products: the model, the web client and the desktop client |
| Follow the model from text in to word out | The model, end to end, then training, data and tokenizer, serving and export and GPUs and CUDA |
| Check whether a mechanism is alive and what would reopen it | The mechanism board: ACTIVE, READY or PARKED, one page per mechanism |
| Learn the mathematics | The geometry of UOR-R4: primes and zeta phases, golden integers, quaternions, E8/H4 and the 600-cell, SpiralCore, the Hopf map, VSA and Hamming distance |
| Know what has been learned, and what is still open | What the project knows and what is still open |
| Read how the project got here | History and the research lines |
| Follow results as they land | The research notebooks, one page per line, and the live plan NOW.md |
| Know the rules and who decides | The charter, explained in the rules in plain language; old decisions in the decision map; changes in the rule change log |
| Find an old record | The archive catalog: every dated record, kept byte-identical |
| Contribute | CONTRIBUTING; AI labs also read AGENTS.md |
| Look up a term or a specification | Glossary, formal vocabulary, configuration |
How the sections are organised
- Start (
start/): six short pages for newcomers. Each opens in plain words and ends with sources. - Products (
products/): the three things the project means to ship, and the release format. - The model (
model/): the current model path, stage by stage, with what is built and what is missing. - Mechanisms (
mechanisms/): the board and 27 mechanism pages, each with the same template: the idea, how it works, where it stands, and what would reopen it if PARKED. - Geometry (
geometry/): the mathematics behind the mechanisms, illustrated. - Research (
research/): how research is done now, findings, open questions, the history, 17 research-line pages and the notebooks. - Rules (
rules/): the charter explained, where each old decision went, and the change log.
Three directories stay at their old paths because code and tooling read them, and they are not part
of the book: integration/ (the live plan NOW.md and the decision index),
harness/ (the research harness) and labs/ (governance files and records dated 18 or 19 October
2026). Records dated before 18 October 2026 have moved, unchanged, to archive/.
Conventions used on every page
| Convention | Meaning |
|---|---|
| proof | Follows from definitions or code |
| measurement | From a recorded run, with its artifact linked |
| hypothesis | An idea not yet tested |
| ACTIVE / READY / PARKED | On the current model path / built and tested but never trained in / the tested forms failed or broke a rule, and the mechanism stays open |
NOT_RUN | Never run; it is not a pass |
The labels follow formal_vocabulary.md, section 2. A passing test shows that code does what it says; it is not a trained capability. There is no "retired" mechanism status: a failed run closes one configuration, never a mechanism (charter §4.1).
Where it stands
| Item | State | Source |
|---|---|---|
| Milestones complete | 0 of 8 | STATUS |
| Model that holds a conversation | None | where we are |
| Mechanisms | 27: 10 ACTIVE, 4 READY, 13 PARKED | mechanism board |
| Research lines with their own page | 17 | research lines |
| Records in the archive catalog | 1,173 | archive catalog |
Go deeper
- The repository front page: README.
- The rules: CHARTER.
- The live one-page plan: NOW.md; live tracker #2028.
- Code: the active model crate
crates/uor-r4-discreteand the integer serving cratecrates/uor-r4-integer.
What UOR-R4 is
In one paragraph. UOR-R4 is an attempt to build a language model, the kind of program behind chat assistants, that is cheap enough to train and run on an ordinary laptop or inside a web browser. Today's language models are transformers. They spend most of their effort multiplying very large grids of decimal numbers. UOR-R4 bets that a different toolkit can do the same job for far less: rotations of a geometric object, exact whole-number addresses built from primes, small lookup tables, and an exact memory. This page explains that bet in about five minutes. It is a research project and it is pre-alpha. None of its 8 milestones is complete, and no model built under its rules holds a useful conversation yet (STATUS, NOW).
How UOR-R4 predicts the next word. Each step uses only whole numbers. The picture shows the design; it does not show a model that already works well.
Words in bold are defined in the glossary. Claims are labelled proof (follows from definitions or code), measurement (from a recorded run) or hypothesis (an untested idea), as in docs/formal_vocabulary.md.
What a language model does
A language model reads text and guesses what comes next. First a tokenizer cuts the text into numbered pieces called tokens. A token is a word or part of a word. UOR-R4's tokenizer has 4,096 pieces (tokenizer). The model then looks at the pieces so far and predicts the next one. Given "the cat sat on the", a good model puts "mat" near the top of its list. It appends its guess and repeats.
Everything a chat assistant does, answering, summarising, writing code, comes from running this one loop many times. So a model is only as good as its next-piece guesses, and only as fast as one turn of the loop.
What a transformer is, and where its cost goes
A transformer is the design behind almost every modern language model (background: Vaswani et al., "Attention Is All You Need", 2017, arXiv:1706.03762). One turn of its loop looks like this:
flowchart LR t["Token"] --> e["Embedding:<br/>a long list of decimals"] e --> a["Attention:<br/>compare with EVERY earlier token<br/>(softmax)"] a --> m["Feed-forward:<br/>multiply by large learned grids<br/>(matrix multiplication)"] m --> o["Output:<br/>score EVERY word in the vocabulary<br/>(softmax)"] o --> n["Next token"] m -. "repeat for many layers" .-> a
One turn of a transformer. The three expensive operations are named in brackets.
Three operations carry most of the cost:
- Matrix multiplication. Each token is carried as a long list of decimal numbers. Every layer multiplies that list by large learned grids of numbers. Nearly all of the arithmetic is here.
- Attention. To decide what matters, the newest token is compared with every earlier token. The work grows with the length of the text, and the model keeps a stored copy of every earlier position.
- Softmax. Scores are turned into probabilities with exponentials and a sum over everything, once inside attention and once over the whole vocabulary to choose the next word.
The project bans two of the three outright, softmax-like squashing functions and matrix multiplication, anywhere: training, evaluation, tools and serving (charter, sections 3.2 and 3.3). All-pairs attention is not banned as an idea; it is replaced by bounded reads of a few nearby tokens. The reason, in the owner's words: "my goal with all of these bans is to ban expensive operations" (charter, section 1).
The bet: geometry and exact memory instead
UOR-R4 replaces each expensive part with something cheaper:
| Transformer part | UOR-R4's replacement |
|---|---|
| A long list of decimals per token | A short address: 4 blocks of 8 whole numbers, each block a fixed point on a geometric object |
| Compare with every earlier token | A local read (a "read" is the step that looks back at earlier text): look at a few nearby earlier tokens, found by their addresses |
| Softmax over every word | Admission: open a few "drawers" (called cells) of words near what was read, then pick the nearest word inside them |
| Learned grids of decimals | Rotations from a fixed, finite set, plus table look-ups |
| A growing store of every past position | Exact memory: write a fact once under an exact name, read it back exactly |
The finished model is meant to run with whole numbers only: adds, subtractions, comparisons and table look-ups, with no multiply instruction at all. This rule is called D11 (charter, section 3.6). The lead measure of success is tokens per second on ordinary hardware (charter, section 1).
Whether these replacements can match a transformer's quality is the open question. It is a hypothesis. No measurement so far shows it, and the next page says which parts are built and which are missing: transformer vs geometry.
What "geometry" means here
"Geometry" in this project means a few concrete objects, each chosen because it can be computed exactly with whole numbers. The geometry section has one illustrated chapter for each.
A token's address is built from fixed points. Each of the 4,096 tokens owns 4 blocks of 8 whole numbers. Each block is always one of 16 fixed points of a famous eight-dimensional lattice called E8. Every such point is a signed rearrangement of (2, 2, 0, 0, 0, 0, 0, 0): two of the eight places hold 2 or −2 and the rest are zero. There are \(16^4 = 65{,}536\) possible addresses, more than the 4,096 tokens, so every token can have its own (proof, by counting; see the model page). The model does not yet use all 240 points of E8 (E8, H4 and the 600-cell).
Moving means rotating. Changing a block means swapping one fixed point for another, which is a rotation from a finite set. Nothing is rounded, so a rotation can always be undone exactly (quaternions and rotation).
Names come from primes; starting places from zeta phases. Each token can be named exactly by a prime number, and that name never collides with another. Separately, angles taken from the zeros of the Riemann zeta function (a fixed, reproducible set of numbers from mathematics) scatter the tokens' starting addresses. One such construction, PrimeZeta, gives all 4,096 tokens distinct starting addresses (measurement, construction record). The distinctness comes from a cell-balancing step, not from the zeta angles; whether the angles help at all is untested (primes and zeta phases).
Near means few steps apart. Distance between two addresses is the sum of the differences between their numbers, which needs only subtraction and addition. "Nearby earlier tokens" and "the nearest word" both use this distance (the model page).
Learning means trying the legal moves. The current model does not use calculus. To learn, it tries all 16 legal values of one block on the graphics card and keeps a change only if a whole-number score strictly improves (training, discrete learning).
Where it stands
| Item | State | Source |
|---|---|---|
| Milestones complete | 0 of 8 | STATUS, NOW |
| Whole-number serving engine | Built. It runs in a browser, and its audit finds no multiply, divide or decimal instruction in 7 of 7 serving functions (measurement) | WASM runtime record |
| A model trained under today's rules in that engine | None yet (older float stacks were served in October and missed their quality bar). Training is on hold until the owner releases each run | NOW, charter section 5 |
| Best trained model so far | 65 and 463 correct first guesses out of 14,287 on its two seeds. A table of word counts gets 1,226, and a next-word table gets 6,300 (measurement) | K16 outcome, count tables |
| Tokens per second for the current model | Never measured | lut-serving |
The model is currently worse than two simple tables of word counts, and the cause is not established. Where we are explains the numbers.
Go deeper
- Transformer vs geometry: each transformer part beside its replacement, with status.
- Where we are: what works, what does not, and the measured results.
- Where we're going: the eight milestones, the shortest path and the products.
- The model, end to end: one piece of text through the real pipeline.
- Mechanism board: all 27 mechanisms and their status.
- Charter: the mission and the rules.
Transformer parts and their geometric replacements
In one paragraph. A transformer is built from a handful of standard parts: a tokenizer, an embedding table, a position signal, attention, feed-forward layers, normalization, an output layer, a loss and an optimizer. UOR-R4 tries to replace each part with a geometric or exact mechanism that avoids softmax and matrix multiplication. This page puts each transformer part beside the project's replacement and says how far that replacement has got. The short version: most parts have a candidate, and several candidates are built and tested. Two parts have no candidate at all: position and normalization. No two replacements have yet been trained together into a model that beats simple word-count tables (audit synthesis, section 1).
Each transformer part beside its replacement. Colour gives the status. The two dashed boxes are the gaps.
Terms are in the glossary. Labels follow docs/formal_vocabulary.md: proof, measurement or hypothesis.
How to read the status
Every mechanism has exactly one of three statuses, set on the mechanism board:
- ACTIVE: on the current model path,
crates/uor-r4-discrete. - READY: built and tested, but never trained into a model.
- PARKED: the forms tried so far failed or broke a rule. The mechanism stays open, and its page lists what would reopen it.
There is no "retired" or "dead" status. A failed run closes one configuration, never a mechanism (charter, section 4.1). Today the board has 10 ACTIVE, 4 READY and 13 PARKED mechanisms.
A passing test shows that code does what it claims. It is not a trained capability, and a test marked NOT_RUN is not a pass.
Part by part
| Transformer part | What it does | UOR-R4 replacement (status) | Where it stands |
|---|---|---|---|
| Tokenizer | Cuts text into numbered pieces | tokenizer (ACTIVE) | 4,096 pieces, pinned in every corpus and artifact. No other vocabulary size has been compared |
| Embedding table | Gives each token a starting vector | prime-zeta codebook (ACTIVE), address cells (ACTIVE) | PrimeZeta gives 4,096 of 4,096 tokens distinct vectors (measurement, record). Address cells raised zero-training reach from 127 to 1,351 of 3,847 rows; training then eroded it to 551, below the control's 857 (measurement, pre-flight, dose) |
| Position signal | Tells the model the order of tokens | None | Gap 1. See below |
| Attention: what to read | Picks which earlier tokens matter | route read, flock read, relation read, admission (all ACTIVE); Hopf observation (PARKED) | Flock passes its 6 of the 25 shared GPU construction checks (11 Route, 6 Flock, 8 driver) (measurement, record). No read's own value has been measured: Route received 20 learning proposals in 16,404 batches (attention state) |
| Attention: mixing what was read | Combines the chosen tokens | flock read (ACTIVE) | Rotates a few nearby earlier tokens into one frame and moves toward their consensus |
| Copy heads | Copies a word seen earlier | relation read (ACTIVE), pointer key (PARKED) | Relation passes 9 of 9 checks and trained twice; both runs stopped before a verdict |
| Context memory (key-value cache) | Stores every earlier position | exact memory, VSA, read binding (all PARKED) | Using an exact address as the read has never been built |
| Durable memory outside the model | Not a transformer part | object store (READY) | 20 integration tests at delivery (60 after later work) and a conformance pass. Nothing uses it yet |
| Feed-forward layer | Processes each token on its own; most of the multiplication | SpiralCore/FBS projection, Hamilton gate (READY); E8 orbit memory (PARKED) | None has ever been trained. The current model has no feed-forward layer |
| Gates and activation functions | Squash signals with sigmoid, tanh and the like | Hamilton gate, recurrence gates (READY) | Turn the gate into a rotation, or use tables of powers of two. 18 GPU construction checks pass; never trained |
| Recurrent mixing (in hybrids) | Carries a running state forward | recurrence gates (READY), geometric stack (PARKED) | The old stack trained, but used softmax and matrix multiplication |
| Matrix arithmetic | Multiplies by learned grids | D11 integer serving (ACTIVE), SpiralCore/FBS (READY); spin weights, ternary/XOR (PARKED) | Integer engine's audits are green, but no model built under today's rules has been exported into it |
| Normalization | Rescales signals between layers | None | Gap 2. See below |
| Output head (softmax over all words) | Scores every word and picks one | admission, discrete learning (ACTIVE) | Best trained result: 65 and 463 of 14,287 correct, against 1,226 and 6,300 for two count tables (measurement, K16 outcome) |
| Loss (cross-entropy) | Measures how wrong a guess was | rank-margin hinge (ACTIVE); read binding (PARKED) | Asks only whether the right word beats its strongest rivals by a gap. It gives no probability, so no bits-per-byte score |
| Optimizer (backpropagation) | Adjusts the learned numbers | discrete learning (ACTIVE); carrier credit, legal construction (PARKED) | Tries every legal move for one entry and keeps it only if the score strictly improves. A full run accepts about 130 to 410 moves |
| Runtime | Runs the finished model | D11 integer serving (ACTIVE); R4G1 graph (PARKED) | Runs in a browser with no multiply instruction in 7 of 7 serving functions (measurement, record) |
Sources: the mechanism board slot map and the audit's stitching map (synthesis, section 1), which cite each record. The move counts are from the K16 outcome (130, 129, 407 and 410 accepted moves).
One status is disputed. The board keeps D11 integer serving as ACTIVE, as its own page says, but the audit would call it READY, because no lawful model has been exported through it yet (mechanism board, contradictions).
The two gaps
Gap 1: position. A transformer adds a signal that says where each token sits in the sequence. No UOR-R4 mechanism is assigned to this job, and no lawful evidence exists for one. The current model keeps the most recent tokens in order at the leaves of a small tree, so order is present in its layout, but nothing is learned about it (the model page). The nearest result is about carrying a running state by quaternion rotation. It beat no rotation by 0.071 and 0.077 nats (a nat is a unit of prediction error; lower is better), but in a model that still used softmax attention, a sigmoid gate and dense layers, with 332,928 fewer parameters in the comparison arm (transport record). So "rotation can carry order" is a hypothesis.
Gap 2: normalization. A transformer rescales its signals between layers so they stay in a workable range. UOR-R4 has no designed mechanism for this. Snapping each block back to one of its fixed lattice points might play that role, but no record says so or tests it (mechanism board). This is also a hypothesis.
What "replaces" does not mean yet
Having a replacement on paper is not the same as having a working model:
- No replacement has matched its transformer part on quality. Every attention-style read that learned well in the older decimal experiments had help from softmax during training, and the best softmax-free read was rejected (softmax-free read; audit synthesis (
docs/labs/repo-renormalization-2026-10-19/audit/synthesis.md), section 1). - No two parts have been trained together except on the current discrete path. That path has no feed-forward layer and no position mechanism, and it scores below a table of word counts (measurement, K16 outcome).
- Several other things are not built: using an exact address as the read, any consumer of the object store, an exporter that turns a trained model into a D11 file, and an output step that avoids scanning the whole vocabulary (audit synthesis, section 1).
The project does not compare its models against transformers. It compares them against count tables and earlier geometric models, and grades them with fixed, deterministic checks (charter, sections 3.10 and 4.4).
Where it stands
| Measure | Value | Source |
|---|---|---|
| Mechanisms | 27: 10 ACTIVE, 4 READY, 13 PARKED | mechanism board |
| Transformer parts with no mechanism | 2: position, normalization | mechanism board slot map |
| READY parts never trained in | Hamilton gate, recurrence gates, SpiralCore/FBS (decimal form), object store | mechanism board |
| Parts trained together | Only the discrete path: tokenizer, codebook or cells, reads, admission, hinge, discrete learning | the model page |
| Best trained result vs count tables | 65 and 463 vs 1,226 and 6,300, of 14,287 | K16 outcome, count tables |
Go deeper
- What UOR-R4 is and where we are.
- The model, end to end: the current pipeline stage by stage.
- Mechanism board: one page per mechanism, with reopen conditions for PARKED ones.
- Geometry: the mathematics behind the replacements.
- Open questions and the history of how each part was tried.
Where UOR-R4 is today
In one paragraph. UOR-R4 is pre-alpha. None of its 8 milestones is complete, and no model built under its rules holds a conversation (STATUS, NOW). Many of the parts work on their own: a whole-number model path on the graphics card, three ways of reading earlier text, one shared word table, a whole-number engine that runs in a browser, and an exact storage system. But the best model trained so far guesses the next piece of text correctly far less often than two very simple tables of word counts. Nobody yet knows why. This page lists what works, what does not, and the measured numbers, each with its source.
Correct first guesses out of 14,287 test positions. The trained model is far below both count tables, and the new M1 bar sits at the higher table.
Terms are in the glossary. Claims are labelled proof, measurement or hypothesis (docs/formal_vocabulary.md). A passing check shows that code does what it says. It is not a trained capability, and NOT_RUN never means passed.
How the model is scored
The test set is 14,287 positions in 400 held-out documents, called the DEV panel (count tables record). At each position the model makes one guess for the next token. A top-1 score counts how many of those guesses are right.
Two plain tables, built from the same training text the model sees, set the floor:
- The unigram table always guesses the single most common token. It scores 1,226 (measurement).
- The next-word table (called T2) looks only at the previous token and guesses the token that most often followed it in training. It scores 6,300 (measurement).
Both come from the count tables record. A model that cannot beat them has not yet learned anything a lookup table cannot do. The project compares against these tables, not against transformers (charter, section 3.10).
What works
These parts are built and pass their checks. None of them is a language result. (A read is the step that looks back at earlier text; reach is how many test positions have the right answer among the candidates the model opens at all.)
| Part | What the evidence shows | Label | Source |
|---|---|---|---|
| Whole-number model path on the GPU | The discrete model computes with integers only and passes 25 of 25 fixed GPU construction checks, plus 7 of 7 parity checks | measurement | K16 qualification |
| Reads of earlier text | Route and Flock pass the 25 GPU checks; Relation passes 9 of 9 | measurement | driver record, K16 qualification |
| One shared word table (the writer) | The same table encodes the input, carries memory and ranks the output. Four training runs each completed all 16,404 batches | measurement | K16 outcome |
| Distinct starting codes | PrimeZeta gives all 4,096 tokens distinct addresses | measurement | construction |
| Address-structured cells | At zero training, 1,351 of 3,847 copy targets are reachable, against 127 before | measurement | pre-flight |
| Whole-number serving engine (D11) | 165 tests pass. In the browser build, 7 of 7 serving functions contain no multiply, divide or decimal instruction. A saved session reloads identically, on a synthetic stand-in model | measurement | WASM runtime record |
| Exact storage (object store) | 20 integration tests pass in the delivery record (60 after later peer and fleet work), and a client conformance check pulls 262,144 bytes back byte-identical | measurement | object store, conformance |
What does not work yet
No model holds a conversation (STATUS). The detail:
The best trained model is below both count tables. The last full experiment (called K16) trained two variants of the model, each on two random seeds, for 16,404 batches (K16 outcome; all measurement):
| Variant | Seed | Correct first guesses | Reach: positions where the right answer was among the candidates opened | Cells in use (of 256) |
|---|---|---|---|---|
| A (nearest-address margin) | 1 | 65 | 2,237 | 209 |
| A | 2 | 463 | 3,167 | 192 |
| R (occupied-cell rank) | 1 | 101 | 12,089 | 20 |
| R | 2 | 230 | 12,466 | 19 |
Variant A is the one the record selects. Its reach fell below the required 4,894 positions on both seeds. Variant R kept a high reach only by collapsing into 19 or 20 cells, so that each guess was drawn from about 3,400 of the 4,096 tokens, nearly the whole vocabulary; that reach is not real discrimination. The registered verdict was an occupancy collapse (record code OCCUPANCY_COLLAPSE_TRIGGERED), and no run was kept. All four miss the run's own top-1 bar of 1,941 and are far below the next-word table's 6,300. The large gap between seeds (65 against 463) also shows how noisy one run is.
The cause is not established. The first guess was that too few distinct starting vectors were to blame. That is ruled out as the main cause: in variant A, training raised the distinct vectors from 16 to about 275, yet top-1 stayed low (K16 outcome, census section). The candidates still open are:
- The address key may be too coarse. The key is the distance that orders the drawers. It uses only the first and last block and takes only 5 values (0, 4, 8, 12 or 16) to order up to 256 cells (proof, from the kernel source), so which drawers open is largely decided by their arbitrary numbering (the model page, chief architect's review §3.2). Whether this causes the low score is a hypothesis.
- The read, the ranking capacity, or the training schedule. One full run sees fewer than half of the training targets: 1,049,856 of 2,425,925 (measurement, audit dossier). These remain hypotheses.
The newest run stopped early. The address-cell run (A8) began with the better reach above, but training eroded it. At its first checkpoint the Relation read held 551 reachable positions, below half its starting 1,351, which triggered the registered stop (the control held 857; measurement, A8 dose). A version that protects the reach is built; its GPU qualification is NOT_RUN (controller record).
No model trained under today's rules has been exported or timed. No exporter turns a trained discrete model into a D11 file (the older float stacks were exported and served in October), and tokens per second for this model have never been measured (lut-serving).
Parts are missing. The current model has no position mechanism, no normalization and no feed-forward layer (transformer vs geometry).
Training is on hold. Each training run needs a reviewed one-page plan and a release typed by the owner personally (charter, section 5).
What about the older models?
Before October, the project trained a decimal-number model called the geometric stack, from 7 million to 214 million parameters. Four 214-million-parameter checkpoints are published on Hugging Face as historical evidence. Their chat versions (which predate today's rules) could rewrite and summarise, while code and arithmetic were wrong (audit dossier, from the model card). That stack used softmax, the SiLU activation (a smooth squashing curve) and matrix multiplication; geometry was about 0.05% of its arithmetic. Served through the integer engine, its best version (19.9 million parameters) reached 0.933 bits per byte and the charted versions 1.20 to 1.24, all missing the old M1 bar of 0.90 (D11 serving record; audit dossier). It breaks today's rules and is PARKED (geometric stack). It shows the project can train a model that writes text. It does not show that the geometric replacements can.
How the project got here
Between 12 and 19 October the owner (project lead Casey Allard) made 19 decisions, several of which rebuilt the model's foundations: no softmax anywhere, no matrix multiplication, GPU-only research compute, whole numbers on the active path. Much of that week went into rebuilding and checking rather than learning. In the week of 12 to 18 October, 34 of 309 records were results; the rest were tooling, plans and reviews, part of it ordered by those decisions. Five training runs on the new discrete path followed, and none produced a kept result (audit synthesis, section 3). The history has the long story.
Where it stands
| Measure | Value | Source |
|---|---|---|
| Milestones complete | 0 of 8 | STATUS |
| Model that holds a conversation | None | STATUS |
| Best top-1 on DEV, trained model | 65 and 463 of 14,287 | K16 outcome |
| Unigram table / next-word table | 1,226 / 6,300 of 14,287 | count tables |
| Model trained under today's rules, exported to D11 | None | lut-serving |
| Tokens per second, current model | Not measured | lut-serving |
| Training | Held; each run is released by the owner | charter section 5 |
Go deeper
- Where we're going: the milestones and the shortest path from here.
- The model, end to end and training.
- Open questions: what is unknown and what would settle it.
- Records: K16 outcome, A8 dose, count tables.
- The live plan: NOW.
Where UOR-R4 is going
In one paragraph. The goal is a fast language model that runs on your own laptop or in your browser, holds a conversation with a durable memory, and later reasons and writes code, all on the geometric path with no transformer. The project marks progress with eight milestones, M1 to M8. None is complete yet. On 19 October 2026 the owner set a plain first bar: the model must beat two simple word-count tables, on each of two seeds, through its whole-number export. This page explains the milestones in plain words, the shortest credible path from today to a first simple conversation, and the three products at the end. The path is a plan, not a promise. Every training step still needs the owner's release, and the central question, whether a softmax-free model can learn to rank words well, is unanswered.
The road from today to the products. Stage 0 is where the project stands. Each gate needs an owner release.
Terms are in the glossary. Labels are proof, measurement or hypothesis (docs/formal_vocabulary.md).
The eight milestones in plain words
| Milestone | In plain words | Status | Issue | |
|---|---|---|---|---|
| M1 | Language base | A trained model that predicts the next piece of text better than simple count tables | Open; nothing passes yet | #2029 |
| M2 | Grounded reply from exact memory | Answer a question from facts stored earlier, on saved and fresh questions | Held | #2030 |
| M3 | Durable conversation memory | Remember across sessions and stay grounded in what was stored | Paused | #2031 |
| M4 | One served model | One model, exported as a whole-number file under D11 (the whole-number serving contract), usable from the command line, with held-out quality at or below 0.90 bits per byte | Held | #2032 |
| M5 | Laptop cost | Measured energy per token, memory use and tokens per second on an M1-class laptop | Not started | #2033 |
| M6 | Reasoning and coding | Working reasoning and coding on the same model | Not started | #2034 |
| M7 | API, browser and Studio | The model reachable through an API, in the browser, and in the Studio interface, giving bit-identical tokens across library, command line and browser | Engine delivered; no model to load | #2035 |
| M8 | Alpha release | One versioned, checksummed model file, declared alpha by the owner | Not started | #2036 |
Statuses are from the ROADMAP table, which states each bar in full. A milestone closes only when its bar is met on a saved model.
The new M1 bar
M1 closes when one saved discrete model passes five conditions (charter, section 4.8; D39, item 1):
- (a) Starting reach. Before training, the right answer is among the candidates the model opens (its "reach") at no fewer than 4,894 of the 14,287 test positions (the gate called G-Pre; the "G-" names are gate codes from D39).
- (b) Reach kept. That reach survives training, on both seeds (G-Adm).
- (c) Real spread. More than 16 of the 256 word cells (the "drawers" of words) are in use, plus the further occupancy condition in D39 (G-Occ).
- (d) Beat the count tables (new, 19 October). Whole-number top-1, measured through the D11 export, beats both the unigram table (1,226 of 14,287) and the next-word table (6,300 of 14,287) on the same test panel, on each of two seeds, with tokens per second reported. This replaces the earlier bar of 0.90 bits per byte, which the current model cannot be scored on because its loss gives no probabilities. Bits per byte returns at a later milestone.
- (e) Fresh transfer. The gain holds on a fresh, sealed test panel registered in advance.
For scale: the best trained model today scores 65 and 463 (measurement, where we are). The gap to 6,300 is large.
The shortest path to a first conversation
The audit of 19 October laid out the shortest credible path as six stages (audit synthesis, section 4). It is a proposal. The stage order follows the owner's fixed sequence in D39 item 4; changing it is the owner's decision.
Stage 0. Run what is already FIT'd. A capacity test (called W2, about $0.91) is FIT-reviewed and queued, awaiting an owner release (NOW, row 6). "Capacity" here means how many different words the addresses can tell apart. W2 decides whether the shortfall comes from the representation (the addresses cannot tell enough words apart) or the learning law (the training method cannot find good addresses). Next comes the rerun of the address-cell model with its reach protected (controller record). Decides: fix the addresses, or move on to Stage 2.
Stage 1. Make the capacity measurable. Replace the coarse address key (today it can take only 5 different values, so it barely separates the drawers) with one that uses the whole vector, and measure it before any training. A wider code is optional and needs new GPU code. Bar: enough distinct vectors that the number of positions still winnable clears the run bar of 1,941, and a starting reach above the address-cell model's 1,351 of 3,847.
Stage 2. Pick the learning law. First a faster discrete method that scores 16 coordinates at once (called BVG-K; its first stage is qualified), at about $12 for two seeds. Only if Stage 0 blames the learning law and BVG-K fails: one decimal-training run in a separate module, at about $5 to $10 plus build work. Decimal numbers are allowed in offline training only; the shipped file stays whole-number (charter, section 3.7). Bar: beat the unigram table, then the admission-matched next-word table (the version W2 produces, not the 6,300 full-panel table), on two seeds.
Stage 3. Add the missing parts. Build a trunk with a feed-forward layer (the Hamilton gate), a recurrence with quaternion rotation, and the Flock and Relation reads. None of these has been trained together, and the only supporting evidence is weak, so this stage is a hypothesis test, not reuse of proven parts. Scale and data are also open: no trained stack has used the 1.39-billion-token chat corpus the project assembled (UOR-Foundation/uor-r4#1660). Bar: beat Stage 2's best by more than the seed-to-seed noise, with a fresh-panel number.
Stage 4. Export and serve. Write the missing exporter that turns a trained model into a D11 file, then measure the export gap and tokens per second on a laptop. Bar: the integer audits stay green, the gap stays within the noise band, and tokens per second is reported for both reading the prompt and writing the reply. This is where M1's bar (d) and M4 are tested.
Stage 5. First simple conversation. Train on fixed example answers produced once by a donor model (not yet generated), as the owner's one-time exception D41 allows: the student sees only the answers, never the donor's probabilities. Ground replies in the exact memory and the object store. Bar: M2's bar, at least 256 of 512 saved questions and at least 40% of fresh ones, graded by fixed deterministic checks.
Binding conditions on every stage. Training is held until the owner releases each reviewed plan, and the owner types each release personally (charter, section 5). M1 can only be closed by a whole-number-trained ("discrete") model, so if Stages 3 and 4 use a trunk (the main body of the network) trained with decimals, the owner must first redefine the milestone. Under D41, the Stage 5 student stays on the discrete path unless the owner decides otherwise (audit synthesis, section 4).
What the audit proposes to stop: rerunning the old starting table (built from a fixed random seed) that gives at most 16 distinct vectors; tuning admission objectives on the 5-value key; and reading much into any run that loses to the two count tables.
After the first conversation
Stages 0 to 5 aim at M1, M4 and M2; M3 is not yet staged. The rest of the road is:
- M5: measure the real cost on an M1-class laptop: energy per token, memory and tokens per second. An integer path is not an efficiency result until it is measured (charter, section 3.9, "Efficiency is measured").
- M6: add reasoning and coding to the same model. Exact arithmetic is the visible gap.
- M7: make the browser worker, the command line and the Rust library give identical tokens.
- M8: the owner declares an alpha release.
The products at the end
The owner defined three products on 19 October (charter, section 2; products):
| Product | What it will be | What exists today |
|---|---|---|
| The model | One whole-number model file, built in crates/uor-r4-discrete and served by crates/uor-r4-integer | The serving engine, tested on a synthetic stand-in. No trained model to put in it |
| Web client | The Studio in your browser, running the model on your own device in WebAssembly | The Studio page and the browser engine, not yet connected. Website deploys are paused |
| Desktop client | A Tauri app sharing the web interface, running the model natively, with durable memory and offline use on M1-class laptops | A written specification only |
Nothing ships until a trained model passes M1 to M8. Running the finished model on your own computer or in your browser is the product, and the rule that research compute must use a GPU does not apply to it (charter, section 3.6).
The biggest unknown
Every read that learned well in the older experiments had help from softmax during training, and the best softmax-free read was rejected (softmax-free read). Whether a lawful read can learn to rank words without it is a hypothesis, and no amount of assembly answers it before Stage 2 runs (open questions).
Where it stands
| Item | State | Source |
|---|---|---|
| Milestones complete | 0 of 8 | STATUS |
| M1 bar | Beat 1,226 and 6,300 through the D11 export, two seeds, tokens per second reported | charter 4.8 |
| Current stage | Stage 0: W2 FIT'd and queued, awaiting an owner release; address-cell rerun built, its qualification NOT_RUN | NOW |
| Stages needing new build work | 1 (wider code, optional), 3, 4 | audit synthesis, section 4 |
| Products shipped | None | products |
Go deeper
- Where we are: the measured starting point.
- Transformer vs geometry: which parts exist and which are missing.
- NOW: the live one-page plan, and ROADMAP for milestone detail.
- Products: the model, the web client and the desktop client.
- Charter: the rules every stage must follow.
Frequently asked questions
In one paragraph. These are the questions newcomers and would-be contributors ask most often, answered plainly. The short version: UOR-R4 is a pre-alpha research project that tries to build a fast language model out of geometry instead of a transformer's expensive arithmetic. Parts of it are built and tested. No model it has trained holds a useful conversation yet, and the best one so far predicts the next word worse than a simple table of word counts (STATUS). Words in the answers are defined in the glossary.
flowchart TD
S["You arrive"] --> Q{"What do you want?"}
Q -- "Understand it" --> U["What is UOR-R4<br/>Transformer vs geometry"]
Q -- "See how far it got" --> W["Where we are<br/>Where we're going"]
Q -- "Run or chat with it" --> R["Section: Running it<br/>(no chat model yet)"]
Q -- "Help build it" --> C["Section: Contributing<br/>CONTRIBUTING.md and NOW.md"]
Q -- "Read the old work" --> A["Section: Records<br/>archive/ and the catalog"]
Which section of this page to read first.
Claims are labelled proof (follows from definitions or code), measurement (from a recorded run) or hypothesis (untested), as in docs/formal_vocabulary.md. NOT_RUN means a test was planned and never executed. It is not a pass.
The basics
1. What is UOR-R4, in plain words?
It is an open research project that asks one question: can a language model run on an ordinary laptop or in a browser if its core arithmetic is geometry (rotations, exact whole-number addresses built from primes, lookup tables) instead of the huge decimal multiplications inside today's chat AIs? The project is pre-alpha and the answer is not known yet. See what UOR-R4 is and the charter, section 1.
2. Is this a transformer?
No, by design. The charter says the project is "not a transformer" (section 1), bans matrix multiplication (section 3.3) and excludes "a dense model disguised as lookup tables" from serving (section 3.6) (charter). The current model (crates/uor-r4-discrete) reads earlier words with three bounded reads (Route, Flock, Relation) and has no feed-forward block at all. But be careful with the history: the project's older float models (7 million to 214 million parameters) used softmax, matrix multiplication and a SiLU activation (a smooth squashing curve), so they did not follow today's rules (measurement, geometric stack). The comparison page is transformer vs geometry.
3. Does it work yet?
No. Zero of the eight milestones are complete (STATUS). What works is the parts: for example the integer substrate passes 25 of 25 admitted GPU construction controls (measurement, K16 qualification), and the whole-number serving engine runs in a browser and contains no multiply, divide or decimal instruction in 7 of 7 serving functions (measurement, WASM record). Passing a control is not a language result. No two replacements have been trained together into a model that beats the count tables (open questions).
4. How good is the best model so far?
Not good. On 14,287 development rows, the best trained arm (K16-A) got its first guess right 65 and 463 times on its two seeds. A table of overall word counts gets 1,226, and a table that looks up the last word and returns its most common successor gets 6,300 (measurement, K16 outcome, count tables). The model has to beat both tables before the first milestone can close (charter, section 4.8).
5. Why does it lose to a count table? Do you know the cause?
The cause is not established. One early suspect, that too few distinct starting vectors capped the score, was tested and did not explain it: training broke much of the aliasing and the score stayed low (K16 outcome). The open candidates are how well the output step can rank, the read, the address key (it takes only 5 values to order up to 256 cells, a proof from the kernel source in the architect's audit; whether that causes the low score is a hypothesis) and the training schedule (one pass sees under half the training targets). The next test, W2 (FIT-reviewed and queued, awaiting an owner release), decides whether the wall is the representation or the learning law (open questions).
6. Will it reach frontier capability?
That is the goal, in the owner's words "almost frontier level capability" on a laptop (charter, section 1). It is a hypothesis. Nothing measured so far supports or refutes it, and the data and model scale needed are not established. The shortest planned path is in where we're going.
The rules
7. Why no softmax?
The owner's reason is cost, not taste: "to ban expensive operations" (charter, section 1). Softmax turns scores into probabilities with exponentials and a sum over everything, and it hides a dense global normalisation. The charter bans it, and every softmax-like function, in the model, its training, its comparators and any renamed or table form (section 3.2). The price is real: every earlier read that learned a ranking had softmax helping it somewhere in training, and the best softmax-free read was a recorded REJECT, 0.0172 bits per byte worse and 15% slower (measurement, open questions, record). Whether a softmax-free read can learn ranking at all is the project's biggest open question.
8. Why no matrix multiplication?
Matrix multiplication is nearly all of a transformer's arithmetic, so removing it is the point of the project (charter, section 3.3). A geometric feed-forward block, such as the Hamilton gate, is allowed. A dense one is not. One mechanism, spin-native weights, matched a dense model's score but only by running a dense block multiplication, so it is PARKED.
9. Why use GPUs for research but laptops for serving?
They are different jobs. Research compute (training, evaluation, qualification) must run on the GPU, because host runs gave wrong timing and wrong evidence, and spending GPU only where a run can change a decision keeps costs down (charter, section 3.5). The finished model, though, is meant to run on the user's own device: serving the exported integer file on a laptop CPU, in a browser or on Apple silicon is the product, and the GPU-only rule does not apply to it (section 3.6). Scoring an exported model for a milestone still counts as research compute.
10. Why can training use decimals when serving cannot?
Decimals train faster, and only the shipped file has to be integer (charter, section 3.7, from decision D37). Any float-trained candidate must report its export gap, the quality lost when it is snapped to whole numbers, and a gap above the noise band disqualifies it. The current discrete model avoids the question because it is integer from end to end. See serving and export.
11. Why primes, zeta zeros, E8 and quaternions? Do they actually help?
The owner's rule is "use geometry", because the bet is that exact geometry can replace dense arithmetic (charter, section 1). What has been shown is narrow. An injective code is possible by counting (\(16^4 = 65{,}536 \ge 4{,}096\), proof), and the PrimeZeta construction gives all 4,096 tokens distinct vectors (measurement). The address-structured table reached 1,351 of 3,847 targets at zero training, against 127 for the plain PrimeZeta start (measurement). But no run has shown that any geometric choice beats a plain alternative on language. Architectural priority is not measured advantage. See the geometry chapters.
12. Why so much process? What is a FIT sheet?
A pre-registration sheet is a one-page plan written before a run: the bar, the noise, the controls, the seeds, the cost and what each outcome decides. A FIT review is a check by someone other than the author that the test can answer its question. The project added this because early results kept turning out to be measurement artefacts (what the project knows). It also overdid it: in the week of 12 to 18 October only 11% of recorded lab work was a model result (measurement, history). Since 19 October a sheet is required only before GPU training or evaluation and before any run a milestone claim rests on (the rules).
Running it
13. Can I run it?
You can build it and run its checks, but you cannot chat with it, because no model trained under today's rules has been exported to the serving engine. From a clone, with the pinned Rust toolchain, the README's commands are cargo check --locked -p uor-r4-discrete --lib and cargo test --locked -p uor-r4-discrete --lib. These execute no model (README). Training needs CUDA GPUs rented through the project's tools and a personal release by the owner for each run (training).
14. Is there a web or desktop app?
Not one you can use. The web client is meant to be a local model in a browser tab, and the desktop client a Tauri app with durable memory. Today the Studio interface and a WebAssembly build of the engine exist separately, the Studio still imports an older engine, and the desktop app is a specification only (products, web client, desktop client).
15. What about the models on Hugging Face?
Four 214 million parameter checkpoints are public, but they are historical: trained before the no-softmax and no-matrix-multiplication rules, in the float form, and not the served model. Their chat variants rewrite and summarise usably, while code and arithmetic are wrong (data and tokenizer, README).
16. How fast is it? How much does it cost to train?
Tokens per second is the project's lead metric, and it has never been measured for the current model (charter, section 1; lut-serving). For cost, the audit quotes the K16 runs at "1.2 h ($2)", the chief architect's figure (section 7 of the architect audit), that is about 1.2 hours and $2 for all four K16 runs together. Spending is capped at 4 rented pods and $8 an hour across all labs (charter, section 5.4). These are estimates, not invoices.
Contributing
17. How can I contribute?
Start with the one-page plan, NOW.md, then CONTRIBUTING.md. Model work on the first four milestones is gated and owned by the labs. Work that is genuinely open to outsiders includes documentation and claim-wording fixes, reproducing a published negative result, and tooling that does not touch the model path. Post a short comment on the owning issue saying what you will do, work on a short branch, and open a pull request that says References #N. A maintainer runs the project's gates for you (CONTRIBUTING).
18. What are the labs, and who decides?
A lab is any contributor, human or AI, working under the charter. Labs so far include Claude, Codex and DeepSeek, with Kimi in the project-manager seat. The owner, Casey, decides the charter, the constraints, holds, spending, milestone bars and exceptions, and types every run release personally. The project manager sequences work, and labs choose tasks from NOW.md. Subagents review and test but never make critical decisions. See the rules.
19. What do ACTIVE, READY and PARKED mean? Is PARKED dead?
The three statuses describe how far a mechanism has got. ACTIVE is on the current model path, READY is built and tested but not yet trained in, and PARKED means the tested forms failed or broke a rule. PARKED is not dead: owner decision D22 says a negative closes one tested configuration, never a mechanism, and each PARKED page lists what would reopen it. Of 27 mechanisms, 10 are ACTIVE, 4 READY and 13 PARKED. See the mechanism board.
Records
20. Where is the old research?
Nothing was deleted. Dated records from before 18 October moved unchanged into archive/, and a generated catalog lists them: archive/CATALOG.md. The story of what was tried is in how the project got here, the distilled lessons in what the project knows, and one page per research line in the notebooks and lines. The pre-charter rulebook is preserved in archive/integration/DECISIONS-2026-10-19.md.
21. What happened to the 437 of 512 and the 0.877 results I may have seen?
Both are old and narrow. The 437 of 512 replies were later judged to be panel fitting, and they fell to 0 of 128 on opened transfer rows (a genuinely fresh test has not run) (native geometric engine). The 0.877 bits per byte was a float score on one 19.9 million parameter stack that used softmax and matrix multiplication; served through the integer engine it scored 0.933 against a 0.90 bar, and the two numbers were not measured on the same windows (serving and export). Neither is a result of the current model.
22. What is in projects/?
Seven side projects that are related to UOR-R4 but are not on the model's training or serving path, such as the SpiralCore network transport and a Lean proof scaffold. None of them is evidence that the model works. See projects/README.md.
23. Who is behind it, and what is the licence?
The citation file names Casey Allard and the UOR Foundation as authors, and the project is released under the MIT licence (CITATION.cff, LICENSE).
24. How do I know the claims in these pages are honest?
Every number on a page is linked to a repository path, a pull request or an audit file. Each claim is labelled proof, measurement or hypothesis, and the repository runs a claim-wording check (cargo run -q --locked -p uor-r4-claim-wording -- .) that rejects strong proof wording unless the same line links a proof or certificate. If you find a claim that is wrong or unsourced, open an issue; that is a welcome contribution.
Go deeper
- What is UOR-R4 and transformer vs geometry.
- Where we are and where we're going.
- Glossary: every term used here.
- The rules in plain language and the charter.
- Open questions: what is still unknown.
Glossary
In one paragraph. UOR-R4 uses a lot of words that come from three places: language models (token, softmax, BPB), geometry (quaternion, E8, icosian) and the project's own rulebook (FIT, KEEP, PARKED). This page defines each one in a sentence or two and links to the page that explains it properly. Words are in alphabetical order. If you meet a code name such as K16 or A8 in a record, look for it here too. The project is pre-alpha: 0 of its 8 milestones are complete and no model holds a useful conversation yet (STATUS).
flowchart LR
subgraph model["The model, in the order text flows through it"]
direction LR
T["Text"] --> TK["Tokens<br/>(tokenizer, BPE)"]
TK --> AD["Address<br/>(codebook, E8, prime)"]
AD --> RD["Read<br/>(Route, Flock, Relation)"]
RD --> AM["Admission<br/>and writer"]
AM --> NX["Next token<br/>(top-1)"]
LS["Loss and learning<br/>(hinge, counterfactual move)"] -.-> AD
NX --> EX["Export<br/>(UORLUT01, export gap)"]
EX --> SV["Serving<br/>(D11, WASM, tokens/s)"]
end
subgraph rules["How the work is judged"]
direction LR
CH["Charter and D-entries"] --> FT["FIT sheet"]
FT --> RL["Owner release"]
RL --> NB["Notebook row<br/>(KEEP, PARKED)"]
end
Where each family of terms sits. The top row is the path of one prediction. The bottom row is how a piece of work is approved, run and recorded.
How to read this page
- A word in bold at the start of an entry is the term. "See" points to the entry that holds the definition.
- Claims are labelled proof (follows from definitions or code), measurement (from a recorded run) or hypothesis (an untested idea), as in
docs/formal_vocabulary.md. - Numbers come from the linked page, which cites its own source.
NOT_RUNmeans a test was planned and never executed. It is not a pass.
Jump to: A · B · C · D · E · F · H · I · K · L · M · N · O · P · Q · R · S · T · U · V · W · Z
A
A8. The nickname of the address-structured cells table, the starting table of the current model, and of the training run that began from it. At zero training it let the reader reach 1,351 of 3,847 copy-successor targets, against 127 for the plain PrimeZeta start (measurement). Learning then eroded that gain, and the first training run stopped at its first checkpoint. See address cells.
ACTIVE. A mechanism status: the mechanism is on the current model path. See mechanism status.
Address. A token's place in the model. It is 4 blocks of 8 whole numbers, and each block is one of 16 fixed points of the E8 lattice. Exact token identity is kept separately from this geometric address. (A token's prime address, defined below, is a different thing: its exact name as a prime number.) See the model, end to end.
Admission. The shortlist step before the model picks a word. The 4,096 words sit in 256 cells, and the model opens only the few cells nearest to what its read points at. A word in an unopened cell can never be chosen, so admission caps everything before it (proof, by construction). See admission.
Artifact. A saved model file together with the data, seed, settings and parameters that made it. The charter requires every artifact to bind all of these. See charter, section 3.12.
Attention. The step in which a language model decides which earlier words matter. A transformer compares the newest word with every earlier word. UOR-R4 replaces it with three cheaper reads: Route, Flock and Relation. See transformer vs geometry.
B
Bar. A pass line that is fixed before a run, so the result cannot be bent to fit afterwards. Bars are never narrower than the measured noise. See the rules.
BPB (bits per byte). A score of how well a model predicts text: the average number of bits it needs for each byte. Lower is better. The older milestone bars use it (M4 asks for 0.90 or less). The current discrete model has no probabilities, so it cannot produce BPB, and on 19 October the owner replaced M1's BPB bar with a top-1 comparison. See rank-margin and charter, section 4.8.
BPE (byte-pair encoding). The way the tokenizer builds its pieces. It starts from the 256 single bytes and repeatedly glues the most common neighbouring pair into a new piece. The pinned tokenizer has 4,096 pieces: 3 special ones, 256 bytes and 3,837 merges. See tokenizer and data and tokenizer.
BVG-K (batched verified coordinates). A faster version of the learning step. It scores K table entries in one GPU launch and commits them together only if their joint loss beats the best single move. Scoring was about 16 times faster at K=16 (measurement), but it has never run as a learning law. See training.
C
Carrier. The small integer block the model passes along: 8 whole numbers drawn from a 16-root orbit of E8, moved by 64 exact signed actions. Four carriers make one token's vector. See SpiralCore and architecture.
Cell. One of the 256 drawers that admission opens. A word's cell is the pair of roots of its first and last block, so the grid is 16 by 16 and each cell starts with 16 words (training can move words between cells). See admission.
Charter. The project's short rulebook, adopted by the owner on 19 October 2026. It replaced the older stack of instructions and numbered decisions. Only the owner changes it. See CHARTER.md and the rules in plain language.
Codebook. The table that gives each of the 4,096 tokens its starting vector. In the current model it is built by a fixed recipe, not drawn at random: see PrimeZeta and A8. See data and tokenizer and architecture.
Control. A run identical to the one being tested except for the one thing under test. Controls here must be lawful non-neural baselines, such as count tables. See the rules.
Counterfactual move. One step of learning. The machine picks one table entry and tries all 16 of its legal states (staying put plus 15 rotations), counts the mistakes after each on a batch of 64 examples, and keeps the best only if it strictly beats staying put. There are no gradients. See discrete learning and training.
D
D-entries (D11, D22, D37 and the rest). Numbered owner decisions, from D0 to D41, that used to be the project's rulebook. The charter now holds the rules that still bind, and the decision map says what became of each decision. The ones you will meet most are D11, D22 and D37.
D11. The serving contract: the finished model runs with whole numbers only. It has five rules. Two of them are that the served program uses no floating point and no multiply or divide instruction. See serving and export.
D19 object store. A store that keeps bytes exactly, in a tree of fingerprinted pieces, so repeats are stored once and any range can be checked. It is built and tested (20 integration tests pass in the delivery record, 60 after later work), but no model uses it yet. See object store.
D22. The owner's rule that a negative result closes one tested configuration, never a mechanism. Stopping a mechanism needs the owner. This is why no mechanism has a "retired" status. See the rules and decision map.
D24. The owner's rule of 12 October 2026 that no model compute runs on the CPU: training, evaluation and every research measurement of the model are GPU work. Serving the exported D11 integer artifact on a client device is the product, not research compute (charter 3.6). See the rules.
D37. The owner's rule of 18 October that floating point is legal in offline training. Softmax-like functions and matrix multiplication stay banned, and every float-trained candidate must report its export gap. See training.
DEV panel. The set of 14,287 development rows used to score models while they are being designed. A model's first guess is right on some number of them (see top-1). The "fresh" panel is a separate sealed set, scored once after the design is chosen. See K16 outcome.
Diagnostic stop. A run ended early on purpose, by a stop rule written down beforehand, so the cause can be found. It is not a negative result and not a failure of the mechanism. See research notebooks.
E
E8. A famous lattice in eight dimensions with 240 "root" points. The project builds a pairing of the 120 icosians with a golden-ratio-scaled copy of themselves and gets these 240 roots. The current model uses only a 16-root piece of E8, not all 240. See E8, H4 and the 600-cell.
Embedding. In a transformer, the learned list of decimals that stands for each token. UOR-R4's counterpart is the constructed integer codebook. See PrimeZeta.
Exact memory. The idea of writing a fact once under an exact name (a prime-based address) and reading it back exactly, instead of smearing it across weights. The trained forms tested so far missed their bars, so the mechanism is PARKED. See exact memory.
Export gap. The quality lost when a model trained with decimals is snapped into the whole-number file that ships. It is the served score minus the float score on the same evaluator. A float candidate whose gap exceeds the two-seed noise band is disqualified. Nobody has measured it for a model built under today's rules, because none has been exported. See serving and export.
F
FBS. The project's name for the three-branch tree that holds earlier words in order. The tree is built by SpiralCore and gives the context at most 243 positions (\(3^5\)). See SpiralCore and SpiralCore/FBS projection.
FIT (TEST FITNESS: FIT). The verdict of a review, by someone other than the author, that a pre-registered test is fit to answer its question. A fresh-context subagent counts as a non-author. A FIT releases nothing by itself: the owner still has to release the run. See the rules and training.
Float. Decimal (floating-point) arithmetic. Allowed in offline training under D37, never in the served model. See serving and export.
Flock read. An attention replacement modelled on a starling flock. The model picks about seven of the nearest earlier positions, rotates what each knows into its own point of view, and moves toward their consensus. Nothing is normalised and no weight is multiplied. It runs inside every Relation run, but its own value has never been isolated. See Flock read.
Fresh panel. Rows that were never seen during design and stay sealed until a run is registered to score them. Every development gain must also report a fresh number. See the rules.
H
H4. The symmetry group of the 600-cell, a regular solid in four dimensions. Its 120 roots are the icosians. See E8, H4 and the 600-cell.
Hamilton gate. A gate for a feed-forward layer that turns the gate signal into a rotation in four dimensions and rotates the value by it, so no sigmoid is needed. A rotation keeps a vector's length, so the gate steers a signal rather than switching it off. It is built and tested (READY), and has never been trained. See Hamilton gate.
Hamming distance. The number of positions at which two bit strings differ. It costs one XOR and one bit count. The model uses it as a tie-break inside its reads. See VSA and Hamming distance.
Hinge loss. A loss that asks only whether the right answer beats its strongest rivals by a fixed gap. If it does, the loss is zero. If not, the loss is the shortfall. It needs no probabilities. The live version is an integer hinge. See rank-margin.
Hold. An owner order that stops a kind of work until the owner lifts it. Training, the second milestone's training and rental, and Stage B are all on hold. A FIT review lifts none of them. See charter, section 5.1.
Hopf map. A map that takes a point on a four-dimensional sphere (a unit quaternion) to a point on an ordinary sphere. It forgets one angle, called the fibre, so many states cast the same shadow. The kept-fibre idea is built as a helper but is not part of the current read, and the mechanism is PARKED. See the Hopf map and the kept fibre.
I
Icosian. One of 120 unit quaternions that form the binary icosahedral group, a double cover of the icosahedron's 60 rotations (the icosahedron is a 20-sided solid). They are the vertices of the 600-cell, and their coordinates need the golden ratio, which is why exact golden-integer arithmetic is used (see Z[φ] below). See E8, H4 and the 600-cell.
Instrument. A measuring tool, such as a test panel or a checker. If an instrument is faulty, that is a fix, not a negative result about the mechanism. See what the project knows.
Integer serving. Running the finished model with whole numbers only: adds, shifts, comparisons and table look-ups. This is D11. Zero-multiply audits are green on 44 native symbol ranges and 7 of 7 WebAssembly functions (measurement), but no trained model has been served this way. See serving and export.
K
K16. The runs of 18 October that opened a shortlist of K=16 cells. Four runs finished (two training objectives, A and R, with two seeds each). None was a KEEP. The two seeds of objective A got 65 and 463 of 14,287 first guesses right (measurement). See K16 outcome.
KEEP. The verdict for a run that meets its own pre-registered mechanism target without a significant loss on the headline number. The work then iterates. It is not a final proof. See the rules.
L
Lab. Any contributor, human or AI, working under the charter. Labs so far include Claude, Codex and DeepSeek, with Kimi in the project-manager seat. Labs choose work from NOW.md and may not type an owner release. See the rules.
M
M1 to M8 (milestones). The eight GitHub milestones that define the road to an alpha release. None is complete. In plain words:
| # | Meaning |
|---|---|
| M1 | It predicts text (a saved discrete model beats both count tables through the integer export) |
| M2 | It answers from memory (at least 256 of 512 development replies, and 40% on a fresh panel) |
| M3 | It remembers across sessions |
| M4 | It is served: exported to UORLUT01 and run from the command line |
| M5 | It is cheap on a laptop, with the cost measured |
| M6 | It reasons and codes |
| M7 | It runs the same in a library, a command line and a browser |
| M8 | It is released as one checksum-pinned file |
Source: language model and where we're going.
Matmul (matrix multiplication, GEMM). Multiplying a long list of numbers by a large grid of learned numbers. It is nearly all the arithmetic of a transformer, and the project bans it everywhere: training, tests, tools and serving. A geometric feed-forward block is allowed. A dense one is not. See charter, section 3.3.
Mechanism. One geometric replacement for one part of a transformer, such as the read, the loss or the optimiser. The project tracks 27, each with its own page. See the mechanism board.
Mechanism status (ACTIVE, READY, PARKED). The only three statuses a mechanism can have:
- ACTIVE: on the current model path (10 mechanisms).
- READY: built and tested but not yet trained into a model (4).
- PARKED: the tested forms failed or broke a rule, and the page lists what would reopen it (13).
There is no "retired" status, by D22. Source: mechanism board.
MLP (feed-forward layer). The block in a transformer that processes each token after attention, usually with big grids of multiplications and a gate. UOR-R4's candidates are the Hamilton gate and the SpiralCore/FBS projection; neither has been trained.
N
Nat. A unit of prediction error: the natural logarithm of how surprised the model was. Lower is better; bits per byte is a related score.
Notebook. One page per line of research, with one row per result: date, what ran, the number, the bar, the verdict and an artifact link. Notebooks plus NOW.md replaced the old running log. See research notebooks.
NOT_RUN. A record that a planned test was never executed. It is not a pass and it is not a failure. See what the project knows.
O
Orbit. A set of points that one group of moves carries into one another. The model uses a single orbit of 16 E8 roots, each a signed rearrangement of (2, 2, 0, 0, 0, 0, 0, 0). See E8, H4 and the 600-cell.
Owner. Casey Allard, the project lead. He sets the charter, the holds, the spending and the milestone bars, and personally types each run release.
Owner release. The typed phrase by which the owner personally lets one pre-registered run start. One release covers all arms and seeds of one sheet. No lab types it. See charter, section 5.1.
P
PARKED. A mechanism status. See mechanism status.
PM seat. The project-manager role: it sequences work and keeps NOW.md. Kimi holds it, with a cover lab named by the owner. See the rules.
Pre-alpha. The project's honest stage. Parts are built and tested, but 0 of 8 milestones are complete and no model holds a useful conversation. See STATUS.
Pre-registration (sheet). A one-page plan, written before a run, that states the bar, the noise, the controls, the seeds, the cost and what each outcome would decide. It is needed only before GPU training or evaluation and before any run a milestone claim rests on. See the rules.
Prime address. The exact name of a token: the (id + 1)-th prime number, so no two tokens collide. For example the 4,096th prime is 38,873. It is kept separate from the geometric address. See primes and zeta phases.
PrimeZeta codebook. The table that turns each token's prime into eight angles taken from the Riemann zeta zeros, and the angles into a starting vector. It gives all 4,096 tokens distinct vectors (measurement). The distinctness comes from a cell-balancing step, not from the angles; whether the zeta angles help at all has not been tested. See prime-zeta codebook.
Q
Q1. The first checkpoint of a full-length run, at 4,096 of its 16,404 batches; Q4 is the last. The 18 October dose with Relation was stopped at Q1 when admission collapsed. See admission.
Quaternion. A four-part number \(w + xi + yj + zk\). Multiplying by a length-1 quaternion turns a point in four dimensions without stretching it, and every such turn can be undone. Quaternions of length 1 form the 3-sphere. See quaternions and rotation.
R
Rank-margin. The project's loss: the right token must outrank its strongest rivals by a fixed margin. See hinge loss and rank-margin.
Read. The step in which the model looks back at earlier text to decide what matters for the next token: the project's bounded replacement for attention. There are three: Route, Flock and Relation.
Reach. For one test position, whether the right next token is among the candidates the model opens at all; counted over the 14,287 positions of the DEV panel. A model cannot guess a token it never opens, so a low reach caps the top-1 score, but a high reach alone is not skill (variant R of K16 reached 12,000 positions by opening almost the whole vocabulary).
READY. A mechanism status. See mechanism status.
Relation read. A Flock read plus the ability to follow simple links between positions, such as "the word right after the earlier copy of this word". This is how copying is meant to work. It has trained twice, and both runs stopped before a verdict. See Relation read.
Root. One of the fixed points of E8 used as a block value. See orbit.
Route read. An attention replacement that walks a small tree of addresses, stepping toward the nearest branch at each level, and picks up one earlier word at the end. It never scores the whole history. It is the base read of every trained discrete model, but its own contribution is unattributed. See Route read.
Rung 0. The first full-length run on the discrete path (seed 1, 16,404 updates, scored on the 14,287 development rows). Its bars were unreachable because only 1,920 targets were admitted, which pointed the work at admission. See route read.
S
Seed. The starting number of a random draw. A decisive run uses at least two seeds, so a result is not one lucky draw. See the rules.
SiLU. A smooth squashing curve used as an activation in the older decimal stack. It is built from a sigmoid, so it falls under the ban on squashing functions.
Softmax. A function that turns a list of scores into probabilities with exponentials and a sum over everything. Transformers use it inside attention and again to pick the next word. The project bans it, and every softmax-like squashing function, anywhere in the model, its training or its comparators. See charter, section 3.2.
SpiralCore. An exact-geometry source credited to Matthew. From the octonion multiplication table it yields moves that shuffle the eight coordinates and flip some signs. Each move can be undone exactly. The integer form is the core of the current model. See SpiralCore.
Studio. The single-page interface meant to be the shell of both the web and desktop clients. It is not yet connected to the new engine. See web client.
T
T2. A table built from the training text. It looks up the last word and returns the next word seen most often after it. It gets 6,300 of the 14,287 DEV first guesses right, and it is one of the two count tables a trained model must beat (measurement). See host diagnostics.
Ternary. Used in two ways here. A ternary weight or gate takes one of three values: −1, 0 or +1. A ternary tree has three branches per node. Dense ternary weights are PARKED because every weight is still touched for every word. See ternary and XOR.
Token. One numbered piece of text, a word or part of a word. The model never sees letters. See tokenizer.
Tokenizer. The component that cuts text into tokens and turns tokens back into text. The pinned one has 4,096 pieces (identity d36d3e87). See tokenizer.
Tokens/s (tokens per second). How many tokens the model reads or writes per second. It is the project's lead metric, with decode speed and context speed reported separately. It has never been measured for the current model. See charter, section 1.
Tauri. A toolkit that wraps a web page as a desktop app. The planned desktop client would use it to share the web interface.
Top-1 (and top-8). The number of DEV rows on which the model's first guess (or any of its first eight) is the right next token, out of 14,287. M1 requires the top-1 of the model, through the integer export, to beat the unigram and T2 tables. See charter, section 4.8.
Transformer. The design behind almost every modern language model. Its cost sits in three operations: matrix multiplication, attention against every earlier token, and softmax. UOR-R4 is not a transformer. See what is UOR-R4 and transformer vs geometry.
U
Unigram. A table of word counts that ignores context and always guesses by overall frequency. It gets 1,226 of the 14,287 DEV first guesses right. The best trained discrete model got 65 and 463 (measurement). See K16 outcome.
UOR. Short for Universal Object Reference, the foundation named as copyright holder in the project's MIT licence (LICENSE). A "UOR address" in this project is the prime-based name described under prime address.
UORLUT01. The container format for the finished model: one file of 4-bit codes and small integer tables, pinned by checksum. It is what the engine serves. See serving and export and releases and artifacts.
V
VSA (vector-symbolic architecture). A memory idea using long bit strings (4,096 bits per token) glued by XOR and compared by counting differing bits. It improved bits per byte by 0.014 to 0.023 on a banned CPU learner, so it is PARKED. See VSA and VSA and Hamming distance.
W
W2. The next queued test: FIT-reviewed and awaiting an owner release (cost about $0.91, estimated). It decides whether the wall is the model's representation or its learning law, and includes count-table arms the headline bars lack. See open questions.
WASM (WebAssembly). A compact, sandboxed machine code that browsers run. The integer serving engine is built for it, with 7 of 7 serving functions free of multiply, divide and float instructions (measurement). See web client.
Writer (shared vector writer). The one component that handles a token's vector on the way in, along the carry and on the way out, using the same format everywhere. It builds the cells and picks the nearest token among the admitted ones. See architecture.
Z
Z[φ]. Pairs of whole numbers (a, b) standing for a + bφ, where φ is the golden ratio. They add and multiply with no rounding, so icosian coordinates can be kept exact. See golden integers.
Zeta zero. A point where the Riemann zeta function is zero. The project uses a few fixed zeros as clock speeds: for a prime \(p\) the angle on channel \(k\) is \(\gamma_k \ln p\). It uses the numbers only and makes no claim about the Riemann hypothesis. See primes and zeta phases.
Go deeper
- FAQ: the questions newcomers ask most, answered with links.
- What is UOR-R4: the five-minute explanation.
- Mechanism board: all 27 mechanisms and their status.
- Geometry chapters: one illustrated page per geometric idea.
docs/formal_vocabulary.md: the rules for proof, measurement and hypothesis.
The three products
UOR-R4 aims to ship one thing people can use: a small, fast language model that runs on your own laptop or in your own browser, with nothing sent to a server. The owner defined three products around it on 19 October 2026. The first is the model itself, saved as one file of whole numbers. The second is a web client that runs that file inside a browser tab. The third is a desktop client, an installable app that runs the same file natively and remembers your conversations. None of the three ships today. The project is pre-alpha: 0 of its 8 milestones are complete and no model holds a useful conversation yet (STATUS, NOW). Nothing is released until a trained model passes milestones M1 to M8.
Labels used below: proof means derived from definitions or code, measurement means a recorded run with its artifact, hypothesis means an untested idea (docs/formal_vocabulary.md, glossary).
One model file feeds two clients that share one interface. Everything inside the dashed line runs on the user's own device.
The three at a glance
| Product | What it is meant to be | What exists today | Main gate |
|---|---|---|---|
| Language model | A geometric language model exported as one checksum-pinned integer file (UORLUT01) | The serving engine, tested on a synthetic stand-in model. No trained model has been exported to it | M1 to M4, then M8 |
| Web client | A local model in the browser: download the file once, run it in WebAssembly on the device | The Studio interface (index.html), a WebAssembly build of the engine (UOR-Foundation/uor-r4#2654), and a paused Pages deploy | M7 |
| Desktop client | A Tauri app sharing the web interface, with the native engine, file access, durable memory and offline use on M1-class laptops | A specification only. Fragments exist: Tauri hooks in the Studio, the memory store crate, a command-line engine | M3, M5, M7 |
A fourth page, Releases and artifacts, covers the model file format, how a release would be cut, the Hugging Face repositories and how checksums tie them together.
Why the products look like this
Local by design. The mission is "fast local AI": a model that trains fast, runs fast and approaches frontier capability on ordinary hardware (charter, section 1). The lead metric is tokens per second. A product that needs a data centre would defeat the point.
One file, many hosts. The served model obeys one contract, called D11: no decimal (floating-point) arithmetic, no multiply or divide instruction and no transcendental functions, only adds, shifts and table look-ups (D11). A file that needs nothing more exotic than integer adds can run the same way in a browser, on a laptop processor or on Apple silicon. The charter says serving this file on the user's device is the product and is allowed. The rule that research compute must run on a GPU (D24) does not apply to it (charter, section 3.6).
One interface, two shells. The Studio, a single-page interface already in the repository, is the shell for both clients. The browser runs the engine as WebAssembly. The desktop app wraps the same page and runs the engine as native code, which should be faster (a hypothesis; no side-by-side timing exists).
Where each product stands
| Item | State | Source |
|---|---|---|
| Milestones complete | 0 of 8 (measurement of the tracker) | STATUS, NOW |
| Integer serving engine, native | Built; zero-multiply audit green on 44 symbol ranges (measurement) | project track, M4 |
| Integer serving engine, WebAssembly | Built; 7 of 7 serving functions with zero multiply, divide and float instructions; save and restore reload identically on a synthetic model (measurement) | record |
| A trained model in that engine | None. Training is held, and no model built under today's rules has been exported | NOW, lut-serving dossier |
| Studio connected to the new engine | No. It still imports an older engine that was retired on 15 October | index.html, D36 |
| Public website deploy | Paused since 15 October; the live site is the 13 October build | deploy.yml |
| Desktop app project | Not started; no src-tauri/ folder exists | the repository tree (no src-tauri/ folder) |
A passing audit shows that a forbidden instruction is absent. It is not a trained capability, and it says nothing about how well a model answers.
The order things must happen in
The products depend on the model, and the model depends on milestones. Roughly:
- M1 to M3 give a model that predicts text, answers from exact memory, and keeps memory across sessions.
- M4 exports that model through D11 and serves it from the command line.
- M5 measures its cost on a laptop, and M6 adds reasoning and coding on the same model.
- M7 makes the browser worker, the command line and the Rust library produce bit-identical tokens. That is the web client's gate.
- M8 is the alpha release: one versioned, checksum-pinned model file that meets every earlier bar.
The desktop client has no milestone of its own yet. It rides on M3 for memory, M5 for laptop cost and M7 for the shared interface. The full definitions are in the project track.
Go deeper
- Language model: what the model is and the M1 to M8 path in plain words.
- Web client and desktop client: architectures, what exists and what is missing.
- Releases and artifacts:
UORLUT01, the release workflow, Hugging Face, checksums. - Serving and export: how the integer engine computes without a multiply.
- Mechanism dossiers: integer table serving, exact object store.
- The charter, sections 2 (products) and 3.6 (serving on the user's device).
The language model
The core product is a language model: a program that reads text and predicts what comes next, and so can hold a conversation. Most language models today are transformers that do billions of decimal multiplications per word. UOR-R4 tries a different route. It predicts text with geometry (prime-number addresses, rotations in four dimensions, exact look-up memory), and it ships as one file of whole numbers that an ordinary laptop or browser can run without a single multiply instruction. That file is meant to be the one thing every client loads. It does not exist yet. No trained model has been exported in that form, training is on hold pending review, and 0 of the 8 milestones are complete (NOW). Nothing ships until a trained model passes M1 to M8.
Labels used below: proof (derived from definitions or code), measurement (a recorded run with its artifact), hypothesis (untested). See docs/formal_vocabulary.md and the glossary.
flowchart LR T["Train on rented GPUs<br/>(crates/uor-r4-discrete)"] --> X["Export to one integer file<br/>UORLUT01"] X --> A["Audit: 0 multiply,<br/>0 divide, 0 float"] A --> S["Serve on the device<br/>(crates/uor-r4-integer)"] S --> C1["Command line<br/>uor-chat"] S --> C2["Web client<br/>WebAssembly"] S --> C3["Desktop client<br/>native"]
The model's life in one line. Training happens once, offline, on a GPU. Everything after the export runs on the user's machine using whole numbers only.
What the model is meant to be
A geometric model, not a transformer. The project calls it the UOR-R4 Geometric Language Model. Technically it is an autoregressive geometric state model with exact addressed memory: it keeps a running state, updates it with each token through rotations and table look-ups, and reads facts from an exact memory by address (architecture). The charter forbids the expensive parts of a transformer outright: no softmax or other squashing functions and no dense matrix multiplication, anywhere: training, evaluation, tooling and serving (charter, sections 3.2 and 3.3).
One model for every job. Conversation with durable memory comes first, then coding and reasoning, all on the same model (charter, section 1).
Fast and local. The lead metric is tokens per second on an ordinary machine, with decode and context reported separately. A small quality gap is acceptable if the model is much cheaper to run.
How it will be delivered
The deliverable is one checksum-pinned D11 integer artifact in the UORLUT01 format, released at milestone M8 (project track, M8).
- D11 is the serving contract. Its five rules are: no floating point or maths library (R1); no multiply or divide instruction (R2); reading every weight for every token is an interim stage, not the end state (R3; the charter no longer treats dense table maps as an allowed stepping stone for new exports); no transformer backbone (R4); energy claimed only when measured (R5) (D11).
UORLUT01is the file format. It holds an 8-byte magic string, a JSON header, 4-bit weight codes in groups with one scale byte each, and small integer tables for the few nonlinear steps (format.rs; proof by reading the code). The reader computes the SHA-256 hash of the whole file as it loads it, so a release can pin that hash. Details are on the releases page.- Training may use decimals; serving may not. Since 18 October, offline training may use floating point, but the shipped file is integer, and every float-trained candidate must report its export gap: its served score minus its float score on the same evaluator (D37, charter section 3.7).
- The engine is
crates/uor-r4-integer. It runs the file natively (theuor-chatanduor-r4-stackcommand-line programs) and as WebAssembly (UOR-Foundation/uor-r4#2654). The serving page shows how it multiplies without a multiply instruction.
Status today
| Question | Answer | Kind | Source |
|---|---|---|---|
Does a trained model exist in UORLUT01 under today's rules? | No | measurement (absence in the records) | lut-serving dossier |
| Does the serving engine work? | Yes, on a synthetic stand-in model: native audit 44 symbol ranges clean; WebAssembly 7 of 7 serving functions clean; save and restore reload identically | measurement | project track M4; WebAssembly record |
| Is the engine exact? | On older float models it reproduced its float reference almost exactly: engine difference 2.7e-7 BPB on a matched 512-window check | measurement | criterion-2 record |
| What model is being trained? | The discrete model in crates/uor-r4-discrete, integer from end to end on the GPU | — | training |
| How far is it? | M1 is active. In the latest two-seed run (K16, 18–19 October) the best arm and seed reached top-1 of 463 of 14,287 development rows, and no arm met its bars | measurement | K16 outcome call |
| Is training running? | No. Training, M2 and Stage B are held by the owner; a review does not release a hold | — | charter section 5.1 |
For scale, the M1 closing bar asks the exported model's integer top-1 to beat two simple count tables on the same panel, the unigram table (1,226 of 14,287) and the successor table (6,300 of 14,287), on two seeds (charter, section 4.8). The K16 run was graded on the model's own evaluator, not through the export, so the comparison is a rough guide only.
What about the models on Hugging Face? The four 214M-parameter checkpoints in caseyallard/uor-r4-geometric-214m are historical. They are float models trained before the softmax and matmul bans. Their measured results were TinyStories validation NLL 1.032 and FineWeb development NLL 2.90 → 2.073; the chat versions could rewrite and summarize but got code and arithmetic wrong (model card, the Hugging Face model card). They are not the D11 product.
An earlier export of a float stack missed its bar. On 10 October three 29M-parameter float models were exported and served exactly by D11, at 1.20 to 1.24 bits per byte, far from the 0.90 target. The record puts the gap in the model, not the engine (D11 serving record; measurement).
The eight milestones in plain words
Each milestone is a GitHub milestone with an issue. The bars are frozen there; the project track still shows the old M1 bar (0.90 BPB through the D11 export) and has not yet been updated, so charter section 4.8 governs. Changing any bar is the owner's decision.
| # | Plain meaning | Bar, briefly | Issue |
|---|---|---|---|
| M1 | It predicts text. A saved discrete model passes its admission and occupancy checks on two seeds, and through the integer export beats both count tables | Charter 4.8 bars (a)–(e), including a fresh pre-registered transfer panel | #2029 |
| M2 | It answers from memory. It replies correctly using facts stored in exact memory | ≥ 256 of 512 complete correct replies on development, ≥ 40% on a fresh panel | #2030 |
| M3 | It remembers across sessions. It tracks where a fact came from, accepts corrections, abstains on unknown facts, resets, and survives a restart | All five memory checks; a saved and restored session continues token for token | #2031 |
| M4 | It is served. The chosen model is exported to UORLUT01 and served by the command line | Audits at 0; export gap reported; ≤ 0.90 BPB held out plus the M1–M3 bars through uor-chat; bit-identical continuation after restore | #2032 |
| M5 | It is cheap on a laptop. Its real cost is measured | ms per token, peak memory, mJ per token, and weights read per token, all reproducible | #2033 |
| M6 | It reasons and codes. The same served model solves unseen multi-step and coding tasks | Frozen reasoning panel with compile-and-test oracles, plus a causal ablation | #2034 |
| M7 | It runs everywhere the same. Library, command line and browser give bit-identical tokens; the Studio makes no remote model calls | Parity across three hosts; WebAssembly audit 7 of 7 on the shipped model | #2035 |
| M8 | It is released. One versioned, checksum-pinned UORLUT01 file meets M1–M7 | Reproducible install, release notes with the exact scores, independent check on consumer hardware | #2036 |
Two notes. First, M4's quality bar is still written in bits per byte (≤ 0.90), while M1's was changed on 19 October to a top-1 comparison; the charter says BPB returns as a later bar once the model has a lawful likelihood (charter, section 4.8). Second, M4's audit criterion is already green, but it is a check on the engine, not on a model, so it cannot close M4 by itself (project track, M4).
Open questions
- What is the export gap of the discrete model through
UORLUT01, and does the format need a new schema for table-native models rather than 4-bit dense groups? Never measured (lut-serving dossier). - How many of the roughly 30.2M parameters read per token in the older 29M stack can addressed reads remove before tokens per second moves? This is the D5 end state, unmeasured until M5 (D5).
- The engine cannot yet serve a product-key or addressed memory read; the exporter refuses it (lut-serving dossier).
Go deeper
- Model architecture, training, serving and export.
- Releases and artifacts for the file format and checksums.
- Code:
crates/uor-r4-discrete/(the model being trained),crates/uor-r4-integer/(the serving engine). - NOW for this week's work; project track for the milestone definitions.
The web client
The web client is meant to be a language model that lives in a browser tab. You open a web page once, it downloads the model file, and from then on the model runs on your own computer, inside the browser, in a sandboxed form of machine code called WebAssembly. Your prompts and the model's replies never leave the device, because there is no model server to send them to. The page you would use is the Studio, an editor-and-chat interface already in the repository. Today the pieces exist separately and are not joined: the browser engine works on a synthetic test model, the Studio still points at an older engine that was retired, the public site is frozen, and there is no trained model to download. Until milestones M7 and M8 pass, the web client is a geometry explorer and demonstration, not a product.
Labels used below: proof (derived from definitions or code), measurement (a recorded run with its artifact), hypothesis (untested). See docs/formal_vocabulary.md and the glossary.
One download, then everything runs in the tab. The only network traffic is fetching the static page and the model file.
How it is meant to work
- Load the page. The Studio is static HTML, JavaScript and CSS. The charter places it at
/studioon the project's documentation site (charter, section 2). - Download the model once. The page fetches one
UORLUT01file and checks its SHA-256 against the hash published with the release (releases). It then keeps the file in browser storage so later visits work offline. This cache is planned, not built (from reading the repository). - Start the engine in a Web Worker. A worker is a background thread of the page, so typing stays smooth while the model computes. The worker loads the WebAssembly build of
crates/uor-r4-integerand callsinit, thenloadStackon the model bytes. - Generate. For each token the worker calls
step. The engine uses only integer adds, shifts and table look-ups (the D11 contract), so the same file gives the same tokens in every browser. That is a design property; M7 has to measure it. - Save and resume.
saveSessionwrites the conversation state as aUR4SESS1snapshot, andrestoreSessionbrings it back byte for byte.
These function names are the real exports of the WebAssembly build: init, tickClock, loadStack, step, saveSession, restoreSession, weightsPerToken, allocEvents, leakedModels (record; proof by reading wasm_bindgen_exports.rs).
Why serving in the browser is allowed. Research compute must run on a GPU (D24). On 15 October that rule paused the browser engine, because serving in a browser runs on the user's processor (D36). The owner resolved this on 19 October: serving the exported D11 file on client devices, including browser WebAssembly, is the product, and D24 does not apply to it (charter, section 3.6).
What exists today
| Piece | Where | State | Source |
|---|---|---|---|
| Studio interface | index.html (7,107 lines), index.css, assets/js/uor_model_worker.js | Editor (Monaco, loaded from a CDN), file tree, chat, model manager, local folder access, GitHub chooser. It imports pkg/uor_r4_wasm_router.js, an engine retired on 15 October, and shows a banner saying no D11 served engine exists | index.html, banner d36EngineStatusBanner near line 2323 |
| WebAssembly integer engine | crates/uor-r4-integer/src/wasm_serve.rs, wasm_bindgen_exports.rs, session_codec.rs | Built behind the serving-wasm feature; merged as UOR-Foundation/uor-r4#2654 | record |
| Its checks | same record | 165 crate tests pass; 7 of 7 serving functions with 0 multiply, 0 divide and 0 float instructions; a Node.js run of 32 steps, save, restore and 16 more steps matches a fresh 48-step run (reloadIdentical: true) on a synthetic model (measurement) | record |
| Browser and Node harnesses | docs/wasm-serving/wasm_serve_demo.html, verify.mjs | Source only: they import a build folder that is not committed, so they do not run from a clean clone | maintainer annotation in the record |
| Public deploy | .github/workflows/deploy.yml | Job disabled (if: false) by owner decision on 15 October; the live site is the last good build, 13 October 18:28Z | D36 |
| Geometry explorer | geometric_prime_router_webapp.html | A standalone demo page, separate from the Studio; not verified in this audit | index.html and the repository root files |
| Cross-origin isolation helper | coi-serviceworker.js | Vendored third-party file (v0.1.7, MIT) | index.html and the repository root files |
Three limits from the engine's own record matter for a reader. The WebAssembly SIMD kernels are test fixtures that nothing calls yet; the engine still runs its scalar table kernel. The demo needs a local build first. And the serving-wasm build compiles some modules unconditionally, so its compliance with the "presence counts" rule (D29) rests on an interpretation that DECISIONS.md does not record (record, maintainer annotation).
What is missing
| Missing piece | Needed for |
|---|---|
A trained model exported to UORLUT01 | Anything to download (M4, #2032) |
| Studio rewired from the retired engine to the integer engine's exports, through a Web Worker | M7 (#2035) |
| A download-once loader with a checksum check and a browser-storage cache | Offline use after the first visit |
Bit-identical token and session parity across the Rust library, uor-chat and the browser worker, on the real model | M7 |
| Truthful capability reporting in the Studio and zero remote model calls | M7 |
Re-enabled Pages deploy (D36 says remove the if in the PR that lands a D11 served engine) | Public access |
| Self-hosted copies of every CDN asset (Monaco, marked, KaTeX, pdf.js, three.js and the Google fonts), and web search removed or made opt-in | Fully offline use and the no-outside-traffic claim; the page now loads all of these from CDNs and sends search queries to Wikipedia and DuckDuckGo |
| Honest screenshots taken after behaviour checks | Documentation |
The M7 bar sums it up: the qualified model "produces bit-identical token completions and session snapshots across the Rust library, the uor-chat CLI and the browser serving-wasm worker", and the Studio "runs entirely client-side in a Web Worker with truthful capability reporting and zero remote model calls" (project track, M7). The .wasm audit criterion is green and will be re-run on the shipped bundle; the rest of M7 (rewiring the Studio, three-host parity, client-side Studio) is open.
Until then: an explorer, honestly labelled
Until M7 and M8 pass, the web page should present itself as what it is: a geometry explorer and a demonstration of the serving engine on a synthetic model. It must not offer a chat box that implies a working assistant. The Studio's engine-status banner already says so. Showing the engine's real exports (weightsPerToken, allocEvents) on a synthetic model is fair. Showing chat replies is not, until there is a trained model behind them.
Privacy model
- The model computes only on the device. No prompt or reply is sent anywhere by the engine. That is the M7 bar, and today it holds trivially, because there is no remote model to call.
- Network use is not yet limited to static files. The target is the page and the model file only. Today the Studio also loads third-party code and fonts from CDNs (Monaco, pdf.js and three.js from cdnjs; marked, KaTeX and the three.js controls from jsDelivr; fonts from Google Fonts), and its search feature sends the typed query to
en.wikipedia.organdapi.duckduckgo.com. Features that open files from GitHub talk to GitHub. None of that is model compute, but a privacy claim must not hide it: the requirement is to self-host every asset and make web search opt-in, or remove it, before M7 (index.html, lines 11 to 25 and 5845 to 5906). - Integrity, not secrecy, of the model file. The SHA-256 check proves the file is the released one. The model is public, so there is nothing to hide in it.
Open questions
- How large will the model file be, and is a one-time download of that size acceptable on a phone? Unknown until a model exists.
- How fast is WebAssembly against native on the same file? No tokens-per-second figure for the browser has been recorded. The only native figures are from older float models: 68 to 80 tokens per second on 8 threads for a 29M model, which is evaluation throughput over 64 scored windows, not free-running decode (D11 serving record). No decode tokens per second exists for any D11 artifact.
- Should the Studio's provenance be settled first? Its source is an import from a companion repository,
Casey-allard/uor-r4-wasm-chat, which this audit did not inspect.
Go deeper
- Desktop client, which shares this interface.
- Serving and export and the integer serving dossier.
- The WebAssembly runtime record (
UOR-Foundation/uor-r4#2654, tracking issue#1172). - D36 and the charter, section 3.6.
The desktop client (specification)
The desktop client is a planned app you install on your laptop. It shows the same interface as the web client, but it runs the model as native code rather than inside a browser, which should make it faster. It can open your project folders, it remembers your conversations between sessions in a durable local store, and it works with no internet connection. The target machine is an M1-class laptop. This page is a specification, not a description of working software. No desktop app project exists in the repository yet, and there is no trained model for it to run. The owner asked for a spec only in this round (decision 8, 19 October 2026). Nothing ships until a trained model passes milestones M1 to M8.
Labels used below: proof (derived from definitions or code), measurement (a recorded run with its artifact), hypothesis (untested). Words in this spec such as must are requirements, not claims about existing code. See the glossary.
Same interface as the web client; the engine, the memory and the file access run as native Rust inside the app. Only an optional update check uses the network.
Goals and non-goals
Goals.
- Run the released
UORLUT01model natively, under the D11 integer contract, on an M1-class laptop. - Share the web client's interface, so there is one interface to maintain.
- Give the model access to the user's chosen project folders, for coding help.
- Keep durable conversation memory on disk (the D19 line), so a conversation can be closed and resumed exactly.
- Work fully offline after install.
Non-goals. No cloud model, no account, no telemetry, no server component, and no second model format. Training and evaluation stay on GPUs (charter, section 3.5).
Architecture
The app is built with Tauri: a small native shell that shows a web page in the system's own webview and runs a Rust backend beside it. The page calls the backend through named commands. Rust is the project's default language (charter, section 3.11), so the backend can link the project's crates directly.
| Component | Built from | Exists today? |
|---|---|---|
| Interface | The Studio page, index.html, shared with the web client | Yes, one 7,107-line file. It detects Tauri (window.__TAURI__) and calls native_read_file, native_write_file, native_git_status, native_run_terminal_command and native_list_local_models, falling back to browser APIs when they are absent |
| Tauri project | src-tauri/ with tauri.conf.json and the Rust commands above | No. Nothing in the repository defines those commands |
| Model engine | crates/uor-r4-integer linked as a library: the same code as the uor-chat command-line program | Yes, as a library and CLI, verified only on test and synthetic models |
| Memory store | crates/uor-r4-object-store | Yes, as a tested library; no crate uses it yet |
| File-access layer | New Rust commands limited to folders the user grants | No |
| Model manager | New: lists, verifies and loads UORLUT01 files; checks for updates | No |
Sources: reading index.html and the repository tree, and the object-store dossier.
Data flow
- Install. The installer carries the app and, optionally, the model file. If the model is not bundled, the first run downloads it once (update and download).
- Load. The model manager reads the file, checks its SHA-256 against the release pin, and passes the bytes to the engine. The
UORLUT01reader checks every offset and length and returns an error rather than crashing on a malformed file (format.rs; proof by reading the code). - Chat. The interface sends the user's text to a Rust command. The engine steps token by token with integer adds, shifts and table look-ups and streams tokens back to the page.
- Remember. At the end of a turn, the app saves the session state as a
UR4SESS1snapshot and stores conversation bytes in the object store. The store cuts bytes into 32-byte pieces arranged in a hashed three-way tree, so repeated content is stored once and any byte range can be read back and checked (object-store dossier). Storing session snapshots in the store is a design note, not yet done. - Resume. On reopening, the app restores the snapshot, and the conversation continues token for token. That is the M3 restore bar (project track, M3).
- Work on files. When the user asks about code, the app reads files only from granted folders and passes their text to the model as context.
Why native, and how fast
The browser runs the engine as WebAssembly in one worker. A native build can use the processor's vector units (NEON on Apple silicon) and several threads. The project already has native table kernels for NEON and AVX2, though they belong to an older, frozen engine (crates/uor-r4-simd). That native will be faster is a hypothesis. Nobody has timed WebAssembly against native on the same file. No decode speed exists for any D11 artifact. The only native D11 speeds on record are from older float models served exactly by the integer engine: 68 to 80 tokens per second on 8 threads for a 29M model, which is evaluation throughput over 64 scored windows rather than decode (D11 serving record), and 184.58 tokens per second on one thread for input-driven forward passes, which is not free-running generation either (lut-serving dossier). M5 is the milestone that measures laptop cost: ms per token, peak memory, mJ per token and weights read per token (project track, M5).
Serving on the user's laptop is allowed. The charter says serving the exported D11 file on client devices, including Apple silicon, is the product, and D24's GPU-only rule does not apply (charter, section 3.6).
Durable memory (D19)
D19 makes grounded conversation and durable memory the first priority (D19). The object store was split out as its own crate for this purpose on 14 October (D34). What it has shown, all on test data (measurement):
- 60 tests pass, and a pure-Python client pulled a 256 KiB object byte-identically from the Rust server (conformance record).
- A 23-byte read of a 32,768-byte object touched 8 authenticated nodes, 384 bytes (object-store dossier).
- Repeated content compresses well (7,776 bytes stored in 380), but unique content expands about 2.17 times (32,768 bytes become 70,972) (D19 store record).
Never tested: any model reading from the store, the M3 memory bars on a real model, and storage cost on real chat logs (object-store dossier). The store keeps exact identity (what was said, where, in which version) separate from any geometric address, as the charter requires (section 3.12).
Security model: local only
| Risk | Requirement |
|---|---|
| Data leaving the device | No network access except the optional, user-visible update check. No telemetry. No remote model calls (as in M7). The shared Studio page currently loads CDN assets and sends web-search queries to Wikipedia and DuckDuckGo (web client), so the desktop build must self-host every asset and drop or gate web search, or the "only an update check" claim is false |
| Broad file access | The Studio already calls native_write_file, so write access exists as well as read access. The backend may read and write only folders the user has explicitly granted, using Tauri's capability allowlist. No access outside them |
| Running shell commands | The Studio already calls native_run_terminal_command. This is the riskiest command. It must be off by default, show each command to the user before it runs, and be limited to a granted folder |
| A tampered model file | Load only files whose SHA-256 matches a pinned release hash. The reader already rejects malformed structure |
| A malformed saved session | The UR4SESS1 parser checks varint counts before allocating and returns an error on truncated input (record) |
| Memory-store sync between machines | Pins prove integrity, not authentication. Peer sync stays off unless the user sets it up, and is out of scope for the first release (object-store dossier) |
| Unsafe code | Keep forbid(unsafe_code) in the runtime and format crates (charter, section 3.13) |
Update and model download
- Model files are versioned releases. Each is one
UORLUT01file with a published SHA-256 (releases). The app never runs an unpinned file. - First download. Fetch the file once, verify the hash, store it locally. After that the app needs no network.
- App updates. Use Tauri's signed updater, or manual install. Signing keys and the hosting choice are open questions.
- Delta updates for models (hypothesis). The object store can send only the pieces that changed. In one test a receiver holding a slightly older 1 MiB object fetched 22 records, 1,014 bytes, in 3 rounds. But a cold pull of unique content through the store is far larger than a compressed download (5,725,408 bytes against 39,920 for a 2 MiB artifact), so the supported recipe is a compressed download first, then deltas (object-store dossier). Whether deltas help for real model files is untested.
Milestones it depends on
| Milestone | What the desktop client needs from it |
|---|---|
M3 #2031 | Durable memory that passes provenance, correction, abstention, reset and restart, with identical restore |
M4 #2032 | A trained model exported to UORLUT01 and served by uor-chat, which is the engine the app embeds |
M5 #2033 | Measured laptop cost: speed, memory, energy |
M7 #2035 | The shared interface, and bit-identical tokens across library, command line and browser |
M8 #2036 | A versioned, checksum-pinned release to download |
Open questions
- Superseding the old plan.
archive/integration/frontend-port-plan.md(historical, 4 September) says Tauri should not be the main client. The owner's 19 October decision replaces it, and that file needs a supersession note. - Sharing one interface. The Studio is one 7,107-line HTML file with inline scripts. Does it need to be split into modules before two shells can share it cleanly?
- The terminal command. Keep it (with consent and folder limits) or drop it from the first release?
- Where memory meets the model. Which comes first: storing session snapshots in the object store, or exact quotations from the store feeding the model's output? This is the object store's open path to ACTIVE status (object-store dossier).
- Threads and D11. The five D11 rules say nothing about threads. Whatever kernels the app ships, threaded or vectorized, must still pass the zero-multiply audit.
- Engine format. The legacy Studio also calls
native_list_local_models, written for an older model format. The model manager must accept onlyUORLUT01.
Go deeper
- Web client, which shares the interface; products overview.
- Exact object store dossier and its protocol.
- Serving and export; integer serving dossier.
- Charter, sections 2 and 3.6.
Releases and artifacts
A release is how a finished model reaches people: a numbered version, a file you can download, and a fingerprint (a checksum) that proves the file is exactly the one that was tested. For UOR-R4 the file is meant to be one integer-only model file in a format called UORLUT01, released at milestone M8. That release does not exist. Two old software releases are on GitHub from the summer, plus one pinned-corpus data release, but both software releases belong to an earlier engine and neither is a qualified model. The release automation still targets that older engine too. This page explains the file format, the release machinery as it is, the Hugging Face repositories, and how checksums bind them together. Nothing ships until a trained model passes M1 to M8.
Labels used below: proof (derived from definitions or code), measurement (a recorded run with its artifact), hypothesis (untested). See the glossary.
flowchart LR
P["Trained model<br/>(GPU, offline)"] --> E["Export to UORLUT01<br/>+ export gap"]
E --> H["SHA-256 of the file"]
H --> R["Versioned release<br/>vX.Y, notes bind scores"]
R --> W["Web client<br/>verifies, caches"]
R --> D["Desktop client<br/>verifies, stores"]
R --> C["uor-chat CLI"]
S[("Private HF store<br/>MD5SUMS / SHA256SUMS")] -.inputs and results.-> P
The planned path from a trained model to the clients. Every hop carries a checksum. The release box exists only as a plan for this model; the old pipeline served a different engine.
The model file: UORLUT01
UORLUT01 is the container the integer engine reads. Its layout, from the reader format.rs (proof by reading the code):
- The 8-byte magic string
UORLUT01, then the header length as a little-endian 64-bit integer. - A JSON header with the schema name, the model's shape, the group size, numeric settings, a list of matrices and tables, the exporter's provenance (never read by the serving arithmetic), and an optional record of a trained-in rotation snap, with the SHA-256 of its root set.
- Zero padding to a 64-byte boundary, then the data sections at 64-byte-aligned offsets.
- Each weight matrix stored as 4-bit codes, two per byte, with one scale byte per row and group. The scale byte holds a 4-bit mantissa \(m\) and a 4-bit exponent step \(d_e\), meaning a group scale of \((16+m)\,2^{\,e_{\text{base}}+d_e-4}\).
- Small integer tables (16-bit or 32-bit) for the few nonlinear steps.
Three schemas exist: lut-stack/1 (a softmax attention read), /2 (adds a pointer head) and /3 (a softmax-free flock rank read). The first two serve exp-table softmax reads, which the no-squashing rule bans. No schema fits today's rules as it stands: all three also carry SiLU and GELU tables and stream dense 4-bit weight maps through a table-based product, which the charter excludes, so a new table-native schema is likely needed (lut-serving dossier).
A built-in fingerprint. When the reader parses a file, it computes the SHA-256 of all its bytes and keeps it with the parsed model (format.rs, line 557). A release can therefore pin that hash, and a client can refuse any file that does not match.
Safe loading. Every offset, length and product of sizes is checked, so a malformed file returns an error rather than crashing. A file that declares a product-key memory is refused outright, because the integer kernel for it is not built (format.rs).
Saved sessions use a separate format, UR4SESS1, which records a conversation's state so it can be restored byte for byte (session_codec.rs).
The release pipeline as it is
| Piece | What it does | Fits the product? |
|---|---|---|
.github/workflows/release.yml | On a pushed v* tag: creates a draft GitHub Release; builds the r4 command-line program for Linux x86_64 and macOS arm64; builds a WebAssembly frontend with wasm-pack; attaches each archive with a .sha256 file beside it | No. All three of its jobs are paused (if: ${{ false }}) since the legacy-crate repair (#2793, 20 October 2026): the root crate now builds only its compliant library surface, so neither the r4 program nor the WebAssembly frontend (the retired router engine) can be built under the bans. Rewriting it for UORLUT01 is M8 work |
docs/RELEASE_PIPELINE.md | The release convention adopted 19 August (#741): a tag vX.Y binds the code SHA, the inference-contract version and BLAKE3 digests of every bundle component; the maintainer attaches the model bundle by hand and publishes the draft; users install with r4 install-release, which verifies it | No. The document itself says it is a preserved reference for the older graph-engine (R4G1) bundle, not the product's pipeline |
src/release_install.rs, release_bundle_packager.rs, release_bundle_loader.rs | Package and install the schema-2 R4G1 bundle | No. R4G1, not UORLUT01 |
Source: reading release.yml and the repository tree. This audit did not confirm that a tag build passes today.
The two software releases on GitHub are historical. v0.1 (19 August 2026) attached r4 binaries, a WebAssembly frontend and a model bundle compiled from a pinned SmolLM2-360M-Instruct snapshot, a converted transformer that the current serving rules exclude. v0.1.0-alpha (8 September 2026) is marked a pre-release: its notes say the alpha qualification was withdrawn after a recovery audit found the claims unsupported, and it is kept only for historical reproducibility. Neither is a release of the geometric model. A third GitHub release, "D3 pinned corpus: simple-wiki-20231101-sample" (29 July 2026), is a data release, not a model (release pages on UOR-Foundation/uor-r4, read 19 October 2026).
The owner has decided to repair the legacy crates, not archive them. The root crate and four others are to be repaired so that they build on the current core. Repairing restores the build only; their old mechanisms stay parked (charter, section 2.4). A repaired build would let release.yml run again, but it would still package the wrong format until it is changed.
What an M8 release must contain
The M8 bar is "one versioned, checksum-pinned UORLUT01 artifact" that meets the frozen bars of M1 to M7, with "reproducible installation, release notes binding the exact measured scores and known limitations, and independent verification on consumer hardware" (project track, M8; issue #2036). Read as a checklist, it is a plan, not existing work:
- The model file with its SHA-256, plus the tokenizer it was trained with.
- Release notes that bind the code SHA, the file hash, the tokenizer, the training data and seed, every measured score with its panel, the export gap, and the known limits. The charter requires every artifact to bind its data, seed, configuration, parameters and format (section 3.12).
- Binaries:
uor-chatfor each platform and the WebAssembly bundle, each with a.sha256, and each re-passing the zero-multiply audit (native 44 symbol ranges, WebAssembly 7 of 7 at last count; project track, M4). - The Studio, published to
/studioon the documentation site (charter, section 2). - Independent verification on consumer hardware.
Missing today: a release workflow for UORLUT01, WebAssembly and desktop packaging of the integer engine in that workflow, and one inference contract. Two contracts still coexist: docs/inference_contract.md for the older R4G1 runtime, and D11 rules R1 to R5 for the product (D11).
Hugging Face repositories
| Repository | Visibility | What it holds | Status |
|---|---|---|---|
caseyallard/uor-r4-geometric-214m | Public (model, MIT) | Four 214M-parameter float checkpoints: base-tinystories, base-planA, chat-planA-b8, chat-smoltalk-b16, with configs, sanitized run reports and the byte-level BPE tokenizer | Historical. Trained before the softmax and matmul bans; not the D11 product |
datasets/caseyallard/uor-r4-data | Public (dataset, MIT plus CDLA-Sharing-1.0) | Project-generated data: the tokenizer, the memory-dialogue sets mw-balp and mw-orcp with the fine-tune manifest, the dev split, conversational panels, TinyStories tokenized for the native learner | Live data |
caseyallard/uor-r4-store | Private | The labs' working store: data/* (about 2.7 GB, checked against MD5SUMS), base models, pinned toolchain and crate-registry archives, project binaries bin/<sha> with SHA256SUMS, pod setup, and results/<lab>/<topic-date>/ | Working store; never a release channel |
Both public repositories were published on 9 October 2026. Sources: the two Hugging Face repository pages; compute guide. The public model repository's visibility is inferred from the listing, which showed no private flag.
How checksums tie it together
| Where | Checksum | What it proves |
|---|---|---|
UORLUT01 load | SHA-256 of the whole file, computed by the reader | The file is byte-identical to a pinned release |
| Rotation snap in the header | SHA-256 of the root set, checked against the engine's constant | The model was trained against the same exact geometry the engine uses |
release.yml assets | .sha256 beside each archive | The download is intact |
| Legacy R4G1 bundle | BLAKE3 digests per component in release-bundle.json | Historical only |
| Private store data | MD5SUMS | A pod's inputs match the store |
| Project binaries in the store | SHA256SUMS, plus a recorded parity pass | A prebuilt binary is the one that was checked |
| Archived records | SHA256SUMS files | Archived evidence is unchanged |
| Results in iCloud | MD5 round-trip on upload | The copy matches the original |
A checksum proves integrity: the bytes are the ones that were pinned. It does not prove who made them, and it says nothing about model quality.
Go deeper
- Language model for the M1 to M8 path; products overview.
- Serving and export for the engine and the export gap.
- Integer serving dossier.
- Compute guide for the private store and
uor-store. - Charter, sections 2, 3.6 and 3.12.
The model, end to end
UOR-R4 turns text into a short list of whole numbers per word, looks back at a few earlier words by walking a small tree of addresses, and picks the stored word nearest to what it found. It never turns scores into probabilities and never multiplies large grids of numbers. This page follows one piece of text through that whole chain and marks each stage as built, trained, or missing. The honest summary is short. Most stages exist and pass small fixed tests. None of them has learned language yet: the best trained model so far is worse than a plain table of word counts (K16 outcome). The project is pre-alpha, and 0 of its 8 milestones are complete (STATUS.md).
The current pipeline. Solid boxes exist in crates/uor-r4-discrete. Dashed boxes are slots a transformer fills that this model has not filled.
How to read the status labels
- Built means the source exists and passes its finite construction controls. These are small, fixed GPU tests that show the code does what it says. A control is not a language result.
- Trained in means the stage took part in at least one learning run with a recorded result. It does not mean the run helped.
- Missing means no code exists, or no mechanism has been assigned.
Labels follow docs/formal_vocabulary.md. Proof means derived from definitions or code. Measurement means a recorded run. Hypothesis means an untested idea. NOT_RUN is never a pass.
One piece of text, stage by stage
The current model lives in crates/uor-r4-discrete. The code-level map is docs/architecture.md.
1. Tokenizer (built; fixed before training). Text is cut into numbered pieces by a byte-level BPE tokenizer with 4,096 pieces, identity d36d3e87. Every corpus, test panel and trained artifact is pinned to it (tokenizer). A 16,384-piece trainer exists as tooling only, and no model has used it.
2. Token table (built; trained in). Each of the \(V=4096\) tokens owns \(B=4\) blocks of 8 whole numbers, so its vector has width 32. Each block is always one of 16 roots from a single orbit of the E8 lattice; each root is a signed rearrangement of \((2,2,0,0,0,0,0,0)\). The model does not use all 240 E8 roots. The same table encodes a token as input, carries it as memory, and ranks it as output; that is the shared vector writer. Exact token identity is kept separately from this geometric address.
There are three ways to fill the table at the start, and they matter a great deal:
| Start | What it gives | Source |
|---|---|---|
| Seeded default | At most 16 distinct vectors for 4,096 tokens (measurement) | pilot diagnosis |
| PrimeZeta injective | 4,096 of 4,096 tokens get unique vectors (measurement) | construction |
| Address-structured cells (A8) | 1,351 of 3,847 copy-successor targets reachable at zero training, against 127 for the injective PrimeZeta start (measurement) | pre-flight |
An injective code is possible in principle, because \(16^4=65{,}536\ge 4{,}096\) (proof, from the block and root counts). See prime-zeta-codebook and address-cells.
3. Ordered context (built; not learned). The most recent tokens form a window of at most 243 positions (\(3^5\)). Recorded runs used 192. A ternary tree built by SpiralCore, the project's exact-arithmetic geometry library, puts those positions at its leaves in order (spiralcore-fbs). Which position a read lands on is decided by address, not by a score over all positions.
4. Reads (built; trained in, but no read's own value is isolated). A read turns the window into one integer vector \(q\) of width 32. There are three, each a hard selection with no softmax:
- Route walks the tree, one nearest port per level, and returns one earlier position's vector rotated along the path.
- Flock keeps a few nearest earlier positions, rotates each into the current frame, sums them and snaps to a root. It was trained only inside the Relation runs.
- Relation is Flock plus a rerank along link types such as "the word after the earlier copy". It has trained twice, and both runs stopped before a verdict.
Route is the base read of every trained artifact, yet it received only 20 learning proposals in 16,404 updates (attention state). Nobody has switched a read off to see what it adds.
5. Shared writer and admission (built; trained in). The writer gives each token a cell from the root numbers of its first and last block: \(c(t)=(\rho_{\text{first}}(t),\rho_{\text{last}}(t))\), so there are \(16\times16=256\) cells. It opens the \(K\) occupied cells nearest to \(q\) by L1 distance (8 in the lineage of record, at most 16), then picks the nearest token inside them. Ties go to the lowest id. No probabilities are formed. This shortlist is admission.
Proof. A target outside the opened cells can never be chosen, whatever the read did. So admission caps everything upstream. Rung 0's top-1 bar was 1,941 rows, but only 1,920 targets were admitted at the end, so the bar was unreachable (Stage A sweep).
6. Loss (built; trained in). The score is an integer rank-margin hinge: the right token must beat its strongest rival by a fixed gap, and the loss is the shortfall. It has no likelihood, so it yields no bits per byte.
7. Discrete learning (built; trained in). One table entry is tried in all 16 legal states on the GPU, and the best is kept only if it strictly lowers the loss. See training.
8. Export (missing for any trained model). The learned table is already integers, so there is no float to round. But no exporter turns a trained snapshot into a D11 artifact, and no export gap has been measured. The existing table engine's schemas /1 and /2 serve softmax through exponent tables, and all three schemas stream dense 4-bit maps with SiLU and GELU tables, so a new table-native schema is likely needed (audit reading, lut-serving dossier; hypothesis).
9. Serving (engine built; never used for this model). The D11 engine runs integer artifacts with no multiply instruction. Its audits pass: 44 native symbol ranges (project track, M4) and 7 of 7 WebAssembly serving functions (WASM runtime record) are free of multiplies. It has served only older models, which missed the milestone bar (the 19.9M-parameter stack reached 0.933 bits per byte against 0.90, "NOT MET by 0.033"). Tokens per second for the discrete model has never been measured (lut-serving).
The missing slots
A transformer has parts this model does not. The board lists them as gaps, and no record fills them:
| Slot | What a transformer does | What exists here | Status |
|---|---|---|---|
| Position | Adds a signal for word order | No mechanism assigned. The tree keeps positions in order, and quaternion transport along a sequence is an idea; its only result came from a softmax, sigmoid and dense core, with unmatched parameter counts (transport record) | Missing. Transport as order is a hypothesis |
| Normalization | Rescales activations between layers | Snapping to an E8 root may play this role, but no record says so | Missing |
| Feed-forward block | A per-token processing layer | The Hamilton gate and SpiralCore/FBS projection are READY, never trained. E8 memory is PARKED. None is on the discrete path | Missing on this path |
| Exporter for a trained trunk | Not a transformer part; the step to a shippable file | The recurrence mode is refused by export, the Hamilton gate "still needs the icosian snap", and stack_export.rs is compiled out | Missing |
Two further things are also not built: using an address as the read (memory by exact name), and a writer cheaper than a scan of the whole vocabulary. The writer's own count is about 5×10⁶ vocabulary-cell comparisons per row (chief architect's review, docs/labs/course-correction-2026-10-18/audits/d37-reactivation-architect.md §3.5), which breaks the per-token sparsity rule D5-b at larger sizes. A bounded \(K\) limits the shortlist, not the work to build it.
Where it stands
| Stage | Built | Trained in | Evidence |
|---|---|---|---|
| Tokenizer | yes | fixed | d36d3e87 pinned everywhere |
| Token table | yes | yes | seeded start has 16 distinct vectors; A8 start admits 1,351 of 3,847 |
| Ordered context | yes | no | 3^5 cap, 192 used |
| Route / Flock / Relation | yes | yes, none isolated | 25 CUDA controls pass (Route and Flock); Relation 9 of 9; verdicts NOT_RUN |
| Writer and admission | yes | yes | K16 runs admit 2,237 and 3,167 of 14,287 (objective A) |
| Rank-margin loss | yes | yes | one variant collapsed to 19 or 20 occupied cells |
| Discrete learning | yes | yes | no run beat its control |
| Export | no | no | no exporter |
| Serving | yes (engine) | no | zero-multiply audits green |
The measured result. On the 14,287-row development panel, a count of the most common next token scores 1,226 top-1 hits and a context-free successor table scores 6,300 (host diagnostics). The best trained discrete model scored 65 and 463 on its two seeds, with admission of 2,237 and 3,167, and both fail the admission gate (measurement, K16 outcome). The cause is not established. A census showed that training had broken much of the early aliasing, yet top-1 stayed low, so ranking capacity, the read and the schedule all remain open, as does the address key (the architect review, section 3.2, shows it takes only five values).
Proof (address key). The address distance uses only the first and last block, and after snapping each endpoint distance takes one of three values, so the sum takes at most five values: 0, 4, 8, 12 or 16. That key must order up to 256 cells, so which cells sit just inside \(K\) is largely decided by the arbitrary cell number (chief architect §3.2, read from discrete.cu).
Go deeper
- Training: how the model learns.
- Mechanism pages: discrete-learning, admission, the mechanism board.
- Code:
discrete.cuholds the reads, the writer and the learning kernels.metadata.rsbuilds the context plans.device.rsis the GPU boundary. - Audit: the renormalization audit record, which holds the stitching map and the code inventory.
- Terms: glossary.
How the model learns
Most language models learn by working out a smooth slope for every number inside them and nudging all the numbers a little. This model does not. It takes one entry of its table, tries every legal turn that entry can make, counts the mistakes after each turn using whole numbers, and keeps the best turn only if it beats leaving the entry alone. The method is exact, cheap per step and runs on the GPU. So far it has moved some counts but has not produced better language, and every new training run needs the owner's personal release.
One batch of discrete learning: score every legal move on 64 rows, choose the lowest integer loss, commit only a strict gain, then verify the stored result.
Labels follow docs/formal_vocabulary.md: proof is derived from definitions or code, measurement is a recorded run, hypothesis is untested. The mechanism page, discrete-learning, is the short form of this page and carries the full run history.
How it works
What is learned. The model holds three kinds of coordinate. A vector block is one of the four 8-number blocks of one token's vector. A route frame is one of 64 signed-axis rotations of 8-dimensional space, one per routing stage. A gate is a switch that takes the values \(-1\), \(0\) or \(+1\). A vector block is always one of 16 roots of an E8 orbit, so it has 16 legal states, counting "stay as it is" (architecture).
The learning step (definition). Training visits one coordinate \(\theta\) per batch. A batch is 64 rows of training text, and which rows can count is fixed by the baseline. For each candidate move \(m\) among the identity and 15 rotations, the machine replays the read and the writer and adds up the integer rank-margin loss:
\[L(m)=\sum_{x\in\mathcal R}\ell\big(x;\ \theta\leftarrow m\big),\qquad m\in\{\mathrm{id},m_1,\dots,m_{15}\}.\]
It chooses \(m^*=\arg\min_m L(m)\). Ties go to the identity, then to the lowest resulting port number, then to the lowest move index. It applies \(m^*\) only if \(L(m^*)<L(\mathrm{id})\), and then re-checks the stored table on the GPU. Nothing is sampled, and no floating-point number appears in the step.
Consequence (proof, from the definition). Every committed move strictly lowers the loss on its own batch, and the new state is always a legal state. The rule says nothing about rows outside the batch. A move that helps its 64 rows can push other targets out of the shortlist, and that is the failure behind the early stops in the table below.
Coverage (proof, by arithmetic). One pass is 16,404 batches of 64 rows, which is 1,049,856 target rows. The training split has 2,425,925 targets, so one pass sees 43.3% of them. Each coordinate is visited about once per pass, with about 64 rows of evidence (chief architect's review §3.4).
The GPU kernels
All model compute is GPU-only; a host fallback is a defect to fix (charter §3.5). The kernels live in discrete.cu and its generated siblings. The build checks the emitted GPU code and rejects any floating-point type, tensor-core instruction or approximate exponent (crates/uor-r4-discrete/build.rs, PTX admission audit).
- Ordinary counterfactual. One block of 16 threads, one thread per move. Each thread walks every row in turn and recomputes the baseline. A route proposal took 3.903 s against 37.8 ms for a plain forward pass, which projected to about 17.8 hours for one 16,404-batch pass (measurement and projection, unverified, driver cost). A later diagnostic put this kernel at 99.99% of a proposal (sub-phase diagnostic).
- Row-parallel counterfactual (
rows_v1). It computes the baseline once per row and each virtual move once per (row, lane), then a reducer replays the ordinary loop over those records in row order. So 64 rows by 16 lanes run as 1,024 threads. It is opt-in, and it matched the ordinary kernel's losses on every finite case checked (72, 108 and 288 cases in the three tables of the rows parity record; 1,085 in all across the attempt files, per the documentation reconciliation). - Speed (measurement). At vocabulary 4096, 4 blocks, context 192, \(K=8\), 64 rows, on one RTX 5090, the median of five proposals:
| Read and coordinate | Ordinary | Row-parallel | Ratio |
|---|---|---|---|
| Route, vector block | 3.843 s | 0.0691 s | 55.6 times |
| Relation, gate | 4.144 s | 0.0728 s | 56.9 times |
This is the "56 times" figure. The timing is non-gating and was not qualified (qualified=false). The A8 control arm later completed 16,404 batches in 1,967 s, or 0.12 s per batch (A8 dose). It used a different read, so treat that as a rough size of the gain.
BVG-K: several coordinates per launch
BVG-K means batched verified coordinates, with \(K\) the batch size. One row-parallel launch occupies at most 8 of an RTX 5090's 170 multiprocessors, so the card sits mostly idle. BVG-K scores \(K\) coordinates in one launch (1 to 64 are supported), chooses the best move for each, and commits the whole block only if its joint loss beats the best single move.
- Scoring (measurement, quoted). About 16 times faster at \(K=16\) than scoring one coordinate at a time, from the first qualifier (BVG-K scoring).
- Block apply (measurement, on fixtures). 259 ms at \(K=16\) with joint verification, about 8 times faster than 16 single proposals at roughly 130 ms each (qualifier).
- As a learning law, never run. BVG-K has passed construction tests only. It is the matched discrete competitor that any float method must beat.
Float training, offline only (D37)
On 18 October the owner revised the discrete-only rule: floating point is legal in offline training. A float forward pass, gradients and an optimizer may be used. Three things still hold (D37):
- The bans on expensive operations stand. No softmax or other squashing function, no dense matrix multiplication, GPU only, and the path must stay geometric.
- Float lives in a separate module. It gets its own scanned entry, added with its pre-registration. It never goes in the discrete crate or in
crates/uor-r4-training. - The integer artifact is the boundary. Every float candidate reports its export gap, the loss in quality when its weights become the integer file. A gap above the two-seed noise band disqualifies it, and a float score alone qualifies nothing (D39 item 5).
No float sheet is registered. The order set in D39 item 4 is the read-code capacity capture (W2), then BVG-K (W3), then a single float-credit sheet only if W2 points at the learning law and W3 fails. The chief architect expects the export gap to be structurally non-zero, because the table entries are exact roots with no continuous scale (hypothesis, docs/labs/course-correction-2026-10-18/audits/d37-reactivation-architect.md §3.3).
Holds and pre-registration
Training is held. The global training hold, the M2 hold and Stage B all stay in force, and a review that finds a plan fit releases nothing (charter §5.1; D37 item 6).
- Pre-registration. Before any GPU training or evaluation, and before any run a milestone claim rests on, a one-page sheet states the bar, the noise, the controls, the seeds, the cost and what each outcome decides. A non-author reviews it for
TEST FITNESS: FIT. A fresh-context subagent counts as non-author. Builds, finite kernel tests and host checks need no sheet. - Release. One typed owner release per sheet covers all its arms, seeds and stop rules. Casey types it personally with
UOR_LABunset. A lab stages the commands and verifies the records, and never types one itself (D40). - Compute. Pods go through
scripts/pod/uor-pod: at most 4 pods and $8 an hour across all labs. A healthy run is never cancelled for a self-set budget. - Bar. The M1 closing bar is integer top-1 through the D11 export, on each of two seeds, beating the unigram table (1,226 of 14,287) and the successor table (6,300 of 14,287) on the same panel, with tokens per second reported (charter §4.8). The earlier 0.90 bits-per-byte bar was replaced for M1, since the hinge gives no likelihood.
Where it stands
No training run on this path has produced a KEEP. The table below lists six campaigns since 13 October: the pilot, the Stage A sweep, the Q1 diagnosis, the four K16 runs, the A8 dose and the controller run.
| Date | Run | Result | Verdict | Record |
|---|---|---|---|---|
| 2026-10-14 | Pilot, seed 1, 1,640 batches, vector blocks only | Top-8 hits 173 to 1,169, top-1 17 to 82, yet loss 13,816,032 to 13,884,032; 236 of 1,640 batches accepted | inconclusive | pilot |
| 2026-10-15 | Same lineage to 16,404 batches, \(K=8\) | Top-1 149, top-8 747 of 14,287; 1,920 targets admitted against a gate of 4,894 | negative | Stage A sweep |
| 2026-10-18 | Relation and control to the 4,096-batch checkpoint | Copy-successor admission 2,034 to 225 (Relation) and 205 (control) of 3,847 | diagnostic stop | Q1 diagnosis |
| 2026-10-19 | K16: two objectives, two seeds, 16,404 batches | Objective A: top-1 65 and 463, accepted 407 and 410; objective R collapsed to 19 or 20 occupied cells | negative (configuration) | K16 outcome |
| 2026-10-19 | A8 cells, Relation against frozen control | Admission 1,351 to 551 (Relation) and 857 (control) at the checkpoint | diagnostic stop | A8 dose |
| 2026-10-19 | Admission-preserving controller | 198 host tests pass; GPU qualification and any learning result NOT_RUN | inconclusive | controller |
What the runs say. Only 0.8% to 2.5% of batches in the K16 runs were accepted (407, 130, 410 and 129 of 16,404), against 14.4% in the pilot. A negative closes a configuration, not the mechanism (D22). The next decisive step, W2, is already reviewed fit and queued. It separates a representation wall from a learning-law wall (renormalization audit record).
Never tested. Route-frame and gate learning at dose; a full corpus pass; BVG-K or the admission-preserving rule as a GPU training run; all 240 E8 roots; any generated text or tokens per second from a trained discrete model; fresh-slice transfer (sealed); any float credit sheet.
Go deeper
- Pipeline: the model, end to end.
- Mechanism pages: discrete-learning, rank-margin, admission, legal-construction (the older float attempt at the same goal).
- Code:
device.rs,training.rs,rows_source.rs,bvgk_source.rs. - Audit: the renormalization audit record and the discrete-learning mechanism page.
Data and tokenizer
The model never sees letters or words. It sees a stream of numbered pieces of text, and a small program called a tokenizer cuts text into those pieces and turns them back into text. The project's data is chat-shaped text, prepared into files of piece numbers with one fixed tokenizer of 4,096 pieces. Every prepared file carries a fingerprint of that tokenizer, so a result can never be quietly compared across two different ways of cutting text. The data is small: the training set for the current model path is about 7.5 million tokens. A larger corpus, written once by an open donor model under a narrow owner exception, is planned but has not been generated.
Labels used below: proof means derived from definitions or code, measurement means a recorded run, hypothesis means an untested idea. See docs/formal_vocabulary.md and the glossary.
Bytes become pieces by repeated merging, and the tokenizer's fingerprint travels with every prepared file. A two-digit number is still two pieces.
flowchart LR
T["text: chat and memory dialogues"] --> P["Rust corpus preparation"]
TOK["tokenizer d36d3e87, 4,096 pieces"] --> P
D["distill-d1: planned, one-time, not generated"] -.-> P
P --> U["UORT v1 file: header, 16-bit ids, response mask"]
U --> C{"driver checks file hash, token count, tokenizer"}
C -->|all match| TR["training and evaluation on the GPU"]
C -->|any mismatch| X["refuse to read"]
From text to a model run. The dotted arrow is a plan, not a file that exists.
The tokenizer
What it is (definition). A byte-level byte-pair-encoding (BPE) tokenizer. It starts from the 256 possible bytes, so any text can be encoded. It then learns the most frequent adjacent pairs and glues them into bigger pieces. This is a standard technique and is not novel here.
Layout of the pinned tokenizer. Pieces 0, 1 and 2 are start, end and unknown. Pieces 3 to 258 are the 256 single bytes. The rest are learned merges:
\[3+256+3837=4096 .\]
Training (definition). Count each adjacent pair over the unique pieces of text in the corpus (pre-tokens), weighted by how often each occurs. Merge the pair with the highest count into a new piece and recount only the words that contain it. Repeat until the vocabulary is full. Ties go to the pair whose left, then right, piece string sorts first, so the result is the same every time. Special tokens are atomic, and no merge crosses a special token, a pre-token boundary or an input file. Encoding then applies the merges in rank order: a table look-up with no learned arithmetic (training.rs, lib.rs).
Identity. The tokenizer crate computes a blake3 content address of the raw tokenizer.json bytes, and the discrete driver pins each file by SHA-256. The pinned tokenizer is written d36d3e87…; its full 64-hex SHA-256 is listed in the donor-corpus sheet. A different tokenizer is therefore a different corpus.
The 16,384-piece trainer. On 19 October a Rust command, train-bpe, landed for building a tokenizer of any size from 259 to 65,536 pieces (train-bpe.rs, record). It is deterministic, refuses to overwrite a file, and by default accepts 64 MiB of input. Checks compared its merge ranks and its segmentation with an independent exhaustive recount over 40 small test corpora, and a synthetic 8,192-document fixture reached exactly 16,384 pieces. Measurement, of the tool only. It changes no active file. No tokenizer has been swapped, and no model has been trained or scored on any tokenizer other than d36d3e87. Whether 16,384 pieces help the model is a hypothesis.
Numbers are split. The vocabulary has no multi-digit piece, so 84 is the pieces 8 and 4. In an older chat model's 9 October acceptance run, memory rows with a distractor and a number as the stored value passed 1 of 11, against 9 of 23 with a word as the value. A diagnosis found no multi-digit token, and that the right value was not emitted rather than confused with a distractor. An untrained probe showed the project's number codec already stores two-digit values in order, so storage is not the cause; the failure sits in the learned read and write path. Both are measurements, on an older float model (diagnosis, probe). Whether digit-split numbers still hurt once the discrete read can address an exact value is open.
The prepared files
Format (definition). A prepared corpus (UORT v1) is a 64-byte header followed by 16-bit piece numbers, with start-of-document markers and an optional one-byte-per-token response mask. The mask marks the reply tokens, the only ones scored as targets. Context resets at each start marker. Before reading, the discrete driver checks each file's SHA-256, the token count and the tokenizer file (corpus.rs). A DialogueProtocol object fixes how roles and turns are written out, so training, test panels and chat all use identical token segments (dialogue.rs).
Preparation is host-side Rust bookkeeping, not model compute (prepare-knowledge-corpus.rs, prepare-chat-parquet.rs, mix-chat-corpus.rs).
The corpora
| Corpus | What it is | Used for | Licence | State |
|---|---|---|---|---|
Memory dialogues mw-balp: 7,512,797 training tokens, 2,425,925 scored targets. Dev split: 42,856 tokens, 14,287 scored targets | Generated by this project | The discrete model's rung-0 and K16 training sheets | MIT | Active (rung 0, K16 redirect) |
mw-orcp and dialogue-recall sets | Generated by this project | Memory fine-tunes and recall panels | MIT | Historical |
| TinyStories | Short children's stories | The 8M to 214M float ladder | CDLA-Sharing-1.0 | Historical |
| TinyDialogues | Short dialogues | 214M "Step 8" pretraining | MIT | Historical |
| SmolLM-Corpus (FineWeb-Edu, Cosmopedia-v2) | Web and synthetic text | "Plan A" pretraining | ODC-BY | Historical |
SmolTalk and UltraChat 200k, as chat-v0-p2 | Chat | Chat pretraining share and assistant fine-tune | Apache-2.0 / MIT | Historical |
distill-d1 | A donor-written corpus | The discrete student | Apache-2.0 donor | Planned; not generated |
"Historical" means trained before the no-softmax and no-matrix-multiplication rules (D23 to D25), in the float form. Source: the Hugging Face dataset card and the sheets above. The training data never includes the frozen test-panel rows.
Data against size (measurement, older float stack). With the model size held at 7,155,396 parameters, changing only the training data from a mixed set to chat-only lowered the held-out score from 1.1199 to 0.9607 bits per byte, a gain of 0.1592. Growing the model from 7.16M to 19.93M parameters at matched data gained 0.0837 more. Both come from one seed, one corpus and one held-out stream, and the record says a claim finer than about 0.01 bits per byte needs a clustered protocol (#1894). This is the reason the project keeps asking for data first, but it is not a result on the current model.
Where the files live
| Hugging Face repository | Visibility | Contents |
|---|---|---|
caseyallard/uor-r4-geometric-214m | Public | Four 214M historical float checkpoints (base-tinystories, base-planA, chat-planA-b8, chat-smoltalk-b16) with configs, sanitized run reports and the tokenizer. TinyStories validation NLL 1.032; FineWeb dev NLL 2.90 to 2.073; the chat variants rewrite and summarize usably, while code and arithmetic are wrong. Not the served model |
caseyallard/uor-r4-data | Public | The project-generated data: tokenizer, memory-dialogue sets, dev split, conversational panels, TinyStories tokenized for the native learner |
caseyallard/uor-r4-store | Private | The working store: data/* (2.7 GB), base models, toolchain and binary caches, pod set-up, and archived run results (compute) |
distill-d1: one planned donor corpus
What was decided. On 19 October the owner ratified a one-time exception (D41). One open-weight donor, openai/gpt-oss-120b, may run once, offline, on one declared rented GPU, to write one corpus named distill-d1 (D41, record). The exception covers generation only and expires when the corpus is sealed.
What stays fixed. The donor never runs in student preparation, training, evaluation, serving, grading or any panel. The student reads donor-chosen tokens as hard targets only, with no probabilities or logits. A generation receipt (donor revision, weight hashes, prompt-set hash, seeds, sampling settings, pod identity, per-shard SHA-256 and a Merkle root) is bound at generation and read back. The corpus is an input to experiments, not evidence of capability.
The registered plan (sheet, status TEST FITNESS: FIT, no compute run, $0 so far). The target is 30,000,000 student tokens, with a floor of 20 million and a ceiling of 50 million. Each document is at most 200 tokens. The mixture is conversation 35%, question answering 20%, short code 20%, short reasoning prose 15% and general prose 10%. A pilot of about 1 million tokens (about $2) comes first, and production at 30 million tokens is projected at about $52, or $63 with retries. These costs are planning estimates, not invoices. The sheet sizes the corpus to what the student can consume, about 490 target tokens per second, or roughly 17 hours per pass at 30 million tokens.
What it needs before it runs. The owner must type the release personally at dispatch time (D40), and the driver-speed work must finish first. A matched-control training sheet would be needed to learn whether distillation helps at all.
Where it stands
| Item | State | Kind | Source |
|---|---|---|---|
| Pinned 4,096-piece tokenizer | ACTIVE; every current corpus, driver and artifact is bound to it | status | tokenizer page |
| 16,384-piece trainer | Landed as tooling; no tokenizer swapped; no model on any other tokenizer | proof (tests) and status | record |
| Training data for the current path | About 7.5M tokens of generated memory dialogues | measurement | rung 0 sheet |
| Data worth more than size, at 7M parameters | 0.1592 against 0.0837 bits per byte, one seed | measurement | #1894 |
| Multi-digit numbers | Not built; split pieces make numeric recall hard for the older model | measurement | diagnosis |
| Other scripts and languages | Never tested; the corpora are English chat | none | tokenizer page |
distill-d1 | Registered, not generated, no capability claim | hypothesis | sheet |
No model holds a useful conversation yet, and 0 of 8 milestones are complete (project track).
Go deeper
- Mechanism pages: tokenizer, prime-zeta codebook (assigns each piece an address), address cells (sized by the vocabulary), discrete learning.
- Code:
uor-r4-tokenizer,corpus.rs,prepare-knowledge-corpus.rs. - Records: numeric plan, consumer verifier for
distill-d1, dialogue protocol contract. - Next pages: serving and export, GPU and CUDA. Model pages: architecture, training.
Serving and export
A finished model has to leave the lab and run on an ordinary laptop or in a web browser. The project's rule is that the file it ships contains only whole numbers, and that the program running it uses only adds, shifts and table look-ups: no decimal (floating-point) arithmetic and no multiply instruction. The program that does this exists, and a checker has counted its machine instructions. But it has only ever run older models that fell short of their targets, plus a synthetic stand-in. No model built under today's rules has been exported to it yet, so nobody can chat with the project's model on a laptop today.
Labels used below: proof means derived from definitions or code, measurement means a recorded run, hypothesis means an untested idea. See docs/formal_vocabulary.md and the glossary.
Training may use decimals; serving may not. The snap from one to the other is where quality can be lost, and that loss is the export gap.
Two halves with one hard border
Offline half. Training runs on rented GPUs and may use floating point. The owner's rule (D37, 18 October) allows float forward passes, gradients and optimizers offline, with two limits that stay: no matrix multiplication and no squashing functions such as softmax (D37). The project's active learning path, the discrete model in crates/uor-r4-discrete, is stricter still: it is integer from end to end (GPU and CUDA).
Served half. What ships is "D11", the project's serving contract (D11, 27 September). It has five rules:
| Rule | Plain meaning |
|---|---|
| R1 | No floating point and no maths library |
| R2 | No multiply or divide instruction in any served kernel. Products of runtime values use tables or exact geometry |
| R3 | Reading every stored weight for every token is an interim stage, not the end state (D5) |
| R4 | No transformer backbone |
| R5 | Energy is claimed only when measured |
Serving on the user's own device, including browser WebAssembly, is the product and is allowed (charter, section 3.6). The border between the halves is the export, and it is where a float-trained candidate is judged.
How the engine works
The container (definition). UORLUT01 stores weights as 4-bit codes in groups of 32. Each group has a one-byte scale, built from a 4-bit mantissa and a 4-bit exponent. A few small integer tables cover the nonlinear steps: square root, decay rates, exp, SiLU, GELU and arcosh (SiLU, GELU and exp are squashing-type tables; see the compliance note under "Where it stands") (format.rs).
A projection with no multiply (proof by construction). For a weight row \(w_{ij}=s_g\,q_{ij}\) with 4-bit code \(q_{ij}\) and group scale \(s_g\), the output is
\[y_i=\sum_j s_{g(j)}\,q_{ij}\,x_j .\]
Instead of multiplying \(q_{ij}\) by \(x_j\), the engine builds once per activation a 16-entry table \(T_j[q]=q\,x_j\) for \(q=0,\dots,15\). Each entry comes from the one before by adding \(x_j\). Each weight's code then selects an entry, and the group scale is applied with shifts and adds. Four output rows share each table (kernels.rs).
Two runtime values multiplied together (proof). A score, a gate or a value mix needs a true product of two numbers that only exist at run time. The engine reads it from a table of the sixteen multiples of one operand, built by repeated addition, indexed by the radix-16 digits (base-16 digits) of the other operand and summed with shifts (stack_mul_u64 and stack_mul_u128 in kernels.rs). Write \(b=\sum_k 16^k d_k\) with each digit \(d_k\in\{0,\dots,15\}\) and let \(T_a[q]=q\,a\), built as \(T_a[q+1]=T_a[q]+a\). Then
\[ab=\sum_k 16^k\,T_a[d_k(b)] ,\]
which is exact by the definition of base-16 digits, and each term is a table read followed by a shift. (An alternative that D11 rule R2 would also allow is the quarter-square identity \(ab=\lfloor (a+b)^2/4\rfloor-\lfloor (a-b)^2/4\rfloor\), which holds for all integers; the training crate uses it in addressing_arms.rs, but the serving engine does not.) Normalisation uses an integer square root, computed digit by digit, and the sampler is an integer min-p rule. That sampler filters on probability mass read from the exp tables, so it is part of the compliance gap described under "Where it stands".
Exact geometry as tables. Where the model uses geometry, the tables are exact: the Cayley table of the 120-element icosian group (about 14 KiB), a 1,025-entry arcosh table for Lorentz read scores, and the Q30 Hopf observation. The integer crate's native_geometry.rs provides the typed H4 geometry and checked integer arithmetic that the qualified native build uses; no discrete-model export uses it yet (native_geometry.rs).
A saved conversation (definition). The UR4SESS1 format saves a session's state and restores it byte for byte (session_codec.rs).
The zero-multiply audit
The audit disassembles the compiled release program and counts three kinds of instruction over the serving functions: Class I multiply, Class II divide, Class III floating point. The scripts are audit_zero_matmul_serving.py (native) and audit_zero_matmul_wasm.py (WebAssembly, with a call-graph mode). They are existing Python scripts; porting them to Rust is an open question.
- Native: 44 symbol ranges audited, none with a forbidden instruction (project track, milestone M4). Measurement.
- WebAssembly: 7 of 7 serving functions (not modules) with multiply, divide and float counts all 0, in the runtime merged as
UOR-Foundation/uor-r4#2654(record). It was written by an outside contributor and hardened in review before merge. Measurement.
What the audit proves is absence: those instructions are not in the audited functions. It says nothing about model quality, and it does not cover every function in the binary. The record also lists three limits. First, the WebAssembly SIMD kernels are fixtures that nothing calls; the serving path still uses the scalar table kernel. Second, the demo in docs/wasm-serving/ does not run from a clean clone until its bundle is built. Third, the serving-wasm build compiles the model, sampling and tables modules unconditionally. Compliance with the "presence counts" rule (D29) rests on the feature defaulting off plus link-time removal, an interpretation that DECISIONS.md does not record.
The export gap
Definition. The export gap of a candidate is its served score minus its float score, on the same evaluator and the same positions. It is the price of snapping. The charter says a float candidate whose gap is above the two-seed noise band is disqualified (charter, section 3.7).
Past gaps come from an older float model, the "geometric stack", not from today's discrete model. Bits per byte (BPB) and nats are different units, and lower is better in both.
| Date | What was exported | Gap | Source |
|---|---|---|---|
| 28 Sep | 7.15M stack, round-to-nearest 4-bit | +0.0362 nats (gate 0.02) | record |
| 28 Sep | Same stack, GPTQ rounding | +0.0257 nats (gate 0.02) | same record |
| 29 Sep | Same stack after 1,000 quantisation-aware updates | +0.010637 nats; marked pending a re-run | record |
| 8 Oct | 19.9M chat stack, identical positions | 0.00883 BPB; engine difference about 1e-6 | #1915 |
| 9 Oct | Matched float, reference and integer runs at 512 windows | 0.009288 BPB; engine 2.7e-7 | pin |
Two readings follow, both measurements on those older models. The integer engine adds almost nothing of its own: it reproduces its reference to about a millionth. And the whole gap is weight rounding, with the output layer the largest share in the 28 September record. Two cautions apply. The 8 October pair 0.877 float and 0.933 served was never like-for-like, because it mixed 512 and 64 evaluation windows. And the export of a model built under today's rules has not been measured, because none has been exported.
Where it stands
| Item | State | Kind | Source |
|---|---|---|---|
| Native zero-multiply audit | Green, 44 symbol ranges | measurement | project track |
| WebAssembly runtime and audit | 7 of 7 serving functions clean; 165 tests pass; a saved session reloads identically on a synthetic stack | measurement | #2654 record |
| Engine against its reference | No difference on every windowed check of the older models | measurement | D11 serving |
| Quality of models it served | 1.20138, 1.24402 and 1.24233 BPB, against a 0.90 BPB bar. The record blames the model, not the export | measurement | same record |
| Speed of those models | 68 to 80 tokens/s on 8 threads for the 29M-parameter stack, which reads about 30.2M parameters per token. This is evaluation throughput over 64 scored (teacher-forced) windows, not free-running decode: no decode tokens/s exists for any D11 artifact | measurement | same record |
| Energy of table-emulated products | 0.00413 J/token against 0.00096 for float, about 4.3 times worse, on a dense model. The record notes power counters were unavailable on that OS version | measurement | #1449 |
| Export of a model built under today's rules | Does not exist; its gap is unmeasured | none | project track, M4 |
| Serving addressed (product-key) memory | Refused by the exporter; the kernel is not built | blocker | record |
| Milestone M4 (one served model, bar 0.90 BPB) | Not met. 0 of 8 milestones are complete | status | project track |
| Web client | The Studio page still points at a retired engine; the Pages deploy is switched off (D36) and the live site is the 13 October build | status | D36 |
Why reading every weight is not the end state. A dense model streamed through tables is still dense. The table-emulation energy test above is the evidence, and D5 asks instead for selected, addressed reads that touch few parameters per token. No existing schema fits today's rules as it stands. Schemas /1 and /2 carry softmax-style reads through exp-table masses, which the no-softmax rule (D23) names. A third schema serves a softmax-free flock read, but its trained arms missed their bar (record). All three carry SiLU and GELU tables, which the charter bans in renamed or table form (section 3.2), and all three stream dense 4-bit weight maps through a table-based matrix-vector product, which the charter excludes as a dense model disguised as lookup tables (sections 3.3 and 3.6). The min-p sampler also works on exp-table probability mass. D11 rule R3 ("reading every weight is an interim stage") is historical wording: dense table maps are no longer an allowed stepping stone for new exports. A new table-native schema, built on selected and addressed reads, is therefore likely required. These are the engine's known compliance gaps, and the serving mechanism page tracks them.
Next. Export one discrete model through the container and report its gap (milestone M4). Whether UORLUT01 needs a new schema for table-native models, rather than 4-bit dense groups, is an open question.
Go deeper
- Mechanism page: D11 integer table serving. Model and geometry: discrete learning.
- Code:
crates/uor-r4-integer(engine, container, session codec,uor-chatanduor-r4-stackcommand-line programs behind theserving-wasmfeature). - Decisions: D11, D37, D38 (the two halves of D5).
- Records: context curve, stack port design.
- Next pages: data and tokenizer, GPU and CUDA. Model pages: architecture, training.
GPUs and CUDA
The project trains and tests its model on graphics cards (GPUs), not on the laptop's processor. The programs that run on a GPU are called kernels, and the project writes them in CUDA, NVIDIA's language for GPUs. Every kernel is compiled before it runs. For the active model, an audit reads the compiled result and refuses instructions the project has banned: decimal arithmetic, tensor-core matrix instructions and approximate exponentials. The cards are rented by the hour from a marketplace through one script, under hard limits on how many and how much. The rented GPUs are used for qualification runs and a few short training doses. No trained language model has come out of them yet.
Labels used below: proof means derived from definitions or code, measurement means a recorded run, hypothesis means an untested idea. See docs/formal_vocabulary.md and the glossary.
flowchart LR
subgraph K["What the active kernels compute"]
READ["read and write one vector (forward)"]
PROP["score candidate moves (counterfactual)"]
PICK["choose and apply one move"]
EVAL["evaluate: top-1 and top-8 hits"]
CNT["count tokens: frequency baselines"]
end
subgraph B["How they reach the GPU"]
NVCC["nvcc builds PTX ahead of time"]
AUD{"PTX admission audit"}
CUBIN["cubin and resource report"]
LOAD["driver loads the prebuilt module"]
STOP["build fails"]
end
K --> NVCC --> AUD
AUD -->|admitted| CUBIN --> LOAD
AUD -->|rejected| STOP
The kernel map. Source files compile to PTX before anything runs, and the audit sits between compiling and loading. There is no run-time compiler.
The kernels and what they compute
The active model is crates/uor-r4-discrete, and its kernels are integer only. The header of discrete.cu says model values use gather, sign, add and subtract, comparison and finite action-table look-ups, and that storage indexing uses integer products. It has 577 lines and 12 entry points:
| Kernels | What they compute |
|---|---|
discrete_init, discrete_encode, discrete_export_token_cells | Set up the vector table from a seed, encode token numbers as vectors, export each token's address cells |
discrete_forward | The read (route, flock or relation) and the shared writer: predictions, losses and traces |
discrete_counterfactual | Score candidate moves in 16 fixed lanes, without changing the model |
discrete_choose, discrete_apply, discrete_validate | Pick the best proposal, commit one move, check the state |
discrete_evaluate, discrete_evaluation_aggregate | Top-1 and top-8 hits, with all arithmetic and denominator checks done on the GPU |
discrete_count, discrete_count_score | Count token frequencies and rank them: the simple count baselines a model is compared with |
Five more modules are generated from discrete.cu at build time, each its own source, PTX and cubin, so the earlier images stay byte for byte unchanged: a diagnostic decomposition, baseline reuse, row-parallel scoring (rows, 3 entry points), scoring several coordinates per launch (rowsk, 5) and selecting and committing a set of moves (bvgk, 8). The build also writes exact geometry tables from the core crate: AXES[512], COMPOSE[4096], INVERSE[64], 16 carrier roots, a breadth-first reachability map and 15 generators (build.rs).
Other CUDA code in the repository is not on the active path:
| File | Lines | Status |
|---|---|---|
uor-r4-training/src/cuda_stack.cu (22 kernels: Hamilton gate, rate select, normalisation, quaternion and recurrence scans, margin ranking, Adam update) | 859 | Held. Float, for offline training under D37 |
spiralcore_fbs.cu, starling_native.cu | 183, 134 | Held. The SpiralCore/FBS float projection and the flock-style selector |
third_party/candle-kernels-0.9.2 (nine tensor modules) | 1,778 | Comparator. Patched to drop exp, log, sigmoid, tanh, erf, GELU, SiLU, softmax and RoPE |
Upstream and D29-excluded kernels under historical/ and docs/history/ | 10,877 | Never compiled. Kept as evidence |
Line counts are raw counts of the files named.
How a kernel is admitted
Compile ahead of time (definition). The build script calls nvcc -ptx -std=c++17 -arch=compute_NN, where NN is the card's capability from the explicit UOR_NVCC_ARCH setting. NVIDIA's run-time compiler, NVRTC, is banned project-wide (D29, amended 13 October): what nvcc compiles at build time is exactly what the driver may load, and banned code present in a module counts even if never launched (D29). Two older pages, the CUDA training runbook and the pods quickstart, still describe NVRTC. They were written before the ban.
The admission audit (proof by inspection of the code). The audit reads the emitted PTX text, not the CUDA source, so a banned instruction cannot hide behind spelling. It strips comments, splits each line into tokens, and rejects the build if any token has a component named f16, f16x2, f32, f64, bf16, bf16x2, tf32, e4m3, e5m2, mma, wmma, wgmma, tcgen05, tensor or tensormap, or starts with ex2.approx. It also requires the set of .entry points to equal the declared inventory exactly: a missing, extra or duplicate entry fails. A self-test runs on every build. It must accept a clean module (floats inside comments are fine) and must reject add.f32, a .bf16 register, mma.sync, ex2.approx, an unexpected entry, a duplicate entry and missing entries. After admission, the same admitted PTX is assembled into a cubin for each of the six modules, and the build fails if the cubin is empty or its resource report is missing.
What it does not say. Integer multiplies are allowed in these kernels, for example to compute indexes. This is a different rule from the serving contract, where no multiply instruction may appear at all (serving and export). The float training crate has no equivalent PTX audit, since float is legal there, and uses precision flags instead (-ftz=false -prec-div=true -prec-sqrt=true, and --fmad=false for the flock selector). Passing the audit shows which instructions are present. It does not show that a kernel computes the right thing. Correctness comes from separate controls on a pod.
Not in continuous integration. No GitHub workflow mentions nvcc or CUDA. The standing checks compile without the cuda feature, and qualification runs on rented pods. For exact-head compile checks there is a recipe, scripts/pod/uor-cuda-check-remote. It rents one fresh RTX 5090 with CUDA 12.8 for 15 minutes (30 for the training crate), runs cargo check and then clippy, and tears the pod down (compute guide). It is compile and lint only, never a model run.
Renting the cards
The rules are written in docs/labs/compute.md and printed by uor-pod itself.
| Rule | What it says |
|---|---|
| One tool | Every pod action goes through scripts/pod/uor-pod. Nobody rents by hand |
| Provider | Vast.ai is the default since 13 October (D26). Runpod is an emergency backup: up --wait falls back to it after 30 minutes with no Vast offer, and choosing it by hand needs --owner-approved |
| Hosts | Verified datacenter hosts only, with CUDA 12.8 or newer. Community hosts are not used, because their operator would hold the disk and the access token |
| Ladder | RTX 5090 first, then 4090, then RTX PRO 6000. A100, H100 and larger are refused without owner approval |
| Caps | At most 4 running pods and $8 an hour, counting both providers together |
| Leases | Each session leases the GPUs it uses, renews at least every 30 minutes, and releases when done. Another session's GPU is never yours, even idle; only an expired lease may be taken over |
| Jobs | One job per GPU, run detached under a lock, with a log ending in # exit=N |
| Safety net | A pod-side reaper deletes a pod with no live lease after 20 idle minutes |
| Results | down copies the run, job, pod and evaluation folders off the pod first, or uploads them to the private store. Pods are not kept as storage |
| No fallback | If no GPU is free and the caps are reached, wait or ask the owner. Never run model work on the laptop CPU |
The laptop does non-model work: editing, compiling CPU-only builds, static checks and grading stored outputs. All model compute is GPU work (D24). Serving a finished model on the user's own device is a separate matter and is allowed (charter, section 3.6).
Measured costs.
- On 13 October a verified datacenter RTX 5090 on Vast cost $0.469 an hour, against $1.19 an hour on Runpod. A fresh Vast pod took its toolchain, crate cache and binaries from the private store and was ready in 57 seconds, with nothing built (measurement, compute guide).
- The 19 October A8 dose ran on a Vast pod with two RTX 5090s at $1.816 an hour for about 62 minutes: about $1.9. That is a resource estimate, not an invoice, and storage and transfer were not measured. The owner typed the release for each arm personally (record).
- Scoring 16 candidate moves in one launch took a median 123.57 ms, against 125.51 ms for scoring one. All 5,130 coordinates matched the reference exactly, and a deliberately broken copy failed as it should. The earlier launch used only 8 of the card's 170 multiprocessors (record). Measurement, at that one shape.
- One full pass over every parameter of the discrete model is projected at about 17.8 hours for the route read and 19.2 for the flock read, roughly $16 to $17. That is an unverified projection, not a run (record).
- A fused memory kernel claimed to be 12 times faster was never run on the pod, and its commit broke the build and was reverted. No measurement survives (record).
Where it stands
| Item | State | Kind | Source |
|---|---|---|---|
| Active kernels and PTX admission | Built and qualified on pods. The 19 October A8 dose trained two arms and was stopped for diagnosis, which the record says is not a mechanism negative | measurement | A8 record, discrete crate |
| NVRTC | Banned and removed from the active path | status | D29 |
| Float training kernels | Held, with no PTX audit | status | compute guide |
| Training | Held; a run starts only on the owner's own typed release (D40) | status | A8 record |
| CUDA in CI | None; qualification is on pods | status | .github/workflows/ |
| A trained language model from these GPUs | Does not exist. 0 of 8 milestones are complete | status | project track |
Go deeper
- Mechanism pages: discrete learning, SpiralCore and FBS, Hamilton gate.
- Code:
discrete.cu,build.rs,scripts/pod/uor-pod. - Guides: pod rules, CUDA training runbook (older, pre-dates the NVRTC ban), pods quickstart.
- Next pages: serving and export, data and tokenizer. Model pages: architecture, training.
The geometry of UOR-R4
Most chat AIs predict the next word by multiplying very large grids of decimal numbers. UOR-R4 is a bet that a different set of tools can do the same job more cheaply: rotations in a few dimensions, exact whole-number addresses built from primes, and lookup tables. This section explains those tools one chapter at a time, with pictures. It also says which ones the model uses today and which are research that has not yet been put to work. The project is pre-alpha: 0 of its 8 milestones are complete, and no model holds a useful conversation yet (STATUS.md).
How the geometric pieces connect. Each arrow is one correspondence, and the table below says whether the link is forced by the mathematics or was chosen.
Why geometry
The owner's rule for this project is that the core of the model is built from geometric mechanisms. The reason is a cost hypothesis. A transformer's expensive parts are dense matrix multiplication, a score for every possible next word, and storing every earlier position. Rotations, exact addresses and tables may be much cheaper on a laptop (a hypothesis: no efficiency has been measured yet). Whether they are also good enough to model language is the open question.
These rules shape how the geometry is used.
- No softmax or squashing, no matrix multiplication. Softmax, sigmoid, tanh and softplus are banned in every executed model path (D23, D25), and so is matrix multiplication in training and serving (D25, D30). Attention itself is not banned: bounded geometric reads replace it.
- Research compute is GPU-only (D24). Serving the exported D11 integer artifact on a client device (CPU, WASM, Apple silicon) is the product and is allowed. It uses no floating point and no multiplier instruction.
- Floating point is for offline training only (D37). Float never re-admits softmax, squashing or matrix multiplication. The active discrete path and the served model stay integer (D11), and every float-trained candidate must report its export gap, the quality lost when converting to the integer artifact.
- Geometry is a design priority, not a measured advantage. A failed experiment closes one configuration, never a whole mechanism (D22). A passing check on a piece of mathematics does not show that the piece helps a language model.
Labels on this page follow docs/formal_vocabulary.md: proof means derived from definitions or code, measurement means a recorded run, and hypothesis means an untested idea. Mechanism status is ACTIVE (on the current model path), READY (built and tested, not yet trained in) or PARKED (the tried forms failed or broke a rule, and the mechanism stays open). The mechanism board holds the full list. It replaces the older labels active, dormant and archived-negative.
The compliant next-token path
This is the path the current integer model (crates/uor-r4-discrete, called M1) follows for each token. Source for each step is in the architecture table.
flowchart LR tok["Token ID"] --> tab["Shared table:<br/>blocks of 8 integers"] tab --> ctx["Ordered context<br/>(ternary FBS plan)"] ctx --> read["Read:<br/>Route, Flock or Relation"] read --> wr["Shared writer:<br/>admission + exact distances"] wr --> out["Next token"] out -. "learning" .-> tab
The five steps of one token. The dotted arrow is learning, which changes the shared table by exact moves.
- Input. A token ID selects blocks from
Snapshot.table. - Context. Ordered ternary FBS plans (a three-branch tree over earlier tokens; see the glossary) preserve context order for the read.
- Read. Route selects one carrier per block and transports it without summing or snapping. Flock ranks eligible nodes, transports them, sums and snaps. Relation adds finite relational reranking before the Flock selection. See route read, flock read and relation read.
- Shared writer. Product-address admission and exact distances select a token using the same table. The writer is implemented (admission).
- Learning. The learner compares virtual exact moves on a fixed batch and accepts objective improvements through the admitted driver.
rows_v1parallelizes proposal work (discrete learning).
Each block is 8D, and four blocks give width32. The carrier has 16 roots, acted on by 64 signed transport actions (build.rs). These three counts describe different objects. The orbit is not full E8 coverage.
The earlier float operator path is preserved as evidence and is not the current token path. It includes the Hamilton gates (G2), the geometric recurrence and the delivered head (OP3a). See the operator record, the head record and the historical geometry tour. Its earlier sheets are inactive until they are re-registered and reviewed under D37. The dated operator diagram illustrates those retained operators.
Reading order
Each chapter opens in plain words, shows its figure, gives the mathematics, and ends with where the model uses the idea.
| Chapter | What it covers | Used on the current path? |
|---|---|---|
| Quaternions and rotation | Four-number rotations, and why rotating keeps length but adding does not | Lineage, plus unit quaternions in the table constructor. M1's kernel uses signed actions on 8D blocks |
| E8, H4 and the 600-cell | The 120 icosians, the 600-cell, and the 240 roots of E8 | A 16-root piece of E8 is the carrier |
| Golden integers | Exact arithmetic with \(a+b\varphi\), no rounding | Fixed integer arithmetic in uor-r4-core, used by retained research code |
| The Hopf map and the kept fibre | A 3D shadow of a 4D rotation, and the angle it forgets | No (PARKED) |
| Primes and zeta phases | Prime addresses, zeta-zero angles, and the starting table | Yes: the starting table (ACTIVE) |
| VSA and Hamming distance | Long bit codes, XOR, and counting differing bits | Hamming is a tie-break in the reads; trained VSA codes are PARKED |
| SpiralCore | The octonion table, the 64-state action, and the ternary tree | Yes: the integer transport (ACTIVE) |
Read them in that order if the mathematics is new. The first two build the vocabulary, and the last two are closest to the running code.
How the pieces connect
The figure above has fifteen links. Each has its own metric, convention or labelling assumption, and the chapter named in the last column gives the full statement. Every link is investigated by finite exact enumerations and sampled numerical consistency checks in verify_connections.py, which runs 29 checks with differing evidence scopes. These checks support the stated identities within their enumerated or sampled domains. They are not 29 general mathematical proofs, and they do not establish predictive value. Whether any link helps the model is the subject of the pre-registered experiments on M1 (#2029). The SpiralCore material is credited to Matthew (SpiralCore v63/v69). The octonion and Fano material is credited to Mark (N3mesis, NEMESIS-Theory).
| From | To | Forced or chosen | Chapter |
|---|---|---|---|
| Six-prime registry {5, 7, 11, 13, 17, 19} | 15 semiprimes \(p\cdot q\) | forced | SpiralCore |
| 15 semiprimes | 15 edges of the complete graph K6 | forced (unique factorisation) | SpiralCore |
| 15 edges of K6 | 15 half-turn axes of the icosahedral group | forced, once the six five-fold axes carry the six labels | E8, H4 and the 600-cell |
| Six primes | six five-fold axes | chosen: 720 labellings, 12 inequivalent under rotation | E8, H4 and the 600-cell |
| Semiprimes | Cl(0,6) bivectors | forced | SpiralCore |
| Cl(0,6) bivectors | octonions | forced | SpiralCore |
| Fano plane | XOR on 3-bit indices | forced, up to relabelling (168 relabellings) | SpiralCore |
| Octonions | quaternions | forced | Quaternions and SpiralCore |
| Quaternions (S³) | the 120 unit icosians (2I) | forced | E8, H4 and the 600-cell |
| 2I | icosahedral rotations | forced | E8, H4 and the 600-cell |
| 2I | exact Z[φ] | forced | Golden integers |
| Cl(0,6) bivectors | standard-coordinate E8 | forced for the specified coordinates | E8, H4 and the 600-cell |
| 2I ∪ φ·2I | E8 | forced, under the reduced rational-part metric | E8, H4 and the 600-cell |
| 2I | Hopf S² | forced | The Hopf map |
| 2I | VSA bit codes | learned | VSA and Hamming distance |
Two cautions for anyone building on this.
- Half-turns do not compose like bivectors. Two half-turns whose K6 edges share a vertex multiply to an order-5 rotation, never a half-turn. The match between primes and half-turns is a correspondence of sets, not of products.
- Labelling primes to axes is a choice. A design that routes primes through icosian rotations must say which of the 12 inequivalent labellings it uses.
Serving without multiplication
Under D11 a served kernel has no floating point and no multiplier instruction. A product of two runtime values is read from a table instead. Build the sixteen multiples (0 to 15) of one operand by repeated addition, index that table with the radix-16 digits of the other operand, and combine the results with shifts and adds. For example, to compute \(37 \times 43\), the table holds 0, 37, 74, …, 555. Write 43 as hex 0x2B, with digits 2 and 11. Then
\[37 \times 43 = (T[2] \ll 4) + T[11] = (74 \ll 4) + 407 = 1184 + 407 = 1591.\]
A 4-bit weight is a single digit, so one product is one table read. Division is restoring long division, square root is digit-by-digit, and the kernels are kept opaque to the optimiser so that an add chain is not folded back into a multiply. Products are taken modulo \(2^{64}\) or \(2^{128}\) to match the earlier integer engine. The code is in crates/uor-r4-integer/src/stack/kernels.rs (stack_mul_u64, stack_div_u64, stack_isqrt), and the ARM64 audit is scripts/audit_zero_matmul_serving.py --stack. The numbers in the example are illustrative and are not taken from the code. The serving contract is described on the D11 integer serving page. It is ACTIVE as the export boundary, but no lawful trained model has been exported through it yet.
Reproduce the figures
The status diagrams (architecture, milestones, pipelines, the geometry stack, the compliant path and the operators) are generated in Rust, and CI-style checks confirm that they are current:
cargo run -p xtask -- figures # check
cargo run -p xtask -- figures --write # regenerate
The mathematical figures in the chapters are drawn by a standard-library script. Porting it to Rust (D27) is a recorded follow-up:
python3 docs/figures/geometry/generate.py
Go deeper
- Architecture source map and the mechanism board.
- Checks for the maths:
verify_connections.py. - The previous single-page version of this guide, with the retained float designs: historical geometry tour.
- Live numbers:
STATUS.md.
Quaternions and rotation
A quaternion is a number with four parts. Multiplying by a unit quaternion (one of length 1) turns a point in four dimensions without stretching it, and a sandwich of two multiplications turns a point in ordinary three-dimensional space. That makes quaternions a natural way to say "turn this state" with exact, reversible steps instead of a grid of learned decimals. This chapter explains what a quaternion does, and why turning a state keeps its length while adding a new input to it does not. Terms are also defined in the glossary.
Two different actions of the same quaternion. Conjugation turns 3D space, and left multiplication turns the whole 4D state.
Rotation: conjugation and left multiplication
A quaternion has four real components, \(q = w + xi + yj + zk\), with \(i^2=j^2=k^2=ijk=-1\). Quaternions of length 1 form the 3-sphere \(S^3\). Multiplication does not commute: in general \(qh \neq hq\).
For a pure imaginary vector \(v\) (a point in \(\mathbb{R}^3\)), the map \(v \mapsto q\,v\,q^{-1}\) is a rotation of \(\mathbb{R}^3\). A unit quaternion \(q=\cos\tfrac{\theta}{2}+\sin\tfrac{\theta}{2}\,n\) turns space by the angle \(\theta\) about the unit axis \(n\) (proof, a standard identity). The quaternions \(q\) and \(-q\) give the same 3D rotation.
Left multiplication \(q\,h\) is a different thing. It is a norm-preserving linear action on the full quaternion space \(\mathbb{R}^4\), because \(|qh| = |q|\,|h|\). It does not identify \(q\) and \(-q\) as the same action: the map for \(-q\) is the negative of the map for \(q\).
The retained float stack's quaternion_scan (the geometric stack, PARKED) uses left multiplication, then additive input injection (geometric_stack.rs). The current M1 model instead executes signed actions on 8D carrier blocks. The quaternion picture explains part of the research lineage. It is not a literal 4D state for the M1 kernel.
Rotation preserves length; additive recurrence need not
Pure repeated quaternion transport stays on \(S^3\). The historical additive recurrence generally does not.
The figure's pure transport orbit stays on \(S^3\) when its initial state and its transport quaternion are unit. The retained float recurrence is
\[h_t = \lambda_t\,(u_t\cdot h_{t-1}) + \sqrt{1-\lambda_t^2}\;a_t .\]
Here \(u_t\) is a unit quaternion that turns the old state, \(a_t\) is the new input and \(\lambda_t \in [0,1]\) is a fade rate. Take \(h_{t-1}\) and \(a_t\) to be unit. Then \(|u_t h_{t-1}| = 1\), and expanding the squared norm gives
\[|h_t|^2 = \lambda_t^2 + (1-\lambda_t^2) + 2\lambda_t\sqrt{1-\lambda_t^2}\;\langle u_t h_{t-1},\,a_t\rangle = 1 + 2\lambda_t\sqrt{1-\lambda_t^2}\;\langle u_t h_{t-1},\,a_t\rangle .\]
The cross term is generally nonzero, so the sum need not lie on \(S^3\) (proof, by expanding the norm). The identity \(\lambda^2 + (1-\lambda^2) = 1\) alone does not normalise it. The rotation preserves the norm of the transported term. Any unit-state claim for the combined state needs an explicit normalisation or further conditions.
The same split shows up in the current reads. Flock and Relation reads sum transported vectors and snap the result back to the finite carrier. Route instead transports one selected carrier per block, without summing or snapping, in discrete.cu.
Where the model uses this
| Mechanism | Status | How it uses quaternions |
|---|---|---|
| Hamilton gate | READY | Turns a gate signal into a unit quaternion and rotates the value block by it, so no sigmoid is needed. Built and tested, never trained |
| Recurrence gates | READY | Carries state by rotation, with a fade rate read from a table of powers of two. Built and tested, never trained |
| Spin-native weights | PARKED | Each 4×4 weight block is one quaternion. The single-icosian snap (one of 120 rotations) lost. A two-icosian pair with a 2-bit scale matched an equal-parameter dense model, but only through dense matrix multiplication, which a project rule bars |
| Prime-zeta codebook | ACTIVE | Builds the starting table from unit quaternions on \(S^3\) (a one-time offline step), then stores integers |
| Discrete learning, route read, flock read | ACTIVE | Do not use quaternions directly. They apply signed coordinate actions to 8D blocks (see SpiralCore) |
Octonions and quaternions. Each of the seven Fano lines of the octonions spans a copy of the quaternions. The octonions are alternative and norm-multiplicative, and 168 of the 210 ordered unit triples are non-associative (exactly the non-collinear ones). This link is forced (cd_space.rs); see SpiralCore for the table. The stack transport that relies on it is current in uor-r4-discrete, and it also appears in the float geometric_stack.rs, whose mechanism is PARKED.
Where it stands
| Claim | Kind | Source |
|---|---|---|
| Conjugation by \(q\) rotates \(\mathbb{R}^3\), and \(q\), \(-q\) give the same rotation | proof | standard identity |
| Left multiplication by a unit quaternion preserves the norm on \(\mathbb{R}^4\) | proof | \(\lvert qh\rvert=\lvert q\rvert\lvert h\rvert\) |
| The additive recurrence can leave \(S^3\) | proof | derivation above |
| Quaternion recurrence helps language | not shown | the float stack that used it also used softmax and dense maps; see the board |
| M1 kernel runs on quaternions | no | M1 uses signed actions on 8D carrier blocks (discrete.cu) |
Go deeper
- Next chapter: E8, H4 and the 600-cell, where the 120 unit quaternions of the icosian group appear.
- Code:
geometric_stack.rs,cd_space.rs,discrete.cu. - Mechanism pages: Hamilton gate, recurrence gates, spin-native weights.
- Generator for the figures:
generate.py. - Back to the overview.
E8, H4 and the 600-cell
There is a special set of 120 unit quaternions (each one a rotation) that are the corners of a regular solid in four dimensions called the 600-cell. Pairing that set with a golden-ratio-scaled copy of itself gives 240 points in eight dimensions, the roots of a famous lattice called E8. The project uses this structure because every rotation in it can be written with exact whole-number arithmetic, so a state can be turned and turned back with no rounding. The current model uses only a small, 16-root piece of E8, and this chapter is careful about the difference.
The 120 unit icosians as the vertices of the 600-cell, seen from a plane chosen to show the symmetry. Four rings of 30 points, 12 neighbours per vertex, 720 edges.
The 120 icosians and the 600-cell
The binary icosahedral group \(2I\) contains 120 unit quaternions, closed under multiplication. These are the H4 roots and the vertices of the 600-cell. They are, with coordinates in order \((w,x,y,z)\):
- 8 quaternions \(\pm1,\pm i,\pm j,\pm k\);
- 16 of the form \(\tfrac12(\pm1\pm i\pm j\pm k)\);
- 96 from the even permutations of \(\tfrac12(\pm\varphi,\ \pm1,\ \pm\varphi^{-1},\ 0)\).
That is \(8+16+96=120\) (proof, by direct count). Each has length 1: for the last family, \(\tfrac14(\varphi^2+1+\varphi^{-2})=\tfrac14\cdot 4=1\) because \(\varphi^2+\varphi^{-2}=3\).
Viewed from any one vertex, all 120 vertices, counting the vertex itself, fall into shells of 1, 12, 20, 12, 30, 12, 20, 12 and 1 vertices. The first shell has 12 neighbours at angle 36°, so there are \(120\cdot12/2=720\) edges. The figure above retains the historical icosian-snap construction. Its 120 vertices form four projected rings of 30. Snapping a learned rotation to this 120-element codebook describes a retained experiment, not the current M1 read or learning path.
Icosahedral rotations. Dividing by \(\pm1\) gives \(2I/\{\pm1\}=A_5\), the 60 rotations of the icosahedron. It acts two-transitively on the six five-fold axes (proof; checked in verify_connections.py). Each of the 15 half-turns fixes exactly one pair of the six five-fold axes. So the 15 edges of the complete graph K6 on those axes match the 15 half-turn axes. This is forced once the six axes carry the six labels. A further fact is that the icosahedron's five orthogonal frames of two-fold axes form a synthematic total of K6: five perfect matchings that together cover all 15 edges.
Primes and axes. The six registered primes {5, 7, 11, 13, 17, 19} give 15 semiprime products, one per K6 edge (see SpiralCore). Attaching the six primes to the six five-fold axes is a labelling choice. There are 720 labellings, and 12 of them are inequivalent under rotation. A design that routes primes through icosian rotations must say which one it uses. Half-turns also do not compose like bivectors: two half-turns whose K6 edges share a vertex multiply to an order-5 rotation, never a half-turn. The prime-to-half-turn match is a correspondence of sets, not of products.
E8 as H4 plus a golden copy
The 240 roots of E8 seen in the same kind of plane. Two sets of 120 meet in one picture: the icosians and a copy scaled by \(\varphi\).
The shorthand E8 = H4 ⊕ φH4 means, here, an icosian construction with a specified reduced metric. It is not an independent Cartesian product of two H4 states. Let \(x\cdot y = a + b\varphi\) in the quaternion coordinates. The construction uses
\[\langle x,y\rangle = 2a ,\]
the rational-part bilinear form, on the 240 elements \(2I \cup \varphi\cdot 2I\). In the eight rational coefficient coordinates these have rank 8, norm 2, the E8 inner-product counts (from any root, 1 root at inner product 2, 56 at 1, 126 at 0, 56 at −1 and 1 at −2) and reflection closure. The executable finite checks are in verify_connections.py (check E2). The primary construction paper explains the reduced inner product. The standard picture of E8's roots in a Coxeter plane has 30-fold symmetry and 240 points in eight rings of 30, which is the natural companion to the four rings of 30 above.
Check E1 verifies something else: that the specified signed 8×8 matrices (all 15 Cl(0,6) bivector matrices and the six generator matrices) preserve the 240 roots in the standard coordinates of E8. E2 verifies the reduced-metric icosian root system. These checks do not supply a map between the two representations, so the claim that the action is preserved across that missing map is not established.
The retained anchors.rs stores \([a_0,\dots,a_3,b_0,\dots,b_3]\) and a Galois companion for one H4 root. Its header says that this invertible coefficient representation does not establish an orthogonal Euclidean E8 embedding or independent extra state. The present carrier has its own concrete basis and orbit, built in build.rs: 16 roots of one E8 orbit, each a signed permutation of \((2,2,0,0,0,0,0,0)\), acted on by 64 signed transport actions. No basis bridge from this standard-coordinate carrier to the icosian realization above is asserted.
A design off the current path: icosian holonomy lanes
A historical proposal for remembering order with exact group elements.
A lane state is a product in the 120-element group, updated by one read of a \(120\times120\) table: \(h_t = u_t h_{t-1}\). To read an earlier position \(j\), form the relative element \(h_j^{-1}h_t\) and use its shell index, 0 to 8, to rank that position. This design is not on the current path. It was pre-registered as the experiment called E1 (not the same thing as check E1 above), and it needs its own pre-registration and a TEST FITNESS: FIT review before any compute. An August recursive-attention configuration that kept one reusable summary state lost the order of earlier tokens (the August A1.0 record). Separately, the retrieval arms also called A1 were stopped on 1 October under D18 because every arm scored below 0.5 recall at distance 16. Under D22 that closes the configuration, not the mechanism.
Where the model uses this
| Mechanism | Status | Use of E8 or the icosians |
|---|---|---|
| Discrete learning, route read, flock read | ACTIVE | The 16-root orbit and its 64 signed actions are the carrier. Not full E8 coverage |
| Prime-zeta codebook | ACTIVE | Each 8D block of the starting table is aligned to the 16-root orbit by exact integer scores under cell quotas and uniqueness passes |
| SpiralCore/FBS projection | READY (float), ACTIVE (integer form) | Moves a chosen block along exact E8 steps |
| Spin-native weights | PARKED | Single-icosian snap (each quaternion weight block to one of the 120 icosians): after training, +0.141 bits per byte; trained in, +0.103 to +0.140; both negative (record). A two-icosian pair with a 2-bit scale matched an equal-parameter dense model (+0.0012) but only through dense matrix multiplication, which is barred |
| E8 orbit memory | PARKED | Fixed E8 addresses for a large table. It stayed within its quality bar at 0.033 bits per byte worse than a dense control, but learned keys beat it by 0.023 |
Retained experiments such as these have results that concern those configurations. They do not settle the full geometry programme.
Where it stands
| Claim | Kind | Source |
|---|---|---|
| \(2I\) has 120 elements, 720 edges and the shell counts above | proof / finite enumeration | verify_connections.py |
| \(2I\cup\varphi\cdot2I\) is a rank-8, norm-2, reflection-closed set of 240 roots under the reduced metric | finite enumeration (check E2) | same script |
| The signed matrices preserve the 240 standard-coordinate roots | finite enumeration (check E1) | same script |
| A map between the two E8 realizations that carries the actions | not established | anchors.rs header |
| M1 covers all of E8 | no | M1 uses a 16-root orbit (build.rs) |
| E8 or icosian structure improves language | not shown | the tried forms are on the board above |
Go deeper
- Next: Golden integers, the exact arithmetic behind these coordinates.
- Code:
anchors.rs,build.rs,verify_connections.py. - The mechanism pages above, and the overview.
Golden integers
The coordinates of the 120 icosian rotations contain the golden ratio, an irrational number, so a computer would normally round them. There is a way to avoid rounding altogether: keep every coordinate as a pair of whole numbers \((a, b)\) that stands for \(a + b\varphi\). Adding and multiplying such pairs gives another pair, exactly. This chapter explains that arithmetic, called \(\mathbb{Z}[\varphi]\), and says where the project uses it. Terms are also defined in the glossary.
Exact arithmetic in \(\mathbb{Z}[\varphi]\), with the coordinates of unit icosians scaled by one half.
The arithmetic
The golden ratio \(\varphi = (1+\sqrt5)/2\) satisfies
\[\varphi^2 = \varphi + 1 .\]
The set \(\mathbb{Z}[\varphi] = \{a + b\varphi : a, b \text{ integers}\}\) is closed under addition and multiplication, so it supports exact pair arithmetic. Addition adds the pairs. Multiplication uses the rule above to remove \(\varphi^2\):
\[(a+b\varphi)(c+d\varphi) = (ac+bd) + (ad+bc+bd)\,\varphi .\]
This is a proof by expanding and substituting \(\varphi^2=\varphi+1\). Two worked examples:
- \(\varphi\cdot\varphi\) is \((0,1)\cdot(0,1) = (1,1)\), that is \(1+\varphi\).
- \(\varphi^{-1} = \varphi - 1\) is the pair \((-1,1)\), and \(\varphi\cdot(\varphi-1)=\varphi^2-\varphi=1\).
The other root of \(x^2=x+1\) is \(1-\varphi=-\varphi^{-1}\). Swapping \(\varphi\) for it is the Galois conjugate, \(a+b\varphi \mapsto (a+b)-b\varphi\). Multiplying a number by its conjugate gives the integer norm \(N(a+b\varphi)=a^2+ab-b^2\).
Icosian coordinates need the factor one half
The unit icosian coordinates are \((a+b\varphi)/2\), which lie in \(\tfrac12\mathbb{Z}[\varphi]\). The factor one half must be kept. Scaled integer pairs represent them without rounding. For example, the icosian \(\tfrac12(\varphi,\,1,\,\varphi^{-1},\,0)\) has doubled coordinates \((0,1)\), \((1,0)\), \((-1,1)\) and \((0,0)\), and its length checks out exactly: \(\varphi^2+1+\varphi^{-2}=4\).
anchors.rs documents this scale explicitly. Its norm numerators have denominator 4. The same file stores one H4 root as \([a_0,\dots,a_3,b_0,\dots,b_3]\) plus a Galois companion, and warns that this invertible coefficient representation does not by itself establish an orthogonal Euclidean E8 embedding or independent extra state.
Fixed ZPhi arithmetic and exact anchor orientation tables support the research. Chirality and polarity are exact signs on \(\mathbb{Z}[\varphi]\), held as fixed integer tables in anchors.rs. They are used by the retained native geometric learner, not by the current M1 path.
A caution about addresses: equality addresses for complete tuples are not semantic distances between class numbers. Two entries being exactly equal tells you they are the same entry. It does not tell you how alike two different entries are.
Where the model uses this
| Piece | Status | Role |
|---|---|---|
Fixed ZPhi arithmetic and anchor orientation tables, uor-r4-core | in uor-r4-core; no step of the M1 read is recorded as using it | Exact arithmetic for the icosian and E8 checks and for the retained native learner |
| The retained native geometric engine | PARKED | Chirality and polarity signs; version chains and prime addresses |
| Spin-native weights | PARKED | Quaternion blocks snapped to the 120 icosians; their coordinates live in \(\tfrac12\mathbb{Z}[\varphi]\) |
| Current M1 carrier (discrete learning) | ACTIVE | Plain integer coordinates such as signed permutations of \((2,2,0,0,0,0,0,0)\), not \(\mathbb{Z}[\varphi]\) pairs |
The two ends of the table matter. The exact golden arithmetic is real, tested code, but the current model's own carrier is built from ordinary integers. Whether exact golden coordinates help a language model has not been measured.
Where it stands
| Claim | Kind | Source |
|---|---|---|
| \(\mathbb{Z}[\varphi]\) is closed under \(+\) and \(\times\), with the product rule above | proof | derivation above |
| The 120 unit icosians have coordinates in \(\tfrac12\mathbb{Z}[\varphi]\) | proof / finite enumeration | the list in the previous chapter and verify_connections.py |
| Exact golden arithmetic is a step of the current M1 read | not recorded | the M1 carrier is built from plain integer coordinates (build.rs) |
| Modular coefficients such as \(\mathbb{Z}/2^{256}\) replace exact \(\mathbb{Z}[\varphi]\) pairs | no | they are neither the real normed division algebra nor a substitute (see the SpiralCore chapter) |
Go deeper
- Code:
anchors.rsandprime_route_attention.rs. - The forced link from the icosians to \(\mathbb{Z}[\varphi]\) is checked in
verify_connections.py. - Next: The Hopf map and the kept fibre. Back to the overview.
The Hopf map and the kept fibre
In the project's quaternion designs, a rotation state is a point on a four-dimensional sphere (the current model M1 carries 8D integer blocks instead). The Hopf map takes a three-dimensional shadow of that point. The shadow forgets one angle, so many different states cast the same shadow. This chapter explains what the map does, what the forgotten angle is, and what the project does and does not do with it. Short version: the idea is built and unit-tested as a helper, it is not part of the current model's read, and nothing yet shows that keeping the forgotten angle helps language. The mechanism's status is PARKED (mechanism page).
The Hopf map \(S^3\to S^2\) sends a whole circle of 4D points to one point of the 2-sphere. The shadow cannot tell them apart.
The map
Write a unit quaternion as \(q=(a,b,c,d)\) and set \(z_1=a+ib\) and \(z_2=c+id\). The Hopf map to the 2-sphere is
\[h(q)=\big(2(ac+bd),\ 2(bc-ad),\ a^2+b^2-c^2-d^2\big)=\big(2\,\mathrm{Re}(z_1\bar z_2),\ 2\,\mathrm{Im}(z_1\bar z_2),\ |z_1|^2-|z_2|^2\big).\]
Two facts follow by expanding the squares (proof).
- It lands on the unit sphere. \(|h(q)|^2=4(a^2+b^2)(c^2+d^2)+\big((a^2+b^2)-(c^2+d^2)\big)^2=(a^2+b^2+c^2+d^2)^2=1\).
- A common phase changes nothing in the shadow. Multiply both \(z_1\) and \(z_2\) by the same phase \(e^{i\vartheta}\). The product \(z_1\bar z_2\) and both moduli are unchanged, so \(h(q)\) stays put. But \(q\) moves around a circle, the fibre.
So the shadow alone cannot be inverted. Rebuilding \(q\) needs the base point on the 2-sphere, the fibre phase and a chart convention, because there is no global identification \(S^3=S^2\times S^1\). The image alone is not an invertible representation of the input, and the project does not assume a reversible universal \(S^3\to S^2\to S^1\) pipeline. Keeping the lost angle in a separate slot is what "the kept fibre" means.
How the code handles it
For a unit quaternion \((a,b,c,d)\), UnitS3Q30::hopf computes the formula above after decoding Q30 storage to f64, then normalises and requantises the result to Q30. Q30 names the storage representation here. It does not mean the Hopf map runs in integers.
prime_route_attention.rs provides rotate_common_fiber and SpinTorsionState { s3, fiber, torsion }, which keeps the S³ state, a fibre phase and a torsion term in separate fields. rotate_common_fiber also decodes to f64, uses libm::sin and cos, and normalises and requantises the rotated point. These are float-backed, offline, fixed-geometry utilities. They are not an integer model execution path.
Hopf fibre tracking is not wired into the current discrete M1 read. The retained M2 Hopf metric, which tracks a cumulative phase and a geodesic distance, is separate research and belongs to the held native learner.
The icosians under the map. The map sends the 120 icosians of the previous chapters onto one orbit of 30 points of the 2-sphere, every fibre of size 4 (finite enumeration in verify_connections.py). That orbit is of two-fold type; it is not literally the axes of the chosen frame. This link is forced.
What was tried
The full history is on the mechanism page. In brief, with the measurements it records:
| What | Result | Kind | Record |
|---|---|---|---|
| Hopf sector routing on held-out decisions (512 sectors) | 7 of 512 sectors occupied; at most 64 reachable when inputs are non-negative | measurement (negative) | occupancy |
| Hyperbolic (Lorentz) keys on real code-scope hierarchies | 77.5% of non-root queries at 16 dimensions against 0.4% for a dot product | measurement (positive, for hierarchy keys) | cycle 2 |
| Lorentz read against dot product in the Rust learner, 4 seeds | ahead in 3 of 4, mean 0.018 nats, below the 0.03 bar | measurement (small) | cycle 3 |
| Lorentz read in the 7M-parameter stack | Lorentz minus dot −0.0001 | measurement (neutral) | toolbox |
Only the occupancy rows test the Hopf map itself, and they tested one projection of one state. The attention failures in that record used an additive summary, a heatmap readout and softmax constructions, and the records say Hopf is not refuted. Reading these honestly: the shadow was never tested with its fibre kept, at equal retained bytes, as a language feature. That is the test that would reopen the mechanism. Three of the conditions that would reopen it, as the mechanism page lists them: an integer multiplier-free Hopf map wired into a consumer, a Lorentz read re-registered as an offline float sheet, and the retained-fibre test itself.
Where the model uses this
| Mechanism | Status | Use |
|---|---|---|
| Hopf observation | PARKED | Telemetry in the older uor-r4-integer chat runtime only (not M1). Per-session holonomy and winding are recorded, and they change no output |
| Route read | ACTIVE | Does not use a Hopf quantity. Hyperbolic keys were once pitched as an address geometry |
| Flock read, relation read | ACTIVE | Do not use a Hopf quantity |
| Prime-zeta codebook | ACTIVE | Shares the unit-quaternion helpers; the table uses points on the 3-sphere, not the Hopf map |
Where it stands
| Claim | Kind | Source |
|---|---|---|
| \(h\) maps \(S^3\) onto \(S^2\) and a common phase leaves the image fixed | proof | derivation above |
| The shadow alone cannot rebuild the state | proof | same |
| Keeping the fibre helps language | hypothesis, never tested | mechanism page |
| The Hopf map runs in integers | no | the float-backed helpers decode to f64 |
Go deeper
- Code:
hopf_metric.rs,prime_route_attention.rs. - Next: Primes and zeta phases. Back to the overview.
Primes and zeta phases
Every prime number is a unique, indivisible building block, and every whole number is a product of primes in exactly one way. UOR-R4 uses that as an exact-identity idea: a word can be named by a prime (the current model M1 itself uses explicit token IDs). Separately, the project turns each prime into a set of angles using the known frequencies of the Riemann zeta zeros, as an optional input to the model's starting table; distinct starting vectors come from the allocation passes described below. This chapter explains both ideas and keeps them apart. The first is exact identity. The second is a way to scatter starting positions, and nobody has yet shown that its zeta angles help beyond simply keeping the words distinct. Terms are also defined in the glossary.
Fixed zeta-zero frequencies \(\gamma_k\) turn each prime \(p\) into one angle per zero, \(\theta_k=\gamma_k\ln p\). Think of a bank of clock hands, each turning at its own speed.
Zeta phases
The imaginary parts \(\gamma\) of the Riemann zeta zeros are fixed numbers. The first three are about 14.1347, 21.0220 and 25.0109. Each defines a phase frequency. For a prime \(p\) the phase on channel \(k\) is
\[\theta_k(p)=\gamma_k\ln p \pmod{2\pi},\qquad z_k(p)=\cos\theta_k+i\sin\theta_k .\]
A worked illustration (computed from the published value, not read from the code): for \(p=2\) and the first zero, \(\theta_1 = 14.1347\times\ln 2 \approx 9.797\), which is about \(3.514\) radians after subtracting \(2\pi\). Using a finite table of these constants does not require proving the Riemann hypothesis.
The optional offline prime_zeta.rs constructor uses four complex channels per block (\(\mathbb{C}^4\)) with \(\theta=\gamma\ln p\), and then:
- Realifies them into two 4-real tuples, \((\mathrm{Re}_0,\mathrm{Im}_0,\mathrm{Re}_1,\mathrm{Im}_1)\) and \((\mathrm{Re}_2,\mathrm{Im}_2,\mathrm{Re}_3,\mathrm{Im}_3)\).
- Normalises each with
UnitS3Q30::from_r4and quantises to Q30. - Applies the fixed coordinate permutation and exact integer alignment scores against the 16-root 8D carrier (see E8, H4 and the 600-cell).
- Allocates under writer-cell quotas and, when capacity permits, full-vector uniqueness controls. The output is
Snapshot.table.
So \(\mathbb{C}^4\) becomes \(\mathbb{R}^4+\mathbb{R}^4\) per block, not \(\mathbb{C}^8\) or \(\mathbb{R}^{16}\) per block. The allocation controls are part of the assignment. It is not simply an unconstrained nearest-root snap. Floating point appears only in this one-time offline step, under the October 14 zeta-zero exception, and the output is an integer table.
An honest caveat (proof, by reading the code). The quota and uniqueness passes also run on both matched control tables (one shifts every \(\gamma\) by 1.0, the other permutes the primes and scrambles phases and amplitudes). So the absence of collisions comes from those passes, not from prime phases. The record is prime-zeta construction; the mechanism page is prime-zeta codebook.
The retained M2 learner used the same fixed phases in a different way: it accumulated fixed phase bins as policy inputs (engine.rs). That historical use is distinct from the current codebook initialisation, and it does not establish learned M1 attribution to zeta phases.
Prime addressing
Distinct primes make shared factors exact. A product records which primes are present, not their order or how many times each appears.
Assign each token identity its own prime. Then shared factors are exact, by unique factorisation (proof). For example, with primes \(2,3,5,7\) standing for four tokens, the products \(42=2\cdot3\cdot7\) and \(105=3\cdot5\cdot7\) have \(\gcd=21=3\cdot7\), which says exactly that the two sets share tokens 3 and 7. A product of distinct primes records a set. Sequence order and multiplicity need explicit additional representation: \(2\cdot3=3\cdot2\), and \(12=2\cdot2\cdot3\) needs exponents to be told from \(6=2\cdot3\). Exact identity is not a semantic metric. Two different primes are different, and nothing more is learned from their size or product.
What the current model does with this
Current M1 uses explicit token IDs and an ordered BinderPlan context, plus the optional prime-addressed initialiser above. Flock and Relation reads rank finite context nodes and transport payloads before the shared writer.
A bounded kept-K list limits how many contributions are retained. It does not bound selection cost: the kernel scans eligible nodes, and Relation adds graph scans. The writer also scans vocabulary occupancy and admitted-cell tokens. See the cost and source discussion.
On 18 October the prime-zeta table was wired in as the model's starting table. Before that, a random start gave 4,096 words only 16 different starting vectors. The table gives all 4,096 distinct vectors (prime-zeta construction, wiring). The 19 October zero-update pre-flight then found that, at K=8, only about 8 of 256 target cells were opened, so admitted words were 127 of 3,847 against a gate of 500, and the run was not started (pre-flight). That closes the configuration "spread words evenly at K=8". It does not test whether zeta phases help.
Where the model uses this
| Mechanism | Status | Use |
|---|---|---|
| Prime-zeta codebook | ACTIVE | The starting table. The trained comparison against its two controls is NOT_RUN |
| Address-structured cells | ACTIVE | Places each word next to the words that usually precede it; the prime-zeta table is its fallback cell |
| Admission | ACTIVE | Narrows 4,096 words to those in a few opened cells. The measured ceiling on every attention run |
| Exact addressed memory | PARKED | Writes a fact once under an exact prime address. The trained forms failed or used softmax; the address-as-read form was never built |
| Pointer key | PARKED | Copies by a slot's exact name. A softmax pointer; hit rate rose from 0.377 to 0.545, but memory missed its bar |
| Object store | READY | Preserves exact bytes separately in a hashed tree. It is not integrated into the M1 token path |
The D19 object store preserves exact bytes separately. It is not silently integrated into the M1 token path. The retained native learner and the addressed-memory and pointer-identity mechanisms remain research foundations with their own artifact-bound evidence.
Where it stands
| Claim | Kind | Source |
|---|---|---|
| Distinct primes make shared factors exact | proof | unique factorisation |
| Each of 4,096 words gets a distinct starting vector | measurement | construction record |
| Zeta phases beat the matched controls in training | NOT_RUN | prime-zeta codebook |
| Prime identity is a semantic distance | no | exact identity only |
| The model has a measured language gain from either idea | no | pre-alpha; see STATUS.md |
Go deeper
- Code:
prime_zeta.rs,prime_route_attention.rs. - Next: VSA and Hamming distance. Back to the overview.
VSA and Hamming distance
Give every word a very long string of 1s and 0s, 4,096 of them. To ask "are these two strings alike?", line them up and count the positions where they differ. That count is the Hamming distance, and it costs almost nothing on a computer: an exclusive-or (XOR) and a bit count. This chapter covers two uses of the idea. One is the older "hypervector" memory cue (VSA), which is research that was measured once and is not on the current path. The other is a Hamming tie-break that does run inside the current model's reads. In both cases the similarity is only a count of bits, and it is as meaningful as the way the codes were assigned. Terms are also defined in the glossary.
Two codes are compared with an XOR and a bit count. The result is a Hamming distance and the matching bipolar cosine.
What a hypervector is
Each token has a 4096-bit bipolar hypervector, stored as 64 u64 words. A set bit means \(+1\) and a clear bit means \(-1\). Two codes \(A\) and \(B\) are compared with an XOR and a popcount, which gives the Hamming distance \(d\). The bipolar cosine is
\[\cos(A,B) = 1 - \frac{2d}{4096} .\]
A context hypervector bundles the codes of the recent tokens by a bitwise majority vote. The similarity is a statistic of the code bits, and it is only as meaningful as the way the codes were assigned.
Two standard facts (proof, from the definition of XOR) are worth knowing. XOR is its own inverse, \((A\oplus B)\oplus B=A\), which is why it works as a "glue and unglue" operation. For a bundle of \(k\) random terms, unbinding returns the stored value plus noise of standard deviation about \(\sqrt{(k-1)/D}\) with \(D=4096\). That is the textbook estimate for random codes, not a measurement on this model.
What the older model did with it
In the older native prose learner (an offline float learner on a CPU, now barred by the GPU-only rule D24), the VSA term added vsa_scale · similarity to the root and leaf scores. Three code modes existed.
| Mode | Code | Distinct codes |
|---|---|---|
| 0 | A fixed hash of the token id. Historical: it is disconnected from the learned 120-root assignment, which is why it was described as mis-wired | 4,096 |
| 1 | Derived from the learned icosian-root assignment (a token's nearest of the 120 roots, a Voronoi cell over the learned embeddings). Since PR #2077 these codes are trainable and refresh during training | at most 120 |
| 2 | The root code bound with a readout-hash residual | 4,096 |
Measurement (9 October, two seeds, two held-out slices, 6,795,016 training tokens per run). With the VSA term trained in and fixed token-hash codes (mode 0), held-out bits per byte improved in all four seed-and-slice pairs, by 0.0144 to 0.0226 (for example 1.8366 against 1.8574). Icosian-root codes (mode 1) did not help: the change in bits per byte against VSA off (negative is better) was +0.0003 and +0.0001 on one seed and −0.0053 and −0.0054 on the other, all four under the 0.01 threshold, and with only 120 distinct codes, tokens that share a root cannot be told apart. The root-plus-residual codes (mode 2) were worse than fixed codes in all four cells, by +0.013 to +0.028 (native test record; a historical float-form measurement on a CPU learner). An earlier "closed" label for mode 0 applied to a frozen-artifact swap and a wiring fault, not to this trained-in run.
The link from the icosians to these bit codes is learned, not forced: the learned token-to-icosian-root assignment builds the mode 1 codes (vsa_codes.rs, since PR #2077).
Limits to keep in view: the seeds differ by about 0.015 bits per byte, the size of the effect, and the cross-arm comparison is a point estimate. The same model's exact-memory table was worth about 0.19 to 0.20 bits per byte, so VSA may duplicate evidence that other heads supply. VSA is not tied to SpiralCore (next chapter). The full tried-and-untested list is on the VSA mechanism page, and the mechanism's status is PARKED.
The Hamming-rank read, a tried configuration
A historical proposal to replace a softmax with a sort by Hamming distance and a fixed rank table.
The Hamming-rank read is a historical sign-bit and popcount design with fixed rank-table weights. Its historical float configuration, trained beside a softmax stack, measured +0.2585 bits per byte against the softmax stack (+0.259 in the older write-up). That result closes only that configuration. It is not the current discrete Flock or Relation algorithm (softmax-free read record).
Hamming in the current reads
On the current path, Hamming distance is one factor among several, not the whole read. The kernel flock_vector orders candidates by:
- relation score, descending;
- L1 displacement, ascending;
- coordinate Hamming distance, ascending;
- recency, descending;
- node, ascending.
In Flock mode the relation scores are zero. The kernel then equally sums the selected transported roots and snaps the sum to a carrier root. It does not use the historical fixed rank-table weights. Relation adds its graph reranking before this same selection and aggregation path. The Route read also uses Hamming distance, as a tie-break between ports (route read).
Hamming distance on E8 labels is not the E8 lattice distance, and decision D32 treats XOR and Hamming comparison on ternary and E8 labels as one component of a model, not as a Hamming-only model (ternary and XOR).
Where the model uses this
| Mechanism | Status | Use |
|---|---|---|
| Flock read, route read, relation read | ACTIVE | Coordinate Hamming distance as one ranking or tie-break factor on the 16-root carrier |
| VSA | PARKED | Trained 4096-bit codes in the held prose learner. Reopening needs a lawful retraining, for example a Hamming binding on the discrete writer |
| Ternary and XOR arithmetic | PARKED | Dense ternary or XOR weight contractions. A dense ternary sum is still a dense sum under D25 |
Where it stands
| Claim | Kind | Source |
|---|---|---|
| XOR is self-inverse; \(\cos = 1-2d/4096\) | proof | definition |
| Trained fixed-hash VSA lowered held-out bits per byte by 0.0144 to 0.0226 | measurement (CPU learner, 2 seeds) | native test |
| Root codes alone collapse token identity (120 codes for 4,096 tokens) | proof (count) and measurement (no gain) | same |
| Hamming-rank read matched a softmax | no: +0.2585 bits per byte worse | softmax-free read |
| VSA helps the current discrete model | not tested | VSA page |
| Octonion-signed binding beats plain XOR | hypothesis, untested | SpiralCore chapter |
Go deeper
- Code:
vsa_codes.rs,discrete.cu. - Mechanism pages: VSA, ternary and XOR, flock read.
- Next: SpiralCore. Back to the overview.
SpiralCore
SpiralCore is an exact-geometry source, credited to Matthew (versions v63 and v69). From the multiplication table of the octonions (an eight-part number system) it produces a small set of exact moves on eight numbers: each move shuffles the eight coordinates and flips some signs. Every move can be undone exactly. The model stores earlier words in a tree with three branches per node (the "ternary FBS" tree, the project's name for it; see the glossary), and it carries a chosen eight-number block along a short path of these moves. No learned multiplication is involved, only swaps and sign flips. This chapter explains the moves, the tree, and how they connect to the other geometry. The integer form is the core of the current model. Terms are also defined in the glossary.
A ternary tree picks one stored block. The block then travels along exact edges between the 16 roots of an E8 orbit.
The exact moves
The table. spiralcore_operator.rs reproduces the SpiralCore v63 octonion and Cl(0,6) convention exactly. The octonions' seven oriented Fano lines are
\[(124)(235)(346)(457)(561)(672)(713).\]
The Clifford algebra Cl(0,6) has six generators that each square to \(-1\). Products of two distinct generators give the 15 bivectors \(B_{ij}\) (one per pair of the six, \(\binom62=15\)), with \(B_{ij}B_{jk}=-B_{ik}\). They mirror the way the semiprimes \(p_ip_j\cdot p_jp_k\to p_ip_k\) combine. The \(B_{ij}\) generate a group of order 64 that maps onto the 32 square-free even prime products, with kernel \(\pm1\). Together this gives a 64-state composition table. Each \(B\) is a signed coordinate permutation of \(\mathbb{R}^8\) with \(B^2=-I\).
The orbit. One anchor orbit holds 16 roots and 64 signed operator states, and an output block's carrier is moved by the composed edge history. A breadth-first search (BFS) over the labelled edges gives an ordered history between any two roots, composed by left-composition.
Exact inverse (proof). From \(B^2=-I\) it follows that \(B^4=I\) and so \(B^3=B^{-1}\). The inverse of a history is therefore the reversed sequence with each step cubed.
A worked step. The projection chooses one input block \(x_{\sigma(j)}\) for each output block \(j\) and sets \(y_j=A_jx_{\sigma(j)}\), where \(A_j\) is the composed signed action. The forward pass is a gather and a sign flip. There is no learned coefficient for any input-output pair, and the adjoint is the exact inverse action \(A_j^{-1}\delta_j\) (SpiralCore/FBS projection, proof by construction).
How the tree and the moves connect to the rest
| Link | Statement | Forced or chosen |
|---|---|---|
| Six-prime registry {5, 7, 11, 13, 17, 19} → 15 semiprimes \(p\cdot q\) | products of distinct pairs | forced |
| 15 semiprimes → 15 edges of K6 | edge \((p,q)\), by unique factorisation | forced |
| Semiprimes → Cl(0,6) bivectors | \(B_{ij}B_{jk}=-B_{ik}\) mirrors \(p_ip_j\cdot p_jp_k\to p_ip_k\) | forced |
| Cl(0,6) bivectors → octonions | Cl(0,6) acts on the octonions through the 7 Fano lines | forced |
| Fano plane → XOR on 3-bit indices | after relabelling, every line is \(\{a,b,a\oplus b\}\), so the octonion product is a signed XOR | forced up to relabelling (168 relabellings) |
| Octonions → quaternions | each Fano line spans a copy of the quaternions; the octonions are alternative and norm-multiplicative, and 168 of 210 ordered unit triples are non-associative (exactly the non-collinear ones) | forced |
| Cl(0,6) bivectors → standard-coordinate E8 | the signed matrices preserve the 240 standard-coordinate roots (check E1), independently of the reduced-metric icosian realisation | forced for the specified coordinates |
The code is in spiralcore_operator.rs and cd_space.rs. The remaining links (icosians, Z[φ], Hopf) are in the other chapters. The semiprime-to-axis step needs a labelling choice, covered in E8, H4 and the 600-cell.
What carries route history
| Question | Answer |
|---|---|
| What carries route order? | Current M1 uses ordered FBS plans and composed 8D signed transport. The retained float stack uses noncommuting quaternion recurrence. These are distinct implementations (crates/uor-r4-discrete, geometric_stack.rs) |
| What tracks accumulated phase? | hopf_metric.rs tracks a cumulative U(1) phase and a geodesic distance, but only in the held native learner. SpinTorsionState uses Q30 storage with float-backed helpers outside M1 (Hopf chapter). Separately, under the October 14 addendum to D32, prime_zeta.rs uses offline complex-plane zeta-zero phases to build Snapshot.table (ACTIVE; #2473, #2477) |
| What are chirality and polarity? | Exact signs on Z[φ], as fixed integer tables in anchors.rs. Used by the held native learner only (Golden integers) |
| What is SpiralCore's action used for? | Since #2279 its signed BFS action is the trunk's projection (spiralcore_fbs.rs): READY in its float form, ACTIVE in its discrete integer and CUDA form in crates/uor-r4-discrete (#2379, #2395, #2400; discrete record) |
| What was tried earlier? | An August recursive-attention configuration that kept one reusable summary state lost the order of earlier tokens (the August A1.0 record). The retrieval arms also called A1 were stopped on 1 October (D18) because every arm scored below 0.5 recall at distance 16. Under D22 that closes the configuration, not the mechanism. A route-holonomy read and an octonion-signed binding remain designs that are not on the current path (#2029) |
Octonion-signed binding, a design
A historical proposal: bind with a signed XOR whose sign depends on operand order, unlike plain XOR.
On the Fano plane, \(e_a\cdot e_b=\pm e_{a\oplus b}\): a signed XOR whose sign depends on operand order, unlike plain XOR (which is commutative and associative, so it loses order and grouping). Incidence alone does not define coherent octonion signs. The design is not on the current path, and it needs its own pre-registration and a TEST FITNESS: FIT review before compute. The canonical v63 Fano table in spiralcore_operator.rs is the control for it. It has not been tested against plain XOR (VSA mechanism page).
The 9 October substrate review
Mark (N3mesis)'s supplied Octonian Substrate Architecture and discussion PDFs motivate separating state, algebra, routing and identity. The review of that draft found the following.
- Its literal positive cycles \((123)(145)(167)(246)(257)(347)(356)\) fail alternativity and quadratic norm multiplicativity. For example, \((e_1+e_2)(e_4+e_7)=0\) although each factor has squared length 2. Fano incidence is not a complete sign convention.
- For the draft's XOR labelling, an exhaustive search of all \(2^7=128\) orientations of those seven lines finds 16 that give a valid octonion algebra (the enumeration is in the historical geometry tour; the review record states only the counterexample). One of them reverses three of the draft's lines: \((123)(145)(167)(246)(527)(437)(536)\).
- The sample store route discards a coordinate after right multiplication and projection, and its packing function returns empty bytes. A pre-route embed/project inverse does not establish post-route preservation.
- Modular \(\mathbb{Z}/2^{256}\) coefficients are neither the real normed division algebra nor a replacement for exact \(\mathbb{Z}[\varphi]\) pairs.
These findings concern the supplied draft. They are not a negative language experiment and not a retirement of octonion binding. The canonical Rust table is unchanged, and any alternative convention needs a signed basis correspondence, not just the same seven lines. The orientation in the draft is inconsistent with the canonical table and must not replace it (full review).
Where the model uses this
| Mechanism | Status | Use |
|---|---|---|
| SpiralCore/FBS projection | READY (float); integer form ACTIVE | Each output block picks one stored block and moves it along exact E8 steps |
| Route read | ACTIVE | Walks the ternary tree (context cap 243 positions, \(3^5\)) and composes a transport action at each level |
| Flock read | ACTIVE | Carries kept payloads into the query's frame by the precomputed transport between roots |
| Discrete learning | ACTIVE | Learns over the 15 generator moves |
| Ternary and XOR | PARKED | The ternary binder tree and trit gates; its parts live in discrete learning |
Where it stands
| Claim | Kind | Source |
|---|---|---|
| \(B^3=B^{-1}\), so every history reverses exactly | proof | derivation above |
| The seven Fano lines and the 64-state table are reproduced exactly | measurement (finite checks) | verify_connections.py, 29 checks of differing scope |
| Integer SpiralCore transport runs on the GPU | measurement (controls only) | discrete record |
| The transport carries enough information, or improves language | not shown | none of the four K16 runs passed its registered top-1/top-8 bars, and the call was no KEEP (K16 outcome) |
Go deeper
- Code:
spiralcore_operator.rs,discrete.cu,build.rs,spiralcore_fbs.rs. - Back to the overview, or on to the mechanism board.
The mechanism board
Most chat AIs are built from a few standard parts: a way to look back at earlier words (attention), a block that processes each word (a feed-forward layer), big grids of multiplications, and a function that scores every possible next word. UOR-R4 is trying to replace each of those parts with something built from geometry, such as rotations, exact addresses and lookup tables. Each replacement is called a mechanism. This page lists all 27 of them and says where each one stands today. Status here means how far a mechanism has been built and tested. No mechanism has produced a useful conversation yet: the project is pre-alpha, and 0 of its 8 milestones are complete (STATUS.md).
The 22 mechanisms with a recorded parent or child, drawn as a family tree. Most of the live ones descend from earlier, parked attempts.
What the three statuses mean
| Status | Meaning | Count |
|---|---|---|
| ACTIVE | On the current model path, crates/uor-r4-discrete. | 10 |
| READY | Built and tested, but not yet trained into a model. | 4 |
| PARKED | The forms tried so far failed or broke a project rule. The mechanism stays open, and its page lists what would reopen it. | 13 |
There is no "retired" status. Owner decision D22 says a negative result closes one tested configuration, never the mechanism, and stopping a mechanism needs the owner (D22). This board replaces the 18 October labels (active, dormant, archived-negative), which did not map one to one onto these three and had no rows for ten mechanisms.
Every number in the tables is a measurement from a recorded run or test, linked in its row, unless the cell says otherwise. The "Next" column is a hypothesis about what would help, not a result. A passing test is not a trained capability, and NOT_RUN is not a pass. BPB means bits per byte of text (lower is better). "FIT" means a pre-registered test was reviewed and judged able to answer its question.
The family tree
An arrow means "came from" or "was replaced by". A solid arrow is a successor, a dotted arrow means the target is the integer form of the source, and a double arrow means the target is a specialisation of the source.
flowchart TD r4g1["R4G1 graph<br/>PARKED"] nat["Native geometric engine<br/>PARKED"] lut["D11 integer serving<br/>ACTIVE"] stack["Geometric stack<br/>PARKED"] disc["Discrete learning<br/>ACTIVE"] pz["Prime-zeta codebook<br/>ACTIVE"] rel["Relation read<br/>ACTIVE"] obj["Object store<br/>READY"] rank["Rank-margin hinge<br/>ACTIVE"] cc["Carrier credit<br/>PARKED"] lc["Legal construction<br/>PARKED"] sfbs["SpiralCore/FBS<br/>READY"] tx["Ternary/XOR<br/>PARKED"] spin["Spin-native weights<br/>PARKED"] ham["Hamilton gate<br/>READY"] rec["Recurrence gates<br/>READY"] flock["Flock read<br/>ACTIVE"] route["Routed read<br/>ACTIVE"] ptr["Pointer key<br/>PARKED"] cells["Address cells (A8)<br/>ACTIVE"] mem["Exact memory<br/>PARKED"] e8["E8 orbit memory<br/>PARKED"] r4g1 --> nat r4g1 --> lut nat --> stack nat --> disc nat --> pz nat --> rel nat --> obj nat --> rank cc -.-> disc lc --> disc sfbs -.-> disc tx --> disc spin --> sfbs stack --> ham stack --> rec stack -.-> flock route --> flock flock ==> rel ptr --> rel pz --> cells mem ==> e8 classDef ACTIVE fill:#d7f0e0,stroke:#1a7f4b,color:#0b2e1a,stroke-width:2px classDef READY fill:#dbe8fb,stroke:#1d4ed8,color:#0b1f4d,stroke-width:2px,stroke-dasharray:6 3 classDef PARKED fill:#e5e7eb,stroke:#4b5563,color:#111827,stroke-width:2px,stroke-dasharray:2 3 class lut,disc,pz,rel,rank,flock,route,cells ACTIVE class obj,sfbs,ham,rec READY class r4g1,nat,stack,cc,lc,tx,spin,ptr,mem,e8 PARKED
Five mechanisms have no recorded parent or child, so they are not drawn: admission, the tokenizer, Hopf observation, read binding and VSA. Source for all edges: the family_tree field of the mechanism board (19 October 2026).
ACTIVE: on the current model path (10)
| Mechanism | In plain words | Replaces | Why this status | Next step |
|---|---|---|---|---|
| Discrete geometric learning | Tries every legal rotation of one table entry and keeps it only if the whole-number loss strictly drops. No gradients, no floating point. | optimizer | Learning rule of the only live model. A pilot and four large runs (K16) finished and no arm passed the bars (K16 outcome). | First trained model that beats its frozen control |
| Prime-zeta codebook | Gives each word a fixed, unique starting address built from primes and zeta-zero phases. | embedding | Wired in as the start for new lineages, and the baseline arm P8; no trained artifact has started from it. The trained comparison against its two null controls is NOT_RUN (record). | Run that comparison |
| Address cells (A8) | Puts each word on a 16-by-16 board, next to the words that usually come just before it. | embedding | Raised successor admission from 127 to 1,351 of 3,847 before training. Learning then eroded it, and a first test stopped when Relation admission fell to 551 against the control's 857 (A8 dose). | Run the real CUDA qualification of the merged guard (NOT_RUN), then rerun |
| Routed read | Sends a query down a small tree of addresses and picks up the one earlier word at the end. | attention | Base read of every trained artifact, but its own effect is unattributed: 20 proposals in 16,404 updates (attention state). | Read-off versus read-on test with enough proposals |
| Flock read | Looks at a few nearest earlier positions, rotates them into its own frame and moves toward their consensus. | attention | Passes its 6 Flock controls (25 of 25 in the combined Route, Flock and driver run) and runs inside every Relation arm, but its own value was never isolated (driver cost). | Get the coupling test sheet to FIT, with zero and random controls |
| Relation read | Lets the read follow links, such as "the word after the earlier copy of this word" (copying). | attention scoring | 9/9 controls and two trained runs, both stopped by admission loss. No paired verdict yet (A8 dose). | Paired verdict; it must beat a lookup table (6,300 of 14,287) |
| Admission | Narrows 4,096 words to those in a few opened "drawers". A word in an unopened drawer can never be chosen. | softmax output head | The first measured limit, seen on rung 0 (the cause of weak ranking after K16 is open): one run fell from 5,680 to 1,920 admitted rows (attention state). | Admission-preserving A8 rerun |
| Rank-margin hinge | The loss only asks whether the right answer beats its strongest rivals by a fixed gap. | cross-entropy loss | Integer hinge is the discrete writer's loss. One variant (K16-R) collapsed cell occupancy (K16 outcome). | Occupancy-regularised version |
| D11 integer serving | Runs a finished model with whole numbers, adds, shifts and tables only. An audit proves no multiply instruction. | arithmetic (matmul) | Zero-multiply audits are green (44 native symbol ranges, 7 of 7 WebAssembly), but no lawful trained model has been exported (docs/integration/project-track.md). | Export one discrete model and measure its export gap |
| Tokenizer | Cuts text into 4,096 numbered pieces and back. | tokenizer | Every corpus, test and artifact is pinned to it. A 16,384-piece trainer exists as tooling only (record). | Matched 4,096 versus 16,384 comparison |
READY: built and tested, not yet trained in (4)
| Mechanism | In plain words | Replaces | Why this status | Next step |
|---|---|---|---|---|
| Hamilton gate (G2) | Turns the gate signal into a rotation and rotates the value, so no sigmoid is needed. | feed-forward gate | 944 tests, GPU parity 43 passed and 0 failed, 18 CUDA controls. Never trained (parity, controls). | Offline-float (D37) sheet with language fit and export gap |
| Recurrence gates | Fade rate from a table of powers of two, input opened by a clamped line, state carried by rotation. | sigmoid, exp and tanh gates | Table errors at most 5.5e-8, 18 CUDA controls. The six-recurrence fit never ran (record). | Show the learning surrogate gives descent |
| SpiralCore/FBS projection | Each output block picks one stored block and moves it along exact steps in 8-dimensional E8 space. No learned weight is multiplied. | dense projections (matmul) | Exact fixtures pass on an RTX 5090. Never trained. Its integer form is ACTIVE inside discrete learning (record). | Descent and tokens per second in an offline-float sheet |
| Object store (D19) | Keeps bytes exactly in a hashed tree: repeats are stored once and any range can be checked. | none (durable memory) | 60 tests and a client conformance pass. Nothing consumes it; the durable-memory bars have not run (D19, conformance). | Wire it in and run those bars (milestone M3) |
PARKED: tested forms failed or broke a rule, still open (13)
| Mechanism | In plain words | Replaces | Why this status | Next step |
|---|---|---|---|---|
| Carrier credit | Sends learning credit back to the geometric objects that carried the information. | optimizer | Three fixed arms fell from 437/512 to 0/512. The sampled-choice step uses softmax (record). | Hard-selection step; needs the M2 training hold released |
| Legal construction | Picks each parameter change from values the integer model can hold, protecting answers already correct. | optimizer | Never scored. Every attempt stopped on solver numerics (record). | Solve the saved case (1,960 variables) in exact arithmetic |
| E8 orbit memory | Replaces a feed-forward layer with a few rows of a large table addressed by E8 lattice points. | feed-forward layer (MLP) | Half-MLP form cost +0.033 BPB, within its bar, but learned keys beat E8 by 0.023. The gate is a sigmoid (record). | Sigmoid-free gate and the named next iteration |
| Exact memory | Writes a fact once under an exact prime address and reads it back exactly. | key-value memory | Trained forms scored 19/40 against a 27/40 bar, or used softmax. The address-as-read form was never built (record). | Build the address as the read, oracle first |
| Pointer key | Copies the answer by the slot's exact name, not by the surrounding wording. | copy head | A softmax pointer. Hit rate rose from 0.377 to 0.545, but memory missed its bar (record). | Lawful oracle, then a prime entity key |
| Read binding | A teacher marks which earlier value the question asks for, and the read is rewarded for landing on it. | auxiliary loss | Wrong-value errors fell from 47 to 30 of 120 over 3 seeds, but on a softmax read (record). | Port it to a Flock or Relation read |
| Hopf observation | Views a 4D rotation through a 3D shadow while keeping the lost angle separately. | attention scoring | Telemetry only. Sector routing used 7 of 512 sectors (occupancy record); the kept-fibre language test was never run (census). | Retained-fibre test |
| VSA | 4,096-bit codes glued by XOR and compared by counting differing bits. | key-value memory | Improved BPB by 0.014 to 0.023 on 2 seeds, but on the banned CPU learner (record). | GPU Hamming binding in the discrete model |
| Spin-native weights | Each 4-by-4 weight block is one quaternion, snapped to 120 icosian rotations. | arithmetic (matmul) | Reached 1.5148 BPB, level with dense, but only through matmul (record). | Owner architecture decision |
| Ternary/XOR | Weights of -1, 0 or +1, with similarity by counting differing bits. | arithmetic (matmul) | A dense ternary sum is still dense (D25). Export lost: 7.416 versus 7.171 bits. Its parts run inside discrete learning. | Owner ruling, or a geometric alphabet |
| Geometric stack | The old 7M to 214M-parameter layered model with quaternion recurrence. | whole model | Trained form used softmax and matmul and served 1.20 to 1.24 BPB against a 0.90 bar (record). | Rebuild from lawful parts (D37) |
| Native geometric engine | A from-scratch Rust model with prime addresses and version chains. It answered authored questions only. | whole model | No prose. 437/512 fell to 0/128 on fresh rows (record). | Re-register with the hinge loss once the M2 hold lifts |
| R4G1 graph | Compiled a teacher model's preferences into integer lookup tables. | whole model | Never wrote coherent free text, and needs a banned transformer teacher. | Owner decision on repairing or removing the crates (D36) |
Which mechanism covers each part of a transformer
Each row names a part of a standard transformer, says what it does, and lists the mechanisms aimed at it (A = ACTIVE, R = READY, P = PARKED). Source: the slot_map of the mechanism board (19 October 2026).
| Transformer part | What it does | Our mechanisms |
|---|---|---|
| Tokenizer | Cuts text into pieces | tokenizer (A) |
| Token embedding table | Gives each piece a starting vector | prime-zeta-codebook (A), address-cells (A) |
| Positional encoding | Tells the model the order of words | GAP: none. No record names a mechanism for this. |
| Attention: choosing what to read | Picks which earlier words matter | route-read (A), flock-read (A), relation-read (A), admission (A), hopf-observation (P) |
| Attention: mixing what was read | Combines the chosen words | flock-read (A) |
| Copy and induction heads | Repeats what appeared earlier | relation-read (A), pointer-key (P) |
| Context memory (KV cache) | Holds earlier words ready to read | exact-memory (P), vsa (P), read-binding (P) |
| Durable memory outside the model | Stores facts between chats | object-store (R) |
| Feed-forward block (MLP) | Processes each word | spiralcore-fbs (R), hamilton-gate (R), e8-orbit-memory (P) |
| Activation and gating | Decides how much signal passes | hamilton-gate (R), recurrence-gates (R) |
| Recurrent sequence mixing | Carries a running memory along | recurrence-gates (R), geometric-stack (P) |
| Projections and matmul | The big grids of multiplications | lut-serving (A), spiralcore-fbs (R), spin-weights (P), ternary-xor (P) |
| Normalization | Keeps numbers in a stable range | GAP: none. Snapping to an E8 root may serve, but no record says so. |
| Output head | Scores every word and picks one | admission (A), discrete-learning (A) |
| Loss | Measures how wrong a guess was | rank-margin (A), read-binding (P) |
| Optimizer | Decides how to change the model | discrete-learning (A), carrier-credit (P), legal-construction (P) |
| Inference runtime | Runs the finished model | lut-serving (A), r4g1-graph (P) |
| Whole-model engine | The complete model | geometric-stack (P), native-geometric (P), r4g1-graph (P) |
The two gaps matter. The only position-related result is about recurrent state transport, not word order, and it was measured in a model that used banned parts. The live discrete model has no position mechanism, no normalization and no feed-forward block, and it scores below a unigram baseline (audit synthesis, section 1). Having a mechanism for a slot does not mean it works: a row can list four mechanisms and no trained result.
Where the audit questions a status
Statuses are left as the audit dossiers set them (docs/labs/repo-renormalization-2026-10-19/audit/mechanisms/). Two are open to challenge:
- D11 integer serving is ACTIVE as the end-of-pipeline contract, but no lawful model has ever been exported through it, so READY may be more accurate.
- Hopf observation is PARKED, but its kept-fibre map is built and unit-tested and its language test never ran. Only sector routing failed, so splitting the two forms may be more accurate.
How to read a mechanism page
Each page follows the same order:
- In one paragraph: the idea and what it replaces, in plain words.
- Figure: a picture of the mechanism at work.
- How it works: the mechanism and its maths, labelled as definition, measurement or hypothesis.
- Where it stands: its status, the evidence behind it with sources, and for a PARKED mechanism what would reopen it.
- Go deeper: the code, the archived records and the nearest neighbours in the tree above.
Read the status first, then the "Where it stands" table. A claim there is a measurement only if it names a recorded run.
Go deeper
- Glossary for terms such as admission, FIT and export gap.
- The geometry page for pictures of the operators.
- Decisions log for D22 (nothing is closed for good), D37 (offline float training) and D11 (integer serving).
- Archived lab records for everything dated before 18 October 2026.
Routed read (address-routed context access)
Status: ACTIVE. It is the base read of the pilot, rung-0 (the first full-length run, 16,404 updates) and four K16 runs (the Flock and Relation arms build on its tree; see flock-read and relation-read), but its own contribution has never been isolated: it received only 20 learning proposals in 16,404 updates (attention-state record).
Labels used below: proof means derived from definitions or code, measurement means a recorded run, hypothesis means an untested idea (see the charter, section 4.6). Unfamiliar project terms (K16, A8, admission, NOT_RUN) are in the glossary.
In plain words
A transformer decides what to read by comparing the current word with every earlier word. This model does something cheaper. It keeps the earlier words at the ends of a small tree of geometric addresses. To read, it starts at the top of the tree and, at each level, steps toward the branch whose address is nearest to where the current state points. After a few steps it arrives at one earlier word and picks up that word's information. By construction it never scores the whole history, so the work should not grow with the context (a design property; speed was never measured). Whether this single pick is useful is still unknown, because nobody has switched it off to see.
What it replaces in a transformer
Attention: the step that decides which earlier positions to read. There is no query-key score table and no softmax. The read makes one hard choice per step and returns one earlier position's carrier vector.
The routed read walks a ternary tree over the context: one nearest port per level, one leaf at the end.
How it works
The model width is split into 8-dimensional blocks. Per block, the query is an integer vector \(q\in\mathbb{Z}^8\) taken at the last position. A ternary tree (a "BinderPlan" built by SpiralCore, the project's exact-arithmetic geometry library) is built over the context. Its leaves are earlier positions, and the context cap is 243 positions, which is \(3^5\).
Definition. Let \(G\) be the group of 64 signed-axis permutations of \(\mathbb{Z}^8\). Coordinates are permuted and sign-flipped by table lookup, so no multiplication is involved. Let \(R=\{r_0,\dots,r_{15}\}\) be the 16 roots of one E8 orbit, each a signed permutation of \((2,2,0,0,0,0,0,0)\). At level \(\ell\) the model holds one learned element \(a_\ell\in G\) and chooses a port \(p\) by hard minimum, where \(r_p\) is the orbit root tied to that port (schematic):
\[c_\ell=\arg\min_{p}\ \big(\lVert a_\ell q-r_p\rVert_1,\ \operatorname{Ham}(a_\ell q,r_p),\ p\big)\]
At level 0 the candidates are up to 16 frontier roots; at later levels they are the 3 children. Each choice composes a precomputed transport action between orbit roots (\(\mathrm{BFS}\) is a table built by breadth-first search over exact moves), so \(T_\ell=\mathrm{BFS}[\rho_{\ell-1}\to\rho_\ell]\circ T_{\ell-1}\). The output is \(T_L\) applied to the carrier vector of the leaf reached. This is a schematic of the kernel route_vector; the exact comparator is in the code.
Cost (proof, by construction). The work per block is about levels \(\times\) 16 distance comparisons. It does not depend on how many earlier positions exist. The cost of building and updating the tree, and tokens per second, were never measured in the audited records.
Content-blindness (proof). Port selection never inspects which token a leaf holds. Content enters only through the geometry of the query. That is why the read cannot express "copy the word after the earlier match"; see relation-read.
Learning. Training is discrete. Each route parameter is tried against its 15 generator moves in a counterfactual forward pass. The best move that strictly lowers the integer loss is applied. Nothing is differentiated (discrete-learning). The output vector goes to the shared writer (admission).
Rule check. No softmax, sigmoid or tanh (D23); no matrix multiplication, because the 8x8 "rotation" is a table lookup (D30). The kernel uses gather, sign flip, compare and integer add (D11), but no D11 served export or export-gap measurement of a trained Route model exists in the records.
What has been tried
Verdicts follow the audit: positive, negative, inconclusive, diagnostic-stop. Many older rows tested other forms (prime routing, float readers) that share the idea, not the kernel.
| Date | What was run | Result | Verdict | Record |
|---|---|---|---|---|
| 2026-07-28 | Ancestor prime-router claims re-examined under this repo's gates | Reported angular routing, not token generation; not reproduced | inconclusive | evidence note |
| 2026-07-31 | Held-out Hopf-sector routing | 7 of 512 sectors used, against a bound of 64; a later projection raised this to 43 of 512 | negative | D3 occupancy |
| 2026-08-26 | Fixed prime-route attention, source-free qualification | Address and selection mechanics pass (32/32 canary); no lexical or semantic value shown | inconclusive (product probe NOT_RUN) | #958 record |
| 2026-09-13 | 64-update pilot of learned addressed attention | Ran; no useful generated answers | negative | #973 pilot |
| 2026-09-24 | Integer coarse-address learning in the integrated prototype | Admission 1/24 to 17/24; selection 0/24; complete answers 0/12 per arm | negative | A3 result |
| 2026-10-01 | Signed-2I address reader (float), 2 seeds x 320 updates, authored gap grammar | Correct source on 128/128 rows in both seeds; float only, not served. An integer paired q/k variant kept 128/128 answers | positive | address reader |
| 2026-10-04 | Three integer cell edits; matched radial sharing | Frontier loss falls but construction replies 0/8; 0 of 32 transfer answers | inconclusive / negative | consumed cells, radial sharing |
| 2026-10-12 | Lorentz vs l2 score for a dense (softmax) read, 3 seeds | Ahead on every seed, but the pre-registered per-seed margin was met on 1 of 3. A scoring change, not addressing; the record calls it positive but below its own bar | inconclusive | geometric read |
| 2026-10-13 | First integer-only GPU path: tree routing, rotation, shared writer | 11 finite CUDA controls pass; no training | positive | discrete learning |
| 2026-10-14 | Seed-1 pilot, 1,640 batches | Top-8 173 to 1,169; loss rose slightly; Route parameters never attempted | inconclusive | A2 pilot |
| 2026-10-15 | Seed-1 full rung-0 dose, 16,404 batches, 14,287 development rows | Top-1 149 (bar 1,941); top-8 747 (bar 4,775). The bars were unreachable because only 1,920 targets were admitted | negative | rung-0 prep |
| 2026-10-17 | Host-only re-score of saved checkpoints | A context-free successor table scores 6,300 of 14,287 top-1; the trained read 149 | inconclusive | host diagnostics |
| 2026-10-19 | Four K16 runs: two writer objectives x two seeds, Route held fixed | No read comparison (the writer objective varied). Occupancy collapse, no KEEP; top-1 65 and 463 (A), 101 and 230 (R) | negative (configuration) | K16 outcome |
Reading these honestly. On rung 0 the runs were first limited by admission: most targets never reached the read. After K16 the cause of the weak ranking is open (ranking capacity, the read and the schedule all remain candidates), so these rows do not show whether routing helps or hurts. Rung 0 and the K16 runs used a codebook with only 16 distinct vectors at the start, so the read could not be separated from codebook drift. None of the failures closes the mechanism (D22: a negative closes a configuration, never a mechanism). Trajectory routing was found inert in its product probe, and the product probe of prime-route attention (#958) was NOT_RUN, so it is neither a pass nor a negative. That says nothing about routing inside a trained integer read.
What has never been tested
- Route against no read (a read-off ablation), and Route against Flock on a codebook whose addresses are distinct.
- Route trained with a schedule that gives it more than 20 proposals in 16,404 updates.
- The tangent-null and normal-null controls (move the address along the manifold versus across a branch), which the addressed-read brief requires to show the geometry is load-bearing.
- Spanning-tree addressing as addressing. Earlier variants were measured only as scoring changes.
- Served tokens per second of a routed read against a scored read at long context.
- Content-aware port selection.
What comes next
- Run a read-off versus read-on ablation with enough Route proposals (an interleaved schedule or a dedicated Route stage). This is the next step named on the mechanism board.
- Fix the codebook first: a fair test needs distinct addresses (address-cells, prime-zeta-codebook).
- The float-era forms (spanning-tree router, address-as-read) may be re-registered as an offline float sheet under D37, with a fresh fitness review, an integer export and a reported export gap (hypothesis).
Open questions: how much of the 149 top-1 comes from Route; whether a content-blind read can reach the 3,847 copy-successor targets (the relational-head design argues from the kernel code that it cannot, which is why relation-read exists); which invariant should serve as address; and whether one 16-root orbit is enough atlas.
Also known as
ReadSpec::Route; invariant-addressed read; spanning-tree router; route-native or prime-route attention; read lineage (phase bind, rotation, carrier); the legacy uor-r4-router prime router.
Code
crates/uor-r4-discrete/src/discrete.cu: kernelroute_vector(lines 41-79) and the shared counterfactual kernels.crates/uor-r4-discrete/src/lib.rs:ReadSpec::{Route,Flock,Relation}andParameter::Route.qualification.rs: the 11 finite CUDA controls.rows_device.rs: row-parallel scoring, about 56 times faster with identical losses.- Float-era, dormant:
crates/uor-r4-training/src/stack_address.rs,geometric_address.rs. The legacycrates/uor-r4-router/does not build against the current core (#2345) and is kept as evidence.
Related mechanisms
flock-read replaces the single leaf with a consensus of several neighbours. relation-read adds links Route cannot express. admission consumes the routed vector and is where rung 0 first hit a measured limit. address-cells and prime-zeta-codebook give positions their addresses. spiralcore-fbs supplies the transport table and the tree. discrete-learning trains the route parameters. exact-memory is the older idea of routing to an exact prime address.
Flock read (starling / murmuration neighbour read)
Status: ACTIVE. The integer Flock kernel passes its finite CUDA construction controls and runs inside every Relation and control arm. But no run has ever isolated what the Flock read itself contributes (attention-state record).
Labels used below: proof means derived from definitions or code, measurement means a recorded run, hypothesis means an untested idea (see the charter, section 4.6). Unfamiliar project terms (K16, A8, admission, NOT_RUN) are in the glossary.
In plain words
A starling in a flock does not watch the whole flock. It watches about seven nearest neighbours and turns toward their average heading. The Flock read works the same way. At each step the model picks a handful of earlier positions that sit closest to the current one, rotates what each one knows into the current position's point of view, and takes their consensus. Then it nudges its own state toward that consensus. Nothing is normalised, no scores are exponentiated, and no weights are multiplied. Whether this beats simply reading one position is still untested on real text.
What it replaces in a transformer
Attention, both halves: choosing which earlier positions to read, and mixing what was read into the current state. A transformer weights every earlier position with a softmax and sums them. Flock keeps a few by hard integer ranking and adds their rotated consensus with a three-valued dial.
The flock read on the 600-cell: a query point, its seven nearest neighbours, their rotation into the query's frame, and the consensus they produce. The live integer version uses 16 frame roots in place of the 600-cell (inset).
How it works
The float-era picture (inactive evidence). The 600-cell is a four-dimensional solid with 120 vertices, and each vertex has 12 neighbours. Each token was given a home vertex. A query read only the tokens stored at its own vertex and the 12 adjacent ones, kept the nearest seven, and moved their values into its own frame using exact icosian transport. Those experiments ran in floating point, with the selection on the host and softmax helpers during training.
The live integer form. Per 8-dimensional block, context sits in a ternary tree whose leaves are earlier positions (route-read uses the same tree). Each interior node holds the snapped sum of its three transported children. For each tree level \(\ell\) there is one learned gate \(g_\ell\in\{-1,0,+1\}\).
- Rank (Definition). Eligible nodes at level \(\ell\) end strictly before the query. Keep the best \(K\) (\(1\le K\le 8\)) under the lexicographic key \(\big(d_{L1}(f_n,f_q),\ d_{H}(f_n,f_q),\ -\mathrm{last}(n),\ n\big)\). Here \(f\) is a node's frame root among the 16 roots of one E8 orbit and \(d_H\) is coordinate Hamming distance.
- Carry. Each kept payload \(p_n\) is moved into the query's frame by the precomputed transport action between the two roots: \(c_n=\mathrm{BFS}[f_n\to f_q]\,(p_n)\).
- Consensus. \(m_\ell=\operatorname{snap}\big(\sum_{n\in\text{kept}}c_n\big)\), the nearest of the 16 roots.
- Gated add. \(v\leftarrow v+g_\ell\,m_\ell\). Trit \(+1\) adds the consensus root, \(-1\) subtracts it, \(0\) skips the level. The output is \(v\) snapped back to a root.
This is built as an integer form of the Vicsek/Kuramoto alignment rule \(\Delta=K_h(\text{mean}-v_t)\) with \(K_h\in\{-1,0,+1\}\): align with the local flock, with no weights, no normalisation and no division. That correspondence is the design intent; the page makes no equivalence claim.
Rule check. Hard rank by integer keys, so no softmax (D23). No matrix multiplication (D30). The kernel uses gather, compare, add and subtract, and the snap is built by repeated addition (D11). No D11 export of a trained Flock model has been built or measured.
Cost (hypothesis). The tree variant should read in about \(O(\log n)\) steps. That has not been measured in the integer form.
What has been tried
Almost all evidence below is from the float era, on a synthetic 512-to-1,536-token recall task or a small language-model recipe, with host-side selection and softmax helpers. It is inactive evidence under the no-softmax rule (D23). It shows what that recipe did, and it cannot judge a hinge-credited integer flock. "Recall" means the share of queries whose stored value was read back correctly.
| Date | What was run | Result | Verdict | Record |
|---|---|---|---|---|
| 2026-10-10 | Four flock/rank-table reads in a 19.93M-parameter stack, 2 seeds | All four missed the 0.01 BPB bar. Softmax 0.8772 BPB; fixed rank +0.0398; Hamming rank +0.2585; learned rank table +0.0185; wide flock +0.0172 | negative | softmax-free read |
| 2026-10-11 | Rung 1 (from scratch), rung 3 (content gate), diagnostics, and SoftSort | Recall 0.009 and 0.010 against 0.617 for softmax. With the source forced into a fixed slot, recall was 1.000. SoftSort was stopped by the owner | negative | rung 1, content, pivot, SoftSort |
| 2026-10-11 | Rung 2: dense helper annealed to zero, 3 seeds | Source in the kept seven rose from 0.099 to 0.727 then fell to 0.556; recall 0.011 | negative | anneal |
| 2026-10-12 | Training-only softmax surrogate; distillation and sweep | Recall 0.141 (bar 0.28); distillation 0.188 to 0.380; heavy weight kept the source more often but broke the readout (0.128) | negative / inconclusive | surrogate, sweep |
| 2026-10-12 | Light-distillation read, 3,600 steps | Mean recall 0.780, 5 of 5 seeds above 0.30. Training budget was unequal to softmax | positive | recall |
| 2026-10-12 | Equal budget against softmax, ring store of the last 4 keys per cell | At 512 positions: softmax 0.991, flock 0.831 (bar 0.841). At 1,536: 0.999 against 0.241, because old sources are evicted | negative | context |
| 2026-10-12 | Persistent base-3 tree replaces the ring, 1,536 context | Source found 0.99, 0.68, 0.90 of the time; 6 to 36 candidates read per query; recall 0.329 against softmax 0.999. Retention fixed, readout limits | positive | tree |
| 2026-10-12 | Readout distillation; dense bootstrap teacher | Mean recall 0.377 versus 0.329; one seed reached 0.964 at 68.9 mean candidates. The teacher run needed a dense model, so it is inactive | negative / inconclusive | readout, bootstrap |
| 2026-10-13 | Lawful native read (rung 0b) and the integer Flock and Gate kernels | 16/16 finite controls pass for rung 0b; 17/17 for the integer kernels; 25/25 in the driver-cost run. No training | positive (construction only) | rung 0b, integration, driver cost |
| 2026-10-18 | Dose 1: the Flock-equivalent control (relation dials locked at zero), 16-vector codebook | Admission on the copy-successor panel fell 2,034 to 205 of 3,847; the read could not be judged | diagnostic-stop | Q1 diagnosis |
| 2026-10-19 | A8 dose: the same control for the full 16,404 batches | 301 accepted vector updates, about 0.12 s per batch; admission fell 1,351 to 857 of 3,847 by batch 4,096 (a 37% loss); fresh slice sealed | diagnostic-stop | A8 dose |
Reading these honestly. The M4 stack and the starling rungs were softmax-tuned, short-context and host-side. The ring-store collapse is eviction, which the tree fixed. The two October control runs lost admission to learning moves first (admission), so the read was never the thing being measured. SoftSort was closed by owner decision, not by a measured negative. D22 applies: these close configurations, not the mechanism.
What has never been tested
- Flock as a stand-alone integer read trained on the corpus and compared with Route. No arm tests the transported-consensus read against Route.
- A read-off versus read-on ablation of Flock inside the control arm.
- The lawful no-softmax decisive run (in-context recall on copyable development targets).
- Flock on a codebook whose addresses are distinct and stay admitted.
- K and M at long context, and the sink and local-window variants in integer form.
- A float-trained coupling magnitude, rank-consistent soft-to-hard selection, and the tree read in integer form.
- A chirality sign on the coupling.
- Served tokens per second of a flock read against a scored read at long context.
A fair test needs
From the earlier brief, archive/mechanisms/starling-read.md.
- A training signal for the addresses: soft-to-hard annealing works (rung 2).
- A readout that keeps the right source's information: under the murmuration read this is the transported flock mean, scored by flock coherence and the source-in-flock rate.
- Recall measured by distance bucket (so eviction is distinguishable).
- More than one read layer before any multi-hop claim.
What comes next
The mechanism is ACTIVE, so this is a plan, not a reopening.
- Coupling sheet (C1). Train a float coupling strength per head and level over the fixed integer Flock topology. Export it to a trit or small integer. Include zero-coupling and random-coupling controls, 2 seeds or 200 fresh rows, and a reported export gap. It is a draft (sheet) and is not registered.
- Soft-to-hard selection (C2). Use a rank-consistent hinge and a linear anneal, with no temperature exponential, ending at the exact integer rank. Score it by how often the source is in the flock, and by rank-1-when-kept by distance bucket.
- Tree read (C3). Use the tree for \(O(\log n)\) reads, only after C1 shows the coupling learns, and with tokens per second reported first.
Any retry of the float starling or rank-table forms needs a fresh fitness review, an owner release, a separately scanned float module, a D11 integer export and no softmax surrogate.
Also known as
ReadSpec::Flock; starling read; murmuration read; starling_native (rung 0b); flock or rank-table reads; softmax-free read; seven nearest neighbours on the 600-cell.
Code
crates/uor-r4-discrete/src/discrete.cu: kernelflock_vector(lines 125-269) andsnap(102-110).lib.rs:ReadSpec::Flock { kept }, the gate trit parameter, andReadInitialization::ActiveLeafV1, which sets gates to +1 so the read is not causally dead at the start.flock_qualification.rs: six finite CUDA controls.- Inactive evidence:
crates/uor-r4-training/src/starling_native.{rs,cu},flock.rs,geometric_stack.rs. The served integer selector for the older lookup stack iscrates/uor-r4-integer/src/stack/flock.rs.
Related mechanisms
route-read: Flock replaces Route's single leaf with a transported consensus. relation-read: Flock plus a reranker; with all relation dials at zero it is bit-identical to Flock. admission: every Flock-equivalent run was limited by admission first. rank-margin: the hinge that replaced the softmax surrogate. spiralcore-fbs: the transport table and tree. hopf-observation: considered for neighbour keys. exact-memory: the persistent tree is an exact addressed store of the past.
Relation read (finite relational head)
Status: ACTIVE. It is built, passes 9 of 9 finite CUDA controls, and has trained twice. Both training runs were stopped by loss of admission before the read could be judged, so there is no verdict yet (A8 dose record).
Labels used below: proof means derived from definitions or code, measurement means a recorded run, hypothesis means an untested idea (see the charter, section 4.6). Unfamiliar project terms (K16, A8, admission, NOT_RUN) are in the glossary.
In plain words
Much of language works by copying. When you meet a word you saw earlier, the next word is often the one that followed it last time. The Flock read finds earlier positions that look like the current one, but it cannot say "take the word right after that earlier copy." Relation adds that ability. It lets the read follow simple links between positions: the word right after, a sibling in the same phrase, the same word again. Each kind of link is controlled by one three-position dial: off, boost or penalise. With every dial off, the model behaves exactly like Flock. The dials have been trained twice, but never long enough to judge them.
What it replaces in a transformer
The scoring half of attention, which decides which earlier positions matter. In a transformer, copying the next word is done by "induction heads" that learn a query-key match pattern. Here the same habit is a bounded, exact rerank by link type. There is no learned score table and no softmax.
The copy-the-next-word read on "x A B y z A": the dial for "successor" passes the earlier A's score on to B.
How it works
Relation is Flock plus a reranker. The pool is every causally eligible node of the same ternary tree that Route and Flock use. Five link types come from retained structure only:
| # | Link type | What it connects |
|---|---|---|
| 0 | parent-child | a node and its tree children |
| 1 | sibling | neighbouring children of one parent |
| 2 | sequential successor | leaf \(j+1\) follows leaf \(j\) (the copy-successor primitive) |
| 3 | same token | two positions holding the same token id |
| 4 | same frame | two nodes sharing an orbit-root frame |
Definition. For a query with frame root \(f_q\), each node \(i\) starts with a match score \(m_i=8-d_{L1}(f_q,f_i)\in\{0,4,8\}\). Each (link type \(e\), tree level) has a learned trit \(g[e,\ell]\in\{-1,0,+1\}\), which makes 25 dials for five levels. For sweeps \(t=1,\dots,S\) (\(1\le S\le5\)):
\[r_i^{(t)}=r_i^{(t-1)}+\sum_{e=0}^{4}g[e,\ell(i)]\sum_{j\in\mathcal{N}_e(i)}s_j^{(t-1)},\qquad s^{(0)}=m,\ \ s^{(t-1)}=r^{(t-1)}\ (t\ge2)\]
Here \(\mathcal{N}_e(i)\) are node \(i\)'s neighbours under link type \(e\). Candidates are ranked by \(r_i^{(S)}\) first, then by the Flock keys (frame distance, Hamming distance, recency, node id). The top \(K\le8\) feed the unchanged Flock transport, consensus and gated add.
Worked example. In "x A B y z A" the query is the final A. The earlier A has the same frame, so \(m=8\). Set the level-0 successor trit to \(+1\) with one sweep. B receives \(r=+8\) and outranks every candidate with \(r=0\), whatever that candidate's own frame distance. B's payload is carried in. That is the copy-successor read.
Two facts that follow from the code (proof).
- With every trit at zero, all scores are zero and the ranking is bit-identical to Flock. This is the rollback identity, and it is the control used in training.
- Scores are integers bounded by \(8\cdot(1+8)^5=472{,}392\), far below \(2^{31}\), so plain integer addition suffices. No multiplier, no float, no clamp.
Why Route and Flock cannot do this (proof, from reading the kernel). Both rank each node by its own frame and carry that node's own payload. The successor's frame has no fixed relation to the query's frame, so neither read can promote a node because its predecessor matched. The design record makes this argument in full.
The target is large (measurement). On the pinned development panel (14,287 eligible rows, context 192), the query token recurs earlier in 8,648 rows, and the target is the word after the latest earlier copy in 3,847 rows (26.9%). This is the copy-successor sub-panel, called \(P_{succ}\) here. Its distance buckets 1-8, 9-32, 33-96 and 97-192 hold 50, 2,872, 900 and 25 rows.
Learning and the bar. The trits reuse the existing gate parameter kind and are learned by counterfactual moves (discrete-learning) on a schedule where every eighth batch is a read batch. To count, a trained Relation must beat a context-free successor table (called T2), which scores 6,300 of 14,287 top-1 in a host re-score, while the trained Route read scored 149.
Rule check. Hard top-K by integer keys (no softmax, D23); no matrix multiplication (D30); integer compare, gather, add and subtract (D11). No D11 export or export gap exists for a trained Relation artifact.
What has been tried
| Date | What was run | Result | Verdict | Record |
|---|---|---|---|---|
| Sept 2026 | Precursor: one-read typed attention over four records, authored panel | 64/64 development answers; controls fail; not the discrete head | positive | #973 record |
| 2026-10-14 | Model-free statistics and an adversarial review of four attention proposals | A bounded exact-relation reranker is the smallest falsifier; read parameters got 20 of 16,404 proposals | inconclusive | independent review |
| 2026-10-15 | ReadSpec::Relation built in the discrete crate | Source only; GPU qualification later passed 9/9 | inconclusive | construction |
| 2026-10-17 | Interleaved schedule; six paid pod attempts at compiler checks | 0 model updates; blocked by tooling | blocked | learning path |
| 2026-10-17 | Zero-training preflight | 9/9 controls pass; starting \(P_{succ}\) admission 2,034 of 3,847 | positive | preflight |
| 2026-10-17 | Host re-score of saved checkpoints | T2 table 6,300 versus trained read 149; admission K 8 to 16 did not help (149 to 138) | inconclusive | host diagnostics |
| 2026-10-18 | Dose 1 on the ordinary path | Owner stopped it for speed at 904 and 1,065 batches; not graded | diagnostic-stop | strategic stop |
| 2026-10-18 | Row-parallel kernel against the ordinary path | Identical losses, 3.843 s versus 0.0691 s (55.6 times faster) | positive | rows parity |
| 2026-10-18 | Dose 1 (row-parallel), Relation against a trit-locked control, 16-vector codebook, stopped at 4,096 batches | \(P_{succ}\) admission 2,034 to 225 (Relation) and 205 (control). Trits attempted/sensitive/accepted: 275/140/94 against 275/141/0 | diagnostic-stop | Q1 diagnosis |
| 2026-10-19 | Zero-update test of three codebook placements | Admitted rows: address-structured 1,351, uniform 127, shuffled 476 of 3,847 | positive | address cells |
| 2026-10-19 | Injective codebook as the start | 127 of 3,847 against a gate of 500; run not dispatched | diagnostic-stop | injective preflight |
| 2026-10-19 | A8 dose: Relation against the control | At batch 4,096, Relation: 1,351 to 551, stopped there under its half-start rule. Control: 1,351 to 857, then ran the full dose. Trits 275/124/87 | diagnostic-stop | A8 dose |
| 2026-10-19 | Admission-preserving rerun, pre-registered | Passed its fitness review; nothing run | inconclusive | admission-preserving |
Reading these honestly. In the A8 dose, the Relation arm fell faster, which coincides with 87 accepted relation-trit updates. That is co-occurrence, not attribution. Both arms lost admission to learning moves, and the sheet named this risk before the run. Under the project's diagnostic-stop rule (D31) and the rule that a negative closes a configuration, never a mechanism (D22), these are diagnostic stops: not negatives, and not a KEEP. The fresh transfer slice has never been opened.
What has never been tested
- A full-dose Relation arm paired against its control with admission intact.
- Whether the level-0 successor trit is ever learned, and what it buys on the 3,847-row sub-panel.
- Relation against the T2 table and against Route in the matched discriminator.
- More than one sweep, the other four link types, and any level above 0.
- Whether the interleaved schedule gives the read enough proposals.
- Relation with admission-preserving acceptance, at K=16, or on a fully injective address-structured codebook together.
- Cost and tokens per second at serving shape.
What comes next
- Admission-preserving A8 rerun. A guard audits a fixed anchor of 3,847 training rows every 64 batches and rejects any interval that erodes admission (margin 24). It stops as a no-op if the rejection rate exceeds 0.50. The sheet is FIT; the controller and verifier merged (
UOR-Foundation/uor-r4#2782,#2783); finite qualification, project-manager dispatch and an owner-typed release are outstanding. - Stage M2 discriminator. A matched interleaved Relation against Route, with a zero-trit ablation. Still held and awaiting a fitness review.
- Float extension (hypothesis). A float-trained version of the 25 trits (D37) only after a Relation KEEP, with an integer export and a reported export gap.
Open questions: whether the guard rejects so many intervals that learning does nothing; whether copying is better delivered by the read or by a successor table beside it; and which of the 25 dials matter beyond level 0.
Also known as
ReadSpec::Relation; finite relational head; bounded exact-relation reranker; D34 reranker-first; copy-successor or induction read; relation trits; the Dose 1 and A8 Relation arms. Some older notes call the row-parallel run "Dose 2" because its attempt id contains dose2-rows. This page follows the audit and calls it Dose 1.
Code
discrete.cu: the Relation branch insideflock_vector(lines 164-212) and the comparator at line 236.lib.rs:ReadSpec::Relation { kept, sweeps },RELATION_EDGE_TYPES = 5.relation_qualification.rs: the 9 controls.training.rs: the interleaved schedule and the frozen-zero control.attention_learning.rs,attention_preflight.rs,attention_transfer.rs,attention_audited.rs.- Design record:
finite-relational-head.md.
Related mechanisms
flock-read: relation-off equals Flock. route-read: cannot express copy-successor. admission: the ceiling that stopped both doses. address-cells: the codebook change that restored starting admission. prime-zeta-codebook: the injective constructor. object-store: the companion D34 line, not attention. discrete-learning: the move law and the speedup that train the trits.
Admission (cell shortlist before the token is chosen)
Status: ACTIVE. It is the output step of the current model and the first measured binding limit, seen on rung 0 and for the top-8 bar (after K16, the cause of the weak ranking is open): the correct word often is not in the shortlist at all (attention-state record).
Labels used below: proof means derived from definitions or code, measurement means a recorded run, hypothesis means an untested idea (see the charter, section 4.6). Unfamiliar project terms (K16, A8, admission, NOT_RUN) are in the glossary.
In plain words
Before the model picks a word, it narrows its 4,096 possible words down to those stored in a few "drawers", the drawers nearest to where its read points. A word in a drawer that was not opened can never be chosen, however good the read was. So the number of correct words whose drawer gets opened sets a ceiling on everything upstream. This ceiling was the limit on rung 0; the later K16 runs show that a high admitted count alone does not give good ranking. In several runs, learning itself pushed correct words out of the opened drawers, so the number of reachable answers fell during training. The next registered run adds a guard against that.
What it replaces in a transformer
The output head: a transformer scores every word in the vocabulary and normalises with a softmax. This model never scores all 4,096 words. It makes a hard shortlist of cells, then picks the nearest word inside it. There is no softmax and no normalised distribution.
Admission: only words in the lit drawers can be chosen. In the A8 control run, the number of copy-successor targets in lit drawers fell from 1,351 to 857 of 3,847 within 4,096 batches.
How it works
The writer takes the read's integer vector \(q\) (\(B=4\) blocks of 8 numbers) and picks a token in two steps.
Definition (admission). Each token \(t\) has a codebook vector. Its cell is the pair \(c(t)=(\rho_{\text{first}}(t),\rho_{\text{last}}(t))\) of orbit-root labels of its first and last block, so there are \(16\times16=256\) cells. The address distance from \(q\) to a cell is the L1 distance of \(q\)'s first block to the cell's first root plus the same for the last block. The \(K\) nearest occupied cells are admitted, ties by cell number. \(K\) is 8 in the lineage of record and at most 16.
Definition (ranking). Among tokens in admitted cells, the nearest by total L1 over all blocks wins. Ties go to the lowest token id.
Consequence (proof). A target outside the admitted cells cannot be predicted whatever the read does. So top-1 hits \(\le\) top-8 hits \(\le\) \(N_{\text{adm}}\), the number of rows whose target cell is admitted. Rung 0 shows the force of this. Its top-1 bar was 1,941 rows, but only 1,920 targets were admitted at the end, so the bar was arithmetically unreachable.
Training hinge. Learning uses an integer hinge: \(8\times\) the token margin plus \(32\times\) a cell term. The two cell terms are objective A (the margin to the nearest rival cell) and objective R (how many occupied cells outrank the target beyond \(K\)). The weights are applied by shift-and-add, with no multiplier (rank-margin).
Why learning erodes it. Codebook moves change a token's cell. A move that improves the loss can eject a target from the shortlist. The admission-preserving rule audits a fixed anchor panel every 64 batches and rejects any interval that shrinks admission.
Rule check. Hard top-K and a hinge over declared rivals: no softmax (D23). Sums of absolute differences, no matrix multiplication (D30). Integer only (D11), but no served export of an admission artifact has been measured.
What has been tried
Terms: \(P_{succ}\) is the 3,847-row copy-successor sub-panel (see relation-read). Q1 and Q4 are the checkpoints at 4,096 and 16,404 batches. The full panel has 14,287 rows. "Gate" is a pre-registered pass line.
| Date | What was run | Result | Verdict | Record |
|---|---|---|---|---|
| 2026-10-14 | Seed-1 pilot, 1,640 batches (and its loss decomposition) | Top-1 17 to 82, top-8 173 to 1,169; loss rose slightly. Token loss fell 63,968 but cell loss rose 131,968; 16 distinct vectors grew to 155 | inconclusive | pilot, diagnosis |
| 2026-10-15 | Full rung-0 dose, \(K=8\), 16,404 batches | Top-1 149 (bar 1,941); top-8 747 (bar 4,775). Admitted fell from 5,680 at the start to 1,920 | negative (admission-limited) | rung-0 prep, redirect sheet |
| 2026-10-15 | Widening \(K\) from 8 to 16 at evaluation time on four saved checkpoints | Admitted at the end: 1,920 at \(K=8\), 2,400 at \(K=16\) (gate 4,894). Earlier checkpoints reached higher ceilings | negative | Stage A sweep |
| 2026-10-17 | Host re-score, \(K=8\) against \(K=16\) on the 1,920 admitted rows | Top-1 149 to 138; raising \(K\) alone did not help | inconclusive | host diagnostics |
| 2026-10-17 | Zero-training preflight on the seeded codebook | Start: \(P_{succ}\) 2,034 of 3,847; full panel 7,500 of 14,287 | positive | preflight |
| 2026-10-18 | Codebook coverage census | The start codebook had 16 distinct vectors for 4,096 tokens (256 each); 391 of 16,384 attempted moves were accepted by the end | inconclusive | alias census |
| 2026-10-18 | Dose 1 with Relation, stopped at Q1 | \(P_{succ}\) admission 2,034 to 225 (Relation), 205 (control) | diagnostic-stop | Q1 diagnosis |
| 2026-10-19 | K16-A and K16-R: two objectives x two seeds, Route fixed | Admitted: A 2,237 and 3,167; R 12,089 and 12,466 (gate 4,894). Occupied cells: A 209 and 192; R 20 and 19. Top-1: A 65 and 463; R 101 and 230 (bar 1,941) | negative (configuration) | K16 outcome |
| 2026-10-19 | Injective codebook with uniform cell spread | Aliasing fixed, but \(P_{succ}\) admission was 127 of 3,847 against a gate of 500; not dispatched | diagnostic-stop | injective preflight |
| 2026-10-19 | Zero-update test of placing each token's cell near its predecessors' cells | \(P_{succ}\) admitted: address-structured 1,351, uniform 127, shuffled 476 of 3,847 (3.3% to 35.1%); at \(K=16\), 2,178 | positive | address cells |
| 2026-10-19 | A8 dose, Relation arm and trit-locked control | \(P_{succ}\) at 4,096 batches: 1,351 to 857 (control, 37% lost) and 551 (Relation, 59% lost) | diagnostic-stop | A8 dose |
| 2026-10-19 | Admission-preserving rerun, pre-registered | Passed its fitness review; nothing run | inconclusive | admission-preserving |
The K16-R pass is hollow. Objective R collapsed the codebook onto about 20 occupied cells. Each row then admitted about 3,400 of the 4,096 tokens, so "admission" was nearly pass-through. The registered occupancy check fired on both seeds, and the call was no KEEP. Objective A kept 192 to 209 cells but lost admission. Both are negatives for these exact configurations, and D22 says no mechanism family is closed by them. Widening \(K\) at evaluation time closes only that route for that codebook; lineages trained with \(K>8\) remain open.
What has never been tested
- Admission-preserving acceptance during learning (registered and fit, never run).
- A lineage trained at \(K>8\) with distinct, address-structured cells, to full dose.
- Ranking once admission is intact. No run has had admission intact and then succeeded or failed at ranking.
- An address that uses more than the first and last block of \(q\) (full-vector, interior-block or cell-envelope).
- An occupancy-regularised objective that does not collapse to about 20 cells.
- Fresh-slice transfer of any admission result. The sealed 2,000-row slice has never been opened.
- Whether admission capacity trained in at \(K=8\) can reach the 4,894 gate.
What comes next
- Admission-preserving A8 rerun with the 64-batch anchor guard. The controller is merged (
UOR-Foundation/uor-r4#2782). Finite qualification and an owner-typed release are outstanding. - Occupancy-regularised or load-balanced rank objective, the registered route after the K16 collapse.
- A finer address metric if admission stays capped at \(K=16\).
- \(K>8\) on an injective, address-structured codebook.
Open questions: why learning moves targets out of the cells that predecessor placement chose, and how fast; whether the guard's 24-row margin rejects so much that learning becomes a no-op; whether 256 cells are too coarse; and when ranking, not admission, becomes the bottleneck.
Also known as
Kept cells or \(K\) shortlist; target admission; Q1 admission collapse; the B3_init and G-Cap gates (starting and capacity checks on reachable targets); \(P_{succ}\) admission; G-Adm and G-Occ (the admission and occupancy gates); the admission-preserving guard.
Code
discrete.cu:address_distance(line 274),token_cell(286),cell_precedes(301) and the writer (307-345).objective.rs: objectives A and R.coverage_census.rs,address_cells.rs,prime_zeta.rs: codebook census and placement.attention_anchor.rs,attention_audit.rs,attention_audited.rs: the guard.rows_device.rs: the row-parallel scoring, about 56 times faster, that made the K16 and A8 doses affordable.
Related mechanisms
address-cells sets which cell each token lives in. prime-zeta-codebook is the injective initialiser. route-read is the read whose output admission consumes. relation-read and flock-read had doses stopped by admission loss. rank-margin is the hinge family. discrete-learning is the move law that trains the table.
Prime-zeta codebook
Status: ACTIVE. The constructor is built and qualified, and its table is wired in as the start for new training lineages. No trained artifact has started from it yet: rung 0 and K16 began from a seeded 16-vector table. It is the baseline arm of the 19 October pre-flights and the fallback cell inside the address-structured table. No run has yet trained it against its two matched controls. That comparison is NOT_RUN and held (construction record).
Labels used below: proof means derived from definitions or code, measurement means a recorded run, hypothesis means an untested idea (see the charter, section 4.6). Unfamiliar project terms (K16, A8, admission, NOT_RUN) are in the glossary.
In plain words
A language model has to start every word somewhere. The usual start is random numbers. In this project the random start gave 4,096 words only 16 different starting positions, so many words were indistinguishable. This mechanism gives every word its own fixed address instead. A word's place in the vocabulary picks a prime (2, 3, 5, and so on), and the prime is turned into a set of angles using the known frequencies of the Riemann zeta zeros. Everything is computed once, offline, and stored as a table of small whole numbers. Whether the zeta angles help beyond simply keeping words distinct has not been tested.
What it replaces in a transformer
The token embedding table. A transformer starts each token with a random vector and learns it. Here the starting table is constructed, fixed and made of integers. The model can still change it later through its learning moves (discrete learning).
A word's prime sets eight dial angles, and the angles pick a cell on a 16 by 16 board. The random start put 256 words on each of 16 patterns. This table puts 16 words in each of 256 cells, all distinct.
How it works
Prime address (Definition). Token \(v\) with vocabulary id \(\mathrm{id}(v)\in\{0,\dots,V-1\}\) gets the prime \(p_{\mathrm{id}(v)+1}\). The vocabulary maps one-to-one onto the first \(V\) primes, and \(p_{4096}=38873\).
Zeta phases (Definition). Take the first 512 imaginary parts \(\gamma_k\) of the zeta zeros from a pinned table of published values. The phase and phasor of channel \(k\) are \[\theta_k(p)=\gamma_k\ln p \pmod{2\pi},\qquad z_k(p)=\cos\theta_k+i\sin\theta_k .\] Using a finite table of these constants does not require solving the Riemann hypothesis.
Quantize and place (Definition). Four consecutive channels per 8-dimensional block form a vector in \(\mathbb{C}^4\). It is split into two \(\mathbb{C}^2\to\mathbb{R}^4\) spinor pairs and stored as integers (PhaseQ29, UnitS3Q30). The pairs are embedded in the four orthogonal 2D root planes of a 16-root orbit of the E8 lattice. Each block takes the orbit root with the largest exact integer inner product.
Cells (Definition). A token's writer cell is the pair (root of block 0, root of the last block). That makes a \(16\times16=256\) cell grid. Two passes then run:
- A quota pass puts exactly \(V/256=16\) tokens in each cell.
- A uniqueness pass gives interior blocks distinct roots, so all 4,096 full vectors differ.
Where floating point lives. The logarithm, sine and cosine are confined to this one-time host step, under the October 14 zeta-zero exception. The output is an integer table loaded as the model's starting table (pinned_table_v1). The served model sees only integers.
Two matched controls share the same pipeline. TangentNull shifts every \(\gamma_k\) by 1.0. NormalNull permutes the primes and moves the phases off the critical line.
An honest caveat (proof, by reading the code). The quota and uniqueness passes also run on both controls. So the zero collisions come from those passes, not from prime phases. The seed does not change the PrimeZeta table: seeds 0, 1 and 2 give identical tables.
Rule check. No softmax or squashing (D23). No matrix multiplication; each token is scored by a few 8-element integer inner products, once, on the host. This is data preparation: no model quantity is computed there (D24, D30). The compiled integer module contains 0 floating-point instructions (D11, D32). Float is allowed here only by the October 14 exception.
What has been tried
Almost all of the evidence concerns construction and admission. No row measures language quality. "Admitted" means a target word sits in one of the few cells the reader opens (admission).
| Date | What was run | Result | Verdict | Record |
|---|---|---|---|---|
| Jul 2026 | First prime router with hypervector algebra (UOR-Foundation/uor-r4#1, #6, #9) | Structural work only; no model quality recorded | inconclusive | #9 issue record |
| 27 Jul–3 Aug | Phase-clock digits as an address channel in the old graph-compiler store (#392) | All rows below the shipped row: 12.5–16.7% top-1 against 34.7% | negative, for that store | design |
| 3–6 Aug | Re-check of the zeta-grid retrieval headline (#434, #440) | The 0.89 MRR headline was re-attributed to vector fullness, not zeta geometry: full-width content vectors scored 0.8948, above zeta's 0.8932 (#440). The stored path kept 1/16 of each vector and cost about 0.66 MRR (0.2348 to 0.8948) | negative | #440 control run, de-banding audit |
| 26 Aug | Source-free prime-route attention (#958) | Mechanics pass (stages 1–3). Product probe and teacher comparison NOT_RUN | inconclusive | record |
| 5 Sep | Occurrence selection with prime postings and zeta phase paths | First token 15/32 to 20/32; Rust exact still 0/32; phase term not isolated | positive, unattributed | record |
| 28 Sep | Review of prime and zeta features against plain tabulation | No predictive gain recorded; kept as exact identity | negative | toolbox |
| 14 Oct | Diagnosis of the random start | Symbolic analysis: exactly 16 full-vector patterns, each shared by 256 tokens, for every seed at this shape | proof | diagnosis |
| 14 Oct | Construction qualification, bounded GPU controls, zero training | Bit-exact on two CPU architectures; 4,096/4,096 unique vectors, 256/256 cells; 4,090/4,096 tokens differ from TangentNull and 4,096/4,096 from NormalNull; 17 base plus 6 PrimeZeta controls pass with 0 applied updates; 0 float instructions; pod cost about $0.13 | positive | record |
| 18 Oct | Wired in as the start for new lineages; host census on the 14,287-row development panel | Distinct vectors 16 to 4,096; reachable rows (alias ceiling) 1,986 to 14,287; tie mass 12,301 rows to 0. Host check only | positive | wiring, census |
| 19 Oct | Zero-update pre-flight at K=8 | Aliasing gone, but words spread over all 256 cells, so only about 8 of 256 target cells are opened. Admitted 127 of 3,847 against a gate of 500. Run not started | diagnostic stop | pre-flight |
Reading these honestly. The last row closes the configuration "spread words evenly at K=8". The record calls it an instrument-reachability problem, not a failure of prime-zeta geometry. The older retrieval results ran on a previous store, and one of them was a banded-storage artifact. None tests zeta phases inside a token codebook on the current stack, and the #958 and #973 results never isolated the zeta term. D22 applies: these close configurations, not the mechanism.
What has never been tested
- Trained attribution. PrimeZeta against TangentNull, NormalNull and a quota-only injective control, at matched budget, with at least 2 seeds or 200 fresh rows.
- Meaning in the phases. Primes are assigned by token id, which is arbitrary, so the phases encode identity and not meaning. No test checks whether phase-near words behave alike (hypothesis).
- Any language effect. Every result is construction, census or zero-update admission.
- Seed variance. The table is a function of token id alone. Seed diversity needs a declared extra axis, such as a channel offset or batch order.
- Special tokens (start, end, pad) with reserved small primes or fixed points.
- Zeta phases as a position encoding on the discrete stack.
What comes next
The mechanism is ACTIVE, so this is a plan, not a reopening. A trained-in comparison needs its own pre-registered sheet that passes TEST FITNESS: FIT, plus the owner's training release. The sheet should report admission, top-1 and top-8, separated hinge losses and fresh transfer. Since the address-structured table now places words by their predecessors, a second question is whether this table still earns its place as the fallback, or whether a random injective table would do the same job.
Also known as
Prime-rank indexing plus zeta-phase routing; prime-zeta complex routing; CodebookMode::PrimeZeta; the "P8" baseline arm of the 19 October pre-flights; pinned_table_v1 (the loader that carries it); the complex-plane zeta-zero exception (October 14); ancestors: the prime router, prime-route attention, the 16-window zeta projection and the phase-clock design.
Code
crates/uor-r4-discrete/src/prime_zeta.rs: the constructor, the quota and uniqueness passes, both controls and the zero-float PTX check.prime-zeta-qualify.rsandprime-zeta-codebook.rs: qualification and table export.training.rs: thepinned_table_v1loader and the checkpoint-0 check.coverage_census.rs: distinct vectors, alias groups and tie mass.crates/uor-r4-core/src/zeta_zeros.rs: the 512 pinned zero ordinates.- Pre-registration:
m1-prime-zeta-complex-routing-2026-10-14.md.
Related mechanisms
address-cells: builds on this table and uses it as the fallback for words with no placed predecessor. discrete-learning: loads this table as its starting codebook. admission: its gates exist because spreading over 256 cells starves the reader. spiralcore-fbs: supplies the E8 orbit roots. route-read, flock-read and relation-read: the reads that consume these addresses. exact-memory: also uses primes, as exact keys rather than phase sources. hopf-observation: shares the unit-quaternion helpers. tokenizer: fixes the vocabulary size \(V\).
Address-structured cells
Status: ACTIVE. This is the starting table of the live attention line. At zero training it lifted the number of next-word targets the reader can reach from 127 to 1,351 of 3,847. Training then eroded that gain, and the first learning run stopped at its first checkpoint. No paired verdict exists, and the admission-preserving controller built to fix the erosion has not yet run on a GPU (A8 dose, pre-flight).
Labels used below: proof means derived from definitions or code, measurement means a recorded run, hypothesis means an untested idea (see the charter, section 4.6). Unfamiliar project terms (K16, A8, admission, NOT_RUN) are in the glossary.
In plain words
Picture a 16 by 16 board of 256 cells. Each of the 4,096 words gets a home cell, and every cell holds 16 words. The trick is where words go. A word is placed next to the cells of the words that usually come just before it in the training text. Only about 1,350 words are placed this way; the other 2,749 of 4,096 have no placed predecessor and are placed by the prime-zeta fallback (rule 4 below). When the model has just read a word, the reader looks only at a few nearby cells. If likely next words live in those cells, the right answer is at least in view. This is a table made before training, and it changes nothing about how the reader works. It only decides what the reader can see.
What it replaces in a transformer
The token embedding table, in the part of its job that decides which tokens the next-word step can consider. A transformer's output step scores every word in the vocabulary. This model scores only the words in the cells it opens (admission), so where each word lives limits what can be chosen.
The same board with three placements. With the address-structured table the likely next words sit near the last word's cell, so more of them fall inside the eight opened cells.
How it works
Cells. A word's writer cell is the pair (root of block 0, root of the last block) on a 16-root E8 orbit, the same \(16\times16=256\) grid as the prime-zeta codebook. All 4,096 full vectors stay distinct.
What the reader can see (Definition). The reader admits the \(K=8\) occupied cells nearest its output \(q\), by L1 distance on those two root blocks, and can rank only the words inside them. Placement therefore decides visibility.
Building the table (Definition). This is host data preparation from the training split only.
- Count integer bigrams \(s\to t\) at the positions where the model must answer, with \(s\) the last context word.
- Take words by falling frequency (ties to the lower id).
- Put each word in the cell \(c\) that minimises \[\sum_{s\ \text{placed}} \mathrm{count}(s\to t)\; L_1\big(\mathrm{cell}(s),\,c\big)\] subject to a quota of 16 words per cell.
- A word with no placed predecessor goes to its prime-zeta cell if free, else the nearest cell with room. Inner blocks get distinct root pairs by rank in the cell.
- A recount requires 4,096 distinct vectors with every cell at quota.
The control. The shuffled table (S8) runs the same greedy search with predecessor identities relabelled by a seeded permutation. It keeps frequency, quota and total mass but destroys the relation, so it separates "words placed near their predecessors" from "words packed neatly".
A stated gap (proof, by reading the construction). The reader's real centre is the last word plus the consensus of the context read, not the last word's cell alone. Placement only partly predicts admission for that reason. The gap was reported, not tuned away.
Rule check. The construction is integer counting and integer L1 sums, with no floating point, so there is no export gap. No softmax, no squashing, no matrix multiplication (D23, D30). Host work is data preparation only; no model quantity is computed there (D24).
What has been tried
Every number in the last four rows is a count of reachable target words on the development panel. None is an accuracy, loss or reply quality.
| Date | What was run | Result | Verdict | Record |
|---|---|---|---|---|
| 14 Oct | Pilot on the random start (16 distinct vectors), 1,640 batches | Top-8 hits rose (173 to 1,169 of 14,287) but reachable targets fell (5,680 to 2,180) and total loss rose | inconclusive | pilot, diagnosis |
| 18 Oct | First relation-versus-control dose on the 16-vector start | Both arms hit the admission-collapse gate at 4,096 batches (2,034 to 225 and 205). Registered stop, not a negative | diagnostic stop | Q1 diagnosis |
| 19 Oct | Two objectives (an address margin, K16-A, and an occupied-cell hinge, K16-R), 2 seeds, 16,404 batches | K16-R passed admission only by collapsing to about 20 cells. K16-A missed the gate. No keep | negative, for those objectives | outcome call |
| 19 Oct | Prime-zeta table at K=8, zero updates | 127 of 3,847 reachable against a gate of 500; full panel 427 of 14,287 | diagnostic stop | pre-flight |
| 19 Oct | Host export of the address-structured and shuffled tables, rebuilt by a Rust binary and an independent Python verifier | Both injective, 256 cells at quota 16. Mean training-predecessor L1 per target: 9.22 (address-structured), 12.32 (shuffled), 13.96 (prime-zeta) | positive | codebook, verifier |
| 19 Oct | Five-arm zero-update pre-flight on one GPU, bars fixed beforehand | Reachable of 3,847: address-structured 1,351; K=16 version 2,178; shuffled 476; prime-zeta 127; K=16 prime-zeta 246. Paired against prime-zeta: 1,302 rows gained, 78 lost (net 1,224 against a floor of 74.3). Paired against shuffled: net 875 against 81.0. Cost about $0.17 | positive for the reach gates; the comparison against an unpinned initializer was NOT_RUN (post-merge correction) | pre-flight |
| 19 Oct | Learned-attention dose, relation read against a frozen-zero control, seed 1, K=8, 16,404 batches planned | Relation fell to 551 at the first checkpoint and stopped (threshold 675.5). Control fell to 857, ending at 797. Relation accepted 87 relation trits (its three-valued link dials). Cost about $1.9. No paired verdict; fresh slice sealed | diagnostic stop | A8 dose, status |
| 19 Oct | Admission-preserving controller: reject any interval that drops reachability below an anchor of 3,847 training rows (margin 24, floor 500) | Source merged, 198 host tests pass. Real GPU build, qualification, timing and speed-up NOT_RUN | blocked | controller, source record |
Reading these honestly. Placement works at zero training: it moved reachability ten-fold at the same \(K\) and the same board, and the shuffled control shows the predecessor relation, not neat packing, explains most of it. That is evidence the reader can now see its targets, not that it can learn to pick them. The dose then lost reachability in both arms (control down 37%, relation down 59%), consistent with accepted learning moves carrying words out of their placed cells. That is co-occurrence, not attribution. The earlier failures all ran on a start with 16 distinct vectors, so they close that start, not attention. The record's own risk section predicted the erosion and called it a diagnostic stop.
What has never been tested
- Whether the reader can learn on a well-placed table at all. No run has produced a paired development verdict.
- Any accuracy, ranking, bits-per-byte or reply quality for this table.
- Placement that also uses successor edges. Version 1 lets only already-placed predecessors pull a word.
- Placement keyed on the real read centre instead of the last word's cell.
- The compact 32-cell form, \(K\approx34\) or more, and partly injective tables.
- More than one shuffle seed, and training from the K=16 bracket arms.
- The admission-preserving rule in a real GPU run, and a finer, cell-level census of which moves eject which words.
- Other shapes, such as 16,384 words on 512 cells (planned after the dose).
What comes next
The mechanism is ACTIVE, so this is a plan, not a reopening. First comes the GPU qualification of the merged controller, then the admission-preserving rerun of the learned dose. Two risks are on the record. The rule could turn into a no-op if it rejects more than half the intervals, or three full intervals in a row. And \(K=8\) may be too small as occupancy grows. A relation arm must also beat the successor-table comparator (top-1 on 6,300 of 14,287 development rows) to count as learning.
Also known as
A8 (address_structured_v1); S8 (the shuffled control); P8, P16 and A16 (uniform and K=16 bracket arms); injective codebook initialisation; 256 by 16 cells; predecessor-structured placement. Not to be confused with the October 4 "observable geometric observation cells", which are a different, older mechanism that shares the word "cells".
Code
address_cells.rs: bigram counts, the greedy build with quota and recount, the shuffled control.address-cells-codebook.rs: the exporter. It reads the training split only and never the development panel.attention_preflight.rs: the zero-update battery.attention_learning.rs: the relation-versus-frozen-zero dose with its first-checkpoint stop rule.attention_anchor.rsandattention_audited.rs: the admission-preserving controller.coverage_census.rs: alias ceiling, tie mass and crowding.- Pre-registered sheets: pre-flight and training dose.
Related mechanisms
prime-zeta-codebook: parent and baseline; its cell is the fallback. admission: defines the gates that decide whether this table is any use. relation-read: the arm the dose was meant to test. flock-read: its consensus shifts the read centre away from the last word's cell. route-read: the read used in the two-objective redirect. rank-margin: the occupied-cell hinge that collapsed occupancy, the failure this table avoids by fixing the table instead of the objective. discrete-learning: the shared writer whose accepted moves erode the placement. spiralcore-fbs: source of the E8 orbit roots.
Vector-symbolic binding (hypervector codes)
Status: PARKED. Trained into the older prose learner, the idea lowered held-out bits per byte by 0.014 to 0.023 on 2 seeds and 2 slices. But that run used a CPU learner (the record says it belonged on the laptop; since 12 October the owner rule D24 bars CPU model compute), and the variants that tried to add geometry failed. The idea is not on the current discrete path. It stays open: what would reopen it is listed below (native test).
Labels used below: proof means derived from definitions or code, measurement means a recorded run, hypothesis means an untested idea (see the charter, section 4.6). Unfamiliar project terms (K16, A8, admission, NOT_RUN) are in the glossary.
In plain words
Give every word a long string of 4,096 bits. To glue two things together, such as a role and a word, flip the bits of one wherever the other has a one (XOR). Applying the same glue again undoes it. To merge many strings into one summary, take a majority vote at each position. To tell whether two strings are alike, count how many positions differ. In the older prose model this gave the next-word score a cheap cue: "was this word recently in the context?" It is a lossy sketch. Exact copies still need an exact lookup.
What it replaces in a transformer
Part of the key-value memory: the cue that says whether something stored earlier matches the current query. A transformer compares a query against every stored key with dot products. A hypervector sketch compares bit strings by counting differences, using only XOR and bit counts.
Bind, bundle and probe on bit strips, and three ways to choose each word's code. Only the random-hash codes helped.
How it works
A hypervector has \(D=4096\) bits.
- Bind (Definition). Bitwise XOR. It is its own inverse: \((A\oplus B)\oplus B=A\). That follows from the definition of XOR (proof).
- Order (Definition). A cyclic bit rotation marks position.
- Bundle (Definition). A bitwise majority vote over a context window of up to 64 terms, with a fixed tie-breaker.
- Similarity (Definition). Hamming distance \(d_H\) from a bit count, turned into a bipolar correlation \(1-2d_H/D\) in Q1.15 fixed point.
Cross-talk (standard estimate, proof for random codes). Unbinding a bundle of \(k\) random bipolar terms returns the stored value plus noise with standard deviation about \(\sqrt{(k-1)/D}\). So 64 terms in 4,096 bits leave a signal-to-noise ratio near \(\sqrt{4096/63}\approx 8\). This is the textbook figure for random codes, not a measurement on this model.
How the older prose scorer used it. One additive feature per candidate word: \[\text{score}\mathrel{+}=\big(\text{vsa\_scale\_q15}\cdot \mathrm{corr}(\text{context vector},\ \mathrm{code}(\text{candidate}))\big)\gg 16 .\] The context vector bundles an associative transition context and up to four "orthogonal VSA attention" heads. The scale is trained. The codes are not.
Three ways to choose a word's code.
| Mode | Code | Distinct codes |
|---|---|---|
| 0, fixed hash | A hash of the seed and the word id. Distances are about \(D/2\), so only identity carries signal | 4,096 |
| 1, root | A hash of the word's icosian root (a point from a 120-element rotation group) | at most 120 |
| 2, learned | The root code XOR a hash of a 5-dimensional readout, rebuilt every 1,000 steps | 4,096 |
Rule check. The bit operations contain no softmax and no matrix multiplication. The Q15 scale multiply is a runtime product that has not been shown to be table-only, so it is not audited against the zero-multiplier serving rule (D11). The host learner that trained the scale was not audited against D23 here. The 9 October run used a CPU learner (the record says it was meant to run on the laptop, owner rule #2095). D24, dated 12 October, now bars CPU model compute. Binary 4,096-bit codes are not part of the current discrete path (D32). D32 welcomes XOR and Hamming comparison on ternary and E8 labels as one component of a model, not as a Hamming-only model.
What has been tried
| Date | What was run | Result | Verdict | Record |
|---|---|---|---|---|
| Jun–Jul 2026 | First hypervector algebra beside the prime router (UOR-Foundation/uor-r4#9) | Folded into the graph-compiler plan; no model quality recorded | inconclusive | #9 issue record |
| 7 Aug | Router geometry switch, spectral against VSA, 500 probes (#434) | VSA scored 0.0000 MRR against 0.7179. A later correction (#493) found the cause: the scorer compared a 1,024-dimension hypervector with a 512-dimension content vector, so every score was exactly 0. Re-grounding both sides gave non-zero scores but still chance ranking, because that router's hypervector is a hash of the text, not a semantic encoder | diagnostic stop | record, with its corrections |
| 8 Aug | Re-measure of three retrieval negatives (#500) | Three negatives were one dead-cosine artifact (MRR 0.7179 to 0.8542 with a content query). No record shows the VSA arm rerun after the fix | diagnostic stop | record |
| 19 Sep | VSA codebook tied to learned roots for shortlist routing | Recall 8.4–8.8% to 10.7–11.2%; shortlist bits per byte down 0.045 to 0.053, on two disjoint slices | positive | handoff |
| 19–28 Sep | Falsification ablation of the September prose model | VSA attention inert (flips 0.7% of decisions; about 0.0013 bits per byte, within noise). Decision D2 rules this a wiring defect, not a retirement | inconclusive | toolbox |
| 8 Oct | Swap codes in a frozen artifact, then set the scale to 0 (#820) | Change of only −0.0010 to −0.0020 bits per byte. Valid null for "swap codes into a frozen model": nothing had adapted to them | inconclusive | review |
| 9 Oct | Retrain with fixed hash codes against VSA off; 2 seeds, 2 held-out slices, 6,795,016 tokens per run, CPU learner | Keep. Held-out bits per byte improved in all four seed-and-slice pairs, by 0.0144 to 0.0226 (for example 1.8366 against 1.8574). Each in-model ablation interval excludes zero | positive | native test |
| 9 Oct | Same run with root codes (mode 1) | No gain: +0.0003 and +0.0001 (seed 1), −0.0053 and −0.0054 (seed 2) | negative | same record |
| 9 Oct | Mode 2, root code plus readout residual | Worse than fixed codes in all four cells, by +0.013 to +0.028. Its own VSA term slightly harmful. Moving-codes hypothesis untested | negative | same record |
| 9 Oct | Check of a draft octonion signed-multiplication table for signed binding | Draft table breaks alternativity: \(x(xy)=-2e_4+2e_7\) but \((xx)y=-2e_4\) for \(x=e_1+e_2\), \(y=e_4\). Rejected | negative | review |
Reading these honestly. The one clear gain is real but narrow. The two seeds differ by about 0.015 bits per byte, the same size as the effect, and the cross-arm comparison is a point estimate because the logs did not keep per-position losses. The same model's exact-memory table (the engram) is worth about 0.19 to 0.20 bits per byte, over ten times what VSA adds, so VSA may be duplicating evidence the copy and route heads already supply. The failures close configurations: a wiring and scoring fault, a frozen-artifact swap, codes with only 120 values, and a codebook rebuilt while the heads trained. D22 applies: these close configurations, not the mechanism.
What has never been tested
- Mode 2 with its codebook frozen after a warm-up. This is the one follow-up the 9 October result justifies.
- A scale sweep on a frozen artifact, and VSA with the exact copy head switched off.
- Role-times-filler binding for relation reads on held-out phrasing, against an equal-bit ordinary codebook.
- Octonion-signed binding against plain XOR at equal cost, using the canonical Fano table.
- Any hypervector binding on the discrete path (GPU, integer writer, ternary or E8 Hamming comparison).
- More than two seeds, more than 6.8 million training tokens, or chat data in place of TinyStories.
- Spectral against VSA retrieval after the dimension and hash-placeholder faults are fixed.
- Whether a 64-term bundle in 4,096 bits carries order and bindings or only membership (hypothesis).
What would reopen it
- A lawful retraining of the fixed-code term, either as an offline float learner under D37 with a fresh
TEST FITNESS: FITreview and a D11 integer export gap, or as a Hamming binding on the discrete writer, with owner release where a hold applies. - The freeze-after-warm-up test for mode 2, to settle the moving-codes hypothesis.
- A redundancy test with the exact copy head switched off, plus a scale sweep (0, 250, 500, 1000, 2000, 4000), so a null cannot be blamed on a tiny scale or on duplicated evidence.
- A role-times-filler test on held-out phrasing against an equal-bit ordinary codebook, reporting the share of decisions that flip, with exact word and occurrence identity kept apart from the sketch.
- An equal-cost test of octonion-signed against plain XOR on order-sensitive relations, using the canonical Fano table and not the rejected draft.
Also known as
VSA; hyperdimensional computing (HDC); binary spatter code; Hypervector4096; HRR-style associative transition context; the vsa_scale_q15 term and set-vsa-code-mode; octonion-signed binding (a design only).
Code
native_geometric/vsa/hypervector.rs: XOR bind, rotation, majority bundle, bit-count Hamming, Q1.15 score. Siblings:codebook.rs,context_engine.rs,attention.rs,hierarchical.rs.learner/vsa_codes.rs: the three code modes.jepa_trainer.rsholds the trained scale.bin/ablate-prose.rs: the held-out scorer with VSA ablations.set-vsa-code-mode.rs: the load-time code swap.semantic/vsa.rs: the router geometry and facet stores.tests/vsa_conformance.rs: algebra conformance tests.spiralcore_operator.rs: the canonical Fano table, the control for any octonion-signed binding.
Related mechanisms
ternary-xor: the same XOR and Hamming arithmetic; a discrete VSA would live there. exact-memory: the intended partner, where sketches propose and exact references decide. spin-weights: mode 1 took codes from icosian roots. read-binding: another route to a read that binds the right value. flock-read: its Hamming distance on coordinates is the discrete cousin. hopf-observation: another lossy summary kept beside exact identity. spiralcore-fbs: supplies the Fano table.
Hopf observation with a kept fibre
Status: PARKED. The map and the kept-fibre bookkeeping are built and unit-tested, but they run only as telemetry in the integer runtime, and the test that matters for language (does keeping the lost angle help?) has never been run. The forms that were tried for prediction failed or used banned parts: sector routing, softmax attention, and a curved-space read that came out neutral (mechanism census).
Labels used below: proof means derived from definitions or code, measurement means a recorded run, hypothesis means an untested idea (see the charter, section 4.6). Unfamiliar project terms (K16, A8, admission, NOT_RUN) are in the glossary.
In plain words
A rotation state in this model is a point on a four-dimensional sphere. The Hopf map looks at that point through a three-dimensional shadow. The shadow forgets one angle, so many different states cast the same shadow. This mechanism keeps the forgotten angle in a separate slot, so nothing is lost, and uses it to track drifting phase and to sort states into routing bins. A related idea, the Lorentz read, scores a match by distance in a curved, tree-friendly space instead of by a dot product. Neither has been shown to help a language model.
What it replaces in a transformer
Attention scoring: the rule that decides how well a query matches a stored key. A transformer uses a dot product. The Lorentz read replaces it with a curved-space distance, and the Hopf bins were meant to route a query to a small group of keys before scoring.
What the shadow forgets, and what the old routing did with it. Moving the point around the fibre changes nothing in the shadow; the kept phase records it.
How it works
The map (Definition). Write a unit quaternion as \(q=(a,b,c,d)\) with \(z_1=a+ib\) and \(z_2=c+id\). The Hopf map to the 2-sphere is \[h(q)=\big(2(ac+bd),\ 2(bc-ad),\ a^2+b^2-c^2-d^2\big)=\big(2\,\mathrm{Re}(z_1\bar z_2),\ 2\,\mathrm{Im}(z_1\bar z_2),\ |z_1|^2-|z_2|^2\big).\]
Two facts (proof, by expanding the squares). First, \(|h(q)|^2=(a^2+b^2+c^2+d^2)^2=1\), so \(h\) lands on the unit sphere. Second, multiplying both \(z_1\) and \(z_2\) by the same phase \(e^{i\varphi}\) leaves \(z_1\bar z_2\) and both moduli unchanged. That phase moves \(q\) around a circle (the fibre) while \(h(q)\) stays put. So the shadow alone cannot be inverted. Rebuilding \(q\) needs the base point, the fibre phase and a chart convention, because there is no global identification \(S^3=S^2\times S^1\).
Kept fibre (Definition). Holonomy tracking accumulates the wrapped change in fibre phase, plus the Fubini-Study distance, along a trajectory of states. In the integer runtime these are recorded per session and are marked telemetry only: they do not change any output.
Sector routing (Definition). Three Hopf coordinates are binned \(8\times8\times8=512\) ways. When the inputs are non-negative at most 64 sectors are reachable, a fact of the binning (proof).
Lorentz read (Definition). Lift query \(q\) and key \(k\) to the hyperboloid, \(q_0=\sqrt{1+|q|^2}\) and \(k_0=\sqrt{1+|k|^2}\), and set \(z=q_0k_0-q\cdot k\). The score is \(\beta\,(\delta-\operatorname{arccosh} z)\), with a learned radius \(\delta\) and scale \(\beta\).
Icosian shadows (from enumeration). The 120 icosians map onto 30 points of the 2-sphere, every fibre of size 4 (checked by finite enumeration in the geometry chapter).
Rule check.
- D11: not yet. The integer helpers use multiplication and division, the core helpers decode to
f64, and the integer runtime refuses Lorentz models until an integer arccosh table exists. - D23: the map has no softmax. Every Lorentz read and attention that was actually run normalised scores with softmax, which is excluded.
- D30: the map is a few products, not a matrix multiplication. The float Lorentz stacks used dense query and key projections, which are barred.
- D32/D37: the float Hopf helpers (sine, cosine, square root) fall outside the zeta-zero exception. Under D37 a float version could be re-registered with a fresh review. The current discrete Route, Flock and Relation reads use no Hopf quantity (the geometry chapter).
What has been tried
| Date | What was run | Result | Verdict | Record |
|---|---|---|---|---|
| 28 Jul | Ancestor router: angular state as a context carrier | Angular routing and decodability only, not generation; not reproduced under today's gates | inconclusive | evidence note |
| 31 Jul | Sector routing on held-out decisions, 1,500 decisions (#303) | 7 of 512 sectors occupied (1.4%); at most 64 reachable | negative | occupancy |
| 31 Jul | Same protocol with a fixed signed projection (#306) | 43 of 512 sectors (8.4%); retrieval quality left unmeasured | inconclusive | remediation |
| Aug | Hopf signed projection as a retrieval filter (#430) | Occupancy spread, no retrieval value: MRR 0.0045 against 0.0743 | negative | #430 issue record |
| 27–28 Aug | Recursive attention with an additive summary (#952), then equal-budget direct H4 attention (#973) | The summary erased earlier order. Full H4 got 3/12 while plain fixed tangent got 12/12, so geometry was not load-bearing. Both records say Hopf is not refuted | negative | A1.0, V3 |
| undated | Paired-H4 heatmap readout (#970) | Heatmap classes aliased incompatible outcomes; gate stopped the run | negative | record |
| undated | Softmax decoder through R4 frames, then learned Lorentz attention in SmolLM2 (HELM-D) | Parity passes. Lorentz scored NLL 7.71 against donor 3.668 and Euclidean 4.483 | negative | parity, localization |
| 19 Sep | Zero the per-token 5-dimensional readout of the September prose model | +0.3377 bits per byte when removed (baseline 1.8055). Effects do not simply add; no pairwise factorial was run | positive | evidence |
| 26 Sep | Hyperbolic keys on real code-scope hierarchies | 77.5% of non-root queries at 16 dimensions against 0.4% for dot product; 36-bit keys kept 87% of accuracy; −0.020 bits per byte on code, −0.005 on prose | positive | cycle 2 |
| 26 Sep | Lorentz read in the Rust learner, 4 seeds, 2,000 updates | Ahead of dot in 3 of 4 seeds, mean 0.018 nats (0.007 bits per byte), below the 0.03 bar; the 600-step pilot overstated it | positive, small | cycle 3 |
| 27–28 Sep | Radial adaptation from a negative parent; Lorentz in the 7M-parameter stack | Neither radial arm beat dot. Lorentz minus dot −0.0001 | negative, neutral | radial, toolbox |
| 5–6 Oct | Generator selector arms (#1782), scored against a MiniLM teacher selector (a neural comparator; inactive evidence) | Hopf arm H 49.7%, flat arm S 50.8%, Hopf with the fibre kept (H_F) 50.8%: keeping the fibre recovered the 1.1-point gap (n=376, not powered). The lexical baseline got 55.3% and any selector was capped at 77.9% by the clause segmentation, so Phase 0 was dropped on other grounds | inconclusive | #1782 record |
| 12 Oct | Lorentz against its flat L2 ablation, 3 seeds | Ahead on every seed, but only one met the per-seed margin: wrong-value 49 to 32 of 120 | inconclusive | geometric read |
| 11 Oct | Fixed circle phases for read binding, 2 seeds | Same bound mass as learned supervision, worse answers, 13 times slower | negative | phase binding |
Reading these honestly. Only the occupancy rows test the Hopf map itself, and they tested one projection of one state. The attention failures were an additive summary, a heatmap readout, and softmax constructions; their records say Hopf and H4 are not refuted. The Lorentz read was neutral at best, and it was never run without softmax and dense projections. The strong hyperbolic result (77.5% against 0.4%) was about keys that index a hierarchy, not about scoring a read. The audit suggests splitting this page in two: the kept-fibre map is nearer READY than PARKED, while sector routing and the Lorentz read are the parked forms. The status is left unchanged here. D22 applies: these close configurations, not the mechanism.
What has never been tested
- Kept fibre for language: never tested in a language model (the one kept-fibre datum is the small selector comparison above). Base only against base plus fibre against explicit bank tags, at equal bytes.
- Any Hopf quantity inside the discrete reads (Route, Flock, Relation).
- The S7 quaternionic Hopf relation state. No implementation exists.
- A pairwise factorial separating the Hopf shadow channel from the predictor weights it interacts with (JEPA).
- A third paired seed for Lorentz against dot, and a Lorentz-scored pointer.
- A Lorentz read without softmax or dense matrices. Every executed form used both.
- Hopf holonomy as a dialogue-state feature that changes output. The integer tests assert nonzero winding, not usefulness.
What would reopen it
- A retained-fibre test: base only against base plus fibre against explicit bank tags, at equal retained bytes, with fibre removal or permutation, a common action, one endpoint changed against both, and exact occurrence identity kept outside the lossy summary.
- An integer, multiplier-free Hopf map wired into a consumer on the discrete path.
- A Lorentz read re-registered as an offline D37 float sheet with a fresh review, a read that avoids softmax and dense matrices, a third paired seed and a D11 export gap (an integer arccosh table does not exist yet).
- The reduced finite S7 construction, only after a witnessed information or cost need.
- Hierarchy-heavy tasks where hyperbolic keys already showed a large gap, put on an equal-capacity, softmax-free harness.
Also known as
Hopf map \(S^3\to S^2\); retained fibre; holonomy tracking; UnitS3Q30::hopf and hopf_fiber_project; Fubini-Study trajectory; Hopf sector routing (512 sectors); Lorentz or hyperbolic read; LorentzAffine; HELM-D R4 Lorentz attention; S7 quaternionic Hopf relation state (conditional, never built).
Code
native_geometric/hopf_metric.rs: the map, fibre point, Q30 versions and holonomy tracking.prime_route_attention.rs:UnitS3Q30::hopf,rotate_common_fiber,SpinTorsionState.uor-r4-integer/src/math.rsandmodel.rs: integer helpers, and the telemetry-only per-session state.uor-r4-router/tests/hopf_sector_occupancy.rs: the occupancy measurement.uor-r4-training/src/joint_model.rs: the Lorentz read score in the float stacks.helm_d_r4_attention.rs: the HELM-D constructions (softmax, now excluded).- Existing static art:
docs/figures/geometry/hopf-fibration.svg.
Related mechanisms
prime-zeta-codebook: shares the unit-quaternion helpers; the table uses points on the 3-sphere but not the Hopf map. spin-weights: acts with the same quaternions and icosian roots. spiralcore-fbs: both treat E8 and H4. vsa: another lossy sketch kept beside exact identity. route-read: hyperbolic keys were pitched as an address geometry. flock-read: ranks by frame proximity, a discrete cousin of a neighbourhood score. read-binding: phase binding and the Lorentz-against-L2 read both sat on it. exact-memory: exact occurrence identity must stay outside any Hopf summary.
Tokenizer
Status: ACTIVE. Every current corpus, driver, test panel and trained artifact is bound to one pinned tokenizer with 4,096 pieces (identity d36d3e87). A Rust trainer for a 16,384-piece tokenizer landed on 19 October as tooling only. No model has been trained or scored on any other tokenizer (trainer record, donor-corpus sheet).
Labels used below: proof means derived from definitions or code, measurement means a recorded run, hypothesis means an untested idea (see the charter, section 4.6). Unfamiliar project terms (K16, A8, admission, NOT_RUN) are in the glossary.
In plain words
The model never sees letters. It sees numbered pieces of text, and this component cuts text into those pieces and turns pieces back into text. It starts from raw bytes, so any text can be encoded. Then it learns which neighbouring pairs of pieces occur most often and glues them into bigger pieces, so common words become one piece and rare words stay in several. The project's pinned tokenizer has 4,096 pieces. This is a standard technique, not a novel one. What is distinctive here is that the tokenizer's fingerprint is recorded in every file that depends on it.
What it replaces in a transformer
It fills the same slot as a transformer's tokenizer; it replaces no transformer part with a different mechanism. A transformer has a tokenizer too, usually byte-level BPE. This page is on the board because the tokenizer fixes the vocabulary size and id space that the prime-zeta codebook and the address-structured cells are sized by. It also pins the identity that makes results comparable.
Bytes become pieces by repeated merging, and the fingerprint of the merge table travels with every prepared file. A two-digit number is still two pieces.
How it works
Vocabulary layout (Definition). Ids 0, 1 and 2 are start, end and unknown. Ids 3 to 258 are the 256 single bytes. The rest are learned merges. For the pinned tokenizer that is \(3+256+3837=4096\).
Training (Definition). Count adjacent pairs over the unique pieces of text in the corpus (pre-tokens), each weighted by how often it occurs. Then repeat: merge the pair with the highest weighted count into a new piece, and recount only the words that contain it. Ties go to the pair with the smaller left, then right, token string, so the result is deterministic. Special tokens are atomic. No merge crosses a special token, a pre-token boundary or an input file.
Encoding (Definition). Apply the merges to a text's bytes in rank order. This is a table lookup with no learned arithmetic.
Identity (Definition). The tokenizer is stored as a tokenizer.json. Its raw-byte blake3 hash is the tokenizer's identity, and that hash is bound into every prepared corpus and artifact. A different tokenizer is therefore a different corpus.
Prepared corpora. The UORT v1 format is a 64-byte header followed by 16-bit token ids, with start markers and an optional binary response mask. Before reading a target, the discrete driver verifies the file hash, the token count and the tokenizer identity.
One dialogue encoding. A DialogueProtocol object fixes how roles and turns are written out, so training, test panels and chat use identical token segments. The need is real. Two branches once used incompatible serialisations, and even identical visible text can encode differently, because the merge rules may join a marker's trailing space to the first content token.
Numbers. In the pinned vocabulary no piece made only of digits has more than one digit: it has 10 pure single-digit pieces and 0 pure multi-digit pieces (measurement, below). Mixed pieces, such as a space plus a digit, were not ruled out. A separate numeral codec reads consecutive digit pieces left to right into one ordered value, so pieces 8, 4 give 84 and pieces 4, 8 give 48.
Rule check. Everything here is integer bookkeeping on the host and is not model compute. It involves no softmax or squashing (D23), no matrix multiplication (D30) and no float. The encode path was not itself put through the D11 instruction audit. It sits outside the served numerical kernels, and the integer runtime takes the tokenizer as an optional dependency for text sessions.
What has been tried
No experiment has varied the tokenizer. Every row below is side evidence about data preparation, indexing or diagnosis. The 16,384-piece row is tooling validation, not a model result.
| Date | What was run | Result | Verdict | Record |
|---|---|---|---|---|
| 26 Jul | TinyStories test of the first compiled pipeline against a teacher (#201) | Bad scores traced to token indexing in the observation extraction, not to the zero-multiply runtime. The runtime reproduced the reference once indexing was correct (kernel top-1 28.9%) | positive | issue archive |
| 3 Sep | Fixed text-to-clause segmentation adapter, controlled grammar, no fitting (#1094) | 1,600/1,600 valid rows exact; 22,400/22,400 roles consumed; limited to the controlled grammar | positive | comparison |
| 26 Sep | Review of two dialogue serialisations across branches | Incompatible; one DialogueProtocol contract written. No model run | inconclusive | contract |
| 8 Oct | 7.16M-parameter stack on chat data only against the sealed mixed-corpus model, one seed, 512 windows (#1894) | In-domain data was worth −0.1592 bits per byte (1.1199 to 0.9607). Going from 7M to 20M parameters was worth −0.0837 | positive | issue archive |
| 9 Oct | 2,860 documents pairing a demand with exactly the requested short answer, mixed into the chat corpus (#1958) | Short-answer form compliance appeared once demands were paired with matching short answers. A data-pairing effect, not a tokenizer effect | positive | issue archive |
| 9 Oct | Recount of sealed numeric-memory replies against the frozen vocabulary | Numeric rows failed 12/13 (92.3%) against word rows 18/27 (66.7%). 10 single-digit pieces, 0 multi-digit. Token count and digit confusion refuted as causes | positive | diagnosis |
| 9 Oct | Untrained probe: does a two-digit value keep its order as two pieces? | Yes. 5/5 numeral tests pass; 84 and 48 stay distinct. The failure is in the learned read and emit path, so a number-aware tokenizer was not shown to be needed | negative, for that hypothesis | probe, plan |
| 19 Oct | Deterministic Rust trainer for 16,384 pieces, checked against an independent exhaustive recount | An 8,192-document synthetic fixture attains exactly 16,384 pieces and round-trips unseen text; 40 deterministic corpora recount-match; two regressions found and fixed | positive, tooling only | trainer |
Reading these honestly. The numeric misses were measured on a pointer-copy float stack with no memory operator, so they speak about that learned read and the 4,096 vocabulary, not about byte-level BPE as a mechanism. The dialogue clash was a coordination defect, fixed by a shared protocol, not a tokenizer failure. The data-versus-size row is one seed and says little about vocabulary size.
What has never been tested
- Whether 16,384 pieces help or hurt the discrete model. No model has used any tokenizer other than the pinned one.
- A number-aware tokenizer (multi-digit pieces or a numeric slot), planned in the numeric-addressability plan but never built.
- Whether the tokenizer interacts with prime-zeta placement or cell coverage. The prime-zeta qualification used \(V=4096\) only.
- Fairness across scripts and languages. The training corpora are English chat and code.
- Reclaiming the three superscript-digit slots (idle vocabulary) for multi-digit pieces.
What comes next
The mechanism is ACTIVE, so this is a plan, not a reopening. The next step is a matched 4,096-against-16,384 comparison sheet. Open questions it should answer: does 16,384 improve the prime-zeta and address-cell numbers or just spread cells thinner (the planned shape uses 512 cells instead of 256), do digit-split numerals stay a barrier once the discrete read can address an exact value, and would training the tokenizer on the donor corpus make it a different corpus identity.
Also known as
BPE; byte-pair encoding; uor-r4-tokenizer; hf_bpe (its old name inside the core crate); the pinned tokenizer d36d3e87; train-bpe; the UORT prepared-corpus format; DialogueProtocol; data preparation.
Code
uor-r4-tokenizer/src/lib.rs: runtime byte-level BPE,tokenizer.jsonparser and the raw-byte identity.training.rs: the deterministic merge trainer (weighted pair counts, pair-to-word index, lazy heap).bin/train-bpe.rs: the host-only command, for vocabularies from 259 to 65,536.dialogue.rs: the shared dialogue encoding.tests/training.rs: checks against an independent recount.uor-r4-discrete/src/corpus.rs: the prepared-corpus loader that verifies hash, count and identity.native_geometric/numeral.rs: the numeral codec (older engine, outside the selected build).- Corpus preparation:
prepare-knowledge-corpus,prepare-chat-parquetandmix-chat-corpusincrates/uor-r4-training/src/bin/.
Related mechanisms
prime-zeta-codebook: maps each id to a prime and phase position; the tokenizer fixes \(V\). address-cells: the cell placement is sized by the vocabulary. discrete-learning: the driver verifies tokenizer identity on every corpus. native-geometric: the numeral codec and an older lexical codec sit on token ids. lut-serving: the served engine carries the tokenizer for text sessions.
Discrete geometric learning (exact-move counterfactual training)
Status: ACTIVE. It is the learning rule of the only live model path, crates/uor-r4-discrete. It has trained a short pilot, a full K=8 dose, the four K16 runs (runs with a shortlist of K=16 cells; see the glossary) and the Relation runs that stopped at the first checkpoint. None has shown a language gain or beaten its frozen control, and training stays held until the owner releases each run (K16 outcome).
Labels used below: proof means derived from definitions or code, measurement means a recorded run, hypothesis means an untested idea. See docs/formal_vocabulary.md.
In plain words
The model is a big table of small whole-number vectors, one per word, plus a few routing choices. To teach it, the machine picks one table entry and tries every allowed rotation of it, 16 options counting "leave it alone". For each option it replays a batch of training examples and counts the mistakes with whole-number arithmetic. It keeps the best option only if that is strictly better than leaving the entry alone. There are no gradients, no decimals and no matrix multiplication. Every step stays inside the values the finished model can hold. So far the method has moved some counts but has not produced better language.
What it replaces in a transformer
The optimiser. A transformer is trained by backpropagation: it computes a smooth slope for every weight and nudges all of them a little. Here nothing is smooth. Learning is a search over a short list of legal moves for one coordinate at a time, scored by a replay of real examples.
One learning step on one table entry: try all 16 legal states, pick the cheapest, commit only on strict improvement, then check the stored result.
How it works
State (definition). A shared integer codebook maps each of the \(V=4096\) tokens to \(B=4\) blocks of 8 integers. Each block is one of 16 roots of a single orbit of the E8 lattice (a fixed set of 16 integer vectors; not the full set of 240). The model also holds, for each routing stage, one of 64 signed-axis rotations of 8-dimensional space (the SpiralCore group), and optional gates that take the values \(-1\), \(0\) or \(+1\). Each of these is a coordinate: a vector block, a route frame or a gate.
Read and write (definition). A read turns the token window into an integer vector \(q\). A shared writer gives each token a cell from the root numbers of its first and last block (\(16\times16=256\) cells), keeps the \(K\) nearest occupied cells to \(q\) by L1 distance (admission), and picks the nearest token inside them. The same table encodes input, carries memory and ranks output.
Loss (definition). The loss is the integer rank-margin hinge. Per row, with \(T\) the token hinge and \(A\) the address hinge:
\[\ell = \frac{8\,T + w\,A}{8w},\qquad w = 8B = 32 \text{ in the lineage of record.}\]
Learning step (definition). For one coordinate \(\theta\) and a batch of rows \(\mathcal R\) whose eligibility is fixed by the baseline:
\[L(m)=\sum_{x\in\mathcal R}\ell\big(x;\ \theta\leftarrow m\big),\qquad m\in\{\mathrm{id},m_1,\dots,m_{15}\}.\]
The 15 non-identity moves are bivector rotations. The step picks \(m^*=\arg\min_m L(m)\). Ties go to the identity, then to the lowest resulting port number, then to the lowest enumeration index. It applies \(m^*\) only if \(L(m^*)<L(\mathrm{id})\), then re-validates the stored table on the GPU. Nothing is sampled, and no floating-point number appears anywhere in the step.
Consequence (proof, from the definition). Every committed move strictly lowers the loss on its own batch, and the new state is always a legal state. The pilot's receipt audit confirmed this on every accepted move (measurement, pilot record). The step says nothing about rows outside the batch. A move that helps its batch could push other targets out of the shortlist; that is a hypothesis consistent with the Q1 stops below, and causal attribution was not made.
Speed-ups. The row-parallel kernel (rows_v1) computes the baseline once per row and each candidate once per row and lane, instead of replaying every row serially per candidate. It reproduces the serial losses on every checked case (measurement: Route read 3.843 s to 0.0691 s per proposal, 55.6 times faster, 64 rows; Route-mode index coverage was widened after review). BVG-K (batched verified coordinates) scores up to 64 coordinates per launch and commits a block only if its joint loss beats the best single move.
Rule check. No softmax, exp, softplus, sigmoid or tanh (D23), and no matrix multiplication (D30): the choice is an integer minimum, distances are integer L1 and Hamming, and moves are table lookups. The snapshot is integer, but it has not been exported or audited against the D11 serving form, no serving engine for it exists and no export gap or tokens per second has been measured. D37 allows offline float training; that would need a separate scanned module and a reported export gap.
What has been tried
\(P_{succ}\) is the 3,847-row copy-successor sub-panel (see relation-read). "Q1" is the checkpoint at 4,096 batches. "Admitted" counts rows whose target cell is in the shortlist. A "construction control" tests that code does what it says; it is not a learning result.
| Date | What was run | Result | Verdict | Record |
|---|---|---|---|---|
| 2026-09-12 to 10-04 | Five earlier learners on the pre-discrete engine (one-use credit, tied sampler, native capture and route fits) | 0 of 8 replacements improved loss; complete construction 79 to 67; 244 to 83 of 256; about 15,650 to 15,700 coefficients moved and the parent kept | negative (older engine) | credit, tied, held credit, route fit |
| 2026-10-13 | 11 CUDA construction controls on the first discrete source; then 17 with the Flock read and gates added | All pass; a virtual improvement 640 to 544 is witnessed; no move applied | positive (construction only) | discrete learning, flock writer |
| 2026-10-14 | Pilot: seed 1, 1,640 batches, vector blocks only | Top-8 hits 173 to 1,169, top-1 17 to 82, yet loss rose 13,816,032 to 13,884,032; 236 accepted updates; below the count-table reference | inconclusive | pilot |
| 2026-10-14 | Diagnosis of the pilot | Start codebook has only 16 distinct vectors; admitted targets fell 5,680 to 2,180 while ranks inside the list improved | diagnostic stop | diagnosis |
| 2026-10-15 | Full 16,404-batch dose at \(K=8\), then widening \(K\) to 16 at evaluation | Admitted 1,920 at \(K=8\) and 2,400 at \(K=16\), against a gate of 4,894 | negative (evaluation-time widening only) | Stage A sweep |
| 2026-10-14 to 10-17 | Driver cost (25 controls), finite counterfactual controls, cost breakdown, GPU baseline reuse | 25 of 25 controls pass; one proposal 3.903 s against a 37.8 ms forward pass; repeated baseline work is 46.9 to 47.2% of lane cycles; baseline reuse matched on 32 pairs, timing not run | positive (construction) | driver cost, decomposition, reuse |
| 2026-10-18 | Row-parallel kernel against the serial one | Identical losses; Route 3.843 s to 0.0691 s (55.6 times), Relation gate 4.144 s to 0.0728 s (56.9 times) | positive | rows parity |
| 2026-10-18 | Relation run on the slow path, then on the fast path to Q1 | Slow path stopped by the owner at 904 and 1,065 batches. Fast path: \(P_{succ}\) admission 2,034 to 225 (Relation) and 205 (frozen control) of 3,847 | blocked, then diagnostic stop | strategic stop, Q1 diagnosis |
| 2026-10-19 | K16: two objectives, two seeds, 16,404 batches each | Occupancy collapse in one objective, admission loss in the other; no run reached the top-1 bar of 1,941 | negative (configuration) | K16 outcome |
| 2026-10-19 | A8 dose: address-structured cells, Relation against frozen control | \(P_{succ}\) 1,351 to 551 (Relation) and 857 (control) at Q1; control then finished 16,404 batches in 1,967 s (0.12 s per batch) | diagnostic stop | A8 dose |
| 2026-10-19 | Injective start and BVG-K block-apply qualifier | BVG-K block-apply qualifier passes on fixtures (259 ms at \(K=16\), about 8 times); the injective start fails its start check (127 of 3,847 against 500), so no run was sent | diagnostic stop | injective pre-flight, BVG-K scoring |
| 2026-10-19 | Admission-preserving controller (rejects any interval that shrinks admission) | Source and 198 host tests pass; real GPU qualification and any learning result not run | inconclusive | controller |
What the negatives do and do not say. Under D22 a negative closes one configuration, never the mechanism (D22). The pilot diagnosis found that a fixed 8-cell access budget reached fewer target cells (5,680 to 2,180) while the address hinge rose, and that per-move causal attribution was unobserved. Separately, it found a start with only 16 distinct vectors: a coupled-index initialisation defect, not an E8 capacity result. A later census found K16 training had broken much of that aliasing (ceiling about 9,000 rows) while top-1 stayed at 65 and 463, so aliasing does not explain the K16 ranking failure (K16 outcome). For the Q1 stops, the admission pathway is a source-linked hypothesis, not a causal attribution or a mechanism verdict: acceptance looks only at the batch's own loss, so an accepted move could eject targets from their cells (the A8 record states this as a risk before measurement, and the K16 outcome keeps ranking capacity, the read and the schedule open). The owner stopped Dose 1 on the slow path before Q1; that is not a result.
What has never been tested
- Route-frame and gate learning in the pilot (only vector blocks 0 to 1,639 moved).
- A collision-free start together with a wide enough shortlist (\(K\) of about 34 or more, or cells placed by address structure).
- The admission-preserving rule actually running on a GPU.
- Frequent-token revisits and a full corpus pass (one 16,404-coordinate pass uses 1,049,856 of 2,425,925 training targets).
- The BVG-K learning law as a training run, and Flock reads trained in at dose.
- All 240 E8 roots, the icosian and quaternion adapters, and \(\mathbb{Z}[\varphi]\) pairs.
- Any generated text, reply grade, bits per byte or tokens per second from a trained discrete model.
- An integer serving engine for the snapshot, and fresh-slice transfer for any run (the fresh slice is sealed and unopened).
- A float credit sheet on the same geometry (D37 allows it; none is registered).
Also known as
SpiralCore/FBS discrete learning; counterfactual-choose-apply-validate training; the D32 learning law; the rows_v1 row-parallel path; BVG-K; the discrete driver, Dose 1, Dose 2 and the rung-0 pilot and completion; Device::propose and apply.
Code
discrete.cu: forward pass, 16-lane counterfactual, choose, apply, validate, shared writer.device.rsandtraining.rs:propose,apply, the corpus driver and the training hold.rows_source.rsandbvgk_source.rs: row-parallel counterfactual and BVG-K.attention_audited.rs: the admission-preserving controller.spiralcore_operator.rs: the 64-element group.
Related mechanisms
rank-margin is the loss each step minimises. route-read, flock-read and relation-read supply frames and gates as coordinates. admission is the shortlist whose erosion drives most stops. prime-zeta-codebook and address-cells replace the 16-vector start. spiralcore-fbs supplies the group and tree. legal-construction is the older float attempt at the same goal. carrier-credit contributed the shared token table.
Rank-margin hinge objective
Status: ACTIVE. The integer form is the loss that the current discrete model trains on. A floating-point form is built and tested but has never been trained. The choice between the two integer objectives (objective A and objective R, described below) is open after the 19 October runs (K16 outcome).
Labels used below: proof means derived from definitions or code, measurement means a recorded run, hypothesis means an untested idea. See docs/formal_vocabulary.md.
In plain words
Most language models are scored by turning every possible next word into a probability and punishing surprise. Here the score is simpler. For each example, the right word has to beat its strongest wrong rivals by a fixed gap. If it does, the loss is zero and there is nothing to learn from that example. If it does not, the loss is the size of the shortfall. Every step is a comparison and a subtraction, with no probabilities and no logarithms.
What it replaces in a transformer
The loss function. A transformer minimises cross-entropy, which needs a softmax over the whole vocabulary. This objective compares the target with a few named rivals only.
Hinge loss on one example: only rivals that come within the margin of the target contribute, and their contribution is the length of the overshoot.
How it works
Float form (definition; training only, never trained). Take the raw scores \(z\) of the head. Fix a rival count \(k\) in advance (1 or 8 in the rung-0 sheet) and let \(\mathcal R_k\) be the \(k\) highest-scoring non-target entries.
\[L=\frac1k\sum_{j\in\mathcal R_k}\max\big(0,\ 1-z_t+z_j\big).\]
The margin is fixed at 1. A row that already leads every rival by 1 or more contributes exactly zero gradient, and nothing is exponentiated or normalised in either direction.
Integer form (definition; the live objective). The writer (discrete-learning) already ranks by integer distances, so the hinge works on those. With \(d\) the L1 token distance, \(\mathrm{addr}\) the address distance to a cell, and \(w=32\):
\[T=\max\big(0,\ w+d(\text{target})-d(\text{best rival token})\big),\qquad A=\max\big(0,\ 8+\mathrm{addr}(\text{target})-\mathrm{addr}(\text{best rival cell})\big),\]
\[\text{loss numerator}=8T+w\,A\qquad\text{over the common denominator }8w.\]
This is objective A. Objective R replaces \(A\) by a rank term. Let \(r\) be one plus the number of occupied cells that come before the target's cell in the order (address distance, cell number). Then
\[R=\max(0,\ r-K).\]
A crowded cell counts once, and \(R=0\) exactly when the target's cell is among the \(K\) kept cells (admission).
Rules of the comparison (definition). Which rows can count is fixed from the baseline. A missing comparison contributes zero, and the output reports how many rivals it had, so zero is never mistaken for learning. A batch with no eligible row is refused. Ties go to the smaller token or cell number.
Consequence (proof, from the definition). The weights 8 and \(w=32\) are powers of two, so the numerator needs only adds, compares and shifts. Because the loss is a weighted sum, its total and the visible ranks can disagree: the pilot's token term fell while its address term rose by more.
Rule check. Compliant with D23 by construction: no exp, log-sum-exp, softplus, sigmoid or tanh. The older pooled-rank run used softplus on a log-ratio and is not compliant. It is the historical precursor only. No matrix multiplication (D30). The integer form already fits the integer serving contract (D11). The float form's export gap has never been measured, and under D37 it returns only as a new pre-registration with a fresh test-fitness review and an owner release.
What has been tried
\(K\) is the number of kept cells. "Gate" is a pre-registered pass line. "Bar (i)" is a top-1 count of 1,941 and "Bar (ii)" a top-8 count of 4,775 on the 14,287-row development panel.
| Date | What was run | Result | Verdict | Record |
|---|---|---|---|---|
| 2026-09-20 | Learned reader trained on a margin (earlier, constructed panel) | Precision +0.0987 against a bar of 0.15 | negative (that recipe and panel) | reader result |
| 2026-09-24 | One learned score over admitted records, bounded margins, four arms | Complete correct answers 0 of 12 in every arm | negative (that panel) | A4 result |
| 2026-10-10 | Strongest-wrong-rival pooled ranking on the older learner | Development replies 177 to 437 of 512 with no losses, but fresh rows scored 0 of 128 and the loss used softplus and softmax weighting | positive on development, then rejected (rule break) | pooled rank |
| 2026-10-12 | Float hinge, 1 or 8 rivals, CPU and CUDA kernels | 938 library tests pass; CUDA parity 38 of 38; no training run | positive (construction only) | margin objective |
| 2026-10-13 | Float rung-0 path repair; float rung-0 pre-registration | 18 of 18 finite controls pass; the registered run never executed | positive, then blocked | complete path, sheet |
| 2026-10-13 | Integer hinge in the discrete writer | 11 of 11 CUDA controls, including omitted-target and zero-rival cases | positive (construction only) | discrete learning |
| 2026-10-14 | Decomposition of the pilot loss | Token hinge sum \(-7{,}996\) (\(\times8=-63{,}968\)); address hinge sum \(+4{,}124\) (\(\times32=+131{,}968\)); total \(+68{,}000\) while ranks improved | diagnostic stop | diagnosis |
| 2026-10-15 | Widen \(K\) from 8 to 16 at evaluation | Admitted 2,400 against a gate of 4,894; the record closes only eval-time widening of a K=8-trained codebook and names the objective weights (8 times token plus 32 times address) as an open successor lever | negative (evaluation-time widening) | Stage A sweep |
| 2026-10-16 | Fixture runner for the six rank-hinge controls | Restart 5 passed all six, then halted at a timing count of 99 against 100 | diagnostic stop | fixture runner |
| 2026-10-18 | K16 qualification: start check, six controls, timing | Controls 6 of 6; untrained \(K=16\) admits all 14,287 rows but only 16 cells are occupied; 260.08 and 260.10 ms per batch | positive (construction) | K16 qualification |
| 2026-10-19 | K16-A and K16-R, two seeds, 16,404 batches, Route read | R: admitted 12,089 and 12,466, but 20 and 19 occupied cells, top-1 101 and 230. A: admitted 2,237 and 3,167, 209 and 192 cells, top-1 65 and 463. Bars (i) and (ii) missed by all four runs | negative (configuration); no KEEP | K16 outcome |
Reading the K16 result. Objective R passes admission only because it herded the tokens into about 20 cells, so each row admitted about 3,400 of the 4,096 tokens. Objective A kept a healthy spread of cells but lost admission. Both runs used the 16-vector start. The result says nothing about hinge objectives that include an occupancy term.
What has never been tested
- The float hinge as a trained model. No run has ever executed it.
- Rival sets other than the top \(k\) by raw score (all rivals, random, hardest by margin), a margin other than 1, or a per-row adaptive margin.
- An occupancy-regularised rank objective, the registered next step after the K16 collapse.
- The hinge on a start with 4,096 distinct vectors, or combined with the admission-preserving acceptance rule.
- The hinge with a pointer head. The float sheet refuses a pointer today.
- Any bits-per-byte or likelihood measure. The hinge has no likelihood, so language quality under it has no agreed unit yet.
Also known as
Margin hinge over declared rivals; Objective::MarginHinge; 8*token_hinge + width*address_hinge; NearestAddressMarginV1 (objective A); OccupiedCellRankHingeV1 (objective R); the admission-rank objective; the D23 learning-law objective.
Code
discrete.cu: token margin, address margin, rank hinge R, loss terms and the overflow status.objective.rs: objectives A and R and their control scaffold.redirect_admission.rs: the K16 gates.geometric_stack.rsandcuda_stack.cu: the float form and its CUDA kernels (inactive).native_vector_writer.rs: the float shared writer with token and address margin credit.
Related mechanisms
discrete-learning runs the hinge as its integer loss and chooses the move. admission is the shortlist that objective R tries to protect. address-cells and prime-zeta-codebook change how many cells exist to rank. flock-read supplies the query vector being scored. carrier-credit used the same scoring head with omitted-target credit.
Protected legal construction
Status: PARKED. No legal move was ever scored on the real test panel. Every attempt either broke its own safety check after rounding or stopped on solver arithmetic. The line was archived by owner decision D21 and reopened by D22, and its goal now lives on in discrete learning (direct construction record).
Labels used below: proof means derived from definitions or code, measurement means a recorded run, hypothesis means an untested idea. See docs/formal_vocabulary.md.
In plain words
The usual way to train a model for a small device is to train with smooth decimals and round at the end. Rounding can quietly undo what was learned. This idea skips that. Each parameter change is chosen straight from the short list of values the final integer model can hold, so every accepted step is already in its servable form. A checker also guarantees that a set of answers the model already gets right stays right. Choosing all the changes at once is a large puzzle for a solver. The attempts that rounded a smooth step broke the safety check, and the attempts that solved the puzzle directly hit arithmetic trouble before producing a single move.
What it replaces in a transformer
The optimiser plus the rounding step that follows it: train in decimals, then quantise, then check by hand what broke.
Why rounding breaks protection: a step that passes every guard in smooth form can fail some of them once it lands on the legal grid.
How it works
Setting (definition). The older learner for milestone M2 (answering from memory; see the milestones) holds 1,920 coefficients as decimal masters, in two groups of 960 (called Prefix and Generate). They are served as quarter-step codes \(q/4\) with \(q\in\{-7,\dots,7\}\), which gives 15 legal destinations per coefficient.
Protected transaction (definition). A change \(\delta\) commits only if three things hold: the native scoring strictly lowers the pooled loss; 17 reference cases and 380 original winners still win; and the linearised guard test holds, \(J\delta\ge-10^{-10}\lVert\delta\rVert\). Here each row of \(J\) is the slope of one protected answer's margin.
Two ways to build \(\delta\) (definition).
- Residual feedback. Take a smooth, protected direction and round it onto the grid over 32 feedback rounds.
- Direct construction. Solve a mixed-integer program. For each coefficient with unrounded value \(m\) and current code \(q_0\), binaries \(l\) and \(r\) pick "keep", "go lower" or "go higher":
\[l+r\le1,\quad q\ge q_0+r-(q_0+7)\,l,\quad q\le q_0-l+(7-q_0)\,r,\quad \delta=\tfrac{q-q_0}{4}+(l+r)\Big(\tfrac{q_0}{4}-m\Big).\]
Minimise the original gradient \(g\cdot\delta\) subject to the 380 unit-normalised guard rows \(\hat J\delta\ge0\). That is 1,960 variables, 440 constraints and a 4,096-node branch-and-bound cap, run offline in a pure-Rust solver (microlp).
Numerical repair (definition). Replace the solver's fixed pivot threshold by a scale-aware one, \(\tau_j=32\,n\,u\,\max_i|a_{ij}|\) (with \(n\) the matrix size and \(u\) the unit round-off), and check the residual of every fresh factorisation.
Consequence (proof, from the definition). Any committed move is a legal code and, by the commit rule, strictly lowers the loss. Whether the guards also survive is not guaranteed when a smooth move is rounded afterwards. The rounding runs below measure that.
Rule check. Aligned with D11: every accepted step is already in the servable code set. The solver is offline float arithmetic and is not a serving part. The pooled-ranking loss behind the M2 learner used softmax and softplus forms that D23 bans, so a rerun needs a compliant objective. Not yet assessed against D30 (the guard test forms a 380-by-1,960 Jacobian product and the solver does dense LU), so a rerun would have to be classified or run on the GPU. The float solver was frozen by D32 and can return under D37 as an offline float sheet with a fresh review, an owner release, a separately scanned module and a reported export gap.
What has been tried
"Conditional" counts correct positions inside one fixed 15-position training episode. "8 of 512" is the accepted model's complete correct replies on the 512-row development panel, which none of these runs changed. All records are from 9 October 2026 unless stated.
| What was run | Result | Verdict | Record |
|---|---|---|---|
| Differentiable margin so protected answers contribute gradient | Arithmetic tests pass; no model benefit claimed; accepted model stays 8 of 512 | inconclusive | protected margin |
| Protected joint direction, rounded to the grid at four radii | The smooth direction passes protection; every rounded version violates it: 104, 170, 98 and 93 of 380 constraints at radii 1, 2, 4 and 7 | negative (that rounding rule) | joint construction |
| Attribution of those four failures | Rounding accounts for roughly 90 to 96% of the adverse pressure (analysis of saved arithmetic) | inconclusive | attribution |
| Discrete feedback, 32 rounds, 15 codes per coefficient | 28 distinct destinations, none eligible, 52 to 218 violated rows per round; no proposal or commit | negative (that constructor) | discrete feedback, attribution |
| Coordinated move along the full gradient at four radii | All four lower the combined loss; none passes the unchanged protections. Conditional 6 of 15 against 5 of 15 | negative | prefix vector |
| Full donor run and exporter fix, 1,920 coefficients | 956 changes accepted of 14,292 alternatives; conditional 9 of 15, as the older negative; not promoted | negative | full donor, export recovery |
| Mathematical bound on legal pair changes at the first error | The target's best case sits below the rival's worst case at all nine reference points, so pair-only changes cannot fix it | negative (pair-only, one frame) | pair-copy bound |
| Direct mixed-integer solve, both encodings | Both stop with a singular-matrix error before any proposal | blocked (tooling) | direct construction |
| Replay of the failing solver bases, then the scale-aware repair | A nonzero pivot just under the threshold, not an empty column; after the repair both captured bases solve accurately, but a later singular matrix returns no assignment (see note) | inconclusive | basis diagnosis, residual repair |
| 2026-10-10: full current-parent constructor on the 512-row objective | Interrupted after 102.9 minutes for a session transfer; no assignment; recorded as unfinished, not negative | blocked | D22 constructor |
| 2026-10-19: discrete analogue (block apply on fixtures) | All qualifier controls pass; a block commits only if its joint loss strictly beats the best single move; 3,419 fixture updates | positive (fixtures only) | C2 qualifier |
Note on the basis row. The failing pivot was about \(9\times10^{-11}\) against a threshold of \(10^{-10}\). After the repair the record counts 150 factorisations, 148 completed original-basis verifications and two later pivot rejections.
What the negatives say. The direct construction never produced a move, so the mechanism was never judged: a numerical blocker is not a negative (D22 section 1, full text). The rounding runs are negatives for those exact rounding rules and radii. The 9-of-15 runs moved only Prefix and Generate coefficients, with the other tables frozen. The pair bound covers pair-only changes at one frame.
What has never been tested
- Any legal displacement scored on the 512-row panel or the 128 fresh rows.
- The constructor in exact rational or \(\mathbb{Z}[\varphi]\)-integer arithmetic.
- A float-trained-then-quantised control at matched compute, over at least two seeds, on the same learner.
- A greedy legal coordinate search as a cheap baseline before the full solver.
- Splitting coefficients into groups to shrink the problem, or relaxing the 380 guards to penalties.
- Pair credit combined with a single-coefficient move at the same frame.
- Legal-by-construction moves with an admission-preserving acceptance rule on the discrete model.
What would reopen it
- Solve the saved hard instance (called
input245: 1,960 variables, 440 constraints, 15 legal destinations) in exact rational or \(\mathbb{Z}[\varphi]\)-integer arithmetic, or with a numerically robust solver, so the singular-pivot blocker is gone. - Score at least one legal displacement on the 512-row panel and the 128 fresh rows, over at least two seeds, against a float-trained-then-quantised control at matched compute (the control comes from the mechanism brief; the power rule is D22 section 3 and the reopen order is 5(a), full text).
- Run a greedy legal coordinate search first, as the cheap baseline.
- Or re-register the idea as an offline float sheet under D37: fresh test-fitness review, owner release of the M2 training hold, a separately scanned module and a reported export gap.
- Or carry the legal-by-construction idea on the discrete path, with the block-apply rule plus an admission-preserving acceptance rule, under its own review.
Also known as
Protected or discrete legal construction; direct joint legal-set construction; the protected Prefix/Generate transaction; quantised-form parameter moves; the exact legal-constructor solver (mixed-integer program); the D22 constructor.
Code
protected_legal_set.rs: the direct joint constructor.protected_joint_vector.rs,protected_credit_import.rs,gradient_vector_prefix.rs: the rounded-direction forms.- Unfinished full constructor and the pivot repair: inactive patches indexed in
archive/history/branch-archive/INDEX.md(d22-constructor-unfinished-20261010.patch,basis-residual-repair-20261009.patch). bvgk_source.rs: the discrete analogue, a block apply committed only if the joint loss beats the best single move.
Related mechanisms
discrete-learning reaches the same goal differently: every move is legal by construction. carrier-credit ran on the same learner and panels but changed where credit goes, not which moves are legal. rank-margin supplies the descent target in its integer form. spin-weights is the source of the quarter-step code set. ternary-xor is another multiplier-free weight alphabet with the same export question.
Live geometric carrier credit
Status: PARKED. The forms that were run either failed or broke a project rule. Three fixed-length runs fell from 437 of 512 correct replies on the development panel (a score that was itself recorded as panel fitting: 0 of 128 on fresh rows) to 0 of 512, the September pilots failed, and the sampled-choice credit used a softmax, which the rules ban (unified integration record). One part of the idea survives: a single shared token table, now live in discrete learning.
Labels used below: proof means derived from definitions or code, measurement means a recorded run, hypothesis means an untested idea. See docs/formal_vocabulary.md.
In plain words
When a model reads a memory and then writes an answer, the lesson from a mistake should reach the pieces that actually carried the information, not only the last few scoring numbers. This idea pushes the error signal back through those carriers: the geometric objects that hold the read, and the prototypes the answer is chosen from. A later version also ties input, memory and output to one shared table of vectors. The runs so far have not shown a benefit. The arm with carrier credit and the arms without it all lost every answer the starting model had right, so the runs cannot blame the credit rule or clear it.
What it replaces in a transformer
Backpropagation's job of blame assignment. In a transformer, the error flows back through every layer by the chain rule. Here the path is a chain of hard choices (which memory, which key, which answer) and geometric carriers, so the credit has to be designed rather than inherited.
Where the error signal lands: the frozen-carrier fit changes only the final coefficients, while the unified fit also moves the carriers and prototypes.
How it works
September form: cost-to-go credit (definition). The addressed-attention model samples four hard trajectories, each a chain of decisions (read, key, emit). The old estimator credited every parameter event with the loss of the whole trajectory. The new one credits an event with the cost that follows it, measured from its next cross-entropy boundary, minus a baseline taken from the other three trajectories. Schematically, for decision \(t\) of trajectory \(i\),
\[\hat g^{(i)}_t=\Big(G^{(i)}_t-\bar G^{(-i)}_t\Big)\,s^{(i)}_t,\qquad G^{(i)}_t=\sum_{u\ge t}c^{(i)}_u,\]
with \(c\) the per-boundary cost and \(s\) the recorded score of the parameter event (the exact normalisation is in the source).
October form: unified credit (definition). The saved native model (called saved437) scores relations between H4 elements (the 120 vertices of the 600-cell, a four-dimensional shape) and Generate prototypes. The unified fit computes independent conditional utilities over all 120 H4 elements. It restores the saved fractional masters, whose served form is quarter-step codes \(q/4\) with \(q\in\{-7,\dots,7\}\). It then fits the context carriers, the prototypes and the coefficients together on the pooled-ranking plus end-of-reply objective. A lane reads at most 120 encountered prototypes.
Whole-path design (hypothesis). Extend credit to compiler spans, exact store writes, E8 root choices and consumed donors through an explicit graph of hard decisions. Exact token, occurrence and version identity stay separate from the geometric summaries.
Shared writer (definition). One learned vector table encodes the input token, ranks the output and carries the compiler/store/emitter channel. Tokens get a product cell from the root numbers of their first and last 8-dimensional block, and a target omitted from the shortlist still receives score credit.
Rule check. The sampled-choice credit used by the whole-path producer uses softmax, so it is blocked by D23, and the pooled-ranking loss used softplus. The shared-writer margin form and the integer writer are compliant. No dense matrix multiplication is needed (D30): the finite factors use table reads and quarter-step sums, and 31 vendor-boundary controls passed for the writer. The served M2 form is already integer (D11), but the export gap of the unified form was never measured, and every position still scores all 4,096 answer choices, so per-token access is not sparse. D37 allows a float re-registration with a fresh review, an owner release, a scanned module and a reported export gap.
What has been tried
"Complete correct" means a reply that matches the reference in full on the 512-row development panel. CE is cross-entropy; rising CE is worse. "Conditional" counts correct positions in one 15-position episode. All records are archived.
| Date | What was run | Result | Verdict | Record |
|---|---|---|---|---|
| 2026-09-13 | Addressed attention, four trajectories, 64 updates, whole-trajectory credit | No useful generation; development exact answers 0 of 8; CE 5.5530 to 5.5516 | negative | pilot |
| 2026-09-13 | Cost-to-go credit against the old estimator, frozen endpoints | Gate-gradient covariance ratio 0.526 (down 47.4%); every family improved; model gate still failed | positive (estimator only) | causal credit |
| 2026-09-13 | Same 64-update recipe with cost-to-go credit | Training CE slightly better, development CE worse (5.5710 against 5.5530), 0 of 16 exact | negative | causal pilot |
| 2026-10-09 | Learn only the Generate pair table (960 coefficients) | Conditional 5 to 6 of 15; CE 5.1115 to 4.0429; accepted model stays 8 of 512 | inconclusive | bounded pair |
| 2026-10-09 | Complete donor utility on 1,920 coefficients; a bound on pair changes; a search at the earliest error | 9 of 15, as an older negative; target's best case below the rival's worst case at all nine reference points; 0 of 13,440 alternatives fixed the error | negative | full donor, bound, attribution |
| 2026-10-11 | Bind compiler, store and reader into one session, source only | Source kept; no training; panel numbers unchanged | inconclusive | bound content |
| 2026-10-11 | Matched carrier credit ON against OFF, 128 updates, seeds 1001 and 2001 | ON1001, OFF1001, OFF2001 all 437 to 0 of 512; CE 2.1828 to 7.7924, 7.7373, 7.7373. ON2001 stopped by the owner before its optimiser started | inconclusive | unified integration |
| 2026-10-12 | Whole-path credit reference and CUDA-shaped producers | 15 and then 28 CPU fixtures pass; CUDA never run; sampled producer blocked by D23 | blocked | implementation, recovery |
| 2026-10-13 | Float shared writer with margin credit | 5 controls pass; 31 of 31 at the vendor boundary (infrastructure only) | positive (construction) | shared writer |
| 2026-10-13 | Integer shared writer carrying tokens, with the Flock read on the same table | 17 of 17 controls pass, including shared-parameter identity; this is the surviving form | positive (construction) | flock writer |
Reading the 437-to-0 collapse. The ON arm lost every saved success, but so did both OFF arms, so these runs do not isolate carrier credit as the cause. The unified-integration audit lists the risks without naming a cause: a fixed 128 updates, a frozen readout while carriers change, mixed finite and ambient credit, and a component-only panel. That panel reuses 128 banks, 12 query strings and 48 exact answers for 512 inputs (same audit). Nothing was promoted and no mechanism was closed.
What has never been tested
- Unified credit with one coherent typed binding. The executed runs kept the readout frozen while the carriers and prototypes moved.
- The fourth arm (ON, seed 2001), so the replicated ON-against-OFF contrast is incomplete.
- The opened 128-row transfer check and a truly fresh 128-row draw for any carrier-credit candidate.
- The whole-path credit on a GPU, and a credit estimator that avoids softmax.
- A compiler, exact store and E8 admission trained together on a realistic, non-component panel, with joint credit for spans, memory writes and root choices.
- A carrier-credit comparison on the discrete path, with the shared table moved by counterfactual moves.
What would reopen it
- A rule-compliant replacement for the sampled-choice credit, such as hard selection by address or integer counterfactual moves, with the credit path checked end to end.
- One coherent typed binding, frame and native credit boundary, qualified first, so carriers and prototypes change under a readout trained with them.
- A panel that is not component-only, with at least two seeds and a fresh draw of at least 128 rows.
- A matched ON against OFF comparison with identical active parameters, all 4,096 answer choices and physical copy aliases scored, and carriers rebuilt after each update.
- A D37 float re-registration (fresh review, owner release, scanned module, export gap against the D11 form) or an integer counterfactual form on the discrete path.
- Owner release of the separate hold on training and rental for milestone M2 (answering from memory; see the milestones).
Also known as
Unified geometric carrier credit; live H4/Generate prototype credit; whole-path learning; the shared native vector writer (float form); causal cost-to-go credit (the September addressed-attention form); donor utility credit.
Code
causal_credit.rs: the September cost-to-go estimator.geometric_continuation_learning.rsandgeometric_bank_generate.rs: conditional utilities and live carriers.unified_geometry.rs: the executed ON and OFF arms.whole_path_learning.rsandwhole_path_device.rs: the CPU reference and the never-run CUDA-shaped producers.native_vector_writer.rsandnative_vector_channel.rs: the float shared writer and channel.
Related mechanisms
discrete-learning carries the single shared table forward in integer form. rank-margin supplies the omitted-target and address credit inside the writer. legal-construction ran on the same learner and panels. e8-orbit-memory and spiralcore-fbs supply the E8 admission and transport that whole-path credit was meant to train. exact-memory is the occurrence store whose identity must stay separate. read-binding is a teacher-side signal that would train which value a read binds to.
Exact addressed memory
Status: PARKED. Every trained form of this idea that was tested missed its bar or broke a project rule. The plain exact store itself worked whenever its address was right. The form that matters most, where the address is the model's read, was never built. See what would reopen it.
Labels used below: proof means derived from definitions or code, measurement means a recorded run, hypothesis means an untested idea. See docs/formal_vocabulary.md.
In plain words
Write each fact once, under an exact address, and read it back exactly. Do not smear it across weights, and do not hunt for it by fuzzy similarity. The address is built from prime numbers: every word has its own prime, so the same words always name the same slot. A new value replaces the old one, but the old one stays recoverable. A fact that was never written can answer "I do not know". In the one probe that checked, the store was never the cause of a failure: among 1,905 held-out misses, none was an eviction or a wrong stored value. What failed was the model's learned step of forming the address from a question.
What it replaces in a transformer
The key-value memory. A transformer keeps a key and a value for every earlier word and finds the right one by comparing the question against all the keys. Here the question is turned into an address instead, and the address is looked up directly. No comparison against every key is needed.
Left, how a fact is written, corrected and read, with the two honest failure answers. Right, why the tested models failed: the store was fine, the address was not formed.
How it works
Three built forms share one idea. In each, the address is exact.
1. Exact log and prime sieve (measurement on fixtures; the gcd arithmetic itself is proof). Every user turn is logged as word atoms. Each word has a prime from a registry table. A clause's address is the product \(A_c=\prod_{p\in S_c}p\) over its set \(S_c\) of distinct content primes, plus its ordered pairs of neighbours (n-lets). A query \(q\) is built the same way. A clause is admitted when
\[\gcd(q, A_c) > 1,\]
that is, when they share at least one prime. The greatest common divisor is computed as a sorted merge of the two factor lists, so no division is needed. Ranking is a separate step: most shared primes first, then latest occurrence, then ordered-pair match. A record counts as evicted only when its ring slot was actually overwritten.
2. The exact relation store (AERM, "G v1"). Learned heads tag each token as entity, relation, value or other. An integer store maps (entity, relation) to a value. It also keeps the previous distinct value and a version counter. A read answers one of four ways for the current and the previous version: None, Hit, Absent or Evicted. A prime-route variant keys by the semiprime \(k=p_a p_b\) of two atoms. By unique factorization (proof), \(k\) names the unordered pair exactly. The value is routed through the expert so that direction survives.
3. Product-key memory. The query splits into two halves. Each half is scored against \(S\) sub-keys and the top \(k\) on each side are kept. That gives \(k^2\) candidate slots, scored by the sum \(s_1(i)+s_2(j)\). The best \(k\) slots are read from an \(S\times S\) table. With \(S=256\) the table has 65,536 rows and a token reads 32 of them. The sub-keys are learned, or fixed to the 120 unit icosians or the 240 E8 roots. The built form mixes the rows with softmax weights.
Rule check.
| Rule | Verdict for the exact log, sieve and store | Verdict for the tested trained forms |
|---|---|---|
| No softmax anywhere (D23) | Clean | Broken. The product-key form mixes rows with softmax, and the tag and trigger heads trained with cross-entropy |
| No matrix multiplication (D30) | Clean | Not clean. They sit inside a dense float stack |
| Integer-only serving (D11) | Fits by design, but nothing is built. The integer serving crate has no gcd, and it refuses product-key memory | No served form |
| Discrete path (D32) and offline float (D37) | The integer store matches the discrete shape. No memory store exists in the discrete crate yet | A learned tagger would be float with an integer export and a reported gap. No hold is released |
D23 bans softmax. D11 fixes the served form as integer and table lookups. D37 allows float in offline training only. D30 (no matrix multiplication) is in the same file.
What has been tried
Verdicts are this page's labels. "Authored panel" means a small test set written by the project, not natural language.
| Date | What was run | Result | Verdict | Record |
|---|---|---|---|---|
| 26 Aug | Prime-route mechanics with no model: prime routes, ordered n-lets, gcd overlap, 7-row query closure | Mechanics pass. The product probe was not run, because no compiler from prompt tokens to addresses existed. 32 of 32 canary matches | inconclusive | record |
| Sep (undated) | Learned selector over exact versioned records (initial, previous, current), authored panels | 976 of 976 construction and fresh targets on the reassertion repair. Owner revision 60 of 60, against 24 of 60 for its parent. Authored-panel scope only | positive | record |
| Sep (undated) | Learned read of the previous version, fresh text gate. Also a 64-update addressed-attention pilot (13 Sep) | Selected exact old records but 44 of 64 complete, so not promoted. The pilot gave no useful generated answers | negative | record |
| 24 Sep | Synthetic key-value overwrite recall (KVAR): overwrite store with hard-select readout | Held-out accuracy 0.8235 and 0.7157 on two seeds. Recurrence-only 0.0098, gate-only 0.0196. A hand-written overwrite table scores 1.0000 | positive | record |
| 24 Sep | Exact previous-and-current token-pair cache on 24 project documents | Lowers a count reference by 0.2376 bits per target (95% interval −0.2928 to −0.1907) over 87,564 positions. Not general prose | positive | record |
| 28 Sep | AERM probe: 1.41M-parameter model, exact integer store, learned read trigger, 3 seeds, new templates and names | The store scored 1.000 in distribution, but the frozen margin gate failed even there (0.146, 0.122 and 0.102 against 0.30, because the control reached 0.85 to 0.90). On new phrasing "Updated" accuracy was 0.000, 0.000 and 0.015 against a control at 0.39 to 0.47. The trigger fired on 0 of 826 gold reads in seeds 1 and 2 (158 of 826 in seed 3) | negative | record |
| 28 Sep | G v1: always read the current and previous register | Frozen gate failed in all three seeds: 0.1575, 0.0733 and 0.0293 against a 0.90 bar. Text loss and parameter parity passed | negative | record |
| 29 Sep | Failure attribution on the G v1 misses, no training | Of 1,905 failures, 1,480 (77.7%) were the query entity tagged wrongly, 242 (12.7%) the write key, 142 (7.5%) the query relation. Eviction: 0. Wrong stored value: 0 | positive | record |
| 29 Sep | Mask the tag and trigger losses on text (arms A, B, C) | Arm A lifted held-out binding to 0.967 (264 of 273) but text loss rose 0.1188 against a 0.05 limit. Arm C reached 0.553 | inconclusive / negative | A, B, C |
| 1 Oct | Exact log and sieve feeding an emitter, key-value recall at distances 16, 64, 200 | 106 of 109. With recall switched off 16 of 109. One seed, one development draw. The recall dispatch was chosen by the instrument category and earlier assistant replies were supplied as references, so this is not a closed-loop conversation result. Same-relation-in-new-words: sieve alone answered 1 of 52 | positive / inconclusive | record |
| 10 Oct | Product-key memory (64 sub-keys, top 16) at layer 4 of the 29M chat model, 2 seeds | 19 of 40 on both seeds against a 27 of 40 bar. No-memory anchor 20 of 40 | negative | record |
| 10 Oct | Saved model on fresh unexposed role and value combinations | 437 of 512 on development, 0 of 128 on fresh. Recorded as panel fitting | negative | record |
| 11 Oct | Product-key memory replacing the layer-8 feed-forward block, 3 seeds. Fat and lean codebook | Fat: wrong-value failures 47 to 34 of 120, memory flat at 57 of 120, 20 times slower per step, and 1.65 times slower generation in a separate float GPU test (record). Lean: bits per byte worse by 0.0949 and 0.1066 against 0.02 allowed | inconclusive / negative | fat, lean |
| 11 Oct | Serve product-key memory on the integer path | The integer path refuses it, so speed is unmeasured where it matters. The earlier "12 times" fused-kernel claim was a fat-versus-lean codebook difference and is withdrawn (withdrawal) | blocked | record |
Reading these honestly. The pattern is consistent. Where the address was given or written by a fixed rule, the store worked: the 1.000 in distribution, the zero eviction failures, and the 106 of 109 recall. Where a learned head had to form the address from new phrasing, it failed, and the failures sit in the tagging, not the storage. The product-key runs tested something else: they replaced a feed-forward block with a table, not the read. The project's own correction note says so, so they do not test "address instead of search" at all. The recorded failures belong to configurations (a 1.4M-parameter probe with a learned trigger; 2,000-step fine-tunes of one 29M model on a 40-row panel with softmax weights). They do not close the mechanism (D22).
A caution on weight. Retrieval caused only 2.2 percent of the failing rows in the era-22 chat panel (issue #1708), so it is open whether memory is the binding constraint on the first milestone at all (hypothesis).
What has never been tested
- The address as the model's actual read, with the store and read trained in from the start (the order D22 section 5(c) asks for; full text). Every "addressed read" run replaced a feed-forward block instead.
- A true gcd sieve on the integer path. As of 1 October only a pairwise membership scan had been built.
- Same relation in different words, using a learned channel that feeds the exact channel, at the 0.9 relation-accuracy gate.
- Ordered n-let keys for atoms that are not role-disjoint.
- Eviction proofs driving "I do not know" at long context in a trained model.
- Parameters actually touched per token, for any exact memory on the served path.
- E8 or icosian codebooks as the write address of facts, with prime semiprimes as the exact check.
What would reopen it
- Build the address as the read. Add memory fields to the dialogue settings and train the store and read in from the start, with 2 to 3 seeds and a frozen panel of at least 80 rows. The brief's bar is at least 8 more rows of 40 than the 19 of 40 seen, with bits per byte within 0.01.
- Run the serving-time oracle first. Supply the true slot address and measure the gain before any training.
- Re-register lawfully. Use an offline float sheet (D37) or a discrete sheet (D32) with a softmax-free value mix (a rank table or a hard select), a separately scanned module, an integer export and a reported export gap. This needs a fresh
TEST FITNESS: FITreview and an owner release. - Build an integer read kernel: gcd or sorted-merge admission plus a table value read, in the integer serving crate.
- Report address formation apart from read accuracy, since 77.7 percent of the held-out failures were query-entity tagging.
Also known as
Exact addressed memory; prime-keyed exact log and gcd sieve (log-sieve retrieval); semiprime expert or prime-route store; AERM exact relation store ("D2", "G v1"); product-key memory (learned or E8/H4 sub-keys); exact-pair cache; KVAR overwrite memory; "address instead of search".
Code
stack_aerm.rs: the exact relation store simulator and the G v1 always-on read.stack_prime_route.rs: the prime-route and semiprime store, withReadPolicy::{Tagged,Sieve}.stack_store.rs: the token-level bridge to the exact versioned store (version order, predecessor chain, conflict marking, capacity eviction).stack_memory.rs: sparse product-key memory with H4 or E8 codebooks.cache_memory.rs: the exact-pair cache over a frozen model.whole_path_learning.rs: the whole-path source (CPU fixtures only).durable_memory.rsandhistorical_read.rs: scoped durable memory and the learned previous-record selection.bin/kvar-recall.rsandbin/realtext-sparse-recall.rs: the two recall harnesses.- Evidence, newest context first:
attention-state-2026-10-18, log-sieve design,kimi-direction-2026-10-12.
Related mechanisms
pointer-key: copies the value token the address names. The pointer found the source but not the slot. read-binding: teaches an attention read which stated value belongs to the question, the learned alternative to an exact address. object-store: exact byte storage of source material beneath the model, with no addressing of facts. e8-orbit-memory: the E8-addressed product-key variant, replacing a feed-forward block. relation-read: reads retained structure, where exact edges would come from this store. admission: the measured ceiling on what any read can reach. prime-zeta-codebook: supplies the prime registry the sieve depends on. route-read and flock-read: similarity-free alternatives that read by address or by a small kept set.
Exact byte object store
Status: READY. It is built and byte-tested: 60 object-store tests pass, and a second-language client reads from it correctly. No model uses it yet, and the durable-memory acceptance bars for milestone M3 (remembering across sessions; see the milestones) have not been run.
Labels used below: proof means derived from definitions or code, measurement means a recorded run, hypothesis means an untested idea. See docs/formal_vocabulary.md.
In plain words
This is storage, not thinking. It keeps data exactly, so a chat memory can be saved, checked and copied between machines without any byte changing. The data is cut into small pieces. Each piece is fingerprinted, and the pieces are arranged in a tree. Repeated content is stored once. Any byte range can be read back and checked on its own. When a file changes a little, only the changed pieces need to travel. It does not shrink new text; unique text takes about twice as much room. It exists so that a future model has something exact to quote from.
What it replaces in a transformer
Nothing. A transformer has no part like it. It sits beneath the model as durable memory outside it. The nearest transformer idea is a key-value cache that survives a restart, but this store holds raw source bytes with no keys, no facts and no addresses. Exact memory is the part that would address facts. Its node ids are content fingerprints and are never geometric addresses.
Left, a small read touches only a few verified nodes. Middle, an edit sends only the changed records. Right, repeats shrink and unique text grows.
How it works
Cutting and folding (proof of the format, measurement of the sizes). fold(bytes) splits the data into ordered 32-byte atoms. The last atom is zero-padded. A 32,768-byte object is therefore 1,024 atoms. The atoms become the leaves of a canonical ternary (three-child) tree of records.
A record holds a scale byte and a 12-byte fingerprint (BLAKE2b-96, a hash) of the scale and payload. After that comes either a 32-byte leaf or three ordered 12-byte child ids. A leaf record is 45 bytes and an internal record is 49. A child's scale must equal its parent's scale minus one, which forbids cycles. Equal chunks hash to the same record, so repeated content is stored once while every ordered occurrence is kept.
Manifest and version. A manifest pins the length, the ordered roots and a whole-object SHA-256. The object version is the SHA-256 of the canonical manifest. rebuild checks the padding and the whole-object SHA-256, so the byte obligation is
\[\mathrm{rebuild}(\mathrm{fold}(b)) = b\]
for every input \(b\) within the limits (a tested obligation, with 20 integration controls at delivery; not a machine-checked proof).
Range reads. range(start..end) descends only the branches that intersect the range. It authenticates each visited record against the root. A 23-byte read of a 32,768-byte object touched 2 leaves and needed 8 authenticated nodes, 384 serialized bytes. A missing, unrelated leaf did not block that range. It did block a full rebuild.
Token bindings. Occurrence bindings tie every token occurrence of a pinned tokenizer to an object version and a byte span. They are versioned separately from the object, so exact token, occurrence and version identity never merges with a geometric address. The adapter refuses lossy or normalised sources instead of guessing offsets.
Peers. A receiver asks only for node ids it is missing, verifies each digest, and commits all at once or not at all. The wire format is specified byte by byte in PROTOCOL.md.
What it does not do. Deduplication is not general compression. Unique 32,768-byte content takes 70,972 record bytes, which is \(70{,}972/32{,}768\approx 2.17\) times the raw size (measurement). Pins prove integrity, not who sent the data. No collision fixture was built for the 12-byte node id.
Rule check. There is no model, no learning and no geometry here. The source has no softmax, sigmoid or tanh (searched), no matrix multiplication and no floating point apart from a test timer. The hash primitives are integer. No instruction-level audit against the zero-multiplier serving rule (D11) has been run. It adds nothing to the discrete training path (D32).
What has been tried
| Date | What was run | Result | Verdict | Record |
|---|---|---|---|---|
| 14 Oct | Review of six outside SpiralCore documents, with their own test suites | Supplied suites pass (6, 4 and 10 groups). One MiB cold exchange 62,579 bytes against 438 bytes warm. The proposed attention head is unproven | positive | record |
| 14 Oct | Selective range read and repeated against unique fixtures | 23-byte range of a 32,768-byte object: 8 nodes, 384 bytes. Repeated 7,776-byte object: 8 unique records (380 bytes) rebuild 243 ordered leaves | positive | record |
| 14 Oct | Independent adversarial review (basis for decision D34) | Separates the store from attention. Benefit is warm and edit reuse. Unique content expands 2.17 times, so it is its own crate on the durable-memory line | inconclusive | record |
| 14 Oct | On-demand reader for the reconstruction tree, two backends | 203 ranges identical and equal to the source. 13 reader tests pass. It separates "the nodes I touched verified" from "the whole object verified". Nothing consumes it yet | positive | record |
| 15 Oct | The crate, with fixed limits (16 MiB object, 1,000,000 records) and malformed-import controls | Kept as a source prototype, not promoted into the model. 20 object-store and 13 tokenizer tests pass; 22 controls after the review fixes. Stored sizes: unique 32,768 to 70,972; repeated 7,776 to 380; UTF-8-and-NUL text 605 to 421; empty 0 to 0 | positive | record |
| 17 Oct | Peer replication; a receiver holding an older version | 1,048,576-byte object, receiver 16 atoms behind: 22 records, 1,014 bytes, 3 rounds. 16 scattered edits add 131 records. A wrong pinned identity is rejected with 0 records imported | positive | record, hardening |
| 17 Oct | 12 warm receivers pulling at once against one by one | 0.864 s concurrent against 3.506 s sequential | positive | record |
| 17 Oct | Opt-in larger fetch batches on a 52,535,088-byte random artifact over a wide-area link | 236.19 s default against 91.50 s with a large batch (2.58 times). 143,659,164 wire bytes either way. Locally the large batch was slower: 37.4 s against 18.8 s | positive | record |
| 17 Oct | Cold join: compressed download, local fold, then warm deltas | A cold store pull is a documented loss: 5,725,408 bytes against 39,920 compressed for a 2 MiB artifact. The supported recipe avoids it. 57 package tests pass | positive | record |
| 17 Oct | Fleet tools: pipelined verification, multi-replica audit, failover, repair | Each is covered by focused tests (14 of 14 verify tests). The after-change cross-machine timing was not recorded | inconclusive | record |
| 18 Oct | Pipelined fetch with an emulated 8 ms delay | 3.706 s with one request in flight against 1.324 s with eight (2.8 times). Not a real wide-area measurement | positive | record |
| 18 Oct | A pure-Python client audits and pulls from the Rust server over loopback | 262,144 bytes pulled byte-identical. One check, one replica: cold audit stale (exit 3), then after the pull verified (exit 0). Client side only; loopback only | positive | record |
| 18 Oct | Fleet demo: audit, failover and repair across two loopback replicas with the Rust CLI | Initial audit: 4 checks, 0 verified, 4 stale, 3 unknown (exit 2); failover sync wrote 3 artifacts; repair fetched the missing one. 60 object-store tests passed, 0 failed (from the batch-plumbing record) | positive | record |
Reading these honestly. Everything here is a test of storage and transport, not of a model. The sizes and timings are real measurements, but on small fixtures, synthetic random data and loopback links. The two recorded losses are real costs of unique content, not defects: cold pulls of unique data, and the 2.17 times expansion. Early defects (a batch cap that stalled a cold 1 MiB pull, a repeated-id request bug, a --batch flag ignored by sync and repair) were implementation faults and are fixed.
What has never been tested
- Any model reading from the store, whether exact quotation feeding the emitter or durable-session export and import.
export_scopeandimport_scopeare unchanged and unwired. - The third milestone's durable-memory bars on a chosen model: provenance, correction, "I do not know" for unstated or retracted facts, explicit reset, restart, and token-for-token identical restore.
- A real wide-area measurement of pipelined fetch and of the verification pipeline.
- A hostile network. Pins give integrity, not authentication.
- Occurrence bindings against the real tokenizer at corpus scale.
- Storage cost on real chat data against an ordinary compressor.
What would make it ACTIVE
- Name the first model consumer: exact quotation into the emitter, or durable-session persistence through the store.
- Pre-register the matching durable-memory bar and run it on a selected model.
- Decide where exact identity meets geometry. Exact token, occurrence and version identity must stay separate from geometric addresses.
- Decide who owns range reads: the store, or the separate reconstruction-tree reader, or one shared record backend.
Also known as
uor-r4-object-store; the D19 durable-memory store; exact ternary byte-object store; UOROBJ01 and objpeer replication; Showcase-compatible record tree; reconstruction-DAG store.
Code
store.rs: fold, rebuild, range, missing records, import and export, save and load, resource limits.record.rsandmanifest.rs: the validated record encoding and the versioned manifest.bindings.rs: pinned-tokenizer ingestion and the separately versioned occurrence bindings.peer.rsandbin/objpeer.rs: peer replication and its command-line tool (serve, pull, sync, verify, repair, join).PROTOCOL.md: the byte-accurate wire spec for ports to other runtimes. Scripts:cold_join.sh,fleet_maintenance.sh.uor-r4-recon-dag: the separate on-demand reader, with range-verified against whole-object claims.- Design:
d19-object-store-design-2026-10-14.
Related mechanisms
exact-memory: stores facts under exact addresses inside the model path; this store holds the source bytes beneath it. relation-read: decision D34 chose the reranker for attention and this store for exact compressed reads, as separate work. spiralcore-fbs: shares the ternary tree idea and the Showcase format, with no learning. flock-read: admits a small exact index; the store's range reads were reviewed alongside it. tokenizer: the pinned byte-pair tokenizer binds token occurrences to byte spans. lut-serving: the restore is specified on the served path; the design note says session export bytes could be stored here, which is not yet done.
Read binding (supervised value binding)
Status: PARKED. In the one form tested, it met its own target and moved the memory score by a pooled 8 of 120 rows over three seeds (one seed was down 1 row, and only one seed was individually significant). But it was applied to a softmax attention read, which the project now bans, and it has never been tried on any read that is allowed. It stays open.
Labels used below: proof means derived from definitions or code, measurement means a recorded run, hypothesis means an untested idea. See docs/formal_vocabulary.md.
In plain words
Ask a model "Ana's locker is 47. Ben's locker is 12. What is Ana's locker?" A common failure is to find a stated number but pick the wrong one. During training, a teacher marks which earlier words hold the value the question asks for, and which hold the other stated values. The model is rewarded when its attention lands on the right ones. Nothing changes when the model is used: the labels only shape what the attention learns. It aims at one failure, "found a value, but the wrong one".
What it replaces in a transformer
It adds to the loss, the training score. A transformer is usually trained only to predict the next word, and nothing tells its attention which earlier word to look at. This adds a second target on the attention read itself. It replaces no layer and adds no operation at serving time.
Left, attention before and after supervision. Right, the wrong-value count falls, and silencing the supervised layer removes the answers.
How it works
For a question whose next word belongs to a stated value, the training data carries two sets of earlier positions. \(B\) is the set that holds the asked value (bound). \(C\) is the set that holds the other stated values (competing). The labels come from a sidecar file written with the dialogue corpus. Each attention head \(h\) puts weight \(a^{(h)}_j\) on earlier position \(j\). Define the bound and competing mass:
\[m^{(h)}_{\text{bound}}=\sum_{j\in B}a^{(h)}_j,\qquad m^{(h)}_{\text{comp}}=\sum_{j\in C}a^{(h)}_j .\]
The extra loss, on the best-binding head, is
\[\mathcal{L}_{\text{bind}}=-\log\!\Big(\max_h m^{(h)}_{\text{bound}}+10^{-6}\Big),\qquad \mathcal{L}=\mathcal{L}_{\text{language}}+W\,\mathcal{L}_{\text{bind}} .\]
The floor \(10^{-6}\) keeps the logarithm finite. The weight \(W\) was 0.1 in the run kept and 0.5 in the first test. The loss is zero only when all attention sits on the bound positions (ignoring the floor). That follows from the formula (proof). One variant also penalised competing mass with \(0.5\,\max(0,\,m_{\text{comp}}-0.03)\).
The labels never touch a hidden state or a score for the next word. The served network is unchanged, and only the read learns to separate values. The tested runs applied it to a late read layer (layer 8, in a stack whose reads are layers 2, 5 and 8) from step 0 of a fine-tune.
An exact-by-construction variant (read_lineage = phase_bind) gives each value a fixed phase tag, so binding is exact rather than learned. A random rotation tag is its control.
Rule check.
| Rule | Verdict |
|---|---|
| No softmax (D23) | Broken in the tested form. The loss has no softmax, but the mass \(m\) comes from a softmax attention read (attention-state review: "it is a softmax read") |
| No matrix multiplication (D30) | Not clean. The 29M-parameter stack that was trained is a dense matrix-multiplication stack |
| Integer-only serving (D11) | Nothing to serve. It is a training signal and adds no served operation |
| Discrete path (D32) and offline float (D37) | Not on the discrete path. Float training is legal offline under D37, so the signal is admissible if attached to a lawful read and exported to an integer artifact |
What has been tried
"Wrong-value" counts rows where the model answered with a stated value that was not the asked one. The memory panel has 40 rows per seed; "of 120" pools three seeds.
| Date | What was run | Result | Verdict | Record |
|---|---|---|---|---|
| Sep (undated) | Optimizer-clock correction on a copied attention cell (precursor) | Top-1 rose from 12.01% to 68.29% with the training recipe alone, against a strict bar above 99%. A later copy scored 99.17%, so the failures came from the recipe | inconclusive | record |
| 3 Oct | Eight surface forms per relation, no read labels | Unseen statement forms 37.8% to 94.6% (McNemar p = 3.1e-11). Unseen question forms 58.1% to 63.5% (p = 0.54). The leftover failure is specific to the question's form | positive | record |
| 9 Oct | Binding supervision 0.1 on a 214M-parameter float pointer stack (arm P) against arm Q | 29 of 40 against 31 of 40, target 34. The 9 misses split into wrong-value and no-value with no single fix | negative | record |
| 10 Oct | More binding examples in the training data, no labels | Memory 17 of 40 against 20 of 40 at the same dose. Third flat cycle in a row | negative | record |
| 10 Oct | \(W\) = 0.1 and 0.5, late fine-tune, one seed each | Bound mass 0.732 to 0.896 at \(W\)=0.1. Memory 19 and 17 of 40 against an anchor of 20. Wrong-value 17 to 12. Hit its own target, left the panel flat | inconclusive | record |
| 11 Oct | Four serving-time tests on one model | Normal 23 of 40. Copy head off 22. Facts removed 0. Copy forced to half 7. Answers come from the attention read | positive | record |
| 11 Oct | Keeper. \(W\) = 0.1 from step 0, 3 seeds, each against a matched \(W\)=0 control | Bound mass 0.732 to 0.896, 0.899, 0.905. Competing 0.140 to 0.090, 0.086, 0.081. Wrong-value 47 to 30 of 120. Memory 57 to 65 of 120. Best seed 24 against 20 of 40 (McNemar p = 0.0034; 12 repaired, 1 broken). Bits per byte 1.17142, 1.17067, 1.17060 against 1.17425 for the anchor | positive | record |
| 11 Oct | Silence one read layer at serving time on the bound model | Unablated 24 of 40. Layer 8 silenced: 0 of 40 (37 rows give no value). Layer 5: 7. Layer 2: 2 | positive | record |
| 11 Oct | Margin hinge on competing mass added | Competing mass halved (0.0462 against 0.0897) but wrong-value stayed at 30 and memory at 64 of 120 against 65 | negative | record |
| 11 Oct | Phase binding (fixed phases) on top of \(W\)=0.1, two seeds | Same bound mass, worse answers: memory 17 against 19 and 20 against 24 of 40. Training 13.4 times slower (0.058 to 0.777 s per step) | negative | record |
| 11 Oct | The keeper recipe at 8,000 steps (four times longer), 3 seeds | Wrong-value 49 to 23 of 120. Memory 48 to 64 of 120. Bound mass 0.969 to 0.971. Two seeds individually significant (p = 0.031, 0.035) | positive | record |
| 11 Oct | 16,000 steps, 2 seeds | Wrong-value 25 to 15 of 80. Memory 39 to 45 of 80. Bound mass 0.985. The advantage did not grow, so the training-length lever is closed | positive | record |
| 12 Oct | Forced-copy oracle on the bound model | The instrument was built (919 library tests pass). The run was not done | blocked | record |
| 18 Oct | Independent read-only review of every attention mechanism | Calls this the one powered result in which a learned read moved a headline, in a form now inactive. Nothing in the integer substrate has it | inconclusive | record |
Reading these honestly. This is the clearest positive among the learned-read ideas, and also a narrow one. It was measured on a 40-row panel per seed, on fine-tunes of a single 29M-parameter model. The bound and competing masses are measured on training data. The headline gain is about 8 rows of 120. The first one-seed test (10 October) moved the panel by one row, inside the 2 to 3 row noise, and the project's rule on closing configurations (D22) reopened it. The failures close specific configurations: a late bolt-on, a hinge, fixed-phase tags, more steps and a data-only lever. They do not close the idea. Notably the masses kept sharpening (0.985) while the panel gain stopped growing. So bound mass may not be the whole lever (hypothesis).
What has never been tested
- Any discrete or geometric read, such as a routed read, a flocking read or a relation read. Any read that is not a softmax attention.
- Supervising every head, or routing the output through the binding head. Both were named after the 16,000-step result.
- Pairing the binding with the pointer so that bound positions feed the copy distribution directly.
- Held-out bound and competing mass. The masses reported are train-side.
- At least 120 memory rows per seed. Every panel has 40.
- A model pretrained with the mechanism. Every run fine-tuned one 29M base.
- A fresh-draw transfer number for the kept result, which D22 asks for.
What would reopen it
- Re-register on an allowed read. Use an offline float sheet (D37) on a read that is not a softmax attention (a rank-table, flock or relation read). It must be a separately scanned module with an integer export and a reported export gap, plus a fresh
TEST FITNESS: FITreview and an owner release. - Or port the signal to the discrete read. Define the discrete analogue of bound against competing mass on a routed, flocking or relation read, and supervise it from the start of training.
- Meet the fair-test conditions. Supervise from the start, not as a late bolt-on. Use at least 3 seeds, at least 120 memory rows, a matched \(W=0\) control and held-out masses. Add a head-ablation check that the bound head drives the answer. The bar is a gain of at least 5 rows of 40 over the control.
- Change the supervision, not its length or sharpness. Per-head supervision, or routing the output through the binding head, are the named candidates.
Also known as
Read-binding supervision (read_binding_supervision); bound-and-competing-mass loss; phase binding (read_lineage=phase_bind), the exact-by-construction variant; teacher-only binding labels.
Code
geometric_stack.rs:ReadBinding,ReadBindingTarget,ReadSupervisedLoss, the \(10^{-6}\) floor and read lineage.examples/geometric-stack.rs: the training command that carries theread_binding_supervision=Wandread_lineageflags.bin/dialogue-recall-corpus.rs: writes the binding-labels sidecar.bin/chat-grade.rs: the frozen-panel grader, with the read-silence switch used by the head ablation.
Related mechanisms
pointer-key: the copy head, found not to be the answer path; binding acts on the read it bypasses. exact-memory: the exact-address alternative to learning which value a read binds to. flock-read and relation-read: the softmax-free reads a re-registration would supervise. route-read: reads by invariant address, with no mass to supervise. admission: the measured ceiling on what any read can reach, which supervision cannot raise.
Pointer copy with an exact identity key
Status: PARKED. Every tested form is a softmax pointer inside a dense float model, and each missed its bar or cannot be served. A real prime-based key raised the pointer's hit rate from 0.377 to 0.545, yet the answers did not reach the pre-registered bar (one seed got 23 of 40 memory rows against a bar of 25, inside the noise). The version keyed by the slot's own name was never run, nor was the forced-copy test of it on a lawful pointer.
Labels used below: proof means derived from definitions or code, measurement means a recorded run, hypothesis means an untested idea. See docs/formal_vocabulary.md.
In plain words
When asked "what is Ana's locker?", the model should copy the stored answer from earlier text rather than invent one. A pointer is a small part of the model that chooses which earlier word to copy. This mechanism wants the pointer to choose by the exact name of the slot (Ana plus locker), not by the surrounding wording. Measured on 9 October on 13 rows, the pointer instead lands on the repeated sentence frame ("... locker is ..."), and almost never on the changing digits.
What it replaces in a transformer
The copy head, also called an induction head. In a transformer, a head learns to look back at an earlier word and copy it. Here the choice of which word to copy is steered by prime-number addresses, so it does not depend on how similar two stretches of text look.
Left, where the pointer actually looks, and where the forced-copy test would put it. Right, a higher hit rate did not raise the memory score.
How it works
The copy mixture. The model's next-word distribution blends its ordinary scores with a copy distribution:
\[p(v)=(1-g)\,\mathrm{softmax}(z)_v+g\sum_{j:\,x_j=v}a_j ,\]
where \(g\) is a learned gate, \(x_j\) is the word at earlier position \(j\), and \(a_j\) is the pointer's attention over a window of earlier words. The first term uses a softmax, which matters for the rule check below.
The project-specific part is how a source is chosen.
- Every word has a registered prime. A source \(j\) is admitted when the greatest common divisor of its atoms and the query's atoms exceeds 1:
\[\gcd(q,\pi_j)>1 ,\]
or when an ordered n-let (a short ordered run of atoms) matches. These are
RouteAdmission::SharedAtomandNgram. - Rarer atoms weigh more, by \(\ln\gcd\). The route score is scaled by 4.0 (
ROUTE_SHARPNESS), and the attention is a softmax over admitted sources. - An identity term (
PointerIdentity) adds the overlap of the six words before the source with the six before the query. - A fixed table folds upper and lower case and one leading space to a canonical id (
copy_identity.rs). It only decides matches and never changes the emitted word.
The intended key is the slot address: entity prime times attribute prime, written when the fact is stated. Not the wording around the value. That version was never built.
Rule check.
| Rule | Verdict |
|---|---|
| No softmax (D23) | Broken as built. Both the mixture and the pointer attention use softmax. The form is a softmax pointer and could not be served (project history, era 28) |
| No matrix multiplication (D30) | Not clean. The pointer sits inside a dense float model and its score is a dot product |
| Integer-only serving (D11) | Export serves only an unrouted, unselected pointer. A pointer with an identity term is refused at export. The fold table is one table read plus integer equality |
| Discrete path (D32) and offline float (D37) | No pointer exists on the discrete path. D37 would allow an offline float re-registration in a separately scanned module, with an integer export and a reported gap. Nothing is released |
What has been tried
"Memory" is the memory half of a frozen 40-row chat panel. "Wrong-value" counts rows that gave a stated but wrong value. All 2026-10 runs fine-tune one 29M-parameter chat model.
| Date | What was run | Result | Verdict | Record |
|---|---|---|---|---|
| Sep (undated) | Earlier native engine: ordered occurrence correspondence between query and source words | Passed its gate; all 6,304 earlier traces preserved. The ancestor of the pointer. Authored panels | positive | record |
| 21 to 23 Sep | Typed session runners and a learned span-and-role decoder over exact owned spans | 128 of 128 primary answers; 24 of 24 final answers; 32 of 32 authored preflight. The two geometry arms tie, so the geometry is not credited | positive | session, argument binding, lexical |
| 1 Oct | Key-value recall at distances 16, 64, 200 with pointer arms | Without a pointer 1 of 109. Pointer arms scored 0.28 to 0.44, falling about as 1/N, matching an untrained "copy the latest" rule (0.36). Their misses are wrong-key answers | negative | record |
| 1 Oct | Native integer attention with capture-credit models against same-size controls | 128 of 128 answers for the capture-credit models. The controls fail. Authored key-value tasks only | positive | record |
| 3 Oct | Zero-update audit of the final native artifact's copy targets | 54 of 74 copy targets lose to another copy action; 4 of 20 complete answers. Source boundary missing 60 of 114 target tokens | negative | record |
| 9 Oct | Diagnostic series on the 29M chat model's pointer over 13 numeric rows | The pointer attends the repeated frame, a bare space token (attention 0.9202 and 0.9064), and rarely the digits. Second digit selected on 0 of 13 rows, first digit on 3 of 13. Failing rows: 10 reader faults, 2 emitter faults, 1 partial | positive (diagnosis) | record |
| 9 Oct | Serving-time knobs: top-2 selection plus a gate floor of 0.9, weights unchanged | Both digits selected on 0 of 13 (control) to 3 of 13, target 13 of 13. Missed | negative | record |
| 9 Oct | Token-identity copy stop on an 84-cell never-seen-value panel | 72 of 84 exact (0.8571; Wilson interval 0.7667 to 0.9163). The rest cannot be fixed by relaxing the rule, since the opened span emits the whole premise sentence | diagnostic stop | record |
| 9 Oct | One-shot declared test of the 29M copy-pointer stack, no memory operator | 10 of 40 memory against a target of at least 34. Missed by 24 rows. A constant beat it on the "I do not know" half | negative | record |
| 10 Oct | Gate supervision, 55% recall data mix, one seed per arm | Memory 10 to 21 of 40, but an unsupervised control reached 22 of 40. The data mix, not the gate, caused it | negative | record |
| 10 Oct | Identity term keyed on the six words around the value | Wrong-value 17 to 12 of 40, memory 19 of 40 against an anchor of 20. The key was the context before the value, not the slot's name. Hit rate 0.003 | negative | record |
| 10 Oct | Prime-ranked one-atom route (the entity-address key), 3 data orders against a learned-key control | Hit rate 0.377 to 0.5452 at reachability 0.668. Memory 19, 21, 23 of 40 against 20. Wrong-value 17, 15, 9 against 17. Bits per byte 1.17387, 1.16947, 1.17109 against the anchor's 1.17425. The pre-registered bar (wrong-value at most 12 and memory at least 25 of 40 on all seeds) was not met | negative | record |
| 10 Oct | Recall-mixture doses of 10, 25 and 55 percent | 10 percent doubled memory without hurting replies; "I do not know" needed 25 percent and cost replies. Missed the keep bar by one row | negative | record |
| 11 Oct | Four serving-time tests on one model (23 of 40 normal) | Copy head off costs one row (22 of 40). Facts removed 0. Copy forced to half 7. The answers come from the attention read, not the copy head | positive | record |
| 12 Oct | Forced-copy oracle: replace the pointer's attention with a uniform one over a supplied answer span | Instrument built and unit-tested (919 library tests pass). The run on the bound model was not done | blocked | record |
Reading these honestly. The key did what a key should: it found the source more often, at no cost in likelihood. The answers did not follow. The record suggests why: the pointer branch carries only about 6 percent of the output mixture, and the answer-path test shows the answers come from the attention read. So the hit-rate measurements read a minor branch, and the bottleneck is after the source is found (hypothesis). The failures are specific. The identity runs keyed on the wrong thing. The gate run had a control that did as well. The v5 run had no memory operator at all. The inference knobs changed two decode settings on fixed weights. None of them tested a key on the slot's name, and the project's own rule says a negative closes a configuration, not a mechanism (D22).
What has never been tested
- The forced-copy oracle: supply the true slot or span and see whether the answers follow. It has been named and left unrun since 12 October. It must not be run as a new execution of the softmax pointer artifact (D23, D30): it needs a lawful pointer, or stored outputs.
- A pointer keyed on the slot's name (entity prime times attribute prime), as opposed to the six words around the value or a one-atom window.
- Admitting a whole value span, such as the full two-digit run, instead of one token.
- Exact admission with a learned ranking over addresses.
- Any pointer on the discrete path, or with a copy distribution that has no softmax.
- A pointer served as integers by gcd, with the export gap measured.
- At least 3 seeds with at least 120 memory rows. Every pointer run was one fine-tune of one 29M model on a 40-row panel (the address-key test used three data orders).
What would reopen it
- Run the forced-copy oracle on a lawful pointer. Supply the true slot address or span to bound the possible gain, using a softmax-free, matmul-free pointer or stored outputs only. A new execution of the existing softmax pointer artifact is not allowed (D23, D30; see the mechanism board).
- Then train a slot-address key. A parsed or learned key (entity prime times attribute prime), trained in from the start of the dialogue fine-tune, with matched controls, at least 3 seeds and at least 120 memory rows. The bar is a gain of at least 5 rows of 40 over the control.
- Remove the softmax. Give the copy distribution a rank table, a hard select, or exact admission plus a learned ranking, so the head can be registered under the no-softmax and no-matrix-multiplication rules. That is a new offline float sheet (D37) or a discrete sheet (D32), with a fresh
TEST FITNESS: FITreview and an owner release. - Serve it as integers. Route by gcd or n-let equality with no float score, and report the export gap.
Also known as
Pointer-copy head (A1); copy head; token-identity pointer (pointer_identity); prime-route pointer (pointer_route=prime-ranked); entity-address pointer; copy-identity fold table; forced-copy oracle (copy-span oracle).
Code
geometric_stack.rs:PointerConfig,PointerSelect::TopK,PointerIdentity,PrimeRoute, the gate loss and the copy-span oracle switch.copy_identity.rs: the fixed fold table.stack_prime_route.rs: the prime-route addressing instrument, shared with exact memory.examples/bind-probe-exact.rs: the exact-recall probe behind the 84-cell panel.bin/heldout-memory-panel.rs: the held-out memory panel builder.word_copy_runtime.rs: the September engine's exact word-occurrence copy, the pointer's ancestor.- Evidence:
attention-state-2026-10-18,kimi-direction-2026-10-12.
Related mechanisms
exact-memory: the store whose slot address the pointer is meant to use as its key. read-binding: steers the attention read toward the bound value; the answer path turned out to be that read. route-read: a different way to read by address, with no copy mixture. relation-read: its copy-successor capability is the pointer's analogue on the discrete path. prime-zeta-codebook: the prime registry behind gcd and n-let admission. tokenizer: the 4,096-token vocabulary has no pure multi-digit tokens, so a two-digit value is two tokens, which interacts with copying.
E8 orbit memory
Status: PARKED. Replacing half of the feed-forward layers with this memory stayed inside its quality bar (+0.033 bits per byte), but a learned address book of the same size beat the fixed E8 addresses by 0.023. So the geometry earned no credit. The read weight also uses a sigmoid, which the project now bans.
Labels used below: proof means derived from definitions or code, measurement means a recorded run, hypothesis means an untested idea. See docs/formal_vocabulary.md.
In plain words
Instead of running a full feed-forward layer, the model reads a handful of rows from a very large table. The row addresses come from the 240 special points of the E8 lattice, an eight-dimensional pattern of points (the E8 roots). A fast exact rule finds the nearest special point to each half of the query. The hope is a fixed, exact address book that touches a few rows per token rather than running a full dense layer. In the one trial, the fixed address book did slightly worse than an address book the model learns for itself.
What it replaces in a transformer
The feed-forward block (also called the MLP). In a transformer this is the large layer after attention that processes each word, and it holds most of the arithmetic. Here a table lookup of a few rows takes its place. The table is far larger, but only a few rows are read per token.
Left, how a query picks candidate rows. Right, the geometry stays inside the quality bar but behind its learned twin.
How it works
The E8 roots (the count is proof; the integer decode was checked by measurement on 20,000 queries). The 240 roots are 112 vectors of the form \((\pm1,\pm1,0,0,0,0,0,0)\) in any arrangement, plus 128 vectors \((\pm\tfrac12,\dots,\pm\tfrac12)\) with an even number of minus signs. The code stores them in doubled integer coordinates, so they are exact integers.
Per head, in four steps.
- Cut and decode. The query is cut into two 8-dimensional halves. Each half is decoded to its nearest E8 root in \(O(8)\) operations: the two largest \(|x_i|\) with sign rules, or all signs with a parity fix for the half-integer roots. No 240-way scan is needed. It was checked against a full scan on 20,000 queries.
- Orbits. SpiralCore's group of 64 signed axis permutations (\(\mathrm{Cl}(0,6)\)) splits the 240 roots into 15 orbits of 16 (240 = 15 × 16). A half's candidates are the 16 roots of its decoded root's orbit.
- Slots. The two halves together address a grid of \(240\times240=57{,}600\) value slots. The head keeps the top \(k\) by combined score (\(k=8\) in the rung that ran).
- Read. A kept slot of rank \(r\) is weighted by
\[w_r = R[h][r]\cdot\sigma(\beta s+\gamma),\]
a learned rank table \(R\) times a logistic-sigmoid gate on the score \(s\). There is no softmax. The output is the weighted sum of the kept value rows. Slot choice is detached from training, so only the query map, rank table, gate scale and the values learn.
Size. The value table has \(57{,}600\times256\) float values, about 59 MB per layer (proof by arithmetic: \(57{,}600\times256\times4\) bytes). A token reads 32 of its rows. The design arithmetic is about 27 thousand multiply-adds per token against 270 thousand for the dense layer it replaces, roughly tenfold. That figure is arithmetic, not a measured speed or energy saving.
Rule check.
| Rule | Verdict |
|---|---|
| No softmax (D23) | Broken as built. The read weight uses a sigmoid, and sigmoid is banned along with softmax |
| No matrix multiplication (D30) | Not clean. The query map and value mixing are dense float operations. The static E8 and SpiralCore tables were rebuilt without a generic 8 by 8 matrix product (record) |
| Integer-only serving (D11) | No served form. Export refuses, and integer serving refuses product-key memory. The value tables are float. The decode, orbit tables and route transport are exact integer lookups |
| Discrete path (D32) and offline float (D37) | Not on the discrete path. D37 would allow offline float training only as a new reviewed sheet with an integer export and a reported gap |
What has been tried
BPB means bits per byte on held-out text, lower is better.
| Date | What was run | Result | Verdict | Record |
|---|---|---|---|---|
| 26 Sep | Associative recall with a minimal head: E8 block codes against sign-bit codes and float scores, 64 pairs for training, up to 512 pairs at test | E8 recalled 100.0% at 512 pairs. At 8 bits E8 25.8% against sign bits 21.9%. In a language model, E8 trained worse than sign bits | inconclusive | record |
| 27 Sep | Implementation of product-key layers with learned, fixed-H4 (14,400 slots) and fixed-E8 (57,600 slots) sub-keys | Selection equals brute-force top-k. Gradients match finite differences. The experiment was not run | inconclusive | record |
| 28 Sep | Addressing contest on a fitted quaternion parent: E8, H4 and k-means codes as an index over events | Not qualified. Recall at 1: k-means 0.9813, H4 0.9696, E8 0.9450. Read loss against full: +0.007201, +0.009313, +0.012083. The comparison is confounded by magnitude (the record says so) | negative | record |
| 11 Oct | Rung 1. E8 replacing half (layers 1, 3, 5, 7: E8h) or all 8 (E8a) feed-forward layers. Width 256, 2,000 steps, 2 seeds, laptop CPU. Dense control D256 and a learned product-key twin P of equal capacity | BPB: D256 1.4078, P 1.4175 (+0.010), E8h 1.4406 (+0.033), E8a 1.5237 (+0.116). Noise 0.0054. Orbit entropy 3.85 to 3.87 of 3.91 bits and 83 to 87% of slots read, so routing did not collapse. CPU speed 1,330 tokens per second (E8h), 405 (E8a), 2,140 (P) | inconclusive: keep and iterate | record |
| 11 Oct | Integration ledger citing the rung | The tenfold multiply-add saving is design arithmetic. Broad entropy and coverage rule out collapse overall, not every query-level address failure | inconclusive | record |
| 11 Oct | Whole-path source reuses the E8 tables, compiling 15,360 action images once | Source kept, no training. E8 is used as an exact route beside exact content identity, not as an MLP replacement. The saved 437 of 512 model is unchanged | inconclusive | record |
| 12 Oct | Removed generic 8 by 8 matrix multiplication from the static tables | 3 static-algebra tests pass. All 240 doubled roots are preserved bijectively under each of the 64 actions and inverses. No model run | positive | record |
| 12 Oct | Whole-path source with a 240-way write key and 15 orbit-family profiles | Source kept. 5 E8 regression tests pass on the CPU. GPU run not done. The sampled producer was later blocked by the no-softmax rule | inconclusive | record |
| 12 Oct | Project-manager review of the lab record | Restates the outcome as keep and iterate: learned keys beat fixed E8 addresses by 0.023 BPB | inconclusive | record |
Reading these honestly. The rung's decision rule was "half the layers within the larger of 0.05 or two times the noise", and E8h (+0.033) met it. That is why the outcome is keep-and-iterate, not a failure. But the learned twin beat E8h by 0.0231 BPB, about four times the noise. Learned sub-keys addressed the slots better than fixed E8 roots at this scale. The record could not tell whether the gap comes from the fixed addresses or from the value capacity per slot (hypothesis on either side). So the geometry earned no credit. Replacing all eight layers cost +0.116, which says too much capacity was removed at width 256 for 2,000 steps. It does not say E8 addressing fails. The result is one configuration: 2,000 steps, 2 seeds, a laptop CPU, a sigmoid gate. It was the last rung of its kind on the laptop CPU; geometric-stack training now goes to rented GPUs. The speed numbers are host-side slot selection, not an integer table read.
What has never been tested
- Any E8 memory run after rung 1: no run with \(k=16\), no learned per-orbit offsets, no GPU run of the layer.
- E8 memory trained in from pretraining. The rung trained a 256-wide stack for 2,000 steps from scratch on its own recipe.
- A gate with no softmax and no sigmoid, or any discrete form of the layer.
- Integer value tables and a served form, with measured tokens per second and an export gap.
- E8 memory as the read itself ("address instead of search"). Only the feed-forward layer was replaced.
- E8 as the write address of facts, with prime semiprimes as the exact check.
- Query-level address quality. The entropy and coverage statistics are aggregates.
A fair test needs
From the earlier brief, archive/mechanisms/e8-orbit-memory-2026-10-20.md.
- A capacity-matched learned-key control (P).
- Routing health (entropy and slot share), to tell collapse from capacity.
- Matched training steps and the same panel.
- GPU training: a CPU run of E8a took about 6 h.
What would reopen it
- Run the next rung the record names, GPU only and pre-registered with a fresh
TEST FITNESS: FITreview: raise \(k\) from 8 to 16, and add learned per-orbit residual offsets on the E8 frame. The offsets separate "fixed addresses" from "value capacity" as the cause of the 0.023 gap. - Replace the sigmoid gate with one that obeys the no-softmax rule, such as a rank table with a hard threshold or exact selection. Register it as an offline float sheet (D37) in a separately scanned module with an integer export (integer value tables, E8 decode as table lookups) and a reported export gap. An owner release is required.
- Keep the fair-test conditions. A capacity-matched control (P, the learned-key twin, which uses a float sigmoid gate), taken from stored rung-1 outputs or replaced by a lawful count-table control because new neural controls are barred until the model works end to end (charter section 3.10); routing health (orbit entropy and slot share), matched training steps, the same panel, and at least 2 seeds.
- Provide a served form. Integer serving refuses product-key memory today, and a multiply-add saving did not appear in tokens per second for the learned-key twin. Report tokens per second.
Also known as
Exact-E8-addressed memory; E8 memory in place of the MLP; e8_memory (arms E8h and E8a); fixed E8 product-key memory.
Code
e8_memory.rs:e8_tables,E8Tables::nearest,e8_select,e8_memory_read, usage logging. The training flag ise8_memory=LAYERS:HEADS:K.stack_memory.rs: the product-key layer with fixed H4 or E8 sub-keys, and the capacity-matched learned-key control P.spiralcore_operator.rs: signed-axis composition andapply_root_key, which build the orbits and the 64 action tables without a generic matrix product.whole_path_learning.rs: the whole-path source that reuses the E8 tables as a bounded record index (CPU fixtures only).
Related mechanisms
exact-memory: the parent family. This is its product-key memory with fixed E8 sub-keys, replacing a feed-forward layer. spiralcore-fbs: supplies the 64-element group whose actions define the 15 orbits. spin-weights: the 120-icosian H4 variant of the same layer. admission: the addressing contest used E8 codes as an event index. carrier-credit and discrete-learning: the whole-path and discrete lines that reuse the exact tables. ternary-xor: E8 is a lifted Hamming code, the bridge to XOR and bit-count arithmetic.
Ternary and XOR/Hamming arithmetic
Status: PARKED. As proposed, a dense layer of −1/0/+1 weights removes the multiplier but not the sum over every weight, which the owner's no-dense-matrix-multiplication rule still counts against it. It was never trained in. Its two small pieces, bit counting and three-valued switches, already run inside the current model (discrete-learning).
Labels used below: proof means derived from definitions or code, measurement means a recorded run, hypothesis means an untested idea. See docs/formal_vocabulary.md.
In plain words
A normal network stores each weight as a decimal number, and using it costs a multiplication. Here each weight is only −1, 0 or +1, so using it means add, subtract or skip. Two bit patterns are compared by counting how many bits differ, which is called the Hamming distance. The hope was cheap arithmetic with no multiplier. The plan to replace the big grids of multiplications this way has not been adopted, because every weight is still touched for every word and the owner's no-dense-matrix-multiplication rule counts that against it. The bit counting and the three-way switches are used in the current model.
What it replaces in a transformer
The arithmetic inside the big grids of multiplications (the matrix multiplications): the projections that turn each word's vector into queries, values and layer outputs.
The operators are AND and subtract, not XOR (left). Inside the current model, bit counting breaks ties between routes (middle). The multiplier goes away but the dense grid stays (right).
How it works
Storage (Definition). A ternary weight vector \(w\in\{-1,0,+1\}^n\) is stored in two bit planes. Plane \(P\) is set where \(w_i=+1\), plane \(N\) where \(w_i=-1\), and \(P\wedge N=0\). The repository's low-bit code uses two bits per weight (CODE_POS=1, CODE_NEG=2), which is the same thing.
The dot product is exact (proof). For a binary activation vector \(x\in\{0,1\}^n\), \[\sum_i w_i x_i \;=\; \operatorname{popcount}(P\wedge x)-\operatorname{popcount}(N\wedge x).\] Each position contributes \(+1\) if and only if \(P_i=x_i=1\), and \(-1\) if and only if \(N_i=x_i=1\). A zero weight is skipped for free. For multi-bit activations \(x=\sum_b 2^b x^{(b)}\), repeat per bit plane and combine with shifts and adds. A power-of-two row scale is a shift. A 2026-10-12 re-check agreed in 5,000 random trials (measurement, owner-ruling record).
XOR is not the ternary dot product (proof). XOR gives the Hamming distance \(d(a,b)=\operatorname{popcount}(a\oplus b)=|a|+|b|-2|a\wedge b|\). Over the two-element field GF(2), \(-1\) and \(+1\) are the same element, so "ternary XOR matmul" is false as stated. What is true is the AND-and-subtract identity above.
What it does not remove (proof, by counting). A layer with \(D\) inputs and \(W\) outputs still reads all \(W\times D\) weights for every token. The multiplier disappears; the dense sum stays. A contraction applied only to a routed subset would not have this cost (hypothesis).
Where it runs today (Definition). In the discrete model the same ingredients serve as routing parts, in discrete.cu:
- A coordinate Hamming count breaks ties when two candidate ports have equal L1 displacement for a transported query.
- A ternary gate parameter switches flock levels on or off, with candidates visited in the order 0, −1, +1.
Geometry. On its own this is Boolean hypercube arithmetic, not a lattice. The E8 lattice is the (8,4,4) Hamming code lifted by Construction A, but Hamming distance on E8 labels is not the E8 lattice distance (decision D32).
Rule check.
- D11 (integer serving): compatible in form, since add, subtract, skip and AND with popcount need no multiplier. Not shown to be fast: the one multiplier-free engine measured ran 68.0 tokens/s against 127.5 on the D10 engine (multiplies allowed) (record).
- D23 (no softmax): nothing to scan; scoring is a hard count.
- D25/D30 (no dense matrix multiplication): the dense ternary sum is still a dense sum, so it would not pass as a matmul substitute. The tie-break and trit gates inside routing are not matmuls.
- D32/D37: D32 names ternary and Hamming computation as a preferred substrate. D37 allows float training offline, but a ternary master would still need a new pre-registered sheet and an export gap (decisions).
What has been tried
| Date | What was run | Result | Verdict | Record |
|---|---|---|---|---|
| Sep | Hamming refinement primitive: query, exact read, state update, authored policy, 240-bit code, no training | Passes five finite causal cases (1–4 hops, up to 256 occurrences scored per hop). Not a language model | positive, primitive only | record |
| Sep | One seeded 4-input-table circuit (3,076 gates, 6,152 parameter bytes), two Hamming hops, not fitted | Trajectory check passes. Language: 0/24 complete answers, 1/460 response symbols, mean cross-entropy 10.998 | inconclusive | record |
| 12 Sep | Learned Boolean query-update tables for a second dependent read | Ablation controls pass; final independent qualification not run; authored finite task | positive, small | record |
| 19 Sep | Dense ternary recurrence \(h_t=\mathrm{relu}(W_x x_t+W_h h_{t-1})\), integer state | State overflows the 32-bit limit by 32 steps at widths 32, 64 and 128. Recall over 4 steps works at width ≥128; over 8 steps it scores 0.00 at widths 64, 128 and 256 | negative | record |
| 20 Sep | Ternary projection of the frozen output head (PR #1308) | Bits per target on 17,342 targets: empirical head 7.1708, plain ternary 7.4162, activation-aware ternary 7.1909, float head 6.8741. Neither ternary form beats the empirical head. The complete search was NOT_RUN | negative | record |
| 22 Sep | Learned seven-slot ternary realizer | 31/31 authored cases; review qualified the comparator and meaning claims | inconclusive | record |
| 23 Sep | Ternary readout refit on a frozen state | The integer kernel reproduces the float fit. Gain about 0.13 bits against a 0.30-bit bar; the first-draft conclusion was retracted | positive, bar missed | record |
| 26 Sep | Hamming sign-bit keys against float keys, toy recall | 64-bit codes recall as well as float at 1,024 candidates with 8 bytes per key instead of 128. As final scores they cost 0.014 bits per byte, so they should admit candidates and exact scores should rank | positive | record |
| 27 Sep, 1 Oct | Signed 4-bit packed coefficients, a 4-bit integer gate and an integer q/k projection (not ternary, same multiplier-free family) | 8/8 baseline/candidate pairs match with 87% fewer retained coefficient bytes; 0 disagreements across 4 saved models; 128/128 answers on both held seeds | positive | packed, gate, q/k |
| 9 Oct | Advisory review of the owner's two-page XOR/Hamming note | Boolean identities valid; proves no semantic distance, routing or learning gain. No compute | inconclusive | review |
| 10 Oct | Multiplier-free integer engine against the float path, three 29M-parameter artifacts, 64 held-out windows | Bit-identical outputs; 68.0 against 127.5 tokens/s. Served quality 1.20138 bits per byte against a target of 0.90 or less, so the gap is the model | negative | record |
| 12 Oct | Independent re-check of the popcount identity; owner's no-matmul ruling | Identity exact; assessed as a quantisation lever that drops the multiplier, not the dense contraction. No model run | inconclusive | record |
| 13 Oct | Discrete model with ternary gate proposals and coordinate Hamming in flock selection | 17/17 controls pass at source 76198c3b5; gate-cost witness [448, 256, 64]; applied updates 0 | positive, controls only | record |
Reading these honestly. The failures are failures of configurations: an unnormalised, ungated recurrence (the takeover review withdrew the broader reading); a quantiser applied after training to a float copy with a reduced search; one frozen-state refit; one engine on one laptop. None tests ternary weights trained from step 0 in a normalised or routed structure. The positive rows are authored finite tasks or toy recall, not language quality. The 4-bit rows use the same multiplier-free family but not the ternary alphabet.
What has never been tested
- Any bit-sliced or popcount contraction. No kernel and no code exists in the tree, and the training crate has no ternary-weight code.
- A ternary weight trained in from step 0. Every use of the ternary linear layer is a post-hoc snap of a float master.
- The actual XOR arm, with weight planes plus bit-sliced activations, separated from the weight-only arm.
- A ternary alphabet of true group elements, such as the three cube roots of unity, instead of a truncated scalar.
- A matched comparison against the icosian-mantissa weights (
spin-weights) at equal steps, width and weight bytes. - Tokens per second of any ternary contraction on the shared CUDA harness.
- A corpus run that isolates the ternary gate moves. Only finite construction controls exist, with zero updates applied.
A fair test needs
From the earlier brief, archive/mechanisms/ternary-xor-arithmetic-2026-10-20.md.
- Mechanism trained in from step 0, not quantised post hoc. Every existing
TernaryLinearuse is a post-hoc snap of a float master; that arm is a reading, never a verdict. - A matched control at equal steps, width and weight bytes per token. For this project the honest control
is
quaternion_weights=all/ icosian-mantissa, not an FP16 dense model — that is what already sits at parity and is already multiplier-free on the weight side. - ≥ 2 seeds with paired per-block analysis, or ≥ 200 fresh rows (D22). With existing noise of 0.0012–0.0027 BPB, the bar is ≥ 0.01 BPB or 2× measured noise, whichever is larger, fixed before compute, plus a stated tokens/s bar on the same harness.
- Both operands declared, two arms: (i) weight planes only, activations multi-bit; (ii) weight planes plus bitsliced activations — the actual XOR arm. This separates the popcount cost from the ternary cost.
- A qualified GPU kernel for the contraction before any language fit: exactness against
forward_i32, device execution proven, host fallback refused. - Fresh transfer for any KEEP (D22), and a declared way to show the dense contraction left the executed path, including the training gradient (see open questions).
- Uninterpretable if: the run trains on CPU (D24); arms differ in dtype, width, steps or tokeniser; the weight planes are rebuilt per token rather than per artifact; the popcount path is a forward-time wrapper while the trained graph keeps its dense contraction; or the comparison is a configuration D25 excludes.
What would reopen it
- A GPU kernel for the bit-sliced or table-lookup ternary contraction exists and matches
TernaryLinear::forward_i32for binary and 8-bit activations, with host fallback refused (decision D24: no model compute on the CPU). - A pre-registered rung trains it in from step 0, against the matched icosian-mantissa arm at equal steps, width and weight bytes, with at least 2 seeds or 200 fresh rows. The bar is the larger of 0.01 bits per byte or twice the measured noise, set before compute.
- Tokens per second on the same CUDA harness goes up, not only multiplications or bytes touched. The integer engine lost 68.0 against 127.5, and product-key memory lost the same way, so this is the bar to beat.
- The contraction is applied where it is not a dense \(W\times D\) sum (a routed or selected subset), or the owner rules it an accepted, labelled non-geometric substitution, before any run.
- Or the alphabet is made geometric: three values that are actual group elements, such as the three cube roots of unity, instead of a truncated scalar quantiser.
Open questions: which operand is binary (today's activations are integer, so the XOR arm needs bit-plane activations); whether \(\{-1,0,+1\}\) fits the exact \(\mathbb Z[\varphi]\) objects; and, if ternary wins on cost and ties on quality, whether that is an accepted non-geometric substitution (an owner decision). These are hypotheses, not results.
Also known as
Ternary weights; XOR matmul; bit-sliced ternary contraction; Hamming or popcount distance; TernaryLinear and low-bit; multiplier-free weights; modulo-256 substrate; "ternary alternative with xor" (owner prompt, 12 October 2026).
Code
learner/lowbit.rs: ternary linear layer, two bits per weight; add, subtract or skip with a power-of-two scale. Used only for post-hoc export of float copies.learner/lowbit_core.rs: the dense ternary recurrence of the 19 September negative.learner/lowbit_attention.rs: low-bit attention variant.learner/head_projection.rs: ternary search of the output head.hamming_refinement/metric.rsandhamming_policy/policy.rs: XOR, popcount and integer add over a 240-bit code.vsa/hypervector.rs: XOR binding of codes, a code operation rather than a weighted sum.discrete.cu: the active use, the coordinate Hamming tie-break and the ternary gate parameter.
Audit source: docs/labs/repo-renormalization-2026-10-19/audit/mechanisms/ternary-xor.json.
Related mechanisms
spin-weights: the competing multiplier-free weight representation, level with dense in its own bars. discrete-learning: runs the trit gates and Hamming tie-breaks. flock-read: selection uses frame and payload Hamming and ternary level gates. spiralcore-fbs: the base-3 binder tree these gates sit on. vsa: XOR binding of codes is the legitimate XOR use. e8-orbit-memory: E8 as a lifted Hamming code.
c=1
Spin-native weights (quaternion and icosian maps)
Status: PARKED. The quaternion weights, snapped to a residual pair of icosians with a 2-bit scale, met their bar on a small test (1.5148 bits per byte: not distinguishable from a dense model with the same total parameters, and 0.107 behind a dense model of the same width; a single-icosian snap lost badly), but only by running a dense Hamilton-block multiplication, which the owner's rules ban. The code that ran them now refuses to run. The mechanism stays open.
Labels used below: proof means derived from definitions or code, measurement means a recorded run, hypothesis means an untested idea. See docs/formal_vocabulary.md.
In plain words
A network's weight matrix is usually a grid of independent numbers. Here each 4-by-4 block of the grid is replaced by one quaternion, a set of four numbers that describes a turn and a scale in four dimensions. That makes the grid four times smaller. After training, each quaternion is rounded to one of 120 exact rotations of the icosahedron (the 20-sided solid), plus a small scale. A product of two such rounded blocks then becomes a table lookup and a few shifts and adds, with no multiplication. The size and quality results were good. The speed benefit was never built or measured.
What it replaces in a transformer
The weight matrices of the projections: the grids that turn a word's vector into queries, keys, values, recurrence inputs and feed-forward layers.
Round a quaternion to the nearest of 120 rotations, then correct with a second small one; the product becomes a table read. The bars show what each step cost in quality.
How it works
Compact form (Definition). Each projection map is stored as an array \(Q[\text{out}/4,\ \text{in}/4,\ 4]\), one quaternion \((a,b,c,d)\) per 4×4 block, so there are four times fewer weights. A block acts as the Hamilton left-multiplication matrix \[L(a,b,c,d)=\begin{pmatrix}a&-b&-c&-d\\ b&a&-d&c\\ c&d&a&-b\\ d&-c&b&a\end{pmatrix}.\] The output quaternion is \(y_j=\sum_k Q_{jk}\otimes x_k\), with the input read as \(\text{in}/4\) quaternions. Each block costs 16 multiply-adds, so by itself the compact form saves weights, not arithmetic (measurement: width 256 uses the same 5,537,792 multiply-adds per token as the dense width-256 model).
Snap (Definition). Each trained quaternion becomes \[m\cdot 2^{e}\cdot\Big(g_1+\tfrac14\,g_2\Big),\] where \(g_1\) is the nearest of the 120 unit icosians (the binary icosahedral group, exact over \(\mathbb Z[\varphi]\)), \(g_2\) is the icosian nearest the leftover residual, \(m\in\{1,\,1.25,\,1.5,\,1.75\}\) is a 2-bit mantissa and \(e\) is a power of two. That is about 19 to 20 bits per block instead of 128 for four 32-bit floats. Activations can be snapped to the same set after training.
Table product (Definition, never built). The 120 icosians multiply by a fixed 120×120 table. The records describe a snapped product as a table read plus shifts and at most two adds. The group table itself was verified: all 14,400 products (120×120) matched in the 2026-09-20 prefix-recovery check (measurement, record). A kernel that serves exact-set by exact-set block products was never written.
Why one icosian is too coarse (measurement). The 120 directions sit about 15 degrees apart. Adding the residual icosian cut the mean angle error from 14.75 to 4.73 degrees, about 9 times less direction error energy.
Rule check.
- D11 (integer serving): the weight side is multiplier-free by design. The activation side and the table kernel were never built, and export of quaternion-weight models is refused in the code.
- D23 (no softmax): the mechanism has none; snaps pick the nearest point.
- D25/D30 (no dense matrix multiplication): fails as run. The forward expanded each map to a dense matrix and called a library matrix multiply, and the snap itself was a matmul against the 120 icosians. The fused Hamilton kernel (OP2) is a handwritten dense block contraction, which D25 does not accept as a replacement. Both execution paths now refuse. The ban retired the contraction; it was not retired by a negative result.
- D32/D37: the historical form is float. D32 froze it and D37 lets it back only as a new offline float sheet with a fresh review (decisions).
What has been tried
All training rows below are small: width 256, a recurrence-heavy stack, 2,000 steps on a chat corpus, 2–3 seeds. The model around the weights still used softmax (the quaternion-weights and icosian-mantissa records both state "softmax at runtime: yes"), so these runs isolate the weight representation, not a lawful model. Scores are held-out bits per byte (BPB), lower is better.
| Date | What was run | Result | Verdict | Record |
|---|---|---|---|---|
| 19 Sep | Exact group-table composition replacing the 16-multiply Hamilton product on the serving path | Exact table and multiplier-free path verified. The replaced site was about 1,000 multiplies per generated token. No chat ability, training or energy measurement | positive | handoff |
| 20 Sep | Prefix recovery with the multiplication table bound through a signed-root bijection (PR #1306) | 14,400 products checked; the old learned function was preserved | positive | record |
| 11 Oct | Quaternion weights on every map: dense width 256 (D256), dense width 152 with equal total parameters (D152), dense width 128 with equal map weights (D128), quaternion width 256 (Q256) | D256 1.4078, Q256 1.4959, D152 1.5136, D128 1.5520. Q256 beats D152 by 0.0177 (bar 0.0059, noise 0.0029) and costs 0.088 against D256. Weight bytes 8.55 MB against 8.62 MB | positive (KEEP) | record |
| 11 Oct | Single-icosian snap: after training, then trained in with a straight-through gradient | After training: +0.141 BPB. Trained in: +0.103 to +0.140. Mean cosine to the original 0.965 | negative | record |
| 11 Oct | Residual icosian pair, trained in | Direction error 14.75 to 4.73 degrees. Full-precision norm +0.016; power-of-two norm +0.071. Training was 11 times slower on the host snap | inconclusive | record |
| 11 Oct | Pair with a 1- or 2-bit mantissa on the norm (QM2), 3 seeds, one RTX 4090 | QM2 1.5148, +0.0012 against D152 (about one noise unit), +0.020 against the full-precision quaternion model. GPU snap 7.8 times faster than the host loop. 6 runs, 8.5 minutes, about $0.15 | positive (KEEP) | record |
| 11 Oct | Snap every map input to the same exact set, after training and trained in | After training +0.0196 BPB (1.5343); trained in +0.0231 (1.5379). A configuration result | negative | record |
| 13 Oct | Fused Hamilton projection kernel (OP2) replacing the expanded dense multiply | Implemented and checked locally. 949 library tests pass; agreement with the dense expansion below \(10^{-5}\). No run, no device receipt, no model numbers. Superseded within days by SpiralCore/FBS | blocked by rule | record |
Reading these honestly. "Level with dense" means level with a dense model of the same total parameter count (width 152), not the same width. At equal width the quaternion model is 0.088 BPB worse. The 0.0012 gap is about one noise unit, so the claim is "not distinguishable at this scale", not "better". No fresh-transfer measurement is recorded for either KEEP, which decision D22 asks for. The trained-in activation snap lost by about twice the noise, with one gradient bridge at one scale; the pre-registered soft-to-hard schedule was never tried. Nothing was measured in tokens per second or energy.
What has never been tested
- A table-lookup product kernel for exact-set by exact-set blocks, in any form.
- Tokens per second, wall-clock or energy of any quaternion or icosian map.
- A soft-to-hard schedule for activation snapping, or a finer set of directions (a third icosian term, or the 2,160-point second E8 shell).
- Any width above 256 or run longer than 2,000 steps. The +0.088 BPB cost of four-times-fewer weights was measured only there.
- Device parity for the fused kernel. The tests exist but were skipped.
- Fresh transfer for the quaternion and icosian KEEPs.
- Quaternion maps inside a routed or selected structure instead of an all-input sum.
A fair test needs
From the earlier brief, archive/mechanisms/spin-native-weights.md.
- Equal total parameters and equal weight bytes per token against dense.
- A panel that first shows it separates model sizes.
- At least 2 seeds, with paired per-block noise.
- For the table-product rung: the snap trained in, not only applied post hoc, before any negative counts.
What would reopen it
- A table or Cayley-product path (120×120 read, shifts, adds) with no dense all-input contraction, for example applying the block product only to blocks chosen by routing, as the SpiralCore/FBS projection (PR #2279) does. It must be a new D37 sheet: fresh test-fitness review, owner release, a separately scanned float module, and an export gap.
- An explicit architecture decision for a Hamilton-block trunk. The 18 October architect audit says the active discrete model has no dense projections to replace, so this is a new architecture. "Spinor/quaternion adapters" are already listed as a conditional item, to be considered only at a measured ceiling.
- A soft-to-hard activation-snap schedule, blending \(\alpha\cdot\text{snap}+(1-\alpha)\,x\) with \(\alpha\) rising to 1, compared with the +0.0196 BPB post-hoc cost, before any negative on activation snapping counts.
- A served-form table kernel measured in tokens per second on the same CUDA harness, with weight bytes per token held equal to the dense control (8.55 MB against 8.62 MB in the rung-0 study).
- At least 2 seeds with paired per-block analysis (noise 0.0012 to 0.0041 BPB in these records) and fresh transfer for any KEEP.
Open questions: how much of the activation-snap cost is direction and how much is scale; whether to snap during training or build directly in served form; whether a finer exact group (the 600-cell plus a scale codebook, or the second E8 shell) is better; and whether the equal-weight-bytes gain survives at scale. These are hypotheses.
Also known as
Quaternion weights (quaternion_weights=all); Hamilton-block projections; HamiltonLinear (OP2); residual icosian pairs; icosian Cayley-table products; icosian-mantissa weights; spin-snap.
Code
geometric_stack.rs:QuaternionWeights,QuaternionSnap(including the pair and mantissa forms), the straight-through snap andActivationSnap. The dense weight expansion and the fused Hamilton projection are now stubs that refuse to run.examples/quaternion-snap.rs: post-hoc snap probe.stack_snap_parity.rs: parity report of the exported multiplier-free artifact against two float comparators.learner/group_table.rs: exact icosian composition by table lookup.learner/hamilton_transport.rs: exact signed-permutation left actions on integer 4-vectors.- Restorable dense source, preserved inactive:
archive/history/branch-archive/dense-quaternion-projection-inactive-20261012.patch, indexed inarchive/history/branch-archive/INDEX.md. - Existing art:
docs/figures/geometry/600-cell-icosians.svg.
Audit source: docs/labs/repo-renormalization-2026-10-19/audit/mechanisms/spin-weights.json.
Related mechanisms
spiralcore-fbs: replaced the dense quaternion sum with one selected, transported 8D block per output block. hamilton-gate: the same Hamilton product used as a gate on 4-blocks. recurrence-gates: the quaternion scan carries state by the same product, and identity transport cost 0.07 nats. ternary-xor: the competing multiplier-free weight alphabet. discrete-learning: the active model uses 8D signed-axis transport, not quaternion maps. e8-orbit-memory: exact E8 addresses, the other half of the spin-native design. hopf-observation: quaternions reach the 3-sphere to 2-sphere shadow.
Hamilton rotation gate
Status: READY. The exact forward and backward passes, the GPU kernels and the trainer switch are built and tested. The gate has never been trained: no language run exists, and nothing has been compared with the gate it replaces.
Labels used below: proof means derived from definitions or code, measurement means a recorded run or test, hypothesis means an untested idea. See docs/formal_vocabulary.md.
In plain words
Inside a feed-forward layer, a gate decides how much of a signal passes through. The usual gate squashes a number into the range 0 to 1 with a sigmoid curve, and the project's rules now ban that curve. This gate instead turns a gate signal into a rotation in four dimensions and rotates the matching value by it, four numbers at a time. A rotation only turns a vector. It uses no exponential and no squashing. A consequence worth knowing: a rotation cannot make a vector shorter, so this gate steers the signal rather than switching it off. Whether that is enough is not yet known.
What it replaces in a transformer
The gate in the feed-forward layer (the multilayer perceptron) that follows attention. The common form, SwiGLU, multiplies the value by a sigmoid-shaped gate.
What the swap does and does not do. The rotation keeps the signal's length; the length of the gate block enters only through the backward pass (right, drawn from the formula).
How it works
Work on blocks of four numbers. Let \(g\) be a gate block and \(u\) the matching "up" (value) block of the hidden layer. Compute \[r=\sqrt{|g|^2+10^{-12}},\qquad q=g/r,\qquad \text{out}=q\otimes u,\] where \(\otimes\) is the Hamilton product (the quaternion product) and \(q\otimes u=L(q)\,u\) with the \(4\times4\) matrix \(L\) given on the spin-weights page.
Two facts (proof).
- Quaternion length is multiplicative, \(|q\otimes u|=|q|\,|u|\), and \(|q|=|g|/\sqrt{|g|^2+10^{-12}}\). So \(|{\rm out}|=|u|\) up to a factor that falls below 1 only when \(|g|\) is near \(10^{-6}\) or smaller (at \(|g|=10^{-6}\) the factor is \(0.71\)). A zero gate block gives \(q=0\) and zero output. The output's length is set by \(u\) alone; the gate sets only its direction.
- The backward pass is exact, including the normalisation (Definition):
\[\partial u=\bar q\otimes d,\qquad \partial q=d\otimes\bar u,\qquad \partial g=\frac{\partial q-q\,(q\cdot\partial q)}{r},\]
with \(d\) the incoming adjoint and \(\bar q\) the quaternion conjugate. No
exp, sigmoid, tanh or softmax appears in either direction.
The hazard (proof, from the formula). Because \(\partial g\) divides by \(r\), a gate block near zero gives a gradient of about \(1/r\approx10^{6}\). Weight decay can push a block toward zero. No real run has checked this.
Wiring. The hidden width must be divisible by 4. One GPU thread handles one block. The setting gate=hamilton selects it; the default stays the sigmoid SwiGLU gate so old artifacts load byte for byte. Export for integer serving and quantisation-aware training refuse any non-default gate. The same operation is also the output gate of the geometric recurrence.
What the owner's card left open (hypothesis). An icosian snap of \(q\), so the product becomes a read in the 120×120 table; an exact hard forward with a straight-through gradient bridge; and a serving form.
Rule check.
- D11 (integer serving): not servable today. The exporter refuses other gates, and the normalisation divides by a square root and multiplies two runtime values. It becomes table-servable only after the icosian snap makes \(q\) one of 120 rotations.
- D23 (no softmax or squashing): passes by construction. D25 closed the sigmoid exception that SwiGLU relied on, which this replaces.
- D25/D30 (no dense matrix multiplication): a per-block Hamilton product is not a dense contraction. The owner permits a geometric feed-forward block of this gate plus Hamilton-block projections, and the projection half has since been replaced by SpiralCore/FBS.
- D32/D37: a float operation, frozen by D32. D37 lets it return only through a new pre-registered offline sheet (decisions).
What has been tried
| Date | What was run | Result | Verdict | Record |
|---|---|---|---|---|
| 23 Sep | Scoped reading of the owner's Hamilton hint; exact signed-permutation actions on integer 4-vectors | The actions preserve length and are invertible (\(K^2=-I\)). Rotating every query and key together cannot change an inner-product ranking, so a useful mechanism needs relative or content-dependent operations. Not evidence for attention. No model run | inconclusive | record |
| 12 Oct | The gate (arm G2): CPU reference, GPU kernels, trainer flag, saved-config field. A rectified-square arm (G1) was removed before delivery | 944 library tests pass, 0 fail, 7 ignored. Host-executed kernel against an independent reference within \(9.3\times10^{-7}\), hand-computed blocks exact. A missing half-precision dispatch was found and fixed. No run, no device receipt, no model numbers | inconclusive | record |
| 13 Oct | Vast.ai RTX 5090 parity run, after a missing import broke every pod's parity step | 43 passed, 0 failed, 3 ignored (38 before the gate work). The summary line does not name the tests | inconclusive | record |
| 13 Oct | 18 finite controls (11 on CUDA, 7 metadata or argument checks) of the declared first-rung configuration (recurrence-only trunk with this gate, SpiralCore/FBS projection, product head, margin objective) at batch 16 by context 384 | 18 of 18 pass on source 05c84bece; peak GPU 9,274 MiB. No optimizer update, no quality number | positive, controls only | record |
Reading these honestly. Every row is a correctness check. None says the gate helps a language model, and the parity count does not name which tests ran. The rectified-square arm G1 was withdrawn by the owner as non-geometric, not tested and found wanting, so no fallback arm exists. The missing import was a test-source blocker, not a mechanism result. Together the parity run and the 18 controls (11 of them on CUDA) are the device evidence that makes the status READY rather than a source-only draft.
What has never been tested
- Any language fit with the gate, or any comparison with the SwiGLU gate or the frozen pre-ban artifact.
- The icosian snap of \(q\) and the hard-forward with its gradient bridge.
- A table-served form for integer serving, and its export gap.
- The \(1/r\) gradient near a zero gate block in a real run.
- Whether a norm-preserving gate can suppress a signal at all. The formula says the output length equals \(|u|\) for any gate except a near-zero block. This is a reading of the formula; the records do not discuss it (hypothesis that it matters).
- A standalone named device parity result for the gate.
What would reopen it
The gate is READY, so these are the steps to make it ACTIVE.
- A new D37 offline-float sheet in a separately scanned module, with a fresh test-fitness review and the owner release that applies. The training holds still apply.
- A matched comparison of
gate=hamiltonagainst the SwiGLU gate and the frozen pre-ban artifact, at equal width, steps and data, with at least 2 seeds or 200 fresh rows and fresh transfer for any KEEP. The sigmoid arm is banned for new runs, so the comparison must use the stored outputs of the frozen artifact, not a fresh SwiGLU run. - The three open items from the owner's card: the icosian snap, the hard-forward geometry with its gradient bridge, and a table-served form, with the export gap measured on the same evaluator.
- A real-run check of the near-zero gate hazard.
- A named, device-qualified parity receipt for the gate tests.
Open questions: does a rotation gate express enough, since a sigmoid gate can shut a channel and a unit rotation cannot; how \(q\) can be snapped to one of 120 rotations without losing the cost advantage seen for weights (+0.0196 bits per byte for exact activations in the activation-snap study); and whether it adds anything over the discrete model's own ternary gating, or only duplicates it at higher cost (architect audit, 18 October). These are hypotheses.
Also known as
G2; OP1; Gate::Hamilton; \(q(g)\otimes u\); geometric feed-forward gate; gate=hamilton.
Code
geometric_stack.rs: theGatesetting, theHamiltonGateoperation,hamilton_gate, and the divisible-by-4 check.cuda_stack.cu:hamilton_gate_fwdandhamilton_gate_bwd, one thread per 4-block.geometric_stack/cuda_ops.rs: the launcher; it errors rather than falling back to the host.tests/cuda_stack_ops_parity.rs:test_hamilton_gate_parityandtest_hamilton_gate_model_parity.examples/geometric-stack.rs: the trainer flaggate=swiglu|hamilton.- The frozen first-rung sheet:
m1-rank-margin-rung0-2026-10-13.md.
Audit source: docs/labs/repo-renormalization-2026-10-19/audit/mechanisms/hamilton-gate.json.
Related mechanisms
recurrence-gates: uses this operation as its output gate. spin-weights: the same Hamilton product applied to weights; the fused projection was this gate's sibling. spiralcore-fbs: replaced that projection; the gate and the projection form the geometric feed-forward block. rank-margin: the first-rung sheet that was to train this gate with the margin objective. ternary-xor: the discrete model's ternary gates are the active gating mechanism.
Geometric recurrence gates
Status: READY. The clamped opening, the table of fade rates, the secant credit rule and the Hamilton output gate are built, and 18 finite controls (11 on CUDA, 7 metadata or argument checks) pass. The gates have never been trained, and the fit that was meant to test them never ran.
Labels used below: proof means derived from definitions or code, measurement means a recorded run or test, hypothesis means an untested idea. See docs/formal_vocabulary.md.
In plain words
A recurrent layer keeps a running memory and decides at each step how fast old content fades and how much new input gets in. The old recipe used smooth curves for those decisions (sigmoid, exponential, tanh), and the project's rules now ban them. The replacement opens the input with a clamped straight line, picks the fade rate from a short table of powers of two, and carries the memory forward by a rotation. Each step is a table read and a rotation, so nothing smooth is needed. It is a drop-in for the gates of one particular recurrent design, not a standard part of a transformer.
What it replaces in a transformer
A plain transformer has no recurrence, so this replaces nothing there directly. It belongs to the recurrent alternative to attention used in the project's older float stack. In that design it replaces four squashing functions inside the recurrence: a sigmoid opening, an exponential and softplus decay rate, and a tanh-shaped output gate.
A table of 16 fixed clocks replaces a smooth dial. Each step multiplies the old state by the chosen rate and a rotation, and adds new input scaled by the matching keep factor.
How it works
The trunk's sequence mixer is a recurrence over lanes of four numbers (quaternions). From the source (geometric_stack.rs), one step per lane is
\[h_t \;=\; \lambda_t\,u_t\otimes h_{t-1}\;+\;\kappa_t\,b_t,\]
where \(u_t\) is a unit quaternion built from the gate projections (the rotation), \(b_t\) is the convolved input drive, and \(\otimes\) is the quaternion product. Four squashing sites of the historical form are replaced in the mode rec_gates=geometric:
- Opening (Definition). \(s_t=\mathrm{clamp}(g_t+d,\,0,\,1)\), where \(g_t\) is the gate projection and \(d\) is a per-lane decay parameter read raw, with no softplus. The clamp has an exact subgradient.
- Rate (Definition). The index is \(i=\min(\lfloor 16\,s_t\rfloor,\,15)\). The rate and the keep factor are read from two 16-entry tables: \[\lambda=2^{-(i+1)},\qquad \kappa=\sqrt{1-\lambda^2}.\] The rates are exact powers of two, from \(1/2\) down to \(2^{-16}\), and \(\kappa\) is precomputed beside each one, so serving needs only table reads. The pair \((\lambda,\kappa)\) lies on the unit circle up to \(6\times10^{-8}\) (measurement; the last four \(\kappa\) entries round to exactly 1 in 32-bit floats).
- Carry (unchanged). The quaternion scan above.
- Output gate (Definition). The Hamilton rotation gate on the recurrence output, replacing a tanh-shaped gate.
Credit through a hard choice (Definition). Picking a table entry has zero derivative almost everywhere, so nothing would train. The backward pass uses a declared secant surrogate: it pairs the incoming adjoints for \((\lambda,\kappa)\) with the full counterfactual change in the table between the selected entry and each neighbour, and resolves the contrast along the fixed edge of length \(1/16\), half to each side and the whole weight to the single neighbour at either end. No probability or exponential is involved. It is a rule, not the derivative of hard selection, and whether it yields descent is the open test.
A reading of the source (proof from the table, not a recorded finding). Every table entry satisfies \(\lambda\le\tfrac12\), so a step keeps at most half of the old state times a rotation. The historical rate \(\lambda=\exp(8\,\sigma(g)\log\sigma(d))\) can approach 1 as the opening goes to 0. Whether a table capped at one half per step keeps enough long memory is untested.
The mode refuses non-GPU devices, export and quantisation-aware training. The historical mode stays the default so old artifacts reproduce.
Rule check.
- D11 (integer serving): designed for it, since the rates are table reads, the opening is a clamp and the scan is rotations. Not yet exportable, because the integer engine binds the historical decay parameter. The output gate still needs the icosian snap.
- D23 (no softmax or squashing): a grep on 13 October found 0 squash-family tokens in the geometric arms (the historical branches keep 8 by design).
- D25/D30 (no dense matrix multiplication): a clamp, a table read, a scan and a per-block rotation. The no-matmul and no-softmax counters were unchanged by the delivering PR.
- D32/D37: a float operator. D32 froze it and D37 allows it back only by a new offline sheet (decisions). The active discrete model carries no recurrent state, so this belongs to a separate float trunk.
What has been tried
Rows before 13 October test related recurrences, not this table.
| Date | What was run | Result | Verdict | Record |
|---|---|---|---|---|
| 7 Aug | Long-range context ceiling and the decay constant of the shipped fold (issue #424) | Distant context is worth about +1.02 points of top-1 over a 21.62% base. The shipped fold kept 16% of that ceiling ("mechanism right, constant wrong"). The gated A/B was not run | diagnostic stop | record |
| 28 Aug | Multirate gated-delta retention core, four banks, geometric arm against a matched plain delta, 28-event synthetic fixture | Geometric 16/28 next-token and 55/112 association margins against plain 23/28 and 98/112. Corpus qualification NOT_RUN | negative | record |
| 19 Sep | Dense ternary recurrence \(h_t=\mathrm{relu}(W_xx_t+W_hh_{t-1})\) | Integer state saturates between 16 and 32 steps; recall over 8 steps scores 0.00 at widths 64, 128 and 256 | negative | record |
| 25 Sep | One learned recurrent memory, quaternion transport against a matched Householder-pair control (carry state by pairs of reflections), 1.68M parameters, one paired seed | Both pass the limited engineering gate. At the final step, 7,324, the comparison-tail loss is 2.1104 (quaternion) against 2.0852 (ordinary recurrent learner) in nats, so no win over the control. The count-and-cache baseline scored 2.3918 and an offline transformer 1.5740 on the same population. (A later continuation record reports 2.0905 against 2.0644 at step 8,348.) Generations drift and repeat | inconclusive | record |
| 25 Sep | Quantisation-aware, then projected continuation of both arms | Packed minus continuous loss +0.0598 (quaternion) and +0.0835 (Householder) against an allowance of +0.05; recipe rejected | negative | quantized, projected |
| 26 Sep | Continuation of both arms from 8,348 to 15,672 updates | Likelihood improved but no arm meets the unchanged prose rule; the quaternion integer continuation short-cycles | negative | record |
| 27 Sep | Capacity-matched geometric stack (recurrence plus attention) against a transformer control, 7.15M against 7.16M parameters, one seed per arm | 1.9981 against 2.0111 nats at 7,324 updates; 789 against 788 tokens/s. The stack led by 0.158 nats at 1,000 updates, and the lead closed by about 2,750 | positive | record |
| 27 Sep | Quaternion and reflection-pair recurrent lanes: an A5 word problem, then inside the stack, then a fresh replication | The skill belongs to the finite group, not to quaternions: 17/18 non-commutative runs exact to length 4,096. Inside the stack the per-seed gates fail, so no lane type stays | negative | record |
| 28 Sep | Quaternion against identity transport at matched width, 1,000 updates, two seeds | Quaternion wins by 0.0711 and 0.0774 nats (bar 0.02). +332,928 parameters; 10% and 8% slower | positive | record |
| 13 Oct | The geometric gates themselves: clamp, rate and keep tables, secant credit, Hamilton output gate | Implemented, source only. Rate table error \(5\times10^{-13}\), keep \(4.6\times10^{-10}\) relative, secant \(5.5\times10^{-8}\) relative. Squash tokens 0 against 8 in the historical branches | inconclusive | record |
| 13 Oct | 18 finite controls (11 on CUDA, 7 metadata or argument checks) at the first-rung shape (batch 16 by context 384, six recurrences, width 256, vocabulary 4,096) | 18 of 18 pass on source 05c84bece. Opening and decay credit is nonzero in all six layers. Five defects repaired, including ordinary recurrence still entering the old sigmoid-exp-GELU core. No optimizer update, no quality number | positive, controls only | record |
Reading these honestly. The failures are failures of other configurations: an unbounded dense state, a 28-event fixture, a quantisation recipe on the continuous learner, one paired seed with a control that is not worse. The quaternion-against-identity result (+0.07 nats) shows transport matters; the quaternion-against-reflection tie shows rotation is not yet shown better. None of the 13 October rows trains the table, and the stack results used the older squashing gates.
What has never been tested
- The first-rung six-recurrence fit, which was held and then superseded by the discrete direction. No geometric-against-historical gates comparison exists on any data.
- Whether 16 table entries are fine enough, compared with a learned continuous decay.
- Whether the secant surrogate gives descent.
- A standalone device test for the rate-select kernel. None appears in the parity suite, and there is no half-precision margin kernel.
- A fused geometric recurrence kernel. The mode runs as a composition of operations.
- Integer export of the geometric mode.
- The quaternion arm against its Householder control with more than one paired seed, or on the geometric-gates trunk.
What would reopen it
The gates are READY, so these are the steps to make them ACTIVE.
- A new D37 offline-float sheet (separately scanned module, fresh test-fitness review, owner release) that runs the six-recurrence fit with
rec_gates=geometric. The old plan compared against a historical-gates arm that uses sigmoid and exponential, which is banned for new runs, so that comparison must use stored outputs of the earlier runs or a lawful read. - A device qualification that names these kernels. The CUDA path is exercised only inside the 18 controls.
- Evidence that the secant surrogate gives descent: a falling loss, or a comparison with a random-refit control.
- Fresh transfer, at least 2 seeds and the export gap on the same evaluator. A table-served form needs the integer engine to bind the new rate scores instead of the historical decay parameter.
Open questions: do hard-selected rates train stably under the secant credit or does the table plateau; does rotation beat reflection as the carry at scale and under a finite-precision export; is a recurrence the right sequence mixer at all, now that the active model reads context through the routed and flock reads; and what the export gap looks like. These are hypotheses.
Also known as
rec_gates=geometric; RecGates::Geometric; rate_select; dyadic rate and keep tables; clamped-linear opening; quaternion scan; "dependency 3" of the first-rung sheet (PR #2293).
Code
geometric_stack.rs: theRecGatessetting,composed_recurrence,quaternion_scan,RATE_TABLE,KEEP_TABLE,RATE_ENTRIESand therate_selectoperation.cuda_stack.cu:rate_select_fwd/bwdandquaternion_scan_fwd/bwd.geometric_stack/cuda_ops.rs: the launchers; half-precision twins sit incuda_ops_bf16.rs.examples/geometric-stack.rs: trainer flagrec_gates=historical|geometric.learner/hamilton_transport.rs: exact signed-permutation actions used for integer transport.- The first-rung sheet that names the four squashing sites:
m1-rank-margin-rung0-2026-10-13.md.
Audit source: docs/labs/repo-renormalization-2026-10-19/audit/mechanisms/recurrence-gates.json.
Related mechanisms
hamilton-gate: supplies the output gate. spin-weights: shares the Hamilton product; the scan is the carry. spiralcore-fbs: shares the secant-surrogate credit pattern. rank-margin: the margin objective this trunk was to train with. ternary-xor: the dense ternary recurrence negative. discrete-learning: the active model replaces recurrence with routed exact reads. geometric-stack: the 214M float trunk these gates were written for.
SpiralCore transport with ternary tree binders (float projection form)
Status: READY. The float projection is built and was checked on a real GPU with exact test cases, and it ran inside 18 finite controls. It has never been trained, and whether its credit rule gives descent is unmeasured. Its integer form is ACTIVE: it is the core of the current model, described under discrete-learning.
Labels used below: proof means derived from definitions or code, measurement means a recorded run or test, hypothesis means an untested idea. See docs/formal_vocabulary.md.
In plain words
A normal layer mixes every input into every output using learned weights. This one does something much simpler. Each output block picks one input block from a small tree of stored blocks, three branches per node, and moves it along a path of exact steps in an eight-dimensional lattice called E8. Each step only swaps coordinates and flips signs. No learned coefficient is multiplied in; the path itself does the transforming. The trade is that each output reads one input block instead of a blend of all of them, and nobody has yet measured whether that carries enough information.
What it replaces in a transformer
The dense projections: the large weight grids that turn each vector into queries, values and layer outputs. In the float stack this replaced a dense quaternion version of the same job (spin-weights).
One output block, one chosen atom, a short path of signed coordinate swaps (left and middle). The dense projection connects every pair; this one connects one (right).
How it works
The tree (Definition). Input channels are 8-dimensional integer atoms kept by a static Rust compiler in ordered base-3 binders. The compiler stores children, parent links, atom identity, support length and the incomplete frontier (at most 6,560 atoms, 16 frontier roots and 8 stages). FBS is the project's name for this tree. Exact atom identity stays separate from the geometric state.
The steps (Definition, from SpiralCore). SpiralCore is an external exact-geometry source (a hosted file, reviewed on 9 October). Octonion left actions give 15 generators \(B\), each a signed coordinate permutation of \(\mathbb R^8\) with \(B^2=-I\). They act on the 16 roots of one E8 anchor orbit through 64 signed operator states. A breadth-first search over these labelled edges gives an ordered history between any two roots, composed by left-composition.
Exact inverse (proof). From \(B^2=-I\) it follows \(B^4=I\) and so \(B^3=B^{-1}\). The inverse of a history is therefore the reversed sequence with each step cubed.
Forward pass (Definition). The model stores query points \(z\in\mathbb R^{[\text{output blocks},\ \text{stages},\ 8]}\). At each stage a query picks the nearest root of the fixed orbit, and the history between roots composes a signed action \(A_j\). Output block \(j\) selects one atom \(\sigma(j)\) and transports it: \[y_j \;=\; A_j\,x_{\sigma(j)} .\] The forward is a gather and a sign. The input adjoint is the exact inverse action, \(A_j^{-1}\delta_j\), scattered to the selected atom. No coefficient exists for any input-output pair (proof, by construction).
Credit for the query (Definition). Selecting a root is a hard choice. The query credit is a declared secant surrogate on root edges: force each lawful sibling, reroute its descendants, pair the output credit with the displacement of the carried block, and resolve along the edge. It is not the derivative of hard selection.
The capacity question (proof of the count, hypothesis of the consequence). Each output block reads exactly one input atom, so an output block has one connection where a dense projection has all of them. Whether one transported atom per block is enough, or whether a small routed set per block is needed, has not been compared.
The path runs on the GPU only; the CPU fallback is refused.
Rule check.
- D11 (integer serving): the float form (32-bit and half-precision) is not servable. Sign flips, permutations and table reads need no multiplier, and the integer descendant in
crates/uor-r4-discreteis integer-only on the GPU. - D23 (no softmax): no probability weights, no normalised exponentials and no learned input-output coefficient grids; selection is hard by distance. The no-softmax counter was 1649 of 1649 on the delivering PR.
- D25/D30 (no dense matrix multiplication): retires the dense Hamilton contraction. The no-matmul counter fell from 95 to 93. Static table construction reads no model tensors and is not model compute.
- D32/D37: the float form was frozen by D32 and can return only by re-registration under D37. The integer transport is the substrate D32 names as the backbone, and it is the ACTIVE model path (decisions).
What has been tried
Rows marked "integer form" test the ACTIVE descendant, not the READY float form.
| Date | What was run | Result | Verdict | Record |
|---|---|---|---|---|
| 9 Oct | Source review of hosted SpiralCore v69 (240 E8 roots, 15 bivectors, search routes, exact inverses) | Keep the exact finite-action machinery as an input. Not promoted as a model integration. No runtime executed. File 1,025,707 bytes | inconclusive | review |
| 12 Oct | Persistent base-3 tree per 600-cell vertex retaining keys by learned salience (the "starling" tree), float stack with a softmax teacher from before the softmax ban, 3 seeds, context 1,536 | The tree met its own target: hit rate 0.99, 0.68, 0.90 (bar 0.85 on 2 of 3 seeds). Recall missed its bar: 0.031, 0.615, 0.340, mean 0.329 against 0.54 (softmax 0.999, ring-only 0.241). The readout, not the tree, now limits | positive for the tree | record |
| 12 Oct | Signed-matrix composition rewritten as direct signed-axis permutation, no generic 8×8 multiply | Static algebra checks pass. Not a shared writer, a learning rule or a GPU kernel. No throughput claim | positive | record |
| 12 Oct | Finite-kernel check of the float projection on a rented RTX 5090 (CUDA 12.8), no model, no training | Four GPU tests, three static-plan tests, two projection tests and the retired-dense refusal test all pass: all 27 terminal children of a three-level binder, the selected-input adjoint, a two-atom secant, shared credit, and 32-bit and half-precision controls. Exact fixtures show zero absolute error; secant controls within \(10^{-5}\). Cost about $0.17 | positive | record |
| 13 Oct | Product head that reads the projection through one shared embedding table | Qualified at finite GPU boundaries; at most 16 cells × 32 slots = 512 comparisons (128 by default at vocabulary 4,096). No training | positive | record |
| 13 Oct | 18 finite controls (11 on CUDA, 7 metadata or argument checks) at the first-rung shape with this projection and the product head | 18 of 18 pass on source 05c84bece; peak GPU 9,274 MiB. No optimizer update, no quality number | positive, controls only | record |
| 13 Oct | Integer form: context, tree routing and rotation into a shared integer writer, learning by proposals only | All eleven construction controls pass after the test-fitness review (first attempt: 1 pass, 1 GPU launch-resource stop, 9 NOT_RUN). Virtual proposal witness 640 to 544; applying updates never ran | positive, controls only | record, census |
| 14 Oct | Integer form: native driver and GPU evaluator, vocabulary 4,096, batch 4, context 192, 64 rows | 25 controls and the operation-cost measurement pass. Forward 37.84 ms (routed read) and 40.58 ms (flock read). One counterfactual proposal 3.9 s. About 17.8 hours per fixed-batch coordinate sweep, an UNVERIFIED estimate | positive, controls only | record, census |
| 14 Oct | Integer form: first 1,640-batch training pilot, seed 1, one RTX 5090, 236 accepted updates | Top-8 correct rows 173 to 1,169; top-1 17 to 82; but the loss numerator rose 13,816,032 to 13,884,032. Later traced to an initializer giving only 16 distinct vectors (155 of 4,096 identities after training) | inconclusive | record |
Reading these honestly. The float form has only correctness evidence: exact fixtures and finite controls, with zero optimizer updates. The weak recall in the tree row was a readout failure, since the tree kept the source (hit rate 0.99 on seed 1) while the table readout failed to use it (recall 0.03). The pilot rise in loss traced to the initializer, not to the transport. The ban, not a negative result, retired the dense contraction this replaced. The integer rows show the mechanism builds and runs; they do not show it helps language.
What has never been tested
- Training the float projection. Zero optimizer updates have run on it, and no language measure exists.
- Whether the secant credit yields descent. The pair credit is declared, not proved.
- Capacity of one atom per block against an all-input mixing projection. No capacity or cost comparison was run.
- Input-conditioned behaviour. Selection by shared learned queries does not by itself make the read depend on the input.
- Coverage of all 240 E8 roots. Only one 16-root anchor orbit is used, with no independent partner space and not the complete external tree object.
- Tokens per second or energy against the retired dense arm, and any integer export of the float form.
What would reopen it
The float form is READY, so these are the steps to make it ACTIVE.
- A new D37 sheet in a separately scanned float module, with a fresh test-fitness review, the owner release that applies, an export gap, and the shared writer and geometric head as dependencies.
- Show that the secant credit gives descent (a falling loss, or a comparison with a random-refit control) and that routing is stable. Neither has been measured.
- Justify the total number of 8-dimensional blocks in advance, and record that each output block reads one atom, so a capacity comparison against a mixing projection is needed.
- Fresh transfer and D22 noise requirements for any KEEP, and tokens per second on the same GPU harness against the retired dense arm.
Open questions: does one atom per output block lose too much against the all-pair sum, and can a small routed set per block recover it; can the secant credit be compared with the discrete counterfactual-and-choose rule on the same carrier; how many 8D blocks are enough (the 6,560-atom bound is operational, not a quality bar, and no 384-dimensional dependency is adopted); and would a float trunk add anything beyond the integer path that already runs. These are hypotheses.
Also known as
projection=spiralcore_fbs; SpiralCore BFS plus Atomic Ternary FBS; quaternion_weights=spiralcore_fbs; "OP2 native projection" (PR #2279); SpiralCore tree; the HoloBox/FBS base-3 tree (the retention tree).
Code
spiralcore_fbs.rs: the static compiler (binders, histories, actions, inverses, artifact hashes) and the custom operation, schemaspiralcore-fbs-projection/1.spiralcore_fbs.cu: GPU forward, input adjoint and secant kernels.spiralcore_operator.rs: exact signed 8×8 matrices, the Clifford generators and the finite composition table.native_vector_writer.rs: the shared vector writer fed by the projection.discrete.cuandbuild.rs: the ACTIVE integer descendant and the exact 64-state geometry tables it imports.- The dense source this replaced is preserved as an indexed patch:
archive/history/branch-archive/INDEX.md.
Audit source: docs/labs/repo-renormalization-2026-10-19/audit/mechanisms/spiralcore-fbs.json.
Related mechanisms
discrete-learning: the integer form of the same transport is the ACTIVE model path. flock-read: flock reads transport payloads through the same actions, with the starling tree as the retention layer. spin-weights: this projection replaced the dense quaternion contraction. hamilton-gate: the feed-forward partner of this projection. recurrence-gates: shares the secant credit pattern. route-read: the routed read selects ports by comparing the transported query with fixed branch roots. e8-orbit-memory: the same E8 root orbit used as exact addresses. ternary-xor: the ternary binder tree and trit gates.
Geometric stack (layered quaternion-recurrence language model)
Status: PARKED. The version that was trained leaned on arithmetic the project later banned (softmax reads, sigmoid and SiLU gates, dense matrix products), and it never met the first milestone's bars. Its quaternion "spinner" idea was kept. A rules-compliant rebuild exists only as a small, untrained extract. See what would reopen it.
Labels used below: proof means derived from definitions or code, measurement means a recorded run, hypothesis means an untested idea. See docs/formal_vocabulary.md.
In plain words
This was the project's main trained language model from late September to mid-October 2026, between 7 and 214 million parameters. It reads text through a stack of layers. Most layers carry a running memory made of four numbers, a "spinner" called a quaternion. At every word the spinner is turned a little and the old memory fades. A few layers look back over earlier words, and every layer ends in a small feed-forward block. It was trained on GPUs, then rounded to whole numbers so a laptop could run it. It produced chat-style replies, though only 43 of 232 reply checks passed and it was served through the integer engine on pod CPUs. It used arithmetic the project later banned, and it never reached its quality bars.
What it replaces in a transformer
The whole network. The recurrence layers do the job that attention does in a transformer, carrying context forward. The read layers and feed-forward blocks, though, are the transformer's own parts. The project's own audit in October found that the served model was a transformer-shaped dense stack with a quaternion-mixed residual. The geometry was a thin layer inside it (see the figure).
Left, where one token's arithmetic went in the 29-million-parameter stack. Middle, what one recurrence lane does. Right, which parts of the trained form the later rules allow.
Its chapter in the project's history
- 26 to 30 August (planning a decoder). Before building a stack, the project checked whether ordinary attention could live inside the geometry. A rotation-frame version of softmax attention matched a donor model's logits to within 1.05e-5, but it carried no meaning of its own. Trace distillation added nothing (#1002, #1011).
- 30 August. A 7.16-million-parameter softmax language model in R4/Spin frames showed learned attention matters: loss per token 2.1274 with it, 4.8048 without. A single frozen continuation to 150 million tokens ended at 1.5728, short of its 1.50 bar (#1014, #1017).
- 25 September. A 1.68-million-parameter recurrent learner with quaternion transport lost narrowly to a matched ordinary one (2.110 against 2.085) (#1389).
- 27 to 29 September. A capacity-matched layered stack reached parity with a transformer control, and the owner made multiplier-free serving the one contract for every lab (D11, #1437, #1443). The stack became the main line.
- 6 to 10 October. The first chat stack was trained, exported and served end to end (#1893). Matching the training data mattered more than adding parameters (#1913). Memory and reply targets were missed.
- 11 October. An arithmetic audit showed the quaternion rotations were 0.05 percent of the arithmetic (#2186).
- 12 to 13 October. The bans on softmax, matrix multiplication and squashing functions arrived (D23, D25, D29, D30). Thirty-three kernels carrying banned content were moved out of every compiled module, and a 24-kernel lawful extract was kept. The discrete path (
crates/uor-r4-discrete) then became the live model.
How it works
Layer pattern (definition). Layers repeat in a pattern such as rrarra. Each r is a recurrence layer and each a a read layer. Every layer is followed by a feed-forward block, inside a residual stream with RMS normalisation.
Recurrence (definition). Lanes of four channels hold a quaternion state \(h_t\). Per token,
\[h_t = \lambda_t\,(u_t \otimes h_{t-1}) + \sqrt{1-\lambda_t^{2}}\;c_t ,\]
where \(\otimes\) is the Hamilton product, \(u_t\) is a unit quaternion computed from the input (it starts at the identity), \(\lambda_t\) is a gated decay with timescales spread from 2 to about 1,000 tokens, and \(c_t\) is a width-4 causal convolution of the input. Multiplying by a unit quaternion is a rotation of 4-space, so \(u_t\) turns the memory without changing its length.
Reads and feed-forward. Read layers attend over earlier positions with a dot-product, Euclidean or Lorentz hyperbolic-distance score. Feed-forward blocks are SwiGLU with dense projections. Optional parts were a copy-pointer head, a product-key memory that replaced a feed-forward block or the last read, and flock or starling rank reads.
Training and serving. Trained in float on GPU at 7M, 19.9M, 29M and 214M parameters, then exported to 4-bit grouped weights and served by the integer engine described in lut-serving.
Where the arithmetic went (measurement, an operation count of the deployed 29M stack, width 576, 10 layers). Of 30,270,720 multiply-adds per token, the feed-forward blocks took 39.6 percent, recurrence projections 31.0 percent, reads 16.6 percent (40.5 percent at 4,096 tokens of context) and the output head 7.4 percent. The quaternion rotations took 16,128 multiplies, or 0.05 percent. The prime addresses, zeta phases and exact store took none, because they were not in the trained base (geometry audit).
Rule check.
| Rule | Verdict for the trained form |
|---|---|
| No softmax or squashing anywhere (D23) | Broken. Softmax reads, a sigmoid decay gate, a softplus-shaped decay rate, SiLU in the feed-forward block and a GELU output gate |
| No matrix multiplication (D30) | Broken. Dense projections and feed-forward blocks are matrix products, and the old kernels used tensor cores |
| Integer serving (D11) | Served bit-for-bit against its quantised reference, but every weight is read for every token (about 30.2 million parameters at 29M), which the sparsity rule calls non-compliant |
| Offline float, with an export gap (D37) | Float training would be legal again only in a separately scanned module with lawful parts. Past export gaps: 0.00883 bits per byte on identical positions for the 19.9M stack, and +0.0257 nats with GPTQ on the 7M stack |
What has been tried
"Development" means a panel used while fitting. A "control" is a matched comparison model; transformer controls were allowed when these runs were made and are not allowed now (D28).
| Date | What was run | Result | Verdict | Record |
|---|---|---|---|---|
| 26 Aug | One geometric mixer layer inside SmolLM2-135M, then distilled with a memory adapter | Decodable, cycle-free output (32 tokens, 4 of 5 prompts responsive). The distilled version scored a 4.4416% advantage against a 5% bar on 9 held-out positions | positive, then negative | spike, qualification |
| 30 Aug | Trace distillation into a geometric recurrent suffix | Frozen suffix 2.660721 against geometric 2.660705; nothing added on 9 positions | negative | record |
| 30 Aug | 7.155M R4/Spin softmax model, then one continuation to 150M tokens | 2.1274 with attention, 4.8048 without; sealed 1.5728 against a 1.50 ceiling. Attention kept, campaign closed | negative | record |
| Aug to Sep | Prompt-capacity rungs, and multi-query recall | Paired-H4 addresses won 282 of 512 against 308 needed. A copied recall cell scored 11,900 of 12,000, so earlier binding failures came from the recipe | negative | capacity, recall |
| 25 Sep | 1.68M recurrent learner, quaternion against matched ordinary transport, one seed | 2.110368 against 2.085241; prose stayed poor | inconclusive | record |
| 27 Sep | Capacity-matched rrarra stack against a transformer control, 7,324 updates, one seed | 1.998113 against 2.011149 and equal speed. The stack led early; the lead closed by about 2,750 updates. Parity, not advantage | positive (parity) | record |
| 28 Sep | Quaternion against identity transport, 1,000 updates, two seeds | Gap 0.0711 and 0.0774 nats against a 0.02 rule. Development only; the core still held banned parts and the identity arm had 332,928 fewer parameters | positive | record |
| 28 Sep | Export of the 7.15M stack to 4-bit, and other rounding recipes | +0.0362 (nearest) and +0.0257 (GPTQ) nats against a 0.02 gate. Snapping rotations to icosians cost +0.026 | negative | record |
| 28 Sep | First dialogue-trained stack | Loss beat its bar (2.520916 against 2.773887), but 2 of 38 replies answered the request and 0 of 10 memory recalls worked | positive on loss | record |
| 29 Sep | E8 lattice coding of SmolLM2-360M weights | Kill rule triggered at 3 bits (+4.96 nats). Negative for this uncompensated version only | negative | record |
| 6 Oct | Geometric read stack against a matched transformer, 3 seeds, multi-query recall | Geometric 0.0073, 0.9995, 1.0000 against control 0.2529, 0.2510, 0.2563. One failed seed, so the pre-registered rule returned inconclusive | inconclusive | report |
| 8 Oct | 19.9M chat stack trained, exported, served end to end | Served 0.9550 bits per byte on 64 windows (the previous served artifact scored 4.3885 on the same corpus). The float figure 0.8770 is a 512-window number and is not comparable; on identical positions the rounding cost is 0.00883. Earlier null results had used models below uniform | positive | record |
| 8 Oct | Data against size | In-domain data was worth 0.159 bits per byte, extra size 0.084. A 214M stack (1.0966) lost to a 7.16M chat-only one (0.9607) | positive | record |
| 9 to 10 Oct | 29M chat stack on the memory panel, and recall-share doses | 10 of 40 against at least 34. In the doses, memory rose from 10 to 20 of 40 at a 10% recall share, but replies fell from 43 to 22 of 232 as the share rose to 55% | negative | v5, doses |
| 10 Oct | Product-key memory in 4 of 10 layers, 2 seeds | 19 of 40 on both against a 27 of 40 bar | negative | record |
| 11 Oct | Product-key memory at the last read layer (a correction note says it replaced the feed-forward block there), 3 seeds; then a lean codebook | Wrong-value answers 47 to 34 of 120 with the headline flat at 57 of 120. Cost: 20 times the training time. Lean version lost 0.095 bits per byte against 0.02 allowed | positive, then negative | fat, lean |
| 11 Oct | Arithmetic ledger of the deployed 29M stack | Geometry was 0.05% of the arithmetic | diagnostic | record |
Reading these honestly. The stack reached parity with a transformer control at small scale, and it was served bit-for-bit through an integer engine. The quaternion transport kept its place in the core on a development measurement. But the pieces that did the work were dense ones, the recurrence was never shown to help in a model built from allowed parts, and no run met the memory or quality bars. A loss win was not a conversation.
What has never been tested
- A stack built only from allowed parts (Hamilton-gate feed-forward, power-of-two recurrence, rank or flock reads), trained at the scale where this one reached 0.877 bits per byte. The 24-kernel extract is qualified at small finite checks only.
- Product-key memory layers with fixed H4 and E8 codebooks (cycle 5; held, never run).
- Trained-in icosian or E8 read addresses with their length carried.
- The Lorentz read at chat scale. The chat base trained with the flat Euclidean read.
- A larger chat data set than the 82-million-token split (none was reachable).
- A fair energy measurement. The only figures come from a truncated capture and a table-emulation test that cost 4.3 times more.
- A step-matched control for the 22 of 40 reading that the half-length memory run produced.
What would reopen it
- A new pre-registered sheet that rebuilds the stack from allowed parts only, in its own scanned module, with the owner's release (D37). It needs a
TEST FITNESS: FITreview first. - Report the export gap on the same evaluator as the float score, and aim at the served bar (at most 0.90 bits per byte on the chat held-out stream).
- At least 2 seeds or 200 fresh rows (D22), compared only with earlier native rungs and count-table references (D28).
- Replace the dense hotspots (feed-forward 39.6%, recurrence projections 31.0%) with addressed or exact-geometry reads, and show that tokens per second move on the product path.
- Optional: the quaternion adapter in the post-dose plan (optimization path), conditional and measured against the ceiling.
Also known as
rrarra / rrarrarr / rrarrarrar stack; cycle-4 stack (geometric_s1); chat-29m-B; the 19.9M chat stack; 214M pretrain geo-214m-e448de86; R4/Spin softmax reference (#1014, #1017); joint recurrent learner (the 1.68M precursor); StackArch::Geometric; geometric_stack_native (the lawful extract).
Code
geometric_stack.rs: the historical float stack (36,976 lines). Inactive source.geometric_stack_native.rsandgeometric_stack_native_cuda.rs: the qualified extract. Only the allowed projection, recurrence and shared writer run (24 prebuilt kernels).cuda_stack.cu: the historical kernel source. Thirty-three banned kernels are excluded from every compiled module.stack_memory.rs: the product-key memory.stack_export.rs: the exporter, compiled out.joint_model.rs: the September precursor.chat-grade.rs: the chat and memory scorer.geometric-stack-native.rs: the current example entry.session.rs: the integer engine that served these stacks.- Evidence: served stacks, module split, cycle 4.
Related mechanisms
lut-serving: the engine that served these stacks bit-for-bit. spin-weights: icosian-pair weights, the allowed form of the stack's quaternion maps. recurrence-gates: the allowed form of the gated recurrence. hamilton-gate: the rotation gate that replaces the SwiGLU block. flock-read and route-read: softmax-free reads for the attention layers. exact-memory and e8-orbit-memory: stores meant to replace the dense feed-forward block and read. read-binding and pointer-key: the supervised read and copy head added here. spiralcore-fbs: the projection the extract runs. rank-margin: the allowed loss. native-geometric: the parallel from-scratch engine. r4g1-graph: the earlier approach this stack replaced. discrete-learning: the live model that took over.
R4G1 compiled lookup graph (teacher-to-tables)
Status: PARKED. Its gains were measured while the teacher's own text was supplied, and they never turned into coherent text the model wrote itself. Building the tables also needs a transformer teacher, which the project now bans. The packed file format and the frozen run-time program stay as a tested, multiplier-free reference. The owner decided on 19 October 2026 to repair the legacy crates around this mechanism so they build again; that restores the build, not the mechanism. See what would reopen it.
Labels used below: proof means derived from definitions or code, measurement means a recorded run, hypothesis means an untested idea. See docs/formal_vocabulary.md.
In plain words
This was the project's first approach, from June to August 2026. Let an ordinary language model, the "teacher", read a lot of text. Record what it prefers in each situation and store those preferences as huge lookup tables. To answer, a small program finds the matching table row and picks the best next word using only whole-number adds and comparisons, with no multiplying. On a held-out set of 72,130 positions its table choice agreed with the target word 29.52% of the time, against 28.12% for the earlier runtime. It never wrote coherent text on its own, and building the tables needs a transformer teacher, which the project now forbids. The file format and the run-time program are kept as a tested reference.
What it replaces in a transformer
The whole engine, at run time. Instead of running attention and feed-forward layers, the program hashes the last few words into a table address and adds up stored scores. The price is that the knowledge is copied from a transformer, so the lookup tables can be no better than what the teacher showed them.
Left, how a teacher becomes a table and how a token is read from it. Middle, the main held-out result and its controls. Right, more text kept helping with no knee.
Its chapter in the project's history
This was Phase A of the project, from 10 June to 26 August 2026 (eras 1 to 10 of the project history). Dates below are the days issues or pull requests were opened.
- June to July. The first code was a router over sparse 512-dimension prime vectors (#1). The R4G1 file format, certificates and the rule that only serving must be multiply-free and allocation-free followed (#11, #157). This stretch was mostly structure.
- 23 July to 3 August. The first quality chain started at 0.3 percent accuracy against a 31.7 percent baseline (#65). A metric that read zero had hidden a real loss (#102). A store built with shift-and-add arithmetic and zero multiplies matched and slightly beat a larger earlier one (#243).
- 3 to 12 August. Geometry was tried as an index. E8 codebooks beat plain sign codes at equal bits (#395). Hopf projection and the zeta-grid routing headline failed (#430, #440). SmolLM2-360M became the pinned teacher (#509).
- 10 to 19 August. Recompilation and serving. A record-ordering bug turned out to be a major cause of garbage output (#755).
- 19 to 26 August. A staged plan (S0 to S7) set a truth baseline of 29.52 percent against 28.12 percent (#821). Calibrated abstention, free-running text and planning all ended at their stated limit, and one lane was inert (#946). On 25 to 26 August the maintainers reset the plan: coherent free-running generation had never been shown, so a learned geometric decoder became the goal (#948, #949).
- Afterwards. The no-multiply rule became the serving contract for the whole project (D11, see lut-serving). Later decisions retired the float and softmax parts of the old compiler from the core, so the graph crates stopped building against it (D36).
How it works
Offline (compile). A teacher transformer (SmolLM2 or GPT-2) runs over a corpus and its preferences are recorded. A compiler packs them into an R4G1 graph, a content-addressed file holding:
- records keyed by hashed context codes (recent-token n-grams and prefix regions);
- a cover of regions induced by entropy-gain splits;
- pre-rounded integer score tables for each region;
- optional extra lanes (skip-mix candidate injection, segment, trajectory);
- certificates comparing the graph with the teacher on held-out positions.
Compilation, certification and every teacher run are offline and unrestricted.
Online (run). To pick the next token the program:
- hashes the recent tokens into a context code;
- takes the exact-context record, or the best-matching region (nearest match over compact bit signatures by counting differing bits, scored with a shift-and-add dot product in place of a multiply);
- adds each evidence source's stored integer scores, each counted once, saturating at the limits;
- breaks ties by a fixed rule and emits the best token.
In symbols (definition), with \(E\) the set of evidence sources found and \(r_e[t]\) the stored score of token \(t\) from source \(e\) in fixed-point arithmetic (\(v\) is stored as the integer nearest to \(v\cdot 2^{16}\)):
\[S(t)=\operatorname{sat}\Big(\sum_{e\in E} r_e[t]\Big),\qquad \hat t=\arg\max_t S(t).\]
The frozen kernel contract permits only XOR, AND, OR, shifts, rotates, bit counting, integer add and subtract, comparisons and table reads. There is no float, multiply, divide or allocation after setup (inference contract).
Geometry tried inside this frame. Prime and zeta-phase routing keys, Hopf S3-to-S2 observation, E8 and 120-root codebooks, H4/icosian frames, max-plus route composition and Furey algebra modules. Only the E8 codebook (better than sign codes at matched bits) and the integer shift-and-add dot product kept measured value. The rest tied or lost, and the Furey modules were never wired into inference.
Rule check.
| Rule | Verdict |
|---|---|
| Integer serving (D11) | The frozen kernel is D11's ancestor and is compliant as a kernel. No per-token parameter-access count was recorded, so the sparsity rule (D5-b) is unmeasured |
| No softmax (D23) | Run-time scoring is softmax-free by contract. The offline path used the teacher's probabilities, and the retired compiler and runtime modules carry float and softmax content that may not be restored |
| No matrix multiplication (D30) | The frozen runtime has none. Compiling needs a transformer forward pass, which is banned anywhere, and no transformer teacher or comparator is allowed (D28) |
| Offline float (D37) | Float compiling would be legal in principle, but the teacher is separately banned. Nothing here is on the discrete GPU path, and the graph crates no longer build against the current core |
What has been tried
"Top-1" means the table's first choice matched the target token. "Teacher-forced" means the teacher's own text was supplied as the context.
| Date | What was run | Result | Verdict | Record |
|---|---|---|---|---|
| 23 Jul | Honest test of 16 candidate residual terms | Every candidate degraded held-out scoring (+0.64 to +2.25 bits per token). The fake metric was reverted | negative | #102 |
| 28 Jul | Shift-and-add store with graded signatures | 30.7 / 34.3 top-1 / agreement, 47,476 keys, zero multiplies, against 28.2 / 31.9 for the earlier 134,733-key store | positive | #243 |
| 29 Jul | Graph file read through the graph path | 0.0% on held-out while the same bytes read 28.2% through the store path. A decoder-grammar defect, not a format verdict | negative (defect) | #280 |
| 1 Aug | Corpus size from 150k to 500k records | No knee. The integer runtime at 500k (33.4 / 37.3) beat the float ceiling at 150k (32.1 / 36.4); about +1.5 to +1.8 points per doubling | positive | #327 |
| 1 Aug | SIMD version of the shift-and-add scan | 3.82 times faster alone (3 needed) but 1.3 to 1.56 times end to end (2 needed). Closed | inconclusive | #330 |
| 3 to 5 Aug | Phase-clock rows; router anchors; Hopf index | Phase rows 12.5% and 16.7% against 34.7%. Router anchors 7.6% against unigram 2.1% and shuffled 3.1% (true anchors 31.5%). Hopf index: 6.1 times occupancy spread but retrieval 0.0045 against 0.0743 | negative / positive | #392, #428, #430 |
| 5 Aug | Band-matched controls for the zeta-grid headline | The 0.89 headline came from storage: full-width content vectors scored 0.8948 | negative | #440 |
| 6 Aug | Reconstruction against a scrambled null and a unigram floor | Real tables 0.0148 top-1; unigram floor 0.0636. Graph-only reconstruction sits below a unigram. More regions or a better codebook capped near +0.15 points | negative | record, #460 |
| 8 Aug | SmolLM2-360M observed on broad text | The ceiling was set by the teacher, not the store; controls recorded alongside | inconclusive | #509 |
| 12 Aug | Max-plus multi-hop routes | 14.51 bits against a null at 8.57. The transition graph was dominated by self-loops | negative | #626 |
| 17 Aug | Recompile after fixing record order | Output became grammatical but ignored the prompt | positive | #755 |
| 19 Aug | S0 truth baseline, 72,130 held-out positions | 21,293 correct (29.52%) against 20,284 (28.12%) for the earlier runtime, paired difference +13.988 per thousand [11.057, 16.919]. Holds for that exact bundle only; not a general 30% | positive (exact scope) | record |
| 19 to 21 Aug | Segment lane; calibrated abstention; skip-mix lane | Segment ceiling 19.0 per thousand against a 20 floor, 1 of 10 faithful. No calibrator met its gates. Skip-mix followed 41 of 87 pairs against 53 needed (fixed later: +28.45 per thousand, but only on a reference harness, off the serving path) | negative | segment, calibration, skip-mix, causal |
| 21 Aug | How much of the free-running error a correction could reach | About 1 per thousand (3 of 3,200 steps) against 100 needed. The correction rounds were not launched | negative | record |
| 22 Aug | Equal-budget test of geometric arms | No geometric advantage under equal budgets | negative | #929 |
| 25 Aug | Trajectory-signature routing in the exact bundle | Reached in production on 20 of 20 canary positions, changed zero candidate lists and zero tokens | negative (inert) | record |
Reading these honestly. The store worked as a lookup, and more text kept helping. But exact-context lookup dominated what was served, so extra regions and lanes had little room to matter (#460, #946), and the broad-text ceiling came from the teacher (#437). Nothing here shows the model writing coherent text unaided. Several failures were defects of the instrument or the conversion (#280, #102, #440), not of the format.
What has never been tested
- A graph compiled from a non-transformer source, such as exact tables read out of the native discrete model.
- Free-running coherence of any compiled bundle. The correction rounds were never launched.
- Measured laptop tokens per second or energy of the frozen runtime as a serving engine on today's machine.
- Stages S3 to S7 of the completion plan. The reasoning stage is not established and its final grid was not run.
- Learned (rather than compiled) routing inside the graph.
- A collision screen on a registered real trace bundle. That one is unavailable, which is not a negative.
What would reopen it
- Decided on 19 October 2026. The owner chose to repair, not archive,
graph-compiler,graph-certify,api,proof-modeland the root crate on the current core (charter, section 2). Repair restores the build only; this mechanism stays PARKED. - A compile source that is not a banned transformer teacher, such as tables read out of the native discrete model. The one-time donor corpus of D41 gives hard targets for training only, and not for graph compiling unless a new decision says so.
- A fresh pre-registration with a
TEST FITNESS: FITreview, at least two seeds, scored against count-table references on free-running generation, not on teacher-forced agreement (D22, D28). - Adoption of the packed container and frozen kernel as the export container for the served model (milestone M4), with the export gap reported (D37).
- Any added lane must change served tokens at deployed reachability. The trajectory lane changed none.
Also known as
R4G1; TLA / TLA6 / TLA7 runtime; transformerless graph; graph compiler and certifier; the frozen no_std kernel; skip-mix lane (RF-31); segment lane; trajectory routing lane; Phase B shift-and-add store; the Geometric Intelligence Programme stages S0 to S7.
Code
graph-format: the R4G1 container, two-stage validation and a canonical serializer (11,450 lines, 187 tests). Frozen.scoring_semantics.rs: the saturating fixed-point score rules.graph-runtime: the multiplier-free table kernelpredict_step(4,946 lines, 53 tests). Frozen.proof-model: the executable proof specification for allocation, bounds and top-k determinism. To be repaired.graph-compiler(34,424 lines, 28 stages) andgraph-certify(25,799 lines): compile and verify graphs against the teacher. Historical; to be repaired.graph-cliandapi: the command-line library and the typed facade.model-source: the teacher side, kept as a comparator.transformerless/runtime.rs: the original in-core runtime, retired.- Inference contract: the normative list of permitted operations.
- Evidence: S0 baseline, baseline audit, matrix-operation census.
Related mechanisms
lut-serving: the later integer runtime that carries the same no-multiply rule to learned stacks. prime-zeta-codebook: prime and zeta routing first appeared here as graph keys. route-read: router anchors and the nearest-match tree were this line's early read. e8-orbit-memory: E8 codebooks beat sign codes at matched bits here. hopf-observation: the Hopf index measured negative here. native-geometric: the from-scratch engine that replaced compiled tables with learned state. geometric-stack: the learned float model that replaced the teacher-compiled graph.
D11 integer table serving (UORLUT01)
Status: ACTIVE. It is the end-of-pipeline contract: the finished model must ship as one integer artifact, and this engine runs it. The engine reproduces its reference answers exactly, and its zero-multiply audits are green. But no model built under today's rules has been exported through it yet, and the models it has served were not good enough. It is ACTIVE as the export boundary; no model built under today's rules has gone through it yet.
Labels used below: proof means derived from definitions or code, measurement means a recorded run, hypothesis means an untested idea. See docs/formal_vocabulary.md.
In plain words
This is how a finished model runs on an ordinary laptop or in a web browser using only whole numbers: adds, shifts and table look-ups. There is no decimal arithmetic and no multiply instruction. A trained model is exported to a compact file, mostly 4-bit numbers. A checker then reads the compiled program and counts machine instructions to prove that no multiply sneaks in. The engine reproduces its reference answers exactly, and the checks are green. But it has only served older models that fell short of their bars, and no model built under today's rules has been exported through it.
What it replaces in a transformer
The arithmetic. A transformer runs on large matrix multiplications. Here the same weights are read through tables, so every product is a table read and an add. This changes how a model is computed, not what it is. The engine does not make a weak model better, and, as the history below shows, it still reads every stored weight for every token.
Left, how a dot product needs no multiply. Middle, the engine is exact and the loss is in rounding the weights. Right, the audit counts instructions in the compiled program.
Its chapter in the project's history
- July to August. The first multiplier-free runtime came from the compiled-graph approach (r4g1-graph). Its contract said only serving must avoid multiplies and allocation (#157).
- 25 September. Learned attention, recurrence and rotation from two 1.68-million-parameter models ran with integer arithmetic and tables, and the standalone integer library reproduced the saved distributions (#1397).
- 26 to 29 September. An interim "D10" engine allowed multiplies and a softmax table. On 27 September the owner replaced it: D11 made multiplier-free, transformer-free serving the one contract for every lab (#1443). A first energy test found table emulation of every product used about 4.3 times more energy than float (#1449).
- 8 October. The first chat model was trained, exported and served end to end (#1893). On 10 October three 29-million-parameter models served at 1.20 to 1.24 bits per byte, and four softmax-free serving reads missed their bar.
- 12 to 13 October. The bans on softmax and matrix multiplication moved the older multiplier-allowing engines out of every build (D29).
- 18 October. D37 made the integer export the boundary: training may use float, serving may not. The native zero-multiply audit went green (#2655) and a contributor-built WebAssembly runtime followed (#2654).
- Next. Export one discrete model through the container and measure the export gap (milestone M4).
Under the charter, serving this artifact on client devices (CPU, browser WebAssembly, Apple silicon) is the product and is allowed.
How it works
Export. Training is offline and may use float. For serving the weights go into a UORLUT01 container. Weights are 4-bit codes in groups of 32. Each group has a one-byte scale (a 4-bit mantissa and a 4-bit exponent). A few small integer tables cover the nonlinear steps (square root, decay rates, SiLU, arcosh, exp).
One projection (definition). For a weight matrix \(W\) and an integer activation vector \(x\), the output is \(y_i=\sum_j w_{ij}x_j\), where each weight is a group scale times a 4-bit code, \(w_{ij}=s_g\,q_{ij}\) with \(s_g=m\,2^{e}\). The engine does not multiply \(q_{ij}\) by \(x_j\). For each activation it builds a 16-entry table \(T_j[q]=q\,x_j\), which needs only additions to fill, and then reads \(T_j[q_{ij}]\) for each weight. Four output rows are blocked to reuse the table. The scale \(s_g\) is applied by shifts and adds.
Products of two runtime values. A score, a gate or a value mix needs a true product of two numbers known only at run time. The engine builds a table of the sixteen multiples of one operand by repeated addition, reads it at each base-16 digit of the other operand, and sums the reads with shifts: \(ab=\sum_k 16^k\,T_a[d_k(b)]\), exact by the definition of base-16 digits (proof; stack_mul_u64 and stack_mul_u128 in kernels.rs). The quarter-square identity would also be allowed, but the serving engine does not use it. Normalisation uses an integer square root or a table. Sampling is integer min-p.
Session state. A conversation's state is saved and restored byte-for-byte (the UR4SESS1 format).
The five rules (D11). R1: no floating point and no maths library. R2: no multiply or divide instruction. R3: dense per-token access to a learned store is interim, not the end state (D5). R4: no transformer backbone. R5: energy is claimed only when measured.
The audit. The release binary is disassembled, and the multiply, divide and float instructions are counted over the serving symbols, natively and in WebAssembly. The audit proves absence of those instructions. It says nothing about model quality, and the SIMD kernels in the WebAssembly build are unintegrated fixtures that the 7-of-7 audit never exercises (record).
Geometry, as exact finite tables. The 120-element icosian group's Cayley table (about 14 KiB), a 1,025-entry arcosh table for Lorentz read scores, icosian-pair weights and the Q30 Hopf observation are stored as tables. The current integer crate selects typed H4 geometry and checked integer arithmetic for the discrete model's own export (native_geometry.rs).
Rule check.
| Rule | Verdict |
|---|---|
| Integer serving (D11) | This is D11. Exact against its quantised reference on every windowed check, with zero multiply, divide and float instructions on the audited symbols. The gap: about 30.2 million parameters are read per token for the 29M stack, which the sparsity rule (D5-b) calls non-compliant. Cache residency (D5-a) is unmeasured until hardware counters exist |
| No softmax (D23) | Partly non-compliant today. Schemas 1 and 2 serve softmax attention through exp-table masses. Schema 3 serves a softmax-free flock rank read, but the trained arms missed the bar |
| No matrix multiplication (D30) | Table-read matrix-vector products stream every weight each token, which D5 calls a dense multiply in disguise. The allowed target is selected addressed reads and exact geometry tables |
| Offline float, with an export gap (D37) | Float training is legal offline. Every candidate must report its export gap on the same evaluator. No discrete-path export exists yet |
What has been tried
"Gap" means served minus float score. "Bits per byte" (BPB) is the model's loss on a held-out chat stream, lower is better; the milestone bar is at most 0.90. The D10 engine is the older engine that allowed multiplies. A "D11 minus D10" loss of 0.0 therefore means the multiplier-free engine reproduces the older one exactly.
| Date | What was run | Result | Verdict | Record |
|---|---|---|---|---|
| 25 Sep | Integer execution, then a standalone library, of two 1.68M learned models | Probabilities sum exactly to \(2^{48}\); all 4,096 distribution hashes match; 4.5 to 6.6 times faster after one fix. Language quality unproven | positive | execution, serving |
| 25 Sep | Learned rounding between legal 4-bit codes; two quantisation-aware recipes | Learned rounding +0.0237 and +0.0465 nats against a 0.05 gate (passed). Both quantisation-aware recipes failed (+0.059 and +0.080) | positive / negative | rounding, QAT |
| 28 Sep | Whole-system energy of table-emulated products against float | 0.00413 against 0.00096 joules per token (about 4.3 times worse), about 2.6 times slower. A dense-model result, not a verdict on selected geometry. Power counters were unavailable | negative | #1449 |
| 28 Sep | Export of the 7.15M stack, and other codecs | +0.0362 (nearest) and +0.0257 (GPTQ) nats against a 0.02 gate. Integer arithmetic cost nothing measurable; the gap is weight rounding, mostly the output head. No codec arm met the gate; E8 at about 2 bits per weight lost 2.42 nats. 184.58 tokens/s on one thread was forward throughput, not decoding | negative | export, codecs |
| 29 Sep | Quantisation-aware training for 1,000 updates; the dialogue version | Gap +0.010637 nats against 0.02 (marked pending a re-run); integer arithmetic gap 7.8e-7. Dialogue version: greedy agreement 5 of 58 turns against at least 29 | inconclusive / negative | stack, dialogue |
| 8 Oct | 19.9M chat stack trained, exported, served end to end | Served 0.9550 (64 windows) against 4.3885 for the previous served artifact; the float figure 0.8770 is a 512-window number, so the two are not comparable (see the next rows for the matched gap). D11 minus D10 loss 0.0, maximum logit difference 0. The pipeline had never been run end to end before | positive | #1893 |
| 8 Oct | GPTQ against nearest rounding; a snapped-training route | GPTQ with 64 calibration windows best (0.93277, against 0.93653 and 0.93368). Snapped tuning served worse (0.95540 and 0.95150). Closes that one recipe | positive / negative | GPTQ, snap |
| 8 to 9 Oct | The gap on identical positions; then a matched float / reference / integer triple at 512 windows | Rounding cost 0.00883, then 0.009288 BPB; engine difference about 1e-6 and 2.7e-7. The earlier 0.877 / 0.933 pair mixed 512 and 64 windows. The 0.90 bar is neither met nor claimable on that evidence | inconclusive | #1915, pin |
| 10 Oct | Three 29M artifacts exported and served, 64 windows | Engine exact on all three. Served 1.20138, 1.24402 and 1.24233 BPB against the 0.90 bar. D11 ran at 68 to 80 tokens/s against 127 to 137 for D10 on 8 threads. The gap is the model, not the export | negative (quality) | record |
| 10 Oct | Four softmax-free read arms, two seeds | All missed the 0.01 BPB bar (softmax 0.8772; extra cost +0.0172 to +0.2585). A learned rank table closed 54% of the gap. Closes these configurations | negative | record |
| 11 Oct | Serve product-key memory; context 384, 1,024, 4,096; icosian activation snap | The integer path refuses product-key memory, so its speed case is unmeasured. D11 fell from 63.41 to 30.43 tokens/s across the contexts while its slowness against D10 shrank from 1.66 times to 1.24 times. Snapping after training cost +0.020 BPB | blocked / inconclusive / negative | port, context, snap |
| 18 Oct | WebAssembly runtime, hardened before merge; native audit | 7 of 7 WebAssembly serving symbols with zero multiply, divide and float; 165 tests pass; a saved session reloads identically. Native audit green across 44 symbol ranges. The demo is not runnable from a clean clone | positive | record, project track |
Reading these honestly. Two things are true at once. The engine is exact: every windowed comparison matched its reference to within about 1e-6 bits per byte (exactly, on the 64-window D11-minus-D10 checks), and the audits count zero forbidden instructions. And the models it served were weak, and it is not yet fast. The loss between float and integer is weight rounding, about 0.009 bits per byte on matched positions, not the engine. Table-based products on a dense model cost more energy and time than float. A dense model streamed through tables is still dense, which is why the project's sparsity rule asks for selected, addressed reads instead.
What has never been tested
- Serving a model built under today's rules (discrete or lawful float) through the container. Its export gap is unmeasured.
- Hardware-counter measurement of memory traffic per token (D5-a) and of parameters touched per token (D5-b). Milestone M5 has not run.
- Whole-system energy per token with a validated sampler. The only earlier figures (5.7 and 21.0 millijoules per token) came from a truncated capture.
- Integer serving of a product-key or other addressed memory read. The kernel is not built.
- A comparison with the SIMD kernels on the serving hot path.
- Free-running generation speed. The 184.58 tokens/s figure was input-driven forward throughput.
What stays frozen, and what would restore it
This mechanism is active, so nothing here needs reopening. Two sub-parts are held:
- The D10 engine and its SIMD crate stay frozen, non-mission comparators. They return only if an owner decision restores a serving tier that allows multipliers, which D11 withdrew.
- Serving of product-key or addressed memory needs an integer read kernel. The exporter refuses it today.
Open questions. What is the export gap of a discrete or allowed float model through the container, and does UORLUT01 need a new schema for table-native models? How many of the 30.2 million parameters touched per token can selected reads remove before tokens per second move, given that arithmetic count was not time? Are the audit scripts, which are Python, to be ported to Rust and run in CI?
Also known as
UORLUT01; the D11 integer engine; the D10 LUT engine (superseded); uor-r4-lut; uor-r4-stack and uor-chat; multiplier-free serving; the zero-mul audit; serving-wasm; the LUT-4 shortlist (retracted).
Code
kernels.rs: table kernels, blocked product tables, radix-16 multiples-table products (stack_mul_u64,stack_mul_u128).session.rs: the per-token step and exact session state.format.rs: the container and its schemas.flock.rs: integer flock rank selection.simd.rs: WebAssembly SIMD fixtures, not on the hot path.wasm_serve.rs: browser and Node entry points.session_codec.rs: the exact session snapshot.native_geometry.rs: integer geometry for the discrete model's export.uor-r4-stack.rs: the command-line program the audit checks.audit_zero_matmul_serving.pyandaudit_zero_matmul_wasm.py: the native and WebAssembly instruction audits (existing Python scripts).uor-r4-lut: container metadata only, with the dense engines excluded. preserved D10 engine anduor-r4-simd: frozen.stack_export.rs: the old exporter, compiled out.- Evidence: served stacks, protocol pin, port design.
Related mechanisms
geometric-stack: the float model this engine exported and served; the engine is exact and the stack's quality is the limit. flock-read: the softmax-free read that schema 3 can serve; trained arms missed the bar. exact-memory: addressed memory the engine cannot yet serve. spin-weights: icosian-pair weights that make table serving of quaternion maps exact. ternary-xor: the multiplier-free arithmetic substrate. r4g1-graph: the earlier frozen table runtime with the same no-multiply rule. discrete-learning: the live model whose integer export is the next thing this must carry.
Native geometric engine (typed values, version chains, grounded replies)
Status: PARKED. Its passes were on question sets the project wrote itself and never reached free prose. Its best score, 437 of 512 on the practice set, fell to 0 of 128 on fresh questions. Its ranking objective used functions the project now bans, and its October kernels were quarantined. The idea of one shared writer lives on in the discrete path. The owner decided on 19 October 2026 to repair the root crate and other legacy crates so they build again; that restores the build, not this mechanism. See what would reopen it.
Labels used below: proof means derived from definitions or code, measurement means a recorded run, hypothesis means an untested idea. See docs/formal_vocabulary.md.
In plain words
This is a small language model written from scratch in Rust. It treats every word as an exact prime-number address and keeps its memory as rotations in four-dimensional geometry. It learned which earlier word or number to copy, add, or stop on, and which version of a changing fact to read, such as the first or the latest locker number. On questions the project wrote itself it answered exactly. It never wrote free prose. Its best score, 437 of 512 on the practice set it had been fitted to, fell to 0 of 128 on fresh questions.
What it replaces in a transformer
The whole network. This is not a transformer variant. Exact address lookups, version chains and small learned selector tables take the place of attention and feed-forward layers, and a readout of score tables predicts the next piece of text.
Left, how a changing fact is read by version. Middle, the best score and what happened on fresh questions. Right, how words become exact addresses and rotations.
Its chapter in the project's history
- 3 to 8 September (build first). After weeks of frozen ladders and bookkeeping, the owner ruled that a process which forbids running code produces nothing (#1111) and restored a single Rust model path (#1125). The first source-free native artifact continued prompts from a 35,655,288-byte table without opening the training text (#1112). A "model v0" followed, with typed Stop, Copy and Add selection and a 663-answer regression set (#1140). The project was named UOR-R4 Geometric Language Model (#1174), and an honesty pass withdrew fabricated scorecards (#1198).
- 8 to 17 September. Exact versioned memory and rules for abstaining. The first shared-core test failed (#1229). Typed attention was exported to exact Boolean tables (#1254), but passes came on constructed panels only (#1264).
- 19 to 25 September. A falsification sweep found the trained number overstated the shipped artifact by 0.57 bits per byte (#1284). No geometric mechanism had beaten a matched ordinary control (#1371). Continuous loss improved while actual prose scored 0 of 5 (#1398). The next stage of the plan moved to the layered stack (geometric-stack).
- 6 to 10 October (the October line). The records call it Line B. Cross-state fields over categorical H4 banks raised complete correct replies on a 512-row development panel from 8 to 437 (#2152 to #2162). A single fresh draw scored 0 of 128 (#2164). The rules in D21 and D22 followed: stop a line that does not move its milestone number, but a negative closes a configuration, never a mechanism.
- 12 to 13 October. The bans on softmax and squashing made the pooled-ranking loss non-compliant (D23, D25), and 15 kernels were quarantined after a hidden dense contraction was found (D29). The discrete path (
crates/uor-r4-discrete) took over, and it keeps this line's single shared writer.
How it works
Addresses and phases (definition). Each token has a full prime address, and ordered two-prime keys name contexts. Eight fixed zeta-zero phase channels, compiled to 16-bit turns, supply position-like phases.
Window fold (definition). A window of recent tokens is folded, in order, into exact H4 coordinates. H4 is the 4-dimensional symmetry of the 600-cell, whose 120 corners are the unit icosians. Sums are exact pairs \(a+b\varphi\) with \(\varphi^2=\varphi+1\). Products stay exact because
\[(a+b\varphi)(c+d\varphi)=(ac+bd)+(ad+bc+bd)\,\varphi \qquad\text{(proof, by } \varphi^2=\varphi+1).\]
The fold keeps signed chirality and evicts old entries with a bound.
Readout. Conditional score tables plus seven gated feature groups, with coefficients rounded to eighths and bounded shift-and-add arithmetic, predict the next piece.
Selectors on top. Small learned tables, each fitted on constructed families, choose: which source occurrence to read; whether to write an exact owner-value relation (sixteen versions kept); whether to Copy, Add or Stop on typed numeric literals; how deep to read; and which version intent (initial, previous or current) to follow along a validated chain, abstaining when the chain is truncated. A shared geometric writer emits the answer. Exact occurrence and version identity stay separate from the geometric addresses, and digests are never used as meaning.
October cross-state form. Trained 4-bit ("Q4") coefficients over categorical H4 banks (Context, Prefix, Generate), scored with exact integers. The training goal was a pooled-token ranking: for each token, push the correct answer above its strongest wrong rival, using
\[\ell=\operatorname{softplus}\!\Big(\log\frac{m_{\text{rival}}}{m_{\text{gold}}}\Big),\]
with \(m\) the score masses. That function is banned. The allowed replacement is the hinge \(\max(0,\ \delta-(s_{\text{gold}}-s_{\text{rival}}))\) of rank-margin.
Training and serving. Training used floating point. Serving executes the rounded integer scores. The preserved source is excluded from the current build by cfg(any()) and the facade in native_support.rs.
Rule check.
| Rule | Verdict |
|---|---|
| Integer serving (D11) | Partly. Scores are rounded integers with bounded shift-and-add, and an integer realizer ran with no source access (28 replies, 178 actions reproduced). Host tokenizing, fitting and reports use float, and no complete-binary instruction audit is recorded |
| No softmax or squashing (D23) | Broken in the October line. The pooled loss uses softplus, log-sum-exp episode weights and softmax token weights. The September sampler used a float softmax |
| No matrix multiplication (D30) | Unclear for September: its fitting was table search on the host. D29 quarantined the 14 native-context kernels and 1 selected-potential kernel after a hidden dense contraction was found |
| Offline float, with an export gap (D37) | Float learning over Q4 coefficients would be legal once the objective is allowed and the module is separately scanned. The 4-bit grid builds in an export gap that was never reported against a float score |
What has been tried
"Authored" means a panel the project wrote itself. "Exposed" means rows used while fitting, so a pass there is development evidence, not transfer. "Fresh" means rows the model never saw.
| Date | What was run | Result | Verdict | Record |
|---|---|---|---|---|
| 4 Sep | First native model with a fixed geometric readout | 0.13 to 0.23% next-piece accuracy, against 21.5% with geometry off. A learned readout replaced it | negative | record |
| 5 to 7 Sep | Relation writer shortcuts; typed numeric literals; literal selection and binding | Writer comparisons cut from 2,054,052 to 91,884 with identical writes. New numeric answers 12 of 16 but identifier copies slipped (62 to 60 of 62), so the parent was kept. Angular continuation 16 of 16 against 8 of 16 | positive / negative | admission, typed, selection, binding |
| 8 to 10 Sep | Current-query scope (255 of 255 construction, 48 of 48 open cases); learned initial-or-previous version selector | Passed construction, development and one independent fresh draw, on authored data | positive | query, version |
| 12 Sep | Fresh draw of learned neighbor-role rules | 2,016 of 2,304. Names with an interior "will" fail systematically (0 of 24 against 24 of 24) | negative | record |
| 12 Sep | First shared-core experiment | Held-out loss gain 1.425% against more than 2% needed; byte and end-of-text accuracy 2 of 249 to 0 of 249 | negative | #1229 |
| 12 to 13 Sep | Credit assignment; block learning; joint dependent reads; decoder refit | 0 of 8 proposed replacements helped; the joint fit failed transfer; 768 of 768 open development answers passed; 0 of 4 refit cells passed | negative / positive | credit, block, dependent, refit |
| 19 Sep | Per-mechanism ablation of the earlier lattice learner, 2,048 positions | Baseline 1.8055 bits per byte. Taking out the JEPA block, second readout or engram cost +0.3743, +0.3377 and +0.2228. Taking out VSA attention, the coarse lattice or the lanes changed it by −0.0007, −0.0066 and −0.0071, so those did not help. Trained 1.2372 against shipped 1.8055 | inconclusive | #1284 |
| 21 to 22 Sep | H4 shared transitions against a corrected ordinary table; a typed lexical artifact | H4 186 of 288, 48 of 128, 10 of 64 against the table's 288, 124, 64. Lexical artifact 31 of 31, but on an exposed panel and an interface result only | negative / inconclusive | transitions, lexical |
| 2 to 4 Oct | Q4 value-source fit, two seeds, 256 exposed rows each; a source-free packed realizer | 479 of 512 against 451 projection and 467 unrestricted parent, with no matched extra-dose control. The realizer reproduced 4 reads, 28 generations and 178 steps with no source access | positive | fit, realizer |
| 10 Oct | Cross-state field on the 512-row development panel, resumed and rival-aware | Complete correct replies 8, 22, 145, 175, 177 of 512, all earlier successes kept. All rows exposed | positive | record |
| 10 Oct | Pooled-token ranking from the 177 model, 256 updates | 177 to 437 of 512 with 260 gains and no losses. All 512 rows were exposed in training, and the objective is now banned | positive (development) | record |
| 10 Oct | One frozen fresh qualification of the 437 model, 128 unexposed combinations | 0 of 128 complete replies against 52 needed; 124 output-limit stops. Development replay reproduced 437 of 512. Recorded as panel fitting | negative | record |
| 10 Oct | Ordinary-gradient reply recipes on the 8-reply model | Reply-gradient kept 2 of 8; prototype fell from 8 to 4 of 512; joint reached 0 of 512; stratified kept 2 of 8; four more passes from 145 went to 139. All damaged working replies, which triggered the three-negatives pivot (D21) | negative | record |
Reading these honestly. The pattern is the one the project's own rules warn about. Exact selectors, writers and version chains worked on authored panels, and a general language model never followed. Fixed geometry lost to an ordinary table given the same supervision (186 of 288 against 288 of 288). The 437 figure was fitting: the fresh draw reused 15 of the 24 literals the model had been fitted on, and still scored zero. The project's reading is that the practice panel was fit, which is a failure of that configuration and not a refutation of cross-state continuation (D22).
What has never been tested
- The engine at matched capacity against an ordinary control. It was set aside at 1.68 million parameters.
- Free-running prose from this engine; continuous loss improved, generated prose scored 0 of 5.
- A genuinely fresh qualification of any October model after the exposed-panel critique. The one fresh draw scored 0 of 128, and no successor ran.
- A rank-margin or other allowed objective for the cross-state banks.
- GPU execution of the September engine. Its fitting was recorded as host Rust.
- Whether version-chain selectors transfer to free-form edited facts, not authored wording.
- A D11 instruction audit of the complete native binary.
Open questions. Which Line B ideas survive into the discrete path: the Copy/Add/Stop selector, version chains, or the exact-relation writer? Do exact chains need a learned selector at all once the D19 object store holds exact records? Can the cross-state field be rebuilt as a SpiralCore read with a hinge objective and score above zero on fresh rows? What did the 75 development replies (of 512) that still fail do wrong, beyond output limits?
What would reopen it
- A new pre-registration with a
TEST FITNESS: FITreview, after the owner lifts the separate hold on this line's training and rental. It replaces the softplus ranking with an allowed hinge and runs on GPU in its own scanned module (D37). - A genuinely unexposed decisive panel: at least 200 fresh rows or at least 2 seeds (D22), not the 512-row practice panel.
- Rebuild and re-qualify the quarantined kernels without the hidden dense contraction (D29).
- Join the line to the shared integer vector writer, so the language path and the compile-and-emit path use one geometric representation.
- A result from the relation-read reranker (relation-read, D34) that needs exact multi-version identity memory. That is the natural route back for the version-chain selectors.
Also known as
native_geometric; Line B native learner; r4 geometric; version-intent chain learner; Copy / Add / Stop typed selector; native H4/Q4 source realizer; cross-state continuation (M2); native pooled-token ranking; the native lattice learner (September ancestor).
Code
native_geometric/mod.rs: the preserved September engine (about 63,000 lines in the top-level files, 193,000 including subdirectories).native_support.rs: the facade that excludes it from the selected build.- In the same directory:
relation.rs(exact relation writes and reads),historical_version_intent.rs(the version selector),operation_transition.rs(Stop and Add),numeral.rs(digits to one typed value) anddurable_memory.rs. native_geometric_cli.rs: the rootr4 geometriccommand. The root crate is among those to be repaired.- October line, all compiled out or quarantined:
geometric_read.rs,native_geometric_cuda_kernels.rsandgeometric_context_q4.rs. native_vector_writer.rs: the shared integer vector writer in the current training crate, which this line and the discrete path both rely on.- Evidence: workflow, mechanism map, model direction, module split.
Related mechanisms
prime-zeta-codebook: prime addresses and fixed zeta phases first appeared here and were rebuilt as a qualified construction. relation-read: the exact-relation head is the reranker-first successor. exact-memory: version chains and relation writes are its ancestor. object-store: the exact store that takes over durable records. carrier-credit: October's unified credit was built inside this line. legal-construction: protected discrete construction was this line's solver family. rank-margin: the allowed hinge that replaces the banned ranking. pointer-key and read-binding: copy-with-identity ideas that started here. hopf-observation: the Hopf map with the lost fibre kept. discrete-learning: the live path that keeps the single shared writer. geometric-stack: the learned float model that took over after the September ladder. r4g1-graph: the compiled-table approach this replaced.
How research is done now
UOR-R4 is a research project, and for months it ran research the heavy way: one folder per pull request, a written plan before almost every step, and a review before each run. In the week of 12 to 18 October only 11% of the recorded lab work was a model result (see history). Since 19 October 2026 the owner's charter keeps the rigour but drops the bulk. Each line of research has one notebook page with one row per result. A written plan is required only before a GPU run or a run that a milestone claim rests on. Old records are kept, untouched, in archive/.
flowchart LR
A["Question or idea"] --> B["Notebook page<br/>for its research line"]
B --> C{"GPU training or<br/>evaluation, or a<br/>milestone claim?"}
C -- no --> D["Build, test, run<br/>host checks"]
C -- yes --> E["One-page sheet"]
E --> F["Review by someone<br/>who is not the author"]
F --> G["Owner releases<br/>the sheet once"]
G --> H["Run on the GPU"]
D --> I["New notebook row"]
H --> I
I --> J["Sealed artifacts and<br/>old records go to archive/"]
The path of one piece of work. Only the right-hand branch needs a sheet, a review and an owner release.
Terms follow the glossary. Claims are labelled proof, measurement or hypothesis as defined in formal_vocabulary.md. The rules below are the research clauses of the charter; section numbers point there.
The working rules
One notebook per research line (charter §5.6). A line is one sustained question, such as "how the discrete model reads context". Its notebook lives at docs/research/notebook/<line>.md. Each result is one row: date, what ran, the number, the bar it was tested against, the verdict and a link to the artifact. A dated evidence folder is kept only when a run seals artifacts. The one-page plan for the whole project is NOW.md; with the notebooks, it replaces the old running log (current-state.md).
A sheet only where it decides spend (§4.5). A sheet is a pre-registration of one page: the bar, the noise, the controls, the seeds, the cost and what each outcome would decide. It needs a review by a non-author, called a FIT review, before:
- any GPU training or evaluation, and
- any run that a milestone claim rests on.
A fresh-context subagent counts as a non-author. Builds, finite kernel tests and host checks need no sheet. Old float sheets come back only as new sheets with a new FIT. A FIT review releases nothing by itself.
One owner release per sheet (§5.1). The owner types one release phrase personally for each sheet. It covers all the sheet's arms, seeds and registered stop rules. Labs stage the commands and then check the records; no lab types a release for the owner.
Mechanism statuses (§4.1). Every mechanism is ACTIVE (on the model path), READY (built and tested but not yet trained in) or PARKED (the tested forms failed or broke a rule). A PARKED page lists what would reopen it. There is no terminal status. The mechanism board shows the current state. This is the rule from decision D22 (a negative closes a configuration, never a mechanism).
What a verdict closes. A negative result closes the exact tested configuration: the recipe, dose, window, key and objective. It never closes the mechanism, and stopping a novel mechanism takes an owner decision. A run that meets its own pre-registered mechanism target without a significant headline loss is a KEEP, and the work iterates. A tooling or numerical failure is a blocker to fix, not a negative. Source: D22 sections 1 and 2 in archive/integration/DECISIONS-2026-10-19.md.
Instrument first (§4.2). Before calling a result, decide whether the check itself is faulty. An instrument defect is a fix, never a negative. No target is set from a vacuous instrument, and no single number rules out a line. Findings shows why: a metric that read zero, a control that checked zero rows and a typed-in number each misled the project once.
Power and transfer (§4.3). A decisive run uses at least two seeds or at least 200 fresh rows. Its bar is never narrower than the measured noise. The mechanism must be trained in, not bolted on. Every gain on a development panel is reported together with a fresh transfer number.
Controls and pivots (§4.4). Compare against lawful non-neural baselines, which today means count tables. After three results on one line that do not move its headline number, write a pivot note: stop, or run one decisive test.
Plain verdict words. NOT_RUN means nothing ran; it is not a pass. UNAVAILABLE means a needed input was missing; it is not a negative. A passing test is not trained capability, and a passing control is not a language result (§4.6).
Preserve everything (§4.7). Nothing is deleted. Negatives, unique source and other labs' work go to the archive, byte-identical.
The lines of research
The catalog groups its 1,173 records into 20 lines. The ten largest are below. Counts are catalog records, which mix lab records and lane results, so they show where effort went and not how many experiments ran.
| Line (catalog id) | Records | First to last date | What it covers |
|---|---|---|---|
native-geometric-sept | 294 | 31 Jul to 28 Sep | The September native Rust geometric model and its memory and attention variants |
m1-discrete-attention | 199 | 7 Aug to 19 Oct | The current discrete model: reads, address cells and the K16 and A8 runs |
harness-governance | 185 | 24 Jul to 19 Oct | Research tooling, rules and process |
m2-exact-memory | 151 | 3 Sep to 12 Oct | Exact memory and grounded replies |
geometric-stack-pretraining | 84 | 20 Sep to 11 Oct | The deeper float "geometric stack" trained on GPUs |
r4g1-transformerless | 74 | 21 Jul to 27 Sep | The first compile-a-teacher-into-tables work |
m4-serving | 42 | 7 Aug to 18 Oct | Integer serving (decision D11) |
m1-float-rung0 | 38 | 31 Aug to 13 Oct | The float route to the first milestone rung (rung 0) |
m3-durable-memory | 33 | 3 Oct to 18 Oct | The durable-memory session and evaluator |
compute-ops | 15 | 3 Sep to 18 Oct | Pod and GPU operations |
Source: archive/catalog.jsonl (fields line, date), counted with jq. The remaining ten lines hold 14 records or fewer each. The descriptions come from the line names and milestone titles, not from a field in the catalog. Every line becomes a notebook page as it is touched.
Where old records live
Every dated record before 18 October 2026 now sits under archive/, at the same relative path it had under docs/, except the reference documents that stayed in docs/ (such as docs/scaling_law.md and docs/inference_contract.md). Records dated 18 and 19 October stay in docs/labs/. The archive never changes: many experiment sheets are pinned by hash, and SHA256SUMS files cover the records. So read an archived record as a faithful copy of the day it was written, including any claim that was corrected later.
To find a record, use the generated index archive/CATALOG.md, with the same data in archive/catalog.jsonl. Its columns are date, lab, line, milestone, mechanism, verdict and path. It also holds the old-path to new-path map, so an old link still resolves. The catalog is an index, not a verdict. Follow its path and read the record before you rely on a number.
Go deeper
- What the project knows: the lessons and the measured results behind them.
- What is still open: the tests nobody has run and the cheapest decisive ones.
- How the project got here: five phases and 32 eras, 10 June to 15 October.
- Mechanism board and the charter.
NOW.mdfor the current plan, anddocs/harness/README.mdfor the research harness.
What the project knows
The project's record holds more lessons about what misleads than results about what works. The most useful knowledge is a set of 21 lessons, mostly about how to measure honestly, plus a short list of measured results. The honest summary is this. Several lawful parts exist and have passed their finite tests. No model on the current path has learned language: the best trained discrete model sits below a simple count table. The cause is not yet established.
flowchart TB A["Passes with the teacher's text supplied<br/>(teacher-forced)"] --> B["Passes on a panel the authors built"] B --> C["Passes on development rows<br/>the team has already seen"] C --> D["Passes on fresh held-out rows"] D --> E["Writes coherent text on its own"] E --> F["Same result from the shipped integer file"] F --> G["Faster or cheaper per token on a laptop"]
The ladder a result must climb before it counts as capability. The project has repeatedly stopped at the first three steps (lessons 3 and 4 below).
How to read this page
#Nis issue or pull request N inUOR-Foundation/uor-r4. Each lesson cites the items it came from.- The lessons come from the audit's reading of the GitHub archive, items #1 to #2495. Some items were read in full and some by title only (
docs/labs/repo-renormalization-2026-10-19/audit/eras/eras.json, fieldnotes). Check the item before you rely on a number. - Each lesson records something that happened at a stated scope, so each is a measurement of that case. Where a lesson generalises, the generalisation is a hypothesis, and it never closes a mechanism (decision D22).
- Mechanism names use the statuses ACTIVE, READY and PARKED. See the mechanism board.
The 21 lessons, by theme
The numbers are the audit's own, so you can trace a lesson back to its era in the history. Lessons are grouped by theme, so their numbers are not in order; other pages cite them by number.
Check the measurement first
- Check the instrument before trusting a result. A metric that read 0.0000 hid a real loss (the #99 metric, removed by the revert #102). An outside check on the same text differed from the pipeline's own score by about a factor of three, 11.17 against 3.84 bits per token (#300). Typed-in numbers were once merged as results (#1459). A lookup-table gain was retracted as a constant shift (#1881). A control that checked zero rows reported a pass (#2112).
- Measure the shipped form. The trained model and the shipped artifact differed by 0.57 bits per byte (BPB) (#1284).
- A teacher-forced or authored-panel pass is not coherent generation. Loss kept falling while prose stayed at 0 of 5 (#948, #1264, #1398).
- Development is not fresh. A frozen-upstream adapter scored 437 of 512 on rows the team had seen, then 0 of 128 on a fresh draw (#2162, #2164).
- A gate set before a run does not move after a miss, and a missing input is not a negative. Frozen floors survived every re-entry (#887, #931). An UNAVAILABLE report is not a zero (#661, #986).
What geometry bought and what it did not
- Fixed geometry usually tied or lost to a matched ordinary control. This held for W(3,3) (#929), for the project's geometric mechanisms as of September (#1371) and for fixed E8 or H4 codebooks against k-means (#1456). Kept exceptions: quaternion transport (#1460), quaternion and icosian weights (#2193, #2216) and seed reliability (#1798).
- Some geometry wins were storage or lexical artifacts. A zeta-grid headline was storage banding (#440); see also #487.
- Exact algebra reproduces perfectly but carries no meaning on its own. H4 and the 64-state SpiralCore worked as controls and supplied no semantics (#952, #985).
- Shift-and-add stores and E8 codebooks beat sign codes at equal bits (#243, #395).
Data and scale
- Data and teacher breadth beat model size and clever stores. On broad text the ceiling was the teacher (#437). Matching the training distribution beat adding parameters (#1913).
Memory and retrieval
- An exact log plus a prime sieve retrieves; the learned pointer copied recency. The pointer returned the most recent value, not the queried one (#1558). The sieve did the retrieval (#1559, #1607).
- Chat failures came from missing knowledge and fluency, not retrieval. Retrieval accounted for 2.2% of failing rows (#1708).
- Compliance needs a demand paired with its exact short answer. Instruction following was 0 of 6 until each demand was paired (#1918, #1958).
- Exact integer export and bit-exact serving work (#1254, #1893).
Learning
- Hard geometric selection gives unselected keys no gradient. It needs a training bridge (#2195, #2249).
- State and horizon were the levers, not training length (#1366, #1379).
- Binding failures came from the training recipe, not the architecture. A copied reference cell scored 99.17% where the bundled recipe failed (#1045, #1050).
Speed and cost
- Savings counted on paper are not tokens per second. Analytic multiply savings did not become speed (#2200, #2211). Integer serving first cost 4.3 times more energy than its float parent (on a dense model with every multiply replaced by a table read) (#1449).
- Check where compute goes. The output readout took 99.97% of per-token compute (#1287). Geometric operations were 0.05% of the stack's arithmetic (#2186).
How to work
- Keep dormant mechanisms behind gates; never delete them (#515, #1747).
- A process that forbids running code produces nothing (#1111). A negative closes a configuration, never a mechanism (#2165).
Key measured results
All rows are measurements unless the row says otherwise. Terms in the first row: top-1 is the right next word ranked first; T2 is a context-free table of the most common next word; admission is the shortlist of candidate cells the read can see (see what is still open). Records dated before 18 October now live under archive/labs/.
| Result | Scope and caveat | Source |
|---|---|---|
| Best trained discrete model: top-1 of 65 and 463 of 14,287 development rows. Unigram table 1,226; context-free successor table (T2) 6,300 | Two seeds of the K16-A run. Both fail the admission gate (2,237 and 3,167 against 4,894). A configuration negative, no KEEP | K16 outcome; host diagnostics |
| Aliasing does not explain that ranking failure | Training broke much of the aliasing (ceiling about 9,000 rows), yet top-1 stayed at 65 and 463. Ranking capacity, the read and the schedule stay open | K16 outcome |
| The seeded start had at most 16 distinct vectors | The alias ceiling at start was 1,986 rows. A configuration flaw, not a proven cause | K16 outcome; A2 diagnosis |
| Address cells raised admission from 127 to 1,351 of 3,847 rows at zero training. After training it fell to 551, against a control at 857 | Learning eroded the placement | pre-flight; A8 dose |
| The prime-zeta construction gives 4,096 of 4,096 tokens unique vectors | A construction check, not a language result | construction |
| Four full K16 runs of 16,404 batches accepted 407, 130, 410 and 129 moves. One pass sees 1,049,856 of 2,425,925 targets (43.3%, proof by arithmetic) | A pass touches under half of the training split | NOW.md; discrete learning |
| The row-parallel proposal is about 56 times faster (55.6 and 56.9) | One RTX 5090; non-gating timing, not qualified | rows parity |
| Old float geometric stack: 0.877 BPB float and 0.933 served, against the old 0.90 bar. The float cell used 512 windows and the served cell 64, so the pair is not comparable (protocol pin, 9 Oct; the criterion is recorded as not met and not claimable). The charted models reached 1.20 to 1.24 | Trained with softmax, SiLU and matmul; serving read every weight per token. STATUS.md also records 0.886838 BPB for a 19.9M stack at 512 windows, under a different protocol | D11 serving; stack |
| Best softmax-free read (arm W): +0.0172 BPB float, +0.0166 served, 15% slower (195.2 against 228.4 tokens/s). Verdict REJECT | Its gradient used a softmax straight-through surrogate and a CPU fallback. Closes the configuration only | softmax-free read |
| Starling read: recall 0.329 against 0.999 for softmax | Target not met; trained against a dense teacher; retention fails by eviction as context grows (#2239) | starling tree |
| E8 memory replacing half the feed-forward blocks: 0.033 BPB worse than the dense control (inside its +0.05 bar) at about 10 times fewer operations; learned product keys beat the fixed E8 addresses by 0.023 | Used a sigmoid gate and 2,000 CPU steps; PARKED | E8 memory |
| Quaternion transport beat identity by 0.071 and 0.077 nats at 1,000 updates | Confounded: softmax attention, a sigmoid gate, dense MLPs, and 332,928 fewer parameters in the identity arm | transport attribution |
| The exact store scored 1.000 whenever its register was right | That the same holds for a learned read is a hypothesis; none exists yet | exact memory |
| The integer engine is bit-exact and multiplier-free: 44 native symbol ranges and 7 of 7 WebAssembly serving symbols pass the zero-multiply audit | No lawful trained model has been exported, so the export gap is unmeasured | WASM runtime (7 of 7); project track (44 native ranges) |
Go deeper
- What is still open and how the project got here.
- The audit's long form:
docs/labs/repo-renormalization-2026-10-19/audit/synthesis.md(stitching map and shortest path) anddocs/labs/repo-renormalization-2026-10-19/audit/eras/eras.md(the lessons with their eras). - Archive catalog for every dated record.
What is still open
The project has built and tested many of the parts of a language model. The few it has trained together (the discrete writer, the reads and the ranking loss) have not yet beaten a simple count table, and a full trunk of lawful parts has never been trained. The biggest open question is simple to state: can a model that uses no softmax learn to rank the right word above the wrong ones? Nobody knows yet. Beside it sits a list of tests that were never run, or that failed only because the test was set up badly. Most of them are cheap, and the cheapest decisive one is FIT-reviewed and queued, not yet released.
flowchart TD
W2["W2: read-code capacity capture<br/>(FIT-reviewed, queued, about $0.91)"] --> Q{"Which wall is it?"}
Q -- "representation (H_rep)" --> R["Fix the read and the address metric.<br/>Do not fund float training."]
Q -- "learning law (H_law)" --> W3["W3: BVG-K batched discrete moves<br/>(about $12)"]
W3 --> Q3{"Does integer top-1 beat<br/>both count tables?"}
Q3 -- yes --> NX["Add the missing trunk slots,<br/>then export"]
Q3 -- no --> W4["W4: one float-credit sheet<br/>(about $5 to $10 GPU)"]
The order of the next decisive tests in the sequence the owner approved (D39 item 4); each is FIT-reviewed, none is released. W1, the K16 run, has already finished with no KEEP.
Terms follow the glossary. Claims are labelled proof, measurement or hypothesis as in formal_vocabulary.md. Dollar figures are the chief architect's estimates, not recorded costs.
How the output head works, in two lines
The model first picks a shortlist of candidate cells, the nearest K of 256 by address. A row counts as admitted if the right token survives that cut. It then ranks the shortlist and takes the nearest token. So a model can fail at admission, at ranking, or at both. Source: docs/labs/repo-renormalization-2026-10-19/audit/synthesis.md section 1 and K16 outcome.
The central unknown
Can a softmax-free read learn ranking? This is a hypothesis, and the biggest one. Every float read that learned had softmax helping it somewhere in training. The best read without softmax, arm W, is a recorded REJECT. It was worse by 0.0172 BPB (bits per byte) and ran 15% slower, and its gradient came from a softmax-shaped surrogate. The starling read reached recall 0.329 where softmax reached 0.999. Both verdicts close those configurations only (decision D22), not the idea. See findings for the numbers and flock read for the discrete read that replaces them.
What we know today: the best trained discrete model scored top-1 of 65 and 463 of 14,287 development rows, below a unigram count table (1,226) and a context-free successor table (6,300) (measurement, K16 outcome). The cause is open. The record rules out one suspect: aliasing did not explain the ranking failure. It leaves ranking capacity, the read, the address key and the training schedule.
FIT-reviewed and queued
These are the closest to a decision. A FIT review is not an owner release: spending waits for the owner (charter §5.1).
- W2, the read-code capacity capture (about $0.91, already reviewed as FIT, same lease). It decides whether the wall is the representation (H_rep: the stored code cannot separate the answers) or the learning law (H_law: the code could, but the update rule does not find it). It also adds the count-table arms that the headline bars lacked. Source: architect review section 6,
docs/labs/course-correction-2026-10-18/audits/d37-reactivation-architect.md. - The admission-preserving rerun of A8. Pre-registered and reviewed FIT, never run. Its controller and a separate finite qualification producer are merged. The qualification is NOT_RUN. Source: admission-anchor controller.
Every step that trains also needs an owner release (charter §5.1), and training stays HELD until the owner releases it.
Never fairly tested, and cheap
| Test | What it would tell us | Source |
|---|---|---|
| Full-vector or interior-block address metric, at zero training | The architect's likely lever. The address key takes only 5 values to order up to 256 cells (proof, read from discrete.cu) | architect review §3.2 |
| A wider carrier (more roots or blocks) | Whether 16 bits per vector limits capacity. Needs new kernel code and a fresh CUDA qualification, so not free | discrete learning |
| Read-off against read-on for Route and Flock, on existing checkpoints | Whether the reads add anything at all. Route got 20 proposals in 16,404 batches | Route read; attention state |
| The prime-zeta code against random and quota-only injective nulls, at zero updates | Whether its structure matters or only its uniqueness | prime-zeta codebook |
| Whether a secant surrogate gives descent for the recurrence gates and SpiralCore/FBS | A small float check before any larger run | recurrence gates; SpiralCore/FBS |
| 4,096 against 16,384 tokenizer pieces | Whether vocabulary size is a lever. The trainer exists | tokenizer |
Never tested, moderate cost
- Ranking with admission intact. No run has had admission intact and then failed or succeeded at ranking (admission).
- A rank objective that keeps cells occupied. The registered route after the K16-R run collapsed to 19 or 20 occupied cells (rank margin).
- Full-epoch and frequent-token revisit schedules. One pass sees 43.3% of the training targets (proof, by arithmetic, model training).
- The finite relational head. K16-A reached its 16,404 batches and can satisfy the prerequisite for the next stage (architect review §5; relation read).
- Discrete Hamming binding (VSA) on the current writer (VSA).
Never tested, expensive or blocked
- A trunk built only from lawful parts. Train it with float in a new scanned module, then export. The 24-kernel extract has passed finite controls only (geometric stack). No exporter exists for it.
- The forced-copy oracle for the pointer. The cheapest decisive pointer test. It needs a lawful pointer first, because running it on the old softmax pointer would execute a banned model (pointer key).
Failed only on configuration
A negative closes the configuration, never the mechanism. These tests were flawed as set up, so they say little about the mechanism.
| Test | What was wrong with it |
|---|---|
| A2 pilot, Dose 1, K16-A and K16-R | All started from a seeded codebook with at most 16 distinct vectors |
| P8 (127 of 3,847) | Uniform placement at K = 8 |
| A8 first dose | Ran without the admission guard |
| Starling and rank-table reads | Used softmax-tuned recipes and softmax-surrogate gradients |
| E8 memory | Used a sigmoid gate and 2,000 CPU steps |
| Spin weights | Met its bars (1.5148 BPB, level with dense) but only through a dense contraction, which D25 bans; PARKED |
| M2 reply model, 437 of 512 then 0 of 128 | Panel fitting on rows already seen |
| Read binding | Measured on a softmax read |
| VSA | Used the banned CPU learner |
Source: docs/labs/repo-renormalization-2026-10-19/audit/synthesis.md section 2, which cites each mechanism's dossier in docs/labs/repo-renormalization-2026-10-19/audit/mechanisms/.
Not yet buildable
The map of lawful parts still has gaps that no test can fill until someone builds them (docs/labs/repo-renormalization-2026-10-19/audit/synthesis.md section 1).
- Position. No mechanism is assigned. The only related result is about recurrent state, and it is confounded (see findings).
- Normalization. None is designed.
- Address as the read. Never built, and nothing yet consumes the object store.
- A lawful exporter for any trained trunk, so the export gap is unmeasured.
- A faster writer. The writer scans the whole vocabulary, about 5 million comparisons per row, which breaks the per-token sparsity goal at larger vocabularies (proof, by count, architect review §3.5).
Open claims
| Claim | Kind | Source |
|---|---|---|
| Quaternion transport helps order in a lawful model | Hypothesis. The only result is confounded | findings |
| Float training of the table beats discrete moves | Hypothesis. W4 is conditional on W2 and W3 | architect review §6 |
| The export gap of a float-trained model is small | Hypothesis. The architect expects a structurally non-zero gap | architect review §3.3 |
| A norm-preserving Hamilton gate can suppress a signal | Hypothesis, a reading of the dossier only | Hamilton gate |
| Near-frontier capability needs more data than any trained stack used | Measurement for the past (#437, #1913), hypothesis for the future | findings |
What counts as success for the first milestone
The charter sets the M1 closing bar: integer top-1 through the D11 export beats both count tables on the same development panel, on each of two seeds, with tokens per second reported. A bits-per-byte bar returns later, once a lawful likelihood exists (charter §4.8). That settles the old open question about scoring a model with no likelihood, for M1 only. A lawful likelihood is still unbuilt. A conversation bar (M2) is further off, and a float student would need a new owner decision (docs/labs/repo-renormalization-2026-10-19/audit/synthesis.md section 4, stage 5).
Go deeper
- What the project knows and how it got here.
- The audit's shortest-path plan:
docs/labs/repo-renormalization-2026-10-19/audit/synthesis.mdsection 4. - Mechanism board and
NOW.mdfor the live plan.
How the project got here
UOR-R4 began in June 2026 as an attempt to run a language model without a transformer or heavy arithmetic, using the geometry of primes, rotations and symmetry groups. Over four months it tried five broad approaches. Each was replaced when it hit a wall, and each left lessons. The 32 steps below are the audit's "eras", read from the GitHub archive (items #1 to #2495). The work has been careful and open about its failures, and it has not yet produced a model that holds a conversation.
Five phases and 32 eras on one time axis, with the number of catalog records per day underneath (1,051 of the catalog's 1,173 records carry a date). Era spans come from the archive audit; the daily counts come from archive/catalog.jsonl. The figure draws Phase E to 19 October; the era snapshot below ends on 15 October.
Terms follow the glossary. #N is an issue or pull request number in UOR-Foundation/uor-r4. Every row below is a measurement of what a recorded item said, at that item's scope, unless marked otherwise. Eras overlap on their edges, and some items were read by title only (docs/labs/repo-renormalization-2026-10-19/audit/eras/eras.json, field notes).
Phase A: compile a teacher into tables (10 June to 26 August)
In plain words: watch a real language model, the "teacher", and compile what it does into lookup tables and a graph that a CPU can run with no multiplications.
| Era | Dates | What was tried, and what happened |
|---|---|---|
| 01 Prime router | to 21 Jul | A router over sparse 512-dimension prime vectors (#1) and hypervector algebra (#9), folded into the graph-compiler plan (#10) |
| 02 R4G1 graph compiler | 21 to 26 Jul | The graph file format, certificates, and the rule that only serving must be multiplication-free (#11, #157). Mostly structure |
| 03 Quality chain | 23 to 24 Jul | A 16-fix plan began at 0.3% against a 31.7% baseline (#65). A metric reading zero hid a real loss (#102). The Furey algebra code was never wired into inference (#103, #249) |
| 04 Token-index pivot | 26 Jul | Bad scores came from tokenizer indexing, not the runtime (#201) |
| 05 Integer store | 27 Jul to 3 Aug | Shift-and-add assignment gave smaller, more accurate stores with zero multiplies (#243). Phase-clock addressing was negative (#392) |
| 06 Geometry as substrate | 3 to 6 Aug | E8 codebooks beat sign codes at equal bits (#395). A zeta-grid headline was a storage artifact (#440) |
| 07 Broad text | 5 to 8 Aug | The 26 to 27% ceiling on broad text came from the teacher, not the store (#437) |
| 08 Bigger teacher | 8 to 12 Aug | SmolLM2-360M became the pinned baseline (#509, #516). Ruled-out mechanisms were kept behind gates (#515) |
| 09 Serving | 10 to 19 Aug | A corpus-ordering bug was a major cause of garbage output (#755) |
| 10 Plan S0 to S7 | 19 to 26 Aug | Truth baseline 29.52% against 28.12% (#821). Abstention, coherent free-running text and planning all ended as LIMIT. Fixed W(3,3) geometry showed no advantage (#929) |
Why it ended. Gains measured with the teacher's text supplied never became coherent text the model wrote itself. The reset in #948 made a learned geometric decoder the objective.
Phase B: a learned geometric decoder (25 August to 8 September)
In plain words: learn a model directly, after first checking that ordinary attention can live inside the geometry.
| Era | Dates | What was tried, and what happened |
|---|---|---|
| 11 Decoder reset | 25 to 29 Aug | A one-layer R4 mixer gained 4.44%, short of its 5% bar (#951). Route-native attention worked on exact identities (#969) |
| 12 The #973 programme | 28 Aug to 3 Sep | Softmax attention reproduced exactly in R4/Spin coordinates (#1002). A 7.15M-parameter model could continue text but not chat (#1017). A copied cell scored 99.17% (#1050) |
| 13 Build first | 3 to 5 Sep | The owner replaced a rule that forbade running code (#1111) and restored a single Rust model path (#1125) |
| 14 Native model v0 | 5 to 8 Sep | Typed Stop/Copy/Add selection with a 663-answer regression set (#1140). An honesty pass withdrew fabricated scorecards (#1198). The project got its name (#1174) |
Why it ended. No single mechanism failed. A lab closed the early-September ladder on 29 September in favour of one plan of record (#1507).
Phase C: native learner and exact memory (8 to 25 September)
In plain words: teach a home-grown Rust model to remember exact facts and versions, then find out why it still could not write prose.
| Era | Dates | What was tried, and what happened |
|---|---|---|
| 15 Version-intent cycles | 8 to 12 Sep | Exact versioned memory, with rules for abstention and sealed reports (#1222, #1224). The shared-core gate failed (#1229) |
| 16 Addressed attention | 12 to 17 Sep | Emission was the first bottleneck (#1230). Typed attention exported to exact Boolean tables (#1254). Passes came on constructed panels only (#1264) |
| 17 Falsification sweep | 19 to 20 Sep | Attention in the vector-symbolic layer (VSA) was inert, and the trained model and shipped artifact differed by 0.57 bits per byte (BPB) (#1284). The readout took 99.97% of per-token compute (#1287) |
| 18 Relational readers | 20 to 23 Sep | A reader-policy gain did not reproduce (#1330), and H4 tied a categorical control (#1344) |
| 19 Prose deficit | 23 to 25 Sep | Doubling training changed nothing (#1366). The recurrent learner scored 2.110 negative log-likelihood (NLL, lower is better) against 2.085 for the ordinary model and 1.574 for the transformer (#1389). Integer serving shipped (#1397), prose stayed at 0 of 5 (#1398) |
Why it ended. The offline learning ladder reached integer serving but not prose, so focus moved to a chat model and parallel labs.
Phase D: the geometric stack, labs, chat and memory (26 September to 11 October)
In plain words: train a deeper "geometric stack" on GPUs, serve it in integers, and push it toward chat and memory with several AI labs working in parallel.
| Era | Dates | What was tried, and what happened |
|---|---|---|
| 20 Serving contract | 26 to 29 Sep | The stack reached parity with a transformer control (#1437). Fixed E8 and H4 codebooks lost to k-means (#1456). Integer serving, on a dense model with every multiply replaced by a table read, cost 4.3 times more energy than its float parent (#1449) |
| 21 Durable labs | 29 Sep to 2 Oct | The learned pointer copied the most recent value (#1558). An exact log with a prime sieve did the retrieval (#1559, #1607) |
| 22 Scale ladder | 2 to 5 Oct | CUDA training and a 1.39B-token chat corpus (#1660). Retrieval caused 2.2% of failing rows (#1708). A constant reply beat every model on tier C (#1733) |
| 23 Contest | 5 to 6 Oct | The weak part was representation, not the output head (#1780). The geometric read's measured gain was seed reliability (#1798) |
| 24 End-to-end serving | 6 to 9 Oct | A chat stack served multiplier-free and bit-exact (0.93277 BPB at 64 windows; the 0.877 float figure used 512, so the pair is not comparable) (#1893, #1899). Data mattered more than size (#1913) |
| 25 Constructor line | 6 to 10 Oct | M2 stayed at 8 of 512 complete replies (#1882) until the rule on three negatives stopped the line |
| 26 Instruction following | 9 Oct | Compliance was 0 of 6 (#1918) until each demand was paired with its short answer (#1958) |
| 27 Governance reset | 9 to 10 Oct | Main became the single source of truth (#2015) and the rule that a negative closes a configuration only was written (#2165). Geometric operations were 0.05% of the stack's arithmetic (#2186) |
| 28 Pointer and binding | 9 to 11 Oct | The pointer used softmax and could not be served (#2072). Read binding was KEEP (#2190) |
| 29 M2 replies | 10 Oct | Replies rose from 8 to 437 of 512 on development rows (#2162), then scored 0 of 128 on a fresh draw (#2164) |
Why it ended. The fresh failure showed the development panel had been fit, and later bans on softmax and matrix multiplication made this path non-compliant (#2164, #2251, #2263).
Phase E: lawful operators and the discrete substrate (10 to 15 October)
In plain words: replace softmax and matrix multiplication with true geometric operations, then learn on exact integers.
| Era | Dates | What was tried, and what happened |
|---|---|---|
| 30 Mechanism rungs | 10 to 13 Oct | Softmax-free rank reads were REJECT (#2160). Quaternion matrices and icosian weights were KEEP (#2193, #2216). The starling read lost entries to eviction at long context (#2239) |
| 31 Operator phase | 12 to 14 Oct | Softmax and matmul were banned (#2251, #2263). A rank-margin loss, the Hamilton gate and SpiralCore/FBS projection were added. Controls passed and nothing was trained |
| 32 Discrete substrate | 13 to 15 Oct | Integer learning passed its CUDA controls (#2379). In the pilot, top-8 hits rose from 173 to 1,169 while aggregate loss also rose (#2449, #2454). The prime-zeta construction qualified (#2473) |
After the snapshot (15 to 19 October). The owner re-allowed offline float training on 18 October, with an export-gap check. The K16 runs then completed with no KEEP: the best top-1 was 65 and 463 of 14,287 rows, below a unigram table at 1,226 (K16 outcome). The A8 address-cell dose ended at its registered first diagnostic stop (A8 dose). Training stays held until the owner releases it (charter §5.1).
Where the effort went
Share of each week's records that were model results (positive, negative, inconclusive or a diagnostic stop). Source: archive/catalog.jsonl, counted by ISO week (for example week 36 is 59 of 99 records, week 42 is 34 of 309); see also the corrected table in docs/labs/repo-renormalization-2026-10-19/audit/synthesis.md section 3. The figure shows 14 weeks, from week 30 (20 July).
The chart is a measurement of the audit's record counts. Results fell from 78% of the week's records in the week of 5 October to 11% in the week of 12 October.
| Window | Model-line results | Other model-line records | Governance and operations | Results share |
|---|---|---|---|---|
| 9 to 11 Oct | 83 | 21 | 4 | 77% |
| 12 to 18 Oct | 34 | 116 | 157 | 11% |
| 19 Oct | 4 | 21 | 7 | 13% |
Part of the fall was ordered, not chosen. On 12 and 13 October the owner's bans on softmax and matmul, the GPU-only rule and the Rust-first rule forced a rebuild of the substrate and many tool ports. So the 89% of non-result records that week is an upper bound on discretionary process. Many of the 34 "results" that week are kernel parity or qualification passes, not learning. Five training efforts have run on the discrete path since 13 October (the A2 pilot, Dose 1, rows Dose 2, K16 and A8), and none produced a KEEP. Source: docs/labs/repo-renormalization-2026-10-19/audit/synthesis.md section 3, from the audit's records/*.jsonl.
Go deeper
- What the project knows and what is still open.
- Research rules now and the archive catalog.
- The mechanism board.
The research lines
A research line is one sustained question the project worked on, such as "how does the discrete model read earlier text". The audit sorted all 1,173 recorded pieces of work into 20 lines. This page lists them, shows when each ran, and says in a word where each stands. Seventeen lines have at least three records and get their own page. None of them has produced a model that holds a useful conversation: the project is pre-alpha and 0 of its 8 milestones are complete (docs/integration/NOW.md).
When each line ran. The September lines end as the October discrete line begins; the tooling and operations lines run alongside.
How to read the table
- Records are catalog entries. They mix lab records, lane results, reviews and plans, so they show where effort went and not how many experiments ran. Source:
archive/catalog.jsonl, counted withjqon the fieldline. - Results are the records whose outcome is positive, negative, inconclusive or diagnostic-stop. The rest are plans, tooling, process, review, operations and blocked runs. A blocked record is a run that could not start; it is not a negative.
- Span is the first to last dated record in 2026. Some records carry no date and are left out of the span.
- A positive record reports that the target the record itself set was met, at the scope it states. Many are narrow, scored on a panel the authors wrote, and none is a language result.
- State follows the project's vocabulary. Active means on the current model path. Parked means the tested forms failed or broke a rule and the mechanism stays open (decision D22). Closed means the line stopped (a line label only: its mechanisms keep their board status); a negative closes a configuration and never a mechanism. Preserved is evidence kept inactive.
All lines
| Line | Span | Records | Results | State |
|---|---|---|---|---|
native-geometric-sept: the September native geometric model | 31 Jul to 28 Sep | 294 | 224 | Closed; whole model parked |
m1-discrete-attention: discrete attention for the language base | 7 Aug to 19 Oct | 199 | 73 | Active; M1 not met |
harness-governance: research tooling and rules | 24 Jul to 19 Oct | 185 | 0 | Active support, slimmer since 19 Oct |
m2-exact-memory: grounded replies from exact memory | 3 Sep to 12 Oct | 151 | 93 | Held; fresh test failed (0 of 128) |
geometric-stack-pretraining: the geometric stack | 20 Sep to 11 Oct | 84 | 50 | Parked as a whole model |
r4g1-transformerless: compiling a teacher into tables | 21 Jul to 27 Sep | 74 | 40 | Parked |
m4-serving: integer serving | 7 Aug to 18 Oct | 42 | 23 | Engine active; no lawful model exported |
m1-float-rung0: the float route to rung 0 | 31 Aug to 13 Oct | 38 | 18 | Preserved; parts ready, never trained |
m3-durable-memory: durable memory and the object store | 3 Oct to 18 Oct | 33 | 3 | Store ready; nothing consumes it |
compute-ops: GPU and pod operations | 3 Sep to 18 Oct | 15 | 0 | Active support |
eval-panels: evaluation panels and graders | 7 Aug to 14 Oct | 14 | 5 | Panels frozen; reply headline suspended |
geometric-intelligence-aug: the August geometric programme | 25 to 30 Aug | 9 | 7 | Closed |
data-tokenizer: data and tokenizer | 16 Aug to 19 Oct | 8 | 1 | Active tokenizer; 16,384-piece trainer and donor corpus prepared, not run |
m7-distribution: API, browser runtime and Studio | 3 Sep to 15 Oct | 8 | 0 | Runtime delivered; no model to serve |
spiralcore-wire: SpiralCore wire transport | 18 Oct | 7 | 0 | Side exploration, off the model path |
m5-energy: laptop energy and cost | 25 Sep to 18 Oct | 4 | 1 | Not started; no joules per token measured |
m1-prime-zeta: the prime-zeta codebook | 14 Oct | 3 | 2 | Active as baseline start |
vsa-native-prose | 9 Oct | 2 | 1 | No page (fewer than three records) |
m6-reasoning-coding | 22 Aug | 2 | 1 | No page (fewer than three records) |
e8-orbit-memory | 11 Oct | 1 | 1 | No page (fewer than three records) |
| Total | 21 Jul to 19 Oct | 1,173 | 543 |
The three short lines are listed in the generated archive catalog with all their records. The vsa-native-prose records are in archive/labs/vsa-native-test-2026-10-09/README.md, the E8 record is in archive/labs/e8-orbit-memory-2026-10-11/README.md, and the m6-reasoning-coding record is archive/w33_geometry_qualification_845.md. The VSA and E8 orbit memory mechanisms have pages on the mechanism board.
What the whole table shows
- Two lines hold 42% of the records.
native-geometric-sept(294) andm1-discrete-attention(199) together hold 493 of 1,173 (arithmetic from the table). - The "Results" column counts every recorded result, including ones scored on authored or exposed panels. Read it with what the project knows: development is not fresh, and a pass on a built panel is not a language result.
- Tooling and operations records are large.
harness-governance,compute-opsandspiralcore-wirehold 207 records and no model result. Part of that came from owner decisions that forced a rebuild in October (docs/labs/repo-renormalization-2026-10-19/audit/synthesis.md, section 3). - The only active modelling line is
m1-discrete-attention. Its best trained artifact is below a word-count table (65 and 463 of 14,287 development rows against 1,226).
Where to go next
- How research is done now, the rules for notebooks, sheets and releases.
- What the project knows, what is still open and how the project got here.
- Mechanism board: the 27 mechanisms with ACTIVE, READY or PARKED status.
- Archive catalog: every dated record, with one generated page per line under
archive/catalog/.
Research line: discrete attention for the language base (M1)
This is the line that carries the project today. It asks one question: can a model that uses only integers and small geometric moves learn to read earlier text well enough to predict the next word? So far the answer is no. The best trained discrete model gets the next word right in 65 and 463 of 14,287 development rows, below a plain word-count table that gets 1,226.
| Catalog id | m1-discrete-attention |
| Time span | 7 Aug to 19 Oct 2026 (two early records; the work in earnest runs 19 Sep to 19 Oct; 3 records undated) |
| Milestone | M1, the language base (141 of 199 records) |
| Records | 199 |
| Outcomes | tooling 40 · plan 38 · positive 27 · inconclusive 26 · review 26 · process 16 · negative 14 · blocked 6 · diagnostic-stop 6 |
| State | Active. M1 is not met and training is held |
Counts: archive/catalog.jsonl. M1 is the first of the eight milestones; 0 of 8 are complete (docs/integration/NOW.md). Terms follow the glossary; ACTIVE, READY and PARKED are defined on the mechanism board.
flowchart LR A["Sep to early Oct<br/>Float readers and<br/>attention latches"] --> B["13 to 14 Oct<br/>First integer GPU path,<br/>first pilot (A2)"] B --> C["15 to 18 Oct<br/>Admission wall;<br/>56x faster scoring"] C --> D["18 Oct<br/>Four 16-cell runs (K16)"] D --> E["19 Oct<br/>No keep; address cells<br/>and their dose (A8)"] E --> F["Next: admission-<br/>preserving rerun"]
Two terms used below. Admission is the shortlist of words the read can see; a word outside it can never be chosen. Top-1 means the right word ranked first.
What it set out to do
Give the discrete model an attention-like read of context. Under the owner's rules (no softmax, no matrix multiplication, integer serving) the read must be a tree walk (Route), a small neighbour set rotated into the query's frame (Flock) or a link-following rule such as "the word after the earlier copy of this word" (Relation). The line's yardstick is milestone M1: a saved discrete artifact that, after export to integer serving and on each of two seeds, beats a unigram table and a successor table on the same development rows (charter, item 8 of the research clauses).
What happened, in order
- Float readers and latches (19 Sep to 5 Oct). A hard capture-and-hold gate let saved models answer 128 of 128 original and stress rows, against 47 to 59 for same-size controls (latch). Fresh complete replies stayed low: a directed cue relation scored 0/32 and its cue-only control 1/32 (cue carrier).
- First integer GPU path (13 to 14 Oct). All eleven construction controls passed, then 25 of 25 (discrete learning, driver cost). The first training pilot (A2, 1,640 batches) raised top-1 from 17 to 82 and top-8 from 173 to 1,169 of 14,287, while the loss total rose from 13,816,032 to 13,884,032 (pilot). The diagnosis: the starting table had only 16 distinct vectors for 4,096 tokens (diagnosis).
- The admission wall (15 to 17 Oct). Re-scoring saved checkpoints with 8 to 16 kept cells never reached the 4,894 admission bar (best 2,400 at 16), so capacity had to be trained in (sweep). Repeated qualification restarts (five by the last record) stopped on build, interface and lint errors and then on a 99-against-100 timing count (restart 5). A host check found that a context-free successor table already scores 6,300 of 14,287 (host diagnostics).
- Speed (16 to 18 Oct). In a three-batch diagnostic, over 99.99% of each proposal's time was one scoring kernel; a row-parallel version gave equal losses about 56 times faster (3.843 s to 0.0691 s) (rows parity).
- The paired test and the 16-cell runs (18 to 19 Oct). The first paired attention test (Dose 1) was stopped by the owner at 904 and 1,065 batches, before any checkpoint, to switch to the row-parallel driver (a diagnostic stop, not a verdict). The paired row-parallel run that followed (Dose 2) reached its registered collapse stop at 4,096 batches in both arms (the Relation read and a frozen control): admission on 3,847 copy-successor rows (development rows where copying the word after the previous occurrence would be right) fell from 2,034 to 225 (Relation) and 205 (frozen control) (Q1 diagnosis). Four runs of the 16-cell experiment (K16) used two training objectives, an address-margin loss (A) and an occupancy-rank loss (R), with two seeds each. They accepted 407, 130, 410 and 129 moves. The occupancy-rank loss collapsed to 19 or 20 occupied cells; the margin loss lost admission. Verdict: no KEEP (no run met its own target), and the fresh slice stays sealed (outcome call).
- Address cells (19 Oct). Placing each token's cell near its predecessors' cells lifted starting admission from 127 to 1,351 of 3,847 at zero training; a shuffled control got 476 (pre-flight). Training then eroded it in the address-cell dose (A8): Relation 1,351 to 551 (stopped), frozen control 857 (A8 dose). A controller that audits admission every 64 batches is built; its GPU qualification has not been run (NOT_RUN) (controller).
Key results
| Result | Kind | Source |
|---|---|---|
| Address-margin runs (K16-A, two seeds): top-1 65 and 463, top-8 547 and 1,295, admission 2,237 and 3,167 of 14,287 (bar 4,894) | measurement | outcome call |
| Unigram table 1,226; context-free successor table (T2) 6,300 of 14,287 | measurement | host diagnostics |
| Aliasing does not explain the ranking failure: the alias ceiling rose to about 9,000 rows yet top-1 stayed low | measurement | outcome call |
| Address cells: 127 to 1,351 of 3,847 at zero training | measurement | pre-flight |
What it taught
Check the instrument first (lesson 1 in what the project knows): a register-count mismatch, a mismatched JSON key and a hash-domain bug each blocked a run or rejected a valid artifact without testing any mechanism. Development is not fresh (lesson 4), and a pass is not a language result. The mechanisms in play are discrete learning, admission, address cells and the three reads linked above.
Current state
M1 is not met. No trained discrete artifact beats the unigram table. The cheapest approved next steps are the read-code capacity capture (W2) and the admission-preserving rerun of the address-cell dose (A8) (docs/labs/repo-renormalization-2026-10-19/audit/synthesis.md, section 4). Any further training needs a new owner release.
Go deeper: the generated catalog page lists all 199 records.
Research line: the prime-zeta codebook (M1)
Every word needs a starting address. The discrete model had been starting from a seeded table that left 4,096 words sharing only 16 distinct addresses. This line built a fixed, repeatable table instead: each word gets a prime number, and the prime is turned into a vector through the phases of the Riemann zeta zeros. All 4,096 words now get unique addresses. The line has three catalog records, and one of them says plainly what the construction does not show.
| Catalog id | m1-prime-zeta |
| Time span | 14 Oct 2026 for the one dated record; two older reference records are undated |
| Milestone | M1 (1 record); none for 2 |
| Records | 3 |
| Outcomes | positive 1 · inconclusive 1 · review 1 |
| State | ACTIVE as the baseline start and the fallback inside the address-cell table (prime-zeta codebook). No trained result against its controls |
Counts: archive/catalog.jsonl. Terms follow the glossary; ACTIVE, READY and PARKED are defined on the mechanism board.
flowchart LR A["Token id"] --> B["Prime p<br/>(4,096th = 38,873)"] B --> C["Zeta phases<br/>gamma x ln p"] C --> D["Snap to E8 roots<br/>(integer table)"] D --> E["256 cells, 16 words each;<br/>4,096 unique vectors"]
The construction, run once offline on the host. The model only sees the finished table of small integers.
What it set out to do
Replace the random start that caused the first pilot's ranking trouble. In that pilot the initializer produced only 16 distinct vectors for 4,096 token identities, so most words could not be told apart by the read (A2 diagnosis). The prime-zeta construction was registered as a zero-training check that a deterministic, arithmetic table could fix that.
How it works
Token \(v\) gets the prime \(p_{\mathrm{id}(v)+1}\), so the vocabulary maps one to one onto the first \(V\) primes. For each of the first 512 pinned zeta-zero ordinates \(\gamma_k\), the phase is \(\theta_k(p)=\gamma_k\ln p \bmod 2\pi\). Four channels per 8-dimensional block are quantized to integers and matched to the nearest of 16 roots of the E8 lattice by an exact integer inner product. A word's writer cell is the pair of roots of its first and last block, a 16 by 16 grid of 256 cells with exactly 16 words each. A uniqueness pass then gives interior blocks distinct roots. Floating point appears only in this one-time host step (docs/labs/repo-renormalization-2026-10-19/audit/mechanisms/prime-zeta-codebook.json, field how_it_works).
What happened, in order
- Older reference work (undated). Replacing a stub router with sixteen zeta-window projections raised top-1 from 0.17 to 1.00, but only on a six-sentence fixture (record). An audit checked every consumer of the stored zeta state vector before widening its storage (audit).
- 14 Oct: construction qualified. The generator was built, with no training and no corpus rows. All 4,096 of 4,096 tokens receive unique vectors, 17 of 17 base CUDA controls and 6 of 6 prime-zeta controls pass, and the tables match across macOS and Linux (construction record).
- 18 to 19 Oct: used as a starting point. Starting from the injective table fixed aliasing but spread tokens over all 256 cells, so only 127 of 3,847 copy-successor rows had the right cell in view at 8 kept cells, below the 500 gate (pre-flight). Address-structured cells (see the M1 line) lifted that to 1,351 at zero training, and prime-zeta remains the fallback inside that table.
Where it stands
| Claim | Kind | Source |
|---|---|---|
| 4,096 of 4,096 tokens get unique vectors; 0 collisions; 256 of 256 cells occupied | measurement | construction record |
| The two matched controls (shifted zeta ordinates, permuted primes) also give 4,096 unique vectors, so uniqueness comes from the quota and uniqueness pass, not from the primes | measurement | same |
| Do prime-zeta phases give similar words similar addresses? Primes are assigned by token id, which is arbitrary | hypothesis (untested) | prime-zeta-codebook.json, never_tested |
| A trained model starting from prime-zeta beats its controls | not run | same |
What it taught
An injective table is necessary, not sufficient. Uniqueness solved aliasing, and it did not solve admission. Two kinds of check are separate here: a construction passing its tests, and a trained model gaining anything from it. A passing control is not a language result.
Current state
ACTIVE. The held trained-in test against the two nulls (a shifted-ordinate null and a permuted-prime null) at matched budget with at least two seeds is the next step. Prime-zeta is a deterministic function of token id, so identical seeds give identical tables; seed variance needs another declared axis.
Go deeper: the generated catalog page lists the three records.
Research line: the float route to rung 0 (M1)
"Rung 0" is the first, smallest training test of a model that obeys every rule: no softmax, no matrix multiplication, geometric parts only. This line tried to reach it with floating-point training, then rebuilt each part until it was lawful. The central case was the "starling" read, which picks about seven neighbouring earlier tokens instead of using softmax. It could not learn from scratch. On 13 October the owner moved training to the integer path, and this line was preserved as inactive evidence.
| Catalog id | m1-float-rung0 |
| Time span | 31 Aug to 13 Oct 2026 |
| Milestone | M1 (9 records) and M4 (15 records, the starling work); 14 untagged |
| Records | 38 |
| Outcomes | negative 7 · plan 7 · tooling 7 · inconclusive 5 · review 5 · positive 4 · diagnostic-stop 2 · process 1 |
| State | Preserved, not active. D37 (18 Oct) made offline float training legal again, but it has not been used |
Counts: archive/catalog.jsonl. Terms follow the glossary; ACTIVE, READY and PARKED are defined on the mechanism board.
flowchart LR A["Sep<br/>Reviews: frozen state<br/>adds 0.022 bits"] --> B["11 to 12 Oct<br/>Starling read tests,<br/>quaternion weights"] B --> C["12 Oct<br/>Softmax ban;<br/>lawful parts rebuilt"] C --> D["13 Oct<br/>18 finite GPU controls"] D --> E["13 Oct<br/>D32 stops float<br/>model computation"]
Seven days of experiments, then a rebuild, then an owner decision that paused the route.
What it set out to do
Reach a first rule-compliant training result. The plan of 12 October named the pieces: a hard rank-hinge loss in place of cross-entropy, an exact flock selection on the 600-cell, a raw-score output head, a rotation gate in place of sigmoid gating and a geometric projection in place of dense maps (design). Rung 0 would pass only if the margin loss fell steadily and the rate of unviolated targets reached five times the no-model rate on both seeds.
What happened, in order
- September reviews. A frozen recurrent state added only 0.022 bits over a count table, so no readout work was justified (result).
- 11 Oct: the starling read. Trained from scratch, it scored mean recall 0.009 (chance 0.0045) where an L2-softmax control scored 0.617, because hard selection gives unchosen keys no gradient (record). A temporary dense helper raised the address hit rate from 10% to 73% but recall stayed at 0.011 (anneal). Gating by content instead of address did not help (content).
- 12 Oct: partial recoveries. A dense bootstrap teacher got 3 of 5 seeds to softmax-level recall, against 1 of 5 without it (bootstrap). A light distillation weight gave 0.380 (sweep). Training twice as long gave 0.78 on 5 of 5 seeds on a 512 synthetic test, a provisional KEEP (target met, at an unequal budget) (recall). At 1,536 context the read collapsed to 0.241 against 0.999, because each cell kept only its last four keys (context). A persistent tree fixed retention but recall stayed at 0.329 (tree).
- Quaternion weights (11 Oct). Quaternion-structured projections beat a dense model of equal parameters by 0.018 bits per byte, six times the noise, with four times fewer matrix weights than an equal-width dense model (record).
- 12 to 13 Oct: lawful rebuild. Source landed for the rank-hinge loss, the Hamilton gate, geometric recurrence gates and the SpiralCore and FBS projection. Finite GPU checks passed: 18 controls on the complete path (rung 0 path). No training followed.
- 13 Oct. The owner's D32 decision banned float model computation. The float qualification attempts were stopped and kept: 31 of 33 controls passed at the last complete replay; the 34-control replay was NOT_RUN. This was a scope change, not a mechanism negative (record).
Key results
| Result | Kind | Source |
|---|---|---|
| Starling from scratch: recall 0.009 against 0.617 for the L2-softmax control | measurement | starling read |
| Starling with persistent tree at 1,536 context: 0.329 against 0.999 for softmax | measurement | tree |
| Quaternion weights 1.495866 against 1.513594 bits per byte for dense at equal parameters | measurement | record |
| 18 finite GPU controls pass on the complete rung-0 path; no training | measurement | rung 0 path |
What it taught
Hard geometric selection gives unselected keys no gradient, so it needs a training bridge (lesson 12 in what the project knows). Every float read that learned had softmax help it in training, so whether a softmax-free read can learn ranking from scratch is the biggest open question (docs/labs/repo-renormalization-2026-10-19/audit/synthesis.md, section 5). A scope change is not a negative (lesson 21).
Current state
Preserved evidence, not a live line. The surviving parts are READY, never trained: Hamilton gate, recurrence gates and SpiralCore/FBS. Flock read is ACTIVE on the discrete path and spin weights is PARKED. Archived float sheets return only as new sheets with a fresh review.
Go deeper: the generated catalog page lists all 38 records.
Research line: grounded replies from exact memory (M2)
This line tried to make the model answer a question from a fact it was told earlier, and to say "I don't know" when it was never told. Facts sit in an exact store, so storing and fetching are not the hard part. The hard part is getting a trained model to read the right fact and write it out. One model reached 437 of 512 correct replies on the rows the team had been tuning on, then 0 of 128 on fresh rows.
| Catalog id | m2-exact-memory |
| Time span | 3 Sep to 12 Oct 2026 (7 records undated) |
| Milestone | M2, grounded reply from exact memory (60 of 151 records); 38 tagged M1 |
| Records | 151 |
| Outcomes | review 39 · negative 35 · positive 25 · inconclusive 21 · diagnostic-stop 12 · plan 9 · tooling 9 · blocked 1 |
| State | Held. M2 is incomplete; fresh qualification failed |
M2's bar is at least 256 of 512 saved replies and at least 40% on genuinely fresh rows, with existing panels and graders unchanged (ROADMAP.md, M2 row). Counts: archive/catalog.jsonl. Terms follow the glossary; ACTIVE, READY and PARKED are defined on the mechanism board.
flowchart LR A["Sep<br/>Reviews and scoped<br/>memory sessions"] --> B["28 to 29 Sep<br/>Always-on store read<br/>fails its gate"] B --> C["9 Oct<br/>Chat model cannot<br/>copy a stored number"] C --> D["10 Oct<br/>8 to 437 of 512<br/>on development rows"] D --> E["10 Oct<br/>Fresh draw: 0 of 128"] E --> F["11 to 12 Oct<br/>Read binding KEEP;<br/>softmax ban; hold"]
The development score rose in steps on a panel the team could see. The fresh draw, run with no further training, did not follow.
What it set out to do
Build the second capability after a language base: a reply that is correct because it came from an exact record, not from a guess. Exact storage is easy and was never the problem; an exact store scored 1.000 whenever its register was right (exact memory dossier). The line tested which learned reader or writer could use it.
What happened, in order
- September. Fifteen records dated 3 Sep are source audits and acceptance reviews of a text-to-clause adapter and a native bridge. A pre-registered exact-pair cache lowered the count reference by 0.238 bits per target on exposed project Markdown, not general prose (result). An always-on exact-store read failed its gate on all three seeds, with held-out accuracy of 0.03 to 0.16 against a 0.90 bar (G1). A diagnostic put 77.7 percent of held-out failures at query-entity tagging (decomposition).
- 1 to 5 Oct. Adapting only the readouts raised complete own-prefix source replies from 4/20 to 18/20 (coadapt), yet a prospectively frozen fresh panel gave 0/8 (frozen transfer).
- 9 Oct. Traces showed why stored numbers failed. The copy pointer attended the repeated sentence frame, never the second digit of the value (0 of 13 rows), and the 4,096-piece vocabulary has no multi-digit tokens (positional read). Several attempts to build legal parameter changes with an exact solver stopped on numeric errors, which are blockers, not negatives.
- 10 Oct. Whole-answer replies on the 512-row development panel went 8, 22, 145, 175, 177, then 437 after training each token against its strongest wrong rival (260 gains and no losses on that last step) (pooled rank). Five other recipes lowered it (8 to 2, 8 to 4, 8 to 0 and 145 to 139 replies). The saved 437 model then scored 0/128 against a bar of 52 on fresh role and value combinations (fresh).
- 10 to 12 Oct. Training the read to land on the asked value was flat at first (19/40 against 20/40). A powered rerun over three seeds cut wrong-value failures from 47 to 30 of 120, and at four times the length from 49 to 23 (scaled). Both met their bars, so each was a KEEP (target met without a significant loss elsewhere), but on a softmax read. A whole-path source reference was built; CUDA execution has not been run (NOT_RUN) (recovery). The softmax ban (D23, 12 Oct) and the M2 training hold stopped further runs.
Key results
| Result | Kind | Source |
|---|---|---|
| 437/512 on the exposed development panel, then 0/128 fresh (bar 52/128) | measurement | fresh |
| Read binding, 3 seeds: wrong-value 47 to 30 of 120, memory rows 57 to 65 | measurement | powered |
| Product-key memory added to the chat model: 19/40 on stored-value questions against a 27/40 bar | measurement | addressed memory |
| Muting the last read layer: memory answers 24/40 to 0/40 | measurement | head ablation |
| Rounding to the legal quarter grid causes 90 to 96% of the adverse pressure on failed protected updates | measurement | attribution |
What it taught
Development is not fresh (lesson 4 in what the project knows). An exact log retrieves; the learned pointer copied recency (lesson 9). Chat failures came from missing knowledge and fluency, not retrieval (lesson 10), and binding failures came from the recipe (lesson 20). Hard selection needs a training bridge (lesson 12). On 10 Oct the three-negatives rule (D21) fired, and D22 ruled that a negative closes a configuration only.
Current state
M2 is held. These mechanisms are PARKED, each with the conditions that would reopen it: exact memory, read binding, pointer key, carrier credit, legal construction and native geometric. The next step in the exact-memory dossier is to build the address itself as the read, with an oracle test first. The durable store lives in the M3 line.
Go deeper: the generated catalog page lists all 151 records.
Research line: durable memory and the object store (M3)
Milestone M3 asks that a conversation's memory survive between sessions and that answers stay grounded in it. This line built the storage half: an exact object store that keeps bytes once in a hashed tree, can fetch any range with an integrity check, and can copy itself between machines. The store works and is well tested. Nothing in the model reads from it yet, so M3 has not been measured.
| Catalog id | m3-durable-memory |
| Time span | 3 Oct to 18 Oct 2026 |
| Milestone | M3, durable conversation memory (28 of 33 records) |
| Records | 33 |
| Outcomes | tooling 27 · inconclusive 2 · plan 2 · positive 1 · review 1 |
| State | The object store is READY (D19 object store). M3 is paused and its bars have not been run |
Counts: archive/catalog.jsonl. The store follows decision D19 (a model-independent exact byte store). Terms follow the glossary; ACTIVE, READY and PARKED are defined on the mechanism board.
flowchart LR A["3 to 5 Oct<br/>Chat-memory<br/>diagnostics"] --> B["14 to 15 Oct<br/>Design, build, byte tests"] B --> C["17 to 18 Oct<br/>Replication, audit,<br/>repair, cross-language"] C --> D["Not yet<br/>A model that reads it;<br/>M3 bars"]
Most of the work sits in the third box. The fourth box has not started.
What it set out to do
Give the model a memory outside its weights: exact bytes, deduplicated, verifiable and portable, tied to token occurrences. The early records (3 to 5 Oct) tested whether a model could use an exact selected value in chat. With the exact value supplied, 16 of 20 development cases answered correctly against 0 of 20 with the read off (source binding). That is an open-development diagnostic only.
What happened, in order
- Design (14 Oct). Data is folded into hashed records that can be rebuilt or range-read with checks. A node id is 12 bytes. A 32,768-byte fixture record kept 70,972 bytes, a reminder that deduplication is not universal compression (design).
- Build (14 to 15 Oct). A Rust reader fetched 203 byte ranges with identical bytes from an eager and an indexed backend (reader). The store folded and rebuilt source bytes exactly; a repeated fixture kept 380 bytes for 7,776 raw bytes. Twenty integration tests and 13 tokenizer tests passed (store).
- Replication and audit (17 to 18 Oct). About 25 records add a peer protocol. A receiver holding an older 1 MiB version fetched 22 records, 1,014 bytes, in three rounds (peer). Batching a cold 52 MB pull over a high-latency link took 91.50 s against 236.19 s (batch). Pipelined fetches ran about 2.8 times faster with an emulated 8 ms delay, which is not a real wide-area measurement (pipelined). Other records add pinning, failover, repair, retries and a verified audit command. Twelve warm receivers pulling at once took 0.864 s against 3.506 s one at a time (concurrency).
- Second language (18 Oct). A pure-Python client audited and pulled a 256 KiB artifact from the Rust server over loopback, byte for byte (conformance). The test suite stands at 60 passing (batch plumbing).
Key results
| Result | Kind | Source |
|---|---|---|
| Exact value supplied: 16/20 development cases correct, 0/20 with the read off | measurement | source binding |
| Repeated fixture: 380 retained bytes for 7,776 raw bytes | measurement | store |
| 1 MiB delta pull: 22 records, 1,014 bytes, 3 rounds | measurement | peer |
| WAN cold pull with batching: 91.50 s against 236.19 s (2.58 times) | measurement | batch |
| Cross-language conformance: PASS, 262,144 bytes pulled identical | measurement | conformance |
What it taught
A byte store is a reliable component, and its tests show that it stores and returns bytes exactly. They say nothing about whether a model can use it, and a passing control is not a language result. The record also shows where effort went: 27 of the 33 records are tooling, and most are network plumbing built before any model consumed the store (a count from the catalog; the reading is a hypothesis).
Current state
READY. Nothing consumes the store and no M3 bar has been run (board). The next step is to wire it in and run the M3 bars. Exact addressed memory as a read is still unbuilt (exact memory).
Go deeper: the generated catalog page lists all 33 records.
Research line: integer serving (M4)
This line is about running a finished model on an ordinary laptop or in a browser using only whole-number arithmetic, adds and table lookups: no floating point and no multiplication. In the records the engine reproduced its float models exactly on the old stack, and the multiply-free audits pass on the WASM serving symbols. What is missing is a trained model worth serving: the models tried scored 1.20 to 1.24 bits per byte against a 0.90 target, and no model that obeys all the current rules has been exported.
| Catalog id | m4-serving |
| Time span | 7 Aug to 18 Oct 2026 (6 records undated) |
| Milestone | M4, one served model under D11 and a command-line interface (12 of 42 records); 4 tagged M1 |
| Records | 42 |
| Outcomes | tooling 10 · negative 9 · positive 7 · inconclusive 6 · review 3 · ops 2 · process 2 · blocked 1 · diagnostic-stop 1 · plan 1 |
| State | The D11 engine is ACTIVE (D11 integer serving). M4 is held; the export gap of a lawful model is unmeasured |
Counts: archive/catalog.jsonl. D11 is the owner decision that every lab serves under one multiplier-free contract. Terms follow the glossary; ACTIVE, READY and PARKED are defined on the mechanism board.
flowchart LR A["Aug<br/>R4G1 serving profiles,<br/>skip-mix, source-free table"] --> B["8 Sep<br/>Alpha claim withdrawn"] B --> C["9 to 10 Oct<br/>Served vs float gap<br/>is the model, not the engine"] C --> D["10 to 11 Oct<br/>Softmax-free reads<br/>and icosian weights"] D --> E["18 Oct<br/>WebAssembly runtime,<br/>zero-multiply audit"]
The engine was settled early. The quality gap was never in the engine.
What it set out to do
Make fast, cheap, local inference real: one served model, integer-only (D11), reachable from a command line, with tokens per second and energy measured on the owner's laptop. The product is serving; panel scoring and training stay on the GPU.
What happened, in order
- August. A source-free integer n-gram table predicted 22.26% of held-out targets against 5.41% for unigram, and one exact tie-break added 0.95 points (table, tie-break). The skip-mix lane beat base by +28.45 per mille top-1 (record). A vector (SIMD) scan sped one path up 1.60 times against a 2 times bar (record).
- 8 Sep. The alpha publication was withdrawn: the scorecard had used constant or flag evidence (record).
- 9 to 10 Oct: the gap is the model. The published 0.877 float against 0.933 served compared different numbers of windows. On a matched retrain the pair is 0.8776 against 0.8868 bits per byte (protocol pin). The recorded criterion is still "not met and not claimable", and the matched float model sits at 0.924 on the attribution record's own table. At identical positions quantization cost 0.0041 and the engine cost -0.0000008 (attribution). The integer engine matched float exactly (maximum logit difference 0) while three served models scored 1.20, 1.24 and 1.24 against the 0.90 target (D11 serving).
- 10 to 11 Oct: lawful pieces. Replacing the served softmax read with rank-weight tables cost 0.017 to 0.26 bits per byte more across four arms, all missing a 0.01 bar (softmax-free read). Weights built from two icosian table entries and a 2-bit mantissa reached 1.5148 against 1.4944 for float quaternions and 1.5136 for dense of equal size (icosian mantissa). The integer engine refuses product-key memory entirely, so the speed case there is unmeasured (port).
- 18 Oct. An outside contributor's WebAssembly integer runtime was merged after hardening: 165 tests pass and 7 of 7 serving symbols show no multiply, divide or float. The vector (SIMD) kernels are not integrated and the demo is not runnable from a clean clone (record).
Key results
| Result | Kind | Source |
|---|---|---|
| Integer engine equals float: negative log-likelihood difference 0.0, maximum logit difference 0 | measurement | D11 serving |
| Served quality 1.20138, 1.24402 and 1.24233 bits per byte; target at most 0.90 | measurement | same |
| Speed fell from 63.41 tokens/s at 384 context to 30.43 at 4,096, so replacing the quadratic read buys at most about 1.7 times | measurement | context curve |
| 3-bit E8 quantization of SmolLM2 MLP weights was +4.89 nats worse than 4-bit round-to-nearest, tripping its kill rule | measurement | record |
| Zero-multiply audit: 44 native symbol ranges and 7 of 7 WebAssembly serving symbols | measurement | WASM runtime (7 of 7); project track (44 native ranges) |
What it taught
Check the instrument before blaming the engine (lesson 1 in what the project knows): most of the apparent served-versus-float gap came from comparing different numbers of windows. Measure the shipped form (lesson 2). Savings counted on paper are not tokens per second (lesson 13). Exact integer export and bit-exact serving work (lesson 17).
Current state
The zero-multiply and bit-exact properties are verified on the old stack and on the WASM serving symbols. The engine has not served any model that obeys the current rules, and the WASM record lists its SIMD kernels as unintegrated fixtures, so its contract is not yet exercised end to end. The 19.9M-parameter stack that missed the old M1 bar read every weight on every token, and two of the integer schemas serve softmax through exponent tables, which the current rules ban (docs/labs/repo-renormalization-2026-10-19/audit/synthesis.md, section 1). The next step is to export one discrete artifact and measure its export gap (board). Product serving, including tokens per second and energy on the laptop, is allowed; panel scoring of an exported artifact is still GPU research compute.
Go deeper: the generated catalog page lists all 42 records.
Research line: laptop energy and cost (M5)
The project's goal is fast local AI that costs little energy. Milestone M5 asks for the proof: measured joules per token, memory use and tokens per second on an M1 laptop. This line has only four records, and the milestone is not started. The most useful record is a warning: an operation count of "90% fewer multiplies" did not become faster generation. It was 1.65 times slower.
| Catalog id | m5-energy |
| Time span | 25 Sep to 18 Oct 2026 |
| Milestone | M5, laptop cost (1 record); M1 (1); none (2) |
| Records | 4 |
| Outcomes | negative 1 · plan 1 · process 1 · review 1 |
| State | Not started. No joules per token has been measured for a model on the current path |
Counts: archive/catalog.jsonl. M5's bar: measured J/token, memory and tokens/s on the M1 with the selected parameter access (ROADMAP.md). Terms follow the glossary; ACTIVE, READY and PARKED are defined on the mechanism board.
flowchart LR A["25 Sep<br/>Low-energy plan<br/>(derived figures)"] --> B["28 Sep<br/>Cost-profile lineage<br/>corrected"] B --> C["11 Oct<br/>Tokens/s: lookup read<br/>1.65x slower"] C --> D["18 Oct<br/>Old cost figures<br/>relabelled as guesses"] D --> E["Open<br/>Joules per token"]
Three of the four steps corrected an earlier claim.
What it set out to do
Show that a geometric, table-driven model uses less energy per token on a laptop than an ordinary model. The plan of 25 September proposed ternary table-lookup serving with recurrence and exact memory, to be judged by measured joules per token. Its energy figures were derived from operation counts, not measured (plan).
What happened, in order
- 28 Sep: a sealed record was edited. The sealed root of the cost profile for the D11 serving contract had been edited in place and resealed. The correction records the hashes, the overwritten fields and a duplicated evaluation record (lineage correction).
- 11 Oct: the metric changes. The owner directed that generated tokens per second is the headline comparison, reported with panel acceptance and never alone. A direct test swapped a layer's feed-forward block for an addressed lookup memory. Analytic multiplies fell by 90%, but generation ran at about 385 ids per second against about 637 for the control, 1.65 times slower. Training took 245 s against 104 s for 2,000 steps, 2.4 times longer (tokens per second). A same-day correction relabelled the arms as feed-forward block against lookup memory, not read against address.
- 18 Oct: cost provenance. Energy evidence must separate cache residency from sparsity. Earlier cost figures for the injective-initialisation draft are relabelled planning guesses, not measurements: 1.31 s per batch survives only as an extrapolation, and 5,361 seconds meant a resource lifetime, not a per-batch time (record).
Key results
| Result | Kind | Source |
|---|---|---|
| Generation about 637 ids/s (control) against about 385 ids/s (addressed lookup): 1.65 times slower | measurement | tokens per second |
| Multiply count at the replaced layer fell 90% (1,769,472 to 173,056 at context 384) | proof (arithmetic count) | same |
| Integer serving first cost 4.3 times more energy than its float parent, on a dense configuration | measurement | docs/labs/repo-renormalization-2026-10-19/audit/synthesis.md, section 5 (#1449) |
| Energy per token on the current discrete path | not measured | no record |
What it taught
Savings counted on paper are not tokens per second (lesson 13 in what the project knows). Check where compute goes: the output readout took 99.97% of per-token compute in one model, and geometric operations were 0.05% of the stack's arithmetic (lesson 14). A table read is the intended primitive of the native integer path, but that path refuses product-key memory today, so the lookup's cost there is unmeasured (native address port).
Current state
Not started. M5 needs a lawful model to measure, and none has been exported (serving line). Product serving and its tokens per second and energy on the client device are allowed measurements (charter, item 6).
Go deeper: the generated catalog page lists all 4 records.
Research line: API, browser runtime and Studio (M7)
Milestone M7 asks that the finished model be reachable through a local API, a WebAssembly runtime and a web "Studio". This line holds the early design and review work for that surface and one cleanup of the Studio. It contains no model result, because there is no model to serve yet. The runtime half has since been delivered (see the serving line); the model half has not.
| Catalog id | m7-distribution |
| Time span | 3 Sep to 15 Oct 2026 (3 records undated) |
| Milestone | M7 by name; the catalog tags none of its 8 records |
| Records | 8 |
| Outcomes | review 5 · tooling 2 · plan 1 |
| State | Runtime delivered, model bundle not integrated. Local API only |
Counts: archive/catalog.jsonl. State: ROADMAP.md, M7 row. Terms follow the glossary; ACTIVE, READY and PARKED are defined on the mechanism board.
flowchart LR A["Sep<br/>Service contract and<br/>workbench specification"] --> B["Static reviews<br/>Nothing built or run"] B --> C["15 Oct<br/>Studio cleaned;<br/>banner: no WASM engine"] C --> D["18 Oct<br/>WASM runtime lands<br/>(serving line)"] D --> E["Open<br/>Model bundle<br/>reachable?"]
The surface was specified early and built late; the model that would fill it is still missing.
What it set out to do
Put the model in a person's hands: one local Rust service that owns model identity, inference and a static web workbench, plus a browser runtime. The project states that nothing on this surface proves model quality.
What happened, in order
- 3 to 4 Sep: specification and review. An independent review accepted the native workbench service API specification, with no implementation, runtime or model result (review). A source manifest listed original and R4 sources for the service contract, with nothing executed or copied (sources). The frontend port plan fixed the product boundary and was kept as a reference, with nothing built (plan).
- Workbench source (undated). The workbench candidate was frozen as reviewable but unbuilt, and a static review accepted its source contract after five corrections, with compilation, tests and behaviour explicitly not run (candidate, review). A source-only audit looked at the learned-reference seams for the service (audit).
- 3 Sep: publication check. An audit found the browser-product arXiv package not ready: a stale bibliography, unverified benchmark constants and an overstated formal-verification scope. No decision notice was located (audit).
- 15 Oct: Studio cleanup. The cleanup removed five dead calls to WebAssembly functions, guarded one missing function and added a banner saying no served WebAssembly engine exists yet. A search for the dead references now finds zero matches (cleanup).
Key results
| Result | Kind | Source |
|---|---|---|
| Dead WebAssembly references in the Studio page after cleanup: 0 matches | measurement | cleanup |
| WebAssembly runtime: 165 tests pass, 7 of 7 serving symbols with no multiply, divide or float | measurement | WASM runtime |
What it taught
An interface can be specified, reviewed and even delivered while the thing behind it does not exist. A passing specification review is not a capability, and a banner that says so is honest. The publication audit found a stale bibliography, unverified constants and an overstated proof scope in a draft paper package.
Current state
M7 is not met. The runtime is delivered; the selected model bundle is not yet reachable through it, and only a local API exists (ROADMAP). The demo is not runnable from a clean clone (WASM record). Pre-alpha: 0 of 8 milestones are complete.
Go deeper: the generated catalog page lists all 8 records.
Research line: the geometric stack
The "geometric stack" was a layered float model whose layers carried state with quaternion rotations. It was trained offline and then converted to 4-bit integers for serving. It matched an ordinary transformer on loss, served bit-exactly, and still wrote useless prose. It also used softmax, SiLU and matrix multiplication in training, so the owner's later bans made it a historical form. Some of its pieces live on as READY mechanisms that have never been trained.
| Catalog id | geometric-stack-pretraining |
| Time span | 20 Sep to 11 Oct 2026 (2 records undated) |
| Milestone | None recorded (81 of 84); 3 tagged M1 |
| Records | 84 |
| Outcomes | plan 21 · negative 20 · positive 18 · inconclusive 8 · review 6 · tooling 5 · diagnostic-stop 4 · process 2 |
| State | The whole-model form is PARKED (geometric stack) |
Counts: archive/catalog.jsonl. Terms follow the glossary; ACTIVE, READY and PARKED are defined on the mechanism board.
flowchart LR A["24 to 26 Sep<br/>Float recurrent learner<br/>vs count baselines"] --> B["25 Sep<br/>Integer bridge and<br/>learned rounding"] B --> C["26 to 28 Sep<br/>Lorentz reads, codecs,<br/>exact relation store"] C --> D["29 Sep<br/>Quantization-aware<br/>training closes the gap"] D --> E["6 to 11 Oct<br/>D20 contest: no winner;<br/>claims withdrawn"]
The stack's arc: a good loss number, then repeated attempts to turn it into a model that talks.
What it set out to do
Train a deeper model with recurrence, geometric reads and exact memory, then compress it to integers and serve it without multiplications. The steps followed the owner's learning ladder (decision D8: reference baselines, then joint learning, then conversion to the discrete form): reference baselines, a joint recurrent learner, then conversion to the discrete form.
What happened, in order
- Baselines and the recurrent learner (24 to 25 Sep). A neural reference reached 1.574 nats against 2.392 for the best 5-gram-plus-cache baseline (baselines). Both float recurrent arms reached about 2.11 nats and passed the engineering gate, but the quaternion arm trailed the ordinary control, so no geometric advantage was shown (result).
- Integer forms (25 to 27 Sep). Four-bit quantization-aware training missed its +0.05-nat retention gate (+0.059 and +0.080) (result). Learned rounding passed (2.114 and 2.111 nats) and an integer bridge kept every source answer, about 28 times slower than float (learned rounding, bridge). A standalone integer command reproduced all 4,096 saved distribution hashes and ran 4.5 to 6.6 times faster after one optimization (serving). Continued language training lowered loss but produced 0 of 5 acceptable stories (continuation).
- Geometric reads (26 to 28 Sep). A Lorentz (hyperbolic) read beat a dot-product read by 0.018 nats on code in 3 of 4 seeds, then lost to the matched dot reset when adapted (+0.046 and +0.013 nats) (cycle 3, adaptation). The stack matched a 7M-parameter transformer on repository code (1.998 against 2.011 nats), but generated code was useless (cycle 4). An exact relation store was perfect in distribution but its learned read trigger fired 0 of 826 times on held-out phrasing (exact relation store probe, D2).
- Quantization (28 to 29 Sep). Round-to-nearest 4-bit export cost +0.0362 nats against a 0.02 gate (representation measurements). Quantization-aware training brought the integer engine within +0.0106 nats of its float model, bit-identical to a NEON reference (QAT).
- Contest and withdrawals (6 to 11 Oct). In the D20 contest, a three-seed test of the geometric read against a parameter-matched control found no winner: the geometric arm scored 0.0073, 0.9995 and 1.0000 in class against about 0.25 for the control (D20 run). A claimed 12-times faster fused kernel was withdrawn because the pod never ran it (record).
Key results
| Result | Kind | Source |
|---|---|---|
| Stack parity with a transformer control: 1.998 against 2.011 nats on repository code | measurement | cycle 4 |
| Quaternion transport beat identity by 0.071 and 0.077 nats; confounded by softmax, sigmoid, dense layers and a 332,928-parameter difference | measurement | attribution |
| Dialogue stack: pooled response loss 2.521 against 2.774, yet 2 of 38 final turns answered and no memory recalled | measurement | baseline |
| Geometric operations were 0.05% of the stack's arithmetic | measurement | docs/labs/repo-renormalization-2026-10-19/audit/eras/eras.md (#2186) |
| Served 1.20 to 1.24 bits per byte against the 0.90 target | measurement | D11 serving |
What it taught
Loss and prose are different things: a good number coexisted with 0 of 5 stories (lesson 3 in what the project knows). Fixed geometry usually tied or lost to a matched control (lesson 6), and the quaternion-transport win is a hypothesis until a parameter-matched, lawful control exists. Compute went to the readout, not the geometry (lesson 14).
Current state
PARKED as a whole model. Its lawful pieces are tracked separately: the Hamilton gate and recurrence gates are READY but never trained. The next step in the dossier is a rebuild from lawful parts under D37 (offline float training, no matmul or softmax) with an exporter, which does not yet exist.
Go deeper: the generated catalog page lists all 84 records.
Research line: the September native geometric model
This line was the project's first attempt to build a language model from scratch in Rust out of geometric parts. It gave the model an exact memory of what was said and small learned "readers" that choose what to look at. It produced many narrow wins on hand-written test panels and no model that writes prose. The ideas that survived went into the discrete model that now carries the project.
| Catalog id | native-geometric-sept |
| Time span | 31 Jul to 28 Sep 2026 (one early record; the bulk runs 27 Aug to 28 Sep; 62 records carry no date) |
| Milestone | None recorded (292 of 294 records); the work fed M1 (language base) and M2 (grounded reply) |
| Records | 294, the largest line in the catalog |
| Outcomes | positive 113 · negative 81 · plan 40 · inconclusive 25 · review 22 · process 6 · diagnostic-stop 5 · blocked 1 · tooling 1 |
| State | Closed as a line. Its whole-model form is PARKED (see native-geometric) |
Source for every count: archive/catalog.jsonl, counted with jq. Terms follow the glossary; ACTIVE, READY and PARKED are defined on the mechanism board.
flowchart LR A["27 Aug to 3 Sep<br/>Attention in geometric<br/>coordinates; recall test"] --> B["4 to 13 Sep<br/>Rust engine and exact<br/>memory on authored panels"] B --> C["12 to 13 Sep<br/>Joint fits fail<br/>their gates"] C --> D["19 to 25 Sep<br/>Learned readers and<br/>integrated attention"] D --> E["25 to 28 Sep<br/>Admission and address<br/>codes rejected"] E --> F["Discrete model<br/>(see M1 line)"]
The line in five steps. Most of the green results sit in the second box and were scored on panels the authors wrote.
What it set out to do
The compile-a-teacher approach (R4G1) had stalled: it could copy a teacher but not write text on its own. This line asked a different question. Can a model whose parts are exact geometric objects, such as prime-number addresses, rotations in four dimensions (H4) and versioned records of what was said, learn to read context and answer from it?
What happened, in order
- Attention in geometric coordinates (27 Aug to 3 Sep). Small positive tests changed a decoded continuation: for example real 2/2 against 0/2 when the binding was permuted (paragraph test). Not all passed. Full H4 causal attention scored 3/12 while plain fixed-tangent attention scored 12/12 (direct causal test), and a gauge-covariance test scored 13/24 against an 18 gate (V4). A recall control (Zoology) reached 99.17% (11,900/12,000) with an ordinary softmax cell, which showed the earlier binding failures came from the training recipe (record).
- A parameter-free readout ladder failed. Four variants of reading retained state all missed the frozen prompt-gain floor of 0.0433 (best 0.0390) (block-delta).
- Rust engine and exact memory (4 to 13 Sep). Dozens of narrow positives on authored panels, for example 50/50 against 12/50 for a contextual phrase start and 64/64 against 0/64 for fresh historical targets (contextual start, historical query). Each is scoped to a familiar grammar. The fixed geometric readout alone scored 0.13% against 21.5% with geometry disabled (recovery).
- Joint fits failed (12 to 13 Sep). Eight negative records on calibrated emission, block learning and tied sampling each broke earlier behaviour or missed a gate. A 64-update addressed-attention pilot produced no useful answers (pilot).
- Learned readers (19 to 25 Sep). A competing-source reader beat exact recurrence on a built panel but harmed natural text by +1.29 bits per token against a +0.05 tolerance (result). H4 shared transitions scored 186/288 where an ordinary finite table scored 288/288 (result). Four integrated-attention trials (A1 to A4) lifted correct source admission from 1/24 to 17/24 but never produced a complete correct answer (0/12 per arm) (A3).
- End of the line (25 to 28 Sep). Bounded admission lost the first noun in 11 and 8 cases against a maximum of 2 (result). Icosian direction codes changed the dense read's top choice at 41 to 46 percent of positions and were rejected as address codes (audit).
Key results
| Result | Kind | Source |
|---|---|---|
| Zoology cell reproduced at 99.17% (11,900/12,000); no geometric claim | measurement | record |
| Coherent R4 transport preserved 11,900 of 12,000 decisions of that model | measurement | record |
| Fixed geometric readout 0.1312% against 21.5206% with geometry off | measurement | recovery |
| Read-conditioned residual emitted 35/180 correct uncopied answers on development | measurement | result |
| Policy campaign shown infeasible for every per-bucket action table | proof | result |
| Integrated attention A3: admission 17/24, complete answers 0/12 per arm | measurement | A3 |
What it taught
- A pass on an authored panel is not language. Many positive records state their own scope as an authored panel, a familiar grammar or development rows only (lessons 3 and 4 in what the project knows).
- Fixed geometry tied or lost to a matched ordinary control (lesson 6), and exact algebra reproduced perfectly without carrying meaning (lesson 8).
- Binding failures came from the recipe, not the architecture (lesson 20).
- Several first readings were later withdrawn by principal reviews, for instance a gain that did not reproduce after a threshold defect (lesson 1).
Current state
Closed. The whole-model form is PARKED. Its reads continue as the Route, Flock and Relation reads of the discrete model (route, flock, relation), and its exact memory as exact memory. A negative closes a configuration, never a mechanism (D22). See history for how this fits the five phases.
Go deeper: every record of this line is listed in the generated catalog page.
Research line: the August geometric intelligence programme
In August the project asked a basic question: can the geometry it likes, rotations in four dimensions (R4/Spin coordinates) and hyperbolic (Lorentz) space, carry the work of attention in a language model? The programme (issue #973) reproduced ordinary attention exactly inside these coordinates, which is a useful parity check, but never found a case where the geometry did better than a plain control. This line holds its nine records. Its questions moved into the September native model.
| Catalog id | geometric-intelligence-aug |
| Time span | 25 to 30 Aug 2026 (1 record undated) |
| Milestone | None recorded (9 of 9) |
| Records | 9 |
| Outcomes | negative 3 · plan 2 · positive 2 · diagnostic-stop 1 · inconclusive 1 |
| State | Closed; superseded by the September native model. Configurations are closed, the ideas are not |
Counts: archive/catalog.jsonl. Terms follow the glossary; ACTIVE, READY and PARKED are defined on the mechanism board.
flowchart LR A["25 to 26 Aug<br/>Decoder plan; mixer<br/>test and spike"] --> B["28 to 29 Aug<br/>Lorentz attention and<br/>retention tests"] B --> C["30 Aug<br/>Learned manifold;<br/>score localisation"] C --> D["Softmax decoder in R4<br/>coordinates: exact parity,<br/>no advantage"]
Parity was achieved; advantage was not.
What it set out to do
Replace or enrich the standard transformer's attention with geometry from the project's own toolbox, using a small donor model (SmolLM2) as the reference. A positive result would have meant a measurable gain over a matched control that uses the same parameters and no geometry.
What happened, in order
- 25 to 26 Aug: a decoder plan and a mixer. A one-layer mixer distilled from a donor layer beat a coordinate-permuted control by 4.44% against a 5% gate, verdict REDESIGN_REPRESENTATION (record). A layer-29 geometric spike passed its first gate with 32 cycle-free tokens and 4/5 on a control review, promoted to the next gate with no quality claim (spike). The decoder roadmap records that its next gate (G1) ended in REDESIGN_REPRESENTATION (plan).
- 28 Aug. Retention with a geometric gate scored 16/28 against 23/28 for plain gated delta on a synthetic fixture (record).
- 29 Aug. Intrinsic Lorentz attention was stopped before held-out data. Its covariance residual was 9.12e-8 against a frozen ceiling of 1e-8, and the curved arm trailed the flat one (record). A learned Lorentz manifold had cross-entropy 7.71 against 4.48 for a flat Euclidean arm and 3.67 for the donor (record).
- 30 Aug. A tangent value readout was 1.0644 times worse than a normalised-centroid readout, and a plain Euclidean score beat the Lorentz score as a diagnostic (record). A preflight for finite Lorentz score radii was parked and never run (record).
- Undated. The full decoder with ordinary causal softmax run through coherent R4/Spin frames matched the donor's logits to a maximum absolute difference of 1.05e-5 over 196,608 logits, with no R4 advantage (record).
Key results
| Result | Kind | Source |
|---|---|---|
| R4/Spin softmax decoder matches the donor: maximum logit difference 1.05e-5 over 196,608 logits | measurement | record |
| One-layer mixer beats a permuted control by 4.44%; gate 5% | measurement | record |
| Geometric retention 16/28 against plain 23/28 | measurement | record |
| Learned Lorentz manifold cross-entropy 7.71 against 4.48 Euclidean and 3.67 donor | measurement | record |
What it taught
Exact algebra reproduces ordinary behaviour perfectly but carries no meaning on its own (lesson 8 in what the project knows). Fixed geometry usually tied or lost to a matched control (lesson 6). The Lorentz idea returned in September, where a Lorentz read beat a dot read by 0.018 nats on code in 3 of 4 seeds before it lost when adapted (stack line). Each negative closes only its exact configuration (decision D22).
Current state
Closed. The programme record survives as inactive evidence.
Go deeper: the generated catalog page lists all 9 records.
Research line: compiling a teacher into tables (R4G1)
This was the project's first idea. Watch an ordinary language model (the "teacher"), compile what it does into lookup tables and a graph, and run those on a laptop with no multiplications. It worked as a compiler: it copied the teacher's top choice about as often as the teacher's own tables did. It never wrote coherent text on its own, which is why the project moved on.
| Catalog id | r4g1-transformerless |
| Time span | 21 Jul to 27 Sep 2026 (24 records undated, mostly design and reference documents) |
| Milestone | None recorded (74 of 74) |
| Records | 74 |
| Outcomes | plan 21 · negative 19 · positive 15 · inconclusive 5 · process 5 · review 4 · tooling 3 · diagnostic-stop 1 · ops 1 |
| State | PARKED (R4G1 graph); the frozen integer runtime is kept as a separate contract |
Counts: archive/catalog.jsonl. Terms follow the glossary; ACTIVE, READY and PARKED are defined on the mechanism board.
flowchart LR A["Jul<br/>Plans, runtime contract,<br/>graph format"] --> B["Aug<br/>Retrieval fix; ratified<br/>29.52% baseline"] B --> C["20 to 24 Aug<br/>Prompt, planning and<br/>free-running tests fail"] C --> D["23 to 27 Sep<br/>Ordinary lexical model;<br/>packed storage"] D --> E["Superseded by the<br/>native and discrete lines"]
From a compiler that copies a teacher to the point where the objective had to change.
What it set out to do
Compile a teacher into an integer-only graph (called R4G1) that a CPU can run with no floating point, no multiplications and no allocation while serving. Its rules are in inference_contract.md. Compilation itself may use a teacher; only the served runtime must be lawful.
What happened, in order
- July. Planning documents, a runtime contract and a format for the graph. The cyclic phase-clock design was an open proposal that authorized no work (phase clock). Held-out Hopf routing used only 7 of 512 sectors (record).
- August: retrieval and baselines. Three retrieval negatives turned out to be one measurement bug: a dead cosine term. With a content query, mean reciprocal rank rose from 0.7179 to 0.8542 (reassessment). A certified GPT-2 dense teacher ran at 0.704 times the conventional cost against a 3.0 gate, bit-exactly (record). The attested SmolLM2 baseline was ratified at 29.5203% top-1 (21,293 of 72,130 positions) against 28.1214% for the older runtime (record). A one-token skip-mix lane followed the reference in 41 of 87 favorable pairs, then in 58 of 87 after the candidates were injected, clearing the 53-of-87 bar (spot check, fix).
- 20 to 24 Aug: the walls. The best prompt-conditioning arm gained +16.2 per mille against a 20 per mille floor (bake-off). No sealed final partition existed for planning, so reasoning was NOT ESTABLISHED (certification). The skip-mix lane worsened free-running cycle collapse from 710 to 1000 per mille, so corrective rounds were not launched (reachability).
- 23 to 27 Sep: the ordinary lexical model. One shared Generate, Copy and Stop model passed 32 of 32 authored preflight cases but was 2.25 bits per target worse than a tuned count table (result). Doubling joint-fit steps added only +0.025 bits against a 0.30 bar (joint fit). Packed 4-bit storage kept eight output pairs identical and cut retained coefficient bytes from 6,702,340 to 847,876 (87.35%) (comparison).
Key results
| Result | Kind | Source |
|---|---|---|
| Greedy decode matched the teacher on 29.5203% of 72,130 positions (older runtime 28.1214%) | measurement | normative scorer |
| Content-query retrieval: mean reciprocal rank 0.8542 against 0.7179 (a measurement bug had hidden it) | measurement | reassessment |
| Prompt conditioning, best arm +16.2 per mille against a 20 floor | measurement | bake-off |
| Served ordinary lexical model 2.25 bits per target behind a count table | measurement | result |
| Packed storage cut retained coefficient bytes by 87.35% with identical outputs on eight pairs | measurement | comparison |
What it taught
The teacher set the ceiling, not the store (lesson 5 in what the project knows). A metric that read zero, or a cosine term that never fired, hid real results, so check the instrument first (lesson 1). Gains measured while the teacher's text was supplied never became coherent text the model wrote itself (lesson 3). Exact integer export and bit-exact serving work (lesson 17), and the project kept that contract. Dormant mechanisms were kept behind gates, never deleted (lesson 16).
Current state
PARKED. The R4G1 graph never produced coherent free text and needs a transformer teacher, which the current rules ban. What happens to its crates is an open owner question (docs/labs/repo-renormalization-2026-10-19/audit/mechanisms/board.md, D36 item 3). The integer runtime contract remains the model for D11 serving (the integer-only serving decision) (M4 line).
Go deeper: the generated catalog page lists all 74 records.
Research line: SpiralCore wire transport (side exploration)
This line is a side road, not the model. SpiralCore is a set of exact geometric tools that the project also uses inside the model. Here, someone imported a separate use of it: compressing and routing network traffic between programs. All seven records are dated 18 October. They fix bugs, add tests and record loopback timings. None of them touches the language model, and none is a language result.
| Catalog id | spiralcore-wire |
| Time span | 18 Oct 2026 only |
| Milestone | None |
| Records | 7 |
| Outcomes | tooling 7 |
| State | Self-contained side exploration, off the model path |
Counts: archive/catalog.jsonl. Terms follow the glossary; ACTIVE, READY and PARKED are defined on the mechanism board.
flowchart LR A["Import<br/>Python, Rust and<br/>interposer, with benchmarks"] --> B["Review fixes<br/>receive lock, streams,<br/>fd reuse"] B --> C["Fork safety<br/>shutdown change undone"] C --> D["Counters and matrix<br/>18 of 18 legs pass"]
One day of import, review and repair.
What it set out to do
Test whether the exact byte-transport ideas in SpiralCore can shrink repeated network exchanges. The project's own review of the SpiralCore documents on 14 October found the byte transport and exact geometry sound, while the proposed attention head was incomplete and unproven. In the supplied tests a 1 MiB cold exchange used 62,579 bytes and a warm repeat 438 bytes (review). The wire work asks a narrower question about transport only.
What happened, in order
- Import. The standalone wire compression and transport code (Python, Rust and an interposer) was imported as a self-contained side exploration with loopback benchmarks. On a Rust peer, a 1.25 MiB compressed exchange took 2.86 ms on average (range 2.10 to 3.30) against 1.92 ms for plain TCP; for 1 KiB, a round trip took 41.8 microseconds against 55.1. So on loopback the wire layer was faster for the 1 KiB round trip and slower for the 1.25 MiB exchange (import).
- Review fixes. Four findings from Codex's review of the merged transport were repaired: a receive lock, stream cleanup, a workspace path and committed build outputs. Smoke tests pass; no model compute ran (fixes). A second round repaired a file-descriptor reuse race, stream registration order and half-close handling, with four smoke tests passing (round two).
- A fix that broke something. Adding a socket shutdown on close woke a blocked reader but broke fork safety, and the next record replaced it. The final interposer closes a shared socket after a fork without killing the parent's connection; fork and negative-control smoke tests pass on macOS and a Linux guest (round three, fork-safe).
- Counters and reproducibility. A one-character bug made a reused route report only its last connection's bytes. The fix reports two connections, 3,357 wire bytes and a ratio of 0.0041 against 0.0030 for the last connection alone, and a regression test fails without it (counter fix). The interoperability matrix was made reproducible off the owner's machine, with 18 passing legs and none failing, and claims that cited nonexistent verify tools were withdrawn (matrix).
Key results
| Result | Kind | Source |
|---|---|---|
| Interoperability matrix: 18 pass, 0 fail | measurement | matrix |
| 1 KiB round trip: 41.8 us over the wire layer against 55.1 us plain, on loopback | measurement | import |
| 1.25 MiB compressed exchange: 2.86 ms mean against 1.92 ms plain TCP, on loopback | measurement | same |
| Route counter fix: 3,357 wire bytes over two connections | measurement | counter fix |
What it taught
Loopback numbers are not wide-area numbers: the benchmarks are one-machine timings, and one 2 MiB probe figure (16.7 ms) is a single uncontrolled run. A fix can break a neighbouring property, so the fork-safety smoke test mattered. Claims about checks that do not exist were withdrawn when found, which is lesson 1: check the instrument (what the project knows). Nothing here is evidence about language.
Current state
A side exploration, kept for its tests. It uses no model, trains nothing and moves no milestone. The related exact-memory work that does matter to the model is the object store, which has its own peer protocol.
Go deeper: the generated catalog page lists all 7 records.
Research line: data and tokenizer
A language model never sees letters. It sees numbered pieces of text, and it learns from whatever text it is given. This line holds the small set of records about both choices: which tokenizer cuts the text, and where training text comes from. The project has used one 4,096-piece tokenizer for every current corpus, panel and model. A larger one is prepared as a tool but never trained. The newest records plan a one-time, owner-approved corpus written offline by a large open model.
| Catalog id | data-tokenizer |
| Time span | 16 Aug to 19 Oct 2026 (2 records undated) |
| Milestone | M1 (1 record); none for 7 |
| Records | 8 |
| Outcomes | tooling 5 · inconclusive 1 · process 1 · review 1. No model result |
| State | The 4,096-piece tokenizer d36d3e87 is ACTIVE (tokenizer). The 16,384-piece trainer and the donor corpus are prepared, not run |
Counts: archive/catalog.jsonl. Terms follow the glossary; ACTIVE, READY and PARKED are defined on the mechanism board.
flowchart LR A["Aug to Sep<br/>Corpus sizing,<br/>dialogue format"] --> B["4,096 pieces<br/>pinned everywhere"] B --> C["19 Oct<br/>16,384-piece trainer<br/>(tool only)"] B --> D["19 Oct<br/>Donor-corpus exception D41<br/>(verifier built, not run)"]
Two preparations on 19 October; neither has produced a model result.
What it set out to do
Fix a single text-to-piece mapping so every corpus, test panel and trained file refers to the same pieces, and decide where enough good training text can come from.
What happened, in order
- Corpus sizing (16 Aug). A historical scaling-law document measured a coverage knee near 1.5 million records, then a correction said the sweep was not fixed-partition evidence and gives no estimate of the exponent (scaling law).
- Teacher rehearsals. A pinned small teacher compiled a 20,000-token corpus into table-native artifacts, explicitly not a quotable quality baseline (record). A how-to for refreshing a corpus with the frozen integer runtime alone labels the result self-distilled, kept apart from teacher-fidelity numbers (record).
- Reuse audit (3 Sep). External repositories were audited for licences and interfaces. No new dependency was admitted and matrix multiplication was rejected as a backend (audit).
- Dialogue format (26 Sep). A contract binds training, panel and chat encoders to one tokenizer identity and a shared role format. So far only the integer session path uses it (contract).
- 19 Oct: two preparations. A deterministic Rust command can train a byte-level BPE tokenizer of 16,384 pieces; it does not change the active tokenizer (trainer). Decision D41 lets one open model (gpt-oss-120b) write a training corpus offline once, then never run again for the student. The estimated production corpus of about 30 million tokens costs about $52 to $63 on one large GPU, and executing it needs a separate owner release (D41). A host-only checker that validates such a corpus against its registered sheet passes 32 of 32 self-tests, with no generation run (verifier).
Key results
| Result | Kind | Source |
|---|---|---|
| No multi-digit tokens in the 4,096-piece vocabulary; 12 of 13 numeric memory rows failed | measurement | numeric diagnosis |
| Donor corpus estimate: about 30M tokens, $52 to $63 | estimate (not a measurement) | D41 |
| Corpus checker self-tests: 32 of 32 pass | measurement | verifier |
What it taught
A tokenizer is a hidden hypothesis. The missing multi-digit pieces look like an obvious cause of the numeric-memory failures, but an untrained probe found that the number codec already stores two-digit values in order, so the failure sits in the learned read and emit path (probe). A number-aware tokenizer was planned and never built or run (docs/labs/repo-renormalization-2026-10-19/audit/mechanisms/tokenizer.json, field never_tested). A data source that is borrowed, such as a teacher, sets the ceiling (lesson 5 in what the project knows). Self-distilled numbers must stay apart from teacher-fidelity numbers.
Current state
Nothing has been trained on any tokenizer except d36d3e87. The never-run tests are 4,096 against 16,384 pieces, a number-aware tokenizer, and whether tokenizer choice interacts with the address placement of the discrete model. D41 releases no training hold: generating a corpus is not training the student (scope note).
Go deeper: the generated catalog page lists all 8 records.
Research line: evaluation panels and graders
A model is only as well measured as its test. This line built and audited the project's test sets (panels) and the programs that mark them (graders). Its main finding is humbling: a single canned reply scored as well as the trained chat models on the abstention half of the test, so the early "reply" scores did not show what they seemed to show. The panels are now frozen and graded by deterministic code, not by a neural judge.
| Catalog id | eval-panels |
| Time span | 7 Aug to 14 Oct 2026 |
| Milestone | M1 for 9 records; none for 5 |
| Records | 14 |
| Outcomes | tooling 5 · negative 3 · plan 2 · diagnostic-stop 1 · inconclusive 1 · process 1 · review 1 |
| State | Panels frozen. The chat-reply score (37 of 232) is suspended and is no longer the M1 headline |
Counts: archive/catalog.jsonl. Terms follow the glossary; ACTIVE, READY and PARKED are defined on the mechanism board.
flowchart LR A["Aug to Sep<br/>Evaluation constitution,<br/>trajectory gate"] --> B["9 Oct<br/>Memory panel frozen;<br/>declared test scores 10/40"] B --> C["9 Oct<br/>Failures traced to<br/>numbers and cut-off replies"] C --> D["13 Oct<br/>Deterministic grader:<br/>canned reply ties"] D --> E["14 Oct<br/>Stricter grader v2"]
Each step made the test harder to fool, and each lowered the score the project could claim.
What it set out to do
Settle how progress is judged before more compute is spent. Two panels matter. A 64-row held-out memory panel (40 memory rows, 24 questions that cannot be answered) was drawn from public word lists and sealed with its pass bar before any model saw it. A 232-row open reply panel measures chat quality.
What happened, in order
- August to September. A committed evaluation constitution fixed content-pinned suites and leakage checks, and asserted no capability result (constitution). A trajectory-state diagnostic found that none of the free-running failures was state-addressable (0 per mille) (record). The latest evaluation-policy entry stopped a predictive block-delta test at a gain of 0.0390 against a 0.0433 floor, with no generation (policy).
- 9 Oct: freeze, then score. The memory panel was sealed (26 files, 26 verified), and a binding-swap control passed 0 of 40 (freeze). The pre-declared test of a 29M chat model scored 10 of 40 against a bar of 34, and 1 of 24 on abstention, where a constant answer did better (v5 acceptance). The 214M model's 31 of 40 reproduced exactly, even on a laptop CPU (v4 reproduction).
- 9 Oct: why replies fail. Of 189 failing replies, 152 (80.4%) were neither fluent nor relevant, and 125 (66.1%) ended mid-clause; 85 of those ran to the 64-token cap, and a 50% larger budget rescued only 2.4% of them. No judge-free property separated accepted replies from rejected ones. One canned greeting made up between a fifth and a quarter of the accepted rows (open reply panel). On numeric memory rows 12 of 13 failed, and the 4,096-piece vocabulary holds no multi-digit tokens (numeric diagnosis). Judge-free checks can mark only 88 of the 232 reply rows exactly, 37.9% (deterministic checks).
- 13 to 14 Oct. A deterministic Rust grader replaced the neural judge. Re-scoring showed one canned abstention reply scores 40 of 88 and copying the last value ties the model at 20 of 40, so the reply headline was suspended (grader). Version 2 stopped a wrong number that contains the right digits from passing, and left old scores unchanged (11 of 96 and 15 of 96) (grader v2).
Key results
| Result | Kind | Source |
|---|---|---|
| v5 memory rows 10/40 (bar 34/40); whole panel 11/64 | measurement | v5 acceptance |
| One canned abstention reply scores 40/88 on the open panel; the model scored 1/88 | measurement | grader |
| 12 of 13 numeric memory rows failed; 0 multi-digit tokens in the vocabulary | measurement | numeric diagnosis |
| 88 of 232 reply rows exactly checkable without a judge | measurement | deterministic checks |
What it taught
Check the instrument first (lesson 1 in what the project knows). A model score means little until a constant reply and a copy rule have been scored on the same panel. A pass on a built panel is not general capability (lesson 3). The panel rules are now in the charter: lawful non-neural baselines, which today means count tables, are the standard control.
Current state
The reply and memory panels and graders are frozen and unchanged. The M1 closing bar is now integer top-1 beating the unigram and successor tables, not chat replies (charter, item 8). The reply headline stays suspended, and the charter brings bits per byte back as a bar only once a lawful likelihood exists.
Go deeper: the generated catalog page lists all 14 records.
Research line: GPU and pod operations
Training and scoring run on rented GPUs, and every rental has to be started, checked, paid for and shut down without losing results. This line is the plumbing: the pod tool, its tests, the switch to a cheaper provider, and the guards that stop a run on the wrong machine. It contains no model result. Its blocked records are the clearest example of a run that fails for operational reasons and says nothing about the model.
| Catalog id | compute-ops |
| Time span | 3 Sep to 18 Oct 2026 |
| Milestone | None for 11 records; M1 for 4 |
| Records | 15 |
| Outcomes | ops 9 · blocked 3 · tooling 2 · review 1 |
| State | Active support work. Vast.ai is the default provider (D26); Runpod is an emergency backup |
Counts: archive/catalog.jsonl. Terms follow the glossary; ACTIVE, READY and PARKED are defined on the mechanism board.
flowchart LR A["Sep<br/>Storage review<br/>and cleanup"] --> B["9 Oct<br/>Open the pod tool<br/>to outside labs"] B --> C["13 Oct<br/>Vast.ai backend, HF store,<br/>vendor code cleaned"] C --> D["17 Oct<br/>Three timing runs<br/>blocked by hardware"] D --> E["18 Oct<br/>Archive and store<br/>read-back checks"]
Each step makes a rented run easier to start or harder to lose.
What it set out to do
Make GPU work cheap, repeatable and safe. The rules are owner rules: touch pods only through the project's uor-pod tool, keep to the cost caps, save durable output off the pod before it is destroyed, and never use the laptop CPU for research model compute. Serving the exported artifact on the user's own device is the product and is allowed (charter §3.6).
What happened, in order
- September. A read-only storage review deleted nothing (review). An owner-authorized cleanup recovered about 21.6 GiB of regenerable caches and debug dependencies, and preserved models, research, binaries and downloads (cleanup).
- 9 Oct. Hard-coded account details were removed from the pod tool so outside contributors can rent GPUs. Its dry-run suite reached 240 of 240 with 16 new checks; two timing-flaky tests were fixed so the suite passed in 10 of 10 runs under load, where the unfixed version failed 6 of 6 (open pods, deflake).
- 13 Oct. A missing import in a CUDA-only test broke every pod's parity check; adding it restored 43 passing parity tests at a cost of about $0.05 (record). The tool gained a Vast.ai backend at about half Runpod's price for the same card: an empty RTX 5090 pod reached a CUDA build and passed 38 of 38 parity tests in 137 s at $0.469 per hour (Vast). Pods now fetch toolchains from a private Hugging Face store; a warm pod is ready in 57 s against 330 s cold (store). Vendored CUDA and Rust dependencies were cleaned of banned code (cuBLAS, softmax and tanh kernels, matmul crates) and 31 of 31 finite controls passed, at an observed cost estimate of $1.23 (vendor boundary).
- 17 Oct. Three timing attempts stopped before running anything: the rented GPU had driver 580.105.08 instead of the admitted 580.95.05, then driver 595.71.05, then the right driver on a different physical GPU than the one qualified. Each recorded zero instrument invocations (first, third). An opt-in setting now allocates only hosts advertising one exact driver (driver-aware selection).
- 18 Oct. The tool checks a per-file checksum manifest of the laptop archive, and reads uploaded results back from the store, before it destroys a pod (archive verify, store read-back).
Key results
| Result | Kind | Source |
|---|---|---|
| Vast.ai pod from empty to CUDA build and parity 38/38 in 137 s at $0.469/h | measurement | Vast |
| Warm pod ready in 57 s against 330 s cold | measurement | store |
| Vendored code cleaned of banned kernels; 31 of 31 finite controls pass | measurement | vendor boundary |
| Three timing attempts blocked by hardware; zero timed pairs | measurement | uuid blocker |
What it taught
A blocked run is a tooling or environment fault to fix, not a negative result (decision D22: a negative closes a configuration, never a mechanism), and a wrapper that refuses a wrong GPU protects the value of the measurement. One missing import silently broke every pod's gate, which is lesson 1 again: check the instrument first (see what the project knows). Save results off the pod before it goes.
Current state
Active, and a support line for every milestone. Pod admission also runs the banned-mechanism check (D29: compiled GPU modules may hold only allowed operations) in place of a CPU-reference test that no longer compiles (pod gate).
Go deeper: the generated catalog page lists all 15 records.
Research line: research tooling and rules
This line is not about the model. It records the rules, checkers and command-line tools the project built to keep its own research honest: who may run what, how claims are worded, and which banned operations must never creep back in. It holds 185 records and not one is a model result. Most of the effort came in two days in mid-October, when the whole tool was ported from Python to Rust.
| Catalog id | harness-governance |
| Time span | 24 Jul to 19 Oct 2026 (10 records undated). 105 of the 185 are dated 13 or 14 Oct |
| Milestone | None (175 of 185); the tooling serves every milestone |
| Records | 185 |
| Outcomes | tooling 115 · process 55 · review 9 · ops 4 · plan 2. No positive or negative model results |
| State | Active, but the 19 Oct charter cuts the bulk. The tool is a view over the real authorities, not a replacement for them |
Source: archive/catalog.jsonl, counted with jq. Terms follow the glossary; ACTIVE, READY and PARKED are defined on the mechanism board.
flowchart LR A["Jul to Sep<br/>Claim-language rules,<br/>handoffs, reviews"] --> B["12 Oct<br/>Owner bans softmax,<br/>CPU compute, matmul"] B --> C["13 to 14 Oct<br/>Harness ported<br/>Python to Rust"] C --> D["15 to 17 Oct<br/>Write-path fixes,<br/>ratchet hardening"] D --> E["18 to 19 Oct<br/>Docs reconciled,<br/>charter adopted"]
The line in four phases. The second box explains much of the third: the Rust-first rule (D27) required the ports.
What it set out to do
Make a many-lab research project reproducible and hard to fool. Three jobs recur: keep claim wording honest (formal vocabulary), keep banned mechanisms out (scripts that count softmax-like code and dense matrix products and fail if the count grows), and let several AI labs share one repository without overwriting each other (claims on branches, check-ins, receipts).
What happened, in order
- Jul to Sep. Normative claim-language rules, a traceability matrix of the formal analysis, handoff documents and audits of outside repositories. No code was adopted from the audits (external research audit).
- 12 Oct. The owner banned softmax everywhere (D23), CPU model compute (D24) and dense matrix products (D25). A scan found all five active code paths still used softmax (softmax census). The first harness and its multi-lab version arrived the same day. An agent also removed 11,171 research files from git to save disk; they were restored byte for byte (integrity record).
- 13 to 14 Oct. About 105 records port the harness commands and checks to Rust, each compared against the Python output. The comparisons kept finding faults in the checkers themselves: a parity check that could never fail (harness CI), a green report when the binary was not built and nothing was checked (skipped is not a pass), and a check command that ran none of its 41 rules (dispatcher).
- 15 to 17 Oct. Fixes to how the tool writes state, branch-cleanup proof for squash merges, and hardening of the ban scans. Five rules that were registered but never executed were wired in (record).
- 18 to 19 Oct. Documentation reconciliation against the source, the offline-float decision D37, the owner-phrase rule D40 and many one-paragraph documentation syncs (course correction).
Key results
| Result | Kind | Source |
|---|---|---|
| In the week of 12 to 18 Oct, 34 of 309 records (about 11%) were model results; the rest were tooling, plans, process and review | measurement | docs/labs/repo-renormalization-2026-10-19/audit/synthesis.md, section 3 |
| Part of that drop was owner-ordered: D23 to D32 forced a substrate rebuild and D27 made Rust mandatory | measurement | same, "Confound" |
| 19 owner decisions in 8 days (D23 on 12 Oct to D41 on 19 Oct) | measurement | same |
| Matmul ratchet counted 95 dense call sites and refuses growth | measurement | interlock record |
| Claim-wording check rewritten in Rust with byte-identical output on the repository | measurement | port record |
What it taught
Every checker needs a test that can fail (lesson 1 in what the project knows). Several tools here reported success while checking nothing. A process that forbids running code produces nothing (lesson 21). Section 3 of the synthesis separates owner-mandated rebuilding from discretionary gating as causes of the drop in model results. Branches are temporary; main is the authority, and a merged claim must be released.
Current state
Active but slimmer. The charter adopted on 19 October requires a written sheet only before GPU runs or milestone-claim runs, and keeps one notebook per line (how research is done now). No record in this line is a model result.
Go deeper: the generated catalog page lists all 185 records.
Research notebooks
A notebook is one page per line of research, and each page is a table with one row for every result. Instead of a new folder and a new status entry for every pull request, the project now adds one row to the right notebook when a run produces a number. You can read a page top to bottom and see what was tried, what it measured, what bar it had to clear and what was concluded.
flowchart LR
A["A run or check<br/>produces a number"] --> B["One new row at the<br/>bottom of its notebook"]
B --> C{"Did the run seal<br/>artifacts?"}
C -- yes --> D["Dated evidence folder<br/>linked from the row"]
C -- no --> E["The row is the record"]
D --> F["Older folders move to archive/"]
How a result becomes a row. Only a run that seals artifacts keeps its own dated folder.
The format
Each notebook lives at docs/research/notebook/<line>.md. A line is one sustained question, such as "how the discrete model reads context". The charter sets this format (CHARTER.md, section 5.6), and the owner chose it in answer to question 4 of the 19 October 2026 review.
Every result is one row with six columns:
| Column | What goes in it |
|---|---|
| Date | The ISO date the result was recorded (YYYY-MM-DD). |
| What ran | One or two plain sentences: the test or check, on what, with what budget. |
| Number | The measured value, with its denominator and the baseline it is read against. |
| Bar | The pass line that was fixed before the run, or "none registered" when the run was a diagnostic or a qualification check. |
| Verdict | One of the five words below, with a short qualifier. |
| Artifact | A link to the record or the sealed evidence folder that holds the proof. |
Rules for keeping a notebook:
- Append at the bottom. The newest row is last. Rows from one day appear in the order the work ran where the records show it.
- One row per result. A repeat of an earlier run gets its own row. A change of plan, a review or a tooling step is not a result and gets no row.
- A dated evidence folder only when a run seals artifacts (checkpoints, receipts, logs with checksums). The row links to it. A result with nothing to seal needs no folder.
- Numbers are measurements from a recorded run, unless the row says proof or hypothesis, as defined in
formal_vocabulary.md. A passing control is not a language result, andNOT_RUNis not a pass. - Rows are never edited to change a verdict. If a later run corrects an earlier one, add a new row that names the earlier one.
The five verdict words
| Verdict | Meaning |
|---|---|
| positive | The run met the bar or passed the controls it registered, at the scope stated in the row. |
| negative | The run missed a registered bar. It closes that exact configuration (recipe, dose, window, objective) and never the mechanism (D22). |
| inconclusive | The run produced a number, but no bar was decided, or the evidence cannot separate the explanations. |
| diagnostic stop | A registered stop rule or the owner ended the run early so the cause could be found. It is not a negative. |
| blocked | A fault in the tooling, the machine or the source stopped the run before it could measure. It is not a negative, and it is not a result about the model. |
The notebooks
| Line | Page | What it asks | Result rows |
|---|---|---|---|
m1-discrete-attention | m1-discrete-attention.md | Can the integer model learn to read earlier text well enough to predict the next word? | 30 |
m1-prime-zeta | m1-prime-zeta.md | Can prime numbers and zeta-zero phases give every token a distinct starting vector? | 1 |
m3-durable-memory | m3-durable-memory.md | Can conversation be stored and rebuilt exactly, so memory lasts across sessions? | 1 |
m4-serving | m4-serving.md | Can the trained model be served with integers and tables only? | 0 |
data-tokenizer | data-tokenizer.md | Which data and which tokenizer does the model train on? | 0 |
harness-governance | harness-governance.md | Is the research tooling and process worth its cost? | 0 |
Source of the counts: archive/catalog.jsonl, records dated 12 October 2026 or later whose outcome is positive, negative, inconclusive, diagnostic-stop or blocked, counted with jq. Pages with 0 rows have records on those dates, but all of them are tooling, planning or process records. The page says so.
The other fourteen lines in the audit catalog (for example m2-exact-memory and m1-float-rung0) have no notebook yet. Each gets one the next time it produces a result. The project is pre-alpha: 0 of 8 milestones are complete, and no row on any page is a language result.
Where the rows came from
The first rows were seeded from the audit catalog, which read every lab record in the repository. The seed covers 12 October 2026 to 19 October 2026. Earlier work is summarised in How the project got here and sits in archive/. Records dated before 18 October 2026 link to their archived path; records of 18 and 19 October stay in docs/labs/.
Go deeper
- How research is done now, including the sheet, review and release rules.
- What the project knows and what is still open.
docs/integration/NOW.md: the current plan, which with these notebooks replaces the old running state log.archive/CATALOG.md: every archived record, by date, lab, line and verdict.
Notebook: discrete attention for the language base (M1)
This is the running table of results for the line that carries the project today. It asks whether a model that uses only integers and small geometric moves can learn to read earlier text well enough to predict the next word. The rows below run from 13 October to 19 October 2026. None of them is a trained language result: the best trained discrete model gets the right next word first in 463 of 14,287 development rows, while a simple count table (T2) gets 6,300.
flowchart LR A["14 Oct<br/>A2 pilot: rank counts up,<br/>loss total up"] --> B["15 Oct<br/>Wider shortlist at test time<br/>fails: 2,400 vs 4,894"] B --> C["18 Oct<br/>Row-parallel scoring:<br/>about 56x faster"] C --> D["18 to 19 Oct<br/>Four K16 runs:<br/>no keep"] D --> E["19 Oct<br/>Address cells at zero training:<br/>1,351 vs 127 of 3,847"] E --> F["19 Oct<br/>A8 dose stopped at<br/>batch 4,096 for diagnosis"]
The turning points in the rows below. Each box is one or more rows; the numbers are in the table.
The longer story of this line is on its line page. The mechanisms involved are described in address cells, admission, rank margin and relation read.
Terms used in the table
- DEV panel. The open development panel of 14,287 rows. Each row is a context and the true next token. P_succ (the copy-successor subset) is 3,847 of those rows; it is the subset where the answer follows an earlier occurrence of the same token.
- Admission. The read can only choose among a shortlist of candidate cells (K of them, usually K=8). A row is admitted when the true next token's cell is on the shortlist. A token outside it can never be chosen, so admission is a ceiling on top-1.
- Top-1 / top-8. The true token ranked first / within the first eight.
- Batches. Training steps. A full registered dose is 16,404 batches.
- FIT. An independent review of a run's pre-registration sheet before spending compute. A FIT releases nothing by itself.
- Control (C-R1 to C-R6, V2 and the like). A check built to fail if the instrument is wrong. A passing control is not a model result.
- Status words (positive, negative, diagnostic stop, blocked) are defined in the format page.
Results
Sources: each row links its record. Counts and one-line descriptions come from archive/catalog.jsonl; numbers and bars were checked against the record itself. Records dated before 18 October 2026 are in archive/.
| Date | What ran | Number | Bar | Verdict | Artifact |
|---|---|---|---|---|---|
| 2026-10-13 | Wired the flock read (a small neighbour set) and ternary gates into the discrete GPU model, then ran the finite construction controls on a rented GPU pod. No training. | 17 of 17 controls pass (11 route, 6 flock); 0 updates applied | All finite CUDA construction controls pass; no training registered | positive (construction only) | discrete-flock-writer-integration |
| 2026-10-13 | First integer-only GPU path: context, tree routing, rotation and a shared token-vector writer, with proposal-only learning. No update ran. | 11 of 11 construction controls pass on attempt 3 (6 s). Attempt 1 hit a CUDA out-of-resources stop after one pass. | All 11 controls pass at the pinned source, after independent FIT review | positive (construction only) | discrete-geometric-learning |
| 2026-10-14 | A2 seed-1 pilot: the first 1,640-batch GPU training run of the discrete model, on one RTX 5090 (about $1.77). | Top-1 17 to 82 of 14,287; top-8 173 to 1,169; loss total 13,816,032 to 13,884,032 (it rose); occupied writer cells 16 to 124 | Not decided (pilot) | inconclusive (mixed; no mechanism verdict; receipt audit passes) | a2-pilot |
| 2026-10-15 | Standalone GPU runner for the six C-R control checks of the rank-hinge admission objective, over five restarts. | Restart 5: all six controls pass; the run then halted at the timing gate with 99 timed batches | Six controls pass and 100 timed batches | diagnostic stop (instrument gate, not a mechanism result) | admission-rank-fixture-runner |
| 2026-10-15 | Stage-A K-sweep: four saved checkpoints re-scored with 8 to 16 kept cells (36 points). | Best target-admitted rows 2,400 at K=16 (1,920 at K=8) | Gate G-A: some K reaches 4,894 target-admitted rows at batch 16,404 (bar 4,775 plus a 119-row half-width) | negative (G-A fails; closes widening at evaluation time only) | rung0-stage-a-sweep |
| 2026-10-15 | The read-only instrument behind the K-sweep, built and run on a pod. | K=8 controls reproduce the five registered counts exactly (top-1 149, target-admitted 1,920); best at K=16 is 2,400 | Same gate G-A (4,894) | negative (FAIL_EVAL_TIME_WIDENING_ONLY; same result as the row above) | stage-a-admission-instrument |
| 2026-10-16 | First finite-control GPU run for counterfactual proposals. | Stopped at an admission check: 90 registers in the loaded kernel against 88 in the compiled report; 0 proposals run | Zero register difference between loaded and compiled kernel | blocked (instrument provenance defect, not a mechanism negative) | counterfactual-controls-run |
| 2026-10-16 | Finite controls repeated after the image-binding repair. | 40 proposals, 128 one-row endpoint evaluations and 16 typed refusals all matched; resource counts equal; no state changed | All finite control checks match, with zero apply | positive (qualification, not a model result) | counterfactual-controls-pass |
| 2026-10-16 | Bounded GPU diagnostic of the slow proposal kernel. | The baseline is recomputed for each of 16 candidates, about 47% of lane cycles; the writer is about 99.98% of cycles; 32 proposals with matching U/D losses | None registered (diagnostic) | positive (locates the waste; no speedup yet) | counterfactual-decomposition-run |
| 2026-10-16 | Checkpoint-0 timing of the propose phase, 3 timed batches per arm on a GPU. | 7.36 s per proposal; over 99.99% is the counterfactual scoring kernel | None registered (diagnostic) | inconclusive (not a training rate or mechanism verdict) | propose-subphase-diagnostic-run |
| 2026-10-16 | K16 qualification, first attempt, on a pod. | Stopped at step 0: the fixture runner failed to compile on CUDA (exit 101); no control, timing or training ran | Step-0 builds, then G-Pre, C-R1 to C-R6, then a 100-batch timing, in order | blocked (build blocker, not a mechanism negative) | k16-qualification |
| 2026-10-16 | K16 qualification restart. | Stopped before any GPU work: the control script and the evaluator disagreed on a JSON key name | Same ordered sequence; admission bar 4,894 unchanged | blocked (source bug, not a result) | k16-qualification-restart |
| 2026-10-16 | K16 qualification restart 4. | All three CUDA builds passed; the strict lint check (clippy, exit 101) failed on the control-runner code; step 0 fails | The lint gate runs with warnings as errors and was not weakened | blocked (source defect) | k16-qualification-restart4 |
| 2026-10-16 | K16 qualification restart 5. | Controls and untrained admission checks pass (K16-A seed 1: 14,287 of 14,287 rows admitted, 0 strict wins; K8 A seed 1: 5,680); timing recorded 99 batches | Admission above 4,894 (met); 100 timed batches (missed by one) | blocked (timing sample-count bug) | k16-qualification-restart5 |
| 2026-10-17 | Attention preflight Battery 3: a zero-training GPU run of 26 steps measuring starting admission and 9 relation controls. | P_succ admission 2,034 of 3,847 (full panel 7,500 of 14,287); 9 of 9 relation controls pass | P_succ admission at least 500 | positive (zero-training preflight; learned relation NOT_RUN) | attention-preflight |
| 2026-10-17 | Baseline-reuse path compared with the ordinary path on GPU driver 580.95.05. | 32 comparisons with identical losses; 64 proposals (56 successes, 8 status-8); 16 refusals; zero apply. Timing NOT_RUN. | Identical results to the ordinary path | positive (finite controls only) | counterfactual-baseline-reuse-finite-pass |
| 2026-10-17 | The same finite controls on a second GPU driver (595.71.05). | 32 pairs, 64 proposals and 16 refusals pass; zero apply | Same as the row above | positive (qualifies the environment, not speed) | counterfactual-baseline-reuse-driver-595 |
| 2026-10-17 | Host-only re-score of the Stage-A checkpoints, plus a context-free successor table (T2) as a comparator. | K=8 to K=16 top-1 on 1,920 rows: 149 to 138. T2 gets 6,300 of 14,287 top-1; the trained Route artifact gets 149. | Primary change must rise by the floor of 24 rows; a trained Relation artifact must beat T2 | inconclusive (the Relation arm was not run, so that row is UNAVAILABLE) | host-diagnostics |
| 2026-10-17 | Native Relation learning path: built the training schedule and tried six paid compiler-check pod runs. | 0 model updates; 6 pod leases; finite CUDA qualification NOT_RUN | None reached | blocked (operator and lint blockers) | native-relation-learning-path |
| 2026-10-18 | Dose 1, the first paired attention run (Relation arm and a frozen-zero control). The owner stopped it early to switch to a faster row-parallel driver. | Relation reached 904 batches and the control 1,065 (both exit 143); 198 files, 237,872,396 bytes preserved | Registered bars unchanged and not tested | diagnostic stop (owner stop; not a verdict) | attention-dose1-strategic-stop |
| 2026-10-18 | The paired rows_v1 run reached its first check (Q1, 4,096 batches) in both arms. | P_succ admission 2,034 to 225 (Relation) and 205 (control) of 3,847; full panel 7,500 to 829 and 767 of 14,287 | Q1 stop criteria: P_succ admission below 500 and below half of 2,034 (both fired) | diagnostic stop (the read could not be judged) | attention-rows-q1-diagnosis |
| 2026-10-18 | Row-parallel GPU kernel for the exact counterfactual, compared with the ordinary kernel. | Proposal time 3.843 s to 0.0691 s (55.6x) with equal losses; Route parity 684 of 684 on attempt 3; K16 shape 7.400 s to 0.1297 s (57.0x) | Losses equal on every compared index; the negative control must fail (it did) | positive (opt-in path; default unchanged) | counterfactual-rows-parity |
| 2026-10-18 | BVG-K stage C1: scoring 16 candidate moves in one GPU launch. | 5,130 of 5,130 coordinates match single-coordinate scoring; 16 coordinates cost 123.6 ms against 125.5 ms for one (16.25x versus 16 single calls) | Parity on every coordinate; 2x reading threshold; the sabotage control must fail (it did) | positive (scoring only; block apply is next) | bvgk-rowsk-scoring |
| 2026-10-18 | K16 rows-path qualification: controls, an untrained admission check and a 100-sample timing. | Existing finite controls 25 of 25; C-R1 to C-R6 6 of 6; K16-A seed 1 admits 14,287 of 14,287 rows at top-1 19, with 0 strict wins | All qualification gates in order; bars unchanged | positive (qualification; no learning result) | k16-rows-qualification |
| 2026-10-18 | Documentation sync for the finished R-arm seed-1 run (K16-R). | 16,404 batches, 130 accepted updates; DEV top-1 101 and top-8 515 of 14,287 | None decided; two-seed reading pending | inconclusive (a sync of one run, not a verdict) | r1-completion-docs |
| 2026-10-18 | All four registered K16 runs (two writer objectives, two seeds) finished 16,404 batches. | Accepted updates, target-admitted rows of 14,287, top-1: A seed 1 407, 2,237, 65; A seed 2 410, 3,167, 463; R seed 1 130, 12,089, 101; R seed 2 129, 12,466, 230 | Pending the registered two-seed interpretation | inconclusive (at this record; settled by the 19 October row) | k16-four-role-execution |
| 2026-10-19 | Registered two-seed outcome call on the four K16 runs. | R keeps admission (12,089 of 14,287) but collapses to about 20 occupied cells; A keeps 192 to 209 cells but admits only 2,237 and 3,167 rows; top-1 is 65 and 463 for A | Admission at least 4,894; top-1 at least 1,941; top-8 at least 4,775 | negative (OCCUPANCY_COLLAPSE_TRIGGERED; no keep; closes these configurations only; fresh slice sealed) | k16-outcome-call |
| 2026-10-19 | Injective-table pre-flight at zero training, plus BVG-K stage C2 qualification (which passes). | P_succ admission 127 of 3,847 (full panel 427 of 14,287); occupied cells 256 | P_succ admission at least 500 (B3_init) | diagnostic stop (the run was not dispatched; nothing trained) | injective-preflight-and-c2-qualify |
| 2026-10-19 | Address-structured injective cells at zero training: each token's cell is placed near its predecessors' cells. | P_succ admission 1,351 of 3,847 (full panel 4,244 of 14,287), against 476 for a shuffled-packing control and 127 for the injective table | P_succ admission at least 500 (B3_init): passes | positive (zero-update admission evidence, not learning) | address-cells-preflight |
| 2026-10-19 | A8 dose: both arms trained on address-structured cells, on 2 RTX 5090 GPUs for about 62 minutes (about $1.9). | P_succ admission 1,351 to 551 for Relation at batch 4,096 (stop fired); the frozen-zero control fell to 857 and finished the dose | Stop if P_succ admission at the first check is below 500 or below half its start (675.5) | diagnostic stop (learning moves ejected target cells from the shortlist; not a mechanism negative) | a8-dose |
What the rows say, in plain terms
- The integer path is built and its finite controls pass. Those are construction results, and they say nothing about language.
- Training moves the rank counts up but has not yet beaten the context-free count table. The best trained result in the rows is 463 of 14,287, against 6,300 for T2 and 1,226 for the unigram table (
CHARTER.md, section 4.8). - The main obstacle found so far is admission: a token outside the shortlist can never be chosen. Widening the shortlist at test time did not fix it (row of 15 October). Placing cells by address structure fixed it at the start (1,351 against 127 of 3,847), but training then pushed target cells out of the shortlist (the A8 row).
- Six of the 30 rows are blocked by tooling or build faults and are not results about the model. The row-parallel kernel (about 56x faster proposals with identical losses) is the largest measured speed change.
- The next step recorded in the A8 row is a choice among three diagnoses by the PM: an acceptance rule that refuses moves which eject a target cell, a per-checkpoint cell census, or a finer checkpoint cadence. Each new training run needs a reviewed sheet and a typed owner release.
Not in this table
- Plans, reviews, tooling and process records of the same period are not results. They are listed in
archive/CATALOG.mdand indocs/labs/under this line. - The GPU rental blockers for the baseline-reuse timing runs (17 October) are filed under the
compute-opsline, not here. - The float "starling" reads of 12 October are filed under
m1-float-rung0, which has no notebook yet.
Go deeper
- Line page: discrete attention for the language base
- Format and verdict words
- Prime and zeta starting codebook notebook, whose table was the starting point for the 19 October address-cell rows
archive/CATALOG.md, filtered by linem1-discrete-attention
Notebook: prime and zeta starting codebook (M1)
This notebook records tests of one idea: give every token a fixed starting vector built from numbers rather than from random noise. Each token gets a prime number by its rank, and the phases of the Riemann zeta zeros, read at the logarithm of that prime, turn the prime into an eight-dimensional integer vector. The one result so far shows that the vectors are distinct and the GPU code accepts them. It does not show that the vectors help the model read.
flowchart LR A["Token id v"] --> B["Prime by rank:<br/>p = prime number v+1"] B --> C["Zeta phases:<br/>gamma_k times ln p, mod 2 pi"] C --> D["Quantize to integers<br/>(29-bit phase, 30-bit unit vector)"] D --> E["Nearest E8 root cell,<br/>balanced over 256 cells"] E --> F["Integer codebook table<br/>read by the GPU model"]
How one token becomes one table row. The steps are the construction described in the record linked below; the table is built once, offline, on the host.
Background: primes and zeta explains the phases, and the prime-zeta codebook page gives the mechanism's status. The line page for the model that reads this table is discrete attention.
Results
Sources: the row comes from archive/catalog.jsonl; numbers and the bar were checked against the record and its pre-registration sheet (docs/harness/prep/m1-prime-zeta-complex-routing-2026-10-14.md, marked TEST FITNESS: FIT). Verdict words are defined on the format page.
| Date | What ran | Number | Bar | Verdict | Artifact |
|---|---|---|---|---|---|
| 2026-10-14 | Built the one-time prime-zeta codebook for a 4,096-token vocabulary, with matched null codebooks (a shifted-phase "tangent" null and a permuted-prime "normal" null). Host checks on macOS and Linux, then the GPU controls. No training. | 4,096 of 4,096 tokens get distinct vectors (0 collisions, 256 of 256 writer cells occupied); 17 of 17 base and 6 of 6 prime-zeta CUDA controls pass; 0 updates applied, 0 corpus rows | Bit-exact table across seeds 0, 1 and 2; no floating-point instruction in the GPU code; 0 collisions over all 4,096 tokens; 17 of 17 base controls; the codebook must separate structurally from both nulls | positive (construction only; the learned comparison against the nulls is deferred to a training sheet) | prime-zeta-construction |
What the row says, in plain terms
- This is a measurement of a build, not of learning. Distinct vectors mean the table does not merge tokens. An earlier seeded table did merge them, and capped top-1 at 1,986 rows (k16-outcome-call).
- Whether prime-zeta routing beats the permuted-prime null or the shifted-phase null on learned move selection or corpus loss is not tested. The pre-registration defers it to the first downstream training sheet, and training is held until the owner releases one.
Later use in another notebook
The prime-zeta table became the injective starting table (one distinct vector per token) in the discrete-attention runs of 19 October. Those results are rows in the discrete-attention notebook, not here: the injective table alone admitted 127 of 3,847 copy-successor rows, below its bar of 500 (injective-preflight-and-c2-qualify), and placing the cells by address structure raised that to 1,351 (address-cells-preflight).
Go deeper
- Primes and zeta and the prime-zeta codebook mechanism.
- Format and verdict words.
archive/CATALOG.md, filtered by linem1-prime-zeta.
Notebook: durable memory (M3)
This notebook tracks whether conversation can be stored so that it lasts across sessions and comes back exactly as it went in. The idea is to fold text into a deduplicated store of small records and rebuild the bytes from them, with a hash check that proves nothing changed. The one result so far is a tested piece of source code, not a memory that the model uses.
flowchart LR
A["Source bytes"] --> B["Fold into small records<br/>(deduplicated, hashed)"]
B --> C["Exact object store"]
C --> D["Rebuild from records"]
D --> E{"Same bytes and<br/>same whole-object hash?"}
E -- yes --> F["Round trip holds"]
E -- no --> G["Reject: nothing is published"]
The round-trip test behind the row below: rebuild(fold(bytes)) must return the original bytes, checked against a fresh SHA-256.
Background: the object store mechanism and exact memory.
Results
Sources: the row comes from archive/catalog.jsonl; numbers and the bar were checked against the record. Verdict words are defined on the format page.
| Date | What ran | Number | Bar | Verdict | Artifact |
|---|---|---|---|---|---|
| 2026-10-15 | Built and byte-tested the D19 exact object store (crates/uor-r4-object-store). It folds source bytes into deduplicated records and reconstructs them. Host tests only: no model, GPU or training. | 20 object-store integration tests and 13 existing tokenizer tests pass; a repeated fixture of 7,776 raw bytes is held in 380 record bytes | rebuild(fold(bytes)).bytes() equals the input and a fresh whole-object hash matches. The numeric limits (16 MiB per object, 1,000,000 records) are resource ceilings, not acceptance bars | positive (kept as a source and data-structure prototype; not promoted into the model; no language result) | d19-object-store |
What the row says, in plain terms
- This is a measurement (passing tests on fixtures) that the store round-trips its inputs. It is not a measurement of memory quality in conversation.
- The store is not yet wired into the model. A durable-session integration is a separate step the record names as next.
Not in this table
Twenty-nine more records on this line, from 14 to 18 October, are tooling and planning for the same store: the protocol specification, peer and replica sync, verification pipelines, fleet maintenance and a conformance suite. None reports a result against a bar, so none has a row. They are listed in archive/CATALOG.md under m3-durable-memory, and the 18 October ones are in docs/labs/ (for example uorobj01-conformance).
Go deeper
- Object store and exact memory mechanism pages.
- Format and verdict words.
archive/CATALOG.md, filtered by linem3-durable-memory.
Notebook: integer serving (M4)
This notebook is for results about running the trained model cheaply: serving it with integers and lookup tables only, with no floating-point arithmetic and no multiply instruction (decision D11). It has no rows yet. No serving run since 12 October 2026 has produced a number against a bar, and the language base (M1) is not yet met.
Results
Sources: archive/catalog.jsonl. Verdict words are defined on the format page.
| Date | What ran | Number | Bar | Verdict | Artifact |
|---|---|---|---|---|---|
| No result rows yet. |
Why the table is empty
The audit catalog holds 42 records for this line. Between 12 October and 19 October 2026 it has one record, and that record is tooling, not a result:
- 2026-10-18, wasm-serving-runtime: an outside contributor's browser and Node WebAssembly integer serving runtime was merged after hardening. Its multiply-free audit passes, but the SIMD kernels are not integrated and the demo cannot be run from a clean clone. This is a build record, so it has no row.
Serving results before 12 October (for example the d11-serving record of 10 October) predate this notebook. Find them in archive/CATALOG.md under line m4-serving, and read the record before relying on its verdict.
What a row here will need
A row needs a number measured through the exported integer artifact, a bar fixed beforehand, and the export gap: the difference between the offline float candidate and the integer artifact on the same evaluator (CHARTER.md, section 3.7). Serving must be integer on the user's device (section 3.6). The M1 closing bar also asks for tokens per second to be reported with the integer top-1 result (CHARTER.md, section 4.8).
Go deeper
- Serving and export and the lookup-serving mechanism.
- Format and verdict words.
CHARTER.md, sections 3.6, 3.7 and 4.8.
Notebook: data and tokenizer
This notebook is for results about what text the model trains on and how that text is cut into tokens. It has no rows yet. The three records dated 19 October 2026 are preparation: an approved plan, a checker and a tokenizer trainer. None of them ran the model or produced a number against a bar.
Results
Sources: archive/catalog.jsonl. Verdict words are defined on the format page.
| Date | What ran | Number | Bar | Verdict | Artifact |
|---|---|---|---|---|---|
| No result rows yet. |
Why the table is empty
Three records on this line fall on or after 12 October 2026. None is a result:
- 2026-10-19, d41-offline-donor (process): the owner approved a one-time exception. A large open model (gpt-oss-120b) may generate a training corpus offline and is never used again by the student. Running it needs a separate owner release.
- 2026-10-19, distill-d1-consumer-verifier (tooling): a host-only checker that validates the planned donor corpus against its registration sheet before admission. Its 32 self-tests pass; no GPU run and no generation took place.
- 2026-10-19, rust-bpe-trainer (tooling): a deterministic host-only Rust command to train a byte-level BPE tokenizer for a planned 16,384-token vocabulary. It does not change the active tokenizer and produces no model result.
What a row here will need
A row needs the data and tokenizer identity (hashes), a bar fixed beforehand and a comparison on the same evaluator. A tokenizer that changes the vocabulary changes what every panel row means, so it is compared on the fixed development panel and reported with its cost.
Go deeper
- Data and tokenizer and the tokenizer mechanism.
- Format and verdict words.
archive/CATALOG.md, filtered by linedata-tokenizer.
Notebook: research tooling and governance
This notebook is for results about how the project does research: the shared tooling (the harness), the rules and the process. It has no rows yet. Of the 155 records on this line dated 12 October 2026 or later, none reports a number against a bar. They are rule changes, tooling builds and process notes.
Results
Sources: archive/catalog.jsonl. Verdict words are defined on the format page.
| Date | What ran | Number | Bar | Verdict | Artifact |
|---|---|---|---|---|---|
| No result rows yet. |
Why the table is empty
The catalog classes the 155 records as 114 tooling, 36 process, 2 operations, 2 review and 1 plan. By design, a tooling build or a rule change is not a result. The tooling itself runs no model compute and cannot move a headline number.
The rules in force are in the charter: a lean harness with no manual cadence, discretionary harness features frozen until a model beats both count tables, and the coordination and records rules (sections 5.2, 5.3 and 5.6). The tooling is documented in docs/harness/README.md. How research runs now is on How research is done now.
What a row here will need
A row would be a measured claim about the process, such as the cost of a rule or the share of work that moved a milestone number, with its source and the way it was counted. A description of a change to the process belongs in the charter or in docs/integration/NOW.md, not in this table.
Go deeper
CHARTER.mdanddocs/harness/README.md.- How research is done now and format and verdict words.
archive/CATALOG.md, filtered by lineharness-governance.
The rules of the project, in plain language
UOR-R4 is trying to build a fast language model that runs on an ordinary laptop and does not use the expensive machinery inside today's chat AIs. A short rulebook, the charter, keeps every contributor pointed at that goal. This page explains what the charter says, why each rule exists, what the project's labs may and may not do, and who makes which decision. It is a guide to the charter, not a replacement: if the two ever disagree, the charter wins.
flowchart TD
idea["Idea or experiment"] --> rules{"Inside the constraints?<br/>Geometry only, no squashing,<br/>no matmul"}
rules -- "No" --> owner["Only the owner can<br/>change the charter"]
rules -- "Yes" --> need{"Needs GPU training or evaluation,<br/>or will a milestone claim rest on it?"}
need -- "No: builds, kernel tests,<br/>host checks" --> doit["Just do it"]
need -- "Yes" --> sheet["Pre-registration: one-page sheet<br/>bar, noise, controls, seeds,<br/>cost, what each outcome decides"]
sheet --> fit{"FIT review by someone<br/>other than the author"}
fit -- "Not fit" --> sheet
fit -- "FIT" --> release["Owner release:<br/>one per sheet, typed by Casey"]
release --> run["Run on the GPU via uor-pod"]
run --> row["Notebook row: date, what ran,<br/>number, bar, verdict, artifact"]
doit --> row
How work moves from an idea to a recorded result. Only the Yes branch that needs GPU spend or a milestone claim goes through a sheet, a review and an owner release.
Why there are rules at all
The owner's stated goal behind every ban, in his own words from 18 October 2026, is "to ban expensive operations" and to optimise for "fast local ai that can train fast and run fast" and reaches "almost frontier level capability" (CHARTER.md §1, from decision D37). Each rule removes a cost that a dense neural network pays, or protects the evidence that tells the project whether its geometric replacement works. When a case is unclear, the charter says to choose what trains and serves fastest on a laptop through the geometric path, and to write the choice down.
The project's headline metric is tokens per second: how fast the model reads and writes text, with decode speed and context speed measured separately. A small quality gap is acceptable (CHARTER.md §1). The project is pre-alpha, 0 of its 8 milestones are complete, and no model holds a useful conversation yet (STATUS.md; see the mechanism board).
These are rules, so the labels "proof", "measurement" and "hypothesis" from docs/formal_vocabulary.md do not apply to them. The "why" given for each rule below is the reason the charter itself states. It is not a measured result.
The constraints and the reason for each
The charter's section 3 lists thirteen technical constraints. Here they are in everyday terms. Terms are defined in the glossary.
| # | Rule | What it means in practice | Why the charter gives |
|---|---|---|---|
| 3.1 | Geometry only | Every mechanism, training signal and fix comes from the project's geometry (prime addresses, rotations, E8/H4 structures). The flock rule for attention looks at about 7 nearest neighbours, not a dense teacher. | The bet is that geometry replaces expensive dense operations. |
| 3.2 | No squashing functions | No softmax, log-softmax, cross-entropy, softplus, sigmoid, tanh or GELU anywhere, including in losses, sampling and comparators, and including renamed or lookup-table versions. | They are expensive and hide a dense global normalisation. |
| 3.3 | No matrix multiplication | No dense matmul in training, evaluation, tooling or serving, including wrappers and hand-written loops. A geometric feed-forward block is allowed; a dense MLP is not. | Matmul is the cost the project exists to remove. |
| 3.4 | Presence counts | Banned code may not sit in any compiled or loaded module. NVRTC (runtime GPU compilation) is banned. The checks uor-harness ratchet d23 and d25 only ever tighten. | Code that is present eventually runs. |
| 3.5 | Research compute is GPU-only | Training, evaluation, qualification and reference runs use the GPU. Spend GPU only where a run can change a decision. | Host runs gave wrong timing and wrong evidence, and the GPU is where the speed is. |
| 3.6 | Serving is integer, on your device | The shipped model uses no float, transcendental, multiplier or integer-divide instruction. Running it on a laptop CPU, in a browser (WebAssembly) or on Apple silicon is allowed, and so is measuring its speed and energy. Panel scoring, qualification and milestone evaluation of an exported artifact remain GPU research compute; only product serving and measuring its tokens/s and energy run on client devices. | The product is fast local AI on ordinary hardware. |
| 3.7 | Float only offline, with an export gap | Float training is legal offline in a separately scanned module. Every float candidate reports how much accuracy it loses when exported to integers; a loss above the two-seed noise band disqualifies it. | Float trains faster, but only the integer artifact ships. |
| 3.8 | Zeta exception | Float is allowed for complex-plane zeta-zero parts and prime log-phases. Everything downstream is discrete. | Zeta phases are complex numbers by nature. |
| 3.9 | Efficiency is measured | Report sparse access, bytes per token, bounded candidates and exact memory together. | Unmeasured efficiency is not efficiency. |
| 3.10 | No neural comparisons | No neural comparators, controls, teachers or graders until the owner says the model works end to end. Panels are graded by deterministic checks. The one exception is a one-time donor pass (D41) with binding conditions. | A neural comparator would hide a dense model behind the geometry. |
| 3.11 | Rust first | New code is Rust, built on the uor-foundation crates. Python only where Rust cannot do the job. | One fast, checked language keeps training and serving on one path. |
| 3.12 | Exact identity stays separate from address | One shared vector writer serves input, carry and output. Every artifact binds its data, seed, configuration and parameters. | One representation avoids translation costs, and exact identity cannot be recovered from a geometric address. |
| 3.13 | Hygiene | Typed errors instead of panics, no committed binaries, corpora or secrets, and API keys are never read or printed. | It keeps the repository small and the keys out of it. |
Source: CHARTER.md §3; the first column gives its clause numbers.
What labs may do, and what they may not
A lab is any contributor, human or AI, working under the charter. The rules in sections 3 and 5 give these limits.
Labs may:
- Choose their own work from
NOW.md, post a one-line intent note, claim a branch and carry on unless redirected (CHARTER.md§5.3). - Build, run finite kernel tests and run host checks without any pre-registration (§4.5).
- Train in float offline once a sheet, FIT and typed release exist (training is currently held; §3.7, §4.5, §5.1), and report the export gap on the same evaluator.
- Serve the integer model on a user's device and measure it (§3.6).
- Review their own pull request at the exact head, from a fresh context (§5.5), and use a fresh-context subagent as the non-author FIT reviewer (§4.5).
Labs may not:
- Use a banned operation anywhere, including in comparators, or in renamed form (§3.2, §3.3).
- Run research compute on the CPU, or spend GPU on work that cannot change a decision (§3.5).
- Start GPU training or a milestone-bearing run without a sheet, a FIT review and a typed owner release (§4.5, §5.1).
- Use a neural comparator, teacher or grader, apart from the single D41 donor pass (§3.10).
- Type an owner release themselves. Casey types it personally with
UOR_LABunset; labs only stage the commands (§5.1, from D40). - Cancel a healthy run because a self-set budget ran out, or touch another session's GPU or files (§5.4).
- Stop a mechanism. That needs the owner (§4.1).
- Delete research. Negatives, unique source and other labs' work go to the archive unchanged (§4.7).
- Exceed 4 pods or $8 per hour across all labs (§5.4).
Who decides what
| Who | Decides | Source |
|---|---|---|
| The owner (Casey) | The charter, the technical constraints, holds, spending caps, milestone bars and exceptions. Releases each pre-registered run. Stops a mechanism. | CHARTER.md §5.1 |
| The project-manager seat (Kimi, with a cover lab named by the owner when Kimi is offline) | The order of work. Keeps NOW.md with the roster. Operating notes may never contradict the charter. | CHARTER.md §5.2 |
| Labs | Which task to pick from NOW.md, how to implement it, and the exact-head review of pull requests. | CHARTER.md §5.3, §5.5 |
| Subagents | Reviews, adversarial tests and research. They never make critical decisions: a change to a bar, a status, a constraint or a spend goes to the manager or the owner as a decision card. | CHARTER.md §5.2 |
Two rules guard the owner's role. A pending owner question means wait. And Casey's own words beat any written acceptance text, with his directions recorded verbatim the same day (CHARTER.md §5.1). The training hold, the M2 hold and the Stage B hold remain until the owner releases them, and a passing FIT review releases none of them.
How evidence is judged
Section 4 of the charter is about not fooling ourselves.
- A negative closes one configuration, never a mechanism. Mechanisms carry one of three statuses: ACTIVE (on the model path), READY (built and tested, not yet trained in) or PARKED (a tested form failed or broke a rule; the reopen conditions are listed). There is no "retired" status for a mechanism (§4.1). Rules can be retired; mechanisms cannot.
- Instrument before verdict. If a check fails, first ask whether the measuring tool or the mechanism is at fault. A broken instrument is a fix, not a negative (§4.2).
- Power. A decisive run uses at least 2 seeds or at least 200 fresh rows, with bars no narrower than the measured noise, and reports a fresh transfer number with every development gain (§4.3).
- Controls and pivots. Compare against lawful non-neural baselines such as count tables. After three results on one line that do not move its headline number, write a pivot note: stop, or run one decisive experiment (§4.4).
- Claims. Write "measured X on Y against Z". A test pass is not trained capability, and
NOT_RUNis not a pass (§4.6). - The first-milestone closing bar. For milestone M1, the integer model's top-1 accuracy through the D11 export must beat both the unigram table (1,226 of 14,287) and the T2 successor table (6,300 of 14,287) on the same development panel, on each of two seeds, with tokens per second reported (§4.8).
Where it stands
| Item | State | Source |
|---|---|---|
| Charter | Adopted 19 October 2026 by the owner at checkpoint 1 of the repository renormalisation. | CHARTER.md; change log |
Old rules D0 to D41 and the long AGENTS.md | Replaced by the charter. Each decision keeps its heading and a one-sentence fate in the live index; full text is preserved unchanged in the archive. | decision-map.md; archived original |
| Training, M2 and Stage B | Remain HELD until the owner releases them. | CHARTER.md §5.1 |
| Pre-alpha status | 0 of 8 milestones complete; no useful conversation yet. | STATUS.md |
Go deeper
- The rulebook:
CHARTER.md. What happened to each old decision: decision map. When the rules changed: change log. - Live index of decisions with one-line fates:
docs/integration/DECISIONS.md. - Original full decision text: archive.
- Where the mechanisms stand: mechanism board.
- Term definitions: glossary.
Where each old decision went
Before 19 October 2026 the project's rules lived in 43 numbered decisions (D0 to D41, including a variant called D0-b) and in a long instruction file. The owner replaced them with one short charter. This page lists every decision and says what became of it: the rule lives on in a numbered charter clause, it was folded into a broader clause, or it is history only. Nothing was deleted. Every decision keeps its original heading in the live index, so old links still land, and the full original text is preserved unchanged in the archive.
flowchart LR
old["Old decision<br/>D0 to D42"] --> q{"Does the rule still<br/>bind today?"}
q -- "Yes, as written" --> kept["Kept<br/>own charter clause"]
q -- "Yes, as part of a wider rule" --> merged["Merged<br/>into a broader clause"]
q -- "No: superseded, one-off<br/>or expired" --> retired["Retired<br/>history only, in the archive"]
The three fates. "Retired" applies to rules only. A research mechanism is never retired; see the mechanism board and D22.
How to read the table
- Kept means the decision survives with its meaning and has a home in the charter.
- Merged means its content now lives inside a clause that also covers other decisions.
- Retired means it no longer binds. It was superseded by a later decision, was a one-off order, or had a time limit that has passed. Its text stays in the archive.
- Clause numbers such as 3.6 refer to sections of
CHARTER.md. Section 1 is the mission, 2 the products, 3 the technical constraints, 4 the evidence rules, 5 the workflow and 6 the retired list. - The fate column follows the final
DECISIONS.mdindex adopted with the charter (decision D42). It differs from the working rule map in one place: it files D14 as merged, because its owner boundaries and GitHub authority survive while its council is retired.
The table
| Decision | What it said (one sentence) | Fate | Charter home |
|---|---|---|---|
| D0 | Serving forbids dense matrix multiplication; first form of the sparsity test, replaced the same day by D0-b. | Retired | Superseded by D0-b; its sparsity test survives as D5 (3.9). |
| I1 to I5 | Serving efficiency invariants: sparse access, bounded candidates, bytes per token, multiplier-free kernels, exact memory. | Kept | 3.9 |
| D0-b | Additive linear maps adopted as a serving stepping stone. | Retired | Superseded by D11 (serving) and D25/D30 (no dense maps). |
| D1 | Falsify a mechanism before extending it. | Retired | Superseded by D2, D12, D20 and D22; a negative now closes only a configuration (4.1). |
| D2 | A mechanism's contribution is judged by measured ablation; enablers are a separate class. | Merged | 4.1 (enablers survive as PARKED with reopen conditions) |
| D3 | Takeover clarification, including an offline matmul permission. | Retired | Superseded by D25/D30; the permission was withdrawn. |
| D4 | Goal decomposition and the geometry gate: advantage is measured against controls. | Merged | 4.4 (lawful non-neural controls only, per 3.10) |
| D5 | Per-token parameter sparsity is the terminal serving invariant. | Kept | 3.9 (the D5-b form) |
| D6 | The target objective is a long-range information probe. | Merged | 4.4 (long-range probe items plus count-table controls) |
| D7 | Adopt the integrated attention-language programme. | Retired | Superseded by D8 and D19. |
| D8 | Correct the training method and reference ladder. | Retired | Superseded by D32/D37 (training) and D28 (no neural reference). |
| D9 | Prevent experiment loops; a repeat needs new causal evidence. | Merged | 4.4 (pivot note) and 5.3 (intent note) |
| D10 | A converted open-weight backbone as the interim chat vehicle. | Retired | Superseded by D11. |
| D11 | One native, multiplier-free, transformerless integer serving contract for every lab. | Kept | 3.6 |
| D12 | Gates promote, never kill; reopen geometric candidates; keep a toolbox. | Merged | 4.1 (ACTIVE, READY, PARKED; no terminal status) |
| D13 | Record of the 29 September two-track plan. | Retired | Superseded by D14, D18 and D19. |
| D14 | Durable autonomous labs, GitHub as authority, a three-seat council. | Merged | 5.1 (owner boundaries) and 5.2 (GitHub authority); the council is retired (owner, 19 Oct). |
| D15 | Converted students may become served candidates after an audit. | Retired | Superseded by D17; excluded by D28 and D11. |
| D16 | Working rules from the 29 September council. | Retired | Superseded by D17; the council is retired. |
| D17 | Transformer-free conversion; parity decisions with paired seeds and measured tolerance. | Merged | 4.3 |
| D18 | One retrieval question for 1 to 14 October; other tracks parked. | Retired | The window expired; its re-entry gate travels with D38 (3.9). |
| D19 | Grounded conversation and durable memory come first; self-review allowed. | Merged | 1 (mission) and 5.5 (delivery) |
| D20 | Geometry stays first; the no-loss rule is suspended only after exhaustion. | Merged | 3.1 and 4.1 (with no terminal status, no suspension procedure is needed) |
| D21 | Three non-moving results on one line force a pivot; one-off lab orders of 9 October. | Merged | 4.4 (pivot note); the lab orders are retired as executed or overtaken. |
| D22 | A negative closes a configuration, never a mechanism; power and transfer rules; five closures reopened. | Kept | 4.1 and 4.3 |
| D23 | No softmax anywhere, including losses, sampling, teachers and equivalent forms. | Kept | 3.2 |
| D24 | No CPU model compute, and no GPU on work that cannot change a decision. | Kept (scope narrowed) | 3.5, now research compute only; serving on client devices is allowed (3.6). |
| D25 | Geometric operator phase: squash and matmul bans, GPU-only compute, rule freeze. | Retired | Superseded by D32/D37; its bans live on in 3.2 and 3.3. |
| D26 | Vast.ai is the default pod provider; Runpod is the emergency backup; caps of 4 pods and $8 per hour. | Kept | 5.4 |
| D27 | Rust first, with the uor-foundation crates as the shared floor. | Kept | 3.11 |
| D28 | No transformer or neural comparisons until the native system works end to end. | Kept | 3.10 |
| D29 | No banned mechanism in any compiled or loaded module, vendor content included. | Kept | 3.4 |
| D30 | No matmul or softmax anywhere without wrapper laundering; Rust only; GPU-only heavy compute; pod kernel builds. | Merged | 3.2, 3.3, 3.4, 3.5 and 3.11 |
| D31 | No result is ruled out on an instrument technicality. | Kept | 4.2 |
| D32 | Discrete ternary, Hamming and quaternion substrate; no float in model computation; zeta-phase exception. | Merged | 3.7 (discrete path stays active; the float ban was revised by D37), 3.8, 3.12 and 3.1 |
| D33 | Delegated owner release for the first A2 pilot. | Retired | One-off; superseded by D40. |
| D34 | Revised attention and memory sequence: reranker-first read plus a D19 object-store crate. | Merged | 5.8 (the approved sequence, kept in NOW.md) |
| D35 | A seed-2 packet re-issue is required before any seed-2 go. | Retired | Superseded by D39. |
| D36 | GitHub Pages keeps the last good deploy until a D11 WebAssembly engine lands. | Merged | 2 (web client) and 3.6; its "browser serving counts as CPU model compute" clause is replaced, and the legacy crates are repaired (2.4). |
| D37 | Float is legal in offline training only, with a reported export gap. | Kept | 3.7; the owner's reason for the bans is quoted in 1, and archived sheets are handled in 4.5. |
| D38 | D5 split into D5-a (residency) and D5-b (per-token sparsity). | Kept | 3.9 |
| D39 | M1 closing bar, reachability gate, post-qualification sequence, lab self-direction. | Merged | 4.8 (bar (d) replaced), 4.2, 5.8 and 5.3 |
| D40 | Owner-identity phrases are typed by the owner personally. | Kept | 5.1 (the K16 ratification is a retired one-off) |
| D41 | One-time offline donor corpus exception (distill-d1), on binding conditions. | Kept | 3.10 (sole exception), 5.1 and 5.8 |
| D42 | The owner adopts the charter and answers eight checkpoint questions. | Kept (as the adoption record) | The charter itself; see the change log. |
Tally
Counting the rows above (excluding the I1 to I5 row and D42): 14 decisions kept, 15 merged and 14 retired, which is 43 decision entries from D0 to D41 including D0-b. This is a count of the table, derived from the live index in DECISIONS.md; it is not a separate record.
Where it stands
| Item | State | Source |
|---|---|---|
| Charter | Adopted 19 October 2026. | CHARTER.md; change log |
| Live decision index | Each entry keeps its heading, a one-sentence summary and a fate line. | docs/integration/DECISIONS.md |
| Full original text | Preserved unchanged in the archive. | archived original |
| Rule-by-rule mapping | Working document of 258 individual rules to charter clauses, kept in the audit directory. | rule-map.md |
Go deeper
- Plain-language guide to the charter: the rules of the project.
- Dated record of every charter change: change log.
- Mechanism statuses and what would reopen a PARKED one: mechanism board.
Change log for the project's rules
This is the dated record of every change to the project's rulebook, the charter. Only the owner changes the charter, and every change is written here as a new entry, newest first. If you want to know why a rule is the way it is, or when it last moved, start here. The log began on 19 October 2026 with the charter's adoption.
flowchart LR a["Old rules<br/>D0 to D41, AGENTS.md"] -- "19 Oct 2026<br/>checkpoint 1" --> b["CHARTER.md<br/>adopted"] b -- "owner changes only,<br/>one dated entry each" --> c["Next entry<br/>in this log"]
The charter replaced the older rules in one step on 19 October 2026. Later changes are added to this log as dated entries.
How an entry is written
An entry gives the date, what changed, which charter clauses it touches, and who decided. The owner's own words are recorded verbatim when they are the reason. Old text is never edited or deleted: it moves unchanged to the archive/ folder, and the live decision index keeps one line saying where each decision went (see the decision map).
19 October 2026: charter adopted at checkpoint 1
Decided by: the owner (Casey), in chat, at checkpoint 1 of the repository renormalisation. The charter replaces the stacked directions in AGENTS.md and decisions D0 to D41 as the project's rules (decision D42). Source: CHARTER.md, the final DECISIONS.md index, and the checkpoint notes in charter-diff-notes.md.
The owner answered eight questions. One line each, with the clause it changed:
- Client serving (Q1). D24's ban on CPU compute governs research compute only. Serving the exported D11 integer model on client devices (CPU, browser WebAssembly, Apple silicon), including measuring tokens per second and energy, is allowed. D36's "browser counts as CPU model compute" clause is replaced. (Clauses 3.5 and 3.6.) Panel scoring, qualification and milestone evaluation of an exported artifact remain GPU research compute; only product serving and measuring its tokens/s and energy run on client devices.
- Pre-registration (Q2). A one-page sheet with a non-author FIT review is needed only before GPU training or evaluation, and before any run a milestone claim rests on. A fresh-context subagent counts as non-author. Builds, finite kernel tests and host checks need none. (Clause 4.5.)
- Releases (Q3). One typed owner release per pre-registered sheet, covering its arms, seeds and stop rules. D40 is unchanged: Casey types it personally. (Clause 5.1.)
- Records (Q4). One notebook page per research line, with one row per result. Dated evidence folders exist only for sealed artifacts.
NOW.mdplus the notebooks replacecurrent-state.md, and STATUS and ROADMAP change only with state. (Clause 5.6.) - Coordination (Q5). The owner plus one project-manager seat (Kimi, with a cover lab named by the owner). Labs self-direct from
NOW.md. The D14 three-seat council is retired, and operating notes may not contradict the charter. (Clauses 5.2 and 5.3.) - First-milestone bar (Q6). For M1, bar (d) is replaced: integer top-1 through the D11 export must beat both the unigram table (1,226 of 14,287) and the T2 successor table (6,300 of 14,287) on the same development panel, on each of two seeds, with tokens per second reported. BPB (bits per byte) returns later as a bar once a lawful likelihood exists. Bars (a), (b), (c) and (e) are unchanged. (Clause 4.8.)
- Harness (Q7). The harness stays as a shared view with automatic presence and no manual heartbeat cadence. The merge queue serialises itself. The
adopt_policyhold is dropped, and claims record the charter version. Discretionary harness features are frozen until a model beats both count tables; mandated Rust ports (D27) continue. (Clauses 5.3 and 5.5.) - Legacy crates (Q8). The four older crates (
uor-r4-graph-compiler,uor-r4-graph-certify,uor-r4-api,uor-r4-proof-model) and the root crate are repaired on the current core instead of archived. Repair restores the build only; their mechanisms stay PARKED. (Clause 2.4.) The draft had recommended archiving them; the owner chose repair.
Approved in the same session: archive everything byte-identical with nothing deleted; side projects under projects/; documentation as GitHub markdown plus an mdBook site with the Studio at /studio; the web client as a local in-browser WebAssembly integer model; the desktop client as a Tauri app (specification only); and D22 kept, so mechanism statuses are ACTIVE, READY and PARKED with no terminal state. Source: CHARTER.md and decision D42 in docs/integration/DECISIONS.md.
Side effects on earlier rules:
| Rule | New fate | Source |
|---|---|---|
| D14 council and fixed roster | Retired; owner boundaries stay at 5.1 and GitHub authority at 5.2 | charter-diff-notes.md |
| Five-, twenty- and thirty-minute check-in cadences, and queue entries called by the manager | Retired | CHARTER.md section 6 |
| Per-PR dated records | Retired in favour of notebook rows | CHARTER.md section 6 |
adopt_policy hold | Retired | CHARTER.md section 6 |
| Already superseded, now listed in charter 6: decisions D0, D0-b, D1, D3, D7, D8, D10, D13, D15, D16, D25, D32 item 1, D33, D35, and the expired D18 window | Listed as history only in the charter; most were superseded long before this date. See the decision map | CHARTER.md section 6 |
Where it stands
| Item | State | Source |
|---|---|---|
| Charter in force | Yes, since 19 October 2026. | CHARTER.md |
| Entries in this log | 1 | this page |
| Open owner questions on the charter | None recorded at adoption: all 16 rows marked "owner decision needed" in the working rule map were resolved by the eight answers. | charter-diff-notes.md |
Go deeper
- Plain-language guide to the rules: the rules of the project.
- What happened to each old decision: decision map.
- The rulebook:
CHARTER.md. - Original decision text: archive.
UOR-R4 Charter
Adopted 19 October 2026 by the owner (Casey), at checkpoint 1 of the repository renormalization; replaces the stacked directions formerly in AGENTS.md and D0–D41.
Old text moves byte-identical to archive/. Bracketed ids are sources.
1. Mission
Build the UOR-R4 Geometric Language Model: a fast language model that is not a transformer. It predicts text with geometry (prime addresses, zeta phases, E8/H4/icosian rotations, SpiralCore/FBS routing) and exact memory, on an ordinary laptop or in a browser. Conversation with durable memory first, then coding and reasoning, on one model [AGENTS:mode, D19, AGENTS:both-lines]. Pre-alpha; no capability is established.
The owner's rule: "USE GEOMETRY. THAT IS THE END OF IT. NEVER USE ANYTHING ELSE." [OWNER:0]
The owner's goal behind every ban (18 Oct, verbatim): "my goal with all of these bans is to ban expensive operations and to always optimize for what is best for the project goal... fast local ai that can train fast and run fast and reach almost frontier level capability ... we have so many mechanisms, at this point we just need to stitch the right ones together and optimize all of the things that aren't, which will likely be found in the details" [OWNER:26, D37]. When unclear, choose what trains and serves fastest locally on the geometric path, and write it down [D37:why-bans]. The lead metric is tokens per second (decode, and context separately); a small quality gap is acceptable [OWNER:5].
2. Products
- Model: the geometric model, exported as one D11 integer/table artifact; built in
crates/uor-r4-discrete, served bycrates/uor-r4-integer[AGENTS:ownership]. - Web client: the Studio at
/studioon the mdBook site, running the integer model locally in the browser as WASM [renorm decision 7, D36]. - Desktop client: a Tauri app sharing the web UI, the native integer model with D19 memory, offline, on M1-class laptops; spec only [renorm decision 8].
- Legacy crates are repaired, not archived:
uor-r4-graph-compiler,uor-r4-graph-certify,uor-r4-api,uor-r4-proof-modeland the root crate are repaired to build on the current core; repairing restores the build only, and their mechanisms (r4g1-graph, native-geometric) stay PARKED. [D36, owner 19 Oct]
3. Technical constraints
- Geometry only. Every mechanism, training signal and fix comes from the project's geometry; keep R4/S3, Hopf and paired-H4/icosian roles distinct (E8 = H4 ⊕ φH4, fixed). Flock reads use local rules (~7 nearest neighbours), not a dense teacher. Why: the bet is that geometry replaces expensive dense operations. [OWNER:0, OWNER:6, D20, D32:hamming-one-factor, AGENTS:typed-geometry, AGENTS:e8-shorthand]
- No squashing functions. No softmax, log-softmax, cross-entropy (implicit softmax), softplus, sigmoid, tanh, GELU or normalized exponential, anywhere: runtime, losses, gradients, sampling, teachers, surrogates, comparators, including renamed or table forms. Why: they are expensive and hide a dense global normalization. [D23, D25, OWNER:1, HR:no-squash]
- No matmul. No dense matrix multiplication or GEMM anywhere: training, evaluation, instruments, serving and tooling, including wrappers and hand loops. A geometric feed-forward block (Hamilton gate and projections) is allowed; a dense MLP is not. Why: matmul is the cost the project exists to remove. [D25:no-matmul-anywhere, D30, OWNER:2, OWNER:14, HR:no-matmul]
- Presence counts. Banned code may not exist in any compiled or loaded module or vendor path; NVRTC is banned; CUDA is prebuilt by nvcc. Ahead-of-time nvcc kernel builds run on the GPU pod (authorized by D30); the laptop runs CPU-only builds and static checks. The ratchets
uor-harness ratchet d23|d25only go down. Why: code that is present eventually runs. [D29, R5, OWNER:no-nvrtc, HR:banned-module] - Research compute is GPU-only. Training, evaluation, qualification, and model and parity reference execution run on the GPU; a host fallback is a defect to fix with a kernel. Spend GPU only where a run can change a decision. Why: host runs gave wrong timing and wrong evidence, and the GPU is where the speed is. [D24, OWNER:4, OWNER:20, HR:gpu-only]
- Serving is integer, on the user's device. The exported artifact has no float, transcendental, multiplier or integer-divide instruction (D11 R1–R5); the frozen runtime does no steady-state allocation, and a dense model disguised as lookup tables is excluded. Serving it on client devices (CPU, browser WASM, Apple silicon), including measuring tokens/s and energy, is the product and is allowed; D24 does not apply, and D36's browser-as-CPU clause is replaced. Panel scoring, qualification and milestone evaluation of an exported artifact remain GPU research compute (§3.5); only product serving, and measuring its tokens/s and energy, run on client devices. Why: the product is fast local AI on ordinary hardware. [D11, D36, D39:float-horizon, HR:serving-integer, AGENTS:frozen-tla; owner 19 Oct]
- Float only offline, with an export gap. Float forward, gradients and optimizers are legal offline, in a separately scanned module, never in the discrete crate. Every float candidate reports its export gap on the same evaluator; a gap above the two-seed noise band disqualifies it. The D32 discrete path stays active; its qualification uses exact arithmetic. Why: float trains faster; only the integer artifact ships. [D37, D39:export-gap, R13, HR:float-offline, KIMI:d37]
- Zeta exception. Float is allowed on the complex plane for zeta-zero parts, prime log-phases and the C4→R4/C8→R8 phase maps; everything downstream is discrete. Why: zeta phases are complex numbers by nature, and the bans target expensive operations, not geometry. [D32:zeta-exception]
- Efficiency is measured. Report sparse access, bytes/token, bounded candidates, multiplier-free kernels and exact memory together, naming D5-a (residency) or D5-b (per-token sparsity, the end state). Why: unmeasured efficiency is not efficiency. [I1-I5, D5, D38]
- No neural comparisons (comparators, controls, teachers, graders) until the owner says the model works end to end; panels are graded deterministically. Sole exception: D41's one-time
distill-d1donor pass, on its binding conditions: the student consumes hard targets only (no logits, probabilities or distributions), the donor never executes in student preparation, training, evaluation, serving, grading or any panel, a generation receipt is bound at generation, and a typed D40 owner release is required at dispatch. Why: a neural comparator would hide a dense model behind the geometry, against geometry only. [D28, OWNER:memory-no-transformer, D41] - Rust first, building on the uor-foundation crates; Python only where Rust cannot; no ad-hoc scripts. Why: one fast, checked language keeps training and serving on the same geometric path. [D27, OWNER:20, HR:rust-default]
- Exact identity stays separate from geometric address; one shared vector writer serves input, carry and output; every artifact binds its data, seed, config, parameters and format. Why: one representation avoids translation costs, and exact identity cannot be recovered from a geometric address. [POLICY:shared-vectors, AGENTS:shared-vector, AGENTS:artifact-determinism]
- Hygiene:
Resulterrors at library boundaries; no unwrap/expect/panic on recoverable paths; keepforbid(unsafe_code)in portable runtime and format crates; no committed binaries, corpora or secrets; never read or print API keys. Why: hygiene keeps the repository small and fast to clone, and keeps keys out of it. [AGENTS:errors, HR:no-artifacts, HR:no-credentials, AGENTS:no-keys]
4. Evidence
- A negative closes a configuration, never a mechanism. Mechanism statuses are ACTIVE (on the model path), READY (built and tested, not yet trained in) and PARKED (failed or broke a rule; reopen conditions listed). There is no terminal status. Stopping a mechanism needs the owner. [D22, D12, D2, POLICY:gates-promote, renorm decision 5]
- Instrument first. Classify a failing check as instrument or mechanism before calling anything; an instrument defect is a fix, never a negative. No target is set from a vacuous instrument; no single number rules out a line. [D31, R12, R14, D39:gcap]
- Power. Decisive runs use ≥ 2 seeds or ≥ 200 fresh rows, with bars no narrower than measured noise, the mechanism trained in, and a fresh transfer number with every development gain. [D22:power, D22:transfer, D17]
- Controls and progress. Compare against lawful non-neural baselines (count tables). After three results on a line that do not move its headline, write a pivot note: stop, or one decisive run. [D21, D6, D9, POLICY:progress-control]
- Pre-register only where it decides spend. A one-page sheet (bar, noise, controls, seeds, cost, what each outcome decides) with a non-author FIT review is required only before GPU training or evaluation, and before any run a milestone claim rests on. A fresh-context subagent counts as non-author. Builds, finite kernel tests and host checks need no sheet. Archived float sheets return only as new sheets with a fresh FIT. [R4, D37:archived-sheets, AGENTS:mech-briefs; owner 19 Oct]
- Claims. "Measured X on Y against Z"; label proof, measurement, hypothesis; NOT_RUN is not PASS; tests are not trained capability. [HR:claims, POLICY:evidence, AGENTS:invariant-formal, PROTO:status-vocab]
- Preserve. Nothing is deleted: negatives, unique source and other labs' work go to the archive byte-identical. [R6, HR:archive]
- M1 closing bar. Bar (d) is replaced, for M1: integer top-1 through the D11 export, on each of two seeds, beats both the unigram table (1,226/14,287) and the T2 successor table (6,300/14,287) on the same DEV panel, with tokens/s reported. BPB returns as a later milestone bar once a lawful likelihood exists. Bars (a), (b), (c) and (e) are unchanged. [D39, owner 19 Oct]
5. Workflow
- The owner decides this charter, §3, holds, spending caps, milestone bars and exceptions like D41. Training, M2 and Stage B stay HELD until released; a FIT releases nothing [AGENTS:holds-oct12, D37]. One typed owner release per pre-registered sheet covers all its arms, seeds and pre-registered stop rules. Casey types every release personally, with
UOR_LABunset; labs stage the commands [D40, R15; owner 19 Oct]. A pending owner question means wait; Casey's words beat written acceptance text; record directions verbatim the same day [OWNER:9, OWNER:10, OWNER:11]. - Coordination. GitHub
mainis the single source of truth [PROTO:github-authority]. The owner plus one PM seat: Kimi, with a cover lab named by the owner when Kimi is offline. The PM sequences work and keepsNOW.md(with the roster) and operating notes that may not contradict this charter. The D14 council is retired [OWNER:21, OWNER:28, OWNER:32, R7, R9, R11, D14; owner 19 Oct]. Subagents never make critical decisions: a change to a bar, status, constraint or spend is a decision card to the PM or owner; subagents review, test adversarially and research [OWNER:26]. - Labs self-direct from
NOW.md: pick work, post a one-line intent note, claim the branch, continue unless redirected [D39:self-direction, R1]. SetUOR_LAB; the harness is the shared view with automatic presence and no manual heartbeat cadence; claims record the charter version, with noadopt_policyhold. Discretionary harness features freeze until a model beats both count tables (§4.8); mandated D27 ports continue [AGENTS:uor-lab, R3, PROTO:cadence, PROTO:versioned-authority; owner 19 Oct]. Outsiders skip the harness; a maintainer runs gates [OUT:no-harness]. - Compute: pods only through
scripts/pod/uor-pod; Vast.ai default, Runpod emergency backup; at most 4 pods and $8/h across all labs; lease what you use; never touch another session's GPU or files; never cancel a healthy run for a self-set budget; save results off the pod. Choosing Runpod by hand needs--owner-approved(D26). [D26, D26:caps, AGENTS:gpu-pods, AGENTS:budgets, PROTO:expired-lease, OWNER:17] - Delivery: short branch in your own worktree → PR → exact-head review (self-review allowed, fresh context) → checks at that head, posted → merge queue, which serializes itself with no PM call per entry → verify on fresh
main→ delete branch and worktree →uor-hygiene --apply. Merge forward, never force. Queued is not merged; partial work says "References #N". [AGENTS:delivery, R2, R8, R10, R-queue, AGENTS:merge-forward, HR:delivery] - Records: one notebook page per research line (
docs/research/notebook/<line>.md), one row per result: date, what ran, number, bar, verdict, artifact link. A dated evidence folder is kept only when a run seals artifacts.docs/integration/NOW.mdplus the notebooks replacecurrent-state.mdas the running record. STATUS and ROADMAP change only with state, never as receipt logs. Results go to iCloud/HF with checksums; keep 30–70 GB free. [AGENTS:cadence-oct9, C:cadence, AGENTS:storage; owner 19 Oct] - Lessons: pitfalls live in
uor-harness mistakes, not here. [AGENTS:pitfalls] - Approved sequences (D34, D39 item 4, D41 item 3) live in
NOW.mdand bind until the owner changes them.
6. Retired
History only (see the DECISIONS.md index): superseded D0, D0-b, D1, D3, D7, D8, D10, D13, D15, D16, D25 (bans live on in §3), D32 item 1, D33, D35 and the dated AGENTS, session-goal, POLICY, KIMI and CODEX blocks; finished one-offs; the expired D18 window. Retired by the owner on 19 Oct: the D14 council and R9's fixed roster (Q5); the 5-, 20- and 30-minute cadence and PM-called queue entries (Q7); per-PR dated records (Q4); the adopt_policy hold.
Changing this charter
Only the owner changes this charter. Changes are recorded as dated entries in docs/rules/changes.md.
Formal Vocabulary, Notation, and Claim Classes
- Version: 0.1.35
- Status: Normative for all new specification, plan, proof-model, and certificate text.
- Source:
docs/hologram_formal_analysis_direction.pdf§§1, 7, 13; tracker #122; issue #123. - Related: terminology for existing graph-compiler concepts lives in
docs/transformerless/GLOSSARY.md; this document governs claim language and mathematical notation. Where the two overlap, this document wins for claim classification and the glossary wins for structural terms. The route-scope decision is ADR-0004, and current execution follows the native geometric AI policy. Geometric Intelligence Evaluation retains historical experiment protocols. A preserved #973 terminal contract isR4PredictiveBlockDeltaPromptCapacityV5.
Current authority (2026-09-05). This document governs claim language and typed mathematical distinctions. The project plan owns the goal, and current-state.md owns the implemented model and next work. Dated results and table cells naming a "current" reference, a parked operation or an unimplemented boundary retain their original artifact scope; they do not select a new task or prohibit a versioned native successor. Preserve their measurements without importing a reference model's capability or runtime guarantees into the active model.
This spec separates the statement classes that the research notes previously mixed — architectural definitions, compiler optimization objectives, empirical certification claims, and structural runtime guarantees — and fixes the symbols that recur across the compiler, artifact, certificate, and proof model.
1. Claim classes (role of a statement)
Every equation and every normative mathematical statement in repository documents
MUST carry exactly one of these role labels, written inline in bold
(**Definition**, **Objective**, **Guarantee**, **Assumption**,
**Empirical Criterion**):
| Label | Meaning | Where it may appear |
|---|---|---|
| Definition | Introduces an architectural object or mathematical term. True by convention; never "proven". | Anywhere |
| Objective | A quantity the offline compiler attempts to optimize. Never a runtime invariant, never a theorem. | Compiler-side docs/code only |
| Guarantee | A structural property of the compiled artifact or runtime. Requires a claim status from §2 and a proof artifact, witness, test, or explicit Unproven record. | Artifact spec, runtime docs, proof model |
| Assumption | A condition a proof or certificate requires but the implementation does not itself establish. | Proofs, certificates |
| Empirical Criterion | A measured property with a declared distribution, protocol, sample count, and uncertainty. Never stated as a proof. | Certificates, evaluation docs |
Design aspirations are not theorems: an optimization target (arg max …) is an
Objective, and a measured approximation (P_θ(a|c) ≈ P_θ(a|Z(c))) is an
Empirical Criterion until the protocol behind it is declared.
2. Claim status (evidence behind a statement)
Every Guarantee and every Empirical Criterion MUST also carry one of these
statuses. The statuses are the machine-readable vocabulary of the proof-status
matrix (crates/uor-r4-proof-model/src/proof_matrix.rs); the mapping is normative.
| Status | Meaning | ProofStatus mapping |
|---|---|---|
| Structural | Established by construction or by a named machine-checked test, fuzz target, or formal proof artifact that has actually run for the declared evidence. | Verified |
| Witnessed | Established per execution by a bounded, replayable witness an independent verifier replays without the teacher. | Verified (witness path) |
| Empirical | Measured on a pinned corpus with protocol, confidence intervals, and provenance identifiers, per docs/transformerless/EQUIVALENCE_AND_EMPIRICAL_PROTOCOL.md. | DifferentialPass |
| Assumed | Required by a proof or certificate but not established by the implementation. | recorded as an assumption entry |
| Unproven | Asserted as a goal but currently without evidence. | Unverified (blocks verify_all) |
ExecutableSpec in the proof matrix means the obligation has a runnable
specification but no activated binding check yet; documents must label such claims
Unproven (or Assumed where applicable), never Structural.
2.1 Wording rule (automated check, dormant by default)
The prohibited phrases are "machine-verified", "machine verified", "exact equivalence", "exact teacher equivalence", and "provably equivalent". They are prohibited in
normative documents (docs/**, crate READMEs) unless the same line links a proof
artifact or certificate, or the phrase is explicitly disavowed on that line.
The uor-r4-claim-wording gate enforces this when explicitly activated (see §6). The project does not
claim exact teacher equivalence (disallowed per this rule), does not claim
human-level reasoning, and does not treat plausible language output as evidence of
coherent internal state transitions.
3. Core notation
Symbols are listed with their claim role and their concrete Rust binding. Entries marked compiler/reference-only have no deployed-runtime representation yet; the runtime path for them lands in the issues noted.
| Symbol | Role | Meaning | Rust / artifact binding |
|---|---|---|---|
x_t^ℓ | Definition | Hidden/residual state at token position t and decoder layer ℓ. | Active geometric-decoder/source-control state; exact binding lands under #950/#952. |
q_t^ℓ, k_i^ℓ, v_i^ℓ | Definition | Learned query, causal prefix key, and value contribution. These predictive roles are distinct from immutable R4G1 route codes, addresses, and CIDs. | The #950/#951 G0/G1 mixer and DirectCausalGeometricAttentionR4V1 are retained comparators. The current offline reference is HELM-D-R4 under ADR-0005; its first parity arm leaves every learned Q/K/V and W_o unchanged. |
p_t, e_t, N_t | Definition | Registered prime route atom; canonical unordered semiprime transition expert e_t = p_(t-1)*p_t; and bounded ordered n-let. If adjacent atoms repeat, e_t = p_t^2 is retained. The square-free case is the subset p_(t-1) != p_t. N_t retains order and a multiplicity-preserving sorted factor multiset rather than relying on an overflowing numeric product. | Schema-2 source-free manifest records under #958. This binding establishes representation and deterministic recall substrate only. |
Gamma = (gamma_0,...,gamma_(m-1)), theta_j(p), delta_theta_j | Definition | Gamma is a finite ordered, revisioned zeta-ordinate grid. theta_j(p) = wrap(gamma_j*log(p)); delta_theta_j is the declared local phase difference. | Compiler/reference math and bounded compiled signatures under #958. Critical-line use is an Assumption, not a proof of RH; no serving or capability claim follows. |
s_t in S3 subset R4, h(s_t) in S2 subset R3, tau_t in S1 | Definition | s_t is the full normalized local spin state, h is its many-to-one Hopf observation, and tau_t is retained quantized fiber/transport phase (“torsion”). h(s_t) alone is not a rebuild identity. | Quantized source-free route records and experimental bounded lookup under #958; no physical or quantum interpretation is claimed. |
theta=atan2(sin(theta),cos(theta)), a(theta)=sin(theta)^2, chi(theta)=sign(sin(theta)), pol(theta)=sign(cos(theta)) | Definition | S3/R3 trigonometric transition contract. (sin=+/-1,cos=0) has activation 1; (sin=0,cos=+1) is continuous-null activation 0. Chirality and, where needed, cosine polarity preserve orientation/antipodes. tan(theta) is a local chart only. | At a tangent pole or declared null boundary, the architecture switches angle/cotangent chart and records a signed quarter-turn phase plus torsion shift instead of dividing by zero or terminating. Semantic value is Unproven. |
m_E=sqrt(2), m_C=2i, m_R in [0,2] | Definition | Typed least-cost adapter markers: Euclidean orthogonal-unit chord, complex/discrete antipodal displacement, and declared normalized Riemannian/chord score interval. They are not literal equalities of Euclidean, complex, discrete, and Riemannian domains. | A target-specific cost profile binds chart, units, orientation, quantization, error bounds, canonical tie-break, and conversion witness before choosing the cheapest faithful operation. |
r_t = a_t + b_t*phi in Z[phi] | Definition | Direction-preserving golden radial shell. phi:(a,b)->(b,a+b) and phi^-1:(a,b)->(b-a,a). Repeated steps have Fibonacci recurrence, which does not establish semantic value. | Exact coefficient updates and manifest chart profile under #958; product use remains separately qualified. |
I1, I2, IS | Definition | Bounded causal indexes keyed by last route, ordered previous-plus-last route, and ordered sentence-route identity. | Incremental identity, exact rows, and an off-serving geometric-attention experiment exist under #958. Exact hits are recall; attention and product claims require the evaluation policy. |
e^(i*pi)+pi^0 =_bridge 0^0, b_0 | Definition | Typed zero/identity transition. ContinuousNull preserves the complex cancellation as 0; DiscreteEmptyProduct phase-shifts/retypes the seam into the discrete identity 1. =_bridge is a domain-transition operator, not ordinary numerical equality. The selected tag is part of route identity and deliberately exposes the -1 / 0 / +1 landmarks without assigning two simultaneous values in one untyped calculation. | ZeroPowerBridge and schema-2 manifest binding under #958 select the boundary value; the full phase-shift transition remains an architectural contract for the route hierarchy. |
C_lex | Definition | Deterministic lexical codec from pinned input bytes/tokenization to registered route atoms and back to output bytes where decoding is defined. Normalization, unknown-unit behavior, tokenizer CID, registry, and codec version are part of its identity. | Product binding remains Unproven until a provider-free serving path exercises the same codec end to end. |
B_ico : Lambda_E8 ~=_Z I -> (x,x') in R4 ⊕ R4, Phi_E8 = H4 ⊕ φH4 | Assumption | Project shorthand: E8 = H4 × H4. The load-bearing implementation contract realizes that conceptual identity through the chosen icosian presentation: the E8 lattice and icosian ring are identified as Z-modules, one state is represented by golden/Galois-coupled R4 points, and the declared 600-cell folding is H4 ⊕ φH4. This is a typed construction, not a claim that R4 = E8. | Basis, glue/parity rule, conjugation, scale, orientation, root order, and inverse witness must be kappa-bound. Architectural load-bearing is assumed and is scheduled for test under D20 §4, which bounds how long the assumption may stand unchallenged; held-out advantage remains unproven. Structural priority and measured advantage stay distinct claims. |
kappa(X) | Definition | Canonical content identity of the schema/provenance-bound byte envelope X. Equality identifies equal canonical envelopes under the named digest contract; digest distance has no routing meaning. | Manifest/artifact CIDs. Kappa is integrity and provenance, not a semantic code. |
R_t^q, q in {local,sentence,paragraph,conversation,global} | Definition | Identity-scoped, causal route accumulator at hierarchy scope q. A parent scope commits to ordered child identities and bounded geometric summaries; it does not rescan all descendant tokens at query time. | ADR-0004 contract; scopes beyond the current local/sentence substrate are Unproven. |
T_t^q = (v_session, w_window, E_proj, F_shared, c_res, alpha_Hopf, B_ico) | Definition | Bounded transported trajectory/harmonic summary for scope q: session hypersphere vector, winding/window state, projection energy, shared-prime factors, cosine resonance, accumulated Hopf phase, and paired-H4/E8 coordinate. It is updated incrementally from the full transported path, not reconstructed from only the last route. | Ancestor routing evidence motivates these fields; current held-out locality when exact hierarchy keys miss is an Empirical Criterion, status Unproven until reproduced. |
W_cov | Definition | Bounded coverage witness recording codec/address coverage, hierarchy rows read and hit/miss, candidates before/after admission, controls, selection or abstention, and artifact identities. | Coverage establishes reachability only; capability status comes from a separate empirical record. |
A_recall, A_geo | Definition | A_recall retrieves a stored continuation by exact/backoff route identity. A_geo selects or orders admitted causal support using declared geometric terms and must be load-bearing against matched controls on anti-recall inputs. | Exact-row recall is implemented substrate. Geometric-attention advantage is an Empirical Criterion, currently not implied by implementation presence. |
F_i^b, P_(j -> i)^b | Definition | F_i^b is the exact cumulative Spin/H4 orthogonal model-frame basis for R4 head block b; local encoding is transpose(F_i^b) x, and P_(j -> i)^b = transpose(F_i^b) F_j^b moves both locally encoded causal K_j^b and V_j^b into query frame i. The current vector action is a compiler-side f64/f32 oracle, not exact deployed arithmetic. | HELM-D-R4 uses this declared orthogonal gauge transport before comparison and aggregation. It is not called Levi-Civita or shortest-geodesic transport without a separate proof. |
B_c(g), theta_x^r | Definition | ConnectionGaugeCovarianceV4 represents each predictive role by the same three local coefficients theta in a declared tangent frame B_c(g) and transports them by B_c(d) transpose(B_c(s)). | V4 passed construction covariance, all 120 frames/14,400 ordered pairs, and finite-difference gradients, but its protected held-out reveal scored 13/24 for every main arm with insufficient destructive-control separation. It is frozen negative evidence. |
alpha_(i,j), r_i | Definition | In the HELM-D-R4 parity arm, alpha_(i,j) is the unchanged stable causal-softmax normalization of the donor's ordinary compatibility score after K transport, and r_i = F_i sum_(j<=i) alpha_(i,j) P_(j -> i) transpose(F_j) v_j is mapped back before unchanged W_o. | This is the accepted gauge-equivalent reference-attention baseline. Its bounded held-out full-decoder parity result and native R4SoftmaxReferenceGeneratorV1 gate are Pass. The dedicated opt-in, loopback-only HTTP endpoint additionally passes exact eight-token CLI token/decision-CID/state-CID parity with all 30 layers audited and zero future reads. Dashboard wiring/static native-readiness and WASM-isolation checks pass; browser interaction/E2E is NOT_RUN. These are numerical/behavioral source-donor/reference results, not geometric advantage or a deployed transformerless-runtime mechanism. The generator uses UOR's pinned SmolLM2 HuggingFaceLlamaOracle decoder path and remains Transformer-compatible and source-weight backed. HELM-D is an MIT architectural reference only at 7501deca8f413848bfef804be64ce874b72a3cd7; no HELM checkpoint or code executed and no upstream result is inherited. See helm_d_r4_softmax_decoder_973.md, r4_softmax_reference_generation_973.md, r4_softmax_reference_generation_attempt_01_result_973.json, and r4_softmax_reference_http_bridge_973.md. |
R4SoftmaxTeacherTraceV1, R4SoftmaxTraceCompilerV1 | Definition | Construction-only trace schema and compiler. The trace binds causal layerwise token, Q/K/V, attention-support, value-aggregate, decoded-output, and logit states from the exact qualified reference. The first compiler emits matched teacher-distilled, observed-count, and document-permuted Q16 suffix arms without granting future or target inputs at inference. | Pass at the bounded source-free-distillation scope: context-bearing covered teacher CE was 2.660721 versus count 9.678894 and permuted 4.342019; teacher top-1 was 3/9 versus 2/9 and 1/9; actual-next top-1 was 2/9, tied with count. Artifact/reveal CIDs and replay were exact, causal audits passed, and student inference made zero source calls. Decoded continuation collapsed into a , Scotland cycle, and the student does not use geometric trace state, so this is not geometry advantage, coherent generation, reasoning, or a deployed transformerless runtime. See r4_softmax_trace_student_973.md. |
R4SoftmaxTraceStateStudentV1 | Definition | Bounded source-free state transition and next-token readout over the captured query-gauge Q, transported K/V support, weighted aggregate, and decoded model-frame trace, compared with the established suffix student, an equal-budget non-geometric recurrent state, and a transport-permuted control. | Completed negative at the frozen #1011 gate. On the same nine context positions and 422,875 Q16 teacher mass, covered CE / teacher top-1 / actual-next top-1 were suffix 2.660721032, 3/9, 2/9; plain 2.660770919, 3/9, 2/9; geometric 2.660705367, 3/9, 2/9; and transport-permuted 2.660729215, 3/9, 2/9. The geometric gains of 0.000015665 nats over suffix and 0.000023848 over permutation were below the frozen 0.10 threshold; no top-1 decision changed, the control lost none, and all arms retained the period-two , Scotland cycle. Exact replay and causal/runtime audits passed. State/freeze/seal/result CIDs are respectively blake3:b617fc38e7bef1cdea76991f6e5e7cc653118451d63bcbd595f8ffd7e247ae7b, blake3:67cf67bb46b94cf5644b8dde286e89adb7e49159b3749790dffb500d8047fedb, blake3:64587526f7883ab046e884a28b6af7e9e89818c9ead2039f8c995de7fb483060, and blake3:dc04a8a8b21750799db2d451c8237d1e62cf90ffa74561fb54272b1e9704c824. Terminal: STOP_R4_SOFTMAX_TRACE_STATE_STUDENT_REPAIR_OR_RETIRE_REPRESENTATION. This falsifies the current 4D signed-reduction/token-derived state cell, not ordinary R4/Spin softmax attention. See r4_softmax_trace_state_student_1011.md. |
R4GroupAddressedRetentionLMV1, M_t^b(h) | Definition | #973's fixed-size source-free state: four banks hold an R4-block field over 120 addresses, updated through one frozen group action and read candidate-relatively with separate learned query/value tables. Exact-H4 is compared with equal-size cyclic-120 and destructive scrambled-H4 actions; a state-off intervention tests whether retention changes logits. | Construction terminal: UNAVAILABLE_FRAME_POPULATION_OR_LOCAL_BUDGET. Geometry, population, reachability, gradients, memory, equal work, and held-out sealing passed; timing and disposable learning smoke failed. Main optimization and held-out model criteria are NOT_RUN; there is no attention or H4-advantage verdict. The exact cell is not retried or tuned. See r4_group_addressed_retention_973.md. |
R4GroupAddressedRetentionDecoderV1CpuRecovery | Empirical Criterion | Independently frozen complete construction run of the group-addressed retained read/write law inside an exact 3.17M-parameter, two-block decoder recipe. A state-off intervention measures whether retained state is load-bearing; exact-H4 versus scrambled transport measures geometry-specific separation. | Completed: state-off on the disjoint construction-validation partition lost 0.967227 nats and 182 top-1 hits, qualifying a bounded causal retained-attention component. Aggregate validation CE moved 8.371911 -> 8.976155, so the exact data/dose/parameter recipe did not satisfy its frozen full-decoder generalization criterion. Scrambled transport was 0.033049 nats better, so no H4-specific advantage follows. Formal H4 specificity is NOT_EVALUATED. Result CID blake3:68355ad2f61d02dc73dbf22de4c24834815a23069ed5735630dc365081cf91db; see r4_group_addressed_retention_decoder_cpu_recovery_973.md. |
R4RetainedLanguagePathV1 | Definition | A 252,160-parameter source-free language path using the frozen group-addressed retained-state law, compared under equal parameter budget with an ordinary causal-softmax decoder and under a state-off intervention. | Qualified at its declared scope: retained NLL 3.899862, ordinary-control NLL 3.903394, and state-off NLL 4.234849; state removal lost 16,660 correct next-token decisions. A separate retained-only smoke produced five valid, exactly replayed local continuations without forbidden/provider/source reads, but every output drifted from its prompt subject or scene. This establishes load-bearing retained attention and autonomous local decoding, not prompt-conditioned coherence, H4 superiority, reasoning, or exact lowering. See r4_retained_language_path_v1_973.md. |
R4PairedH4LanguagePathV1 | Definition | The one frozen V1-capacity successor that holds training data, seed, schedule, parameter count, and work fixed while replacing the shared per-layer H4 token address with a deterministic paired-H4 address. | The address construction reduced repeated joint addresses by 97.5477%. On fresh held-out language it scored NLL 3.8832293739 and top-1 29.780171%, versus V1 3.8901151940 and 29.706357%. This is construction/general-language evidence only; it does not establish prompt capacity or H4 superiority. |
g_d, G_prompt | Empirical Criterion | For each of 512 bidirectional matched-prompt contrasts sharing the final four prompt tokens, `g_d = (log P(y_d | own prompt) - log P(y_d |
R4LayerwiseNormalizedRetainedReadoutLanguagePathV1 | Definition | #973's final zero-parameter readout variant: E @ [N(h) + (g/sqrt(2))*(N(a1)+N(a2))], fixed candidate g=1 versus matched V1 g=0, with recurrence, state, parameters, data/order, optimizer, 2,730-step dose, and tied vocabulary projection held fixed. | Completed partial: V3 candidate G_prompt = 0.0286980210 versus V1 0.0073316237, incremental 0.0213663973, with 339/512 wins. Every fresh-language and mechanics gate passed, but the candidate missed the absolute 0.0433216988 and incremental 0.0253415693 prompt-gain floors. Terminal LAYERWISE_NORMALIZED_RETAINED_READOUT_PROMPT_CAPACITY_PARTIAL; result CID blake3:35396bd6e64fc2c0bc7d86a84cc9e212ed913ce28e5353f5f2b8212b4cf2c532; independent verification CID blake3:3f316541dbab8061ed5ba891bf6a47ef22c55bca21fba01f6f97dbb3cb8497aa. Generation, reasoning, and exact/geometry-native lowering are NOT_RUN. |
R4LearnedCandidateLeafAssociativeReadoutV1, zG[t,c] | Definition | #973's completed learned readout reads V1's strict-prior transported retained value at candidate c's canonical exact-H4 leaf with an independently learned [2,4096,12,4] candidate-query table: zG[t,c] = <E[c],N(h[t])> + (1/(2*sqrt(48)))*sum_l <qG[l,c],R(V[l,t,lambda(c)])>. Qualified V1 is immutable. The equal-parameter address-blind arm has an unshared, byte-identically initialized query table and reads the occupied-address mean; a fixed-leaf derangement reuses the geometric table while destroying candidate/address binding. | Completed negative at the frozen prompt-capacity scope: geometric gain 0.00637679, 299/512 wins, and own NLL 3.71038302 failed the capacity floors. Pooled gain 0.01026323, 324/512 wins, and own NLL 3.68289051 was partial but also below both gain floors. Both fresh-language and state-load-bearing gates passed. Terminal LEARNED_ASSOCIATIVE_READOUT_NO_CAPACITY; result CID blake3:cedba37738ee249457bb589f716ee75afb16a0c4937c2a22ae9f917dd3eb97c1; verification CID blake3:443d711ce9a228e26e2eb2eebb55c582848424e2677c3473d41deaf8afd69ec7. See r4_learned_associative_readout_prompt_capacity_973.md. |
R4LearnedAssociativeReadoutPromptCapacityV1 | Empirical Criterion | Each learned arm must pass the frozen V4 absolute and incremental prompt-gain floors, 308/512 wins, own-NLL nonregression, fresh-language nonregression, load-bearing state, mechanics, replay, work, and causal audits. GEOMETRY_ATTRIBUTED separately requires the geometric arm to exceed both pooled and fixed-leaf-deranged controls by the frozen incremental effect and win/NLL rules. | Empirical terminal: neither arm passed capacity. Geometry attribution failed: geometric-minus-pooled gain -0.00388645 with 209/512 paired improvements and geometric-minus-deranged gain -0.00028887 with 251/512, below +0.02534157 and 308/512. All ten mechanics gates and independent replay passed; post-reveal optimizer steps were zero. No retry or generation is authorized. Its then-next separately frozen architecture had to alter the retained value write/binding law and retain pooled plus geometry-destroying controls; R4PredictiveBlockDeltaPromptCapacityV5 below records that successor. #973 remains open and #954 blocked. |
R4PredictiveBlockDeltaBindingV1, S_t^(b,l), r_t | Definition | #973's completed predictive write/binding law stores four bounded banks of 12 independent 4 x 4 R4 block memories. In the current frame, each bank transports prior state, applies either the full delta update S_t = rho*P*S_(t-1)*P^-1 + eta*(v_t - rho*P*S_(t-1)*P^-1*k_bar) outer k_bar or the declared additive control, and reads r_t = sum_b softmax(alpha)_b*S_t*q_t. The observed value and candidate scorer are anchored to immutable token H4 leaves. | Compiler-side f32 experiment only. The full-delta geometric, identity/plain, and additive arms each used 9,228 trainable values and identical 2,730-step construction dose. This definition grants no runtime legality, geometry advantage, attention-capacity, generation, or lowering claim. See r4_predictive_block_delta_binding_prompt_capacity_973.md. |
R4PredictiveBlockDeltaPromptCapacityV5 | Empirical Criterion | On the sealed 512-direction V5 population, terminal capacity requires geometric gain at least 0.04332169878499658, at least 308/512 wins, the frozen incremental and own-NLL rules against immutable V1 and pooled, fresh-language nonregression, load-bearing state, and complete integrity. Geometry and delta overwrite are separate attributions against independently fitted plain plus transport-permuted, and independently fitted additive, using the frozen 0.025341569256760274, paired-win, and own-NLL rules. | Empirical terminal: PREDICTIVE_BINDING_NO_TERMINAL_CAPACITY. Geometric gain 0.03896945868086732 with 375/512 wins missed the absolute floor. Geometric-minus-plain gain 0.023929811749894725 and worse own NLL failed geometry attribution even though the transport-permuted gates passed. Geometric-minus-additive was -0.006512463228773413 with 234/512, so delta superiority was not established. Fresh-language and integrity passed. Result CID blake3:6c67544d675eafcb8eb9c0dabb93617e3f6c3295af812e8acbb687107c010a74; scoring CID blake3:44f8941d24a99fc230710fd700e7a7b13cee87587bfbe4e13bf7b095222e2ee6; recovery CID blake3:7b76e36e44798bebf184ece08fdd8a2065bdd370106b5d64d5fae4c59dc6d88b; exact-replay verification CID blake3:567cf336eb05c3ec562aef7135f6fb35b580d02c758b0e79f2508cae57065f5d. Action STOP_WITHOUT_GENERATION; only this law is retired. |
O_trace^(0..3) | Objective | Construction-only, leave-one-document-out observability ladder measuring the same teacher-relative candidate loss at four frozen boundaries: full ordered final-layer Q/K/V trace blocks; fixed 576-to-4 signed reduction; token-derived role maps plus recurrent state features; and fitted residual readout/logit scale. | Completed in #1012 at INSUFFICIENT_SUPPORT_COVERAGE: aggregate primary coverage was 0.6202622204224402, but the minimum fold was 0.3469116829611222, below the frozen 50% floor, so no boundary attribution is licensed. On the covered rows, full Q/K/V CE was 2.215410922655504 versus suffix 2.215064603216862 (suffix - full = -0.0003463194386417179, direction 0/4); the fixed label control separated by 1.3807454322642605 nats in 4/4. Exact replay and zero source/document-13 reads passed. The ladder will not be expanded or repeated. #1014 subsequently completed the direct-learning pivot; see Delta_attn-off below. |
d_R4, mu_R4 | Objective | If reactivated, a separately trained intrinsic arm may score transported manifold-valued Q/K pairs and aggregate transported values with an artifact-bound equivariant geometric centroid mu_R4. | V1 stopped UNAVAILABLE before D3; learned-manifold V2 failed donor retention and matched Euclidean parity; the 8/8-contract attempt stopped at its two-document preflight and rejected tangent readout with pooled normalized audit-MSE ratio 1.0643688804269025. Intrinsic attention remains unestablished and this objective is Parked. |
A_M, K_hat, N_t, Z_t | Objective | A finite fiber-aware resonance amplitude, its nonnegative normalized kernel K_hat = floor + abs(A_M)^2, and the recurrent transported value-numerator and normalization-denominator mode sums that replace dense all-pairs weighting. | ADR-0005 and the #973 multi-resonance reuse audit retain the conditional contract. The normalized sieve, recurrent factorization, and H4/Q29/integer lowering are Parked, NOT_IMPLEMENTED, and NOT_RUN. |
I_geo | Definition | Causal inference step mapping observed prefix plus bounded hierarchy state to next-token scores/selection and updated state, followed by lexical decoding. | A support trace alone is not inference or coherent generation. |
Corr(D), Abst(D) | Empirical Criterion | Correctness and abstention on declared distribution D: correctness uses an independent oracle/constraint/source and is reported both conditional on answered cases and over all cases; abstention is a typed outcome, never silently scored correct. | Protocol and denominators are required by geometric_intelligence_evaluation.md. |
Reason(D) | Empirical Criterion | On anti-recall tasks from D, typed intermediate route transitions preserve constraints, compare alternatives or counterfactuals, and reach an independently checkable conclusion. | Fluent text, recalled answers, teacher agreement, or non-zero geometric activity is insufficient evidence. |
Serve_pf | Definition | Provider-free serving: the evaluated process performs no runtime call to Ollama, a cloud model, teacher endpoint, or other generative provider; all required artifacts and decoding are local and pinned. | Does not imply transformerless, geometry-only, multiplication-free, correct, or production-ready. |
M_R4^ℓ | Definition | Declared bounded causal geometric mixing operator at layer ℓ; its metric, chart, support rule, transport, and aggregation must be frozen by the owning issue. | ADR-0005 accepts ordinary R4/Spin softmax attention as the reference baseline. Source-backed generation/native HTTP and the first source-free suffix-distillation compiler pass at their declared scopes, but the suffix student decoded a short repetition. R4SoftmaxTraceStateStudentV1 then completed negative without selection-bearing separation from its transport-permuted control. The construction-only O_trace^(0..3) ladder completed with insufficient per-fold support and no boundary attribution. #1014 then established ordinary causal attention as load-bearing at the directly learned R4/Spin scope through Delta_attn-off = 2.6773925609275944 nats and two-arm Rust parity; its complete quality DoD failed at enabled NLL 2.127407277216677 and subject/scene retention 3/5. Intrinsic attention replacement, resonance, reasoning, WASM promotion, and recurrent/exact lowering remain parked. A coherent geometry-native deployed realization remains NOT_YET_IMPLEMENTED. |
Delta_attn-off | Empirical Criterion | On one frozen checkpoint and one identical sealed population, enabled causal attention NLL is subtracted from NLL after zeroing every attention output after W_o and before residual addition. The owning issue must preserve all other weights, inputs, decoding, and work. | #1014 measured 4.804799838144271 - 2.127407277216677 = 2.6773925609275944 nats/token against a frozen >= 0.10 rule. Both policies matched Python/Rust top-1 within 0.005; all six layers had exact causal/R4/output-policy audits and zero future reads. This establishes load-bearing ordinary causal attention for that learned R4/Spin checkpoint, not geometry advantage, coherent quality, transformerlessness, or exact deployment. See r4_softmax_end_to_end_attention_1014.md. |
d_R4^ℓ | Definition | Declared compatibility or least-energy score over factor overlap, prime-gap phase delta, R4/S3 transport, Hopf observation, and torsion. | Normative G1R objective under #958; the score and its selected-support trace are NOT_YET_IMPLEMENTED. The learned d_R4^ℓ(q,k) from #950/#951 remains a negative comparator. |
N_t^ℓ | Definition | Bounded causal neighborhood of prior route and memory states selected before value aggregation. Future positions are excluded. | Exact-row reachability exists in the source-free substrate; the intervention-qualified geometric neighborhood and deployed trace/census are NOT_YET_IMPLEMENTED. |
P_mem^ℓ | Definition | Deterministic, tokenizer-CID-bound projection from an identity-scoped memory span into ordered prime-route and spin/torsion state. | G0/G1 key/value adapter is historical; the factorable memory projection and product integration are NOT_YET_IMPLEMENTED under #958/#953. |
Δ_geo-null | Empirical Criterion | Difference on the predeclared held-out metric between real geometry/memory and its equal-budget disabled or permuted control. A nonzero support trace alone is reachability, not advantage. | Bounded one-layer report under #951. |
S | Definition | Semantic state space; every observation projects into a state s ∈ S. Regions are subsets R_i ⊆ S; beliefs are predicates over S; goals are desired subsets of S. | Compiler/reference-only abstraction (issue #124). The deployed runtime carries a fixed-capacity approximation: the runtime state (frontier, rolling context code, token shortlist) in crates/uor-r4-core. |
G = (V, E) | Definition | Compiled semantic graph: V packed semantic states, E typed transitions. | crates/uor-r4-graph-format GraphView over the R4G1 NODE/EDGE sections (docs/transformerless/R4G1.md). |
H(x) | Definition | Holographic encoding of observation x: a family of overlapping projections {h_0, …, h_k} with partial recoverability, distributed evidence, progressive fidelity. The deployed path today is still the single compiled Boolean semantic code; the certifier additionally defines and measures overlapping projection families for issue #126. | Runtime binding: sign-bit signature path in crates/uor-r4-core (see "Semantic code H(x)" in the glossary). Measurement contract binding: crates/uor-r4-graph-certify/src/holographic_encoding.rs and its deterministic fixture tests. |
T : S × A → S | Definition | Typed graph dynamics: transition function over states and actions/semantic operators A. | Compiler/reference-only (issue #124). Deployed precursor: forward transition edges E_f / R4G1 ROUT section. |
R | Definition | Reconstruction / behavioral-recovery operator; R(H(x)) ≈ x read behaviorally as the divergence condition below. | Compiler/certifier-only; exercised through the fidelity-certification harness (score.rs, Gate C). |
C : Θ → G | Definition | The compiler as a map from teacher parameter space Θ to the space of compiled artifacts. Compilation is lossy semantic compression: parameters → behavioral probing → latent graph induction → Boolean synthesis → packed immutable artifact. | crates/uor-r4-core compiler pipeline; graph generalization in crates/uor-r4-graph-compiler. |
P_θ(·‖c) | Definition | Teacher distribution over next tokens for context c, pinned HF revision, deterministic mode. | TeacherOracle next-token surface (crates/uor-r4-core). |
P_G(·‖H(x)) | Definition | Runtime/graph distribution produced by the compiled artifact. | Graph scorer (crates/uor-r4-core score.rs; R4G1 adapter src/r4g1.rs). |
D(·, ·), ε | Definition | Declared divergence measure and empirical tolerance for the behavioral reconstruction condition (below). | docs/transformerless/EQUIVALENCE_AND_EMPIRICAL_PROTOCOL.md. |
Behavioral reconstruction condition (the testable form of R(H(x)) ≈ x):
Empirical Criterion.
D(P_θ(· | x), P_G(· | H(x))) ≤ εfor a declared divergenceDand toleranceε, measured on a pinned held-out distribution with confidence intervals. Status: Empirical; never a structural claim.
4. Objectives versus runtime invariants
These are Objectives — quantities the offline compiler optimizes. They must never be stated as runtime properties:
| Quantity | Role | Binding |
|---|---|---|
J = L_teacher + λ·C_runtime + μ·C_artifact | Objective | Compiler cost model: teacher behavioral loss, inference cost, artifact size/complexity (issue #129). |
min_Z I(Z;X) − β·I(Z;Y_future) | Objective | Information-bottleneck compression target: discard surface detail, keep future-relevant information (issue #127). |
H(A | R), H(S_future | R) | Objective | Predictive-entropy criteria for splitting, merging, or removing regions (issue #127). |
π* = arg max_π [ V(G | T(B,π)) − P(C,π) − R(U,π) ] | Objective | Plan-ranking target for bounded future-state optimization (issue #131). Not a theorem. |
These are Guarantees — structural properties of artifact and runtime, each with a proof-model entry. Their current statuses are the proof-matrix records; a document citing one MUST cite the same status:
| Guarantee | Status | Evidence |
|---|---|---|
| Allocation freedom on the prediction hot path | Structural | allocation_proof counting-allocator harness; allocation_census.rs (proof matrix: PDF §16) |
| Bounded packed ranges | Structural | range_bounds_proof (Theorem 8) |
| Deterministic top-K (canonical tie-break) | Structural | deterministic_topk_proof (PDF §23) |
| Forward/reverse index consistency | Structural | theorem7_proof (Theorem 7) |
| Score arithmetic safety (no overflow/panic) | Structural | Kani-1 harness (kani_proofs.rs) |
| Fixed-capacity container invariants | Structural | Kani-2 harness (kani_proofs.rs) |
| Inference operation-set conformance | Witnessed (Structural after machine-code audit) | INFERENCE_OPERATION_CONTRACT.md + P-4 source scans (transformerless/mod.rs) |
| Termination, bounded frontier width, valid references, canonical serialization, provenance completeness | per proof matrix | R4G1 two-stage validation + proof-model entries; anything lacking an executed evidence artifact is Unproven |
5. Term discipline (overloaded words)
| Avoid (unqualified) | Use instead | Rule |
|---|---|---|
| "intent" | Future-state optimization: belief = estimated current state, goal = desired future-state subset G ⊆ S, constraint = forbidden subset F ⊆ S, action = transition operator, plan = bounded trajectory π = (a_0, …, a_n) with T^π(s_0) ∈ G and T^π_i(s_0) ∉ F for all intermediate i (Definition, PDF §12). | Unqualified "intent" is informal prose; it must not appear in a labeled statement. |
| "semantic atom" | Semantic region — multiresolution, overlapping, proof-addressable; explicitly not an atom (glossary). | "Semantic atom" is prohibited in normative text. |
| "equivalence" | Qualified forms only: byte reproducibility (identical pinned inputs ⇒ identical artifact bytes) or behavioral equivalence (an Empirical Criterion, valid only on the declared distribution, per the equivalence protocol). | Unqualified "equivalence" is informal; "exact equivalence" hits the §2.1 wording rule. |
| "reasoning" | Precise mechanisms: typed state transitions, graph navigation, bounded planning (trajectory evaluation over T). | Bare "reasoning" is informal; plausible language output is never evidence of it (§2.1). |
| "transformerless" | Zero source-attention calls and no dense full-prefix Q·K matrix/softmax kernel on the exact promoted decoder path; the replacement uses bounded geometric support shown load-bearing by disabled/permuted interventions. | Does not imply multiplication-free, integer-only, allocation-free, coherent, or production-ready. Name retained source components and the checkpoint/scope. |
| "geometric intelligence" | Name the measured mechanism: geometric support change, memory-causal logit effect, student-prefix rollout, or another declared empirical result. | Geometry being present or visually structured is not evidence of intelligence. |
Existing documents predate this convention. Their already-qualified uses ("behavioral equivalence", "not semantic atoms", "equivalence-tested") conform; unqualified uses are hereby marked informal and are migrated opportunistically, not by wholesale rewrite.
6. Enforcement
- The
uor-r4-claim-wordingcrate (Rust port of the retiredscripts/check_claim_wording.py) scansdocs/**/*.mdand crateREADME.mdfiles and fails on §2.1 violations. Run locally:cargo run -q --locked -p uor-r4-claim-wording -- .. - Current PR and merge-group CI run the focused native checks described by the execution policy. Four historical required statuses acknowledge compatibility only. Run the claim-wording script when changing claims; broader legacy release checks remain separately activated. Neither status names nor unrun jobs are evidence.
- The proof-status matrix (
proof_matrix.rs) is the machine-readable registry for §2 statuses;verify_allfails on anyUnverifiedentry.
Changelog
- 0.1.35 (2026-09-01) — Recorded the independently verified
R4PredictiveBlockDeltaPromptCapacityV5terminalPREDICTIVE_BINDING_NO_TERMINAL_CAPACITY. Geometric gain0.03896945868086732with375/512wins missed the frozen absolute0.04332169878499658capacity floor. Geometry versus independently fitted plain missed the gain and own-NLL rules even though transport-permuted gates passed; full delta also failed attribution versus independently fitted additive at-0.006512463228773413and234/512. Fresh-language and integrity gates passed. A scoring-only recovery preserved the frozen arms, created no optimizer, and was independently replayed exactly. The binding action isSTOP_WITHOUT_GENERATION; retire only this predictive block-delta law, without revising ordinary-softmax or retained-attention evidence. Result/scoring/recovery/verification CIDs are respectivelyblake3:6c67544d675eafcb8eb9c0dabb93617e3f6c3295af812e8acbb687107c010a74,blake3:44f8941d24a99fc230710fd700e7a7b13cee87587bfbe4e13bf7b095222e2ee6,blake3:7b76e36e44798bebf184ece08fdd8a2065bdd370106b5d64d5fae4c59dc6d88b, andblake3:567cf336eb05c3ec562aef7135f6fb35b580d02c758b0e79f2508cae57065f5d. - 0.1.34 (2026-09-01) — Recorded the independently verified
R4LearnedAssociativeReadoutPromptCapacityV1terminalLEARNED_ASSOCIATIVE_READOUT_NO_CAPACITY. Geometric gain0.00637679and pooled gain0.01026323both missed the frozen absolute0.04332170and incremental0.02534157capacity effects; geometry also lost the pooled and fixed-leaf-deranged attribution comparisons. Both learned arms passed every fresh-language and state-load-bearing gate, so the pooled improvement is retained as a non-geometric control signal. All mechanics and independent replay passed. No retry or generation is authorized; the next separately frozen #973 architecture must change the retained value write/binding law. Result CIDblake3:cedba37738ee249457bb589f716ee75afb16a0c4937c2a22ae9f917dd3eb97c1; verification CIDblake3:443d711ce9a228e26e2eb2eebb55c582848424e2677c3473d41deaf8afd69ec7. - 0.1.33 (2026-09-01) — Froze
R4LearnedCandidateLeafAssociativeReadoutV1and its independentR4LearnedAssociativeReadoutPromptCapacityV1campaign before implementation, V4 population creation, fitting, or outcome access. Bound the exact-leaf, address-blind pooled, fixed-leaf-deranged, head-off, and state-off arms plus the fresh-data, create-once reveal, capacity, geometry-attribution, compute, and divergent-action contracts. All empirical outcomes remainNOT_RUN; #973 remains open and #954 blocked. - 0.1.32 (2026-09-01) — Recorded
R4LayerwiseNormalizedRetainedReadoutLanguagePathV1as terminalLAYERWISE_NORMALIZED_RETAINED_READOUT_PROMPT_CAPACITY_PARTIAL. All fresh-language, state-off, causal, replay, and independent-verification gates passed, while prompt gain0.0286980210and incremental gain0.0213663973missed their frozen floors. Ended the parameter-free readout ladder and made a freshly frozen learned associative binding/readout the sole #973 successor. Candidate generation, reasoning, and exact/geometry-native lowering remainNOT_RUN; #954 remains blocked. - 0.1.31 (2026-09-01) — Recorded
R4DirectRetainedReadoutLanguagePathV1as terminalDIRECT_RETAINED_READOUT_PROMPT_CAPACITY_PARTIAL. The zero-parameter readout increased prompt gain and fresh-language quality while passing state-off, causal, replay, and independent-verification checks, but missed both frozen prompt-gain floors. Generation and lowering remainNOT_RUN. Froze exactly one layerwise-normalized, zero-parameter successor and a stop/pivot falsifier; no coherence, reasoning, H4-superiority, exact-runtime, browser, or release claim follows. - 0.1.30 (2026-09-01) — Recorded qualified
R4RetainedLanguagePathV1and its terminal paired-H4 capacity successor. Paired addressing reduced construction repeats97.5477%and slightly improved fresh-language NLL/top-1, but prompt gain fell from0.0063672952to0.0062477543, with282/512wins. Terminal:PAIRED_H4_PROMPT_CAPACITY_FAIL; result CIDblake3:508a4ff352f1e533d669d9616f65b972b0f13e8efe35867b7b095281ad940274. Preserved V1, rejected candidate generation, and directed #973 to an independently frozen prompt-state-to-logit readout seam. The canonical prompt population CID isblake3:c11a7c935139ca169460b90c01392d7c9e0929e4c10710e76e6c8f74cbdf0340; it replaced a provisional pre-freeze scan that omitted whitespace normalization and overlapped training data. - 0.1.29 (2026-09-01) — Recorded #973's completed CPU-recovery boundary.
Disabling retained state on the disjoint construction-validation partition
lost
0.967227nats and 182 top-1 hits, qualifying a bounded causal retained-attention component. The exact 3.17M-parameter, two-block, data/dose recipe did not satisfy the frozen full-decoder generalization criterion; scrambled transport was0.033049nats better, so no H4-specific advantage follows. Directed #973 to a data-supported language-path decoder with an ordinary matched non-geometric control. Also made representative-step backend/thread/worker calibration the operating rule for substantial offline jobs; deployed runtime remains CPU/table-native and CUDA remains explicit-scope only. - 0.1.28 (2026-09-01) — Recorded the terminal #973 construction result
UNAVAILABLE_FRAME_POPULATION_OR_LOCAL_BUDGET. Mechanical audits passed; timing and disposable learning smoke failed, so main and held-out model work stayedNOT_RUNwith no attention or H4 verdict. Retired retries/tuning of the exact cell and directed #973 to select a fuller source-free decoder block. - 0.1.27 (2026-09-01) — Defined the independently re-scoped #973
R4GroupAddressedRetentionLMV1and recorded only its observed construction boundary: geometry and populationPASS; training and held-out model evidenceNOT_RUN. Retained the older gated-delta, trace-state, intrinsic/readout, and resonance lanes as negative or parked history, with #954 still blocked and no C1-SB6 authorization. - 0.1.26 (2026-08-31) — Recorded the one bounded #1019 local fast-path
result: an isolated exact-shape MPS test with 10 warmup plus 40 measured steps
combined fused AdamW and deferred logging, measuring
4.485223 s/stepversus the signed3.491307 s/step. Because it was slower,fused=Truewas removed immediately. This is a bounded implementation negative, not a model or attention result. #1019 tuning/full-run work stops and remains optional/ paused; product work and #973 no longer wait for it. The active next step is using and productizing the bounded #1017 generator throughr4 generate. - 0.1.25 (2026-08-31) — Corrected #1019's active execution scope without
rewriting its frozen contract or measured preflight: UOR's deployed
architecture/runtime remains CPU-native; Apple Accelerate/BLAS and MPS are
permitted only for local offline training, compilation, and bounded tests;
CUDA and external GPU execution are out of scope. The observed
UNAVAILABLE_HARDWARE_BUDGETterminal applies only to the frozen eight-hour offline implementation. Reuse the passed population/smoke/parity artifacts and proceed prototype-first on the local M1: build, demonstrate, then harden one working efficiency mechanism without recurring broad research gates. #1019 is an optional quality-capacity improvement and no longer blocks use or productization of the bounded #1017 generator throughr4 generate. - 0.1.24 (2026-08-31) — Bound #1019 as the sole parameter-capacity
successor: twelve layers, exactly 13,130,784 parameters, seed 1019, 16,800
steps, and 275,251,200 tokens over the unchanged causal-softmax R4/Spin and
Rust evidence path. Recorded every execution gate as
NOT_RUN, required the cheap preflights and an eight-hour hardware projection, and prohibited paid external execution without explicit owner approval. This is a frozen Objective/Empirical Criterion, not a result claim. - 0.1.23 (2026-08-31) — Recorded #1017's frozen continuation at
149,995,520cumulative tokens: enabled Rust parity, all mechanical gates, prompt retention5/5, and normalized replay5/5passed; sealed NLL1.5727521962806827failed the strict<1.50gate. The result is negative solely on NLL. Preserved #1014's bounded attention conclusion, prohibited further 7.15M exposure/LR tuning, and advanced only one predeclared parameter-capacity increase. - 0.1.22 (2026-08-30) — Added
Delta_attn-offand recorded the completed #1014 split verdict: ordinary causal attention established at the learned R4/Spin intervention/parity scope; full language-quality DoD negative at enabled NLL2.127407277216677and prompt retention3/5. The exact campaign closes without rerun or diagnostic expansion. Its #1017 exposure continuation then closed negative solely on sealed NLL1.5727521962806827, with retention5/5and all other gates passing. One predeclared parameter-capacity increase over the unchanged mechanism is next. - 0.1.21 (2026-08-30) — Recorded #1012
INSUFFICIENT_SUPPORT_COVERAGE, forbade boundary attribution and further support/localization loops, and advanced #1014, direct end-to-end causal-softmax R4 attention training on a fresh untouched split with autonomous decoding. This stops the bounded current-step trace-distillation path, not all trace distillation or attention. - 0.1.20 (2026-08-30) — Bound the completed negative
R4SoftmaxTraceStateStudentV1result, exact metrics and artifact identities; narrowed its falsifier to the tested 4D signed-reduction/token-derived state cell; and defined the construction-only leave-one-document-outO_trace^(0..3)observability ladder in #1012, the native child/blocker of #973, as the next gate. - 0.1.19 (2026-08-30) — Promoted
R4SoftmaxTeacherTraceV1andR4SoftmaxTraceCompilerV1from proposed objectives to a bounded empirical source-free-distillation result, retained the incoherent decoded-cycle boundary, and definedR4SoftmaxTraceStateStudentV1as the next geometric state-compilation objective. - 0.1.18 (2026-08-30) — Recorded the exact opt-in loopback HTTP/CLI
reference parity boundary and defined the proposed, not-yet-implemented
R4SoftmaxTeacherTraceV1/R4SoftmaxTraceCompilerV1source-free trace-compilation objective. - 0.1.15 (2026-08-26) — Defined the geometric-intelligence route hierarchy
and its claim boundaries: typed zero/identity and trigonometric chart bridges,
lexical/prime/semiprime/n-let identities, zeta/Hopf/torsion/golden state,
conceptual
E8 = H4 × H4realized by the witnessed icosianH4 ⊕ φH4construction, hierarchical kappa and trajectory summaries, attention versus recall, inference, correctness, reasoning, and provider-free serving. - 0.1.14 (2026-08-20) — Added the issue-#830 register execution-scope, serving-reachability, and empirical-verdict vocabulary: a per-row execution
scope(reference-only/offline-compiler/certifier-instrument/dormant-portable-runtime/normative-runtime/deployed-production) and a servingreachability(deployed-serving/off-serving-path/dormant-gated), plus a three-value empirical status (PASS/FAIL/UNAVAILABLE) kept as a separate axis from the harness-builtbuildlevel — an absent fixture isUNAVAILABLE, neverPASS(crates/repo-model/src/registry.rs,crates/repo-model/src/empirical.rs; rendered intoCONFORMANCE.md). - 0.1.13 (2026-07-25) — Added issue-#175 compiler parallelism benchmarks and scaling certificate definitions (
Compiler Parallelism Scaling Report,Multicore Thread Sweep Matrix,Stage Scaling Classification Taxonomy,Byte-Equality Scaling Premiseindocs/compiler_scaling_certificate.mdanduor-r4-graph-certify::compiler_scaling). - 0.1.12 (2026-07-25) — Added issue-#174 CPU-only compiler dependency and feature audit definitions (
Compiler Dependency Denylist Gate,Default Feature Unification Rule,Teacher-Backend Isolation Invariant,CPU-Only Runner Complianceindocs/compiler_dependency_audit.mdanduor-r4-graph-compiler::dependency_audit). - 0.1.11 (2026-07-24) — Added issue-#170 parallel observation, trace, and evaluation processing definitions (
Content-Addressed Shard Partitioning,Ordered Deterministic Reduction,Shard ID Determinism,Teacher-Backend Boundaryindocs/parallel_observation_shards.mdanduor-r4-graph-compiler::observation_shards). - 0.1.10 (2026-07-24) — Added issue-#169 compiler memory-budget and backpressure model definitions (
Concurrency-Aware Memory Formula,Per-Stage Memory Estimate,In-Flight Backpressure Limiter,Constrained-Memory Determinismindocs/compiler_memory_budget.mdanduor-r4-graph-compiler::memory_budget). - 0.1.9 (2026-07-24) — Added issue-#168 compiler thread-pool and jobs configuration definitions (
Compiler Concurrency Control,Jobs Precedence Resolution,Dedicated Thread-Pool Ownership,Oversubscription Policyindocs/compiler_concurrency_config.mdanduor-r4-graph-compiler::jobs_config). - 0.1.8 (2026-07-24) — Added issue-#167 normative reproducibility & canonical byte-equality definitions (
Normative Reproducibility Invariant,Parallel Reproducibility Harness,Thread-Count Invariance,Deterministic Reduction Policyindocs/reproducibility.mdanduor-r4-graph-compiler::reproducibility). - 0.1.7 (2026-07-24) — Added issue-#166 compiler stage ownership and parallelization DAG definitions (
Compiler Stage DAG,Parallel-Safe Stage,Deterministic Merge Stage,Bounded Parallel Stage,Sequential Canonical Finalization Spineindocs/compiler_stage_dag.mdanduor-r4-graph-compiler::stage_dag). - 0.1.6 (2026-07-24) — Added issue-#165 deterministic compiler executor definitions (
Compiler Executor Abstraction,Sequential Reference Executor,Rayon Parallel Executorinuor-r4-graph-compiler::executor). - 0.1.5 (2026-07-24) — Added issue-#161 runtime operation, allocation, and CPU portability certificate definitions (
Runtime Performance Certificate,Evidentiary Class Schema,Declared-Zero Evidence Link,CPU Portability Recordinuor-r4-graph-certify::performance_certificate). - 0.1.4 (2026-07-24) — Added issue-#160 machine-code, allocator, and dependency CI audit definitions (
Machine-Code Disassembly Audit,Counting Allocator Witness,Dependency Denylist Gateinuor-r4-proof-model::inference_audit). - 0.1.3 (2026-07-24) — Added the issue-#158 normative scoring semantics definitions (
Fixed-Point Scoring Semantics,Residual Taxonomy,Overlap Residualization,Deterministic Tie-Breakingindocs/scoring_semantics.mdanduor-r4-graph-format::scoring_semantics). - 0.1.2 (2026-07-24) — Added the issue-#157 normative inference contract definitions (
Normative Inference Contract,Permitted Operation Class,Zero-Allocation Steady State,CPU-Only Target Contractindocs/inference_contract.mdanduor-r4-graph-format::inference_contract). - 0.1.1 (2026-07-24) — Added the issue-#126 measurement-contract binding for
H(x)(projection family schema, ablation semantics, and deterministic partial recovery/progressive-fidelity fixture inuor-r4-graph-certify). - 0.1.0 (2026-07-24) — Initial version. Claim classes, claim statuses, core
notation (
S,G=(V,E),H(x),T,R,C,P_θ,P_G), objectives vs. runtime invariants, term discipline, and the CI wording rule. (Issue #123.)
Configuration reference
September 7 direction reconciliation: the product name is UOR-R4 Geometric Language Model. Read the canonical plan, current artifact/results, capability assessment and project map first. This document retains technical and dated experiment/reference material; earlier “active/next” sequences do not supersede those pointers. Native bounded inference and contextual/copy attention exist; general prose, general reasoning and frontier capability remain unqualified. Offline Rust training matmul is allowed; final serving has no matrix products or transformer backbone. No new model result was run for this documentation update.
For the current Rust model, use the CLI options and examples in the
native geometric workflow. The explicit
r4 geometric command family configures preparation, training, evaluation,
generation and the local service; model context and operator settings travel
with the artifact. The canonical plan owns
architecture and budget policy, while
current-state.md owns implementation status.
Native options do not wait for a historical stage or later Rust port.
Retained compiler and reference configuration
The inventory below covers existing compiler/runtime and measurement lanes
across earlier architectural eras. TLESS_*, R4G1_*, teacher and release
variables apply to their named paths. Defaults for plain ask/chat, source
tokenizers and older HTTP engines do not select the r4 geometric model.
These references preserve compatibility and reproducibility; they do not
reintroduce a Python model dependency or change the current project goal.
The listed environment variables give their defaults and owning modules. Where a listed CLI flag and variable both exist, the flag wins.
Legacy override contract. The capacity and sampling helpers
(capacity_override_usize / capacity_override_f64) share one rule: unset is
κ-neutral — behaviour is bit-identical to not setting it. Set-but-invalid, or
zero, panics. A knob that silently did nothing would be indistinguishable from
a knob that does not work, and both failures are invisible. Underscore separators
are accepted (R4_GATE_C_SAMPLE=10_000).
Paths and inputs
| Variable | Meaning | Default |
|---|---|---|
TLESS_CHECKPOINT | llama2.c reference teacher checkpoint | /tmp/ref/out/model.bin |
TLESS_ARTIFACTS | TLA artifact container | /tmp/tless_artifacts.bin |
TLESS_STORE | Graded store | /tmp/tless_store.bin |
TLESS_TOKENIZER | llama2.c tokenizer | /tmp/ref/tokenizer.bin |
TLESS_MODEL | Model name or CID for ask / chat | newest models/*.json, else smollm2-135m-instruct |
TLESS_CORPUS_META / TLESS_CORPUS_RECS | Dashboard R4G1-compiler corpus | none |
R4G1_ARTIFACT | Scored R4G1 for research loading. Production admission additionally requires the schema-2 release envelope and its content-bound full-census deployed-quality report | graph/score.r4g1 beside the artifacts |
R4_CORPUS_META / R4_CORPUS_RECS | Override the corpus pair everywhere — compiler and every measurement harness | /tmp/c_meta.bin / /tmp/c_recs.bin; harnesses default to the committed fixtures |
R4_ARTIFACTS | Override the TLA container in harnesses | the committed fixture |
R4_STORIES | stories.jsonl giving the construction/held-out split | derived 80/20 split |
R4_SCORED_R4G1 | Scored R4G1 for router_reconnect | required, no default |
R4_CODES_PATH | κ-keyed per-record code sidecar | code_sidecar::CODES_PATH |
UOR_MODEL_STORE | CID object store root | .uor-models |
UOR_R4_HOST / UOR_R4_PORT | Server bind address | 127.0.0.1 / 8000 |
UOR_R4_MANIFOLD_CACHE | Router manifold cache | manifold_cache_rust.json |
Tokenizer adapter selection
Registered source tokenizers are selected by CLI/API fields, not environment
variables. CLI commands that accept --source also accept the atomic pair
--tokenizer-family FAMILY --tokenizer-version N. Both flags must be present
or absent. When absent, discovery succeeds only when the source directory has
one unambiguous supported definition; a directory containing both
tokenizer.json and spiece.model requires the explicit pair. Unknown pairs
and any attempt to combine a registered adapter with legacy --checkpoint
input fail closed.
For raw SentencePiece sources, use family sentencepiece-unigram. Version 2
is the current, reference-correct adapter; automatic discovery of one
unambiguous spiece.model selects it. Version 1 remains registered only as the
immutable published behavior whose unknown id decodes to the literal model
surface <unk>. N is part of the semantic identity, not a compatibility
range: consumers do not substitute a newer or older version. Both versions
read the pinned 32,000-piece spiece.model; neither applies the T5 Hugging
Face wrapper's 100 sentinel tokens or EOS-appending post-processor.
The host adapter performs text normalization and encoding. The deployed
tagged tokenizer.bin is decode-only and carries the complete adapter binding
(family, version, source-model CID, and policy digest). Serving requires a
matching host encoder for prompt text. Missing/mismatched identity, unavailable
encode, invalid token ids, and decode failures are errors; an explicitly tagged
tokenizer does not fall back to a legacy tokenizer. SentencePiece observation
records have no original-source byte anchors because normalization and unknown
collapse do not preserve a total input-offset map.
Determinism and teacher math
These are κ-relevant: changing them can change artifact bytes.
| Variable | Meaning | Default |
|---|---|---|
TLESS_CANONICAL_DETERMINISTIC | Any value ≠ 0 selects portable libm math and scalar reductions. Required for the cross-platform Gate E claim. | off |
TLESS_EXACT_SCALAR | Deprecated compatibility input. Llama/shared projections already use pinned exact uor-matmul, so this variable no longer changes their arithmetic; it does not select a GPT-2 Conv1D/lm-head route. | unset |
TLESS_TEACHER_VFORCE_EXP | macOS only; 0 disables Accelerate vvexpf | on (macOS); off under canonical mode |
R4_TLESS_TLA6 | 0 opts a compile out of TLA6 emission | on |
R4_TLESS_TLA7 | 0 opts a compile out of TLA7 (residual) emission → TLA6 | on |
TLESS_REPIN_WRITE | =1 regenerates the κ fixture container. Maintainer decision only — see the κ re-pin procedure in AGENTS.md | off |
Thread counts
| Variable | Meaning | Default |
|---|---|---|
R4_COMPILER_THREADS | Graph-compiler rayon pool (CLI --jobs overrides) | rayon default |
R4_CAP_THREADS | capacity_scaling harness | 2 |
R4_SCALING_THREADS | cover_scaling harness | 2 |
R4_TS_THREADS | two_sided_context harness | env-derived |
R4_PARITY_WORKERS | Size W of the one persistent exact output-row worker pool. Diagnostic range is 1..=available_parallelism(); 0, malformed values, and requests above the host budget fail instead of being clamped. Fixture-present execution adopts the faster exact W=available/W=min(4, available) tuner result, so this input cannot force a different binding selection. The candidate widths are a bounded tuning choice, not a utilization target. | all available logical CPUs before probe selection |
R4_PARITY_STREAMS | Independent private-state trajectory and physical-batch width S. S is scientific work, not a worker bound: it may exceed or be less than W. The binding fixture-present workload requires the eight canonical prompt lanes. | 8 |
R4_PARITY_BATCH_PER_WORKER | Bounded exact output-row task fan-out per worker. This changes scheduling granularity only; it cannot select Accelerate or change exact arithmetic. Requested and effective fan-out are recorded. | 4 |
Cover induction and compiler capacity
All follow the override contract above.
| Variable | Default |
|---|---|
R4_COVER_DEPTHS | 3 |
R4_COVER_K0 | 8 |
R4_COVER_REGIONS_BUDGET | 256 |
R4_COVER_MEMORY_BUDGET_MB | 512 |
R4_COVER_MIN_SUPPORT | 64 |
R4_COVER_ENTROPY_GAIN_BITS | 0.25 |
R4_COVER_SPLIT_CRITERION | absolute (absolute|relative|mdl; unknown panics) |
R4_COVER_RELATIVE_THETA | — |
R4_COVER_MDL_PENALTY_BITS | — |
R4_COVER_SCALE_K0 | 0 (flag: 0/false/1/true, else panics) |
R4_COVER_SCALE_REGIONS_BUDGET | 0 |
R4_COVER_CAPACITY_ALPHA | — |
R4_COVER_CAPACITY_REF_N | — |
R4_CTX_SAMPLE | CTX_SAMPLE |
R4_RVQ_SAMPLE_CAP | 10,000 |
Trap.
R4_COVER_CAPACITY_REF_Ndefaults near the 500k fixture's train count, so thescaled-k0arm passes degenerately on any ~500k corpus. Use the@ref50karms when that matters.
Gate C scoring
| Variable | Meaning | Default |
|---|---|---|
R4_GATE_C_SAMPLE | Deterministic stride subsample of the held-out split. The sample size and binomial standard error travel with every rate, so a sampled number cannot be read as a census. Unset is the full pass, bit-identical to the pre-sampling evaluation. <1 or non-integer panics | unset (census) |
R4_GATE_C_SKIP_ARMS | Comma-separated arm-group names not to build. Only known group: right_context — the #446 two-sided and latent families, i.e. the closure of the whole-corpus right-context code pass (~60% of a sampled run's wall clock). Unknown names panic. Skipped arms report as absent (null), never as zeroed rows | unset (skip nothing) |
R4_TRANSITION_OUT_DEGREE | Per-source out-degree cap for forward edges | 8 |
R4_EMISSION_ENTRIES | Per-region emission list bound | 64 |
R4_ROOT_TOP_B / R4_EXCT_TOP_X | Candidate list bounds | 64 / 64 |
R4_CONTEXT_ENTRIES | Packed NGRAM context row entries | 64 |
R4_FWDA_ENTRY_CAP | Forward-anchor row cap | 64 |
R4_LATENT_CLASS_DEPTH | Bytes of the right code forming the latent class (clamped to 1..=STAGES) | 1 |
Certification
| Variable | Meaning | Default |
|---|---|---|
R4_CERTIFY_C_ONLY | ≠0 runs only the historical C research diagnostic, no teacher load. It is not production-admission evidence; use r4 deployed-quality | off |
R4_CERTIFY_ROWS_ONLY | ≠0 skips the C serving row. Explicitly not a full certificate | off |
R4_CERTIFY_PHASE_C_ONLY | ≠0 certifies phase C only | off |
R4_CERTIFY_R4G1_BUDGET_SECS | Readiness-probe wall clock | 120 |
R4_CERTIFY_R4G1_EVAL_BUDGET_SECS | Subsampled-eval wall clock | 600 |
R4_CERTIFY_SERVING_BUNDLE | Bundle for the certify C row | scans under . |
Normative deployed-quality evaluation (#933)
These knobs drive the teacher-free R4G1Runtime evaluator. Worker partitions
are deterministic and reductions are replayed in canonical position order, so
changing the worker count changes wall time but not report bytes. Once an
evaluation phase launches it writes monotonic progress plus its phase terminal;
a missing control, timeout, or absent identity is UNAVAILABLE/skipped and
cannot authorize production.
| Variable | Meaning | Default |
|---|---|---|
R4_DEPLOYED_QUALITY_MODE | full selects the complete held-out census; every other value selects the deterministic sample | sample |
R4_DEPLOYED_QUALITY_POSITIONS | Sample size when mode is not full | 6,000 |
R4_DEPLOYED_QUALITY_WORKERS | Evaluation workers. Results are canonically ordered after parallel execution | available logical CPUs |
R4_CERTIFY_R4G1_BUDGET_SECS | Cheap readiness-probe wall-clock budget | 120 |
R4_CERTIFY_R4G1_EVAL_BUDGET_SECS | Sample/census wall-clock budget | 3,600 |
The historical certify-C diagnostic above and this normative command share
the two budget variable names but retain distinct defaults: 600 seconds for
the non-binding diagnostic, 3,600 seconds for r4 deployed-quality. Explicit
CLI flags override their environment variables.
Every invocation against a valid, non-symlink bundle root first creates
evidence/deployed_quality_invocation_terminal.jsonl. The create-once JSONL
journal is synced after its started row and again after exactly one
completed, failed, or best-effort interrupted terminal row, so argument,
bundle-discovery, cross-surface, witness, sample-gate, projection, and evaluator
failures are all durable. A synced started row without a terminal row means
the process was externally interrupted or otherwise unresolved; signals,
power loss, and SIGKILL cannot be guaranteed to run cleanup code. An absent,
symlinked, or non-directory bundle cannot safely host in-bundle evidence and
therefore fails before journal creation. Reusing the same staged bundle is
refused rather than overwriting its first invocation.
The invocation journal is local, non-semantic evidence. It is excluded from
the generation CID, production admission, and release archives, as are the
resource sidecar and terminal transcript described below. Phase progress and
phase terminal files under graph/ remain authoritative only after that phase
actually launches.
Production admission accepts only a schema-2 release-bundle.json whose
component digests and compiler/selector identities reproduce from the loaded
graph, teacher artifact, corpus pair, tokenizer, tokenizer adapter, score
report, cover report, and deployed-quality report. A sampled report remains
research evidence even when all measured rows are favorable.
The release CLI exposes the same contract directly. --mode full cannot
bypass the cheap instrument: it first runs the exact 6,000-position prefix of
the canonical label-free, story-distributed order on the same bundle/evidence
generation. Any structural, reachability,
non-futility, planted-control, cross-surface, or witness falsifier emits
STOP: and returns without starting the census. PROCEED: launches the
census. A typed INCONCLUSIVE: extends the same immutable nested order to
18,000 positions; if that interval still overlaps the gate, it can launch only
the census and only when the measured reachable ceiling remains sufficient.
Before any census launch, the authorizing stage's measured throughput is
scaled to the full population; a projection beyond the configured evaluation
budget or one hour refuses launch and requires a revised run contract. No
sample report can authorize production admission.
cargo run --release -- deployed-quality \
--bundle .uor-models/compiled/<model>-staging \
--compiler-revision <full-40-character-revision> \
--mode sample --positions 6000 --workers 8
For a canonical run, wrap the command so host identity, effective workers,
wall time, peak child RSS, free storage, bundle growth, exit status, and every
graph evidence-file size are durable even when the evaluator fails. A
create-once JSONL beside the summary samples the complete child process tree's
CPU share, RSS, process count, host-memory headroom, and filesystem headroom
every five seconds. The wrapped evaluator still streams its phase counters,
throughput, and ETA. On
the canonical macOS host, /usr/bin/script -e -F preserves that stream in a
separate terminal transcript and propagates the child exit status; require a
new transcript path before launch just as the wrapper requires a new sidecar.
The resource summary, live-sample JSONL, and transcript are explicitly
non-semantic and are never admission inputs. The inventory snapshot is captured
when the child exits. If the live-sample JSONL is placed inside the bundle it is
therefore present in that snapshot; the subsequently written resource summary
and the outer transcript's final trailer are not. Both resource paths are
append-only: the wrapper refuses to overwrite either one, and it verifies that
its --bundle exactly matches the wrapped command's --bundle (evaluation) or
--bundle-root (graph emission) before launch. It also records --workers or
--jobs as the effective requested worker count. Use --samples-output to
select the JSONL path; otherwise it is <output>.samples.jsonl.
test ! -e .uor-models/compiled/<model>-staging/graph/deployed_quality_full.log
/usr/bin/script -q -e -F .uor-models/compiled/<model>-staging/graph/deployed_quality_full.log \
python3 scripts/run_deployed_quality.py \
--bundle .uor-models/compiled/<model>-staging \
--output .uor-models/compiled/<model>-staging/graph/deployed_quality_full_resources.json \
-- target/release/r4 deployed-quality \
--bundle .uor-models/compiled/<model>-staging \
--compiler-revision <full-40-character-revision> \
--mode full --positions 6000 --workers 8
Measurement harnesses
| Variable | Default | Harness |
|---|---|---|
R4_CAPACITY_SAMPLE | 100,000 (0 = census) | capacity_scaling |
R4_CAPACITY_TRAIN_SAMPLE | 0 (census; nonzero is the biased fast look and disables the sidecar in both directions) | capacity_scaling |
R4_CAP_COVER_MAX_TRAIN / R4_CAP_SKIP_COVER | 0 / off | capacity_scaling |
R4_SCALING_FRACS | 13,25,50,100 | cover_scaling |
R4_SCALING_ARMS | absolute,relative,mdl,scaled-k0,relative+scaled | cover_scaling |
R4_SCALING_MAX_TRAIN / R4_SCALING_MAX_HELD | 0 / 50,000 | cover_scaling |
R4_TS_RIGHT_R / R4_TS_MAX_EVAL / R4_TS_SIG_TOP / R4_TS_SIG_BINS / R4_TS_MIN_SUP | 4 / 250,000 / 4 / 16 / 1 | two_sided_context |
R4_TS_GROWTH_FRACS | 6,12,25,50,100 | two_sided_context |
R4_RECONNECT_CONSTR_STORIES / R4_RECONNECT_HELD_STORIES | 2,000 / 200 | router_reconnect |
R4_INFILL_STRIDE | 4 | anchor_infill |
R4_CD_SAMPLE_EVERY / R4_CD_LABEL / R4_CD_AB_BUNDLE | 5 / unlabeled / /tmp/score.r4g1 | r4g1_cd_ab |
R4_HOPF_CONSTR_STORIES / R4_HOPF_PROBES | 2,000 / 500 | all router harnesses |
R4_HOPF_FISHER_PAIRS / R4_HOPF_REDESIGN | 10,000 / off | hopf_retrieval_quality |
HOPF_OCCUPANCY_REPORT_PATH | target/hopf_sector_occupancy/report.json | hopf_sector_occupancy |
R4_SELFMATCH_PROBES | 100 | geometry_selfmatch |
R4_LEXW_CONTENT_QUERY | Off in this historical harness; 1 selects the deployed content-query arm. The router itself defaults content-query mode on (#490/#502). | lexical_weight |
R4_ZETA_ARM | must be 1 or the harness no-ops | zeta_state_retrieval |
R4_MEMLIFT_CONSTR_STORIES / R4_MEMLIFT_PROBES | 2,000 / 500 | memory_lift_corpus |
R4_ARM_SKIP_SAMPLE / R4_ARM_SKIP_FIXTURE_DIR | 10,000 / the committed fixtures | gate_c_arm_skip |
R4_STATUS_FIXTURE_DIR | /tmp/r4-status-fixture | status_policy |
R4_PARITY_POSITIONS / _GEN_TOKENS / _RUNS / _CORPUS_POSITIONS | 256 / 8 / 1 / 1000. The binding registered work uses exactly eight lanes and an eight-token maximum; S4 starts at one causal continuation step per lane, then may extend through 2, 4, and 8 only while more work can change the verdict. Smaller generation caps are diagnostic only and cannot qualify the full run. Fixture-present execution requires one causal run. The report records actual tokenized/executed work; caps are not forward-count claims. | BDD teacher parity |
R4_PARITY_PREFLIGHT_ONLY | Off. Set to 1 to validate the schema-2 release-bundle.json production envelope and deployed-quality bindings, then parse and exercise the tokenizer, legacy artifact/store, graph, graph report, and all eight canonical deployed seeds without opening the live teacher. It writes a uor-r4.teacher-parity-preflight/1 success or refusal artifact with teacher_source_opened=false and teacher_forwards=0, then exits before Cucumber. The ordinary BDD fixture loader publishes the same artifact automatically. Any missing or invalid prerequisite blocks expensive teacher work truthfully. | Teacher-free BDD preflight |
R4_PARITY_PREFLIGHT_REPORT | target/teacher-parity/teacher-free-preflight.json. Relative paths resolve from the repository workspace root for both the BDD owner and direct tuner. Atomic deterministic output used by explicit and automatic preflight. Non-PASS artifacts retain the exact reason, selected paths, safe per-input presence/CIDs, and current authorizing_contract_cid before returning; an empty, non-Unicode, uncreatable, or unwritable path fails the preflight visibly. The direct tuner validates the current contract, exact report/source/bundle paths, and recomputed compiled-input plus complete production-admission CIDs before opening teacher weights. | Teacher-free BDD preflight and exact live admission probe |
R4_PARITY_PROGRESS_EVERY_SECS | 10. Periodic human-readable and flushed JSONL heartbeat cadence, including while no exact forward has completed. In-flight matrix/tile/cell/scalar counters drive liveness and the ETA basis; whole-forward throughput remains separate. Zero or malformed values fail. | BDD teacher parity |
R4_PARITY_MAX_WALL_SECS | 28,800 (8 h). Stops dispatching new work at the ceiling and records ABORTED; it never converts partial work into PASS. Values above 28,800 fail: the override may shorten but never widen the hard ceiling. The full run is also refused before launch unless the cheap probe projects completion below this ceiling. | BDD teacher parity |
R4_PARITY_REPORT | target/teacher-parity/parity-report.json. Final versioned JSON report; the flushed event stream is written beside it as parity-report.events.jsonl. A create/write/flush failure is FAIL, not missing telemetry on a PASS. | BDD teacher parity |
R4_PARITY_TELEMETRY | 1 / enabled. 0 exists only for focused planted/unit controls; fixture-present parity refuses to run without telemetry. Invalid booleans fail. | BDD teacher parity |
R4_EXACT_PROBE_REPORT | target/teacher-parity/exact-multicore-probe.json; relative paths resolve from the repository workspace root and flushed events use exact-multicore-probe.events.jsonl. An empty/non-Unicode path refuses admission. | Exact live admission probe and BDD consumer |
R4_EXACT_PROBE_POSITIONS | 1; valid range 1..=8. Every configured position is exercised over the same eight canonical states at W=available and W=min(4, available), deduplicated when equal. | Exact live admission probe |
R4_PARITY_SOURCE | .uor-models/sources/smollm2-135m-instruct. Teacher source directory used consistently by the exact probe and fixture-present BDD run. Relative paths resolve from the repository workspace root; empty or non-Unicode values fail closed. The teacher-free preflight records this selection but does not open it. | Exact live admission probe and BDD teacher parity |
R4_PARITY_BUNDLE | .uor-models/compiled/smollm2-135m-instruct. Compiled schema-2 release-bundle.json/deployed-quality envelope plus tokenizer/artifact/store/graph/report bundle used consistently by teacher-free preflight and fixture-present BDD work. A pre-schema-2 bundle is refused before teacher access. Relative paths resolve from the repository workspace root; empty or non-Unicode values fail closed. | Teacher-free preflight and BDD teacher parity |
R4_FMM_POSITIONS / R4_FMM_RANK / R4_FMM_TOLERANCE | 256 / — / — | BDD FMM |
SMOLLM2_SOURCE | — | smollm2_adapter tests |
UOR_R4_API_E2E_SOURCE | — | uor-r4-api E2E test |
UOR_R4_RELEASE_BUNDLE_PATH | — | release_bundle_packager real-local-bundle test (#[ignore]d; mirrors the UOR_R4_API_E2E_SOURCE convention) |
PORT | 8000 | ./uor-r4-cli orchestrator only (shell script; the r4 binary itself reads UOR_R4_PORT) |
Teacher-parity controls govern host-side verification only and do not enter
artifact identities or deployed serving. S private sequence states must share
one immutable weight allocation and advance in one physical exact batch; the one
W-thread pool must schedule disjoint output rows without nested
oversubscription.
Every output row must keep the pinned uor-matmul dot reduction intact;
splitting or reassociating the reduction dimension is not permitted. Results
return to canonical prompt/position order before metrics are reduced.
The 36 logical teacher-forced positions are executed once in six physical
batches with registered widths 8, 8, 8, 7, 4, 1. That transcript retains each
canonical lane at its distinct final teacher-forced prompt prefix (lengths
5, 6, 5, 4, 3, 4, 5, 4 for the pinned tokenizer), rather than truncating
different prompts to a colliding common prefix. S4 clones the templates,
appends the already-computed teacher next token to each logical seed, and times
only new causal continuation steps. Exact batches carry the per-lane sequence
positions explicitly, so variable histories do not serialize the cohort.
There is no duplicate live-teacher prefill and no independent full-model S4
warm-up. Preparation, decode, and one-shot elapsed time remain separate
evidence fields.
Before measurement, the harness reserves the bounded model-wide batch buffers, exact input/output transpose buffers, and one exact scratch slot per dedicated worker, then exercises the worker pool/backend with a tiny known product. Its elapsed time, retained capacity, capacity-growth event count, and actual added capacity bytes are recorded as excluded preparation. Measurement counters are reset without discarding those buffers. Every transcript and S4 physical forward must subsequently report zero workspace-growth events and bytes; otherwise the run fails rather than presenting allocation churn as steady-state throughput.
Conditional source, artifact, store, graph, tokenizer, or corpus evidence is
reported as AVAILABLE, UNAVAILABLE, FAILED, or NOT_RUN. An absent
fixture is never a parity PASS merely because the enclosing test executable
returns success. The progress/event/report schema and the launch gate are
specified in the #932 run record.
The durable artifact set is:
| Artifact | Schema id | Default path | Role |
|---|---|---|---|
| Progress events | uor-r4.teacher-parity-progress/2 | target/teacher-parity/parity-report.events.jsonl | Flushed heartbeat, phase, work, failure, and completion snapshots |
| Final run report | uor-r4.teacher-parity-report/2 | target/teacher-parity/parity-report.json | Empirical timing/resource/occupancy verdict and exact reason |
| Deterministic evidence | uor-r4.teacher-parity-evidence/2 | target/teacher-parity/parity-report.evidence.json | Timing-free identities, exact outputs, reductions, and verdict inputs |
| Exact admission probe | uor-r4.exact-multicore-probe/2 | target/teacher-parity/exact-multicore-probe.json plus .events.jsonl | Source/host/executor-bound equal-work W=available/W=min(4, available) selection evidence |
For uor-r4.exact-multicore-probe/2, probe_deadline_policy means that no new
exact forward is admitted after 3,600 seconds; an already-active fixture load or
exact forward may finish, then the probe records ABORTED, and elapsed time at
or beyond the deadline cannot qualify. The report's required events object
binds the sibling file_name, full-byte content_cid, byte_len,
record_count, final_record_number, final_event, final_status,
final_qualifies_full_run, and non-cyclic report_body_cid. FINAL is synchronized
before the report is atomically committed, carries
sequence == final_record_number == record_count, and must be the last JSONL
record. Admission validates the current sidecar before teacher weights load;
missing, truncated, appended, or tampered bytes refuse the run.
Schema /1 bytes describe the superseded fixed-sweep design and remain
historical evidence. Schema /2 binds the adaptive candidate set, fastest-exact
selection policy, and the complete registered admission shape: 36 transcript
logical forwards in batch widths 8, 8, 8, 7, 4, 1; eight continuation tokens
across eight lanes; 100 logical forwards in 14 physical shared-weight batches;
zero-based maximum sequence position 13; and private-state capacity 14. A
smaller operator cap may produce diagnostic evidence but cannot qualify the
binding suite. reference_workers names the first measured exact candidate,
equal_to_reference binds every candidate's raw trace to it, and the cheap
worker-pool/backend prestart is recorded separately and excluded from timed
forward rates. CPU and RSS fields are diagnostics: they must be structurally
valid and truthful, but a platform-reported UNAVAILABLE value does not by
itself refuse exact admission. A later change to field meaning, type,
requiredness, units, or artifact partition requires another schema id rather
than reinterpreting an existing record.
Served model identity (#655-F)
The canonical served model id on every serving surface (OpenAI /v1
routes, native /api/chat, WS, WASM) is r4. Requests may omit
model, send r4, or send the deprecated pre-flip alias uor-r4
(accepted for a compatibility window); responses and /v1/models
always report r4, and OpenAI wire ids are r4-prefixed
(chatcmpl-r4-…, resp-r4-…, msg-r4-…, system_fingerprint: r4-{mode}). The CLI client subcommand's --model default is r4.
Per-bundle logical/physical names are metadata (/uor/v1/status), not
the served identity. Engine/tier names (r4g1, …) are unrelated to the
model id and unchanged.
Runtime state files
Written under .uor-models/ (or UOR_MODEL_STORE):
| File | Purpose |
|---|---|
audit_log.json | Per-turn question, answer, UOR address, κ + PASS/DRIFT, generation mode, latency. Rendered by r4 audit |
last_model.txt / last_model_name.txt | Orchestrator's last model selection |
last_engine.txt | Persisted engine preference. Under the experimental profile it silently pins the cascade for requests that omit engine; under production (the default) a non-r4g1 value is silently inert |
engine_profile.txt | Serving profile (#655-E2, #789): production or experimental. Absent, empty, or unparseable ⇒ production (fail-safe), under which only the r4g1 tier is admitted on the cascade endpoints, the /api/tless/* bypass endpoints are declined (#789-G1; /api/r4g1/* stays open), an explicit non-r4g1 engine request returns a typed decline echoing the requested string (#789-G3.2), and discovery counts a model active only with a text-ready R4G1 graph (#789-G2). An explicit engine name outside the recognized vocabulary is a typed decline on every profile (#789-G3.1). /uor/v1/status reports the active profile in its profile field. Read fresh on every request; since #790-6 both this file and last_engine.txt resolve against the store root (UOR_MODEL_STORE, defaulting to .uor-models/), superseding the 2026-08-18 audit's CWD-relative note |
sources/<name>/ | Downloaded Hugging Face teacher sources |
compiled/<name>/ | Base compiled bundle. It may hold legacy absence, an explicit historical attention/1+dense/1 pair, or a fresh current attention/2 bundle with dense absent. Inventory includes graph/artifact outputs, tokenizer.bin, tokenizer_adapter.json, attention_operator.json, optional dense_operator.json, corpus.meta, and corpus.records. |
compiled/<name>-attention-v2/ | Resolver-owned current attention/2 root with dense absent, used when a historical base must remain immutable. |
compiled/<name>-attention-v2-dense-v2/ | Resolver-owned current GPT-2 root. It must carry learned-absolute attention/2 plus gpt2-source-dense/2; current dense provenance is invalid in either lower-precedence root. |
corpora/ | Observation corpora |
Managed source-execution-era resolver (2026-08-15)
-attention-v2 and -attention-v2-dense-v2 are reserved physical-root
suffixes; downloaded source basenames ending in either are refused before
mutation. Suffix stripping uses longest match. The base and exact-suffix reload
names are aliases for one logical model, attach to sources/<logical-name>/,
and report the selected physical root plus optional attention/dense records.
A missing source is allowed for the #718 decode-only path; a present-invalid
source is terminal.
Every managed operation inspects all three roots before choosing one. A
malformed/nonregular binding, an unbound populated suffix, a future version,
an impossible attention+dense pair, duplicate semantic identities, or an
unfinished lower-precedence identity is terminal and byte-preserving. Current
startup/reload also requires the canonical corpus pair and
graph-cover/cover_report.json to carry the same registry-exact execution pair
as the root sidecars. Historical v1 and dense absence remain readable where
documented. These checks reconcile metadata. The cover-graph PROV/1 byte section itself
landed with #637 phase 3 (PR #738): cover now emits a PROV/1 section
unconditionally (a deliberately-empty record when no identity flags are
supplied).
Normative Specification: Canonical Artifact Byte Equality Under Compiler Parallelism
Preserved graph-artifact contract. The byte-equality rules below remain normative for their named TLA/R4G1 artifacts. New route manifests have their own identity contract under #961; this document does not establish geometric attention or chat. See the Geometric Intelligence Programme.
Version: 0.1.0
Status: Normative Specification
Issue: #167
Parent: #122
Depends On: #165 (Deterministic Compiler Executor), #166 (Compiler Stage Ownership & Parallelization DAG)
Normative Invariant Source: R4G1.md §7 (D2: "identical graph content + format version ⇒ identical bytes", Gate E), plan §4.1, AGENTS.md determinism invariant
1. Primary Invariant Statement
Normative Invariant (verbatim): Parallel execution may change compilation time, but must not change the canonical graph artifact produced from the same pinned inputs, compiler version, configuration, and target-independent compilation mode.
All R4 compiler pipeline stages (whether Parallel-Safe, Parallel with Deterministic Merge, Bounded Parallel, or Sequential Canonical Finalization) must conform to this invariant.
2. Required Execution & Reduction Mechanisms
To enforce strict byte-identical canonical outputs across sequential and parallel multicore executions, the R4 graph compiler mandates the following mechanisms:
-
Stable Input Ordering & Shard Numbering:
- Observations, traces, and samples are partitioned into deterministic shards based strictly on content-addressed IDs or stable positional indices.
- Dynamic worker scheduling order or thread dispatch timing must never dictate shard numbering.
-
Stable Candidate Ordering & Tie-Breaking:
- At every candidate selection point (e.g., region induction, XOR-polynomial candidate ranking, routing program selection), tie-breaking must follow a deterministic total order.
- For candidate scores, ties are broken strictly by candidate ID / content hash (
ScoreQfixed-point score descending, then candidate ID ascending).
-
Deterministic Reductions & Sorting:
- Parallel map-reduce operations must partition reductions by content-addressed key and perform deterministic ordered merges.
- All canonical outputs (nodes, edges, regions, certificates) must undergo stable canonical sorting prior to binary encoding into R4G1 format.
-
Floating-Point & Summation Policy:
- Order-sensitive floating-point parallel reductions are strictly forbidden for canonical output calculations.
- Compiler stages computing canonical graph quantities must use fixed-order summation or integer/fixed-point accumulator types (
ScoreQ, saturating integer arithmetic). - Compiler-internal float heuristics (e.g., loss diagnostics) may use floating-point operations provided canonical topology, IDs, offsets, and binary payload bytes do not depend on summation order.
-
Random-Seed Policy:
- All pseudo-random processes (such as clustering initialization or randomized graph exploration) must consume pinned random seeds recorded in the compile report.
- Seed generation and PRNG state transitions must be positionally deterministic and independent of thread scheduling or multicore worker counts.
-
Thread-Count Invariance:
- The compiled graph topology, node/edge IDs, section offsets, payload bytes, content CIDs, and performance/verification certificates must be 100% bit-identical across any thread count \(N \in \{1, 2, 4, 8, \dots\}\).
3. Forbidden Nondeterministic Patterns
The following implementation patterns are explicitly forbidden within the R4 graph compiler pipeline:
- Forbidden Pattern 1: Assigning canonical node or edge IDs during unordered parallel discovery.
- Forbidden Pattern 2: Using thread completion order or worker arrival sequence as semantic ordering.
- Forbidden Pattern 3: Mutating or appending to shared global graph data structures from parallel worker threads.
- Forbidden Pattern 4: Iterating over non-deterministic hash map key orders to emit canonical output structures.
- Forbidden Pattern 5: Order-sensitive floating-point parallel reductions feeding canonical graph attributes.
- Forbidden Pattern 6: First-finished-candidate-wins race conditions in candidate selection.
4. Verification Harness & Compliance
The compiler crate (uor-r4-graph-compiler::reproducibility) provides ParallelReproducibilityHarness. The harness executes:
\[\text{Harness}(\text{inputs}) \implies \text{Artifact}_{\text{seq}} \equiv \text{Artifact}_{\text{par}, N=1} \equiv \text{Artifact}_{\text{par}, N=2} \equiv \text{Artifact}_{\text{par}, N=4} \equiv \text{Artifact}_{\text{par}, N=\text{max}}\]
The harness asserts:
ArtifactBytes(seq) == ArtifactBytes(par, N)(100% byte equality)Digest(ArtifactBytes(seq)) == Digest(ArtifactBytes(par, N))(BLAKE3 digest parity)
The proof model (uor-r4-proof-model::structural_guarantees) currently provides an executable-spec check via verify_parallel_reproducibility_compliance; end-to-end compiler artifact-byte parity remains validated by compiler-path tests.
5. Traceability & Claim Classification
- Formal Claim Classification: Canonicalization and deterministic output under parallelism is a Guarantee with Structural proof status (harness-backed).
- CPU Portability: Reproducibility is strictly CPU-native and GPU-free (zero CUDA, OpenCL, Metal, WebGPU, BLAS, or hardware vendor dependencies).
Minimalist R⁴ Terminal Client & Local Vendor API
Preserved interface reference: this page documents the existing terminal client, launcher, and HTTP surfaces from the TLA/R4G1 serving era. It does not show that the route-native geometric-intelligence programme can answer a prompt. There is no working source-free geometric chat path yet; #961 -> #952 -> #953 must establish lexical state, recursive attention, and generation before this interface can carry that claim. See the current programme.
The interface exposes r4 client plus vendor-shaped endpoints such as
POST /v1/chat/completions, GET /v1/models, and GET /uor/v1/status.
Provider, engine, and multiplication-free claims apply only to the exact
legacy execution tier and artifact selected for a request; the existence of
the endpoint is not evidence about which mechanism produced its response.
1. Single-Command Launcher (./r4-app.sh)
The simplest way to run R⁴ interactively is with the zero-dependency ./r4-app.sh launcher:
./r4-app.sh
What ./r4-app.sh does automatically:
- Model Selection Menu: Presents an interactive choice between
smollm2-135m-instruct,smollm2-360m-instruct, andsmollm2-1-7b-instruct. - 4-Stage Pipeline Compilation & Live Progress: Automatically runs any missing compilation stages (download, corpus compilation, R4G1 graph scoring) while displaying
claude-code-styled live progress bars ([█████████████░░░░░░░░] 65% (18s)). - Background Server: Launches
r4 servein the background on port 8000 (or$PORT). - Interactive Client: Automatically opens the interactive client once ready.
- Signal Cleanup: Traps
EXIT,INT(Ctrl-C),TERM,HUP(window close), andQUIT(Ctrl-\) signals to cleanly terminate the background server process.
2. Interactive Terminal Client (r4 client)
You can also run the client against an existing local server instance:
cargo run --release -- client --remote http://127.0.0.1:8000/v1
Rich Intro Banner & Slash Command Autocomplete
Upon launching, r4 client displays an ANSI R⁴ ASCII banner and shortcuts guide:
██████╗ ██╗ ██╗ ██████╗██╗ ██╗
██╔══██╗██║ ██║ ██╔════╝██║ ██║
██████╔╝███████║ ██║ ██║ ██║
██╔══██╗╚════██║ ██║ ██║ ██║
██║ ██║ ██║ ╚██████╗███████╗██║
╚═╝ ╚═╝ ╚═╝ ╚═════╝╚══════╝╚═╝
R⁴ Holographic Graph & Transformerless Engine v0.1.0
Zero-Multiply Local Intelligence Runtime • Pinned Multiplication-Free Execution
Connected to local vendor endpoint: http://127.0.0.1:8000/v1/chat/completions
Active teacher model : smollm2-135m-instruct
Commands & Shortcuts:
• Type /help to view available slash commands (/status, /models, /clear, /quit)
• Type / for interactive slash command suggestions & autocomplete
• Type exit or press Ctrl-D to quit session
Interactive Slash Command Completion
Typing / triggers interactive command suggestions:
- Typing
/\(\rightarrow\) Displays available commands list. - Typing
/mor/mo\(\rightarrow\) Auto-completes and runs/models. - Typing
/sor/st\(\rightarrow\) Auto-completes and runs/status. - Typing
/h\(\rightarrow\) Auto-completes and runs/help. - Typing
/q\(\rightarrow\) Auto-completes and runs/quit.
3. Local Vendor-Style HTTP API Endpoints
The local R⁴ server implements OpenAI/vendor-compatible endpoints for local tools, IDE integrations, and custom frontends.
GET /uor/v1/status
Returns 4-stage pipeline readiness JSON for the active teacher model. (The bare
/v1/status path is a deprecated alias — it still works but is served with a
Deprecation header pointing at /uor/v1/status, keeping /v1 a pure OpenAI
surface.)
GET /v1/models
Returns the local model availability manifest.
POST /v1/chat/completions
Accepts standard vendor Chat Completions requests.
Release pipeline (#741)
Paused, 19 October 2026:
.github/workflows/release.ymlskips all three jobs. The legacy-crate repair restored the compliant library surfaces of the graph and root packages, but neither release asset can be built under the D23/D25/D29/D30 bans. Ther4CLI serves R4G1 through the retired transformerless compiler/runtime and the source-backed teacher, and the wasm frontend is the R4G1 browser engine D36 already paused. The commands below (r4 package-release-bundle,r4 install-release) are therefore not built. The M8 rewrite for a D11 served artifact (UORLUT01) re-enables the pipeline.
Preserved runtime reference: this pipeline packages the existing TLA/R4G1 frontends and bundle contracts. It is not the release pipeline for a route-native geometric-intelligence product, and a successful legacy release does not establish source-free attention, generation, correctness, or chat. Current product sequencing is defined by the Geometric Intelligence Programme.
Adopted by maintainer decision on 2026-08-19 (recorded on #741/#655):
the "package + build release pipeline now" option — both frontends, a
GitHub Release as the distribution artifact, an explicit verified fetch
command, and a versioning convention that binds each tag to its exact
code and bundle identity. This pipeline publishes nothing by itself:
every piece below is inert until the maintainer pushes a v* tag, and
even then the release starts as a draft that only the maintainer
publishes.
Versioning convention
A release tag vX.Y binds, in one auditable place:
- code identity — the tag's commit SHA (in the release notes and on the tag itself);
- contract identity — the inference-contract version from
docs/inference_contract.md(in the release notes); - bundle identity — the blake3 component digests (normative graph,
sections-absent and label-shuffled control graphs, signature artifact,
plain-TLA comparator store, tokenizer, score/compile reports, normative
deployed-quality report, raw cross-surface parity evidence, and raw witness
replay) declared by the attached schema-2
release-bundle.json. The quality report in turn content-binds the corpus pair, tokenizer adapter, compiler revision/configuration, selector semantics, held-out partition, controls, raw parity/replay evidence, and exact production decode profile. Schema-1 manifests remain readable only as historical research evidence and cannot authorize serving.
A tag with no bundle assets attached is a code-only release; the verified fetch command simply reports the missing asset.
What the tag triggers (.github/workflows/release.yml)
Pushing vX.Y creates a draft release and attaches both frontends:
r4-vX.Y-x86_64-unknown-linux-gnu.tar.gz— native CLI, linux;r4-vX.Y-aarch64-apple-darwin.tar.gz— native CLI, macOS arm64;r4-wasm-vX.Y.tar.gz— the wasm frontend (wasm-pack build, the same build the Pages deploy runs);- a
.sha256beside each.
CI cannot compile the model (hours of teacher-bound compute against a pinned snapshot), so the model bundle is attached by the maintainer:
Maintainer steps to cut a release
-
Pick the bundle (current candidate per the decision record: the
smollm2-360m-broadcompile) and package its sidecar:r4 package-release-bundle \ --compiled .uor-models/compiled/<name> \ --model-id r4 --capability instruction-chat \ --source .uor-models/sources/<source> \ --tokenizer-family hf-byte-bpe --tokenizer-version 1 \ --compiler-revision "$(git rev-parse HEAD)" -
Archive exactly the attested component files (the packaged layout — nothing else;
r4 install-releaserefuses archives carrying any unattested entry). Local invocation journals, resource sidecars, and terminal transcripts are operational evidence and are deliberately not packaged:cd .uor-models/compiled/<name> tar -czf /tmp/release-bundle.tar.gz \ graph/score.r4g1 graph/score_sections_absent.r4g1 \ graph/score_label_shuffled.r4g1 tless_artifacts.bin tless_store.bin \ tokenizer.bin \ graph/score_report.json graph/deployed_quality_report.json \ graph/cross_surface_parity.json graph/witness_replay.json \ graph-cover/cover_report.json corpus.meta corpus.records \ tokenizer_adapter.json -
Tag and push:
git tag vX.Y && git push origin vX.Y— the workflow drafts the release and attaches the frontend builds. -
Attach the bundle and publish:
gh release upload vX.Y /tmp/release-bundle.tar.gz \ .uor-models/compiled/<name>/release-bundle.json gh release edit vX.Y --draft=false
The explicit verified fetch
r4 install-release --tag vX.Y # from UOR-Foundation/uor-r4
r4 install-release --tag vX.Y --repo owner/name --name custom-install
install-release (src/release_install.rs) downloads the two bundle assets,
requires exactly the schema-2 production inventory above, hard-verifies every
manifest component digest, and independently reproduces the deployed-quality
bindings from the extracted graph, teacher artifact, exact plain-TLA comparator
store, corpus, tokenizer, adapter, reports, both planted control graphs, raw
cross-surface rows, and independently replayed witness rows. It refuses unknown files, symlinks,
missing/tampered raw evidence, legacy/sample/off-serving evidence, or any
identity mismatch, never overwrites an existing install, and only then moves
the bundle into
.uor-models/compiled/<name>. A failure at any step installs nothing. The
fetch is always explicit: no serving path, first request, or setup step
triggers it — exactly #655's "first request must not silently download" scope
line.
What this pipeline deliberately does not do
- It does not flip any serving default or canonical model identity — that is #655-F, separately gated on its own preconditions and a fresh maintainer sign-off.
- It does not auto-publish: drafts require the maintainer.
- It does not compile models in CI.
Side projects
This folder holds research projects that are related to UOR-R4 but are not part of the language model. Some feed ideas into the model (the model's prime and zeta-zero geometry draws on one of them). Others, like a network transport or a Lean proof of a matrix kernel, run alongside it. None of them is on the model's training or serving path, and none of them is evidence that the model works. The model itself is pre-alpha: 0 of 8 milestones are complete and no model holds a useful conversation yet (STATUS.md).
The seven projects and where each connects to the model. Solid boxes keep their source in git. Dashed arrows into the model mean consulted or drawn on; the dashed arrow to the cylinder points to the large originals kept outside git.
Why these projects live in this repository
The owner decided (19 October 2026) that side projects stay in this repository under projects/, with one README each, rather than moving to separate repositories. Two reasons follow from that decision. First, the history of the model cannot be read without them: the model's prime-routing and zeta-phase ideas draw on the Prime Analysis program, and the SpiralCore references were consulted when the SpiralCore/FBS mechanism was designed (the mechanism itself follows a separate v63 reference and a hosted v69 file; see the mechanism page). Second, most of this material existed only on one laptop, with no version control and no remote. Putting the source in git and the bulky files in a checksummed store fixes that.
Three rules keep the side projects from being mistaken for model results:
- Nothing here changes the model's status. A proof scaffold, a transport benchmark or a Python probe is not a trained capability. See the claim rules in
docs/formal_vocabulary.md. - Old claims keep their original scope. Files imported from the owner's earlier workspaces carry labels such as "canonical" that applied to their own old repository, not to this one.
- Source goes to git, bulk goes to the store. Code, Lean files, LaTeX and short notes come into the project folder. Images, PDFs, corpora and run outputs stay in the private store and are checked by hash.
The projects
| Folder | What it is | Where it stands | Model link |
|---|---|---|---|
spiralcore/ | Wire-transport exploration (plain zlib framing, no SpiralCore routing yet) plus two owner-supplied SpiralCore references | Wire transport works on loopback; not wired into the model | Related reference material, consulted but not the build source of the SpiralCore/FBS mechanism |
riemann-lean/ | Lean 4 scaffold for a prime/Riemann theorem chain, plus the Python probes behind it | Scaffold. The Riemann hypothesis is not proved | None on the model path |
prime-analysis/ | The Prime Phase / Chebyshev psi spectral program: notes, slides and simulations | Research notes. Not a proof of anything | A late, concluding collection of the prime-router studies that the prime/zeta codebook draws on |
ai-research/ | Snapshot of the original root research workspace (router research, MUDBench, Ramsey experiments) | Historical, Python era | Earlier workspace in the lineage of the Rust model |
msa/ | Two papers on Modular Structural Arithmetic by Alex | Papers only, third-party authorship | Cited in earlier route-attention work |
research-archives/ | The Gemini-era r3/r4 sandbox | Archive, not a live project | History only |
wasm-gemm-gnaf/ | Lean 4 mechanization aimed at an optimality theorem for a WebAssembly matrix kernel | Theorem not established | None. Separate project |
Where the originals are
Six of the seven projects came from the owner's untracked research/ folder (the seventh, wasm-gemm-gnaf, is already tracked in git). On 19 October 2026 the whole folder was backed up to a private Hugging Face dataset before any file was moved.
| Item | Value | Source |
|---|---|---|
| Dataset | caseyallard/uor-r4-store (private) | docs/labs/repo-renormalization-2026-10-19/backup/README.md |
| Path | research-archive/2026-10-19/ | same |
| Layout | eight tars under tars/: one per project (seven pages here, with archives.tar holding research-archives and spiralcore-v68.tar holding spiralcore), plus causal-continuation-2026-09-24.tar (a September 2026 causal-continuation experiment folder: scripts, plans and freeze files) and root-files.tar (the old research/ README and two value-faith panel JSON files), which have no project page; tars.sha256 and files.sha256 sit one level above tars/ | verified by listing the dataset on 19 October 2026 |
| Tar integrity | SHA-256 of each tar in tars.sha256 | same |
| File integrity | SHA-256 of every file inside each tar in files.sha256 (11,456 lines for all tars, including the loose files) | research-archive/2026-10-19/files.sha256 in the store |
To restore one project, fetch its tar, check it against tars.sha256, unpack it, and check individual files against files.sha256. Each project README lists its own tar, size and checksum (wasm-gemm-gnaf has none: it is already in git). The folder sizes quoted on the project pages come from the audit inventory docs/labs/repo-renormalization-2026-10-19/audit/folders.json, which is an audit working file; files.sha256 holds hashes only.
What happens to the code
The plan for each project is the same: the source files named in that project's README are copied into its folder here, byte for byte, and the originals stay in the tar. Where the same file appears in two projects, one copy is kept and the other is recorded as a duplicate by hash (see prime-analysis/ and ai-research/). Third-party and personal documents are not committed until the owner has reviewed their licensing or privacy. The folder inventory behind this plan is docs/labs/repo-renormalization-2026-10-19/audit/folders.json (research_projects).
Go deeper
- Charter for what counts as the model and what does not.
- Glossary for terms such as SpiralCore, E8 and zeta zero.
- Geometry overview, including SpiralCore and primes and zeta.
- Older records that mention these projects are in
archive/(see the catalog underdocs/).
AI-Research: the original root research workspace
Before there was a Rust language model, there was a Python workspace called AI-Research. It held the first experiments on routing information by geometry instead of by dense attention, a benchmark for AI agents in a game world, and some small mathematics studies. This project is a snapshot of that workspace, kept so the history can be traced. The claims inside it are from the Python era and belong to that workspace; they are not claims about the current model, which is pre-alpha.
flowchart TD
W["AI-Research workspace, Python era"] --> R["ai-router: routing research and paper drafts"]
W --> M["MUDBench: agent benchmark and game world"]
W --> Q["ramsey: Ramsey-style math experiments"]
W --> D["deepermath and loose notes, plots, CSVs"]
R --> N["Later: R4 prime router in Rust, then the UOR-R4 geometric model"]
The workspace's four parts. Only the router line leads to the current model.
What is in the project
The snapshot has 3,335 files and about 358 MB (research-archive/2026-10-19/files.sha256 in the store; sizes from the audit inventory docs/labs/repo-renormalization-2026-10-19/audit/folders.json). The inventory counts about 10 MB of code across 678 code-like files (669 of them Python), around 207 MB of JSON, CSV, log and NPZ data, about 28 MB of images and about 119 MB of documents (1,037 Markdown files, 123 LaTeX files, 93 PDFs).
| Part | Size | What it is |
|---|---|---|
ai-router/ | about 335 MB (router-research about 229 MB, preprints about 101 MB) | Geometry-native routing research: transport laws, wheel-based experiments on prime admissibility, run outputs, a staged "kill list" tracker, and the paper 1 manuscript rebuilds (versions 1 to 4 and a submission bundle) with a claims_to_evidence_table.md |
MUDBench/ | about 3.7 MB | A benchmark and game-world runtime for evaluating agents: specifications, source in src/, tests, scenarios, a scoring spec |
ramsey/ | about 2.2 MB | Scripts and result tables for recursive Ramsey-style studies |
deepermath/ | about 1.8 MB | Early prime-router scripts and a few papers |
| loose files | the rest | Plots and CSVs from wheel experiments (moduli 210, 2310 and 30030), base-fiber admissibility, and transport-error comparisons across three configurations |
The workspace's own entry points are README.md, PROJECT_MAP.md and the router's docs/research/KILL_LIST_TRACKER.md and ACTIVE_STATE.md. Its paths in PROJECT_MAP.md point to a different machine and no longer resolve.
What it claimed
The workspace's EVIDENCE_SUMMARY.md lists what it had explored, each with "Observed" and "Unknown" lines. For example, geometric routing produced sparse activation in prototypes, with long-range stability and scaling listed as unknown. In its prime admissibility work, a shared transport law fitted on wheel sizes 2310, 30030 and 510510 is described as generalizing to the unseen size 9699690 with only small degradation, and the note itself says this is evidence for reusable structure and not for exact closure or a "prime oracle".
Treat these as the old workspace's statements. This page reports what the files say, not what was reproduced. Several nested copies of the same material exist inside the snapshot; the labels such as "canonical" apply to the old source repository.
Where it stands
| Statement | Kind | Evidence |
|---|---|---|
| The snapshot is 3,335 files and about 358 MB | measurement | files.sha256 (count); sizes from the audit inventory docs/labs/repo-renormalization-2026-10-19/audit/folders.json |
| It contains router experiments, an agent benchmark and small math studies | measurement (file listing) | research/ai-research/README.md |
| The router results transfer to the Rust model | hypothesis. The model's own tests are the evidence | see the mechanisms |
| Any quality claim about language | none. Nothing here trains or scores a language model for conversation | project README |
| Duplicates | 1,799 of its 3,117 distinct file hashes also appear in prime-analysis; 10 appear in research-archives | files.sha256 comparison, 19 October 2026 |
Where the originals are
The full project is preserved in the private Hugging Face dataset caseyallard/uor-r4-store under research-archive/2026-10-19/tars/ai-research.tar (377,595,904 bytes, 3,335 files, SHA-256 dbdb1fa6f09712b9faba207a0188d23d0a591c9773cdcbb7ec6aeb21b8ddf1ce). Every file inside is listed in files.sha256, and the tar is listed in tars.sha256.
Source files brought into this folder
Only source and short notes come in; all data stays in the store.
README.md,PROJECT_MAP.md, and the loose*_note.mdfilesMUDBench/src/**andMUDBench/tests/**ai-router/**/*.py, after removing files that duplicateresearch-archives, andai-router/preprints/paper1_arxiv_rebuild_v4/**/*.texclaims_to_evidence_table.mdfilesramsey/**/*.pyanddeepermath/**/*.py
Stay in the store: all CSV, NPZ, PNG and PDF files, large run outputs under router-research/, preprint build artifacts, and 1608.04200v2.pdf (a third-party arXiv paper).
The owner's inventory suggests splitting this project into three folders later (router research, MUDBench, Ramsey). That is a proposal and is not decided; this page treats the snapshot as one project.
Go deeper
- Prime Analysis, which overlaps heavily with this snapshot.
- Research archives, the Gemini-era sandbox.
- Primes and zeta and the mechanism index for what carried into the current model.
MSA: Modular Structural Arithmetic
Modular Structural Arithmetic (MSA) is a small formal system for arithmetic with a few special numbers in it. It was written by Alex, a collaborator, and given to this project with his consent as source reading. The folder holds two short papers and nothing else: no code, no data, no experiments. It is a third-party idea that earlier route-attention and selector work in this repository pointed to. It is not part of the language model, and no result here measures anything about the model.
flowchart LR
G["gamma = 24, the generator"] -- "doubling" --> M["mu = 48, the mediator"]
M -- "doubling" --> E["epsilon = 96, the manifestation"]
G -. "mu x mu = gamma x epsilon = 2304" .- E
E --> P["Reduce modulo a prime p: do the roles and doublings survive?"]
The three constants of Structural Arithmetic and the question Modular Structural Arithmetic asks about them.
What the papers contain
Structural Arithmetic (SA), 10 pages. SA starts from ordinary arithmetic (Peano-style axioms for successor, addition and multiplication) and adds three named constants: \(\gamma=24\) (the generator), \(\mu=48\) (the mediator) and \(\varepsilon=96\) (the manifestation). Each doubles into the next, \(\delta(\gamma)=\mu\) and \(\delta(\mu)=\varepsilon\), which the paper calls the doubling cascade. It also states the "fundamental equation" \(\mu\times\mu=\gamma\times\varepsilon\). Numbers are classed by role as generators, mediators or manifestations, with axioms about how the roles are closed under operations such as greatest common divisor and least common multiple, and an induction schema over the structures built this way.
Modular Structural Arithmetic (MSA), 6 pages. MSA is described as a conservative extension of SA: it adds reduction modulo a number \(p\) and asks which moduli keep the structure intact. Three predicates carry the idea:
- \(\mathrm{DP}(p)\), doubling-preserving: the reduced doubled constant equals the doubled residue, with no second reduction (for example mod 7 it fails: \(2\times6=12\) is not 5).
- \(\mathrm{RP}(p)\), role-preserving: the three constants stay distinct mod \(p\).
- \(\mathrm{SP}(p)\), structural-preserving: both of the above.
The paper then states special cases as axioms. For example, mod 11 the constants become 2, 4 and 8 (the "11-theorem"), and mod 7 they become 3, 6 and 5, which sum to a multiple of 7 (the "7-vanishing"). It also axiomatizes a "modular resonance" and a resonance period.
Checks anyone can do by hand (proof, by arithmetic). \(48^2=2304=24\times96\); \(24,48,96 \bmod 11 = 2,4,8\); \(24,48,96 \bmod 7 = 3,6,5\) and \(24+48+96=168=7\times24\). These confirm the numerical facts the axioms state. They do not show that the axiom system is consistent or that its larger claims, such as the characterization of doubling-preserving primes (axiom MSA9), hold; the papers present these as axioms, and this page has not checked that they follow from the others.
Why it is here
The repository's earlier route-attention and selector work referenced MSA as part of a modular-structure research direction (research/msa/README.md). This page claims no tie to the model's geometry, and none has been tested. Any such link would be a hypothesis needing its own experiment.
Where it stands
| Statement | Kind | Evidence |
|---|---|---|
| The folder contains two PDFs (6 and 10 pages) and a README, 3 files in all | measurement | files.sha256 |
| The constants and special-modulus facts above are true arithmetic | proof (direct calculation) | shown above |
| MSA is a conservative extension of SA, and the rest of its axiom claims | not checked here; the README asserts the extension property | research/msa/README.md |
| MSA helps the model | hypothesis, untested | none |
Permission and attribution
Both papers are by Alex. The README states they are included "with the author's consent" and were contributed to the research archive by Casey Allard. The folder inventory flags that redistribution permission should be confirmed before the PDFs are committed to a public repository. Until the owner confirms it, the PDFs remain in the store and the folder holds the README and a hash-and-pointer file; once confirmed they can be committed with attribution (they total about 0.3 MB).
Where the originals are
The full project is preserved in the private Hugging Face dataset caseyallard/uor-r4-store under research-archive/2026-10-19/tars/msa.tar (338,432 bytes, 3 files, SHA-256 73be0abc4ff823d00b35bab447e4f1928b45a478f9479dec84efa9504f1dd0b0). Every file inside is listed in files.sha256, and the tar is listed in tars.sha256.
Source files brought into this folder
README.md(the original, kept as written)Structural_Arithmetic.pdfandModular_Structural_Arithmetic_MSA__A_Formal_System.pdf, after the permission check above
Go deeper
- Project index for the other side projects.
- Glossary for terms used on this page.
- Earlier route-attention records that cite MSA are in
archive/(see the mechanism pages underdocs/mechanisms/for the current status of routing mechanisms).
Prime Analysis: the Prime Phase and Chebyshev psi spectral program
Prime numbers look random, but their running count wobbles around a smooth curve in a way that has long been tied to the zeros of the Riemann zeta function. This project asked whether that wobble (the Chebyshev residual \(\psi(x)-x\)) carries a structure that can be recovered and used to predict where primes fall. It is a pile of research notes, slide decks, simulations and scripts. Its own README calls it a late, concluding collection of the prime-router studies; the ancestry runs from the AI-Research workspace to a Python prime router, to this program, to the Rust model. The model's ideas about prime addresses and zeta phases draw on it. It is not a proof of the Riemann hypothesis, and not evidence that the language model works.
flowchart LR
A["Primes up to x"] --> B["Residual: psi of x minus x"]
B --> C["Detrend, resample on a log grid"]
C --> D["Hilbert transform: phase of the signal"]
D --> E["Look for stable frequencies and compare with zeta zeros"]
E --> F["Time-ordered 70/30 split: predict the held-out part"]
E -.-> G["Idea the model draws on: prime log-phases and zeta zeros as fixed phases"]
The program's pipeline as its own notes describe it. The dashed arrow is a transfer of an idea, not a transfer of a result.
The question and the method
Let \(\psi(x)=\sum_{n\le x}\Lambda(n)\) be the Chebyshev function, where \(\Lambda\) is the von Mangoldt function. The explicit formula writes the residual as a sum over the non-trivial zeros \(\rho=\tfrac12+i\gamma\) of the zeta function:
\[\psi(x)-x \;=\; -\sum_{\rho}\frac{x^{\rho}}{\rho}\;+\;\text{small terms}.\]
Each zero contributes an oscillation whose frequency is set by \(\gamma\). The program treats the residual as a signal and asks whether those oscillations can be seen and extrapolated. The notes describe a fixed ("fingerprint-locked") pipeline: causal detrending (no use of future data), resampling on a uniform log grid, analytic phase through a Hilbert transform, and time-ordered 70% train / 30% test splits so that prediction is judged out of sample.
The program also developed a geometric side: the R4 Prime Router, Hopf-base sector discretization, and an H4 x H4 coupled field. Those briefings are one source of the model's prime-routing language.
What is in the project
| Folder | Size | What it holds |
|---|---|---|
research/ | about 201 MB | About 30 briefings and study guides in Markdown, two CSV tables, manuscripts, and theoretical-mathematics/ with six sub-collections (ramsey-divisor-study, prime-number-theory, formal-math-lean, golden-harmonics, geometric-routing-hopf, theoretical-physics-uor) |
images/ | about 229 MB | Slide exports, mind maps and diagrams (JPG and PNG) |
photos/ | about 104 MB | Mostly the same images again under the same names |
simulations/ | small | Six interactive HTML pages (router visualizer, 3D zeta explorer, dissertation simulator and others) |
In total: 7,708 files, of which 2,644 are Python (about 1,390 are the program's own; 1,257 are vendored third-party packages such as numpy and numba under formal-math-lean/.vendor), 363 are LaTeX, and 3,167 are Markdown (research-archive/2026-10-19/files.sha256 in the store; counts from the folder inventory). Despite the name, simulations/ holds only the six HTML pages. Almost all of the Python is under research/theoretical-mathematics/.
Caution on provenance. Many of the Markdown briefings appear to be AI-generated study guides built from the owner's papers and slides. The collection also contains third-party papers, personal documents and a provisional patent filing. Those need a licensing and privacy review before any of them is committed; until then they stay in the store.
Duplicates to remove at import
- The 185 Python files in
formal-math-lean/are byte-identical to the 185 inriemann-lean/(measurement: byte comparison of the local copies, 19 October 2026). That folder holds no Lean files. Keep one copy, inriemann-lean. photos/repeatsimages/by name for at least some files (for example one 4.9 MB dashboard image appears in both).- 1,799 of the 3,117 distinct file hashes in
ai-research/also appear here (measurement fromfiles.sha256). The overlap includes folders with the same names (for example Ramsey and MUDBench material). Import by hash, not by path.
Where it stands
| Statement | Kind | Evidence |
|---|---|---|
| Peaks extracted from the residual beat phase-randomized surrogate signals (\(p\approx0.039\)) | reported claim, unverified: the cited note is a prose synthesis, not a run output, and the underlying run outputs were not inspected for this page | research/Spectral-Phase Dynamics in Prime Density Modeling_ A Synthesis of Research Outcomes and Validation Rigor.md |
| The peaks align with zeta zeros no better than with random frequencies of the same density (\(p\approx0.62\)) | reported claim, unverified (same note) | same |
| A truncation to about 300 zeros restores the phase geometry of the signal | same | same |
| The residual's structure can predict primes out of sample | hypothesis. This page cites no final held-out prediction result | same |
| The Riemann hypothesis follows | not claimed. The project's own README says it is scoped research | research/prime-analysis/README.md |
| Relevance to the model | The zeta-phase and prime-address ideas fed the prime/zeta codebook; the model's results are separate | mechanism page |
The second row matters for the model: the program's own controls found no special link between its spectral peaks and the zeta zeros beyond their density. The model uses zeta zeros as fixed phases, which does not depend on that link, but it should not be sold as one.
Where the originals are
The full project is preserved in the private Hugging Face dataset caseyallard/uor-r4-store under research-archive/2026-10-19/tars/prime-analysis.tar (566,219,264 bytes, 7,708 files, SHA-256 25747ed4345b510f85187d119db17cc5b2ee01f2f8f791f8a952d9a44970f36e). Every file inside is listed in files.sha256, and the tar is listed in tars.sha256. The project's own README names GitHub repositories and hosted pages under Casey-allard; no separate remote is recorded in the folder itself.
Source files brought into this folder
README.mdand the Markdown briefings and specifications inresearch/(the curated set; the rest stays in the store)research/theoretical-mathematics/**/*.pyand**/*.tex, except the 185 duplicates ofriemann-leanand anything under.vendor/,output/orexternal/(vendored or regenerable third-party code, which is not committed before review)simulations/*.html(six pages)
Stay in the store: images/, photos/, PDFs, DOCX files and the manuscripts under published-manuscripts/. The slide decks may later serve as figures for the documentation, subject to the licensing review.
Go deeper
- Primes and zeta and the prime/zeta codebook mechanism.
- Riemann-Lean for the Lean scaffold built from this program's probes.
- Glossary.
Research archives: the Gemini-era sandbox
This folder is a time capsule. In an early stage of the project (the "r3/r4 era"), the owner built a development sandbox with an AI assistant: text corpora, small Python tools that generate and index them, a first "prime router" prototype, and an early Rust checkout of a WebAssembly router. It is kept because it shows how the ideas started. It is not a live project, it does not run the current model, and it contains no result that the current model relies on.
flowchart TD
S["gemini-dev sandbox, r3/r4 era"] --> C["Text corpora: about 63% of the bytes"]
S --> T["Python tools: corpus generation, GloVe loader, indexing, server, CLI"]
S --> P["prime-router prototype: Python, with a web page"]
S --> R["Early Rust wasm-router checkout, vendored UOR standards"]
S --> X["scratch notes and extra_reading PDFs"]
R --> N["Superseded by crates/ in the current repository"]
What the sandbox contains. The Rust part has been replaced by the current workspace.
What is in the project
All of it sits under gemini-dev/. The folder is 99 MB in 128 files (research-archive/2026-10-19/files.sha256 in the store; sizes from the audit inventory docs/labs/repo-renormalization-2026-10-19/audit/folders.json). About 65 MB of that is data (JSON, NPZ, token files and text corpora) and about 37 MB is documents.
| Part | Size | Notes |
|---|---|---|
wikitext2_proxy/ | about 62 MB | A stand-in for the WikiText-2 language-modelling corpus |
Corpora (complex_corpus.txt, universal_corpus.txt, wiki_corpus.txt, world-model corpora) | about 12 MB, 11 MB, 3 MB and smaller | Text used by the prototype tools |
prime-router/ | about 3.4 MB | A Python prototype: "Evolving Hypersphere Brain World Model" with a web page and a CLI |
extra_reading/ | about 2.9 MB | Research PDFs with text extracts |
rust/ | about 0.6 MB | An early uor-r4-wasm-router checkout with vendored UOR standards; its engine file is uor_r4_router_engine.rs |
| Python tools | 55 .py files overall | Corpus generation, a GloVe loader, large-corpus indexing, a server and a CLI |
scratch/, zeta_data/ | small | Working notes and zeta-zero data |
The original README says the GloVe and manifold caches (about 490 MB) and a nested copy of the AI-Research workspace were left out of this snapshot.
One thing to know before reading the code. The prototype describes a "zero-weight" geometric text generator, and it also offers a mode that connects to a locally running transformer through Ollama for comparison. The current charter forbids neural comparators and controls, so nothing in this folder is run or revived; it is preserved as history only.
Where it stands
| Statement | Kind | Evidence |
|---|---|---|
| The sandbox is 128 files, about 99 MB | measurement | files.sha256 (count); sizes from the audit inventory docs/labs/repo-renormalization-2026-10-19/audit/folders.json |
| The prototype's "zero-weight" generation worked as described | hypothesis, not tested for this page | gemini-dev/prime-router/README.md is the only source |
| Any part of it is on the current model path | no | The Rust checkout is superseded by the current crates; the folder is marked archive |
| Overlap with other projects | 10 file hashes are shared with ai-research and 10 with prime-analysis | files.sha256 comparison, 19 October 2026 |
Where the originals are
The full project is preserved in the private Hugging Face dataset caseyallard/uor-r4-store under research-archive/2026-10-19/tars/archives.tar (103,435,776 bytes, 128 files, SHA-256 2553007578044fa4f5f7000714a633b0693d7714f80cb999e0671e7ee71e78b2). Every file inside is listed in files.sha256, and the tar is listed in tars.sha256. The tar is named archives; the folder here is called research-archives.
Source files brought into this folder
Only scripts and notes come in, as an index of what existed:
README.mdgemini-dev/*.pygemini-dev/prime-router/**gemini-dev/scratch/**/*.md- an index (a listing, not the files) of
gemini-dev/rust/**/*.rs, since the current crates replace it
Stay in the store: wikitext2_proxy/, the corpora, all NPZ and token files, the extra_reading PDFs and zeta_data/.
Go deeper
- AI-Research, the workspace that grew alongside this sandbox.
- Prime Analysis, the research collection that took these ideas further.
- Mechanism index for what the current model actually uses.
- Glossary.
Riemann-Lean: a Lean 4 scaffold for a prime-number proof chain
This project is an attempt to write a proof about prime numbers in a proof assistant called Lean 4, where a computer checks every step. The goal was to connect how primes are spread out to the Riemann hypothesis, a famous open problem about the zeros of the zeta function. The result is a scaffold: a chain of statements with the pieces needed to prove them, plus 185 Python scripts that probe whether the needed inequalities hold. The Riemann hypothesis is not proved here, and nothing in this folder is evidence about the language model.
flowchart TD
P["Python probes: a1 to a4, o1 to o5, k1, tau12, fixed_error_psi"] --> C["Constants and majorant checks"]
C --> L["Lean files: PrimeRiemannBridge spine, 17 files (plus 6 scratch probes)"]
L --> T["Theorem chain: O1 to O5, L1 to L3"]
X["Pinned in lake-manifest.json: mathlib and its own dependencies, Lean v4.28.0"] --> L
T -.-> G["Goal: bridge to the Riemann hypothesis, not reached"]
Probes feed constants into the Lean spine. Mathlib is pinned, not copied; the project README also names Lean-RH, PhysLean, Carleson and PrimeNumberTheoremAnd, which are not pinned and not imported. The last arrow is the goal, not a result.
What is in the project
formal/lean/: thePrimeRiemannBridgetheorem spine. The folder holds 23.leanfiles: 17 spine files plus 6 small scratch probes (dot-prefixed.codex_*files, a few lines each). The project README states no axioms; a search of the 23 files finds noaxiomdeclaration (two comment lines only). It comes withlakefile.toml(which requires only mathlib),lake-manifest.json(mathlib and its transitive packages), a Lean v4.28.0lean-toolchain, and three verification scripts.- 185 Python scripts at the top level: probes, ledgers, majorant checkers and proof-obligation tooling, grouped by prefix (
a1toa4,o1too5,k1,tau12,fixed_error_psi,spinning_top,build_*). data/: reference data (19 JSON files: 12 arXiv listings and 7 zeta-zero tables from LMFDB and Odlyzko; sizes not re-checked here).
A "majorant" is an upper bound that dominates the quantity being studied; most scripts check numerically that such a bound holds in a range, or turn a bound into a constant for the Lean files. A numerical check in a range is not a proof for all numbers.
Casey Allard started this as a standalone local project. It was never part of the AI-Research or Prime-Analysis repositories (research/riemann-lean/README.md). The external Lean dependencies are fetched with lake exe cache get or lake update; their sources are not stored here because they are third-party, large and regenerable.
Relationship to Prime Analysis
The prime-analysis/ project holds a folder named formal-math-lean, which contains 185 Python files. Comparing the two trees byte by byte shows all 185 are identical to the ones here (measurement, checked on the local copies on 19 October 2026). The folder in Prime Analysis contains no .lean files. So this project is the canonical home of the Lean spine and of the probe scripts, and the Prime Analysis copy is a duplicate to be recorded, not imported twice. Which of the two the owner wants as canonical is an open decision; the inventory favours this one because it is small and holds the Lean source.
Where it stands
| Statement | Kind | Evidence |
|---|---|---|
The folder holds 23 .lean files (17 spine plus 6 scratch probes) | measurement (file count) | hash listing in files.sha256 |
No axiom declaration in those files; the chain is conditional on imported-result hypotheses | measurement (text search, scope: the 23 files) plus the project's own statement | formal/lean/README.md, which says transfer assumptions are still to be replaced |
| The spine builds against the pinned libraries | not established by this page | Verification scripts exist (verify_formal_proof*.sh); no build log was inspected for this page |
| The Riemann hypothesis follows from this chain | hypothesis, unproved | The goal of the scaffold; the project itself does not claim it |
| Probe scripts show the inequalities hold on the ranges tested | measurement for the ranges tested only, if the scripts are run | The scripts are in the project; their outputs were not inspected for this page |
| Relevance to the model | none on the model path | Charter: side project |
The words "formalization scaffold" in the README are the correct reading. Treat any numerical agreement as exploration.
Where the originals are
The full project is preserved in the private Hugging Face dataset caseyallard/uor-r4-store under research-archive/2026-10-19/tars/riemann-lean.tar (7,279,616 bytes, 248 files, SHA-256 45b4a16ed2fbca6d99595299b697e09569747d468de39bb94a33ee3307cd455d). Every file inside is listed in files.sha256, and the tar is listed in tars.sha256.
Source files brought into this folder
All of it is source and small, so nearly everything comes in:
README.mdformal/lean/**/*.lean,lakefile.toml,lake-manifest.json,lean-toolchain, and the threeverify_formal_proof*.shscripts- the 185 top-level
*.pyfiles data/**/*.json(optional; moves to the store if the owner prefers)
Not brought in: .lake build cache, .olean files, vendored Python binaries and .npz caches. They were already excluded from the original and can be rebuilt.
Go deeper
- Prime Analysis for the manuscripts and the theory notes behind this scaffold.
- Primes and zeta for how the model uses zeta zeros (a fixed list of phases), which is a different use from proving a statement about all of them.
- Glossary.
SpiralCore: networking protocols and compression
SpiralCore is a set of geometry ideas (by Matthew) that the language model borrows: a fixed graph of rotations in eight dimensions, with exact bookkeeping of the path taken between two points. This project poses a different question about the same family of ideas: could they help move and shrink data across a network? That question is posed here, not yet tested: the code that exists uses plain zlib framing with no SpiralCore routing. The folder also keeps two SpiralCore references. It is a side project. It is not wired into the model's training or serving, and nothing here is evidence that the model works.
flowchart LR
A["App or unmodified program"] --> B["Wire layer: UORADP01 framing, zlib or raw per direction"]
B --> C["Network"]
C --> D["Wire layer at the far end"]
D --> E["Service"]
R1["Reference: SpiralCore v68 HTML"] -. "consulted" .-> M["Model mechanism: SpiralCore/FBS projection"]
R2["Reference: Atomic Ternary FBS r3.1 PDF"] -. "consulted" .-> M
R1 -. "future: not built yet" .-> B
Left: the wire transport that exists today. Right: the two preserved references, which were consulted but are not the build source of the model's mechanism (that follows a v63 reference and a hosted v69 file). The dashed line from the reference to the wire layer is a plan, not code.
What is in the project
The project has two parts that arrived at different times.
1. The wire transport exploration (code). One framing for compressed traffic, exposed four ways: a pair of proxies (a plain app talks to a local edge, the edge talks compressed to a gateway, the gateway talks to the service), a socket library the app links directly, a process interposer that makes unmodified programs use the wire (on macOS through DYLD_INSERT_LIBRARIES, on Linux through LD_PRELOAD), and opt-in multiplexing of several streams over one connection (UORADM01). The framing starts with a UORADP01 handshake, then length-prefixed frames with a raw-flag bit, so each direction can send zlib-compressed or raw data. There are 36 tool files (16 Python, 17 shell, 3 C) and a Rust crate, wire-rs, that is not part of the model's Cargo workspace.
This work currently sits at spiralcore-base/wire (82 files). It was copied from a separate review repository at commit 032d903, which keeps the full history. It will move into this folder.
2. The owner-supplied references (documents). Two sources the owner brought in on 13 September 2026, preserved byte for byte:
| Source | What it is | SHA-256 |
|---|---|---|
Spiralcore_Dodecahedron_IP_Schema_v68.html (about 1 MB) | An executable reference: prompt-trace handler, address functions, E8 addressing and operator routing, a Bell-tone codec, breadth-first search, orbit tracing and a Kuramoto phase solver | 2a45c2e5f46c8c36bf7801da1d1e12ee9e2ed8b3da488ff54c20a6ac6c2ceab0 |
atomic-ternary-fbs-reference-r3.1.pdf (about 3 MB) | "Atomic Ternary FBS Formal Consolidated Reference", revision 3.1 | 917cb942811971d63cbe499f3a1641d3360c4dde7ebdc6b87e298c3cf1bbd747 |
Also kept: provenance.json (original paths, byte counts and hashes) and a plain-text extract of the mathematics. The scripts in the HTML file were not executed during import, and its embedded fixture claims were not re-run (research/spiralcore-v68/README.md).
How the pieces fit
The HTML reference defines a fixed graph of rotations over the 16 roots of one E8 anchor orbit, and a search that returns an ordered history between two roots. The model's SpiralCore/FBS mechanism follows a related convention (the v63 reference, implemented in crates/uor-r4-core/src/spiralcore_operator.rs, and a hosted v69 file reviewed on 9 October), not this v68 file. The idea is the same family: an output block picks one stored atom and moves it along a short path of signed coordinate swaps (see the mechanism page and the geometry explainer). The wire transport does not use any of this yet. Its framing is plain length-prefixed zlib, chosen for interoperability.
Where it stands
| Claim | Kind | Evidence |
|---|---|---|
| The wire framing, socket layer, interposer and mux interoperate: 18 of 18 legs of the interop matrix pass | measurement (loopback, one machine; a manual host regression, not CI; needs a built objpeer, and the Linux interposer leg needs an mvm microVM) | spiralcore-base/wire/README.md, tools/wire_interop_matrix.sh; lab record docs/labs/wire-matrix-repro-2026-10-18/README.md |
| 1 KiB round trip: wire 41.8 microseconds against plain TCP 55.1 microseconds | measurement (loopback, host-load sensitive) | spiralcore-base/wire/README.md |
| Rust peer, 1.25 MiB compressed: 2.10 / 2.86 / 3.30 ms (min / mean / max); plain TCP 1.52 / 1.92 / 2.16 ms | measurement (loopback) | same |
Compression backend zlib-rs matches miniz_oxide on ratio (0.24489 against 0.24480 on a realistic corpus) | measurement | same |
| The framing adds no encryption or authentication | proof (by inspection of the design: none is specified) | same; use TLS, WireGuard or SSH outside it |
| SpiralCore routing helps compression or transport | hypothesis | the README says "no SpiralCore/FBS routing integration" |
| The references improve the language model | hypothesis | the import record (research/spiralcore-v68/README.md) calls them consulted references, not model components |
Limits stated by the project itself: loopback numbers depend on machine load; the interposer is macOS and Linux only, numeric IPv4 only, with blocking connect; the residual cost measured is compression CPU, not framing copies or threads.
Where the originals are
The two references were part of the owner's untracked research/ folder. The full original tree is preserved in the private Hugging Face dataset caseyallard/uor-r4-store under research-archive/2026-10-19/tars/spiralcore-v68.tar (3,796,480 bytes, 5 files, SHA-256 dfcb839d896d47d5eda0afe646da72331a03b080acfa55607bf331e9f8091a05). Every file inside is listed in files.sha256 in the parent folder, and the tar is listed in tars.sha256 there. Copies of the originals also remain in the owner's Downloads folder.
Source files brought into this folder
- From
spiralcore-base/wire: all 82 files (tools,crates/wire-rs,docs, boundedevidence), unchanged. - From
research/spiralcore-v68:README.md,provenance.json, the mathematics extract, the v68 HTML (placed underreference/) and the FBS PDF (about 3 MB; stays in the store if the size policy says so, with its hash recorded here).
Go deeper
- Records:
docs/labs/spiralcore-wire-side-2026-10-18/README.md,docs/labs/wire-counter-aggregation-2026-10-18/README.md,docs/labs/wire-matrix-repro-2026-10-18/README.md,docs/labs/uorobj01-conformance-2026-10-18/README.md. - The older projection records for the model's own use of SpiralCore are in
archive/labs/(see the mechanism page for links). - Related project:
wasm-gemm-gnaf/is another independent side project; it does not use SpiralCore.
WASM-GEMM-GNAF: a Lean proof project about a matrix-multiply kernel
This project tries to prove, with a proof assistant called Lean 4, that one specific small program is the best possible program of its kind. The program is a matrix-multiplication kernel (GEMM) written for WebAssembly, the portable code format that runs in browsers. "Best possible" has a precise meaning set by the project: lowest score on a fixed cost formula, among every program that does the same job. The proof is not finished. The project's own result today is the honest answer "incomplete". It is a side project: it does not train, serve or test the language model, and the model's own rules forbid dense matrix multiplication, so this work is unrelated to how the model computes. It is outside every model build and every loaded path; whether the model ratchet's scan scope covers this folder was not checked for this page.
flowchart TD
A["Authority: pinned UOR-GNAF draft.2 spec and the fixed claim WGG-GO-1"] --> B["Lean model of WebAssembly: encode, decode, step, cost"]
B --> C["Cost objective: 36 charged coordinates, weight one each"]
C --> D["Proved: a best program exists if any program exists"]
D --> E["Still to show: a concrete program exists, and it equals the committed binary"]
E -.-> F["Release theorem: global optimality. Not established"]
The proof structure. Solid boxes are done; the last arrow is the goal, which has not been reached.
What the project is
It is a Lean 4 library of 141 files (about 3.4 MB) with a normative specification (SPEC.md), an obligation ledger (CERTIFICATION.md), a claim registry (model/claims.json), pinned copies of its authority documents under authority/, fixtures, tooling and its own licences (Apache-2.0 or MIT, at your option). It currently lives at proofs/wasm-gemm-gnaf and moves to this folder.
"GNAF" is the name of the authority document the project follows, UOR-GNAF version 1 draft 2, whose text is pinned by a SHA-256 hash. The requested claim, GlobalOptimal, ranges over all finite byte sequences that decode and validate as a WebAssembly module under the chosen profile. It does not range over a hand-picked family of kernels.
How it works
The project defines a cost vector with 36 charged coordinates and a canonical score, the weight-one sum of those coordinates. It models the binary format and the step relation of a subset of WebAssembly, and shows that its cost instrumentation does not change what a program computes. One key fact: each coordinate is at most the score, so every set of programs below a given score is finite. That lets a minimum exist.
With that, the project proves that if some valid program exists, a lowest-scoring one exists and satisfies the optimality statement. What is left is not a bound but an exhibition: build one concrete program with proofs that it qualifies, then show the committed binary is the program the minimum selects.
Where it stands
All rows come from the project's own README and conformance table (proofs/wasm-gemm-gnaf/README.md, CONFORMANCE.md, CERTIFICATION.md). They are not re-run for this page.
| Statement | Kind | Evidence |
|---|---|---|
| The library has 97 Lean modules, 55,504 lines and 3,146 proved theorems | measurement (generated inventory, Lean 4.30.0) | CONFORMANCE.md, first line |
The proved results contain no sorry; their axioms are the three Lean core axioms | measurement (stated by the project, not re-checked here) | README.md |
A lowest-scoring valid program exists, given that at least one exists (exists_globalOptimal_of_nonempty) | proof (kernel-checked in Lean, per the README) | README.md, table of proved declarations |
Cost instrumentation is transparent: instrumented and plain runs agree (costed_run_iff_plain_run) | proof (same) | same |
| Global optimality of the committed binary | not established | README.md Status block; terminal answer WorkloadIncomplete in CERTIFICATION.md |
Open obligations: a concrete nonempty witness (GO-006), identifying the committed bytes with the minimizer (GO-007), full WebAssembly 3.0 semantics beyond the modelled i32 subset (WS-001), covering all four arithmetic modes (BI-002) | open | README.md |
| The WebAssembly core 3.0 specification is vendored | no | pinned by commit, marked not vendored |
| "Optimal" means faster on a real machine | no. It means lowest on the abstract cost formula, and says nothing about latency on any engine | README.md, scope section |
The gate just vv fails at step 9 | by design. A green gate in this state would mean the gate had been weakened | README.md |
The README forbids editing its status paragraph while the proof is open, and the project rule is: if you cannot prove it, omit it. No unproved statement is stubbed or assumed.
How it connects to this repository
The root repository's xtask tool has gnaf-* subcommands (xtask/src/gnaf_*.rs, six files on main) that read this tree, and about 26 documents mention it. Those files move together with the project. The repository's manually dispatched workflow formal_verification.yml (not scheduled) runs the Kani model checker over a different crate, uor-r4-proof-model, not this Lean tree, and no CI step builds the Lean project (folder audit, docs/labs/repo-renormalization-2026-10-19/audit/folders.json). Do not read a green CI run as a check on these proofs.
Where the originals are
This project is already tracked in git, so it has no Hugging Face tar. It is not part of the 19 October backup of the untracked research/ folder. The source is preserved by origin/main itself.
Source files brought into this folder
All 141 files move with their history by git mv, together with the matching xtask/src/gnaf_*.rs subcommands and the xtask entries that reference the old path. No file is dropped.
Go deeper
- Inside the project:
SPEC.md(the contract),CERTIFICATION.md(the obligation ledger),VERIFICATION.md,CONFORMANCE.md. - Project index for the other side projects.
- Charter for the model's own rules, which are separate from this project.
- Glossary.