2026-09-26 · 20 min · llm · reasoning · tree-search · verifiers · evaluation · benchmarks · explainer
Bad Theory Labs has been in these pages three times. BTL-3 was a LoRA adapter, honestly labelled. BTL-4 had a benchmark table that did not close. Tinfield 1 was 1.85% of a model. Each time the useful move was to stop reading the announcement and read the artifact.
This time there is more artifact than ever. On 2026-09-25 at 14:13 UTC, @Badtheorylabs posted:
On the same hard problems, a 1.7B model thinking the normal way solved 3 out of 30. Interference Search(our new architecture)solved 23.
It describes the method as "many paths at once, the ones that meet merge into one, the dead ends cancel out, and everything left moves forward together", and adds: "We watched the normal model find the right answer at token 1,313, check it 9 more times, wander off and run out of budget without ever answering. Ours got there in 3 steps." It links nothing and ends "More technical details soon."
They came 72 minutes later. The repository
Badtheorylabs/interference-search was
created at 15:25 UTC with a six-page paper, Apache-2.0 code, the trained judge, the raw results, a
research log that keeps its failures, and a paper/CLAIMS.md mapping each number to a file. The
dossier is on the lab's site. It is the
best-documented thing this lab has shipped. The post is the least careful sentence in it.
What the 3 and the 23 are
"Out of 30" invites AIME. It isn't. The 30 are Countdown puzzles: four numbers and a target;
combine all four with +, −, × and ÷, each used once, every intermediate result a positive whole
number. The repository's generator makes them "hard" by rejecting any instance where a single
operation on two of the numbers lands within 25 of the target, and keeping only instances with at
most two distinct solutions. The paper's running example is [24, 98, 19, 3] → 361, solved by
(24 × 19) − 98 + 3.
The two numbers in the post come from different rows of the paper's Table 4 (reported):
| Qwen3-1.7B thinking in text | Interference Search, trained judge | |
|---|---|---|
| Who proposes moves | the model, in prose | the environment lists every legal move |
| Who ranks states | nobody; the model must commit an answer | a 102,145-parameter set transformer |
| Search shape | one transcript, 1,500 generated tokens, one sample | width 6, three levels, at most 150 judged states |
| Model tokens written / read per problem | 1,490 / 83 | 0 / 0 |
| Solved | 3 of 30 | 23 of 30 |
The judge's size is my arithmetic on interference_search/judge.py: two layers, width 64, four
heads, 29 features per number, 102,145 parameters (reasoned; the README says "100k" and the
419,573-byte weight file agrees). The model is mlx-community/Qwen3-1.7B-4bit.
The repository says so plainly:
Those are different systems: the fast one uses the environment to list moves and a 100k-parameter judge to rank them, and never runs the language model.
So does the paper: "The strongest Countdown numbers use a small trained judge and an environment that lists moves; they do not run the language model." The post drops that sentence, and what is left credits a Countdown solver's win over a 1.7B model to an architecture.
Between the 3 and the 23 the paper has a ladder. Each rung keeps the search and changes only the judge.
- Qwen3-1.7B thinking in textin the post3 / 30LM: writes 1,490 tokens, reads 83judge: none: it must commit to an answerreported
- frontier, width 6, random order4.3 / 30LM: not usedjudge: a shufflemeasured
- frontier, width 6, the model asked yes or no4 / 30LM: reads about 4,290 tokens, writes 0judge: P(yes), AUC 0.58reported
- frontier, width 6, probe on the model's hidden state15 / 30LM: reads about 4,290 tokens, writes 0judge: linear probe, AUC 0.87reported
- frontier, width 6, probe on number features22 / 30LM: not usedjudge: linear probe, AUC 0.94reported
- frontier, width 6, trained set transformerin the post23 / 30LM: not usedjudge: 102,145 parameters, AUC 0.98reported
- same judge, width 16, 200 judged positions30 / 30LM: not usedjudge: the same set transformerreported
- breadth-first over every state, no judge30 / 30LM: not usedjudge: none: at most 150 states, all of themmeasured
Asking the model of each state "can you reach exactly the target? Answer Yes or No." and ranking by P(yes) solves 4 (reported, AUC 0.58). The same width-6 frontier with a shuffle for a judge solves 14.4% of 30 other hard problems from the same generator in expectation, about 4.3 of 30 (measured). Asking the model is indistinguishable from not asking it.
A linear probe on the model's hidden state carries real signal: 15 (reported, AUC 0.87). A linear probe on plain number features, trained on the same 1,376 states, does better, with 22 (AUC 0.94). The author ran that control himself and printed what it did to his reading: "I had first read the probe result as the model knowing more than it can say; the feature control does not support that reading." The trained set transformer gets 23. The same judge at width 16 and 200 judged positions gets 30.
So the model contributes nothing to the 23. Its best showing in Countdown is 15 of 30, as features under a probe, reading about 4,290 prompt tokens per problem and writing none. That took 15.2 s a problem on an M2 against 57.4 s for thinking in text (reported; that timing run of the text arm solved 1 of 30, not 3).
How Interference Search works

