← All projectsGitHub
Verification games & slashing

What is the cheapest payment-and-audit protocol that makes honest ML training an equilibrium?

research/verifiable-training-mechanisms

Research programme: incentive-compatible verification of outsourced ML training; first measurement on real training finds a tolerance-tau referee passes a skip-steps cheat on 30% of steps at tau = 1e-2 while the held-out loss stays within one seed std, and the loss only suffers at tau about 10x the worst benign drift; milestone 4 prices contracts by linear programme: with a tolerance, audit-only cannot enforce full effort and the joint contract beats both checks only when the score is precise (4 of 45 cells); milestone 6: against a coordinating majority replication adds no deterrence beyond the audit and the stake is flat in the number of workers (140 cells); milestone 5: an agreement term between redundant workers is worth nothing beyond the audit once cheats copy one trajectory (0 of 1,349 random instances), and a proved one-sided bound max(C, g/p - S) holds in 2,755 instances but is vacuous for a noisy score

52 tests

What it found

An open research programme rather than a finished project. A requester pays untrusted workers to train a model; cheating is cheap and the product cannot be checked without redoing the work. The programme asks for the cheapest protocol that makes full-effort training an equilibrium when the checks are a refereed re-execution of a disputed step, a noisy proper score of the final model on held-out data, and agreement among redundant workers, and when honest workers disagree by floating-point drift. It consolidates about 60 stylised projects in this repository (verification-game, audit-allocation, verifier-bribery, effort-elicitation, reproducible-refereed-training and others). Planned: the drift tolerance priced as a cheating margin, a joint contract over audit rate, stake and score with a proved cost frontier, the stake needed against workers who share one cheap trajectory, and measurement on real small-model training. First result (H1, milestone 3): on a 64-64-10 MLP trained on the real scikit-learn digits data over 20 seeds, a referee that accepts a step within L2 distance tau passes a worker that skips, subsamples or lowers precision whenever the alternative is within tau. Benign float16 drift is at most 9×10−3 (median 3×10−5); skipping passes 30% of steps at tau = 10−2 and costs less than one seed standard deviation of held-out loss, and costs 30 standard deviations only at tau = 0.1. At drift-sized tolerances the margin is saved work rather than a worse model. One dataset, one small model and plain SGD; Milestone 4 (H2, first look) solves the cheapest contract as a linear programme on the measured skip actions: once the tolerance exceeds benign drift, audit-only cannot implement full effort at any stake, score-only costs 5.8 compute units at 540 test examples, and the joint contract is strictly cheaper than the better single check in 4 of 45 settings (ratios 0.72 to 0.81, all with 5,000 test examples). A requester who buys the quality the tolerance sanctions instead pays the effort plus one audited step. One model, the skip family only, a Gaussian score; Milestone 5 (H3, H5): with two redundant workers an agreement term lowers the cheapest contract only when cheats cannot coordinate; with one shared cheap trajectory and copying equilibria excluded it never beat the audit in 1,349 random linear-programme instances (the parameters are swept, not measured). A one-sided resolution lower bound max(C, g/p − S) is proved and never violated, exact in 2,410 of 2,755 random instances, but the proposal's constant-factor claim fails (worst ratio 2,093) and the bound is vacuous for a Gaussian score. Milestone 6 (H4): brute-force search over strong equilibria with m = 1 to 7 replicated workers sharing one cheap trajectory finds that a coalition of floor(m/2)+1 escapes replication, and that the stake deterring it, max(0, g/p − 1), does not fall with m (matches in all 140 cells), so the proposal's 1/m law is refuted for a per-job audit; the result is a model check (pure strategies, one shared cheat). H6 is untested. Milestone 34 (H4): with the auditor as a player, a catch reward cannot deter it (it earns 0 in the honest profile), and the bond that does grows about linearly in the number of workers (17 at m = 1, 134 at m = 7; brute force matches the closed form in 440 instances).

Research log

Ongoing: each run adds a batch and an entry, newest first. Source: LOG.md.

