~/satyajit

Interference Search: the 23 out of 30 has no language model in it

mdjsonmcp

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 textInterference Search, trained judge
Who proposes movesthe model, in prosethe environment lists every legal move
Who ranks statesnobody; the model must commit an answera 102,145-parameter set transformer
Search shapeone transcript, 1,500 generated tokens, one samplewidth 6, three levels, at most 150 judged states
Model tokens written / read per problem1,490 / 830 / 0
Solved3 of 3023 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.

show
  1. Qwen3-1.7B thinking in textin the post3 / 30
    LM: writes 1,490 tokens, reads 83judge: none: it must commit to an answerreported
  2. frontier, width 6, random order4.3 / 30
    LM: not usedjudge: a shufflemeasured
  3. frontier, width 6, the model asked yes or no4 / 30
    LM: reads about 4,290 tokens, writes 0judge: P(yes), AUC 0.58reported
  4. frontier, width 6, probe on the model's hidden state15 / 30
    LM: reads about 4,290 tokens, writes 0judge: linear probe, AUC 0.87reported
  5. frontier, width 6, probe on number features22 / 30
    LM: not usedjudge: linear probe, AUC 0.94reported
  6. frontier, width 6, trained set transformerin the post23 / 30
    LM: not usedjudge: 102,145 parameters, AUC 0.98reported
  7. same judge, width 16, 200 judged positions30 / 30
    LM: not usedjudge: the same set transformerreported
  8. breadth-first over every state, no judge30 / 30
    LM: not usedjudge: none: at most 150 states, all of themmeasured
Hard four-number Countdown, 30 problems. Reported rows are the paper's Tables 3, 4 and 6. Measured rows are mine, on 30 other hard problems from the same generator. Every search row lets the environment list the legal moves; only the judge changes.

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 loop of six boxes connected by arrows. Top row, left to right: 'live states (width W)', 'expand all at once', 'environment executes'. An arrow runs down to the bottom row, right to left: 'merge equal states', 'judge scores, cancels dead', 'keep best W, advance a level', and back up to 'live states'.
One round of the search. Nothing carries between rounds except the live states and a memory of the states already expanded (paper, Figure 2).

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:

  1. Expands every live state. In Countdown the environment lists every legal move, for free.
  2. Executes. A branch holds the state it reached, not a description of it. A child equal to the target ends the search, also free.
  3. 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.
  4. Judges. Every merged state is scored, and each score costs one unit of budget.
  5. Advances. The best W move down a level together. W is 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:

rank by
3, 19, 24, 98 → 361

level 1 · 19 moves from the start → 19 distinct states · 2 alive · all 19 judged · keep 12

3 · 19 · 74 0.8919 · 27 · 98 0.878 · 19 · 98 0.8719 · 24 · 95 0.8519 · 21 · 98 0.8519 · 24 · 294 0.833 · 19 · 122 0.8219 · 24 · 101 0.8019 · 72 · 98 0.753 · 43 · 98 0.573 · 24 · 79 0.5324 · 57 · 98 0.463 · 5 · 98 0.403 · 98 · 456 0.383 · 24 · 117 0.373 · 19 · 2352 0.2222 · 24 · 98 0.1216 · 24 · 98 0.103 · 24 · 1862 0.02

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

judged: 101 states · the recorded judge needs W = 4 on this problem
Green outline: alive (361 still reachable). Blue fill: kept. The whole problem has 126 non-terminal states and 556 complete move sequences; 4 of them reach 361. Judge scores are the lab's recorded outputs for this problem; the move rules and alive labels are computed here.

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.

A dark two-panel frame. Left, titled 'An LLM thinking in text, Qwen3-1.7B, one line, one step at a time': a single glowing yellow path with a ringed repeat marked x2, and the counter '840 tokens written, one after another', '((98 − 24) − 19) + 3 = 58', '3 attempts, 1 repeats of its own earlier attempts'. Right, titled 'Interference Search, many lines at once, merge, cancel, advance together': a web of faint white paths converging on a bright node, with '3 steps, every line moving at once', 'solved: ((24 × 19) + 3) − 98 = 361', '12 lines alive, 33 fused, 112 burned out'.
The frame the post's video is built on: the model's recorded reasoning on the showcase problem at token 840, beside the width-12 frontier solving it. The 33 fused are the lab's trace's 28 second-level merges plus 5 at the third level. The two panels are not the same system: the right one never runs the model (paper, Figure 1).

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.

A line chart, 'solved (of 30)' against 'positions judged per problem' from 0 to 520. The Interference Search curve rises steeply from 0 to 23 by 80 positions, reaches 29 by 130 and 30 at 200, and stays flat. The 'one line of thought' curve rises more slowly, 15 at 100, 21 at 200, 24 at 330 and 25 at 520.
Hard four-number Countdown, the same judge and budget for both arms (paper, Figure 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).

