Recipe

Storage today keeps a copy. We keep the recipe — and prove it still works.

We train neural networks under exact integer rules, so every training step is bit-for-bit reproducible across machines (measured on the A100 and on ARM and x86 CPUs), and we attach to every step a cryptographic receipt that anyone can verify in about a second. A model's checkpoints can then be replaced by its training document and its chain of receipts. Below is unedited terminal output from our running system, captured live on Thu Oct 15 00:37:05 UTC 2026.

A training run kept as a chain of receipts

GPT-2 (124M parameters) trained step by step on one NVIDIA A100. Every step produces a receipt — a succinct sum-check / GKR proof over the step's committed computation — that is checked on the GPU node, re-checked by two independent verifiers (Python and Rust), and linked to the previous step's state. 57 steps recorded with all four checks ACCEPTED (the runner's own state file).

A training run kept as a chain of receipts
Raw terminal output (verbatim)
# A GPT-2 (124M) training run kept as a chain of receipts: each step checked on the GPU node, by two verifiers, and linked
azureuser@controller:~$ grep -c 'nodeC=ACCEPTED py=ACCEPTED rs=ACCEPTED chain=ACCEPTED' /tmp/c105/chain_runner.state; tail -4 /tmp/c105/chain_runner.state | cut -c1-118
57
2026-10-14T20:49:25Z a100x-145 step=55 nodeC=ACCEPTED py=ACCEPTED rs=ACCEPTED chain=ACCEPTED settle=HOLDS ktree=/home/
2026-10-14T21:45:54Z a100x-146 step=56 nodeC=ACCEPTED py=ACCEPTED rs=ACCEPTED chain=ACCEPTED settle=HOLDS ktree=/home/
2026-10-14T22:47:17Z a100x-147 step=57 nodeC=ACCEPTED py=ACCEPTED rs=ACCEPTED chain=ACCEPTED settle=HOLDS ktree=/home/
2026-10-15T00:28:53Z a100x-148 step=58 nodeC=ACCEPTED py=ACCEPTED rs=ACCEPTED chain=ACCEPTED settle=HOLDS ktree=/home/
azureuser@controller:~$ date -u
Thu Oct 15 00:37:03 UTC 2026

One 124M training step's receipt, verified in under a second

The Rust verifier checks a full 124M-parameter training step's receipt (587 proof sections, a 115 MB constraint layout) in 0.98 s on 4 threads. The statement names the exact rules text and the model state before and after the step by their hashes.

One 124M training step's receipt, verified in under a second
Raw terminal output (verbatim)
# A 124M-parameter GPT-2 training step's receipt verified by the Rust verifier
azureuser@controller:~$ /home/azureuser/recipe/rust/receipt-verify/target/release/receipt-verify /home/azureuser/BREV-A100/a100x-148/doc-artifact --threads 4 --tape --quiet; python3 -c "import json; s=json.load(open('/home/azureuser/BREV-A100/a100x-148/doc-artifact/manifest.json'))['statement']; print('step', s.get('step'), '| rules', s['rules4_sha256'][:16], '| params_before', s['params_before'][:16], '| params_after', s['params_after'][:16])"
verdict: ACCEPTED; verifier wall 0.984 s
loaded in 0.231 s; verified in 0.984 s (4 threads); 587 sections + reduction + opening; layout.bin 115 MB
step 58 | rules 6ef1981bb7a32dfc | params_before 9a2098bac25c11b5 | params_after 88e7782d61e88519
azureuser@controller:~$ date -u
Thu Oct 15 00:37:05 UTC 2026

Tamper-evident: a forged training step is refused

A step trained at twice the scheduled learning rate, presented under a statement that claims the schedule's rate, is REFUSED with the exact defect named; the honest step is ACCEPTED (our next verifier release, on our small d64 test model).

Tamper-evident: a forged training step is refused
Raw terminal output (verbatim)
# Forgeries refused: a training step at 2x the scheduled learning rate (d64 test model) vs the honest step
azureuser@controller:~$ /tmp/c105/x85/bin/receipt-verify-c39238d9 /tmp/c105/x85/m1/B/F3/art --threads 4 --quiet | head -3 | cut -c1-140; /tmp/c105/x85/bin/receipt-verify-c39238d9 /tmp/c105/x85/m1/B/H64/art --threads 4 --quiet
  REFUSE  optimizer update: 28 defect(s), first: adamw/limb:c=2:l=2/c7/update-lo: the sgn coefficient is [6710], the statement's lr_q is 335
verdict: REFUSED; verifier wall 0.030 s
loaded in 0.024 s; verified in 0.030 s (4 threads); 913 sections + reduction + opening; layout.bin 1 MB
verdict: ACCEPTED; verifier wall 0.098 s
loaded in 0.025 s; verified in 0.098 s (4 threads); 913 sections + reduction + opening; layout.bin 1 MB
azureuser@controller:~$ date -u
Thu Oct 15 00:37:05 UTC 2026

Hardware-exact: the A100 tensor core, reproduced bit for bit

Our emulator of the A100's bf16 tensor-core matrix multiply agrees with the card on 4,294,967,296 swept outputs plus 6,832,128 adversarial ones — 0 mismatches — run on the GPU and checked on the CPU.

Hardware-exact: the A100 tensor core, reproduced bit for bit
Raw terminal output (verbatim)
# The A100's bf16 tensor core matches our bit-exact emulator: 4.29 billion outputs, 0 mismatches
azureuser@controller:~$ tail -13 /home/azureuser/BREV-A100/tc-q1b/out/chain.log | cut -c1-150
TC-Q1B sweep twin vs numpy H1 (first batch, 524,288 outputs, all regimes): 0 disagreements
TC-Q1B sweep: 4,294,967,296 outputs in 512 batches, 58.5 s: vs H1 0 mismatches; card -0 0; H0's -0 events 112 (vs H0 112 mismatches)
   bits      H1      0 /    537,395,456   card -0     0   H0's -0 events      0   H0      0
   typical   H1      0 /    536,732,672   card -0     0   H0's -0 events      0   H0      0
   spread    H1      0 /    536,734,464   card -0     0   H0's -0 events      0   H0      0
   tiny      H1      0 /    536,681,472   card -0     0   H0's -0 events      0   H0      0
   huge      H1      0 /    536,631,552   card -0     0   H0's -0 events      0   H0      0
   narrow    H1      0 /    537,170,176   card -0     0   H0's -0 events      0   H0      0
   zeros     H1      0 /    536,658,688   card -0     0   H0's -0 events    112   H0    112
   specials  H1      0 /    536,962,816   card -0     0   H0's -0 events      0   H0      0
TC-Q1B RESULT: adversarial H1 0 / 6832128, card -0 0, H0 117037, FMA 2773239; reruns identical True; twin-vs-numpy H1 0 H0 0; sweep H1 0 / 4294967296,
TC-Q1B VERDICT: YES (H1 = 0 mismatches everywhere, no -0 from the card)
TC-Q1B DONE Wed Oct 14 22:51:00 UTC 2026
azureuser@controller:~$ date -u
Thu Oct 15 00:37:05 UTC 2026

Bit-exact training: two independent implementations agree

Our integer training rules are written twice (numpy and torch). Run on the same data they produce byte-identical model states and byte-identical witnesses: 1,034 of 1,034 files identical.

Bit-exact training: two independent implementations agree
Raw terminal output (verbatim)
# Bit-exact training: two independent implementations (numpy and torch) produce identical bits
azureuser@controller:~$ grep -E '^TRAINED BITS|^TWINS|^witness identity: 1034' /tmp/c105/x85/m1_A.out | cut -c1-160
TRAINED BITS A96n vs A96x: EQUAL params_before 20dd1d78db7f649c, moments_before 24fbdd9df25d901d, params_after cff83ad5518c5a01, moments_after f9715bda72b0d885
TRAINED BITS A96t vs A96x: EQUAL params_before 20dd1d78db7f649c, moments_before 24fbdd9df25d901d, params_after cff83ad5518c5a01, moments_after f9715bda72b0d885
TRAINED BITS A64n vs A64x: EQUAL params_before 2e3a04f44530b1d3, moments_before c7488cc349808b92, params_after 063a19bbfd94676d, moments_after a16e663f021e5848
TWINS: the numpy and torch manifests are IDENTICAL (751,586 / 751,586 bytes)
TRAINED BITS AND TWINS: HOLD
witness identity: 1034 of 1034 files identical, 0 differ, 0 only in A, 0 only in B; A 1034 files 55,617,118 B, B 1034 files 55,617,118 B -> IDENTICAL
azureuser@controller:~$ date -u
Thu Oct 15 00:37:05 UTC 2026

Resurrection: a training step regenerated from its saved state

Re-executing step 57 from the saved state of step 56 reproduces the original run's 176.6 GB witness byte count and its 27.29 billion-lookup census exactly, with 0 mismatches — the basis of resurrection: a state is recovered by re-running the document's steps rather than by storing it.

Resurrection: a training step regenerated from its saved state
Raw terminal output (verbatim)
# Resurrection: the trained state regenerated from the document, matched against the chain
azureuser@controller:~$ grep -E 'doc A: exit' /home/azureuser/BREV-A100/x84lf3-s57/run.log | grep -oE 'wall_s=[0-9]+|witness_bytes=[0-9]+|mismatches=[0-9]+|census_lookups=[0-9]+' | tr '\n' ' '; echo; grep -E 'doc A: exit' /home/azureuser/BREV-A100/a100x-147/run.log | grep -oE 'wall_s=[0-9]+|witness_bytes=[0-9]+|mismatches=[0-9]+|census_lookups=[0-9]+' | tr '\n' ' '; echo
wall_s=252 witness_bytes=176622499005 mismatches=0 census_lookups=27287690852 
wall_s=264 witness_bytes=176622499005 mismatches=0 census_lookups=27287690852 
azureuser@controller:~$ date -u
Thu Oct 15 00:37:05 UTC 2026
Where we are, plainly. The chain above is a real 124M-parameter run on one A100; each receipt takes about an hour of GPU time to produce today, and the receipts' constraint coverage is being hardened (forgeries we found are refused by the next verifier release; open items are tracked in our pre-registered research log). More GPU time goes directly into proving more steps, faster provers, and larger models.