mini-beatrix-2s / TECHNICAL.md
AbstractPhil's picture
TECHNICAL companion for the 2s era (verified code-side + hub-side, 2026-09-04)
907da49 verified
|
Raw History Blame Contribute Delete
65.9 kB
<!-- VERIFIED 2026-09-04: code-side (wf_15fc8b16) and hub-side (wf ft2-finish) passes applied. -->
# alephllm-mini-beatrix-training β€” Technical Companion (the 2s era: the full-splat craft and its softmax twin)
Companion to *Twinning Beatrix: A Full-Splat Byte Model, Its Softmax
Control, and What Reaches an Image Generator* (AbstractPhil with Claude
Fable 5 and Claude Fable 5.1, September 2026). It covers two crafts and
one packaged model: `mini-beatrix-2s/` and `mini-beatrix-2s-control/`
under AbstractPhil/alephllm-mini-beatrix-training, and the AutoModel at
AbstractPhil/mini-beatrix-2s; the dates run from the first launch
(run0, 2026-08-26) through the control's endpoint (2026-09-03) and the
claim audit that graded it (2026-09-04). It is written for a reader who
will load the checkpoints and read the reports. It is not the
mini-beatrix-1 life record (`TECHNICAL.md`, which stays as it is), not
the article's argument, and not a manual for the side campaigns that
share the repo root (`reports/v2/{battery,wide_moe,aflow,bcd}` appear
only as a catalogue line). Every number carries its pointer: `file:line`
means E:/mirel/AlephLLM/geolip/alephllm/ at HEAD 4f4b7d6 (package
0.8.7, the last commit of the 2s era); hub paths are relative to the
craft prefix; journal paths are relative to the claude-mind repo. Where
the journal and the code disagree, the code wins and the disagreement
is reported in place. Stack-side detail lives in the
[AlephLLM companion](https://github.com/AbstractEyes/alephllm), which
covers the 0.7.0 mechanisms only; the 0.8.x organs (specials, driver
contract, revival, gauge fallback, twin isolation) are carried here.
## The two crafts at a glance
| | mini-beatrix-2s | mini-beatrix-2s-control | mini-beatrix-1 |
|---|---|---|---|
| d_model / layers / heads | 1024 / 20 / 16 | 1024 / 20 / 16 | 768 / 16 / 12 |
| attention | CausalSplatHUB in all 20 blocks | CausalSDPA (16 Γ— 64) in all 20 | 13 sdpa + 3 hubs (layers 4, 9, 14) |
| hub books Γ— anchors @ D | 4 Γ— 64 @ 128 (supply 0.5Γ—) | β€” | 1 Γ— 512 @ 32 (supply 16Γ—) |
| banks | 3 experts @ ff 1024 | 3 @ 1024 | 3 @ 768 (full width) |
| head (K @ D) | 256 @ 256, revived at 24,860, address frozen after | 256 @ 256, born null, never elected | 512 @ 32, never elected (W_s = 0.0 at ship) |
| context / vocab | 4096 / 256 byte-trigram | 4096 / 256 | 2048 / 256 |
| params | 237,125,949 | 257,442,109 (+20,316,160, all attention) | 112,524,593 |
| tokens per step | 16 Γ— 4 Γ— 4096 = 262,144 | 262,144 | 48 Γ— 3 Γ— 2048 = 294,912 |
| steps / tokens | 61,422 / 16,101,408,768 | 61,422 / 16,101,408,768 | 88,508 / 26,102,071,296 |
| wall-hours / hosts | 78.33 on one RTX PRO 6000 | 49.98 on three hosts | 70.45 |
| final val bpb (report ledger) | **1.1097** | **2.8846** | 1.121 |
| optimizer | Muon 2e-2 + pure Adam 3e-4, flat after 200 | same | same |
| governor | minsep 45Β°, every 8 steps, from birth | inherited (head book only) | off |
| package at birth β†’ end | 0.8.1 β†’ 0.8.6 (revival under 0.8.2) | 0.8.7 throughout | cc89a87 β†’ 0.6.0 (pre-specials) |
Shape and knobs: `presets.py:191-203` (2s), `:214-235` (the `-control`
derivation and the head_addr_frozen override), `:155-160` (mb1).
Parameter counts were computed by constructing each preset on the meta
device (`alephlm.py:218-224` `param_count`): 2s = embed 4,982,784 +
20 blocks Γ— 11,574,275 (hub attention 3,178,496 + bank 8,391,683 +
norms 4,096) + final norm 2,048 + head 655,617; the control's block
swaps the hub's 3,178,496 for sdpa's 4,194,304 (qkv 3072Γ—1024 + o
1024Γ—1024, no biases; `attention.py:24-32`). Tokens per step is
`micro_batch Γ— grad_accum Γ— context` (`trainer.py:186`); 61,422 Γ—
262,144 lands on both manifests' `tokens_seen` exactly. The mother's
numbers are the exemplar's (`TECHNICAL.md`, `mini-beatrix-1/manifest.json`).
## Layout
```
mini-beatrix-2s/
manifest.json # 14 phases, 142 checkpoint entries, notes
checkpoints/step_XXXXXXXX.safetensors # 46 bf16 (2000-cadence + every boundary and cap)
checkpoints/step_00024860_revived.safetensors # fp32, the post-BOUNDARY-WRITE head
checkpoints/fp8/ # 20 e4m3 ship-only copies
resume/latest.pt # fp32 model + Muon/Adam + stream + RNG + manifest
resume/boundary_<phase>_step<N>.pt # 13 immutable boundary archives
resume/pre_revival_step24860.pt # the state the revival overwrote
reports/v2/ # 13 boundary + 3 session_cap + revival + 4 cultivation
runs/ # 5 TensorBoard event files (one per session)
archive/run0-nospecials/ # the pre-specials first attempt, whole
beatrix_v2_colab.ipynb # the driver
mini-beatrix-2s-control/
manifest.json # identical phases and budgets; 136 entries
checkpoints/step_XXXXXXXX.safetensors # 44 bf16 (incl. the 22,854 cap)
checkpoints/fp8/ # 20 e4m3 ship-only copies
resume/latest.pt resume/boundary_*.pt # latest + 13 boundary archives
reports/v2/ # 13 boundary + 2 session_cap (22,854; 53,792)
runs/ # 6 event files (two are 88-byte aborted starts)
```
The control has no notebook file and no AutoModel packaging; these
checkpoints are its weights. Files: bf16 475,876,922 B (2s) and
515,164,234 B (control); fp8 238,219,518 / 257,813,142 B; resume
archives ~1.904 / ~2.064 GB each; the revived fp32 file 951,692,996 B
(hub headers read by ranged GET; `checkpoint.py:102-128` for the two
export rules).
## Architecture in detail
**The block.** Pre-norm, two residual branches: `x = x + attn(n1(x))`,
`x = x + bank(n2(x))` (`alephlm.py:37-70`). `attn` is CausalSplatHUB
when the layer index is in `hub_layers`, else CausalSDPA
(`alephlm.py:41-50`); every block carries an AnchoredBank
(`alephlm.py:51`). `hub_ckpt` (0 on 2s: the retained scan fits the
96 GB card at 237M, `presets.py:184-198`) would wrap the branches in
activation checkpointing (`alephlm.py:60-68`). The model is embedding β†’
20 blocks β†’ final LayerNorm β†’ DualHead (`alephlm.py:81-96`); `forward`
takes pre-shifted `targets` (ours) or HF-style `labels` (shifted
internally) and ignores `attention_mask` deliberately
(`alephlm.py:98-124`).
**Trigram embedding and positions.** `e_t = emb0[x_t] + emb1[x_{t-1}] +
emb2[x_{t-2}] + pos[t]`; the shift tables have a 257th PAD_ROW so the
two positions shifted in at the sequence start never read a legal byte
(`embedding.py:19-34`; the pad law β€” padding with a real byte starved
address consumption, measured +.05..+.11 on repair). `pos` is a learned
absolute table `(1, 4096, 1024)` (`embedding.py:28`); there is no RoPE.
**CausalSplatHUB β€” the address.** Each book is an `AlephAddress`: K unit
anchors in D dims (`address.py:24-36`, with a `home` buffer holding the
birth copy for drift). The read is a cosine at temperature,
`u_k = cos(xΜ‚, Γ’_k)/Ο„` with Ο„ = 0.1 (`address.py:38-40`); the oriented
form is the 2K-softmax over the axes `(+a_k, βˆ’a_k)`, and the signed read
is its half-difference `w_k = sinh(u_k)/Ξ£_j cosh(u_j)` β€” inhibition
(negative w) is first-class; there is no softmax over choices, no
argmax, no top-k (`address.py:1-13,42-66`). The hub's q and k frames are
`Linear(d, D)` per book, orthogonal-init; v and o are shared `Linear(d,
d)` (`attention.py:64-79,106-109`). Construction warns when K > 2D β€” the
supply law from ROUND 5e and the mini-beatrix-1 hub census
(`attention.py:85-92`); 2s runs 64 @ 128, half of the lawful ceiling.
**CausalSplatHUB β€” books and budget.** With `n_const = 4` the four books
each own a codebook and q/k frames (`attention.py:64-79`); their
numerators and agreement masses are summed across books before the one
divide β€” composition by budget, never softmax over books
(`attention.py:245-254`; B4 measured comparative composition at βˆ’.10).
`n_const = 1` is the v1 layout with the same state-dict keys
(`attention.py:93-101`), which is how mini-beatrix-1 checkpoints still
load.
**CausalSplatHUB β€” the exact chunked scan (prefix memory).**
`_code_cat_qk` computes q and k for all books in one stacked GEMM,
folds the row-norm and Ο„ into one post-GEMM scale, and takes ONE fused
softmax over `cat([u, βˆ’u])` β€” the module's docstring names this a
kernel substitution, not a mechanism change: the softmax that exists is
over the 2K oriented axes of a single query, never over positions
(`attention.py:154-212`). `_scan_cat` splits the sequence into chunks of
C = 256 (16 chunks at ctx 4096), forms per-chunk `(2K Γ— d)` sums, takes
the exclusive prefix over chunks as a strictly-lower-triangular GEMM
with fp32 accumulation, adds the within-chunk causal affinity, and
divides the numerator by the scalar agreement mass `den`, floored at
`dtype_floor` (`attention.py:139-151,229-281`; `address.py:16-22`: fp16
flushes 1e-12 to zero, the measured landmine). Exactness is
chunk-independent (`forward_naive` is the oracle, `attention.py:320`;
fp reorder ~1.5e-06). Decode carries a constant-size state per book β€”
`{Ξ£ kβΊβŠ—v, Ξ£ kβ»βŠ—v, Ξ£ k⁺, Ξ£ k⁻}` β€” regardless of length
(`attention.py:284-318`); the generate path falls back to a sliding
window once the position table is exhausted because "the hub's
constant-size state cannot evict" (`alephlm.py:180-201`).
**The autocast trap.** `torch.einsum` sits in autocast's PROMOTE
category and `F.normalize`/`exp`/`softmax` on its fp32 list, so one fp32
operand dragged the whole scan to fp32 (`attention.py:167`); 0.7.2
(@2be28dd) cast the operands explicitly. Every earlier "bf16" splat run
had silently run fp32 scans; sdpa was unaffected β€” so every pre-0.7.2
splat-vs-sdpa wall-clock comparison favoured sdpa, and accuracy
verdicts stand (autocast einsum-promote law).
**The governor.** `minsep_project_` bounds `|cos(a_i, a_j)| ≀
cos(ΞΈ_min)` for every anchor pair by an exact symmetric geodesic
push-apart, largest violation first, projected to ΞΈ_min + 0.5Β°
(`governor.py:35-80`); `govern_model` collects hub and head codebooks,
runs one batched `bmm` slack check with one device sync, and projects
only the violating books (`governor.py:92-137`). It is a
post-optimizer-step projection, never an auxiliary loss
(`governor.py:11`); the trainer calls it every 8 steps after `opt.step`
and accumulates pair-pushes into `governor/hits_cum`
(`trainer.py:263-267,294-296`; `presets.py:99-105`: ΞΈ = 45Β°). Banks are
excluded by default (a 3-anchor book never crowds). The docstring
records the small-rig verdict it shipped on (gov25m: fires only when
needed, census tail cut 5.4Γ—, fragile-seed +.007, stable-seed +.002;
`governor.py:19`). Code-wins note: the journal's covariance program
describes a *metric* governor through the frame W_a; alephllm's is the
plain projective form on the D-space books, justified in place β€”
"Hub and head codebooks live natively in their own D-dim address space"
(`governor.py:14`), since the q/k frames project d β†’ D before the cosine
read (`address.py:38-40`).
**CausalSDPA in the twin.** `qkv = Linear(d, 3d)`, `o = Linear(d, d)`,
both orthogonal-init and bias-free; `F.scaled_dot_product_attention(q,
k, v, is_causal=True)` over 16 heads of 64 (`attention.py:24-42`);
the KV cache grows O(n) (`attention.py:43-61`). No QK-norm, no logit
softcap.
**AnchoredBank.** `Bank(x) = trunk(x) + Ξ£_k w_k(x)Β·Οƒ(g_k)Β·expert_k(x)`
(`bank.py:3`): a dense trunk `t_out(GELU(t_in(x)))`, three experts
`(3, 1024, 1024)` with `w_out` zero-initialised (the null path), gates
at βˆ’3.0, and dispatch `w = addr.signed(x)` through a 3-anchor book in d
dims. `disable_dispatch` returns the trunk alone β€” bit-identical to the
dense control at birth (the C6 null); "No balance machinery of any
kind" (`bank.py:10,41-50`).
**DualHead.** `logits = W_h h + Ξ³Β·W_s s(h)`, `s(h) = addr.signed(proj(h))`
with proj `Linear(1024, 256)`, a 256 @ 256 book, `W_s` zero-initialised
("weight-zero: self-starting") and Ξ³ = 1 frozen as an ablation knob
(`head.py:23-51`). The docstring carries the law that set it: on
mini-beatrix-1 over 8.4B tokens a gamma-gated branch DEADLOCKS while a
weight-zero bank elected into +2 bpb (`head.py:8-11`; gate-zero deadlock
law). `disable_aleph` returns `W_h h` alone β€” the head toggle.
**The special-token control plane.** Thirteen ids that no UTF-8 encoder
can emit β€” `{0xC0, 0xC1} βˆͺ [0xF5, 0xFF]`, the overlong leads and the
leads past U+10FFFF β€” carry structure inside vocab 256: DOC 0xFF, USER
0xFE, MODEL 0xFD, END 0xFC, SYS 0xFB, THINK 0xFA, DATA 0xF9, SEP 0xF8,
MODE 0xF7 (+1 ASCII payload), CUE 0xF6, ESC 0xF5 (+payload = 256
extended slots; 0x00 the null guard, 0x01 CANARY), RES0 0xC0, RES1
0xC1 (`special_tokens.py:20-34,50-71`; `assert len(SPECIALS) == 13`).
The proof is exhaustive β€” every codepoint 0..0x10FFFF encoded and
checked β€” and the Trainer runs it at every byte-craft launch
(`trainer.py:72-73`). Doctrine: DOC is appended by the packer after
every document in every phase from birth, identity-gated to the
byte-trigram tokenizer (`streams.py:59-62,209,355-356`); the chat frame `[SYS] text
[END] [USER] text [END] [MODEL] text [END]` (`special_tokens.py:112-136`)
is unforgeable (content is UTF-8) and appears only in the anneal
(`special_tokens.py:36-44`; chat-in-anneal law). The canary frame moved
to CUE/SEP because the old QRY=255 collided with DOC
(`canaries.py:20-29`); `recall_acc` re-baselines at 0.8.0. The trigram
embedding feeds each special into the next two positions' input
representations by construction.
## The recipe (pinned from source; unchanged cc89a87 β†’ b472815)
- **Split**: every parameter with `ndim ∈ {2, 3}` that is not an
`nn.Embedding` weight rides Muon; everything else β€” the three byte
tables, LayerNorms, bank gates, Ξ³, the head bias β€” rides
`torch.optim.Adam(weight_decay=0.0)` (`optim.py:54-79`; "pure Adam,
wd=0 β€” never AdamW", `presets.py:82`). Measured split for 2s: Muon 385
tensors / 236,253,184 numel, Adam 107 / 872,765; the control's Muon
set is 145 / 256,569,344 with the same Adam set. Code-wins note: the
`optim.py:4-5,55-58` docstrings say positions ride Adam; the code
sends `embed.pos` (shape `(1, 4096, 1024)`, ndim 3, not an
`nn.Embedding`) to Muon (`optim.py:68`), verified on the meta device.
The journal already records the code's behaviour.
- **Muon**: 5-step Newton–Schulz (a, b, c = 3.4445, βˆ’4.7750, 2.0315) on
the momentum buffer after whole-matrix Frobenius normalisation
`X/(β€–Xβ€–_F + 1e-7)`; plain momentum 0.95, no Nesterov, no shape
scaling; 3-D stacks orthogonalised per slice (`optim.py:20-51`).
- **Learning rates**: Muon 2e-2, Adam 3e-4; `lr_scale = (step+1)/200`
for 200 steps, then 1.0 forever (`optim.py:82-93`, `presets.py:80-83`).
The tfevents read `train/lr_scale` 0.25/0.50/0.75 at steps 50/100/150
and 1.000 from step 200 to the last log on both crafts, through both
anneal phases: the anneal is a diet change, not a decay.
- **Clip**: `clip_grad_norm_(…, 1.0)` over all parameters; the logged
`train/grad_norm` is the PRE-clip norm it returns (`trainer.py:244,
287`). Because Muon normalises the momentum buffer before
orthogonalising, its update magnitude is independent of gradient
scale: clipping never changes the magnitude of a Muon step; it only reweights
steps inside the momentum buffer. The Adam set (`torch.optim.Adam`,
wd 0, default eps 1e-8; `optim.py:79`) is per-coordinate
scale-normalised (`m/sqrt(v)`), so under a persistent clip its step
magnitude is likewise unchanged and the clip only reweights the two
moment averages (Muon is clip-blind; Adam is nearly so).
- **Precision and batch**: fp32 masters, bf16 autocast on CUDA, TF32 on
(`trainer.py:14-15,65-66,239`); micro-batch 16 Γ— accum 4 Γ— ctx 4096;
seed 1337 (`presets.py:97,199`); each micro-batch row is 4097 ids
scored at 4096 positions.
- **Guards**: a non-finite loss or gradient raises before any optimizer
step, weights untouched and the resume state not overwritten
(`trainer.py:250`); the spike flag `loss > 2Β·EMA + 0.5` is logged
only (`trainer.py:273-275,293`). Neither fired on either craft.
- **Cadences**: log 50, health census 500, eval and checkpoint 2000,
fp8 every 5th checkpoint, TB upload 1000, val 262,144 tokens, 128
canary episodes (`presets.py:88-96`).
- **Absent by design**: no QK-norm, no logit softcap, no z-loss, no
weight decay, no dropout, no RoPE, no LR decay in any phase.
## The diet (all on one gauge: fineweb-edu holdout bpb)
| phase | dataset | budget | β†’ step | 2s bpb | control bpb | note |
|---|---|---|---|---|---|---|
| warmup_wikitext | wikitext-103 | 0.30B | 1,145 | 2.3626 | 2.1056 | sdpa led by 0.257; protocol pre-registered here |
| fineweb_main | fineweb-edu | 5.0B | 20,219 | **1.1172** | 1.1763 | the crossover; hubs +2.22 / banks +3.55 |
| fineweb_extended | fineweb-edu | 10B | β€” | β€” | β€” | DEFERRED, unspent on both |
| curriculum_s0 | curriculum-s0 | 0.7B | 22,890 | 1.2522 | 1.5047 | |
| REVIVAL | β€” | β€” | 24,860 | 1.2768 β†’ 1.2339 (op gauge) | β€” | BOUNDARY-WRITE; `pre_revival_step24860.pt` archived |
| curriculum_s1 | curriculum-s1 | 0.7B | 25,561 | 1.2544 | 1.3917 | first live head toggle in the lineage, +0.0258 |
| curriculum_s2 | curriculum-s2 | 1.0B | 29,376 | 1.2177 | 1.3938 | 2s grad-norm curriculum+anneal max 0.619 @26,750 |
| curriculum_s3 | curriculum-s3 | 1.2B | 33,954 | 1.2318 | 1.5317 | |
| curriculum_s4 | curriculum-s4 | 1.2B | 38,532 | 1.2356 | 1.5689 | both 2s mechanisms above +3.0 |
| curriculum_s5 | curriculum-s5 | 1.0B | 42,347 | 1.2504 | 2.1762 | control grad-norm median 126 |
| curriculum_s6 | curriculum-s6 | 0.8B | 45,399 | 1.2683 | 3.1940 | control max 41,070 @44,600 |
| curriculum_s7 | curriculum-s7 | 1.4B | 50,740 | 1.1883 | 3.1201 | |
| curriculum_s8 | curriculum-s8 | 0.8B | 53,792 | *1.0737* (synthetic gauge) / **1.1911** (cap) | 3.0810 | 2s row STRUCK; true ledger = `session_cap_step53792` |
| anneal_nochat | anneal-nochat | 1.0B | 57,607 | 1.1153 | 2.9270 | the pre-chat baseline; probe mean .389 |
| anneal_mix | anneal-mix | 1.0B | 61,422 | **1.1097** | **2.8846** | run best; probe mean .389 == pre-chat |
Phases and budgets: `presets.py:132-146` (the preset plan carries
anneal_mix at 2B deferred; the notebook's C6 cell rewrote it to 1B and
inserted anneal_nochat before it β€” "two-phase anneal activated: nochat
1B then chat 1B (plan of record 2026-08-31)" in both manifests' notes; the
hub copy of `beatrix_v2_colab.ipynb`, uploaded 2026-08-28T23:00Z with cells
C1–C5 and pinned to `geolip-alephllm @2a902b7` (0.8.1), predates the
amendment and carries no C6 cell),
`curriculum.py:657-663` (STAGE_TOKENS), `curriculum.py:666-689`
(append at runtime). Manifest order is not chronology: the S0–S8 phases
are listed after the anneals but ran before them, because
`current_phase()` activates the first `planned` phase and deferred
phases are invisible until flipped (`manifest.py:33-41`); count back
from the totals (16,101,408,768 βˆ’ anneal_mix's 1,000,079,360 lands on
step 57,607) rather than reading the list.
**The mixes** (`curriculum.py:614-655`; weights sum to 1): s0
tinystories .74, simple-wiki .20, aochildes .01, recall-synth .03,
counting-synth .02 Β· s1 perspective-synth .30, tinystories .28,
simple-wiki .20, cosmo-young .12, concept-synth .04, recall-synth .03,
siqa-narrative .02, aochildes .01 Β· s2 concept-synth .30, cosmo-young
.30, simple-wiki .12, tinystories .10, definitions .08, wikipedia-en
.07, recall-synth .03 Β· s3 rulechain-synth .32, proofwriter-prose .22,
simple-wiki .12, tinystories .10, wikipedia-en .08, cosmo-young .08,
concept-synth .04, recall-synth .03, babi-prose .01 Β· s4 arith-synth
.35, cosmo-young .32, simple-wiki .12, tinystories .08, rulechain-synth
.06, counting-synth .04, recall-synth .03 Β· s5 causal-synth .32,
atomic-flicker .25, tinystories .12, simple-wiki .10, gutenberg .08,
cosmo-young .07, recall-synth .05, siqa-narrative .01 Β· s6
tryfail-synth .32, tinystories .22, arith-synth .13, cosmo-young .10,
simple-wiki .10, causal-synth .08, recall-synth .05 Β· s7 tinystories
.10, cosmo-young .10, rulechain-synth .10, arith-synth .10, fineweb-good
.10, simple-wiki .08, atomic-flicker .08, causal-synth .08,
tryfail-synth .08, proofwriter-prose .08, recall-synth .05,
perspective-synth .04, babi-prose .01 Β· s8 definitions .25,
register-synth .25, simple-wiki .15, cosmo-young .12, wikipedia-en .10,
tinystories .09, recall-synth .03, siqa-narrative .01. Rails audited at
append time: MAX_EPOCHS 4.0, MAX_GENERATOR_SHARE 0.35, MIN_BALLAST 0.30
natural text (`curriculum.py:548-551,565-596`); holdouts enforced at
the generator β€” bAbI tasks 16/19, ProofWriter depth 5, rule-chain
depth 5, three-digit subtraction (`curriculum.py:26-31`). No chat
template in s0–s8.
**The anneal recipes** (`streams.py:68-77`): ANNEAL_MIX = fineweb-edu
.45, cosmopedia .20, tinystories .15, soda-dialogue .12,
beatrix-texture-sp .05 (the specials-native SYS/USER/MODEL/END
identity texture), recall-synth .03; ANNEAL_NOCHAT is the same list
minus beatrix-texture-sp, renormalised by MixStream β€” so the nochat
boundary is the exact pre-chat baseline on the same distribution.
MixStream draws one component per batch from a counter-seeded RNG
(`streams.py:375-404`): reproducible and resumable, but its state
carries no recipe fingerprint (fresh starts only across recipe
changes).
**The DOC plane on the diet.** The packer appends DOC after every
document (`streams.py:192-372`); the specials gauge reads `doc_bpb`
(bits at positions whose target is DOC) and `reset_bpb` (mean bits over
the 16 targets after each DOC) on the fixed val batches
(`instruments.py:310-352`). doc_bpb fell 12.83 β†’ 3.29 by 0.52B and
sits at 3.862 at the endpoint (control 5.422); reset_bpb 4.287 β†’ 2.130
(control 3.825). doc_count is 70 in every 2s and control report except the struck 2s
`curriculum_s8_step53792.json`, which reads doc_count 1612 (the synthetic
fallback stream) β€” the same 70 documents every time on the fineweb-edu gauge.
**The val gauge.** `_val()` builds 4 batches of (16, 4097) from
`build_stream(dataset, …, seed = 1337 + 9999, role="val")`
(`trainer.py:384-411`); for fineweb-edu the val region is the first
2,048 unshuffled rows, which the training stream skips
(`streams.py:56,279-282`), and `build_stream` routes every
`curriculum-*` and `anneal-*` val request to that same fineweb-edu head
holdout β€” "gauge continuity" in the source (`streams.py:423-447`). So
from fineweb_main onward every row of both crafts is one gauge; the
canon's CB2/CB3 "own slice" wording is struck by erratum
(`canon/splat_aleph_battery.md:583`). **The s8 fallback caveat**: at the
terminal curriculum boundary `current_phase()` is None (everything done
or deferred) and pre-0.8.5 `_val` fell to the `synthetic` stream, so the
2s `curriculum_s8_step53792` ledger is an incomparable artifact; 0.8.5
(@7d48328) makes `_val` fall back to the last DONE phase's dataset
(`trainer.py:397-401`), and the true end-of-curriculum ledger is
`session_cap_step53792`, taken at the same step on the restored gauge
(1.1911; banks +3.214, hubs +3.341, head +0.0149). The control, born
under 0.8.7, measured its s8 row on the repaired gauge; the s8 pair is
therefore not same-gauge and is struck from the paired count.
## The life (`reports/v2/`, `resume/`, `runs/`)
**Sessions.** The 2s craft ran five sessions on the one RTX PRO 6000
(Blackwell, 96 GB; 4.54 s/step, ~58k tok/s), each its own event file:
steps 50–8,300 (host 4d130c0e7351), 8,350–24,850 (91b9f3518593),
24,900–43,100 (e935248f0778), 43,150–53,750 (68304a2b8506),
53,800–61,400 (c2dc3d694638). The breaks are the session caps at 8,320
(fineweb, 2.181B), 43,130 (inside s6, 11.306B) and 53,792 (the s8 boundary
itself, the resumed session's first action) β€” `session_cap_step*.json`
is written when a session hits MAX_HOURS mid-phase β€” and the revival
halt at 24,860. Sessions are boundary-exact: the driver calls
`train(max_hours, stop_at_boundary=True)`, which returns after each
boundary checkpoint with `_last_boundary` set, and never auto-resumes a
manual stop (`_interrupted`; `trainer.py:170-184,328-335`; the 0.8.1
driver contract, minted after run0 rolled through its boundaries and
swallowed a KeyboardInterrupt).
**Resume.** `_restore` loads `resume/latest.pt` β€” fp32 model, both
optimizer states, the stream position, torch and CUDA RNG, and the
manifest snapshot embedded in the payload, which wins over the hub's
`manifest.json` (`trainer.py:110-153`; `checkpoint.py:131-175`). A
missing payload over a manifest with steps > 0 refuses to start fresh
(`trainer.py:110-120`). Every phase boundary archives an immutable copy
`resume/boundary_<phase>_step<N>.pt` (`trainer.py:469`;
`checkpoint.py:134-154`). Resume is not row-exact: the datasets shuffle
buffer (10,000 rows, `streams.py:292-293`) is not part of the saved
state, so each resume refills it (`streams.py:12`, the honesty note).
**The revival at 24,860.** The born-null head buried itself inside the
first 2,000 steps (0.032Γ— chance liveness at the first stored
checkpoint; β€–sβ€– ~6e-4; proj cosines ~60Γ— below chance β€” learned
avoidance; `repos/alephllm.md:1564-1643` β€” journal readings from
checkpoint analysis: the craft's TB carries no `head/liveness_ratio`
scalar before 0.8.4; the control's TB reads 0.052Γ— @2,000, 0.014Γ—
@12,000, 0.010Γ— @24,000). The BOUNDARY-WRITE op
(`revival.py:44-104`) ran on the halted run: proj ← uncentered
whitening-PCA of the final-norm outputs (sv floor 1e-3 relative);
codebook ← fresh `normalize(randn)` with min-sep 45Β° (0 pushes needed);
W_s ← fp64 ridge on the base head's CE residual, Ξ± swept on the held-out
half and folded in. `revival_step24860.json`: K 256, D 256, seed 13,
sv0 3676.66, svD 15.90, Ξ± 8.0, β€–W_sβ€– 481.53, fit_positions 65,536,
base_bpb 1.27682 β†’ revived_bpb 1.23391 (Ξ” βˆ’0.04290 held-out),
liveness 0.01027Γ— β†’ 0.99642Γ—, version 0.8.2, commit d6e1854. The
pre-revival resume was archived, Muon momentum zeroed for the three head
tensors, and the revived payload promoted on Phil's explicit go
(`repos/alephllm.md:1669`); thereafter `head_addr_frozen` freezes proj
and the head codebook by `requires_grad` alone, so optimizer groups and
resume state are unchanged and Muon skips them (`trainer.py:75-80`;
`optim.py:42-43`). `checkpoints/step_00024860.safetensors` is the
pre-revival bf16 weight; `step_00024860_revived.safetensors` (fp32) is
the post-write weight; neither the revived file nor the resume archives
appear in `manifest.json`'s checkpoint index.
**The anneal.** Activated 2026-08-31T09:54Z after s8; nochat done
14:42Z, chat done 19:31Z; the frame cost nothing in a bracketed phase
(probe mean .389 β†’ .389; val 1.1153 β†’ 1.1097).
**The 2s boundary ledgers** (`reports/v2/*.json`; bpb on the fineweb-edu
holdout; toggles = mechanism-off minus full):
| report | step | tokens | bpb_full | banks | hubs | head | doc / reset |
|---|---|---|---|---|---|---|---|
| warmup_wikitext | 1,145 | 0.300B | 2.36257 | +0.0365 | **+1.5042** | βˆ’2.3e-06 | 12.83 / 4.287 |
| session_cap | 8,320 | 2.181B | 1.20332 | +1.727 | +2.036 | βˆ’4.9e-07 | |
| fineweb_main | 20,219 | 5.300B | 1.11719 | +3.5527 | +2.2157 | βˆ’3.4e-07 | |
| curriculum_s0 | 22,890 | 6.000B | 1.2522 | | | ~0 (born null) | |
| curriculum_s1 | 25,561 | 6.700B | 1.2544 | | | **+0.0258** | |
| curriculum_s2 | 29,376 | 7.700B | 1.2177 | | | +0.0140 | |
| curriculum_s3 | 33,954 | 8.900B | 1.2318 | | | +0.0072 | |
| curriculum_s4 | 38,532 | 10.100B | 1.2356 | >3.0 | >3.0 | +0.0130 | |
| curriculum_s5 | 42,347 | 11.100B | 1.2504 | | | +0.0278 | |
| session_cap | 43,130 | 11.306B | 1.2614 | | | | |
| curriculum_s6 | 45,399 | 11.900B | 1.2683 | | | +0.0126 | |
| curriculum_s7 | 50,740 | 13.300B | 1.1883 | | | βˆ’0.0010 | |
| curriculum_s8 (STRUCK) | 53,792 | 14.100B | *1.0737* | *+3.396* | *+5.164* | | *0.843 / 1.889* |
| session_cap (true s8) | 53,792 | 14.100B | **1.19112** | +3.2144 | +3.3410 | +0.0149 | 5.052 / 2.469 |
| anneal_nochat | 57,607 | 15.100B | 1.1153 | | | +0.0101 | |
| anneal_mix | 61,422 | 16.101B | **1.10970** | +3.3115 | +3.3584 | +0.0123 | 3.862 / 2.130 |
Blank cells are not in the record consulted here; the head column is
complete. The warmup row is the first full-splat-under-AR ledger: with
all 20 hubs off the craft loses its entire attention (+1.50 at 0.3B),
which is what "load-bearing, not decorative" measures against the
mother's 3-hub form. `hidden_erank_floor` flags TRUE in every report from the 8,320 cap on (the
trainer's own TB census, on the first val batch, flags it from step 500)
(L19 pre-norm erank in single digits β€” the byte funnel; the post-norm
`nf(h)` erank reads 334/1024), `head_buried` FALSE from s1 on, den
floors 0.0 the entire run, zero loss spikes. Two "final val" readings
exist on the hub: the report ledger 1.10970 (the gauge of record) and
the manifest's checkpoint entry `val_bpb` 1.11403 at 61,422 β€” the
manifest column is the LAST PERIODIC EVAL's `bpb_full` (eval every
2,000; `trainer.py:444-447`), so it lags every boundary (fineweb 1.1156
vs 1.1172; s8 1.1833 vs 1.0737/1.1911); the manifest minimum is 1.1140
@60,000. Cite the report.
## The paired record (`mini-beatrix-2s-control/reports/v2/`)
**Derivation.** Every preset auto-generates a `-control` twin: the same
`AlephLMConfig` with `hub_layers = ()` (`presets.py:216-229`), so
`hub_K/hub_D/hub_const/hub_chunk` are carried but unused and every
block's attention is CausalSDPA. 0.8.7 (@b472815) gave twins their own
`TrainConfig` copy β€” the shared instance had let `head_addr_frozen=True`
leak into the control, a post-revival flag no birth recipe may carry β€”
and sets the 2s control to `head_addr_frozen = False` explicitly: the
birth recipe, born-null unfrozen head, which buries as the treatment's
did for its first 24,860 steps (`presets.py:221-235`). The control
inherits `governor="minsep"`; with no hub books it governs the head
codebook only (hits_cum 10 at warmup, fineweb and the 22,854 cap β€” the first
session β€” and 0 in every later session's report;
`crowd_check_extra_hits` 0). Same seed 1337: construction order embed β†’
blocks β†’ norm β†’ head after `torch.manual_seed` (`trainer.py:63`;
`alephlm.py:85-96`) makes the embedding draws identical between craft
and twin; the RNG streams diverge from block 0's attention onward
(a derivation from construction order, not a weight comparison).
**Protocol.** Declared at the control's warmup boundary, before the
outcome, while sdpa led (2.1056 vs 2.3626): the architecture verdict is
the paired boundary table across the full 16.1B matched budget; the
headline is endpoint val; secondaries are probe means at matched
boundaries and the doc/reset gauges; no verdict from any intermediate
lead in either direction (`repos/alephllm.md:1961-2002`; a control must
be able to fail). Completed unaltered through 13 paired rows. Budgets
are matched in tokens, not wall-clock: fused sdpa ran 71.9k tok/s on the
RTX PRO 6000 and 113k on the H100 against the eager scan's ~58k.
**The paired rows** (bpb_full, same step, same tokens, same gauge except
where struck; deficit = control βˆ’ craft):
| boundary | step | tokens | 2s | control | deficit | control bank toggle | control grad-norm median |
|---|---|---|---|---|---|---|---|
| warmup | 1,145 | 0.30B | 2.3626 | 2.1056 | βˆ’0.257 | βˆ’0.008 | |
| fineweb | 20,219 | 5.30B | 1.1172 | 1.1763 | +0.059 | 1.62 | 0.31 |
| s0 | 22,890 | 6.00B | 1.2522 | 1.5047 | +0.253 | 3.44 | 6.47 |
| s1 | 25,561 | 6.70B | 1.2544 | 1.3917 | +0.137 | 3.61 | 2.43 |
| s2 | 29,376 | 7.70B | 1.2177 | 1.3938 | +0.176 | 4.13 | 11.9 |
| s3 | 33,954 | 8.90B | 1.2318 | 1.5317 | +0.300 | 4.73 | 12.7 |
| s4 | 38,532 | 10.10B | 1.2356 | 1.5689 | +0.333 | 5.09 | 24.5 |
| s5 | 42,347 | 11.10B | 1.2504 | 2.1762 | **+0.926** | 4.36 | 126.4 |
| s6 | 45,399 | 11.90B | 1.2683 | 3.1940 | **+1.926** | 3.89 | 471 |
| s7 | 50,740 | 13.30B | 1.1883 | 3.1201 | +1.932 | 4.17 | 162 |
| s8 | 53,792 | 14.10B | *1.0737* | 3.0810 | STRUCK (gauges differ) | 5.48 | 145 |
| anneal_nochat | 57,607 | 15.10B | 1.1153 | 2.9270 | +1.812 | 5.64 | 167 |
| anneal_mix | 61,422 | 16.10B | **1.1097** | **2.8846** | **+1.775** | 6.11 | 215 |
Eleven same-gauge rows after the crossover, all in the craft's favour;
the endpoint gap is +1.775 at 16,101,408,768 tokens on both. The
control's own trajectory is the finding: 1.1763 at 5.3B β†’ 3.1940 at s6
β†’ 2.8846 at the end β€” a destabilised model at its endpoint, not a
trailing one. Its endpoint ledger: bank_off 8.99015 (toggle +6.1056),
head toggle βˆ’1.06e-05, `head_buried` TRUE at every row from fineweb on,
doc_bpb 5.422, reset_bpb 3.825; probes p0 .200 p1 .333 p2 .267 p3 .333
p4 .300 p5 .433 p6 .233 p7 .433 p8 .333 against the craft's .367 .367
.600 .200 .333 .567 .333 .333 .400 β€” ties at n = 30 (SE of a difference
.126). The control's bank dispatch entropy fell through the curriculum
(`collapse/dispatch_entropy_L5`: .94 at the s0 census, .75 @30,000, .48
@35,000, .22 at the s5 census; L0 .75 β†’ .47 @30,000; layer minimum .14
@42,500), ahead of the >30 grad-norm-median onset at 38,000.
**The destabilisation facts** (from the hub tfevents, `train/grad_norm`
= pre-clip): the control first crossed the clip at step 17,600 (4.61B,
inside fineweb, on the RTX PRO 6000, while still leading); 813 of 824
logged curriculum+anneal steps clipped (98.7%); 38 steps above 1,000;
max 41,070 @44,600; the > 30 onset at bin 38,000 (late s4) and > 100 at
40,500 (mid-s5) inside one event file. The 2s craft: 0 of 1,225
logged steps from step 200 on above the clip (the only reading above 1.0 is
step 50, 1.063, inside the 200-step LR warmup); max 0.760 @1,300 after the
warmup boundary, and 0.619 @26,750 (s2) over the 824 curriculum+anneal steps. The spike
detector and the non-finite guard never fired on either craft. Under
Muon the clip braked nothing in the Muon group (qkv/o, the position
table, the head); the escalating norm is a sharpness signal, not a
throttled step.
**The grade and its caveats.** The instance holds: the all-sdpa twin is
a destabilised control under the splat-tuned recipe, one craft per arm
(S-1802 INSTANCE). The general claim β€” softmax attention is inadequate
for this model's attention requirement β€” is a CANDIDATE (S-1803) behind
confounds stated as measurements: (a) the recipe was tuned on the splat
craft and carries none of the field's softmax stabilisers (QK-norm,
softcap, z-loss, weight decay, decay), and the signature β€” clip-engaged
smooth degradation, entropy and rank collapse, no NaN, onset on plain
prose while leading β€” is the documented softmax logit-growth mode;
(b) n = 1, no bar, +20.3M parameters in the losing arm; (c) shape: the
mother null β€” mini-beatrix-1 (13 sdpa + 3 hubs, d768) under the
identical TrainConfig (git cc89a87..b472815; the manifests record no
train_config) through the same nine stages at the same budgets ran a
post-warmup grad-norm max of 0.883, 0 of 1,750 logged steps clipped
(`canon/splat_aleph_battery.md:955`; canon-cited, not re-verified against
the mini-beatrix-1 event files for this companion β€” her 88,508 steps /
26,102,071,296 tokens / 70.45 h do verify against
`mini-beatrix-1/manifest.json`) β€” with the nuance that v1 entered
s0 at 17.3B tokens after 15B prose and a 2B anneal, the control at 5.3B;
(d) the aleph-addressed bank sits in both crafts, its dispatch collapse
precedes the escalation, and no sdpa + dense-FFN arm exists at any
scale; (e) the 4096Γ—1024 position table on WD-free Muon at 2e-2 forever;
(f) house Muon is not reference Muon; (g) host and row-order
asymmetries. One gauge (val bpb; probes are ties); the s8 pair struck;
three hosts. dist-e002 (vision, two seeds) remains the only Law-E
splat-vs-sdpa endpoint, and it is a tie.
**Provenance of the three hosts.** RTX PRO 6000 from birth to the 23.5 h
cap at 22,854 (event file 50–22,850); a Colab H100 80 GB from 22,854
(~2.3–2.4 s/step) through s0–s8 (22,900–53,750), 36 steps before the s0
boundary, with the shuffle buffers refilled; a session 53,800–56,000
follows the 53,792 cap in the H100 session's own host and process (event
file `…0a706d592fec.620.1`, 20:01–21:35Z, ~2.3 s/step, 114k tok/s); a third
host (2b1783ef9e94) opened 2026-09-03T01:41Z from the step-56,000
checkpoint at ~3.6 s/step and ran both anneal rows (56,050–61,400; two
88-byte event files are aborted starts) β€” a replay of up to 999 steps at
that restart is a hedge on the 1,000-step TB-upload cadence, not a hub
reading (the H100 process's last event is 21:35:20Z, the step-56,000
checkpoint landed 21:35:33Z and its manifest 21:36:06Z, the third host
opened 01:41:15Z; the hub can neither confirm nor refute a replay), and
it left no cap report.
The canon's "on the H100" lines for boundaries 11–12 are wrong by
erratum (`canon/splat_aleph_battery.md:1008`). The escalation began
pre-resume on the RTX PRO 6000; a 36-step data-order change cannot make
a 0.25 bpb gap on a fixed eval.
## The boundary report (`reports/v2/`) β€” schema
Written by the notebook's `boundary_report(run, tag)` cell to
`reports/v2/{tag}_step{step}.json`, tag = the phase that just finished
or `session_cap`:
- `tag`, `step`, `tokens` β€” `tokens` is `manifest.tokens_seen` (new
in the v2 record).
- `probes` β€” `{p0_grounding, p1_self_other, p2_difference, p3_logic,
p4_arithmetic, p5_causal, p6_learning, p7_composite,
p8_articulation}`, each `{acc, families{…}, n: 30}`; byte-NLL argmin
over the options, fp32, no sampling (`probes.py:191-221`); holdout
families p3:d5 and p4:sub3 gauged from time zero (`probes.py:171`).
- `census_flags` β€” `hidden_erank_floor` (any block-output effective
rank < 0.05Β·d = 51.2), `anchor_merge` (any pair |cos| > 0.99 in a
bank/hub/head book), `dispatch_collapse` (bank dispatch entropy
fraction < 0.10), `den_floor` (hub den floor_frac > 1e-3),
`head_buried` (liveness < 0.1; added at 0.8.2 β€” absent from the 2s
warmup_step1145, session_cap_step8320, fineweb_main_step20219 and
curriculum_s0_step22890 reports, present from s1; present in every
control report),
`codebook_erank_floor` (bank codebook erank < 1.5)
(`instruments.py:150-178`). The census sample is `(2, min(1024,
ctx))` random bytes in 0..254 (`torch.randint(0, 255, …)`, so DOC never appears in the census sample) in the notebook writer; the trainer's own census
uses the first val batch (`trainer.py:371-374`).
- `ledger` β€” `bpb_full`, `bpb_bank_off`, `bpb_head_aleph_off`,
`bpb_hub_off` (only if any block is a hub β€” the control's ledger has
five keys), and `toggle_<x> = bpb_<x> βˆ’ bpb_full`; mean CE over the
fixed val batches / ln 2 (`instruments.py:187-212`). No `w_s_norm`
field (the mb1 schema had one).
- `special` β€” `{doc_count, doc_bpb, reset_bpb}` (`instruments.py:
310-352`); None on BPE crafts.
- `governor_hits_cum` β€” the session's cumulative pair-pushes; the
counter is a Trainer attribute defaulting to 0 (`trainer.py:266`),
not persisted in the manifest or the resume payload, so it resets
every session (103,951 @1,145; 1,304,497 @20,219; 70,747 at s1 after
1,604,488 at s0; 0 at session_cap_53792; 776,450 @61,422).
- `crowd_check_extra_hits` β€” pushes from an on-demand `govern_model` at
report time (415 @20,219; 709 @61,422; 0 on the control).
Other report kinds in the same directory: `revival_step24860.json` (the
op record above, no probes/ledger β€” chart code must skip it) and
`cultivation_{A_born_null,B_revival_birth,C_matured_transplant,
D_live_address_only}.json` β€” the C7 head-cultivation screen, 1,200
steps at seed 1337 with gauges at 300/600/900/1200 `{toggle, w_s_norm,
head_s_norm, head_s_chance, head_liveness_ratio, head_buried}` and,
for B and D, a `revival` dict (Ξ± 16.0, fit 16,384, base 8.336 β†’ 5.389).
Endpoint toggles: A βˆ’5.3e-06 (buried, liveness 0.045); B +3.496
(liveness 1.125); C +0.0922 (β€–W_sβ€– 520.5); D βˆ’7.1e-05 (liveness 1.037,
not buried, no function) β€” a live address alone does not carry
function; a revived head at birth does.
**The manifest** (`manifest.py:16-110`): `preset`, `model_config` (the
full `AlephLMConfig`), `created_utc`, `updated_utc`, `steps`,
`tokens_seen`, `wall_hours`, `phases[{name, dataset, planned_tokens,
tokens_done, status ∈ planned|active|done|deferred}]`,
`checkpoints[{step, tokens, kind ∈ safetensors|resume|fp8, path,
val_bpb, utc}]`, `data_state{dataset, rows_consumed, epoch}`,
`notes[{utc, msg}]`. 2s: created 2026-08-27T00:35:31Z, updated
08-31T19:37:50Z, 142 entries (59 safetensors / 24 fp8 / 59 resume β†’ 46
distinct bf16 paths). Control: created 08-31T21:26:32Z, updated
09-03T07:16:38Z, 136 entries β†’ 44 bf16. Neither records a train_config.
**Checkpoint kinds** (`checkpoint.py:102-155,187-195`): bf16 safetensors
every 2,000 steps and at every boundary, every state-dict tensor
including the `addr.home` buffers (so the file's numel, 237,908,285,
exceeds the parameter count by 782,336); fp8-e4m3 every 5th checkpoint
or final, 2-D+ tensors with numel > 4,096 stored with a per-tensor fp32
scale `amax/448` under `<key>.scale`, small params kept bf16, metadata
"inference/testing only" β€” never train from these; `resume/latest.pt`
fp32 with the manifest embedded, overwritten at every checkpoint and
archived at boundaries. Hub uploads retry three times and never crash
training; downloads distinguish genuine absence from network trouble
and raise on the latter (`checkpoint.py:29-100`).
**TensorBoard tags** (`trainer.py:283-296`; `instruments.py:215-260`;
314 tags on the craft, 212 on the control): from the loop
`train/{loss,bpb,grad_norm,lr_scale,tokens,tokens_per_sec}`,
`collapse/loss_spike`, `governor/hits_cum`, `sys/vram_gb`; from the
census per layer i `erank/hidden_L{i}`, `erank/hub_consumed_L{i}`,
`erank/hub_codebook_L{i}`, `erank/bank_codebook_L{i}`,
`cv/bank_load_L{i}`, `cv/hub_usage_L{i}`, `drift/bank_L{i}`,
`drift/hub_L{i}`, `sign/bank_frac_neg_L{i}`,
`collapse/dispatch_entropy_L{i}`, `collapse/den_floor_L{i}`,
`gates/L{i}_e{k}`; head `head/{gamma,w_s_norm,s_norm,liveness_ratio,
consumed_erank}`, `erank/head_codebook`; `collapse/flag_{…}` for the six
flags; `toggles/{bpb_full,bpb_bank_off,bpb_head_aleph_off,bpb_hub_off,
toggle_bank_off,toggle_head_aleph_off,toggle_hub_off}`; from the full
eval `canary/{recall_acc,wrongpair_frac,noretrieval_frac}` and
`special/{doc_count,doc_bpb,reset_bpb}`. The control lacks every hub
family; the archived run0 file lacks `head/liveness_ratio`,
`head/s_norm`, `special/*` and `flag_head_buried` (pre-0.8.0 specials;
the `head_buried` flag arrived at 0.8.2 @d6e1854 and the `head/s_norm` +
`head/liveness_ratio` TB scalars at 0.8.4 @a690ea4).
**`archive/run0-nospecials/`.** The pre-specials attempt, archived whole
2026-08-27T00:16Z: its manifest (created 08-26T20:50:18Z, steps 2,537,
tokens 665,059,328, wall 3.22 h, warmup done at 1,145, fineweb_main in
progress), bf16 checkpoints 1,145/2,000/2,253/2,537, fp8 2,253/2,537,
`resume/{latest,boundary_warmup_wikitext_step1145}.pt`, one event
file, and a report at the doubled path
`archive/run0-nospecials/mini-beatrix-2s/reports/v2/warmup_wikitext_step2253.json`
β€” a late-tagged fineweb report written on interrupt (stale tag, doubled
path: the 0.8.1 driver-contract bug) with probes, five census flags and
governor fields but no `ledger`/`special` block. Code-wins note: the
manual's RIDER 9 says run0 "halted at step 2000"; the archived manifest
says 2,537 (train() swallowed the interrupt and the driver auto-resumed
~19 minutes; `repos/alephllm.md:1408`). The hub wins: 2,537.
## The AutoModel (AbstractPhil/mini-beatrix-2s)
Thirteen files: `README.md`, `config.json`, `modeling_minibeatrix.py`,
the vendored `address.py`, `alephlm.py`, `attention.py`, `bank.py`,
`embedding.py`, `governor.py`, `head.py`, `presets.py`,
`model.safetensors` (475,880,498 B; 593 bf16 tensors, numel
237,908,285, every key prefixed `model.`, metadata `{tokens: 16.101B,
step: 61422, format: pt}`), `.gitattributes`. No tokenizer files: input
ids are raw UTF-8 byte values. The vendored files are byte-identical to
`geolip/alephllm/model/*.py` and `presets.py` at 0.8.7 except one
import line (`alephlm.py:30`, `..presets` β†’ `.presets`). `config.json`
is the craft's `model_config` plus `model_type "mini-beatrix"`,
`auto_map` to `MiniBeatrixConfig`/`MiniBeatrixForCausalLM`,
`torch_dtype "float32"` (the file is bf16; the loader upcasts on
request), `use_cache false`. The wrapper (`modeling_minibeatrix.py:
21-99`) holds `self.model = AlephLM(cfg)`, forces `hub_ckpt = 0`, makes
`_init_weights` a no-op ("AlephLM initializes itself; loader must not
re-init"), truncates to the last `context` positions, returns
`CausalLMOutputWithPast(loss, logits)` with HF label semantics, and
carries no KV cache β€” HF `generate()` recomputes the prefix each step;
the inner `AlephLM.generate(idx, max_new, temperature, top_p,
use_cache=True)` uses the constant-size hub state.
**The parity gate.** The ship gate β€” strict load, logits parity 0.0
against the geolip code path, `generate()` ok β€” is journal-recorded
(`repos/alephllm.md:1840-1846`; `history/timeline.md` 2026-08-31;
`MIRROR.md` step 2 in the AlephLLM repo), not hub-shipped: no parity
script exists on either hub repo or in the package. Re-verified on CPU
by the drafting workflow (torch 2.11.0, transformers 5.13.0, no geolip
installed; not re-run in the hub-side pass, which found the hub
consistent with these readings β€” TB `head/w_s_norm` 515.13 at step
61,000, 593 bf16 tensors, numel 237,908,285): 593 file keys == 593 model keys, parameter count
237,125,949, β€–W_sβ€– 515.918, Ξ³ 1.0; the inner cached decode equals the
parallel path (`torch.equal` True); logits parity against geolip was
not recomputed. Two notes for the reader: the model card's lineage line
says alephllm 0.8.6 while the vendored files are the 0.8.7 mirror
(commit 90a06b75, 2026-08-31 21:11 β€” the `presets.py` carries the 0.8.7
twin-isolation block); and the card's "17 reports" counts the 16
boundary/session reports plus the revival op β€” the prefix holds 21
JSONs with the four cultivation arms.
**Load and evaluate** (the steps below were executed by the drafting
workflow; the numbers are from that run and were not re-run in the
hub-side pass):
```python
import math, torch
from transformers import AutoModelForCausalLM
m = AutoModelForCausalLM.from_pretrained("AbstractPhil/mini-beatrix-2s",
trust_remote_code=True).eval()
ids = torch.tensor([list(text.encode("utf-8"))]) # bytes in
bpb = m(input_ids=ids, labels=ids).loss.item() / math.log(2)
# toggle ledger on the inner model (positive delta = mechanism carries function)
core = m.model
full = core(ids, labels=ids).loss / math.log(2)
bank_off = core(ids, labels=ids, disable_bank=True).loss / math.log(2)
hub_off = core(ids, labels=ids, disable_hub=True).loss / math.log(2)
head_off = core(ids, labels=ids, disable_head_aleph=True).loss / math.log(2)
# generation: HF path (no cache) or the inner cached decode
out = core.generate(ids, max_new=40, temperature=0.0, use_cache=True)
print(bytes(out[0].tolist()).decode("utf-8", errors="replace"))
```
On a 227-byte English snippet this read 0.9446 bpb full, +3.872 bank
off, +3.925 hub off, +0.0156 head off; greedy from "The history of
astronomy begins with the" continued " study of the sun and the
planets. The s". Chat: wrap raw bytes in 0xFB SYS / 0xFE USER / 0xFD
MODEL / 0xFC END (`special_tokens.py:112-136`). Training checkpoints
load into the same wrapper after prefixing every key with `model.`, or
into a bare `AlephLM(cfg.to_aleph())`; fp8 files must be rehydrated
first (`checkpoint.py:187-195`). What the AutoModel cannot reproduce is
the gauge of record: the fineweb-edu holdout needs
`geolip.alephllm.data.streams.build_stream(dataset, tok, 4096, 16, seed
= 1337 + 9999, role="val")` and 262,144 tokens (4 batches of 16 Γ— 4096),
then `toggle_ledger` and `special_token_gauge` over those fixed batches
(`trainer.py:384-411`; `instruments.py:187-212,310-352`).
## The process that made 2s different (dated)
**The mother, measured (2026-08-12 β†’ 08-27).** mini-beatrix-1 was built
with 13 sdpa blocks and three hubs at layers 4/9/14, each a single
512-anchor book in D = 32 (`git show cc89a87:presets.py`), full-width
banks holding 67% of the mass, and a 512 @ 32 head. Two post-mortems set
the 2s agenda: the 08-25 hub census β€” 16Γ— the K ≀ 2D supply, 333/646/181
duplicate anchor pairs at |cos| ~1.0, consumed erank 2.2/3.7/10.8 β€” and
the 08-27 autopsy of the shipped weights, W_s exactly 0.0 after 8.4B:
the "head election" lore retracted, the head never carried function
(`repos/alephllm.md:1586`; `history/plans/2026-08-26_mini_beatrix_v2_shape.md`).
A third: the v1 anneal (2B, chat template inside, before the school)
baked the chat frame into the core irreversibly β€” the chat-in-anneal
law (2026-08-15) that later dictated the bracketed two-phase anneal.
**Why every block (08-23 β†’ 08-26).** Phil's directive: "the entire model
to be splat attention". The record's support was dist-e002 β€” cured
splat in all 12 ViT-Ti blocks ties sdpa at matched params and matched
wall-clock on two seeds (R@1 .0545 vs .0562), late placement edging
(R@5 +.0128, outside the bars); the untested bet, flagged in the plan,
was that full-splat CAUSAL had never trained. The payoff row was the
warmup ledger (+1.50 with the hubs off at 0.3B) and the endpoint
(+3.36).
**The shape (08-24/25 β†’ 08-26).** ROUND 5e's shape ladder: 8 Γ— 256 lost
4 of 4 paired against 12 Γ— 128, the wide model seed-fragile, its
crowding tail (79% of layer-1 heads over the 25Β° floor on one seed)
naming the chain width β†’ crowding β†’ positional ranking flips β†’ deficit;
hence SUPPLY K ≀ 2D (`STATUTES_INDEX.md:53`) and depth over width. B2's
product code (independent books compose, .859 β†’ .955 monotone in
members) gave the multi-book form; the rotary Γ— anchor flip analysis
gave governability D β‰₯ 128 (Ξ³* 32Β° at d512, 45Β° at 256, unreachable at
64). The arithmetic lands on 4 Γ— 64 @ 128 (0.5Γ— supply, 4Γ— headroom
against v1's 16Γ—), L20, d1024, ctx 4096 (splat's wall-clock crossover
~2k; below 4k a full-splat trunk pays attention's price without the
O(L) payoff), banks narrowed to ff 1024, head 256 @ 256. The 849M
sibling (L32, ctx 8192, 16 Γ— 256 @ 256) was designed the same session
(`presets.py:161-183`).
**The governor from birth (08-24 β†’ 08-26).** Phil's proposal β€”
"a middleman to control a min/max space that drift can occur to
guarantee there's always enough space between the anchor points" β€” was
confirmed in the math: for a crowded pair the static logit gap is
quadratic in separation while the positional oscillation is linear, so
small separation flips weight rankings along the sequence; separating
an already-crowded trained book leaves its flip pattern bit-identical,
so min-sep is preventive, not curative β€” run it from birth. Rung 1 ran
bit-identical to the ungoverned run (raw books never crowd; the
crowder was the frame W_a); gov25m fired on the fragile seed only,
harmlessly. Shipped as a post-step projection, 45Β°, every 8 steps
(`governor.py`, `presets.py:99-105`). In-mission it ran hot β€” ~120
pushes/step at step 1,000, ~84–105 sustained through fineweb, never
decaying β€” with every function gauge healthy; the ΞΈ ladder 35/40/45 for
K = 64 @ D128 is an open rung, and the preset comment's "45 at D=256"
does not itself justify 45Β° at D = 128.
**The kernel campaign and the pivot (08-26, one day).** 0.7.0 at 10:41
(multi-constellation hub, supply guard, governor wired in, the 849M
rescale, 2s as the screen craft). The Blackwell preflight OOMed
(`hub_ckpt`), then launched at 161.88 s/step; the per-op profiler
printed `qc torch.float32` under autocast β€” 0.7.2 at 12:27 (the einsum
promote trap; 4090 hub fwd+bwd 229.7 β†’ 178.8 ms). The dtype fix bought
~6%; the binding constraint was kernel shape β€” 0.7.3 at 13:14 (one
stacked GEMM, one fused softmax, prefix as a triangular GEMM; 65.3 ms,
3.5Γ—; peak 7.4 β†’ 1.9 GB; Blackwell 149 β†’ 69.7 s/step). Compile refuted
by measurement (bf16-backward NaN, and the pre-NaN projection 67 vs
69.7 s eager) β€” eager-only on Blackwell. Economics: 17.3B at 8k tok/s
is 24–26 days on the one card. Phil: "we can't train the large one
currently. Not until we work out a series of logistics problems." 0.7.5
at 13:43 (@73218bd): 2s is the mission, `hub_ckpt` 2 β†’ 0; launched at
4.54 s/step, 58k tok/s. "Not a bad start. We'll train this one." The
849M is shelved, not retired (its value-bottleneck relaunch lever
quantified at ~46 s/step).
**The format restart (08-26 16:43).** Phil: "We'll want a practical
array of them for usage, nothing small. We'll halt this one and start
over with the correct formatting." 0.8.0: the thirteen unreachable ids,
the exhaustive proof at every launch, DOC from birth, the frame only in
anneal, the canary collision caught; run0 archived whole, run1 fresh on
the clean prefix (manifest 08-27T00:35Z). DOC cost nothing β€” run1 train
bpb 1.49 @1,100 against run0's 1.494 @1,000 β€” and doc_bpb fell 12.83 β†’
3.29 by 0.52B. 0.8.1 the same day: the driver contract that made every
later boundary row a real boundary.
**The head saga (08-13 β†’ 08-29 β†’ 08-31).** Born weight-zero by law
(gate-zero deadlock, `head.py:8-11`); buried inside 2,000 steps on run1
(0.032Γ— chance at the first stored checkpoint, 0.014Γ— @12k β€” journal
readings from checkpoint analysis, not TB scalars; learned
avoidance β€” proj rotated into codebook-orthogonality while W_s grew to
norm 31 multiplying ~0); LS-ignite alone refuted (0.0006 bpb); the
governor exonerated (the ungoverned v1 buried deeper; the 45Β° floor is
free at birth). Candidate law at 2/2 crafts, 3/3 with the control: a
born-null aleph head racing a strong same-target linear base
self-buries within ~2k steps; the bank's self-start does not transfer
across competitor types. Phil ruled activation; the BOUNDARY-WRITE law
was minted (`revival.py:26`; `STATUTES_INDEX.md:67`) β€” a third
intervention category outside both the governor statute and the
no-balance-machinery law, permitted only at run boundaries or halted
resume points, always logged β€” and the deterministic op executed at
24,860. The first nonzero head toggle in lineage history landed at s1
(+0.0258, after 6.5B tokens of exactly 0.000); the settled read is a
durable, small, diet-sensitive niche in the band βˆ’.001..+.028,
band-exits upward on the binding-adjacent diets (s5 causal +.0278),
touching zero at s7 as bpb_full fell 1.268 β†’ 1.188.
**The recipe that never changed (08-12 β†’ 09-04).** Muon on the trunk
because the 08-10 validity battery on the AR bed read muon .8081 >
sgd_mom .7995 > adam .7157 > lion .5638, with the address ~20Γ— more
optimizer-fragile than sdpa (cross-optimizer spread .79 vs .037) and
schedules no-op-to-harmful (flat .714 > warmcos .596) β€” so the flat-LR
law; pure Adam on the rest by the 09-01 optimizer statute (Adam the
experimental baseline, Muon the trunk, AdamW never;
`STATUTES_INDEX.md:76`). `presets.py:80-84` is the same text at
cc89a87 (where it sits at `presets.py:65-69`) and at HEAD. The same recipe is the audit's confound (a).
**The diet (08-15 β†’ 08-31).** The nine stages and budgets are v1's
(0.6.0), placed before the anneal rather than after it (Phil,
2026-08-30: "Let her really build up that internal knowledge first";
`history/plans/2026-08-26_mini_beatrix_2s_mission.md`), fineweb_extended
deferred; the two-phase anneal (Phil, 08-31: "enable the anneal mix
without chat and the anneal mix with chat, we'll run without first,
then just train chat on after"; `streams.py:63-77`), 0.8.6 at 02:48.
The s8 terminal-gauge hole appeared at 04:57Z and 0.8.5 had already
closed it in code (08-30 22:03); the true ledger was re-measured at
09:53Z. Mission complete 19:31Z: 61,422 steps, 16.101B tokens, 78.33 h,
zero spikes; the HF outage at the final push was recovered by a Drive
rescue and retry.
**The twin (08-31 β†’ 09-04).** 0.8.7 at 14:10 (twin isolation, birth
recipe); the control born 21:26Z; the protocol declared at its warmup
boundary while sdpa led; the crossover at fineweb 5.3B and every row
after; the rank story as the mechanism claim (at step 4,000 the control
collapses early hidden erank to 5–9 of 1024 at L2–L4 (5.5 / 5.4 / 9.3)
while the craft reads 234 / 225 / 250 there and 150–396 across L0–L15
(`erank/hidden_L{i}`, TB census); screen scale reproduces it; rank β‰  function β€” the
control led val at 4k while running rank-5 layers); the H100 resume at
22,854; the grad-norm escalation rider at s5; Phil's claim held on
09-02 ("SDPA isn't an adequate representative of this model's
attention requirement. We can say that without question now."); the
third host from 56,000; the endpoint 09-03; the 12-agent audit on 09-04
(S-1802 INSTANCE, S-1803 CANDIDATE, the s8 strike, the mother null,
Muon clip-blind, the falsifier filed).
## Gauges, defined once
- **val bpb**: mean cross-entropy in bits/byte over 262,144 tokens
(4 batches of 16 Γ— 4096) of the fineweb-edu reserved head slice β€”
the first 2,048 rows, fixed, unshuffled, seed 1337 + 9999 β€” for every
phase from fineweb_main onward, both crafts (`trainer.py:384-411`;
`streams.py:279-282,423-447`; gauge continuity law). The warmup row
vals on wikitext-103's validation split. Pre- and post-0.8.0 gauges
differ for v1-era crafts (DOC rides the val stream).
- **toggle ledger**: bpb with one mechanism disabled minus full bpb β€”
the causal contribution of banks / hubs / head aleph
(`instruments.py:187-212`). Positive = the mechanism carries function.
- **specials gauge**: `doc_bpb` and `reset_bpb` in bits, read against
the same val batches (`instruments.py:310-352`); `doc_count` 70 on
every 2s-era report on the fineweb-edu gauge (the struck 2s s8 file reads 1612).
- **head liveness**: mean β€–signed readβ€– of real hidden states over the
same book's mean on 512 random unit vectors β€” self-calibrating;
`head_buried` = ratio < 0.1 (`instruments.py:144,176,356-382`).
Both buried crafts sat at 0.003×–0.03Γ— chance.
- **probe accuracy**: byte-NLL argmin over the item's options, nine
suites Γ— 30 items, holdout families d5 and sub3 gauged from time zero
(`probes.py:171-235`). At n = 30 a between-craft difference has SE
.126: the paired probe calls are ties.
- **train/grad_norm**: the pre-clip global norm returned by
`clip_grad_norm_` (`trainer.py:244,287`), logged every 50 steps; under
Muon it measures sharpness, not the applied step.
- **governor hits**: cumulative pair-pushes per session
(`trainer.py:266`); a session-scoped counter, comparable within one
event file only.
## Known caveats and open items
- The autocast einsum-promote trap voids every pre-0.7.2 splat speed
verdict (fp32 scans under "bf16"); accuracy verdicts stand. Any
autocast performance reading over einsum code is invalid until the
dtypes are printed (`attention.py:167`).
- Muon is clip-blind (`optim.py:24`), and Adam's per-coordinate
normalisation makes it nearly so: `grad_clip 1.0` shrank the applied
step of neither group on the control, only the weighting of steps
inside each optimizer's buffers; the recipe carries no softmax
stabiliser.
- The 2s `curriculum_s8_step53792` ledger is on the synthetic fallback
and is struck; the same-gauge pair is owed by a zero-training
re-evaluation of `resume/boundary_curriculum_s8_step53792.pt` on the
0.8.7 gauge (T0b in `history/plans/2026-09-04_sdpa_falsifier_screen.md`).
Hub-vs-journal note: the file on the hub reads doc_count 1612,
bpb_hub_off 6.2378 (toggle_hub_off 5.164), doc_bpb 0.843 β€” agreeing
with the trainer comment and the manual (doc_count 1612, hub_off 5.16 =
the toggle; `trainer.py:397-399`); the file carries no dataset field,
so the strike rests on the same-step cap discrepancy (doc_count 70,
bpb_full 1.1911 in `session_cap_step53792.json`) and on the 1612-document
count itself. The hub file's numbers win for what the file says.
- The control's third host from 56,000: a replay of up to 999 steps is a
TB-cadence hedge, not a hub reading; no cap report; the 53,800–56,000 segment ran in the H100
session's own process (event file `0a706d592fec.620.1`); canon CB11/12 "on the H100" wrong by erratum.
- Every resume refills the shuffle buffer (not row-exact); the control
resumed three times, the craft four; MixStream state carries no
recipe fingerprint.
- The 2s preset at HEAD carries `head_addr_frozen = True`
(`presets.py:199-201`), the post-revival state: a fresh birth of the
treatment preset under 0.8.7 would freeze a random proj and codebook
from step 0, which is not what the shipped run did (born-null unfrozen
under 0.8.1 for 24,860 steps, revived, then frozen). The control's
override (`presets.py:235`) is the birth recipe.
- Stale text, code wins: `presets.py:18` "~233M" (built 237,125,949);
`presets.py:14,166` "~873.7M" for mini-beatrix-2 (built 849,023,425);
the training README's ladder row "mini-beatrix-2 | 1024/20/2048 |
249.1M" is the retired v1 shape; the hub driver `beatrix_v2_colab.ipynb`
is headed "mini-beatrix-2 β€” the governed full-splat mission" and names
`mini-beatrix-2-control` while its CRAFT is `mini-beatrix-2s` (no
control notebook exists on the hub β€” only this file and
`mini-beatrix-1/beatrix_curriculum.ipynb`); `AlephLMConfig.hub_chunk` defaults to
128 while the module's own default is 256 (`presets.py:52`;
`attention.py:83`) β€” the config governs, and 2s sets 256.
- `governor_hits_cum` resets per session; the manifests record no
train_config or package version β€” the mother null's "identical
TrainConfig" is a git fact, and the craft's birth version 0.8.1 is
inferred from commit dates (run1 created 08-27T00:35Z between 0.8.1
on 08-26 and 0.8.2 on 08-29; the revival report records 0.8.2; the hub
driver `beatrix_v2_colab.ipynb` pins `geolip-alephllm @2a902b7`, the
0.8.1 commit).
- Owed instruments: the per-layer hidden-erank census of both crafts at
the full-scale boundaries; the falsifier S-1803-F (Tier 0 on the 4090;
a 40M twin screen with sdpa + QK-norm / LR/3 / dense-FFN / positions
on Adam arms; pivot = resume the control at 20,219 through s0 at LR/3
with QK-norm). Without it the general claim stays CANDIDATE.
- `article_assets_ft2/make_charts_ft2.py` sources chart 01 from the hub
but charts 02–05 from local scratch paths, and chart 01 pairs the
struck s8 rows unless filtered.
## Provenance discipline
Both crafts are resume-first: the manifest is embedded in the resume
payload (atomic consistency), a crash never overwrites
`resume/latest.pt` (`trainer.py:334-368`: any exception other than a
manual stop leaves the hub state untouched), an interrupted session
uploads before exit, and every phase boundary archives its own
immutable resume. The revival is auditable from the prefix alone: the
pre-write state (`resume/pre_revival_step24860.pt`), the op's
provenance (`reports/v2/revival_step24860.json`, with version and
commit), the pre- and post-write weights (`step_00024860` and
`step_00024860_revived`), and the first live row after it
(`curriculum_s1_step25561.json`). The struck s8 ledger stays public
beside the cap that supersedes it, as run0 stays public under
`archive/`, for the same reason the mother's rewind checkpoints do. The
recipe is pinned from source, not from the manifests. The AutoModel
vendors the model files verbatim and ships the mission-final weights
re-prefixed; the training checkpoints, not the card, are the control's
weights. Every refuted arm of the head-cultivation screen ships.
## Pointers
- Canon: `canon/splat_aleph_battery.md` β€” CONTROL BOUNDARY 1–12
(522–889), ENDPOINT VERDICT (891), CLAIM AUDIT (901–1006: the s8
strike 930–937, MUON IS CLIP-BLIND 936, THE MOTHER NULL 955–968,
PROVENANCE RIDER 1008), ROUND 5a/5d/5e, B2/B4/B5.
- Statutes (`STATUTES_INDEX.md`): S-701 a control must be able to fail;
S-801 supply law K ≀ 2D; S-1001 gate-zero deadlock; S-1002 born-null
head self-burial 3/3; S-1003 BOUNDARY-WRITE; S-1201 optimizer family;
S-1202 autocast einsum-promote; S-1801 the crossover; S-1802 the
destabilised control (INSTANCE); S-1803 sdpa-inadequacy (CANDIDATE);
S-1901 the specials plane.
- Manual: `repos/alephllm.md` β€” the 0.7.0 era (1180–1330) and RIDERS
7–21b (1333–2081): pivot, launch health, specials and the run0
archive, driver contract, the dead head, the revival trial, the
boundary-write and promote, the head trend 14–14l, curriculum complete
and the s8 artifact, the pre-chat baseline, mission complete, the
ship-out, twin isolation, the pre-registered protocol.
- Plans: `history/plans/2026-08-26_mini_beatrix_v2_shape.md` (the
shape arithmetic), `2026-08-26_mini_beatrix_2s_mission.md` (the pivot,
the anneal-timing ruling, the two-phase amendment),
`2026-08-24_covariant_address_program.md` (the governor),
`2026-09-02_sdpa_inadequacy_claim_held.md`,
`2026-09-04_sdpa_falsifier_screen.md`.
- Dockets: `history/dockets/2026-09-04_sdpa_claim_audit/`,
`2026-09-01_ft2_article/` and `2026-09-01_article/tools/`
(`writeback_cb*.py`, `writeback_endpoint.py`).
- Article: `articles/article_beatrix_ft2.md`; charts under
`article_assets_ft2/` on the training repo.
- Code: AlephLLM HEAD 4f4b7d6 (0.8.7); the era's commits a63a29b
(0.7.0) Β· 2be28dd (0.7.2) Β· 60ee496 (0.7.3) Β· 73218bd (0.7.5, the
pivot) Β· 3ea3103 (0.8.0) Β· 2a902b7 (0.8.1) Β· d6e1854 (0.8.2) Β·
7d48328 (0.8.5) Β· af9319c (0.8.6) Β· b472815 (0.8.7). No git tags
exist; versions are commit subjects.
- The mother: `TECHNICAL.md` on the training repo (byte-identical local
copy `articles/TECHNICAL_training_repo_beatrix.md`).