Herman was retired on September 10, 2026. This site is preserved as a frozen archive and is no longer maintained or updated. Read the retrospective →
ledger: V1 → V5 · append-only · a stage's verdict is never overridden by a later stage
router school / ledger

The experiment ledger

Five recorded stages. Each entry carries the measurements as taken, the gate table as scored, the reason the stage ran, and the reason it did or did not advance. Where a number was never measured, no number is shown.

// how to read this

Historical entries stay historical

V1 is a falsification from the opening night of this programme. It is preserved exactly as it was corrected, because deleting it would remove the only evidence that the evaluation harness itself can produce a promotion-grade number out of nothing. It is not the current status of Router School. The current status is V5, and V5's own conclusion is that the deterministic rule stays in production.

V1 · 2026-08-04 · 06:23–06:41 UTC (eval) · 12:29 UTC (audit)

Round-1 shadow eval

QLoRA adapter vs a frozen deterministic baseline

V1 FALSIFIED
Claimed delta_lane_accuracy +5.10 pp adapter 53.06% vs baseline 47.96% · n=98 chronological holdout

Historical falsification. Not the current status of the program.

SETUP

Architecture. rank-16 QLoRA adapter, generative decoder

Dataset. chronological holdout, 98 test rows, no dedup

Why this stage ran

The headline delta looked promotion-grade: the eval runner exited 0, every receipt field was populated, the pipeline wrote the public site, and the Pages deploy succeeded.

Why it did not advance

Two independent audit lanes (Grok 4.5, 337 lines; Kimi K3, 257 lines) recomputed every claim from the raw artifacts with read-only tools and converged on identical findings without seeing each other. The delta was a trivial-rule match sitting on top of leakage and majority-class collapse.

Measurements

MetricValueNote
Adapter accuracy53.06%n=98
Baseline accuracy47.96%hardcoded literal, not recomputed
Adapter macro-F10.326bit-identical to the 5-line rule
Rule macro-F10.326task_class → lane lookup
Macro-F1 delta0.0007rule parity
Bootstrap CI95 (accuracy delta)[−8.2, +18.4] ppspans zero
McNemar exact two-sidedp ≈ 0.55b=20, c=25 (p=0.5515)
Honest delta on deduped rows≈ +2.6 pp76 clean rows after removing collisions
Train/test byte collisions46 / 9822 of them verbatim training strings

Gate results

GateBarMeasuredResult
Trivial-rule parityadapter macro-F1 > rule macro-F1 by a margin surviving the bootstrap CIadapter 0.326 / rule 0.326 — bit-identicalFAIL
Leakage-free holdoutzero prompt bodies collide with train46/98 byte-collide; 22/98 verbatim train stringsFAIL
Macro-F1 over accuracymacro-F1 delta with CI excluding 0delta 0.0007; accuracy CI spans zeroFAIL
Bootstrap CI significanceCI95 on per-example accuracy delta excludes 0[−8.2, +18.4] ppFAIL
McNemar exact two-sidedp < 0.05 on discordant pairsb=20, c=25 → p ≈ 0.55FAIL
No majority-class collapseper-class recall ≥ ε for every classminimax predicted 72/98; claude recall 0.04; zai never predictedFAIL
No hardcoded numbersbaseline recomputed from real inference47.96% literal in the eval runner sourceFAIL

The source reference records the verdict as 5/7 gates failed → falsified, while its per-check table marks all seven checks failing. Both statements are reproduced here rather than reconciled, because reconciling them would mean inventing a number.

Receipt-level defects the audit surfaced

  • valid_json accepted any parseable dict — no schema check on the required keys.
  • Raw generations were never stored; only the parsed object was persisted.
  • The keyword-baseline fit() was a no-op, so the embedding baseline never ran.
  • The 972-row experiment was not covered by the preregistration.
  • The chronological split was mechanically correct but semantically broken by drift: after dedup and latest-wins, test flipped to 7% minimax from 72% in train.

Public-record correction

When promotion gates fail, the response is not a rerun with tweaked hyperparameters and not shipping with caveats — it is correcting the public record first.