receiptscaptured 2026-09-26

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 → targetsetlevel 1level 2alive at 2all statespathssolution pathsrandom, W=6random, W=16
25, 11, 22, 14 → 451hard, seed 0, #01996111658714.3%15.2%
34, 12, 1, 8 → 434hard, seed 0, #1167519249715.5%20.6%
2, 5, 22, 27 → 226hard, seed 0, #21999111958514.1%15.3%
13, 92, 1, 16 → 299hard, seed 0, #31675392506417.6%53.1%
16, 15, 19, 57 → 582hard, seed 0, #419105112556613.6%14.3%
3, 69, 2, 19 → 270hard, seed 0, #519110113057738.2%15.8%
20, 11, 7, 30 → 390hard, seed 0, #61896111550313.9%15.8%
24, 23, 18, 88 → 153hard, seed 0, #7189571144961847.1%75.9%
12, 17, 54, 16 → 338hard, seed 0, #818953114496414.5%43.3%
70, 24, 12, 16 → 123hard, seed 0, #919107112758114.0%14.7%
25, 89, 25, 5 → 531hard, seed 0, #101370384652420.4%54.3%
3, 13, 41, 19 → 589hard, seed 0, #111899111851439.2%16.8%
47, 14, 18, 15 → 875hard, seed 0, #1218943113508414.8%43.0%
15, 13, 64, 10 → 344hard, seed 0, #131898111751614.5%14.6%
74, 4, 25, 9 → 888hard, seed 0, #141898111751039.0%17.6%
11, 92, 9, 16 → 505hard, seed 0, #1518100111952127.0%17.5%
10, 4, 35, 20 → 280hard, seed 0, #162011351346271027.1%56.0%
15, 9, 1, 65 → 201hard, seed 0, #171675392514416.3%51.1%
6, 10, 44, 9 → 308hard, seed 0, #18181002119526413.6%30.5%
62, 13, 7, 8 → 656hard, seed 0, #191897111651539.1%16.6%
21, 11, 15, 28 → 75hard, seed 0, #20189771165071847.7%74.2%
60, 24, 20, 10 → 270hard, seed 0, #2121129115172212.9%10.1%
20, 11, 49, 18 → 467hard, seed 0, #221898111752614.0%15.9%
51, 3, 3, 8 → 714hard, seed 0, #231371185671310.2%22.2%
21, 25, 20, 3 → 315hard, seed 0, #24191045124555824.3%58.4%
3, 10, 15, 64 → 514hard, seed 0, #2519104112457638.3%16.8%
7, 4, 56, 5 → 116hard, seed 0, #2620115113664113.6%12.4%
9, 20, 29, 18 → 133hard, seed 0, #2719943114594413.7%42.0%
19, 19, 74, 16 → 249hard, seed 0, #281260373551825.6%62.8%
14, 54, 19, 17 → 104hard, seed 0, #29189971185151847.8%74.2%
24, 98, 19, 3 → 361showcase (seed 11)191063126556412.8%38.6%
14, 17, 5, 36 → 737showcase (seed 11)1899111852714.2%14.5%
7, 5, 8, 55 → 880showcase (seed 11)191063126564413.4%37.8%
65, 12, 14, 18 → 308showcase (seed 11)1898111750727.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.

method My own enumerator, written from the rules in section 3 of the paper: a state is the sorted multiset of available numbers; a move combines two of them with +, -, x or /, and the result must be a positive whole number (division by 1 is skipped, as in the paper's move lister, because it only produces duplicates). It reproduces the recorded showcase trace in results/llm/viz_slim.json exactly (19 first-level states; 110 raw children merging into 82 distinct second-level candidates). Alive = the target is still reachable, by exhaustive search. Non-terminal states = levels 0 to 2. Complete paths = distinct move sequences to a single number. Random-ranking columns: 4,000 trials per problem, one pass, no restarts, matching probe.py's enum_frontier at width 6 and core.search's first pass at width 16. None of Bad Theory Labs' code was executed.
data /articles/btl-interference-search/data/state-space.json (34 rows, 9.8 KB)

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:

Solved out of 30 hard four-number Countdown problems against positions judged per problem. Interference Search reaches 30 at 200; one line of thought reaches 21 at 200 and 25 at 520. The same frontier with an exact solver as judge reaches 30 at 80; with a random order it reaches about 14 at 200. A breadth-first pass over every state costs 72 to 150 judged positions.every state, no judge: 72–15001020300100200300400500positions judged per problem
30 / 30 · Interference Search (trained judge)21 / 30 · one line of thought (trained judge)30 / 30 · same frontier, exact solver as judge14.0 / 30 · same frontier, random order
Solid curves: the lab's 30 problems (its Figure 3 data). Dashed curves and the band: my runs of the same loop on 30 other hard problems from the same generator. Proposing moves and checking the goal are free in this unit; only judging a state costs.

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

A line chart, 'solved (%)' against 'expansions per problem' on a log scale from 10 to 400, for four arms. Frontier, merged: 17, 33, 61, 77, 88, 94. Frontier, no merge (dashed): 13, 29, 39, 50, 59, 74. One line: 3, 14, 26, 40, 48, 71. Best-first: 0, 0, 1, 10, 21, 57.
100 unseen six-number problems, the same judge for every arm. Here merging carries the frontier's lead, and a global best-first memory does worse than one line (paper, Figure 4).

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).

StrategySolvedGenerated tokens per solve
Agent loop with full chat history7 / 30n/r
Revise the latest program7 / 30about 5,460
Fresh attempts (best of N)8 / 30about 5,090
Interference Search9 / 30about 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.

The log runs from 2026-09-22 to 2026-09-24. The whole project took three days.

What is good here

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

  1. The 23 of 30 involves no language model.

    It rests on experiments/llm/probe.py: the "small refuter" arm calls the set transformer through ref_judge and 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 from llm_state.py's frontier+ref arm, where the model proposes moves, this is wrong.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

Cite this article

For attribution, please use the following reference or BibTeX:

Satyajit Ghana, "Interference Search: the 23 out of 30 has no language model in it", ai.thesatyajit.com, September 2026.

bibtex
@misc{ghana2026btlinterferencesearch,
  author = {Satyajit Ghana},
  title  = {Interference Search: the 23 out of 30 has no language model in it},
  url    = {https://ai.thesatyajit.com/articles/btl-interference-search},
  year   = {2026}
}
share