A domain supplies a start state, a proposer, a merge key, a judge, a goal test and a dead-end test.
Each round of interference_search/core.py:
- Expands every live state. In Countdown the environment lists every legal move, for free.
- Executes. A branch holds the state it reached, not a description of it. A child equal to the target ends the search, also free.
- Merges. Children with the same key (the sorted multiset of numbers) become one entry, pooling
their parents' ranks as votes of
1/(rank+1). Keys already expanded are dropped. - Judges. Every merged state is scored, and each score costs one unit of budget.
- Advances. The best
Wmove down a level together.Wis the budget over three times the number count: 16 at a budget of 200 on four numbers.
The baseline, "one line of thought", chains the same parts: judge the children of the current state, sample one with probability proportional to its score squared (temperature 0.5), continue, and restart when the chain dies.
In classical terms this is beam search over a transposition table with a learned value function. The research log says so: "a value-ranked frontier is close to value-guided beam search, which is prior art". The paper names transposition tables (Zobrist, 1970) and AlphaZero's value network as its roots and claims the combination and its ablations as new. The "interference" is steps 3 and 4. Nothing cancels like an amplitude; a merged state is judged once, and a dropped state takes every path through it along.
Here is the loop on the showcase problem, with the judge's own recorded scores:
level 1 · 19 moves from the start → 19 distinct states · 2 alive · all 19 judged · keep 12
level 2 · 12 kept × their moves = 110 children → merge → 82 distinct (28 merged away) · 1 alive · keep 12
kept: 24 · 313 98 · 399 19 · 318 95 · 456 24 · 1805 101 · 456 19 · 366 19 · 270 43 · 294 98 · 513 19 · 71 19 · 26
the alive state ranks 4 of 82 — inside the cut
level 3 · 12 kept × their moves = 36 final values, each checked against 361 for free
solved: 95 · 456 → 456 − 95 = 361, in 3 levels
The first level has 19 distinct states, 2 of them alive. At width 12 the judge keeps 12, whose 110
moves merge into 82 distinct states, and only one, 95 · 456, can finish (measured; my enumerator
reproduces the lab's trace exactly). The judge ranks it 4th of 82 and the third level finds
456 − 95 = 361. The recorded judge solves this problem from width 4, a random order in about 27%
of shuffles at width 12, the exact solver at width 1.
That also explains "Ours got there in 3 steps". Four numbers take exactly three moves to become one, so a frontier that succeeds without restarting always reports 3. Latency tracking depth rather than mistakes is the design point, but 3 is a property of the puzzle, not a speed.

What "the same budget" buys at four numbers
The paper's headline equal-compute claim is Figure 3 and Table 3. With the same judge and 200 judged positions per problem, the frontier solves 30 and the line solves 21. The line needs 1,500 positions to solve all 30, and then takes 23.7 sequential steps on average against the frontier's 3.

Read the unit. Only judging costs; listing moves and checking the goal are free, and the budget is checked at the top of each round. On four numbers it never stops the frontier. It sets the width.
How big is the space? I enumerated every state of the 30 hard problems whose numbers the lab published in its Phase 0 and Phase 1 raw results: same generator as the paper's 30, different seed. The paper's own 30 are not listed, though they can be regenerated. A hard four-number problem has 114 distinct non-terminal states on average, from 73 to 151, on 555 complete move sequences, 4.6 of which reach the target (measured; "at most two solutions" counts distinct expressions, which can be reached in several orders).
How big is a hard four-number Countdown problem? Every distinct state is listed below, for the 30 hard problems whose numbers Bad Theory Labs published in its Phase 0 and Phase 1 raw results, and for the 4 showcase problems from the 30 used in the paper's headline tables. On the 30, a problem has 114 distinct non-terminal states on average (73 to 151). The paper's headline comparison gives each search 200 judged positions, which is more than the whole space of every one of them. The last two columns are the chance that the paper's frontier, with its judge replaced by a random ranking, solves the problem in one pass at width 6 (the configuration behind the 23 of 30) and at width 16 (the configuration behind the 30 of 30).
| numbers → target | set | level 1 | level 2 | alive at 2 | all states | paths | solution paths | random, W=6 | random, W=16 |
|---|---|---|---|---|---|---|---|---|---|
| 25, 11, 22, 14 → 451 | hard, seed 0, #0 | 19 | 96 | 1 | 116 | 587 | 1 | 4.3% | 15.2% |
| 34, 12, 1, 8 → 434 | hard, seed 0, #1 | 16 | 75 | 1 | 92 | 497 | 1 | 5.5% | 20.6% |
| 2, 5, 22, 27 → 226 | hard, seed 0, #2 | 19 | 99 | 1 | 119 | 585 | 1 | 4.1% | 15.3% |
| 13, 92, 1, 16 → 299 | hard, seed 0, #3 | 16 | 75 | 3 | 92 | 506 | 4 | 17.6% | 53.1% |
| 16, 15, 19, 57 → 582 | hard, seed 0, #4 | 19 | 105 | 1 | 125 | 566 | 1 | 3.6% | 14.3% |
| 3, 69, 2, 19 → 270 | hard, seed 0, #5 | 19 | 110 | 1 | 130 | 577 | 3 | 8.2% | 15.8% |
| 20, 11, 7, 30 → 390 | hard, seed 0, #6 | 18 | 96 | 1 | 115 | 503 | 1 | 3.9% | 15.8% |
| 24, 23, 18, 88 → 153 | hard, seed 0, #7 | 18 | 95 | 7 | 114 | 496 | 18 | 47.1% | 75.9% |
| 12, 17, 54, 16 → 338 | hard, seed 0, #8 | 18 | 95 | 3 | 114 | 496 | 4 | 14.5% | 43.3% |
| 70, 24, 12, 16 → 123 | hard, seed 0, #9 | 19 | 107 | 1 | 127 | 581 | 1 | 4.0% | 14.7% |
| 25, 89, 25, 5 → 531 | hard, seed 0, #10 | 13 | 70 | 3 | 84 | 652 | 4 | 20.4% | 54.3% |
| 3, 13, 41, 19 → 589 | hard, seed 0, #11 | 18 | 99 | 1 | 118 | 514 | 3 | 9.2% | 16.8% |
| 47, 14, 18, 15 → 875 | hard, seed 0, #12 | 18 | 94 | 3 | 113 | 508 | 4 | 14.8% | 43.0% |
| 15, 13, 64, 10 → 344 | hard, seed 0, #13 | 18 | 98 | 1 | 117 | 516 | 1 | 4.5% | 14.6% |
| 74, 4, 25, 9 → 888 | hard, seed 0, #14 | 18 | 98 | 1 | 117 | 510 | 3 | 9.0% | 17.6% |
| 11, 92, 9, 16 → 505 | hard, seed 0, #15 | 18 | 100 | 1 | 119 | 521 | 2 | 7.0% | 17.5% |
| 10, 4, 35, 20 → 280 | hard, seed 0, #16 | 20 | 113 | 5 | 134 | 627 | 10 | 27.1% | 56.0% |
| 15, 9, 1, 65 → 201 | hard, seed 0, #17 | 16 | 75 | 3 | 92 | 514 | 4 | 16.3% | 51.1% |
| 6, 10, 44, 9 → 308 | hard, seed 0, #18 | 18 | 100 | 2 | 119 | 526 | 4 | 13.6% | 30.5% |
| 62, 13, 7, 8 → 656 | hard, seed 0, #19 | 18 | 97 | 1 | 116 | 515 | 3 | 9.1% | 16.6% |
| 21, 11, 15, 28 → 75 | hard, seed 0, #20 | 18 | 97 | 7 | 116 | 507 | 18 | 47.7% | 74.2% |
| 60, 24, 20, 10 → 270 | hard, seed 0, #21 | 21 | 129 | 1 | 151 | 722 | 1 | 2.9% | 10.1% |
| 20, 11, 49, 18 → 467 | hard, seed 0, #22 | 18 | 98 | 1 | 117 | 526 | 1 | 4.0% | 15.9% |
| 51, 3, 3, 8 → 714 | hard, seed 0, #23 | 13 | 71 | 1 | 85 | 671 | 3 | 10.2% | 22.2% |
| 21, 25, 20, 3 → 315 | hard, seed 0, #24 | 19 | 104 | 5 | 124 | 555 | 8 | 24.3% | 58.4% |
| 3, 10, 15, 64 → 514 | hard, seed 0, #25 | 19 | 104 | 1 | 124 | 576 | 3 | 8.3% | 16.8% |
| 7, 4, 56, 5 → 116 | hard, seed 0, #26 | 20 | 115 | 1 | 136 | 641 | 1 | 3.6% | 12.4% |
| 9, 20, 29, 18 → 133 | hard, seed 0, #27 | 19 | 94 | 3 | 114 | 594 | 4 | 13.7% | 42.0% |
| 19, 19, 74, 16 → 249 | hard, seed 0, #28 | 12 | 60 | 3 | 73 | 551 | 8 | 25.6% | 62.8% |
| 14, 54, 19, 17 → 104 | hard, seed 0, #29 | 18 | 99 | 7 | 118 | 515 | 18 | 47.8% | 74.2% |
| 24, 98, 19, 3 → 361 | showcase (seed 11) | 19 | 106 | 3 | 126 | 556 | 4 | 12.8% | 38.6% |
| 14, 17, 5, 36 → 737 | showcase (seed 11) | 18 | 99 | 1 | 118 | 527 | 1 | 4.2% | 14.5% |
| 7, 5, 8, 55 → 880 | showcase (seed 11) | 19 | 106 | 3 | 126 | 564 | 4 | 13.4% | 37.8% |
| 65, 12, 14, 18 → 308 | showcase (seed 11) | 18 | 98 | 1 | 117 | 507 | 2 | 7.5% | 18.4% |
Two things hold across all 34 rows. A breadth-first pass over merged states with no judge at all reaches every second-level state after judging at most 150 positions, so it solves every row. And the ranking matters: at width 6 a random order solves 14.4% of the seed-0 set in expectation (about 4.3 of 30), which is where the paper's 'ask the model yes or no' judge lands (4 of 30), and far below the trained judge's 23. The seed-0 problems are a different draw from the same generator as the paper's 30; the paper does not publish the numbers of those 30.
A breadth-first pass over every merged state, with no judge at all, touches 72 to 150 states and solves every problem. The 200-position budget is larger than the whole search space. At that budget the frontier judges the entire first level and the children of 16 of its roughly 18 states, which is close to everything.
Here are the curves, with two references I ran through the same loop, cost unit and width rule:
Three things follow.
The judge works. With a random order the same frontier solves about 14 of 30 at 200 (measured, on the other 30); with the exact solver it solves all 30 from 80. The trained judge is at 23 by 80 and 30 by 200, a good value function for 102,145 parameters trained on smaller problems. How small can a verifier be? found a 0.63M-parameter model verifying Countdown at 0.85 for the same reason: the tell is local arithmetic in a short input.
The shape beats a weak baseline. A chain judges about 18 first-level children and 10 second-level ones per dive, so 200 buys it about seven weighted random dives (reasoned). Keeping 16 states per level of a 114-state tree beats seven dives. The comparison is matched and real. It is also the expected result, and it says nothing about language models.
Merging does nothing here. The benchmark JSON behind Table 3 also has a frontier with merging off.
It solves 29 at 150 and 30 at 200 and 500, the same as Interference Search; the two differ only at 50,
7 against 4 (reported, results/countdown/countdown_benchmark.json). Four numbers leave little to
merge: at the second level, 176 paths collapse into 96 states, 1.8x (measured; 179 into 97 on the
paper's 20 random instances). The headline result is breadth plus a good judge. The part the method
is named after is not in it.
Where the name is earned: six numbers

At six numbers the picture changes, and this is the paper's strongest result. At 100 expansions the merged frontier solves 77%, the frontier without merging 50%, the line 40% and best-first search 10% (reported). Duplicates fill an unmerged frontier's width, and best-first keeps picking shallow states that look safe, which is the case for advancing level by level. At seven numbers the line catches up at large budgets (87% for both at 400), and the paper says so.
The figure the dossier puts next to this, "63x paths per state", needs a correction. Table 1's
caption places it at "the deepest non-terminal level". But compression.py prints every level down to
a single number, and 831,176 paths into 13,229 states is its last row: distinct final values,
which the search never judges, only compares with the target. At the deepest level the judge sees,
two numbers left, the lab's own file gives 264,496 paths into 16,479 states: 16.1x at six numbers,
4.8x at five and 1.8x at four (arithmetic on results/countdown/compression.txt). The ratio still
grows with size, so the argument survives, with a number about a quarter the size.
The judge generalizes, within a boundary the paper states. Trained on four and five numbers, at a threshold of 0.7 it solves every random six-number problem at 9.3% of the work, but only 43% of hard ones (at most 24 solution paths). The safe setting there is 0.2: 98% at 17.9%. On ten seven-number problems it solves all ten at 7.9% (all reported).
The model finds answers; it does not commit to them
The post's anecdote checks out, with footnotes. In results/llm/cot_trace.json the model writes 17
complete attempts, 11 of them repeats. The first correct one is at token 1,313, and the correct
expression appears 9 times in all, so "check it 9 more times" is 8 more. That trace ran to 2,048
tokens, not the 1,500 of the 3-of-30 run, and it is one sample on one of four showcase problems
(measured).
The more useful data is the lab's Phase 0 and Phase 1, on hard problems from the same generator. In
Phase 1, eight independent streams of 2,048 tokens ran on 24 problems while the harness scanned the
text for a correct expression. One turned up on 22 of 24: 20 within 1,024 tokens per stream, 8
within the first 256 (measured from phase1_qwen3-1.7b.jsonl, arm A). In Phase 0, where samples had
to commit an answer, 11 of 48 were right and 3 of 6 problems had at least one right sample
(measured).
That is the baseline the post implies and the paper does not run on its 30: best-of-N with the same free checker the search gets. Majority vote is beside the point when answers are checked exactly; pass@k with the checker is the fair comparison. Phase 1 used eight times the tokens, so it does not settle it. It does say the model's failure here is committing and stopping, not searching, which is how the author reads his own trace.
Where the model does the proposing, nothing worked. On a six-problem smoke test the model choosing moves from an explicit state, with memory of dead states, solved 0. The log's conclusion: "a small model cannot be prompted into state-based search; its competence lives in its native thinking mode." The other negative results are the best part of the paper. Telling streams which expressions had failed primed them: 33.6% repeats within 80 tokens of a note, against about 21% without. Rewinding a stream that wrote a refuted expression regenerated it up to 16 times. Parallel streams that could attend to each other scored 0.511, against 0.508 for isolated ones.
Code: the only matched-budget test with the model proposing
In code the model does the proposing: each state is a program plus what it returns on each test, the interpreter executes, and programs that behave identically on the tests merge. The lab screened the first 150 MBPP problems, kept the 69 that Qwen3-1.7B fails on its first greedy try, and used 30 of them, with 1,500 generated tokens per problem (reported).
| Strategy | Solved | Generated tokens per solve |
|---|---|---|
| Agent loop with full chat history | 7 / 30 | n/r |
| Revise the latest program | 7 / 30 | about 5,460 |
| Fresh attempts (best of N) | 8 / 30 | about 5,090 |
| Interference Search | 9 / 30 | about 4,560 |
83% of the programs merged away as behaviour duplicates. Nine against eight is one problem in 30, and the paper says so: "In code the gain over independent sampling is within noise." Per-problem outcomes were not saved, so no paired test is possible. This is the only place "parallel thinking and execution" meets a language model at an equal token budget, and the margin is one problem.
The post's last claim, "Subagents were a terrible way to tackle this", has no experiment behind it. The word appears nowhere in the paper, the code or the log.
Where this sits in test-time compute
Inference compute goes three ways. Sample independent chains and vote or verify: self-consistency, best-of-N. Search partial solutions with a value function: Tree of Thoughts, RAP, verifier-guided beam search. Or train the model to branch and join itself: APR, which the paper says reports large gains over serial search on this same puzzle, and Parallel-R1. Stream of Search chose Countdown for the same reason this paper did: every state can be labelled exactly.
On Countdown, Interference Search is the second family with the language model removed from both proposing and judging. On code it is the second family with the model proposing and tests judging. Its distinctive part, merging states that different paths reach, pays when paths collide, which on these puzzles means six numbers, not four.
The closest precedent here is ChessLFM, where 408 of 552 Elo came from a minimax wrapper and a bug fix rather than training. Same shape: a search loop and a small value function do the lifting, and the headline credits the model. For the latent alternative the paper cites, several frontiers held inside continuous thoughts, see LOTUS.
Can anyone reproduce it?
Mostly, and that is to the lab's credit.
- Released: the library, every script, the judge weights, raw results for most claims, the log,
paper/CLAIMS.md, a Dockerfile andscripts/reproduce_countdown.sh, which reruns every Countdown number on CPU in about ten minutes against the committed results. Those numbers are deterministic. - Not on Linux: the language-model experiments use MLX and need Apple silicon.
- Gaps: the 3-of-30 text arm has no committed raw output (
CLAIMS.mdpoints at the script), and a later timing run with the same settings solved 1 of 30. The 22-of-30 feature probe has none either. Code outcomes were not saved per problem. Everything is one seed; the lab's own noise estimate is about ±2.5 problems on 30.
The log runs from 2026-09-22 to 2026-09-24. The whole project took three days.
What is good here
- The claim boundary is on the website: one seed, 30 problems, "the method is classical and claims no quantum speedup", "Nothing here trains the language model yet."
- The author overturned his own reading with a control he did not have to run, and printed both.
- The failures are kept, with numbers.
- The six-number ablation is a real finding. It isolates merging from level-by-level advance and shows each earning its keep.
The take
As published, Interference Search is value-guided beam search over a transposition table, measured carefully on a puzzle small enough to enumerate. The language model is in the headline and not in the search. The paper says so. The post doesn't.
The 3-to-23 comparison is not a result about reasoning. Before quoting it I would want two runs: pass@k for Qwen3-1.7B on the same 30 with the same free checker, at 1,500 total tokens and at 16,384; and an Interference Search arm in which the model proposes the moves. The author names his next step: train the model to reason inside the frontier, then test on SWE-bench and Terminal-Bench at matched compute. That is the experiment that would make the post's sentence true.
What would change my mind
5 claims above, and what would falsify each
The 23 of 30 involves no language model.
It rests on
experiments/llm/probe.py: the "small refuter" arm calls the set transformer throughref_judgeand never the MLX model, and Table 6 lists it at 0 tokens written and 0 read. If a run log shows model calls on that arm, or the 23 turns out to come fromllm_state.py'sfrontier+refarm, where the model proposes moves, this is wrong.A 200-position budget covers roughly the whole state space of a hard four-number problem.
Measured on 30 hard problems from the lab's generator at seed 0, not the paper's seed-11 set. My enumerator reproduces the lab's recorded traces for the four seed-11 showcase problems exactly, and they have 117 to 126 non-terminal states. If the paper's 30 regenerate with spaces well above 200 states, the claim fails for them.
Merging contributes nothing measurable on the four-number headline set.
From one seed of
countdown_benchmark.json: the frontier with merging off matches Interference Search at 150, 200 and 500, and trails 4 to 7 at 50. A multi-seed rerun that shows the merged frontier ahead at 150 or 200 would overturn it.Ranking by the model's yes-or-no answer is no better than a random order.
The comparison crosses problem sets: 4 of 30 on the paper's set, against my 14.4% expectation for a shuffle on a sister set. The right test is a paired run of both on the paper's 30. A random order that averages well below 4 there would make the prompted judge worth something.
On this set the 1.7B model fails at committing, not at searching.
This is reasoned from Phase 0 and Phase 1: 22 of 24 found by eight streams, on other problems, at eight times the budget. If pass@k with an exact checker on the paper's 30, at 1,500 total tokens, stays near 3, the model's search is the bottleneck after all and the frontier's lead is a bigger deal than I credit.
Sources: the post, read through fxtwitter
because x.com returns 402 here; the paper and dossier;
and the repository at commit afedcc2, whose
paper/PAPER.pdf is byte-identical to the site's. All read on 2026-09-26; none of the lab's code was
executed. Measured numbers come from my own Countdown enumerator, which reproduces the lab's recorded
showcase traces state for state, and from the committed countdown_benchmark.json, compression.txt,
probe_results.json, cot_trace.json, cot_timing.json, phase0_qwen3-1.7b.jsonl,
phase1_qwen3-1.7b.jsonl and viz_slim.json. Timestamps are from the post, the GitHub API and the
PDF metadata. The four figures are the paper's, redistributed under Apache-2.0 with the terms in
NOTICE.txt; the three interactives are mine. Earlier
reads of this lab: BTL-3, BTL-4 and
Tinfield 1.