FieldValue
branchfix/router-school-audit-verdict
head1083652a6e38e1f06c9515f81f8389abd161528b
merge commite5b2dc4144aa49ebf5adc976f9b06dd6450aca08
pipelines15881 (MR) and 15882 (main post-merge) — all jobs success with allow_failure=false
live read-backversion 0.2.1 · station status failed · campaign 3 completed / 1 failed

Artifacts

ArtifactPathVisibilitySHA-256Note
Public site recorddata/projects/router-school.jsonpublicnot published in this recordno private prompt text
Row-level eval outputtooling/artifacts/router-school-eval.jsonprivatewithheld — private artifactmode 0600 — body withheld
Independent audit transcriptsGrok 4.5 (337 lines) · Kimi K3 (257 lines)privatewithheld — private artifactdispatch-local, bodies withheld
V2 · 2026-08-04 · post-audit

Foundation rebuild and bounded GPU matrix

Strict TDD dataset + evaluator, then three adapters on a leakage-free holdout

V2 FALSIFIED
Best cell macro-F1 0.1905 vs task-class rule 0.2351 — the rule still wins

The foundation survived and is still in use. The three trained cells did not.

SETUP

Architecture. rank-16 and rank-32 QLoRA on unsloth/Llama-3.2-3B-Instruct

Dataset. 972 raw rows → 601 unique signatures → signature-grouped split 480 train / 60 val / 61 test

Why this stage ran

V1's lesson was not 'train one more epoch'. Every V1 defect was closed structurally before a single GPU cell was scheduled: dedup moved into the split itself, baselines recomputed from live inference, raw generations persisted, strict schema validation, and a preregistration written before training.

Why it did not advance

All three GPU cells failed the promotion gate. None beat the modal task_class → lane rule (macro-F1 0.2351) by a margin whose CI excluded zero. The matrix was the right experiment and it correctly killed V2.

Foundation rebuild

Test suite. 65 → 87 green (+22 across seven RED-GREEN slices; no parent test weakened or skipped)

V1 defectV2 fix
972 raw rows with no dedup972 → 601 unique signatures
Conflicting duplicate rows kept verbatim26 conflicting signatures / 167 rows resolved latest-wins
Cross-split leakage possible0 cross-split signature collisions, asserted by test
Random split with no signature groupingsignature-grouped split 480 / 60 / 61
Test label distribution not assertedindependently matches the audit: claude 21 / grok 21 / zai 9 / kimi 6 / minimax 4
No determinism guaranteedeterministic rebuild test plus sha256sum -c after every build

strict valid_json requires exactly four keys — task_class, recommended_lane, model, confidence — with enum values derived from the corpus, not hardcoded

Measurements

MetricValueNote
Majority baselineacc 0.0656 / macro-F1 0.024661 test rows
Task-class rule baselineacc 0.3115 / macro-F1 0.2351the parity ceiling
TF-IDF + logreg baselineacc 0.3115 / macro-F1 0.2351runtime 0.025 s; substituted for the unavailable embedding baseline and recorded in the preregistration before the harness shipped
E2 — V1 adapter on V2 holdoutacc 18.03% / macro-F1 0.1297 / JSON 52.46%worse than the rule on every class
E3 — fresh rank-16 QLoRA (r=16, α=32)acc 29.51% / macro-F1 0.1905 / JSON 96.72%within noise of the rule
E4 — class-balanced rank-32 (80× zai oversample)acc 0.00% / macro-F1 0.0000 / JSON 18.03%generation collapse

Gate results

GateBarMeasuredResult
Adapter macro-F1 > task-class ruleby ≥ CI half-widthbest cell 0.1905 vs rule 0.2351FAIL
Bootstrap CI95 on accuracy deltaexcludes 0no cell cleared itFAIL
McNemar exact two-sidedp < 0.05no cell cleared itFAIL
All five providers have recall > 0yesE4 collapsed entirelyFAIL
Strict JSON validity rate≥ 95%E2 52.46% · E3 96.72% · E4 18.03%FAIL

Diagnostic

E2 vs E3 is the load-bearing reading. A clean adapter on fresh data gained 11.5 pp of accuracy and 44 pp of JSON validity over the V1 adapter, but macro-F1 stayed within noise of the rule. Data cleaning fixed the JSON-generation failure and changed none of the routing decisions — the adapter was learning what the rule already captures.