2026-10-31 · Milestone 53: does a progress check (loss on a verifier-held batch every N steps) close the liveness hole that norm checks leave? (H4/H3 link, planned before running)

### Outcome of 53 (experiments/progress_check/: run.py, results.txt, results.json, run.out, smoke_n4.out (n = 4 smoke run, not a result); n = 20 per cell)

2026-10-30 · Milestone 51: what does the check factor C buy against a reversed-SGD-step cheater who stays inside it for T steps? (H4/H3 link, planned before running)

2026-10-30 · Milestone 52 (run alongside a sibling's 51, experiments/c_sweep/; its C sweep overlaps mine, the cumulative check is new): what does tightening C buy against the reversed-step cheater, and does a cumulative (windowed-sum) check close the accumulation? (H4/H3 link, planned before running)

### Outcome of 52 (experiments/c_sweep_cum/: run.py, results.txt, results.json, run.out; n = 20 per cell, ascent adversary)

2026-10-30 · Milestone 50: can a cheater who spreads the plant over T steps, each passing the per-step aggregate check, accumulate harm? (H4/H3 link, planned before running)

2026-10-30 · Milestone 49: does an aggregate-update check (L2 norm and largest coordinate of the submitted step) close the room under the per-tensor bound? (H4/H3 link, planned before running)

### Outcome of 51 (experiments/c_sweep/: run.py, results.txt, results.json, run.out; n = 20 per cell, ascent attack, per-step thresholds)

### Outcome of 50 (experiments/spread_steps/: run.py, results.txt, results.json, run.out; n = 20 per cell, K = 4, C = 1.5, per-step thresholds)

### Outcome of 49 (experiments/aggregate_check/: run.py, results.txt, results.json, run.out; n = 20 per cell, K = 4, C = 1.5)

2026-10-29 · Milestone 48: how much harm fits under the per-tensor bound when the adversary plants k weights, not one? (H4/H3 link, planned before running)

### Outcome of 48 (experiments/bit_flips_multi/: run.py, results.txt, results.json, run.out; n = 20 per cell, K = 4)

2026-10-29 · Milestone 47: how much harm fits under the per-tensor bound when the adversary picks the site by gradient? (H4/H3 link, planned before running)

### Outcome of 47 (experiments/bit_flips_worst/: run.py, results.txt, results.json, run.out; first pass without the zero-tensor exclusion kept as results_all.txt, run_all.out)

### Erratum to 47 (found in milestone 48)

2026-10-28 · Milestone 46: does a per-tensor magnitude bound leave an adversary less room than the global bound? (H4/H3 link, planned before running)

### Outcome of 46 (experiments/bit_flips_tensor/: run.py, results.txt, results.json, run.out; growth.py, growth.txt for the honest-growth control)

2026-10-28 · Milestone 45: does the magnitude-bound check survive a reference a verifier can actually hold, and how much harm fits under the bound? (H4/H3 link, planned before running)

### Outcome of 45 (experiments/bit_flips_ref/: run.py, results.txt, results.json, run.out; Part A 120 fp32 flips, 15 harmful, same rng seed 43 as milestones 43/44; Part B 8 values of a x 20 plants)

2026-10-28 · Milestone 44: how many harmful silent bit flips does a magnitude-bound check on the weights catch? (H4, planned before running)

### Outcome of 44 (experiments/bit_flips_bound/: run.py, results.txt, results.json, run.out; same 360 flips as milestone 43)

2026-10-28 · Milestone 43: does a 16-bit stored format change the harm of one silent weight bit flip? (H4, planned before running)

### Outcome of 43 (experiments/bit_flips_format/: run.py, results.txt, results.json, run.out; 3 formats, 120 flips each, 4 seeds, d = 32)

2026-10-28 · Milestone 42: do silent bit flips in gradients and activations harm training more than flips in weights? (H4, planned before running)

### Outcome (experiments/bit_flips_site/: run.py, results.txt, results.json, run.out; 3 sites, 120 faulty runs each, 4 seeds, d = 32, 32,801 parameters)

2026-10-28 · Milestone 41: does the harm of one silent bit flip fall as the model grows? (H4, planned before running)

### Outcome (experiments/bit_flips_size/: run.py, results.txt, results.json, run.out; 4 widths, 120 faulty runs each, 4 seeds, 10,305 to 425,825 parameters)

2026-10-28 · Milestone 40: what share of silent bit flips in real training produce a faulty output, and where does that put f? (H4, planned before running)

### Outcome (experiments/bit_flips/: run.py, place.py, results.txt, results.json, place.txt, run.out; 500 faulty runs, 100 per bit class, 8 seeds, 32,801 parameters)

2026-10-27 · Paper: H4 paragraph gains milestones 37 to 39

2026-10-27 · Milestone 39: do faulty (non-strategic) workers make replication worth buying once the audit has a cost? (H4, planned before running)

### Outcome (experiments/faulty_workers/: run.py, results.txt, results.json, run.out; 648 cells, 26 odd m x 100 audit probabilities each)

2026-10-27 · Milestone 38: priced jointly, does the principal ever choose replication once the audit has a cost? (H4, planned before running)

### Outcome (experiments/joint_audit_price/: run.py, results.txt, results.json, run.out; 72 cells, 25,000+ designs searched per cell)

2026-10-27 · Milestone 37: is replication ever worth its compute? The break-even capital charge on stake (H4, planned before running)

### Outcome (experiments/replication_cost/: run.py, results.txt, results.json, run.out; 12 cells, odd m 3 to 201)

2026-10-27 · Milestone 36: with a single shared cheat mode copied with probability kappa, does replication come back? (H4; milestone 35, landed in parallel by another run, models coordination differently)

### Outcome (experiments/partial_copy_mode/: run.py, results.txt, results.json, run.out; 84 brute-force cells)

2026-10-27 · Milestone 35: does imperfect coordination among cheaters (kappa < 1) lower the deterrent stake in the m-worker game? (H4, planned before running)

### Outcome (experiments/partial_copy_mode/: run.py, results.txt, results.json, run.out; 270 brute-force cells)

2026-10-27 · Milestone 34: what does it cost to keep the auditor out of the coalition? (H4, planned before running)

### Outcome (experiments/auditor/: run.py, results.txt, results.json, run.out; 440 brute-force instances, g_i ~ U(0,1), p = 0.1, q = 0.02, m = 1 to 6)

2026-10-27 · Milestone 33: does a side-payment (transferable-utility) coalition bring back the proposal's 1/m stake law? (H4, planned before running)

### Outcome (experiments/side_payments/: run.py, results.txt, results.json, run.out; 1,080 brute-force instances, g_i ~ U(0,1), p = 0.1)

2026-10-27 · Milestone 32: the paper's H3 section gains the measured agreement table (no experiment)

2026-10-26 · Milestone 31: what agreement probabilities do real cheap gradients have, and does that make agreement worth paying for? (H3 inputs, planned before running)

### Outcome (experiments/agreement/: run.py, results.txt, results.json, run.out; 10 seeds)

2026-10-26 · Milestone 30: the paper's H6 section gains milestones 27 to 29 (no experiment)

2026-10-26 · Milestone 29: is the subsample cheat's orthogonal error harmful because it points along high-curvature directions? (H6, planned before running)

### Outcome (experiments/curvature/: run.py, results.txt, results.json, run.out; 10 seeds)

2026-10-26 · Milestone 28: for the subsample cheat, is the damage in the error component along the honest gradient or orthogonal to it? (H6, planned before running)

### Outcome (experiments/subsample_decomp/: run.py, results.txt, results.json, run.out; 10 seeds)

2026-10-26 · Milestone 27: is the damage of the subsample and stale cheats set by the size of the accepted error or by its direction? (H6, planned before running)

### Outcome (experiments/direction/: run.py, results.txt, results.json, run.out)

2026-10-26 · Milestone 26: does path-length predictor C carry to the subsample and stale cheats? (H6, planned before running)

### Outcome (experiments/h6_cheats/: run.py, results.txt, results.json)

2026-10-26 · Milestone 25: does a one-parameter correction k * C, fitted on digits, carry to the transformer? (H6)

2026-10-26 · Milestone 24: does a parameter-free path-length predictor fix H6? (planned before running)

### Outcome (experiments/h6_pathlength/: run.py, results.txt, results.json; digits 20 seeds, transformer 10 seeds)

2026-10-26 · Milestone 23: the draft compiles with the federated-learning citations (no experiment)

2026-10-25 · Milestone 22: related work gains federated-learning incentives (no experiment)

2026-10-25 · Milestone 21: cheaper-cheat results move into the paper (no new experiment)

2026-10-25 · Milestone 20: is the stale cheat expensive because reuse chains across steps? (H1), planned before running

### Outcome (experiments/transformer_stale_chain/: run.py, results.txt, results.json; 10 seeds, fixed split, honest loss 2.7252, seed std 0.0083)

2026-10-25 · Milestone 19: do cheaper cheats than skipping pass the reorder referee on the transformer? (H1), planned before running

### Outcome (experiments/transformer_cheats/: run.py, results.txt, results.json; 10 seeds, fixed split, honest loss 2.7252, seed std 0.0083)

2026-10-25 · Milestone 18: the transformer margin with the held-out block moved per seed (H1), planned before running

2026-10-25 · Milestone 17: venue-format check and proof layout (no experiment)

2026-10-25 · Milestone 16: the draft compiles; figures and full-width tables added (no experiment)

2026-10-25 · Milestone 15: all 17 references checked against the registries (no experiment)

2026-10-25 · Milestone 14: transformer results move into the paper (no new experiment)

2026-10-24 · Milestone 13: the transformer trained 5x longer (H1), planned before running

2026-10-24 · Milestone 12: bf16 referee on the transformer (H1), planned before running

2026-10-24 · Milestone 11: the margin on a small transformer (H1), planned before running

2026-10-24 · Milestone 10: paper body drafted from the log (no new experiment)

2026-10-24 · Milestone 9: the margin with the data split resampled (H1), planned before running

2026-10-24 · Milestone 8: the margin on a deeper network and a second dataset (H1), planned before running

2026-10-24 · Milestone 7: paper skeleton

2026-10-24 · Milestone 7a: H6, predicted against measured skip degradation (planned before running)

2026-10-24 · Milestone 6: collusion on a shared trajectory (H4), planned before running

2026-10-24 · Milestone 5: peer agreement (H3) and a one-sided lower bound (H5), planned before running

2026-10-24 · Milestone 4: single-check frontiers and a first look at H2

2026-10-24 · Milestone 3: benign drift and the hidden margin on real training (planned before running)

2026-10-24 · Milestone 2: one library reproducing four earlier projects

2026-10-24 · Programme opened

Paper, code and results

More in Verification games & slashing

All 19 Verification games & slashing projects →

Other research topics

Proper scoring & elicitation28Effort & peer prediction9Verification games & slashing19Detection & tolerances14Markets as routers13Prediction-market design9Paying contributors8Decentralised training systems23Digital twins & sim-to-real164LLM chip design loops40Robot manufacturing loops53Ambient AI assistant46Self-replicating manufacturing34Simulation-first design64Engineered clothing45Task-specific AI accelerators40Algorithmic chip-design loops42Open-source purpose-built robots44The software-engineering loop43Adversarial human imitation41Open-source residential construction41Autonomous multi-angle capture34Sensing, imaging and 3D31Energy supply and dense energy storage39Robot societies among people31Agentic co-design of low-cost robots27Laundry-hanging robots25Machine learning on qualitative data23Robots on the building site27Civilizations & group psychology1History & human sciences1

Produced with AI assistance (Claude). Results are from the code in this repository and are simulated or stylised unless the abstract says otherwise; nothing here implies affiliation with or endorsement by any lab, researcher or company cited. MIT licensed.