File size: 70,801 Bytes
c885c6c
 
 
 
 
 
 
 
 
 
ec70788
 
 
c885c6c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ec70788
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c885c6c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ec70788
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c885c6c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
# Recursive Masked Diffusion on Sudoku: Benchmark Saturation, Classical Baselines, and a Negative Result on Input Injection

**Recursive Masked Diffusion Models (R-MDMs) β€” a weight-shared block applied
repeatedly inside each denoising step, trained with loss at every loop β€” are an
established architecture ([arXiv:2606.18022](https://arxiv.org/html/2606.18022v1)).
This work reproduces their central finding independently, shows that the standard
Sudoku benchmark is **saturated** and replaces it, measures **classical solvers**
that prior work omits, and reports a **negative result**: the one architectural
component we added does not help once R-MDM's own conditioning is present.**

Trained from scratch: every weight randomly initialised, every tokenizer
hand-written, the primary benchmark generated rather than downloaded.
[Verify it in under a minute](#built-from-scratch--how-to-verify-it-in-under-a-minute).

> ### Relation to prior work β€” read this first
>
> We arrived at the recursive architecture independently and only afterwards
> identified [arXiv:2606.18022](https://arxiv.org/html/2606.18022v1), which
> establishes it. **The core mechanism is theirs, not ours.** Specifically, they
> already introduce: the weight-shared block applied recurrently within a
> denoising step; deep supervision via an all-steps loss; recursion as a
> substitute for parameter count; evaluation on Sudoku and text8; and
> extrapolation to more loops at inference than training.
>
> **What this work adds, and nothing more:**
>
> | contribution | status |
> |---|---|
> | **The standard split is saturated.** Plain constraint propagation solves **1000/1000** of the SATNet test set, so published accuracies on it (SATNet 98.3%) sit *below* a trivial non-learned baseline. | Checkable in seconds; invalidates the benchmark, not the models |
> | **A hard replacement benchmark**, 100k/1k, 21–28 clues, uniqueness re-verified after every cell removal, train/test leakage checked up to digit relabelling | Propagation solves 3.0% of it |
> | **Classical solver baselines** measured on our own test set | R-MDM compares only against neural baselines |
> | **Independent reproduction** that recursion substitutes for parameters, at two separate training budgets | Confirms R-MDM |
> | ~~**Input injection** β€” re-adding the token embedding at every recursion~~ | **Retracted.** Worth **+0.05** in a matched test (Β§2b). The +5.60 previously claimed here was a batch-size artefact. |
>
> **We do not claim to beat R-MDM.** Our 99.70% at 212k parameters and their 95%
> at 10.6M are measured on **different datasets**, and comparing them directly
> would be invalid. A like-for-like comparison would require running on their
> benchmark, which we have not done.

---

## 1. Benchmark

Generated, not downloaded, because the standard split is saturated: **plain
constraint propagation solves 1000/1000 of the SATNet split** (Wang et al., 2019),
so nothing measured there discriminates between methods.

| property | value |
|---|---|
| test puzzles | 1,000 held out |
| training puzzles | 100,000 |
| clues per puzzle | 20–30 (mean 24.4) |
| uniqueness | verified by exhaustive counter **after every cell removal** |
| train/test overlap | 0, including up to digit relabelling |
| metric | **board accuracy** β€” all 81 cells correct |

Generation: `src/gen_hard_sudoku.py`. An earlier generator applied the Sudoku
symmetry group to one seed grid, which confined every puzzle to a single
equivalence class and leaked **767/1000** test solutions into training; the
assertion caught it before any model trained on it. Solutions now come from a
randomised backtracking fill of an empty grid, reaching the full β‰ˆ6.7Γ—10Β²ΒΉ space
(verified: 2000/2000 distinct up to relabelling).

## 2. Main result

![passes](figures/sud_fig1_passes.png)

| method | params | 1 pass | best | n | per-seed |
|---|---|---|---|---|---|
| constraint propagation (no search) | – | – | **3.00%** | – | measured |
| greedy MRV, one sweep | – | – | 5.90% | – | measured |
| autoregressive prefix-LM ΒΉ | 2.4M | – | 0.15% | 2 | 0.3, 0.0 |
| direct recurrent classifier ΒΉ | 212k | 10.5% | 31.00% | 4 | 6.6, 21.4, 40.9, 55.1 |
| feed-forward diffusion, MDLM | 37.9M | 4.40% | 88.15% | 2 | 89.0, 87.3 |
| feed-forward diffusion, schedule-matched | 37.9M | 40.10% | 88.90% | 2 | 88.3, 89.5 |
| feed-forward, **32 distinct layers** @bs256 | 6.34M | 70.20% | 94.50% | 1 | 94.5 |
| feed-forward, **32 distinct layers** @bs64 Β² | 6.34M | – | 83.40% | 1 | 83.4 |
| recurrent, **no input injection** @bs64 Β² | 212k | – | 94.10% | 2 | 93.0, 95.2 |
| recurrent diffusion, MDLM | 212k | 87.35% | 96.55% | 2 | 97.1, 96.0 |
| recurrent, **no deep supervision** | 212k | 93.35% | 97.75% | 2 | 97.3, 98.2 |
| **recurrent diffusion, full method** | **212k** | **97.35%** | **99.70%** | 2 | 99.6, 99.8 |
| full backtracking search | – | – | 100% | – | 423 nodes mean |

Β² The `@bs64` rows are a **separate training budget** and must not be compared
against the `@bs256` rows. Comparing across them is exactly the error that
produced the retracted +5.60 (Β§2b) and the false "depth is worthless" claim (Β§4).

ΒΉ Both are **our reimplementations of other people's methods, and both failed to
reproduce their published results** β€” the recurrent classifier reaches 31%
against a reported 99.5%. These are reported as our implementation failing, **not
as comparisons we won**, and they are excluded from the margin table below.

### Comparison against the state of the art (R-MDM)

The relevant SOTA is R-MDM ([arXiv:2606.18022](https://arxiv.org/html/2606.18022v1)).
Because their benchmark differs from ours, we compare **architectures on our
benchmark** rather than quoting their number against ours.

Dr. Ayhan's instruction was to *ensure our claims hold against a baseline and the
state of the art*. We ran that test. **One of our claims did not hold**, and this
section reports it rather than the number it replaces.

#### 2b. The matched test β€” and the retraction of "+5.60"

The earlier version of this section claimed input injection was worth **+5.60
points** over an R-MDM-style arm. That comparison was invalid on two counts:

1. the injection-ON arm trained at **batch 256 for 120k steps**, the injection-OFF
   arm at **batch 64 for 110k steps** β€” a 4Γ— difference in batch size;
2. neither arm had R-MDM's per-loop step embedding `f(h, β„“, L)`, so the
   "R-MDM-style" baseline was a **weakened** version of their architecture.

We re-ran the comparison properly: identical architecture, identical
hyperparameters, identical batch size, identical step count, **step embedding on
both sides**, one component different.

| NFE | injection OFF (n=2) | OFF seed range | injection ON (n=1) | delta | ON vs OFF range |
|---|---|---|---|---|---|
| 1 | 42.00% | [8.30, 75.70] | 89.00% | +47.00 | **outside** |
| 4 | 89.30% | [84.60, 94.00] | 93.10% | +3.80 | inside |
| 8 | 93.25% | [91.70, 94.80] | 94.00% | +0.75 | inside |
| 16 | 94.50% | [93.00, 96.00] | 95.90% | +1.40 | inside |
| 32 | 96.20% | [95.30, 97.10] | 96.40% | +0.20 | inside |
| 61 | **96.85%** | [96.60, 97.10] | **96.90%** | **+0.05** | inside |

![rmdm](figures/sud_fig9_rmdm.png)

**At the operating point, input injection is worth +0.05 points β€” nothing.** With
one seed on the ON side, the only defensible test is whether it lands outside the
range spanned by the two OFF seeds. **At five of six budgets it does not.** Two
seeds of the *identical* injection-OFF configuration differ by 67.4 points at
NFE 1 and by 0.5 at NFE 61, and the ON run sits inside that band everywhere
except NFE 1.

The single-pass result (89.00% against an OFF range of [8.30, 75.70]) is the one
place any signal appears, and one seed cannot establish it. It is plausible that
injection matters most when nothing else refreshes the input β€” at NFE 1 the clues
must survive all 64 recurrences unaided, whereas multi-pass decoding re-feeds
committed tokens each pass. **We are not claiming that**; it is a hypothesis the
data hints at and our compute cannot test.

The likeliest reading of the headline result is that **input injection and R-MDM's
step embedding are redundant**: both supply a per-loop signal anchoring the
recurrence to its input, and once you have one the other adds nothing. Our
original measurement compared injection against an arm that had *neither*, and
credited injection with the difference.

**Caveats, stated plainly.** All three arms stopped at **step 80,000 of 110,000**
(wall-clock limit), so they are matched to each other but undertrained relative to
the headline runs. The injection-ON side has **n=1**. We could not add seeds: the
class allocation had 3,030 billing-minutes left and one training run at this
configuration costs ~3,600. This does not rescue the +5.60 β€” an underpowered test
is a reason to withdraw a claim, not to keep it.

#### What does survive

Recursion substituting for parameters β€” R-MDM's central claim β€” reproduces
cleanly, at **two independent training budgets**, with the comparison matched
inside each:

| budget | 32-layer feed-forward, 6.34M | recurrent 1 layer Γ— 32, 212k | gain |
|---|---|---|---|
| batch 256, 120k steps | 94.50% (n=1) | **99.70%** (n=2) | **+5.20** at 30Γ— fewer params |
| batch 64, 110k steps, injection off both sides | 83.40% (n=1) | **94.10%** (n=2) | **+10.70** at 30Γ— fewer params |

### Margin over every measured baseline

| beaten | their score | ours | margin |
|---|---|---|---|
| constraint propagation (no search) | 3.00% | 99.70% | **33Γ—** |
| greedy MRV | 5.90% | 99.70% | **17Γ—** |
| feed-forward diffusion, 37.9M params | 88.90% | 99.70% | **+10.80 pts, 180Γ— fewer params** |
| feed-forward, 32 distinct layers, 6.34M | 94.50% | 99.70% | **+5.20 pts, 30Γ— fewer params** |

Every baseline in this table was **measured on our own test set**, not cited, and
every neural row was trained at **batch 256**, the same budget as the 99.70%.

**Deliberately excluded:** our autoregressive prefix-LM (0.15%) and direct
recurrent classifier (31.00%). Both are **our** reimplementations of other
people's methods and both failed to reproduce their published results (footnote
ΒΉ). A "665Γ— margin" over our own broken code would measure our implementation,
not our method, so it is not claimed. They remain in the results table above so
the failure is visible.

The only thing not beaten is full backtracking search (100%), which is exact
search rather than a learned model and needs 423 search nodes per puzzle on
average.

Against published specialised solvers the position is **comparable, not
superior**: 99.70% at 212k parameters against the Recurrent Transformer's 99.5%
at 211k β€” but on a clue distribution that excludes the hardest 17-clue instances
(Β§8). Same league, different test set.

## 3. Parameters against accuracy

![params](figures/sud_fig2_params.png)

The gap was never capacity. The 37.9M-parameter feed-forward denoiser has **180Γ—
more parameters** than the recurrent model and scores **10.8 points worse**.
Solving a hard Sudoku takes tens of rounds of eliminate-propagate-repeat, and a
fixed 12-layer network cannot express thirty rounds at any width.

## 4. Ablation β€” what each ingredient is worth

![ablation](figures/sud_fig4_ablation.png)

**Compare only within a batch size.** An earlier version of this table pooled a
32-layer run at batch 256 (94.50%) with one at batch 64 (83.40%) into a single
"88.95%" that belonged to neither, and then read the ladder off that number. Two
published conclusions came out of that artefact and both were wrong. They are
corrected below.

### At batch 256 (120k–150k steps)

| step | configuration | params | board | gain |
|---|---|---|---|---|
| baseline | feed-forward, d=512, 12 layers, 150k steps | 37.9M | 88.90% (n=2) | – |
| + depth, βˆ’ width | feed-forward, d=128, 32 layers, 120k steps | 6.34M | 94.50% (n=1) | **+5.60** |
| + weight sharing | recurrent, d=128, 1 layer Γ— 32, 120k steps | **212k** | **99.70%** (n=2) | **+5.20** |

**Parameters fall monotonically and accuracy rises monotonically**: 37.9M β†’
6.34M β†’ 212k against 88.90% β†’ 94.50% β†’ 99.70%. The deeper model even trained for
*fewer* steps than the baseline it beats. Capacity was never the bottleneck;
iteration count is.

### At batch 64 (110k steps), injection off on both sides

| step | configuration | params | board | gain |
|---|---|---|---|---|
| baseline | feed-forward, d=128, 32 layers | 6.34M | 83.40% (n=1) | – |
| + weight sharing | recurrent, d=128, 1 layer Γ— 32 | **212k** | **94.10%** (n=2) | **+10.70** |

### Two corrections to earlier versions of this table

- ~~"Depth alone is worth nothing β€” 12 to 32 layers gains 0.05 points."~~
  **Wrong, and backwards.** That 0.05 came from comparing against the pooled
  88.95%. At matched batch size the deeper, *narrower*, 6Γ— smaller model gains
  **+5.60**.
- ~~"Input injection is worth +5.60."~~ **Retracted** β€” see Β§2b. In a matched test
  with R-MDM's step embedding present it is worth **+0.05**.

Both errors had the same cause: treating runs at different training budgets as
interchangeable seeds. `cfg_label` in `src/plot_sudoku.py` now makes batch size
part of a configuration's identity so the two cannot be pooled again.

Two further ablations on the full method:

| ingredient removed | board | cost |
|---|---|---|
| deep supervision (supervise only the last recurrence) | 97.75% | **βˆ’1.95** |
| schedule matching (plain MDLM objective) | 96.55% | **βˆ’3.15** |

Note the variance: the 32-layer row is **94.5 / 83.4** (sd 5.55), by far the
least stable configuration tested. The full method is the most stable at
**99.6 / 99.8** (sd 0.10).

## 5. Recurrence extrapolates past its training depth

![rsweep](figures/sud_fig3_rsweep.png)

Trained at R = 32, evaluated elsewhere with no retraining:

| R at inference | 1 | 2 | 4 | 8 | 16 | **32** | **64** | 128 |
|---|---|---|---|---|---|---|---|---|
| board accuracy | 0.10% | 5.40% | 48.40% | 82.00% | 92.40% | **98.30%** | **99.40%** | 99.10% / 39.70% |

Accuracy **improves past the depth it was trained at**, which is what deep
supervision predicts: each application is a valid one-step refinement, so the map
is iterable beyond where it was fit. Honest limit β€” **2Γ— extrapolation is
reliable, 4Γ— is not**: one seed holds 99.10% at R = 128, the other collapses to
39.70%.

## 5b. The model solving, and why the benchmark was rebuilt

![grids](figures/sud_fig5_grids.png)

Real model output on the three hardest held-out puzzles, at 1, 4, 16 and 61
denoising passes. Grey cells are given clues, red cells are wrong.

![recurrence](figures/sud_fig6_recurrence.png)

The same board as the shared block is applied more times. This is the iterative
refinement the method is built around, made visible rather than asserted.

![difficulty](figures/sud_fig7_difficulty.png)

Accuracy against puzzle difficulty, with sample size per point. **The curve is
flat at 99–100% across the whole 22–27 clue range**, against 3.0% for constraint
propagation on the same set. Two things follow, and the second is a limitation:
the model is uniformly strong across the difficulty range this benchmark spans,
and **the benchmark does not stress it** β€” we would need 17–21 clue puzzles, where
minimal-puzzle generation gets sharply more expensive, to find where it breaks.

![saturation](figures/sud_fig8_saturation.png)

Why the benchmark was generated rather than downloaded: search-free constraint
propagation solves **100%** of the standard SATNet split and **3%** of ours.

## 6. The instructive failure: low loss, no capability

| baseline | final training loss | board accuracy |
|---|---|---|
| autoregressive prefix-LM | **0.0486** | 0.15% |
| direct classifier, all-cell supervision | **0.0722** | 31.00% |
| **recurrent diffusion (ours)** | 0.15 | **99.70%** |

Both non-diffusion baselines reach **lower training loss than our method and
solve almost nothing.** Autoregressive errors compound unrecoverably β€” it cannot
revise, and one wrong cell destroys the board. All-cell supervision is dominated
by copying the 24 given clues, so the loss looks excellent while the 57 blanks
stay unlearned. This is why board accuracy, not loss, is the metric.

## 7. Method

```
h ← E(x)                            token embedding
repeat R times:
    h ← h + E(x)                    input injection
    h ← Block(h)                    ONE weight-shared block
    record logits(h)                every application is supervised
loss = Ξ£_r w_r Β· CE(logits_r, xβ‚€),  w_r = r/R
```

Implementation: `RecurrentDenoiser` in `src/model.py`, `recurrent_cond_loss` in
`src/diffusion.py`. Configuration d=128, 1 layer, 4 heads, R=32 training / 64
inference, chosen to match Yang et al. so the comparison isolates the diffusion
framing rather than scale.

**Input injection** re-adds the token embedding at every recursion, on the
reasoning that the clue signal would otherwise decay through thirty applications
of the same block. **That reasoning is not supported by our own measurement**: in
a matched test it is worth +0.05 points once R-MDM's step embedding is present
(Β§2b). It is retained in the default configuration because the headline runs used
it, not because we can show it helps. **Deep supervision** forces each application
to be a valid one-step refinement rather than letting the stack learn one
entangled R-step function, and it is what makes R = 64 inference work after
R = 32 training (Β§5); unlike injection, it is load-bearing β€” removing it costs
1.95 points (99.70% β†’ 97.75%, both n=2 at batch 256).

## 8. Published results and their distributions

| system | accuracy | puzzle distribution | params | reference |
|---|---|---|---|---|
| SATNet | 98.3% | SATNet split, ~36 clues | 618k | Wang et al., ICML 2019 |
| SATNet | 6.1% | RRN hard, 17 clues | 618k | via Yang et al. 2023 |
| RRN | 96.7% | RRN hard, 17 clues | 201k | Palm et al., NeurIPS 2018 |
| Recurrent Transformer | 99.5% | RRN, 17–34 clues | 211k | Yang et al., 2023 |
| Recurrent Transformer | 96.7% | RRN hardest, 17 clues | 211k | Yang et al., 2023 |
| **this work** | **99.70%** | **ours, 20–30 clues** | **212k** | β€” |

**Not directly comparable.** Our 20–30 clue range sits inside the Recurrent
Transformer's 17–34 range but excludes the hardest 17-clue instances. At matched
parameter count (212k vs 211k) the result is *competitive*. The SATNet split is
not used because constraint propagation alone solves 100% of it.

## 9. Limitations

- **The recursive architecture is not our contribution.** It is established in
  [arXiv:2606.18022](https://arxiv.org/html/2606.18022v1). We reproduce it
  independently and extend it with input injection; the framing throughout
  reflects that.
- **No like-for-like comparison with R-MDM.** They evaluate on Shah et al.
  (2024); we generate our own minimal puzzles. The two numbers are not
  comparable and we do not compare them.

- **Distribution mismatch** with all published numbers (Β§8). Not a SOTA claim.
- ~~Input injection is not separated from weight sharing.~~ ~~**Closed**: injection
  is worth +5.60.~~ **Reopened, then resolved against us.** The matched test (Β§2b)
  puts input injection at **+0.05** once R-MDM's step embedding is present. The
  +5.60 was an artefact of a 4Γ— batch-size difference between the two arms. The
  claim is withdrawn.
- **The direct-classifier reproduction failed** (31% vs 99.5% published). Not
  used as evidence; reported so the gap is visible.
- ~~`feed-forward 32L` is n = 2 but highly unstable (94.5 / 83.4).~~ **Not a seed
  effect at all**: 94.5 is batch 256 and 83.4 is batch 64. They are two budgets,
  not two seeds, and pooling them produced the false "depth is worth nothing"
  conclusion (Β§4). Each is n = 1 at its own budget.
- **Several arms are n = 1**, and the injection-ON arm of Β§2b is n = 1. Two seeds
  of one configuration differ by up to 67 points at NFE 1 and 0.5 at NFE 61, so
  low-NFE numbers in this report carry little information.
- **Compute exhausted.** 3,030 of 3,000,000 billing-minutes remained at the end;
  one further training run costs ~3,600. The open questions below cannot be
  closed with the allocation available.
- Sudoku only. Whether recurrence transfers to other constraint families is
  untested here.

## Built from scratch β€” how to verify it in under a minute

Every model in this repository is randomly initialised and trained from zero.
No pretrained weights, no pretrained tokenizer, no pretrained embeddings, no
distillation from a pretrained teacher, at any stage. This is a hard constraint
on the project, so it is stated here in checkable form rather than as an
assurance.

| what | where | how to check |
|---|---|---|
| **Weights** are random, always | `src/model.py` β€” `self.apply(self._init)` | every `nn.Linear`/`nn.Embedding` gets `N(0, 0.02Β²)`; there is no other initialisation path |
| **No pretrained loader exists** | whole tree | `grep -rn "from_pretrained\|AutoModel\|AutoTokenizer\|torch.hub\|timm" src/` returns **nothing** |
| **Tokenizers are hand-written**, 7 of them | `src/{sudoku,text8,data,graphs,qm9,sigmorphon}.py` | `grep -n "class .*Tokenizer" src/*.py` β€” each is a literal symbol list built in-repo |
| **The Sudoku vocabulary is 10 symbols** | `src/sudoku.py:32` | digits `1`–`9` plus `[MASK]`; no vendored vocab file |
| **Downloads are data, never weights** | `src/{data,text8,qm9,sigmorphon,sudoku}.py` | the only URLs are the text8 corpus, the QM9 CSV, SIGMORPHON TSVs and the SATNet zip β€” raw datasets |
| **The primary benchmark is generated** | `src/gen_hard_sudoku.py` | nothing is downloaded at all; puzzles come from a randomised backtracking fill |
| **Even the evaluator is from scratch** | `src/train_eval_lm.py` | generative perplexity in the earlier study is scored by a character LM we trained on text8 ourselves, not GPT-2 |

The largest model here is 37.9M parameters and the headline model is **212k** β€”
small enough that from-scratch training is the only sensible choice, and small
enough to retrain end to end on one MIG slice of an A100.

## Datasets

**Primary β€” generated, not downloaded.** The standard split is saturated, so it
cannot discriminate between methods.

| dataset | role | source | size |
|---|---|---|---|
| **Hard Sudoku (this work)** | train + test | generated by `src/gen_hard_sudoku.py` | 100,000 train / 1,000 test, 20–30 clues |
| SATNet Sudoku | rejected after measurement | `https://powei.tw/sudoku.zip` (Wang et al., ICML 2019) | 9,000 / 1,000, 31–42 clues |

The SATNet split was downloaded, verified (all labels valid Sudoku, all clues
consistent, zero train/test overlap) and then **rejected**: search-free
constraint propagation solves **1000/1000** of its test set, so every competent
method scores ~100% and the benchmark measures nothing. That measurement is in
`src/sudoku_validate.py` and is the reason the hard benchmark exists.

Hard-Sudoku generation is fully specified: solutions come from a randomised
backtracking fill of an empty grid (β‰ˆ6.7Γ—10Β²ΒΉ space), cells are removed in random
order, and a removal is kept **only if an exhaustive counter confirms the solution
is still unique**. Train and test solutions are disjoint even up to digit
relabelling. Training uses digit-relabelling augmentation, a genuine Sudoku
symmetry that leaves the constraint structure untouched.

**Used in the earlier study** (Β§ below), all public and all loaded from scratch:

| dataset | source | used for |
|---|---|---|
| text8 | `http://mattmahoney.net/dc/text8.zip` | character language modelling, 90M/5M/5M split |
| QM9 | `https://deepchemdata.s3.us-west-1.amazonaws.com/datasets/qm9.csv` | molecular graph generation, 133,885 molecules |
| CoNLL-SIGMORPHON 2017 | `github.com/sigmorphon/conll2017` | morphological inflection, 6 languages |
| *n*-digit addition | synthetic, `src/data.py` | unique-answer, deep-dependency probe |
| structured graph families | enumerated, `src/graphs.py` | exact total correlation and one-pass ceiling |

No pretrained weights or tokenizers are used anywhere, including the
autoregressive model used to score generated text in the earlier study.

## References

- *Recursive Scaling in Masked Diffusion Models (R-MDM).*
  [arXiv:2606.18022](https://arxiv.org/html/2606.18022v1) β€” **establishes the
  recursive weight-shared architecture with all-steps loss that this work
  reproduces.**
- Shah et al., 2024 β€” the 1.8M-board Sudoku dataset R-MDM evaluates on.
- Wang, Donti, Wilder, Kolter. *SATNet: Bridging deep learning and logical
  reasoning with a differentiable satisfiability solver.* ICML 2019.
- Palm, Paquet, Winther. *Recurrent Relational Networks.* NeurIPS 2018.
- Yang, Ishay, Lee. *Learning to Solve Constraint Satisfaction Problems with
  Recurrent Transformer.* ICLR 2023. [arXiv:2307.04895](https://arxiv.org/abs/2307.04895)
- Austin, Johnson, Ho, Tarlow, van den Berg. *Structured Denoising Diffusion
  Models in Discrete State-Spaces.* NeurIPS 2021.
- Sahoo et al. *Simple and Effective Masked Diffusion Language Models.* NeurIPS 2024.
- *Conditional Total Correlation and the Serial Depth of Adaptive Parallel
  Sampling.* [arXiv:2608.25505](https://arxiv.org/abs/2608.25505)
- *MDLMPE: Distribution Aware Positional Encoding for Masked Diffusion Language
  Models.* [arXiv:2608.03769](https://arxiv.org/html/2608.03769)
- *MDPO: Overcoming the Training-Inference Divide of Masked Diffusion Language
  Models.* [arXiv:2508.13148](https://arxiv.org/html/2508.13148v1)

## 10. Reproducing

```bash
python src/gen_hard_sudoku.py --n_train 100000 --n_test 1000 --out data/sudoku_hard
python src/train_sudoku.py --recurrent --R 32 --R_infer 64 --mode full \
    --hard data/sudoku_hard --augment --d 128 --layers 1 --heads 4 \
    --bs 256 --steps 120000 --lr 3e-4 --out runs/rec
python src/sudoku_compare.py --hard data/sudoku_hard --runs runs --pattern 'rec*'
python src/plot_sudoku.py
```

**The matched R-MDM comparison of Β§2b.** Three arms differing in one component,
with their step embedding on both sides. `--step_embed` is R-MDM's per-loop
conditioning `f(h, β„“, L)`; `--no_inject` turns off the component we tested:

```bash
for cfg in "--step_embed --no_inject --seed 0:rmdm-faithful-s0" \
           "--step_embed --no_inject --seed 1:rmdm-faithful-s1" \
           "--step_embed --seed 0:rmdm-both-s0"; do
  python src/train_sudoku.py ${cfg%%:*} --recurrent --R 32 --R_infer 64 \
      --mode full --hard data/sudoku_hard --augment --d 128 --layers 1 --heads 4 \
      --bs 64 --steps 110000 --lr 3e-4 --ckpt_every 8000 --out runs/${cfg##*:}
done
python src/eval_ckpt.py --hard data/sudoku_hard --runs runs   # reads ckpt.pt
python src/plot_rmdm.py                                       # -> sud_fig9_rmdm.png
```

`eval_ckpt.py` evaluates from `ckpt.pt` rather than `model.pt` because all three
of our runs hit the wall clock at step 80,000 and never reached the trainer's
evaluation block. **Keep the batch size identical across arms** β€” the retracted
+5.60 came from comparing arms trained at batch 256 and batch 64 (Β§4).

---

## The earlier study: two failure modes of parallel decoding

## The claim

Masked diffusion's entire value proposition is **parallel decoding**: commit many
tokens per forward pass instead of one. Quality collapses as parallelism rises,
and roughly a dozen 2026 papers attack this at inference time with better
unmasking schedules β€” confidence ranking, entropy gating, dependency-aware
ordering.

Those methods treat one symptom as one disease. There are two:

| | failure mode | why it happens | fixable by |
|---|---|---|---|
| **(i)** | the fully-masked state is never trained | a *K*-pass decode evaluates the model at ratios `{1, (Kβˆ’1)/K, …, 1/K}` and **starts from t = 1**. Continuous `t ~ U(0,1)` assigns that state probability **zero** | **training only** |
| **(ii)** | committed positions carry real mutual information | parallel decoding samples the **product** of marginals; the truth is the **joint** | **inference only** |

For (ii) the discarded dependence is the total correlation of the committed set
*S*:

```
TC(S) = Ξ£α΅’ H(xα΅’ | c) βˆ’ H(S | c)  ≀  Ξ£α΅’ H(xα΅’ | c)
```

so **the summed conditional entropy of what you commit upper-bounds the error
you incur by committing it**. If every committed conditional is a point mass the
bound is zero and independent sampling reproduces the joint exactly. No training
objective removes this term without abandoning the data distribution.

Conversely, no inference-time reordering repairs a marginal that was never fit.

**Prior work applies inference-time fixes to both.** That is why it flatlines on
arithmetic, where (ii) is identically zero and all the loss is (i).

## What we tried, and what happened

Summarised up front, because half of it is negative and burying that would
misrepresent the work:

| | approach | verdict |
|---|---|---|
| **fix (i), single budget** | train at the mask ratios one known budget visits | **works, and survives its compute control** β€” 99.9% against 0.0% at 20-digit addition even when the baseline is given 2Γ— the training; beats the MDLM objective at every budget on text8 *and* on bits-per-character |
| **architecture** | give the denoiser **absolute** position information | **works, and is the strongest result here** β€” at `t = 1` the input is uniform, so a relative encoding cannot express position-dependent marginals *at any training budget*. +88 points where marginals vary, βˆ’0.02 in the control, landing at 100.3% of the exact bound. Predicted 5/5 before measurement |
| fix (ii) | commit while summed conditional entropy stays under `B` nats | **mixed** β€” competitive on graphs, loses to fixed-`K` on text8 |
| fix (i), all budgets | sample the budget and condition on it | **fails** β€” worse at every budget on graphs, destroys the task on addition, worse BPC on text8 |

The two positives are independent and do not transfer alike: schedule matching
carries addition and text8 but does nothing on QM9, while absolute position
information carries QM9 and the graph families. They are reported as two findings
rather than merged into one combined claim.

The framework itself β€” deciding which mode a given failure belongs to, and
bounding how much of it is recoverable β€” is what survives all four.

## Fix (i): train the schedule you intend to decode at

A *K*-pass decode evaluates the model only at mask ratios `{1, (Kβˆ’1)/K, …, 1/K}`.
Standard MDLM draws `t ~ U(0,1)`, which is *uniform over the same range* β€” so the
issue is not that uniform training under-weights heavy masking. It is that
continuous `U(0,1)` places **probability zero on t = 1**, the fully-masked state
every decode begins from. Drawing `t` from the discrete set instead puts an
**atom of mass 1/K** exactly there.

Matching a *single* `K` works, and it is what the addition results below use
(`K = 1`, i.e. always `t = 1`). But it is a **commitment to one decoding
budget**, and we measured the price: a model trained for one pass scores 99.8%
at one pass and **85.7% at twenty**. That is the baseline's own disease with the
roles reversed β€” intermediate partially-decoded states are off-distribution for
a model fitted only to `t = 1`. A method shaped like that can win one operating
point but cannot dominate a quality-vs-compute curve.

### The attempted generalisation, which failed

**Any-budget masked diffusion** was meant to remove that commitment: sample the
budget per example, draw `t` from that budget's schedule, and pass the budget to
the denoiser as a logβ‚‚ embedding.

```
K ~ {1, 2, 4, …, 256}
t ~ {1, (Kβˆ’1)/K, …, 1/K}
loss = CE( model(x_t, budget=K), xβ‚€ )
```

It costs one embedding lookup and no extra forward pass, so it is cheaper than
the fixed-`K` method β€” and it does not work. The result is reported here rather
than dropped, because the reason it fails is the same arithmetic that explains
why fixed-`K` succeeds.

**20-digit addition**, against fixed-`K` (`K = 1`):

| training | 1 pass | 2 | 4 | 8 | 16 | 21 (sequential) |
|---|---|---|---|---|---|---|
| MDLM baseline | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | – |
| **fixed-K (K=1)** | **99.9** | 99.3 | 95.6 | 87.5 | 85.8 | – |
| any-budget | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |

It does not flatten the crossover; it destroys the capability, scoring zero at
every budget including a fully sequential decode. The mechanism is arithmetic: a
one-pass decode starts at `t = 1`, and the training mass landing there is
`1.000` for fixed-`K` against `(1/9) Ξ£_K 1/K = 0.222` for uniform any-budget β€” a
**4.5Γ— dilution** of the only signal that matters, on a task sitting exactly at
the learnability edge.

**Graphs**, mean over four families and two seeds, any-budget minus baseline:

| K = 1 | K = 2 | K = 4 | K = 8 | K = 15 |
|---|---|---|---|---|
| +0.3 | βˆ’2.7 | βˆ’2.9 | **βˆ’4.2** | **βˆ’31.7** |

Worse at every budget above one, and catastrophically worse at high budgets
(tree βˆ’81.6, 2-regular βˆ’43.7). Spreading training across nine budgets leaves
each one undertrained relative to a specialist, and the conditioning embedding
does not recover the difference β€” an unconditioned control sampling the same
budgets does no better.

**The negative result is the finding.** "One model for every decoding budget" is
not free, and at this scale it does not pay for itself at any budget. What
survives is the narrower claim the addition results already supported: *train
the schedule you intend to decode at.* Matching a single known budget works
extremely well (99.9% against a baseline's 0.0%); trying to serve all of them at
once works worse than either.

**Fix (ii) β€” entropy-budgeted commitment.** At each pass, rank still-masked
positions by conditional entropy and commit the longest low-entropy prefix whose
cumulative entropy stays within `B` nats. By the bound above, `B` *directly caps
the dependence discarded at that pass*, so it is an interpretable dial rather
than a tuned heuristic: `B β†’ 0` recovers sequential decoding, `B β†’ ∞` recovers
one-shot parallel decoding, and the curve between them is the quality/compute
trade-off. The number of passes becomes data-dependent, which is the point.

Measured across four graph families it is **competitive but not dominant**: it
reaches points strictly better than fixed-`K` at equal or lower NFE in some
configurations (100% validity at 11 passes where fixed-`K` needs 15) and merely
ties in others. The earlier claim that it dominates fixed-`K` was based on one
family and does not hold across all four.

Cost of the working form of (i) β€” matching one known budget β€” is one extra
forward pass per training step, which is what the compute-matched control in
Β§5b exists to account for. Cost of (ii): none.

## What each regime isolates

| Regime | Example | mode (i) | mode (ii) | one pass? |
|---|---|---|---|---|
| **Non-unique answer** | groups must agree, value free | absent | **maximal** | never β€” information-theoretic |
| **Unique, shallow deps** | morphological inflection | small | small | mostly already works |
| **Unique, deep deps** | *n*-digit addition | **dominant** | zero | fails β†’ schedule matching fixes it, pending a compute control |
| **Mixed** | natural text | present | present | where the two must compose *(running)* |
| **Exactly measurable** | structured graphs | present | **dominant** | **where the bound is verifiable β€” this is what carries the paper** |

---

## 1. Addition β€” mode (i) in isolation

Addition is the clean case: the answer is fully determined by the operands, so
every conditional is a point mass, mode (ii) is identically zero, and **all** of
the loss is mode (i). Digit *i* needs the carry out of digit *iβˆ’1*, so the
dependency is deep.

**Exact match at ONE forward pass.** Depth scaled as logβ‚‚(digits); lr 1e-4 with
long warmup, which matters β€” see Β§5.

| digits | MDLM baseline | matched schedule (ours) | seeds >90% (base β†’ ours) |
|---|---|---|---|
| 8 | 100.0 | 100.0 | 4/4 β†’ 4/4 (saturated) |
| **12** | **76.7** | **100.0** | 3/4 β†’ **4/4** |
| **16** | **25.0** | **75.0** | 1/4 β†’ **3/4** |
| **20** | **0.0** | **99.9** | 0/3 β†’ **3/3** |
| 24 | 0.0 | 33.6 | 0/3 β†’ 1/3 |

> **⚠ The 16-digit row is unsettled.** A compute-matched control β€” the plain
> baseline given **double** the training steps at the same depth β€” reaches 100%
> on **one seed of two**, and 0% on the other. So the baseline *can* solve
> 16-digit addition with enough training, but not reliably. The 25.0% figure
> below comes from a smaller configuration (10 layers, 60k steps) where both
> arms were undertrained, so it is not a clean method effect either. **Do not
> quote the 16-digit gap in any direction** until the matched-configuration
> comparison lands.

The 12-digit row is a parallelism gap: the baseline demonstrably learned the task
and simply cannot commit it in one pass. The 16-digit row is in question, per the
note above.

**The 20- and 24-digit rows are a different and stronger claim, and are labelled
as such.** The standard pass grid stops at 16, which for a 21-slot answer is not
a sequential decode, so `src/seq_check.py` re-decodes every run at one token per
pass. That settles it:

| digits | mode | @1 pass | fully sequential | reading |
|---|---|---|---|---|
| 20 | MDLM | 0.0 | **0.0** | **never learned the task** |
| 20 | ours | **99.8** | 85.7 | learned it |
| 24 | MDLM | 0.0 | **0.0** | **never learned the task** |
| 24 | ours | 33.7 | 33.3 | learned it |

The baseline is at zero **at every budget, on every seed**. Beyond 16 digits it
does not fail to *parallelise* β€” it fails to *learn*. Uniform-`t` training
touches the fully-masked state with probability zero, and a 20-long carry chain
never gets enough gradient where it matters. So at these lengths fix (i) is a
**sample-efficiency** fix, not a parallelism fix, and the 99.8-vs-0.0 gap must
not be quoted as the latter.

24 digits remains at the edge: one seed of three reaches 100%, the others near
zero. Reported as the variance it is.

### The method inverts the trade rather than closing it

At 20 digits our own model scores **99.8% at one pass but 85.7% at twenty**, and
one seed drops from 99.5% to 57.0%. More passes make it *worse*.

This is the mechanism running in reverse, and it is the strongest available
evidence for the account. A model trained with mass at `t = 1` is fitted to the
fully-masked state; walking it through intermediate partially-decoded states
visits ratios it never trained on β€” exactly the baseline's disease, with the
roles swapped. A method that simply dominated at every budget would be weaker
evidence, because it would be consistent with "we just trained better".

It also means the honest framing is not "we close the parallelism gap" but **"the
schedule you train determines the budget you can decode at"**, in both
directions.

### No inference-time method closes the gap

Mode (ii) is zero here, so the prediction is that **every** inference-time
strategy lands on the same number and extra compute buys nothing.

**12-digit addition**, the *baseline* model decoded every way:

| strategy | 1 pass | 2 | 4 | 8 | 16 |
|---|---|---|---|---|---|
| confidence | 76.7 | 76.4 | 76.4 | 76.3 | 76.2 |
| entropy | 76.7 | 76.4 | 76.4 | 76.3 | 76.2 |
| entropy-gated | 76.7 | 76.4 | 76.4 | 76.2 | 76.2 |
| margin | 76.7 | 76.4 | 76.4 | 76.3 | 76.2 |
| random | 76.7 | 77.2 | 76.9 | 76.8 | 76.4 |
| **ours (training-time)** | **100.0** | 100.0 | 100.0 | 99.9 | 99.9 |

**16-digit:** every inference-time strategy 25.0 at one pass and 25.0 at *any*
budget; ours 75.0.

Two things stand out. Every strategy family lands on the same number, and
**sixteen times the inference compute buys nothing** β€” at 12 digits it is
marginally worse. The random-order row is the cleanest statement of it: choosing
positions at random does as well as every principled ordering heuristic, because
ordering is not what is broken.

This is the control that makes the text8 result in Β§3 meaningful: the same
entropy-gated rule that does nothing here is genuinely useful there, because
there mode (ii) is nonzero.

## 2. Inflection β€” both modes small

Morphological inflection (CoNLL-SIGMORPHON 2017) has unique answers, but forms
are ~10 characters with shallow local dependencies. Six typologically diverse
languages, 2 seeds each:

| language | baseline @1 | ours @1 | baseline gap 1β†’32 | **ours gap** | gap removed |
|---|---|---|---|---|---|
| Georgian | 94.6 | 94.1 | βˆ’0.0 | βˆ’0.0 | n/a (saturated) |
| Russian | 71.6 | 72.3 | +2.2 | **βˆ’0.3** | 114% |
| German | 76.0 | 78.4 | +3.2 | **+0.2** | 94% |
| Turkish | 78.7 | 82.3 | +3.5 | **+0.8** | 77% |
| Finnish | 51.4 | 51.9 | +7.7 | **+4.9** | 36% |
| Navajo | 28.0 | 26.9 | +8.0 | **+4.5** | 44% |
| **mean** | **66.7** | **67.7** | **+4.1** | **+1.7** | **59%** |

### Which component carries it (48 runs: 6 languages Γ— 4 modes Γ— 2 seeds)

| mode | mean @1 pass | gap 1β†’32 | share of the gap removed |
|---|---|---|---|
| MDLM baseline | 66.7 | +4.1 | β€” |
| schedule matching alone | 67.7 | +3.4 | 17% |
| **`t = 1` term alone** | 67.5 | **+2.1** | **49%** |
| **both** | 67.7 | **+1.7** | **59%** |

**The `t = 1` term is the active ingredient.** On its own it removes half the
parallelism penalty β€” nearly three times what reshaping the rest of the schedule
achieves β€” and the two components are roughly additive. That is precisely what
the account predicts: what matters is training the *fully-masked state the
decoder starts from*, not redistributing mass across the schedule generally.

The honest reading: **the method removes 59% of the parallelism penalty at no
cost to one-pass accuracy (66.7 β†’ 67.7), but it does not raise the ceiling** β€”
at 32 passes it is 1.4 points *below* the baseline (69.4 vs 70.8). Concentrating
the schedule at high mask ratios necessarily spends less on the low-ratio states
that sequential decoding uses.

The dose-response is the interesting part and it goes the right way: **Georgian
has no gap and the method changes nothing; the languages with the largest gaps
get the largest absolute reductions.** A method that "helped" on Georgian would
be evidence it was doing something other than what is claimed.

Reporting Georgian and English matters: it shows where the method has nothing to
add, which is what makes the gains elsewhere credible.

## 3. text8 β€” schedule matching wins on natural language

Standard setup: text8, the conventional 90M/5M/5M character split, 27-symbol
vocabulary, 256-character windows, 12-layer denoiser trained from scratch.
Generative perplexity is scored by a held-out autoregressive character LM, also
trained from scratch on text8 (test BPC 1.539), so no pretrained model appears
anywhere in the pipeline. Two seeds per arm.

| NFE | MDLM baseline | **matched (ours)** | any-budget |
|---|---|---|---|
| 1 | 650.21 | 651.59 | 649.95 |
| 4 | 169.34 | **149.59** | 141.98 |
| 16 | 116.88 | **92.74** | 94.94 |
| 64 | 85.18 | **72.68** | 77.84 |
| 256 | 9.22 | **8.40** | 8.59 |
| **validation BPC** | 1.7292 | **1.7010** | 2.5720 |

**Schedule matching beats the published MDLM objective at every budget from 4
passes upward β€” by 20.7% at 16 passes β€” and improves bits-per-character at the
same time.** That simultaneity matters: the gain is not bought by trading
likelihood for sample quality, which is the usual way such numbers are inflated.

At one pass all three arms are indistinguishable (~650). Unconditional
generation of a 256-character block from nothing is mode (ii) at its maximum β€”
the first commit has no context to condition on β€” so no training objective helps
there, exactly as the account predicts.

Degeneracy guard: real text8 scores ppl 2.86 with a distinct-4-gram rate of
0.177 under the same evaluator. Generated text sits at ppl 8.40 and distinct-4
0.238 β€” worse than real text and slightly *more* varied, i.e. an imperfect model
rather than a collapsed one. Reporting generative perplexity without this check
is how repetition gets mistaken for quality.

The entropy budget does **not** help here: at ~99 NFE it scores 95.01 where
fixed-`K` at 64 NFE scores 72.68. On text, spending passes adaptively loses to
spending them uniformly, unlike on graphs. Reported as measured.

## 3z. The original text8 plan *(superseded)*

Addition isolates mode (i); the free-choice probes isolate mode (ii). Natural
text contains both **in the same sequence**: closing a word, a suffix or a
function word is nearly deterministic given context, while the choice of the
next content word carries real entropy. So text is where the claim that the two
fixes *compose* is actually tested, as a 2Γ—2:

| | fixed-*K* commit | entropy-budgeted commit |
|---|---|---|
| uniform-`t` training | (a) | (b) |
| matched training | (c) | (d) |

Prediction: (c) < (a) and (d) < (b) on generative perplexity at equal compute,
and the two gains are largely independent.

**A second prediction, registered before the runs finish.** If fix (i) works by
placing training mass on the ratios a decode actually visits, then matched-`K`
training should show a **crossover**, not a uniform win: better than uniform-`t`
near NFE β‰ˆ K, and *worse* far from it. Training at K = 8 puts no mass at the
ratios a 256-pass decode visits, so uniform-`t` should win at high NFE. A method
that simply dominated everywhere would be evidence the mechanism is something
other than the one claimed.

By the same logic the `t = 1`-heavy variant should be the worst of the three on
text at moderate NFE, because at `t = 1` an unconditional model can only learn
character frequencies β€” there is no context to condition on. That variant is
included to be refuted, not to win.

Standard setup: text8, the conventional 90M/5M/5M character split, 27-symbol
vocabulary, 256-character windows. Metrics:

- **validation bits-per-character** (the MDLM bound) β€” the standard likelihood
  number, and the check that sample quality is not bought by wrecking the model;
- **generative perplexity vs. number of function evaluations**, scored by a
  held-out autoregressive character LM trained from scratch on text8 itself
  (a word-piece model trained on web text would judge character-level artifacts
  through a tokenizer that never sees them);
- **entropy and distinct-4-gram rate**, reported beside it, because generative
  perplexity alone is trivially gamed by degenerate repetition.

Against the published **confidence-threshold** rule, not a top-*k* stand-in.

## 3b. Graphs β€” where the bound stops being an assumption *(partial)*

The weakness of everything above is that the central quantity is never measured.
On addition `TC = 0` by construction; on text `H(S|c)` is not computable. So the
entropy budget rests on a bound the experiments never check.

Structured graphs close that. A graph on *n* nodes is a binary sequence of
`n(nβˆ’1)/2` edge indicators β€” the same machinery, unchanged β€” but for *n* ≀ 7 the
**entire family enumerates**, making every quantity exact: true marginals,
`H(S) = logβ‚‚|F|`, `TC`, and the one-pass ceiling

```
V* = Σ_{g valid} ∏ᡒ pᡒ(gᡒ)      (what perfect marginals achieve in one pass)
```

**Proposition.** For `P` uniform on a family `F`, `V* β‰₯ 2^(βˆ’TC)`, with equality
iff `∏ᡒ pᡒ` is constant on `F`. *Every bit of total correlation among jointly
committed variables at most halves the one-pass success probability.* Proof and
verification in [`THEORY.md`](THEORY.md) Β§5.1 β€” the inequality holds across all
nine family/size combinations, and equality holds **to five decimal places** on
exactly the fixed-edge-count families, failing precisely where edge counts vary,
as the Jensen step requires.

### Both failure modes, separated by measurement

This is what no earlier task could do. Perfect matchings on 6 nodes,
`TC = 6.92 bits`, `V* = 0.825%`:

Four families, two seeds each, one-pass validity against the exact ceiling:

| family | TC (bits) | V* | achieved @1 pass (95% CI) | reading |
|---|---|---|---|---|
| 2-regular | 8.43 | 0.289% | 0.317% [0.217, 0.465] | **at the ceiling** |
| matching | 6.92 | 0.825% | 0.769% [0.602, 0.983] | **at the ceiling** |
| tree | 3.43 | 9.249% | 9.204% [8.597, 9.849] | **at the ceiling** |
| **bipartite** | **0.11** | **93.632%** | **5.884% [5.395, 6.414]** | **16Γ— below** |

This is the decomposition working as a measurement instrument, and it is sharper
than predicted.

**Where dependence is high, models land exactly on the information-theoretic
ceiling.** Three families, ceilings spanning 32Γ— (0.289% to 9.249%), and in every
case the interval contains `V*`. The residual failure there is provably mode (ii)
and no training objective can recover it.

**Where dependence is nearly absent, the model fails anyway β€” and the reason is
architectural, not statistical.** Bipartite has `TC = 0.11` bits, so one-pass
decoding should be almost free at 93.6%, yet every model reaches only 5.9%.

That gap is **not** untrained capacity. At `t = 1` every input token is `[MASK]`,
so the input sequence is **constant**. With a purely relative position encoding
the attention score between positions *i* and *j* depends only on `(i βˆ’ j)`, and
when every value vector is identical a layer's output is `v Β· Ξ£ attn = v` β€” the
same at every position. Boundary effects aside, **a RoPE-only model cannot
express position-dependent marginals at the fully-masked state.** It is an
expressivity limit, so no amount of training removes it.

The completed families confirm this exactly, and the prediction is a dichotomy
rather than a trend:

| family | marginal spread across edge slots | distinct values | one pass |
|---|---|---|---|
| matching | **0.0000** | 1 (all 0.200) | βœ… at ceiling |
| 2-regular | **0.0000** | 1 (all 0.400) | βœ… at ceiling |
| tree | **0.0000** | 1 (all 0.333) | βœ… at ceiling |
| **bipartite** | **0.5300** | 2 (0.000, 0.530) | ❌ **16Γ— below** |

Every vertex-transitive family has *exactly* constant marginals, which RoPE can
represent, and every one of them lands on its ceiling. The one family requiring
different marginals at different positions is the one that fails. Addition
escapes the problem because its prompt is visible, so the input is not constant.

### The fix, and it is one line

Swapping the relative encoding for absolute position embeddings, everything else
identical:

Complete grid, two seeds per cell:

| family | marginals | encoding | @1 pass | % of ceiling | per-seed |
|---|---|---|---|---|---|
| bipartite | **vary** | RoPE (relative) | 5.87% | 6.3% | 5.81, 5.93 |
| bipartite | **vary** | **APE (learned)** | **93.91%** | **100.3%** | 94.19, 93.63 |
| bipartite | **vary** | **sinusoidal (no params)** | **93.95%** | **100.3%** | 94.14, 93.75 |
| matching | constant | RoPE | 0.78% | 94.7% | 0.78, 0.78 |
| matching | constant | APE | 0.76% | 91.8% | 0.76, 0.76 |
| matching | constant | sinusoidal | 0.78% | 94.7% | 0.76, 0.81 |

**A 16Γ— improvement, landing exactly on the information-theoretic ceiling.** The
87.7-point gap was never untrained capacity β€” it was inexpressible, and the model
reaches the bound the moment the architecture can represent the answer.

Two things make this hard to explain any other way. **Sinusoidal encodings carry
no learned parameters at all and perform identically to learned embeddings**, so
the gain is not extra capacity β€” it is absolute position information specifically.
And the seed spread is 0.12–0.56 points, with none of the bimodality that makes
the addition results fragile.

### The control

If absolute encodings were simply better, they would help everywhere. The
mechanism says they should help **only** where marginals differ across positions.

Effect of absolute position information, by condition and encoding:

| | learned (APE) | parameter-free (sinusoidal) |
|---|---|---|
| marginals **vary** | **+88.037 points** | **+88.074 points** |
| marginals **constant** | **βˆ’0.024 points** | **+0.000 points** |

Two independent absolute encodings agree to within **0.04 points** on the
treatment and both give essentially **exactly zero** on the control β€” a ~3,700Γ—
difference in effect size between conditions. Seed variance is negligible
throughout (matching/RoPE is 0.78, 0.78).

That closes both alternative explanations. **Capacity** is ruled out by the
sinusoidal variant, which has no learned parameters and matches the learned
embedding exactly. **"Absolute encodings are simply better"** is ruled out by the
control, where they are worth nothing. What remains is the mechanism as stated:
a relative encoding cannot distinguish positions when the input is uniform, which
is precisely the state a one-pass decode begins from.

The consequence is general and goes beyond this project: **one-pass masked
diffusion needs absolute position information, and the field's default encoding
silently caps it.** Rotary encodings are near-universal in modern diffusion
language models, and few-pass decoding is the entire reason those models are
interesting.

Coverage confirms none of this is degeneracy β€” 100% of the matching and
2-regular families are recovered at K = 8.

One caution the exactness makes visible: `tree`/any-budget scores 10.06%
[9.43, 10.73], statistically **above** `V* = 9.25%`. `V*` bounds models whose
marginals match the data's, not all models β€” exceeding it means the marginals
have drifted, trading distributional fidelity for validity. See
[`THEORY.md`](THEORY.md) Β§5.1.

Coverage confirms this is not degeneracy: 100% of the 15-member family is
recovered at K = 8 and under the entropy budget. (Reporting "uniqueness" as
unique/valid would have shown 0.4% and read as collapse β€” with `|F| = 15`,
coverage is the meaningful metric.)

The entropy budget also dominates fixed-K under both training modes, reaching
100% validity at 11 passes where fixed-K needs 15.

**Status: 3 of 16 runs.** The remaining families span `TC` from 0.11 to 8.44
bits, which is where the dose-response claim β€” larger `TC`, lower ceiling, more
of the loss unfixable β€” is actually tested. One non-monotonicity in the baseline
(83.6% at K=4 falling to 76.7% at K=8) is single-seed and not yet trustworthy.

### Phase 2: QM9

The synthetic families give an exact ceiling on an artificial task. QM9 gives a
real benchmark whose metric is unambiguous β€” RDKit sanitisation enforces valency
at every atom at once, a genuine joint constraint, with no evaluator model in
the loop. A molecule is 9 node slots plus 36 edge slots = 45 tokens, so training
from scratch is cheap and the comparison isolates schedule and decoding rule
rather than scale. The axis is the one the graph-diffusion literature competes
on: **validity retained as denoising steps fall.**

The encoding is verified lossless first β€” storing aromatic bonds loses per-atom
aromaticity flags and put round-trip validity on *real* molecules at 92.65%,
which would have measured generated samples against a target the representation
could not reach. Kekulised and charge-filtered, round-trip is 100.00% while
keeping 99.1% of the dataset.

## 3c. QM9 β€” the finding on a standard benchmark

QM9 molecular generation, from scratch, 9 node slots + 36 edge slots = 45 tokens.
Validity is RDKit sanitisation, which enforces valency at every atom at once β€” an
unambiguous metric needing no evaluator model. Two seeds per arm; everything but
the named factor held fixed.

QM9 was chosen because it is the strongest case for Β§3b's prediction: its
marginals are extremely position-dependent (node slot 8 is *never* occupied,
slot 7 is occupied 80% of the time, slots 0–2 always are, and edge slots run from
never-bonded to always-bonded β€” mean total-variation distance 0.435 from the
average slot). **The prediction was registered before the runs.**

| denoising steps | standard (uniform-`t` + relative) | **+ absolute encoding** |
|---|---|---|
| 1 | 0.01% | **29.92%** |
| 4 | 29.33% | **55.80%** |
| 8 | 72.20% | 72.11% |
| 16 | 69.30% | **86.06%** |
| 32 | 67.72% | **95.74%** |
| 45 | 77.48% | **99.69%** |

**Under our flat encoding the standard formulation never exceeds 80% validity**,
and its curve is non-monotonic (72.2 β†’ 69.3 β†’ 67.7 β†’ 77.5). With absolute
position information the curve is clean and monotonic to 99.69%.

> **⚠ Half of that gap was our own representation.** Our encoding uses fixed
> node slots, so the model must learn slot-specific occupancy β€” exactly the
> position-dependence a relative encoding cannot express. DiGress does not
> generate this way: it samples the atom count *n* first, then builds an *n*-node
> graph, so the problem never arises. Re-decoding the same checkpoints with *n*
> given and unused slots observed β€” DiGress's setup, strictly generous to the
> baseline β€” the relative arm rises from 77.5% to **89.1%**, while absolute stays
> at 99.8%. The gap narrows from **22.2 to 10.7 points**.
>
> The effect is real but roughly **half** the size the flat encoding suggested,
> and the "never exceeds 80%" framing does not survive a fair baseline. The
> headline table below is kept because it is what the flat representation gives,
> but the 10.7-point figure is the one to quote.

### The uniqueness collapse

Validity alone would understate how badly the standard setup fails:

| steps | standard | + absolute |
|---|---|---|
| 8 | **4.9%** | 99.2% |
| 16 | 9.7% | 98.7% |
| 45 | 41.1% | 98.1% |

**Its 72.2% validity at 8 steps comes from emitting the same handful of molecules
repeatedly.** It is not generating a distribution, it is collapsing onto a few
points; absolute encoding holds 98–99% uniqueness throughout. Reporting validity
without uniqueness on this benchmark would hide the failure entirely.

### Steps to reach a validity target

| formulation | 50% | 80% | 90% | 95% |
|---|---|---|---|---|
| standard | 8 | **never** | **never** | **never** |
| **+ absolute** | **4** | **16** | **32** | **32** |

### What does *not* replicate here

Schedule matching β€” Β§1's finding β€” buys essentially nothing on QM9 (99.65% against
99.69% at 45 steps), and paired with a relative encoding it actively hurts (44.87%
against 77.48%). On this benchmark the position encoding is the whole story. The
two findings are independent, and only the second transfers here; that is reported
rather than blurred into a single combined claim.

## 3d. Sudoku β€” a benchmark win, and a prediction of ours that failed

SATNet's 9x9 Sudoku (Wang et al., ICML 2019), the conventional 9,000/1,000 split,
scored by **board accuracy** β€” all 81 cells correct. The published number is
**98.3%**.

Leakage audited before use: **0/1000** test puzzles appear in training, **0/1000**
solutions appear in training, and **0/1000** solutions match a training solution
even up to digit relabelling β€” which is the vector our augmentation could
otherwise have exploited. All 9,000 training and 1,000 test solutions are
distinct.

**Un-augmented arm β€” like-for-like with SATNet:**

| denoising passes | board accuracy |
|---|---|
| **1** | **87.85%** |
| **2** | **98.65%** |
| 4 | 98.85% |
| 8 | 99.70% |
| 16 | 99.90% |
| **32** | **100.00%** |

**Two forward passes already exceed the published 98.3%, and 32 passes solve all
1,000 test puzzles exactly.** A single pass β€” the whole grid committed at once β€”
solves 87.85% of them.

> **⚠ RETRACTED as a benchmark claim: this split is saturated.** Plain constraint
> propagation β€” naked and hidden singles, no search, no backtracking, about forty
> lines β€” solves **1000/1000 = 100.00%** of the test puzzles. So 100% is the
> expected result for any competent method and demonstrates nothing, ours
> included; the published 98.3% is itself *below* what a search-free classical
> solver achieves. The statistics are clean (95% CI [99.62, 100.00], both seeds
> 100.0, p = 3.6e-08 against 98.3%) and beside the point, because the comparison
> is not informative. We report the number and withdraw the claim.
>
> The clue counts explain it: 32–41 per puzzle, mean 36.2, which is easy Sudoku.
> Β§3e evaluates on instances that actually discriminate.

### The prediction we got wrong

We registered, before running, that entropy-budgeted decoding would beat fixed-`K`
here "by a very large margin, larger than anywhere else in this project", because
Sudoku is where commit *order* seemed to carry the information. It does not: it
**loses on every arm**, by 0.35 to 1.40 points.

**That prediction contradicted our own framework, and the framework was right.**
The entropy budget is the fix for mode (ii), the total correlation among
committed positions. Sudoku has a unique answer, so `TC = 0` and there is nothing
for it to fix β€” the bound says so directly, and we argued past it because
"constraint propagation" was an appealing story. Recorded because a framework
that predicts against its author's intuition and wins is worth more than one that
only ever agrees with it.

### What the win is, and is not

Two separate reasons not to claim it. The 100% comes from the **plain MDLM
baseline** with fixed-`K` decoding, so neither of this project's training findings
contributes. And the split is saturated, so the number distinguishes nothing.

## 3e. Sudoku that actually discriminates

Harder instances are built from the same solutions by stripping clues, checking
after **every** removal that the solution stays unique, so accuracy remains well
defined. The result is a difficulty axis on which a search-free classical solver
clearly fails:

| clues | constraint propagation alone |
|---|---|
| 36 (the SATNet split) | **100.0%** |
| 30 | **27.5%** |
| 26 | **4.2%** |
| 22 | **3.3%** |

The models were trained on 31–42 clues, so all three harder sets are also out of
distribution: this measures whether they learned Sudoku or learned a clue
density. The decoding comparison is repeated here because this is where it should
finally matter β€” with fewer clues the marginals are no longer near-perfect, so
commit order has something to do. *(Evaluation running.)*

## 4. The limit that cannot be trained away

Where a group of positions must agree but *which* value they take is free, the
likelihood-optimal marginal at each position is uniform over the valid values.
Two independent draws agree with probability 1/V. This is mode (ii) at its
maximum, and **no decoding schedule and no training objective can fix it**.

Tested rather than assumed: **66 runs** sweeping an entropy penalty designed to
break the symmetry, across weights spanning two orders of magnitude. Weak
settings changed nothing; strong settings destroyed the model, failing even at
fully sequential decoding.

This boundary is part of the contribution. A method claiming to fix this regime
would be claiming to beat an information-theoretic bound.

## 5. Why it should work β€” and the falsifiable prediction

See [`THEORY.md`](THEORY.md). Addition's carry is a **prefix scan**, computable
in **O(log n)** depth by carry-lookahead, and constant-depth log-precision
transformers are confined to uniform **TC⁰**, which contains addition. One-pass
decoding is therefore **expressible** at depth ~log n β€” the obstacle is
optimisation, not expressivity. Sequential decoding is best understood as
**borrowing depth from the decoding loop**: a *K*-pass decode has effective
depth β‰ˆ LΒ·K.

The account predicts minimum depth growing with **log n**, not n β€” cleanly
distinguishable from a ripple-carry account (linear) or an impossibility account
(no depth suffices). Measured, over {2,3,4,6,8,12} layers Γ— 2 seeds:

| digits | 2 layers | 3 layers | minimum depth | ratio vs 4-digit |
|---|---|---|---|---|
| 4 | 100 | 100 | 2 | 1.00Γ— |
| 8 | 99 | 100 | 2 | 1.00Γ— |
| 12 | 48 | 100 | 3 | 1.50Γ— |
| **16** | **0** | **100** | **3** | **1.50Γ—** |

The discriminating quantity is the ratio, not the absolute count, since a wide
layer can fold several scan levels into one. At 16 digits:

| account | predicted ratio | consistent with 1.50Γ—? |
|---|---|---|
| **prefix scan (ours)** | 2.00Γ— | **yes** β€” measured growth is if anything slower |
| ripple carry | 4.00Γ— | **no** |
| not expressible at any depth | β€” | **no**, 3 layers suffice |

**Ripple-carry is excluded.** Quadrupling the operand length from 4 to 16 digits
costs **one extra layer**, not four times the depth.

The 16-digit transition is also a clean threshold rather than a gradual ramp β€”
**0% at two layers, 100% at three** β€” which is the signature of a computation
that is depth-limited rather than capacity-limited or data-limited. The minimum
depth is now determined at every length tested.

## 5b. The compute-matched control

The method evaluates the model twice per training step, so at equal step counts
it spends roughly twice the baseline's training FLOPs. Any gap is therefore
confounded with compute until the baseline is given the larger budget. This
control gives the baseline **300k steps against the method's 150k**, at the same
depth.

| digits | arm | steps | @1 pass | seeds >90% |
|---|---|---|---|---|
| 16 | **MDLM baseline, 2Γ— compute** | 300k | **50.0** | **1/2** |
| 20 | MDLM baseline | 150k | 0.0 | 0/3 |
| 20 | full method | 150k | **99.9** | 3/3 |
| 24 | MDLM baseline | 150k | 0.0 | 0/3 |
| 24 | full method | 150k | 33.6 | 1/3 |

**At 16 digits the control puts the method effect in doubt without settling it.**
Given double the training the baseline reaches 100% on one seed and 0% on the
other. So the baseline *can* solve 16-digit addition, but unreliably, and the
25% β†’ 75% gap from the smaller configuration is not a clean method effect.

The per-seed values are bimodal β€” 100% or 0%, nothing between, the same pattern
as 24 digits (1/3 seeds). These tasks have a sharp learnability threshold and
seeds land on one side or the other, which is why a mean over fewer than three
seeds is close to meaningless here and why single-seed readings have misled
repeatedly in this project.

The 20-digit row is what the claim now rests on, and the 300k baseline arm there
is still running. If it also reaches ~100% on any seed, the addition result
reduces to a statement about sample efficiency rather than about parallel
decoding.

## 6. A confound that nearly produced the wrong paper

Earlier runs showed the method "failing" at 10+ digits. It was a **learning-rate
artifact**:

| layers | lr | warmup | mean @1 pass | seeds >90% |
|---|---|---|---|---|
| 10 | 3e-4 | 500 | 47.3 | 1/4 |
| 10 | **1e-4** | 500 | **100.0** | **4/4** |
| 10 | 3e-4 | **4000** | **100.0** | **4/4** |

Deeper models need a lower learning rate and longer warmup. Without this check
we would have reported that the method does not generalise, and a depth sweep
run at the broken setting would have faked a clean "depth doesn't help" curve.

## 7. Audit

`src/audit.py` gates every claim and reports **0 failures**. Eight sections:
arithmetic correctness; fixed-width answer regions; the prompt never masked; the
metric ungameable by constant output; probe ground truth valid while degenerate
output scores zero; inflection train/dev disjointness; β‰₯2 seeds behind every
reported group; **decoder contracts** (no `[MASK]` survives, decoding always
progresses, the entropy budget is monotone in `B`, context is never
overwritten); and **text8 split integrity**.

It earns its place. The decoder section caught a live bug in this work:
`torch.multinomial` was sampling over the *full* vocabulary including the
absorbing state, so positions were "committed" as `[MASK]`, stayed masked, and
decoding silently stalled β€” 15 of 32 positions unfilled at `K=1`, and the
entropy budget non-monotone at `[35, 35, 37, 17, 3]` passes. The fix is the SUBS
parameterisation: the denoiser places zero probability on `[MASK]`. Afterwards
the budget is exactly monotone, `[32, 32, 32, 16, 1]`.

Two earlier projects in this line produced confident wrong numbers β€” an
answer-length leak and the learning-rate artifact above β€” neither visible in the
accuracy tables.

## 8. Layout

```
src/
  data.py          addition + dependency-controlled probes
  sigmorphon.py    CoNLL-SIGMORPHON 2017 inflection loader
  text8.py         text8 loader, standard 90M/5M/5M split
  model.py         bidirectional transformer denoiser
  diffusion.py     objectives (fix (i)) + decoders (fix (ii))
  train_add.py     addition trainer
  train_sig.py     inflection trainer
  train_text8.py   text8 trainer + quality-vs-compute evaluation
  train_eval_lm.py from-scratch AR evaluator for generative perplexity
  train.py         probe trainer (the unfixable-limit experiments)
  seq_check.py     did the baseline fail to parallelise, or fail to learn?
  beat_baselines.py  head-to-head vs inference-time methods
  audit.py         the gate on every number above
  collect.py       tables and figures
slurm/             grids, plus unattended finalize and watchdog
```

```bash
python src/train_add.py   --mode full --digits 12 --lr 1e-4 --warmup 4000 --out runs/demo
python src/train_sig.py   --lang turkish --mode full --out runs/tur
python src/train_text8.py --mode full --evallm runs/evallm --out runs/t8
python src/audit.py
```

## 9. Honest limitations

- Addition and inflection are probes, not applications; the claim is about the
  model class, and text8 (Β§3) is the test of whether it survives real data.
- On inflection the method **lowers** the 32-pass ceiling by 1.4 points while
  removing 59% of the one-pass penalty. That trade is inherent to
  reallocating the schedule and is reported, not hidden.
- The 20- and 24-digit results are sample-efficiency claims, **not** parallelism
  claims: `seq_check.py` confirms the baseline scores 0.0% at full sequential
  depth too. Quoting them as parallelism gaps would misrepresent them.
- Our own method loses accuracy when decoded at budgets far from the one it was
  trained for (99.8% at one pass, 85.7% at twenty). This is predicted by the
  account but it is a real limitation: the training `K` is a commitment to a
  decoding budget, not a free win.
- The any-budget fix for that commitment **fails outright on addition** (0.0% at
  every budget, against 99.9% for fixed-`K`), because spreading the schedule
  dilutes `t = 1` training 4.5Γ— on a task that sits at the learnability edge. It
  helps on graphs and is untested on text. Uniform-`K` is not a safe default.
- The answer region reveals whether the sum carries out (its width is *d* or
  *d*+1). Both arms receive this equally, so comparisons are unaffected, but it
  is one bit of leakage.
- The depth-scaling prediction in Β§5 is stated and currently being measured.
- The non-unique limit is **not** solved here, and we argue it cannot be.