Artifacts

ArtifactPathVisibilitySHA-256Note
V2 baselinestooling/artifacts/router-school-v2-baselines.jsonpublicnot published in this recordmajority + task-class rule
V2 TF-IDF logreg baselinetooling/artifacts/router-school-v2-tfidf-logreg.jsonpublicnot published in this recordbalanced word 1–2gram
V2 fixtures + manifesttooling/fixtures/v2/{train,val,test,manifest}.jsonpublicnot published in this recorddeterministic rebuild verified by sha256sum -c
Preregistrationtooling/ROUTER_SCHOOL_V2_PREREGISTRATION.mdpublicnot published in this recordP1–P9 gates written before training
V3 · 2026-08-04 · 13:42 UTC (fixtures)

Current-policy distillation

Train against the live teacher, with its hidden state made explicit

V3 EVAL INVALIDATED
First eval result accuracy 0.0 / JSON validity 0.0 traced to a duplicated response marker in the evaluator, not to the adapter

The first V3 evaluation measured the harness, not the adapter. The curriculum insight survived and became V4.

SETUP

Architecture. rank-16 QLoRA on unsloth/Llama-3.2-3B-Instruct — 700 steps, lr 1.5e-4, 1,048 examples

Dataset. 1,310 unique policy cells distilled from the live teacher · splits 1,048 train / 131 val / 131 test

Why this stage ran

V2 proved the dataset itself was the wrong signal. The production label is a function of (prompt, recent 24h provider counts) — the dispatch guard's portfolio-balancing sort. V2 dropped that history field, so identical prompts carried conflicting labels resolved by latest-wins, and the adapter learned 'the most recent conflicting label'. V3 makes the hidden variable explicit and trains against the deterministic teacher the live router actually runs, so there is no drift between training and serving.

Why it did not advance

The evaluator built the generation prefix twice, appending a second response marker after the instruction template already ended with one. Every adapter scored through that harness emitted a scalar cascade instead of JSON. The fingerprint — accuracy 0 and json_validity 0 and every baseline delta ≤ 0 with probability 1.0 — is the signature of a prompt-template mismatch, not a bad adapter.

Dataset shape

FieldValue
static cells810 — 10 task classes × 3 steps × 3 lanes × 3 files × 3 minutes
fairness cells500 background cells sampled from a 1,024-state recent-count grid over {0, 3, 6, 9}, shuffled with a fixed seed
total1,310 unique examples after dedup by text hash
inputstask_class (10 enum values), must_delegate, lanes, estimated steps / files / minutes, and recent_<provider> counts for claude, grok, kimi, minimax, zai
schemaowlforge.router-school.policy-distill.v3

Measurements

MetricValueNote
Balanced TF-IDF on the V3 test splitmacro-F1 0.7559131 examples, 100% zai recall — the fairness-state features do carry learnable signal
First adapter eval (invalidated)accuracy 0.0 / macro-F1 0.0 / JSON validity 0.0harness defect, not model quality
Harness test suite after the fix104 → 105 greennew test asserts exactly one response marker

Gate results

GateBarMeasuredResult
Evaluator measures the model, not itselfexactly one response marker in the inference prompttwo markers — every score through this harness was uninformativeFAIL

The fix

A single canonical inference_prompt() helper returning the exact prefix with one marker and a trailing space, landed RED-GREEN with a test that asserts the marker count. Three already-trained adapters were re-queued for re-evaluation without retraining — the adapters were never at fault, so no additional GPU hours were spent on identical weights.

Diagnostic

The structural reading that drove V4: the recent-count signal is exercised on only a thin fraction of the 1,310-cell space. Most prompt-time cells pick by fit score and never touch the portfolio-balancing sort, so the adapter never specialized on the decision that actually matters.

Artifacts

ArtifactPathVisibilitySHA-256Note
V3 train SFT manifesttooling/fixtures/v3-policy-distill/publicb6de0235529d23f47a42d0dcbc6bc368b373b68159e95a0c314738121086c864manifest SHA-256 of the train SFT split
V3 policy-distill eval (invalidated)tooling/artifacts/router-school-v3-policy-r16-eval.jsonpublicnot published in this recordretained as the record of the harness defect
V4 · 2026-08-04 · 14:08 UTC (dataset) · 14:21 UTC (cell)

