ResultReproduce the Klein-Friedmann Q-learning report in its own simulator at pinned commit 8cc8a0e
The shipped Klein-Friedmann code (github.com/ekreate/cs221-final-project @ 8cc8a0edfa04f1a93088c951e217d3cd3d6013f0) reproduces its report in its own simulator: uniform-random means 31.657, 31.733, 31.851 over 5,000 games each (report 31.2), and the Q-learner's 10,000-game test means 49.080, 49.053, 49.015 moves with standard deviations near 11.7 (report 49.61, sd 11.18) after 50,000 training games each, so both preregistered bands pass.
On this page
- Recorded
No explanation has been written for this record yet.
Technical recordMetrics, gate checks and limitations
The shipped Klein-Friedmann code (github.com/ekreate/cs221-final-project @ 8cc8a0edfa04f1a93088c951e217d3cd3d6013f0) reproduces its report in its own simulator: uniform-random means 31.657, 31.733, 31.851 over 5,000 games each (report 31.2), and the Q-learner's 10,000-game test means 49.080, 49.053, 49.015 moves with standard deviations near 11.7 (report 49.61, sd 11.18) after 50,000 training games each, so both preregistered bands pass. Two of the theory's clause-(ii) checks were decided here. (ii-a) Front-loading holds: a learner stopped after 300 training games (13,796 updates) tests at 49.0796 moves against 49.0795 for the 50,000-game learner (2,406,211 updates) on the same 10,000 test games, a difference of -0.0001; the per-1,000-game training curve is already at 46.8 in its first block and 48.2 in its last. (ii-b) The report's regularisation claim does NOT hold for the shipped configuration: with lambda = 0 the learner tests at 48.967 moves, indistinguishable from the lambda = 0.1 arm and far above random, where the report's Figure 5 says the unregularised agent fell below random. With eta = 1/t counted per move, the ridge step eta*lambda*w is of order 1e-5 for almost all of training, so the term cannot act; the report's divergence must come from a schedule the shipped code no longer contains. Units are the upstream simulator's (one point per surviving move, 200-move cap, empty starting board, dropping on a full column ends the game); nothing here is a corrected-Hardcore score or a repository cohort.
- ✓Random: 5,000-game uniform-random mean within [30.2, 32.2] for each of the three seeds — observed: means ['31.657', '31.733', '31.851']
- ✓Agent: 10,000-game test mean within [47.6, 51.6] for each of the three lambda = 0.1 seeds — observed: means ['49.080', '49.053', '49.015'] (report 49.61)
- ✓Clause (ii-a): the 300-game arm's test mean is within 2.0 moves of the seed-10 50,000-game arm on the same test seeds — observed: 50,000-game 49.080; 300-game 49.080; difference -0.000
- ✕Clause (ii-b): the lambda = 0 arm's test mean compared with the random mean (report's Figure 5 predicts below random) — observed: lambda = 0 test mean 48.967; random 31.657; lambda = 0.1 test mean 49.080; 'passed' here means the report's prediction held
Technical recordRecorded metrics
- randomMean
- 31.2000
- randomSd
- 5.1200
- agentTestMean
- 49.6100
- agentTestSd
- 11.1800
- humanMean30Games
- 73.2000
- seed10
- randomMean5000
- 31.6572
- randomSd
- 5.3286
- trainMean
- 48.1242
- testMean10000
- 49.0795
- testSd
- 11.7475
- testMedian
- 45
- testMax
- 145
- testCapped200
- 0
- updateCount
- 2,406,211
- trainBlockMeans1000First2
- 46.8300
- 47.5320
- trainBlockMeans1000Last2
- 48.3090
- 48.2310
- weights
- min_eq_elem_True
- 175.6754
- row_dets
- 33.0892
- col_dets
- 123.9736
- max_eq_elem
- 15.4247
- 1_dets
- 49.1437
- elem_det
- 138.6679
- wallSeconds
- 526.0967
- seed11
- randomMean5000
- 31.7332
- randomSd
- 5.3181
- trainMean
- 48.1982
- testMean10000
- 49.0531
- testSd
- 11.6803
- testMedian
- 45
- testMax
- 195
- testCapped200
- 0
- updateCount
- 2,409,908
- trainBlockMeans1000First2
- 47.2940
- 47.5400
- trainBlockMeans1000Last2
- 47.3910
- 48.4650
- weights
- min_eq_elem_True
- 292.4652
- row_dets
- 55.0005
- col_dets
- 206.3903
- max_eq_elem
- 24.7546
- 1_dets
- 82.4603
- elem_det
- 229.4302
- wallSeconds
- 527.6854
- seed12
- randomMean5000
- 31.8510
- randomSd
- 5.3634
- trainMean
- 48.1870
- testMean10000
- 49.0147
- testSd
- 11.7404
- testMedian
- 45
- testMax
- 125
- testCapped200
- 0
- updateCount
- 2,409,352
- trainBlockMeans1000First2
- 46.6090
- 47.2890
- trainBlockMeans1000Last2
- 48.7050
- 48.2640
- weights
- min_eq_elem_True
- 330.0664
- row_dets
- 62.0981
- col_dets
- 233.1830
- max_eq_elem
- 28.3817
- 1_dets
- 92.1482
- elem_det
- 260.4667
- wallSeconds
- 528.1099
- seed10-noreg
- randomMean5000
- randomSd
- trainMean
- 48.1237
- testMean10000
- 48.9671
- testSd
- 11.8369
- testMedian
- 45
- testMax
- 180
- testCapped200
- 0
- updateCount
- 2,406,185
- trainBlockMeans1000First2
- 46.4940
- 47.4820
- trainBlockMeans1000Last2
- 48.3950
- 48.4630
- weights
- min_eq_elem_True
- 440.5682
- row_dets
- 91.6883
- col_dets
- 331.4956
- max_eq_elem
- 32.2473
- 1_dets
- 111.6859
- elem_det
- 332.4404
- wallSeconds
- 501.3658
- seed10-300
- randomMean5000
- randomSd
- trainMean
- 45.9867
- testMean10000
- 49.0796
- testSd
- 11.6295
- testMedian
- 45
- testMax
- 130
- testCapped200
- 0
- updateCount
- 13,796
- trainBlockMeans1000First2
- 45.9867
- trainBlockMeans1000Last2
- 45.9867
- weights
- min_eq_elem_True
- 33.1054
- row_dets
- 6.2036
- col_dets
- 26.0357
- max_eq_elem
- 4.7284
- 1_dets
- 9.2904
- elem_det
- 28.6006
- wallSeconds
- 72.7772
- pythonSeeds
- 0
- 1
- 2
- testMeansLambda0p1
- 48.9150
- 49.2441
- 49.1112
- lambda0TestMeanSeed0
- 48.9674
- randomMeans5000
- 31.7044
- 31.8152
- 31.8732
- note
- unregistered scratchpad run preceding preregistration; no phase reseeding; not evidence
- CHECK/validation tier: an external simulator with its own rules (survival score, 200-move cap, empty opening board, full-column drops end the game, sequential within-wave reveal semantics). No repository seed was read and no Hardcore score exists here.
- The gate on clause (ii-b) is recorded as failed because the report's prediction (unregularised below random) did not hold; this is a finding against the report's explanation, not a defect of the run.
- The 300-game and 50,000-game arms share their 10,000 test seeds by phase reseeding of Python's global RNG, a harness convention the upstream code lacks; the upstream flow would have compared different test games.
- An unregistered smoke run at the identical configuration (Python seeds 0-2) preceded preregistration and is disclosed in metrics.smokeRunDisclosed; the registered arms used disjoint seeds 10-12.
- Five arms ran concurrently on a 12-core laptop; wall times are indicative only. The upstream repository has no license, so its files are not retained in this repository; the run directory keeps a fetched copy and the manifest records its hashes.
- Three training seeds cannot estimate the between-seed spread of the agent mean more precisely than about 0.03 moves; the bands, not the spread, are the gate.
Recorded against Reproduce the Klein-Friedmann Q-learning report in its own simulator at pinned commit 8cc8a0e.
Agent contextHow to extend this record
To add a reader-facing explanation, write web/content/research/RS-20260902T082726Z-75606ce7.mdx; it renders above this record on the next request. The recorded metrics, gate checks and limitations are in the technical record above.
Record file: research/results/RS-20260902T082726Z-75606ce7.json, validated against research/schemas/result-v1.schema.json.
- Run ids
RUN-20260902T081648Z-f0c96f48
- Contribution ids
CT-20260902T082510Z-4af4b77b
- Per-game artifact
runs/RUN-20260902T081648Z-f0c96f48/kf-reproduction/seed10.json(sha25603d4db87000832bc93bd43905ff791b4e45fb8b45d270fbb4f28ed665224c2e7, 65000 records)- Artifact manifest
runs/RUN-20260902T081648Z-f0c96f48/kf-reproduction/manifest.json- Machine profiles
research/system-profiles/MACH-20260902T080517Z-dec42aab.json