Smallest transformer that can add two 10-digit numbers
Python
379
34 commits
updated Mar 26, 2026
Challenge: Build the smallest transformer that can add two 10-digit numbers with >= 99% accuracy on a held-out 10K test set.
This started with Addition Under Pressure, where I gave Claude Code and Codex the same prompt: train the smallest possible transformer that can do 10-digit addition with at least 99% accuracy. Claude Code came back with 6,080 parameters and Codex came back with 1,644. The community has since pushed this dramatically lower.
Maintained by Dimitris Papailiopoulos (@dimitrispapail).
We track two categories:
Both are valid. Both are interesting.
| Rank | Params | Accuracy | Author | Built with | Architecture | Key Tricks | Link |
|---|---|---|---|---|---|---|---|
| 1 | 6* | 100% | zcbtrak | 1L Qwen-derived decoder, d=2, 1h, hd=2, ff=2 (fixed Q, folded norm) | RoPE period-19, hardcoded Q_proj (PE exemption), norm weights folded into tied output head, tied carry hinge gate, shared carry-scale scalar | gist | |
| 2 | 8 | 100% | kswain98 | 1L Qwen-style decoder, d=2, 1h, hd=2, ff=2 | RoPE period-19, phase-tied Q projection (1 param), coupled quadratic embedding (1 param), tied carry hinge gate, shared carry-scale scalar | repo | |
| 3 | 10 | 100% | lokimorty | 1L Qwen-derived decoder, d=2, 1h, hd=2, ff=2 | RoPE period-19, parametric tied embedding, gate tying via algebraic identity, merged carry scalar | gist | |
| 4 | 12 | 100% | lokimorty | 1L Qwen-derived decoder, d=2, 1h, hd=2, ff=2 | RoPE period-19, parametric tied embedding, sparse attention/MLP, constructive carry hinge | gist | |
| 5 | 20 | 100% | yieldthought | 1L decoder, d=2, 1h, hd=2 | Quadratic tied embedding + tied output head, RoPE-19 digit routing, sparse tied V/O, two-hinge ReLU MLP, parameterless pre-norm | gist | |
| 6 | 27 | 100% | Wonderfall (@w0nderfall) | 1L decoder, d=2, 1h, hd=2 | Tied Q/K + V/O, cross-tied W_vo as MLP w2, factorized quadratic embedding, compressed MLP w1, RoPE period-19 | gist | |
| 7 | 28 | 100% | jacobli99 | 1L decoder, d=2, 5h (MQA), hd=2, ff=4 | Tied parabolic decode, RoPE digit routing, sparse O-proj, tied MLP, matrix broadcast | gist | |
| 8 | 31 | 100% | Arch222 | 1L decoder, d=3, 4h/1kv, hd=2, ff=4 | RoPE offset-targeted queries, sparse O-proj, SwiGLU carry detection, tied embed decode | repo | |
| 9 | 33 | 100% | fblissjr | Claude Code + Gemini | 1L decoder, d=3, 3h (d_head=1), ff=4 | ALiBi prefix sum for carry, e^80 softmax anchoring, residual cancellation head, 2-hinge ReLU step, parabolic LM head, float64 | repo |
| 10 | 36 | 100% | alexlitz | 2L decoder, d=5, 5h+1h | ALiBi slope=log(10) for base-10 weighting, sparse embed, gated ReLU FFN, float64 | gist | |
| 11 | 50 | 100% | lichengliu03 | 1L custom GPT, d=4, 2h, hd=2 | Factorized embed, rotation Q (2 angles), tied embed+V dir, rank-1 MLP, parabolic head, sinusoidal PE (period 11) | repo | |
| 12 | 66 | 100% | cosminscn | 1L nanoGPT, d=4, 2h | Rotation Q (2 angles), sparse c_proj (2 nonzero), parabolic lm_head, factorized embed, sinusoidal PE (period 11) | gist | |
| 13 | 87 | 100% | bingbangboom-lab | 2L Qwen3, d=5, 2h/1kv, hd=2, ff=3 | Cross-layer sharing, rank-1 projections, sparse gate, low-rank head, frozen scaling params | gist | |
| 14 | 93 | 100% | jacobli99 | 1L decoder, d=2, 5h (MQA), hd=2, ff=4 | Tied parabolic decode, RoPE digit routing, ReLU carry detection | gist | |
| 15 | 111 | 100% | corbensorenson | Codex | 1L decoder, d=3, 4h/1kv, hd=2, ff=2 | Tied embed, RoPE, SwiGLU, GQA | repo |
| 16 | 116 | 100% | nino | 1L Qwen3, d=3, 4h/1kv, hd=2 | Tied embed, shared RMSNorm vectors, RoPE (hd=2) | gist | |
| 17 | 121 | 100% | Wonderfall (@w0nderfall) | Codex | 1L Qwen3, d=3, 4h/1kv, hd=2, ff=2 | Tied embed, RoPE digit routing, carry via final norm, SiLU wrap detection | gist |
| 18 | 130 | 100% | cosminscn | 1L nanoGPT, d=4, 2h | Rank-1 linear, factorized embed, sinusoidal PE (period 11), ReLU carry detection, parabolic logit decoding | gist | |
| 19 | 130 | 100% | Wonderfall (@w0nderfall) | Codex | 1L Qwen3, d=3, 4h/1kv, hd=2, ff=3 | Tied embed, RoPE digit routing, SiLU carry logic | gist |
| 20 | 139 | 100% | Wonderfall (@w0nderfall) | GPT-5.2 Pro + Codex | 1L Qwen3, d=3, 4h/1kv, hd=2 | Tied embed, RoPE digit routing, SiLU carry logic | gist |
| 21 | 148 | 100% | bingbangboom-lab | 2L Qwen3, d=5, 2h/1kv, hd=2, ff=3 | Rank-1 linear, factorized embed, sparse gate, param-free norm, low-rank head, cross-layer sharing | gist | |
| 22 | 177 | 100% | xangma (@xangma) | GPT + Codex | 2L Qwen3, d=5, 2h/1kv, hd=2 | Rank-1 linear, factorized embed, sparse gate, param-free norm, low-rank head | gist |
| 23 | 197 | ~100%** | xangma (@xangma) | GPT + Codex | 2L Qwen3, d=5, 2h/1kv, hd=2 | Rank-1 linear, factorized embed, sparse gate, param-free norm | gist |
* Parameter count debated: the 6 counted parameters sit within an architecture that has 4 additional hardcoded weight values (Q projection and RMSNorm weights) that were counted as parameters in the parent 10p submission. Under strict counting this model has 10 unique weight values; under the submitter's accounting, 6. See #75 for discussion. We may be approaching the practical minimum for this architecture family.
** Passed 8,192 random tests; not independently verified on our 10K test suite yet.
| Rank | Params | Accuracy | Author | Built with | Architecture | Key Tricks | Link |
|---|---|---|---|---|---|---|---|
| 1 | 36 | 100% | tbukic | SuperchargeAI + Claude Code | 1L Qwen3, d=3, 1h/1kv, hd=4, ff=2, RoPE θ=3, SwiGLU | Circular arc embedding (3 params), K=rotation(Q), V=Q, tied O=Q^T, all RMSNorms shared, tied QK norms, down=rotation(up^T) | repo |
| 2 | 39 | 99.91% | lokimorty | 1L Qwen3, d=3, 1h/1kv, hd=4, ff=2, RoPE θ=3, SwiGLU | Circular arc embedding, tied K=V, tied Q/O readout, shared RMSNorms, shared anti-quarter QK norm, repeat-mix shared block | gist | |
| 3 | 41 | 100% | tbukic | SuperchargeAI + Claude Code | 1L Qwen3, d=3, 1h/1kv, hd=4, ff=2, RoPE θ=3, SwiGLU | Circular arc embedding (3 params), K=rotation(Q), V=Q, tied O=Q^T, all RMSNorms shared, tied QK norms | repo |
| 4 | 44 | 100% | tbukic | SuperchargeAI + Claude Code | 1L Qwen3, d=3, 1h/1kv, hd=4, ff=2, RoPE θ=3, SwiGLU | Circular arc embedding (3 params), K=Q, V=Q, tied O=Q^T, all RMSNorms shared, pure grokking (no targeted FT) | repo |
| 5 | 45 | 100% | tbukic | SuperchargeAI + Claude Code | 1L Qwen3, d=3, 1h/1kv, hd=4, ff=2, RoPE θ=3, SwiGLU | Circular arc embedding (3 params), K=rotation(Q), V=Q, tied O=Q^T, all RMSNorms shared | repo |
| 6 | 52 | 100% | Enara Vijil | 1L Qwen3, d=3, 1h/1kv, hd=4, ff=2, RoPE θ=3, SwiGLU | Circular arc embedding, tied K=V, tied O=Q^T, all RMSNorms shared, shared QK norms, Grokfast-EMA | repo | |
| 7 | 55 | 100% | tbukic | SuperchargeAI + Claude Code | 1L Qwen3, d=3, 1h/1kv, hd=4, ff=2, RoPE θ=3, SwiGLU | Circular arc embedding (3 params), K=αQ, gate=α·up, tied O=Q^T, shared block RMSNorms | repo |
| 8 | 57 | 100% | evindor | Claude Code + Codex | 1L decoder, d=5(2+3), 1h, qk=4, hd=5, ff=2 | Parametric circular embed, tied V/O, tied Q/K+phase, tied fc2=head_proj, rank-1 out, shared norm | repo |
| 9 | 58 | 100% | tbukic | SuperchargeAI + Claude Code | 1L Qwen3, d=3, 1h/1kv, hd=4, ff=2, RoPE θ=3, SwiGLU | Circular arc embedding (3 params), K=αQ, gate=α·up, tied O=Q^T | repo |
| 10 | 62 | 100% | tbukic | SuperchargeAI + Claude Code | 1L Qwen3, d=3, 1h/1kv, hd=4, ff=2, RoPE θ=3, SwiGLU | Circular arc embedding (3 params), tied K=V, tied O=Q^T, tied lm_head, Adam no weight decay | repo |
| 11 | 67 | 100% | evindor | Claude Code + Codex | 1L decoder, d=5(2+3), 1h, qk=4, hd=5, ff=2 | Parametric circular embed (3p), tied V/O, tied Q/K+phase, rank-1 out, shared norm, carry-mix curriculum | repo |
| 12 | 83 | 100% | tbukic | SuperchargeAI + Claude Code | 1L Qwen3, d=3, 1h/1kv, hd=4, ff=2, RoPE θ=3, SwiGLU | Tied embed, tied K=V, tied O=Q^T, shared all RMSNorms, iterated targeted fine-tuning | repo |
| 13 | 86 | 100% | tbukic | SuperchargeAI + Claude Code | 1L Qwen3, d=3, 1h/1kv, hd=4, ff=2, RoPE θ=3, SwiGLU | Tied embed, tied K=V, tied O=Q^T, shared block RMSNorms, L-BFGS + targeted fine-tuning | repo |
| 14 | 89 | 100% | tbukic | SuperchargeAI + Claude Code | 1L Qwen3, d=3, 1h/1kv, hd=4, ff=2, RoPE θ=3, SwiGLU | Tied embed, tied K=V, tied O=Q^T, RoPE (zero params), QK norms, 4-stage grokking-aware training | repo |
| 15 | 95 | 99.03% | tbukic | SuperchargeAI + Claude Code | 1L Qwen3 + circular arc embed, d=3, 1h/1kv, hd=4, ff=3, RoPE θ=3, SwiGLU | Circular arc embedding (3 params), tied lm_head to dynamic embed, RoPE, QK norms | repo |
| 16 | 101 | 100% | tbukic | SuperchargeAI + Claude Code | 1L Qwen3, d=3, 1h/1kv, hd=4, ff=2, RoPE θ=3, SwiGLU | Tied embed, tied O=Q^T, RoPE (zero params), QK norms, cosine LR + targeted fine-tuning | repo |
| 17 | 122 | 99.95% | staghado | 1L Qwen3, d=3, 1h/1kv, hd=4, ff=3 | Tied embed, RoPE θ=3 | repo | |
| 18 | 140 | 100% | dimopep | Claude Code | 1L decoder, d=4, 1h/1kv, hd=4, ff=4, RoPE θ=3, SwiGLU | Tied K=V, tied O=Q^T, tied lm_head, QK-norm | gist |
| 19 | 234 | 99.91% | JackCai1206 | Claude Code | 1L decoder, d=6 (3 tok + 3 pos), 2h, hd=3, ff=2 | Parametric spiral PE (4 params), split-head attn (QK-pos/V-tok), shared XYZ pos, tied output head, LSB-first | repo |
| 20 | 262 | 99.95% | lichengliu03 | 1L decoder, d=4, 1h, ff=8 | Rank-3 factorization, shared-A tied-KV, RMSNorm, tied embed, curriculum learning | repo | |
| 21 | 275 | 99.98% | ryanyord | Gemini | 1L decoder, d=4, 1h, ff=8, ranks=(3,3,2,2) | SVD truncation of 311p, tied embed, low-rank factorization, shareA_tieKV, RMSNorm | repo |
| 22 | 305 | 99.98% | h3nock | 1L decoder, d=4, 1h, ff=9 | Low-rank factorization, shared-A tied-KV, RMSNorm, tied embed, learned PE, curriculum learning | repo | |
| 23 | 311 | 99.999% | rezabyt (@reza_byt) | 1L decoder, d=4, 1h, ff=8 | Rank-3 factorization, shared-A tied-KV, RMSNorm, grokking | repo | |
| 24 | 456 | 100% | yinglunz | 1L decoder, d=7, 1h, ff=14 | Rank-3 factorization, shared-A tied-KV, rank-2 attn out, tied embed | repo | |
| 25 | 491 | 99.97% | rezabyt (@reza_byt) | 1L decoder, d=7 | Rank-3 factorization, RMSNorm, curriculum learning | repo | |
| 26 | 512 | 99.988% | yinglunz (@yinglun122) | 1L decoder, d=7, 1h, ff=14 | Rank-3 factorization | repo | |
| 27 | 777 | 99.69% | Yeb Havinga (@YebHavinga) | Claude Code | 1L decoder, d=7, 1h, ff=14 | Tied embeddings, no FFN bias, curriculum learning | repo |
| 28 | 1,644 | 99.04% | anadim (@dimitrispapail) | Codex | 1L decoder, pair tokens | Pair token encoding (digit pairs as single tokens) | repo |
| 29 | 6,080 | 100% | anadim (@dimitrispapail) | Claude Code | 2L decoder, d=16, ff=48 | Systematic scaling, found phase transition at d=16 | repo |
The model must operate as a genuine autoregressive transformer. This means:
Self-attention is required. The model must contain at least one self-attention layer. This is the defining feature of a transformer — without it, you have an MLP or RNN, not a transformer.
The model must be autoregressive. It receives a token sequence as input and predicts the next token. Output digits are generated one at a time, with each new token fed back as input for predicting the next. The carry propagation must emerge from this autoregressive process — not from explicit state variables passed between steps in Python.
Standard forward pass. The model's forward() method must be a standard tensor-in, logits-out computation. No problem-specific control flow (for-loops over digits, explicit carry variables, string manipulation) inside forward(). The autoregressive generation loop lives outside the model, exactly as it would for any language model.
The model does the work, not the code. The inference code should be generic autoregressive decoding that would work with any transformer checkpoint. If your generation loop contains addition-specific logic — manually pairing digits, threading carry state, indexing into specific positions — then the Python code is solving the problem, not the model.
In short: if you can swap in a different set of weights and use the exact same inference code for a different task, your setup is legitimate. If the inference code is inseparable from the algorithm, it's not.
verify.py with --seed 2025Option A: Open an Issue (easiest)
Option B: Open a Pull Request
Updates to the leaderboard are welcome via pull request.
python verify.py submissions/your_submission.py
This runs:
This challenge explores a fundamental question: what is the minimal transformer that can represent integer addition?
Addition requires three capabilities:
Transformers solve these using attention (for alignment), MLPs (for arithmetic), and autoregressive generation (for carry propagation). The question is how small the architecture can be while still implementing all three.
If you use AdderBoard in your research, please cite:
@misc{papailiopoulos2026adderboard,
author = {Papailiopoulos, Dimitris},
title = {{AdderBoard}: A Community Challenge for Tiny Arithmetic Transformers},
year = {2026},
publisher = {GitHub},
howpublished = {\url{https://github.com/anadim/AdderBoard}},
note = {Open challenge and leaderboard for building the smallest transformers that can perform integer addition}
}
MIT
34 commits
Python
100.0%
Smallest transformer that can add two 10-digit numbers
Python
379
34 commits
updated Mar 26, 2026
Challenge: Build the smallest transformer that can add two 10-digit numbers with >= 99% accuracy on a held-out 10K test set.
This started with Addition Under Pressure, where I gave Claude Code and Codex the same prompt: train the smallest possible transformer that can do 10-digit addition with at least 99% accuracy. Claude Code came back with 6,080 parameters and Codex came back with 1,644. The community has since pushed this dramatically lower.
Maintained by Dimitris Papailiopoulos (@dimitrispapail).
We track two categories:
Both are valid. Both are interesting.
| Rank | Params | Accuracy | Author | Built with | Architecture | Key Tricks | Link |
|---|---|---|---|---|---|---|---|
| 1 | 6* | 100% | zcbtrak | 1L Qwen-derived decoder, d=2, 1h, hd=2, ff=2 (fixed Q, folded norm) | RoPE period-19, hardcoded Q_proj (PE exemption), norm weights folded into tied output head, tied carry hinge gate, shared carry-scale scalar | gist | |
| 2 | 8 | 100% | kswain98 | 1L Qwen-style decoder, d=2, 1h, hd=2, ff=2 | RoPE period-19, phase-tied Q projection (1 param), coupled quadratic embedding (1 param), tied carry hinge gate, shared carry-scale scalar | repo | |
| 3 | 10 | 100% | lokimorty | 1L Qwen-derived decoder, d=2, 1h, hd=2, ff=2 | RoPE period-19, parametric tied embedding, gate tying via algebraic identity, merged carry scalar | gist | |
| 4 | 12 | 100% | lokimorty | 1L Qwen-derived decoder, d=2, 1h, hd=2, ff=2 | RoPE period-19, parametric tied embedding, sparse attention/MLP, constructive carry hinge | gist | |
| 5 | 20 | 100% | yieldthought | 1L decoder, d=2, 1h, hd=2 | Quadratic tied embedding + tied output head, RoPE-19 digit routing, sparse tied V/O, two-hinge ReLU MLP, parameterless pre-norm | gist | |
| 6 | 27 | 100% | Wonderfall (@w0nderfall) | 1L decoder, d=2, 1h, hd=2 | Tied Q/K + V/O, cross-tied W_vo as MLP w2, factorized quadratic embedding, compressed MLP w1, RoPE period-19 | gist | |
| 7 | 28 | 100% | jacobli99 | 1L decoder, d=2, 5h (MQA), hd=2, ff=4 | Tied parabolic decode, RoPE digit routing, sparse O-proj, tied MLP, matrix broadcast | gist | |
| 8 | 31 | 100% | Arch222 | 1L decoder, d=3, 4h/1kv, hd=2, ff=4 | RoPE offset-targeted queries, sparse O-proj, SwiGLU carry detection, tied embed decode | repo | |
| 9 | 33 | 100% | fblissjr | Claude Code + Gemini | 1L decoder, d=3, 3h (d_head=1), ff=4 | ALiBi prefix sum for carry, e^80 softmax anchoring, residual cancellation head, 2-hinge ReLU step, parabolic LM head, float64 | repo |
| 10 | 36 | 100% | alexlitz | 2L decoder, d=5, 5h+1h | ALiBi slope=log(10) for base-10 weighting, sparse embed, gated ReLU FFN, float64 | gist | |
| 11 | 50 | 100% | lichengliu03 | 1L custom GPT, d=4, 2h, hd=2 | Factorized embed, rotation Q (2 angles), tied embed+V dir, rank-1 MLP, parabolic head, sinusoidal PE (period 11) | repo | |
| 12 | 66 | 100% | cosminscn | 1L nanoGPT, d=4, 2h | Rotation Q (2 angles), sparse c_proj (2 nonzero), parabolic lm_head, factorized embed, sinusoidal PE (period 11) | gist | |
| 13 | 87 | 100% | bingbangboom-lab | 2L Qwen3, d=5, 2h/1kv, hd=2, ff=3 | Cross-layer sharing, rank-1 projections, sparse gate, low-rank head, frozen scaling params | gist | |
| 14 | 93 | 100% | jacobli99 | 1L decoder, d=2, 5h (MQA), hd=2, ff=4 | Tied parabolic decode, RoPE digit routing, ReLU carry detection | gist | |
| 15 | 111 | 100% | corbensorenson | Codex | 1L decoder, d=3, 4h/1kv, hd=2, ff=2 | Tied embed, RoPE, SwiGLU, GQA | repo |
| 16 | 116 | 100% | nino | 1L Qwen3, d=3, 4h/1kv, hd=2 | Tied embed, shared RMSNorm vectors, RoPE (hd=2) | gist | |
| 17 | 121 | 100% | Wonderfall (@w0nderfall) | Codex | 1L Qwen3, d=3, 4h/1kv, hd=2, ff=2 | Tied embed, RoPE digit routing, carry via final norm, SiLU wrap detection | gist |
| 18 | 130 | 100% | cosminscn | 1L nanoGPT, d=4, 2h | Rank-1 linear, factorized embed, sinusoidal PE (period 11), ReLU carry detection, parabolic logit decoding | gist | |
| 19 | 130 | 100% | Wonderfall (@w0nderfall) | Codex | 1L Qwen3, d=3, 4h/1kv, hd=2, ff=3 | Tied embed, RoPE digit routing, SiLU carry logic | gist |
| 20 | 139 | 100% | Wonderfall (@w0nderfall) | GPT-5.2 Pro + Codex | 1L Qwen3, d=3, 4h/1kv, hd=2 | Tied embed, RoPE digit routing, SiLU carry logic | gist |
| 21 | 148 | 100% | bingbangboom-lab | 2L Qwen3, d=5, 2h/1kv, hd=2, ff=3 | Rank-1 linear, factorized embed, sparse gate, param-free norm, low-rank head, cross-layer sharing | gist | |
| 22 | 177 | 100% | xangma (@xangma) | GPT + Codex | 2L Qwen3, d=5, 2h/1kv, hd=2 | Rank-1 linear, factorized embed, sparse gate, param-free norm, low-rank head | gist |
| 23 | 197 | ~100%** | xangma (@xangma) | GPT + Codex | 2L Qwen3, d=5, 2h/1kv, hd=2 | Rank-1 linear, factorized embed, sparse gate, param-free norm | gist |
* Parameter count debated: the 6 counted parameters sit within an architecture that has 4 additional hardcoded weight values (Q projection and RMSNorm weights) that were counted as parameters in the parent 10p submission. Under strict counting this model has 10 unique weight values; under the submitter's accounting, 6. See #75 for discussion. We may be approaching the practical minimum for this architecture family.
** Passed 8,192 random tests; not independently verified on our 10K test suite yet.
| Rank | Params | Accuracy | Author | Built with | Architecture | Key Tricks | Link |
|---|---|---|---|---|---|---|---|
| 1 | 36 | 100% | tbukic | SuperchargeAI + Claude Code | 1L Qwen3, d=3, 1h/1kv, hd=4, ff=2, RoPE θ=3, SwiGLU | Circular arc embedding (3 params), K=rotation(Q), V=Q, tied O=Q^T, all RMSNorms shared, tied QK norms, down=rotation(up^T) | repo |
| 2 | 39 | 99.91% | lokimorty | 1L Qwen3, d=3, 1h/1kv, hd=4, ff=2, RoPE θ=3, SwiGLU | Circular arc embedding, tied K=V, tied Q/O readout, shared RMSNorms, shared anti-quarter QK norm, repeat-mix shared block | gist | |
| 3 | 41 | 100% | tbukic | SuperchargeAI + Claude Code | 1L Qwen3, d=3, 1h/1kv, hd=4, ff=2, RoPE θ=3, SwiGLU | Circular arc embedding (3 params), K=rotation(Q), V=Q, tied O=Q^T, all RMSNorms shared, tied QK norms | repo |
| 4 | 44 | 100% | tbukic | SuperchargeAI + Claude Code | 1L Qwen3, d=3, 1h/1kv, hd=4, ff=2, RoPE θ=3, SwiGLU | Circular arc embedding (3 params), K=Q, V=Q, tied O=Q^T, all RMSNorms shared, pure grokking (no targeted FT) | repo |
| 5 | 45 | 100% | tbukic | SuperchargeAI + Claude Code | 1L Qwen3, d=3, 1h/1kv, hd=4, ff=2, RoPE θ=3, SwiGLU | Circular arc embedding (3 params), K=rotation(Q), V=Q, tied O=Q^T, all RMSNorms shared | repo |
| 6 | 52 | 100% | Enara Vijil | 1L Qwen3, d=3, 1h/1kv, hd=4, ff=2, RoPE θ=3, SwiGLU | Circular arc embedding, tied K=V, tied O=Q^T, all RMSNorms shared, shared QK norms, Grokfast-EMA | repo | |
| 7 | 55 | 100% | tbukic | SuperchargeAI + Claude Code | 1L Qwen3, d=3, 1h/1kv, hd=4, ff=2, RoPE θ=3, SwiGLU | Circular arc embedding (3 params), K=αQ, gate=α·up, tied O=Q^T, shared block RMSNorms | repo |
| 8 | 57 | 100% | evindor | Claude Code + Codex | 1L decoder, d=5(2+3), 1h, qk=4, hd=5, ff=2 | Parametric circular embed, tied V/O, tied Q/K+phase, tied fc2=head_proj, rank-1 out, shared norm | repo |
| 9 | 58 | 100% | tbukic | SuperchargeAI + Claude Code | 1L Qwen3, d=3, 1h/1kv, hd=4, ff=2, RoPE θ=3, SwiGLU | Circular arc embedding (3 params), K=αQ, gate=α·up, tied O=Q^T | repo |
| 10 | 62 | 100% | tbukic | SuperchargeAI + Claude Code | 1L Qwen3, d=3, 1h/1kv, hd=4, ff=2, RoPE θ=3, SwiGLU | Circular arc embedding (3 params), tied K=V, tied O=Q^T, tied lm_head, Adam no weight decay | repo |
| 11 | 67 | 100% | evindor | Claude Code + Codex | 1L decoder, d=5(2+3), 1h, qk=4, hd=5, ff=2 | Parametric circular embed (3p), tied V/O, tied Q/K+phase, rank-1 out, shared norm, carry-mix curriculum | repo |
| 12 | 83 | 100% | tbukic | SuperchargeAI + Claude Code | 1L Qwen3, d=3, 1h/1kv, hd=4, ff=2, RoPE θ=3, SwiGLU | Tied embed, tied K=V, tied O=Q^T, shared all RMSNorms, iterated targeted fine-tuning | repo |
| 13 | 86 | 100% | tbukic | SuperchargeAI + Claude Code | 1L Qwen3, d=3, 1h/1kv, hd=4, ff=2, RoPE θ=3, SwiGLU | Tied embed, tied K=V, tied O=Q^T, shared block RMSNorms, L-BFGS + targeted fine-tuning | repo |
| 14 | 89 | 100% | tbukic | SuperchargeAI + Claude Code | 1L Qwen3, d=3, 1h/1kv, hd=4, ff=2, RoPE θ=3, SwiGLU | Tied embed, tied K=V, tied O=Q^T, RoPE (zero params), QK norms, 4-stage grokking-aware training | repo |
| 15 | 95 | 99.03% | tbukic | SuperchargeAI + Claude Code | 1L Qwen3 + circular arc embed, d=3, 1h/1kv, hd=4, ff=3, RoPE θ=3, SwiGLU | Circular arc embedding (3 params), tied lm_head to dynamic embed, RoPE, QK norms | repo |
| 16 | 101 | 100% | tbukic | SuperchargeAI + Claude Code | 1L Qwen3, d=3, 1h/1kv, hd=4, ff=2, RoPE θ=3, SwiGLU | Tied embed, tied O=Q^T, RoPE (zero params), QK norms, cosine LR + targeted fine-tuning | repo |
| 17 | 122 | 99.95% | staghado | 1L Qwen3, d=3, 1h/1kv, hd=4, ff=3 | Tied embed, RoPE θ=3 | repo | |
| 18 | 140 | 100% | dimopep | Claude Code | 1L decoder, d=4, 1h/1kv, hd=4, ff=4, RoPE θ=3, SwiGLU | Tied K=V, tied O=Q^T, tied lm_head, QK-norm | gist |
| 19 | 234 | 99.91% | JackCai1206 | Claude Code | 1L decoder, d=6 (3 tok + 3 pos), 2h, hd=3, ff=2 | Parametric spiral PE (4 params), split-head attn (QK-pos/V-tok), shared XYZ pos, tied output head, LSB-first | repo |
| 20 | 262 | 99.95% | lichengliu03 | 1L decoder, d=4, 1h, ff=8 | Rank-3 factorization, shared-A tied-KV, RMSNorm, tied embed, curriculum learning | repo | |
| 21 | 275 | 99.98% | ryanyord | Gemini | 1L decoder, d=4, 1h, ff=8, ranks=(3,3,2,2) | SVD truncation of 311p, tied embed, low-rank factorization, shareA_tieKV, RMSNorm | repo |
| 22 | 305 | 99.98% | h3nock | 1L decoder, d=4, 1h, ff=9 | Low-rank factorization, shared-A tied-KV, RMSNorm, tied embed, learned PE, curriculum learning | repo | |
| 23 | 311 | 99.999% | rezabyt (@reza_byt) | 1L decoder, d=4, 1h, ff=8 | Rank-3 factorization, shared-A tied-KV, RMSNorm, grokking | repo | |
| 24 | 456 | 100% | yinglunz | 1L decoder, d=7, 1h, ff=14 | Rank-3 factorization, shared-A tied-KV, rank-2 attn out, tied embed | repo | |
| 25 | 491 | 99.97% | rezabyt (@reza_byt) | 1L decoder, d=7 | Rank-3 factorization, RMSNorm, curriculum learning | repo | |
| 26 | 512 | 99.988% | yinglunz (@yinglun122) | 1L decoder, d=7, 1h, ff=14 | Rank-3 factorization | repo | |
| 27 | 777 | 99.69% | Yeb Havinga (@YebHavinga) | Claude Code | 1L decoder, d=7, 1h, ff=14 | Tied embeddings, no FFN bias, curriculum learning | repo |
| 28 | 1,644 | 99.04% | anadim (@dimitrispapail) | Codex | 1L decoder, pair tokens | Pair token encoding (digit pairs as single tokens) | repo |
| 29 | 6,080 | 100% | anadim (@dimitrispapail) | Claude Code | 2L decoder, d=16, ff=48 | Systematic scaling, found phase transition at d=16 | repo |
The model must operate as a genuine autoregressive transformer. This means:
Self-attention is required. The model must contain at least one self-attention layer. This is the defining feature of a transformer — without it, you have an MLP or RNN, not a transformer.
The model must be autoregressive. It receives a token sequence as input and predicts the next token. Output digits are generated one at a time, with each new token fed back as input for predicting the next. The carry propagation must emerge from this autoregressive process — not from explicit state variables passed between steps in Python.
Standard forward pass. The model's forward() method must be a standard tensor-in, logits-out computation. No problem-specific control flow (for-loops over digits, explicit carry variables, string manipulation) inside forward(). The autoregressive generation loop lives outside the model, exactly as it would for any language model.
The model does the work, not the code. The inference code should be generic autoregressive decoding that would work with any transformer checkpoint. If your generation loop contains addition-specific logic — manually pairing digits, threading carry state, indexing into specific positions — then the Python code is solving the problem, not the model.
In short: if you can swap in a different set of weights and use the exact same inference code for a different task, your setup is legitimate. If the inference code is inseparable from the algorithm, it's not.
verify.py with --seed 2025Option A: Open an Issue (easiest)
Option B: Open a Pull Request
Updates to the leaderboard are welcome via pull request.
python verify.py submissions/your_submission.py
This runs:
This challenge explores a fundamental question: what is the minimal transformer that can represent integer addition?
Addition requires three capabilities:
Transformers solve these using attention (for alignment), MLPs (for arithmetic), and autoregressive generation (for carry propagation). The question is how small the architecture can be while still implementing all three.
If you use AdderBoard in your research, please cite:
@misc{papailiopoulos2026adderboard,
author = {Papailiopoulos, Dimitris},
title = {{AdderBoard}: A Community Challenge for Tiny Arithmetic Transformers},
year = {2026},
publisher = {GitHub},
howpublished = {\url{https://github.com/anadim/AdderBoard}},
note = {Open challenge and leaderboard for building the smallest transformers that can perform integer addition}
}
MIT
34 commits
Python
100.0%