Fairness specialist (3B)

First cell in the program to pass all five promotion gates

V4 GATES PASSED · LATENCY FAILED
Macro-F1 0.6912 CI95 0.5886–0.7734 · +0.5890 over majority, +0.6441 over TF-IDF

Quality gates cleared; the latency budget did not. Superseded by V5, not promoted.

SETUP

Architecture. rank-16 QLoRA on unsloth/Llama-3.2-3B-Instruct

Dataset. 5⁵ = 3,125 recent-count states over {0, 3, 6, 9, 12}, sampled to 1,024 by deterministic stride, 818 retained after the confident-selection filter · 818 train / 105 test, signature-grouped

Why this stage ran

V3 showed the fairness surface was the load-bearing signal and that it was too thinly sampled to learn. V4 isolates it: a stratified grid over the five-provider recent-count state space with a fixed task_class and a fixed must_delegate flag, so the student learns the portfolio-balancing decision without the noise of fit-score dispatch on unrelated task classes. Stride sampling rather than random shuffle keeps edge states — one provider at 12, the rest at 0 — represented in the test split instead of clustering it around the modal tier.

Why it did not advance

The registered p95 latency target is 250 ms. V4 measured 1,635.9 ms — 6.5× over budget. The fairness decision was correct and the adapter was too slow to run in the live router.

Measurements

MetricValueNote
Accuracy68.57%105-example test set
Macro-F10.6912CI95 0.5886–0.7734
Weighted-F10.6867
Strict JSON validity100%
p95 latency1,635.9 msbudget 250 ms — 6.5× over
Runtime305.554 speak util 92% · peak VRAM 3,180 MiB · peak power 332.8 W · peak temp 68 °C
Majority baselineacc 0.3429 / macro-F1 0.1021collapses to MiniMax; the task-class rule is identical because V4 fixes task_class
TF-IDF + balanced logreg baselineacc 0.1333 / macro-F1 0.0471collapsed entirely to Claude — sparse word features cannot generalize a numeric ordering

Per-class results

ProviderRecallF1
Claude92.86%0.8387
Grok47.37%0.6429
Kimi70.00%0.5833
MiniMax66.67%0.6154
Z.ai73.08%0.7755

Gate results

GateBarMeasuredResult
Adapter macro-F1 > task-class ruleby ≥ CI half-width0.6912 vs 0.1021 (CI half-width 0.0924)PASS
Bootstrap CI95 on accuracy deltaexcludes 0[0.6, 0.7714]PASS
McNemar exact two-sidedp < 0.051.06e-16 vs TF-IDF · 3.18e-6 vs majorityPASS
All five providers have recall > 0yesminimum 47.37% (Grok)PASS
Strict JSON validity rate≥ 95%100%PASS
p95 latency budget≤ 250 ms1,635.9 msFAIL

Artifacts

ArtifactPathVisibilitySHA-256Note
V4 dataset manifesttooling/fixtures/v4-fairness-specialist/manifest.jsonpublice082229bab312618f4d4e4c1590dcee3951b03d7734bc45d1c2af8d0e9dab8d7schema owlforge.router-school.fairness-specialist.v4
V4 train SFT splittooling/fixtures/v4-fairness-specialist/train-sft.jsonpublic5abcd931c25d8a56ca73cc6cfba4f8f167f8557f8e0fe5436b2fb0e59d86201a
V4 train splittooling/fixtures/v4-fairness-specialist/train.jsonpublicd10b425b4bbd706ecf3d8f722ebe4c60c82744987424de42342bb03587107cac
V4 test splittooling/fixtures/v4-fairness-specialist/test.jsonpublic1e9b03dca19423b08ed1396b3b3ae3999813a2b3869edcc48946a1fb9534f037105 rows — the frozen window every later cell is scored on
V4 adapterartifacts/checkpoints/router-v4-fairness-r16-lorapublicb44784f8f0283fcb2169b418de7d10dc186dc80277f663e6bd81c9d466e89837adapter SHA pinned in both the train and eval wrappers
V4 baselinestooling/artifacts/router-school-v4-baselines.jsonpublicnot published in this recordwritten before the GPU cell shipped
V4-1B · 2026-08-04 · 14:25 UTC

