Recipe Research record
Training, with a receipt.
A model remembers its training.
A receipt lets someone check it.
We are building cryptographic receipts for training under exact integer rules. A receipt commits to a step’s computation and links its result to the next. Here are three observations from the system: a check that passed, a chain that held, and a false step that was refused.
Research in progress. These are recorded experiments from our own systems, not an independent validation.
Read the recordThree observations
From the terminal01
A receipt, checked.
ACCEPTED · 0.984 seconds
The Rust verifier accepts the receipt for step 58 of a 124-million-parameter GPT-2 run. Its statement names the rules and the model state before and after the step by their hashes.
Four CPU threads; 587 proof sections, plus reduction and opening. Verification takes 0.984 seconds after 0.231 seconds of loading, with a 115 MB constraint layout. This is checking time, not the time needed to train the step or produce its receipt.

Read the captured output
# 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
Download original text 02
A run, linked.
57 records · four checks accepted
Each recorded step is checked on the GPU node, rechecked by the Python and Rust verifiers, and linked to the previous state. The runner reports 57 records in which all four checks were accepted.
One NVIDIA A100, training GPT-2 under exact integer rules. The displayed tail reaches step 58; the count is 57 accepted records, not a claim that every step from the beginning is included in this capture.

Read the captured output
# 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
Download original text 03
A false step, refused.
REFUSED · the honest step accepted
A step trained at twice the scheduled learning rate is presented as though it followed the schedule. The verifier identifies 28 optimizer-update defects and refuses it. The honest step is accepted.
A separate experiment on the smaller d64 test model, using the next verifier release. The forged receipt is refused in 0.030 seconds; the honest one is checked in 0.098 seconds. This hardening test is distinct from the 124M run above.

Read the captured output
# 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
Download original text Where the work stands
Quick to check.
Still costly to prove.
The 124M run uses one A100. Producing each receipt currently takes about an hour of GPU time; the 0.984-second result above measures only the Rust verification pass. The proof system uses sum-check / GKR over committed computation, and its constraint coverage is still being hardened.
The tampering experiment shows a fix in the next verifier release on a smaller model. It does not establish that all dishonest steps are caught. Larger models, faster proving, and outside verification remain work to do.
Keep the source
The complete capture.
Six terminal records, their rendered images, and the original evidence page. The other three records cover A100 arithmetic, agreement between two training implementations, and a step recomputed from its saved state.
Captured 15 October 2026, around 00:37 UTC. The archive preserves the supplied files unchanged; it contains recorded output, not the receipt artifacts or a runnable verifier.
Download the evidence archive