1B distillation

The 'smaller decoder' answer to the latency gate

V4-1B FALSIFIED
Accuracy 13.33% −55.24 pp against the 3B cell, for a 1.6× latency win

Failed every promotion gate. Retained as the empirical proof that the generative route was the wrong architecture.

SETUP

Architecture. rank-16 QLoRA on unsloth/Llama-3.2-1B-Instruct

Dataset. same frozen V4 train/test signatures

Why this stage ran

V4's quality was promotion-grade and only latency blocked it, so the registered next arm was the obvious one: hold the curriculum, shrink the base model, and check whether the fairness signal survives a 3× parameter reduction.

Why it did not advance

It did not survive. The 1B adapter defaulted to emitting raw scalar tokens for almost every prompt; only 14 of 105 test rows produced parseable JSON. It never learned the fairness policy — it learned that emitting a scalar is the lowest-loss response.

Measurements

MetricValueNote
Accuracy13.33%vs 68.57% at 3B — −55.24 pp
Macro-F10.1292vs 0.6912 at 3B — −0.5620
Strict JSON validity13.33%vs 100% at 3B — −86.67 pp · 14 of 105 rows parseable
p95 latency954.08 ms1.6× faster than 3B, still 3.8× over the 250 ms budget
Runtime110.253 s2.77× faster · peak VRAM 1,790 MiB (43.7% lower) · peak power 315.81 W · peak temp 65 °C
Adapter size45,118,424 bytes
Cost per cell1.8 minvs 5.1 min at 3B — 2.8× cheaper and worthless

Gate results

GateBarMeasuredResult
Adapter macro-F1 > task-class ruleby ≥ CI half-width0.1292FAIL
Bootstrap CI95 on accuracy deltaexcludes 0not clearedFAIL
McNemar exact two-sidedp < 0.05not clearedFAIL
All five providers have recall > 0yeskimi never predicted; 91 of 105 rows unparseableFAIL
Strict JSON validity rate≥ 95%13.33%FAIL
p95 latency budget≤ 250 ms954.08 msFAIL

Diagnostic

The V4 fairness task is not a generative task. It is five-class numeric classification over five input counters. The smallest viable generative decoder is still multiples over the latency budget because it has to autoregress an entire JSON document to produce one integer. A latency-budget violation on a learned adapter is a structural signal, not a parameter-tuning problem: the next arm is not 'smaller decoder', it is 're-derive the architecture from the task shape'.

Artifacts

ArtifactPathVisibilitySHA-256Note
V4-1B adapterartifacts/checkpoints/router-v4-fairness-1b-r16-lorapublic73fb4805a9ea32aa210bf60074f719317d8f8bfed13517d985ca7cb34e3887f3
V4-1B public evaltooling/artifacts/router-school-v4-fairness-1b-r16-eval.jsonpublicnot published in this record
V4-1B private evaltooling/artifacts/router-school-v4-fairness-1b-r16-eval-private.jsonprivatewithheld — private artifactraw generations — body withheld
V5 · 2026-08-04 · 14:47 UTC (receipt)

Tiny numeric MLP

The right rung of the classification ladder — and the cell that found the rule

V5 SHADOW BENCHMARK
Accuracy 99.05% 104 / 105 · macro-F1 0.9831 · stdlib CPU p95 0.0773 ms

Current cell. Every quality and latency gate cleared — and the recovered teacher rule still beats it, so the rule stays in production.

SETUP

Architecture. 10×32×32×5 ReLU MLP trained with PyTorch — 1,573 parameters, no tokenizer, no autoregressive loop

Dataset. the same frozen V4 fairness dataset and 105-row test split

Why this stage ran

V4-1B closed the generative ladder. For a five-class numeric classification over five counters the correct curriculum is rule → sparse linear → tiny MLP → boosted trees → generative decoder, and classification starts at the third rung. V5 picks that rung on the identical dataset, and the output is a class label rather than a generated document.

Measurements

MetricValueNote
Accuracy99.05%104 / 105
Macro-F10.9831
Weighted-F10.9905
Strict JSON validity100%no JSON is generated — the class is the output
Bootstrap accuracy CI9597.14–100%
Bootstrap macro-F1 CI950.9398–1.0
Stdlib CPU p950.0773 msthe deployment target — ~12,000× faster than the failed 1B decoder and ~21,000× faster than the 3B QLoRA adapter
Torch CPU p950.0216 ms
CUDA p950.1841 ms
CUDA training time12.157 sselected epoch 3
Parameters1,573model size 50,765 bytes

Two independently frozen windows

Train counts {0, 3, 6, 9}; held-out window counts {1, 2, 4, 5, 7, 8, 12}. 500 cells, generated separately, no retraining.

MetricValueNote
OOD accuracy93.40%
OOD macro-F10.9260
Improvement over majority-class baselineCI95 +0.514 to +0.612

The learned numeric policy survives a genuinely different count distribution and clears the two-independently-frozen-windows requirement.

The audit-of-the-audit

A 99.05% headline is meaningless until the student is shown to match a known teacher. The honest audit recovered the deterministic teacher policy from the dispatch guard.

  1. Select the provider with the lowest recent dispatch count.
  2. Break ties in priority order: MiniMax → Z.ai → Grok → Claude → Kimi.

That rule scores 100% on the same 105-example test set.

The correct production artifact today is the explicit rule, not the model. The MLP is an excellent mimic of a simpler rule that runs in 20 lines of stdlib. Keep V5 as a shadow benchmark and revisit only if a future routing policy becomes noisy, weighted, or adaptive.

Gate results

GateBarMeasuredResult
Accuracy / macro-F1 over every baselineCI excludes 099.05% / 0.9831 with accuracy CI95 97.14–100%PASS
All five providers have recall > 0yes104 of 105 correct across the five-class surfacePASS
Strict validity rate≥ 95%100% — no generation step to be invalidPASS
p95 latency budget≤ 250 ms0.0773 ms on the stdlib CPU serving pathPASS
Two independently frozen windowsgeneralizes to unseen counter values93.40% / 0.9260 on a 500-cell OOD windowPASS
Beats the recovered deterministic teacherstrictly above the rulerule 100% vs model 99.05% — the rule winsFAIL

Independent verification

  • 64 / 64 targeted tests and 169 / 169 full-suite tests green.
  • The job manifest was accepted on the first submission with no missing-key errors.
  • Torch and stdlib forward passes produced identical predictions on all 105 test rows; maximum logit difference 3.09e-7.
  • The GPU job completed in 33.122 s with no timeout, tracker error, or capacity issue.
  • Artifact modes enforced: 0600 on the model JSON and the private evaluation, 0664 on the public evaluation.
  • Public eval, private eval and model JSON each carry a matching SHA-256 in the receipt's provenance list.
  • The experiment tracker records the run with status success.

What this cell does not close

  • It does not produce a learned policy that beats the deterministic rule.
  • It does not generalize to task classes other than background.
  • It does not prove the rule is the best policy for any future routing change — only for the current production policy.

Artifacts

ArtifactPathVisibilitySHA-256Note
V5 public evaluationtooling/artifacts/router-school-v5-fairness-mlp-eval.jsonpublicd4f0b8f52d000f8bbb8432a962db3e62cf238cc94e50dc1de94cad6e0f74590dmode 0664 — public by design
V5 private evaluationtooling/artifacts/router-school-v5-fairness-mlp-eval-private.jsonprivatewithheld — private artifactmode 0600 — row-level bodies withheld; digest held in the private receipt
V5 modeltooling/artifacts/models/router-v5-fairness-mlp.jsonprivatewithheld — private artifactmode 0600 — digest held in the private receipt
V5 OOD windowtooling/artifacts/router-school-v5-ood-window.jsonpublicnot published in this recorda private companion window is held at mode 0600
V5 compute receiptgpu-lab/receipts/20260804T144750Z-router-school-v5-fairness-mlp.jsonpublicnot published in this recordprovenance.artifacts carries the matching digest for every artifact above
Experiment-tracker runmlflow run 7c1d3fdd4470470eba842f7bab883ec2publicnot published in this recordstatus success