The mathematics survives everything I threw at it. The headline result reproduces to the seventh decimal. The story told about both is where the work is.
Companion → Evidence ledger every study, its protocol, its data, and whether its prediction was registered before the measurement
I cloned both repositories, built the pinned environment, ran every test, downloaded the pinned checkpoint, re-captured the headline experiment from scratch, and executed candidate interventions the authors never executed. Everything below is measured on this machine, not read off the README.
The short version: this is careful, unusually well-documented work whose engineering I
could not break. The 107-test suite passes completely on hardware the authors never
touched. The central mathematical identity holds to machine precision under every edge case I could
construct. The headline repair reproduces bit-for-bit. The documentation
(LIMITS.md, REPAIR_CASE.md) is more candid than most published papers.
And: three specific claims in the README are contradicted by experiments I ran using the authors' own code paths, the reported success rate has a denominator ten times smaller than the one readers will infer, and the phrase "one gradient step" carries an implication of descent that is contingent on the layer rather than guaranteed by the construction. None of this touches the mathematics. All of it touches what the work is allowed to claim.
One figure in an earlier version of this report was wrong in the paper's favour and is corrected in §3: I measured the descent objection on the wrong checkpoint, pooled across layers the paper never uses, and it is far weaker on the configuration secant actually studies.
A 70-agent review fleet covered eleven dimensions — identity derivation, contract-to-code matching, the edit solver, the ranking algebra, the native adapter, sandbox security, test quality, headline methodology, performance, API design, and prior art — with every finding put through two adversarial verifiers on distinct lenses. 8 of 26 findings were refuted and discarded. A completeness critic then audited the review itself and refuted one of its own top findings. In parallel I ran the empirical work reported here.
Every claim I could check against a number, checked. This table is the part I would want to see first if this were my project.
| Claim | Repo states | I measured | Verdict |
|---|---|---|---|
| Full test suite, no downloads | 107 pass | 107 pass, 0 skip, 9.8 s | reproduced |
| Candidate count | 109,080 | 303 × 24 × 15 = 109,080 | exact |
| Baseline logit margin | −6.683786 | −6.683828 | reproduced |
| Top-ranked predicted gain | +11.360970 | +11.360963 | 7 s.f. |
| Executed margin gain | +9.398861 | +9.3989 | exact |
| Winning intervention | L21 row 79 ×64 | L21 row 79 ×64 | rank 1 |
| Generated program | legacy(current(value)) | legacy(current(value)) | identical |
| Fixed check | 6/6 | 6/6 | reproduced |
| Ordinary / emphasis / no-op controls | 0 / 1 / 0 of 6 | 0 / 1 / 0 of 6 | reproduced |
| Secant identity, synthetic | ~1e−30 (f64) | 2.2e−16 max abs | exact |
| Secant identity, live Qwen2.5 | — | 6.4e−14, all 336 heads | exact |
| "0.35 seconds" | 0.35 s | 0.349 s scoring + 2.078 s capture | partial |
| "107 attempts shipped in the repo" | 107 | 1 attempt + a 2 KB tally | not shipped |
| Negative stale-document case | −4.26 → −1.47 | absent from both repos | unverifiable |
Two things are worth pausing on. The predicted gain agreeing to seven significant figures across a different operating system, a different PyTorch build, and a six-version torch gap is a genuinely strong reproducibility result — better than most papers I have replicated. And the identity holding at 6.4e−14 across all 24 layers and 14 heads of a live model, not just synthetic tensors, is the real validation of the secant construction.
The load-bearing question for the secant paper is whether the objective is defined independently of the output it explains. If Ei were built from yi, the identity would be a tautology dressed as a theorem. It is not, and the reason is precise.
The proof step is y − μ = Σⱼ(esⱼ − 1)(vⱼ − μ)/Z. Subtracting the 1 is free only because Σⱼ(vⱼ − μ) = 0, which holds precisely when μ is the uniform arithmetic mean of the permitted values. That licenses es − 1 = s·ρ(s), and s is affine in the query — which is the whole point. I tested four choices of μ; only the uniform mean works.
| Choice of μ | Σⱼ(vⱼ − μ) | Identity error |
|---|---|---|
| Uniform arithmetic mean — the paper's choice | 2.2e−16 | 1.1e−16 |
| Softmax-weighted mean | 3.66 | 2.6e−01 |
| Zero vector | 4.00 | 2.9e−01 |
| Arbitrary constant | 22.9 | 1.6e+00 |
I also confirmed ΔM = −∇BE(0) against a central finite difference, and the identity survives every edge case: a single permitted key, all-equal scores (the ρ(0)=1 branch), scores scaled to ±6, causal masks, 2048-token banks, 64-dimensional values.
"Exactly one gradient step" implies descent. A unit-step gradient step reduces a quadratic objective only when λmax(H) < 2, and whether that holds turns out to be a property of the layer rather than of the construction.
I first reported that the step increases E in 188 of 336 heads (56%) and filed that against the paper. That number was pooled across all 24 layers of the Instruct checkpoint — captured for the toolkit's case, not for this paper. It is not the configuration secant studies, and I quoted it before measuring theirs. Re-measured on base Qwen2.5-0.5B at the pinned revision, layer 23, 511-token prefixes, the objection is far weaker than I made it.
| Configuration | E(ΔM) > E(0) | λmax(H) |
|---|---|---|
| layer 23, base model — the paper's own setting | 3 of 28 — 11% | median 0.51 |
| layer 23, Instruct | 1 of 14 — 7% | median 0.47 |
| all 24 layers pooled — what I originally reported | 188 of 336 — 56% | — |
| layer 0 | 13 of 14 | 6.55 |
| layer 4 | 10 of 14 | 21.41 |
| layers 16 and above | near zero | < 1 |
What survives is narrower, and still worth a line in the paper: descent is contingent on the layer's spectrum, and λmax reaches 109 even at layer 23 in a single head. ΔM = −∇E(0) is exact and unaffected — "one gradient step" is exact as a statement about the gradient and contingent as a statement about descent. Saying so costs a sentence and removes a referee's easiest objection.
Because the first measurement was on the wrong checkpoint, I captured theirs: post-RoPE Q/K/V at layer 23 of base Qwen2.5-0.5B at the pinned revision, 511-token prefixes, all 14 query heads. The identity and the gradient claim both hold, and the paper's gauge family checks out as stated.
| Check, on the paper's own configuration | Result |
|---|---|
| max │ydirect − (μ + qTΔM)│ | 7.88e−14 |
| max │⟨∇E(0) + ΔM, u⟩│, random directions | 6.75e−12 |
| gauge freedom, κ ∈ {0, 1, 2, −3} | all reproduce y to ~1e−14 |
Two further points compound the descent caveat, and both are in the authors' own materials. The gauge family above means "the" objective is not unique. And secant's own frozen-reuse table shows the matrix, when reused across queries, is worse than doing nothing — rRMSE 2.608 against the anchor output. That is the honest number that empties the in-context-learning reading, and the authors published it.
The attention write is one exact gradient evaluation of an explicit, positively weighted least-squares objective built from the head's own rotated keys and centered values, with softmax intact and RoPE unremoved. That is a clean, verifiable, and genuinely elegant re-parameterisation, and on the paper's own layer the unit step usually does descend as well. What it is not is evidence that attention optimises anything: the gauge family means the objective is not unique, and the paper's own frozen-reuse table shows the matrix is worse than doing nothing when carried across queries. Both of those are the authors' own numbers.
The claim: Qwen2.5-0.5B writes a broken API call; no prompt fixes it; a ×64 attention reweight on the token ' legacy' at layer 21 fixes it, 6/6. It reproduced exactly for me. Four findings reframe what it shows.
case_request() supports three emphasis policies. The recorded case used
full_source (paste the whole API again), which scores 1/6. The
definition policy — "Give special attention to this current source definition:
def legacy(value):" — was never run on this case. It scores 6/6,
with a cleaner answer than the attention edit produced.
| Prompt-only arm | Generated | Tests | Note |
|---|---|---|---|
| A. Ordinary (recorded baseline) | lookup(value) | 0/6 | matches recorded |
B. full_source emphasis (recorded control) | current(value) | 1/6 | matches recorded |
C. definition emphasis — never run | legacy(value) | 6/6 | the missing control |
| D. Name the target outright | legacy(value) | 6/6 | upper bound |
| E. Semantic hint, no name | lookup(value) | 0/6 | task is genuinely hard |
| F. Chain-of-thought nudge | lookup(value) | 0/6 | task is genuinely hard |
| G1. Point at the wrong definition | current(value) | 1/6 | pointing is causal |
| G3. Irrelevant appended text | lookup(value) | 0/6 | not a length artifact |
The fairness argument matters here. The attention edit was given the answer as its objective (prefer='legacy(value)'). Arm C gives the prompt the same information at the same specificity. Apples to apples, prompting wins — and returns the minimal correct call rather than a redundant nesting. The repo is candid that the ranking target is human supplied; the README sentence "no prompt could" is what does not survive.
Nobody executed anything but rank 1. I executed ranks 2, 5, 9 and more. Rank 5 boosts the token legacy inside legacy_example_1: — a line the prompt explicitly labels "HISTORICAL call sites from the retired lower-case format (not authoritative)", and whose content recommends the wrong function (return api.current(value)). It produces the same program and passes 6/6.
| Executed intervention | Region of the prompt | Δmargin | Generated | Tests |
|---|---|---|---|---|
| Baseline — no edit | — | +0.0000 | lookup(value) | 0/6 |
| No-op, L21 r79 ×1.0 | authoritative api.py | +0.0000 | lookup(value) | 0/6 |
| Rank 1 — L21 r79 ×64 ' legacy' | authoritative api.py | +9.3989 | legacy(current(value)) | 6/6 |
| Rank 2 — L14 r288 ×64 ' expression' | instruction sentence | +9.8562 | api.current(value).tri… | malformed |
| Rank 5 — L21 r132 ×64 'legacy' | non-authoritative history | +8.1121 | legacy(current(value)) | 6/6 |
| Rank 9 — L21 r122 ×64 'legacy' | non-authoritative history | +6.4177 | lookup(value) | 0/6 |
| L21 r142 ×64 'legacy' | non-authoritative history | +1.3601 | lookup(value) | 0/6 |
| L21 r129 ×64 '.current' | non-authoritative history | −0.0176 | lookup(value) | 0/6 |
I ran the control that was missing — magnitude-matched ×64 reweights at random sites, executed end-to-end. It comes out emphatically in the method's favour, and it refutes the alternative hypothesis I had been entertaining above.
| Arm | n | Passed 6/6 | Median Δmargin | Max Δmargin | Δ > +5 |
|---|---|---|---|---|---|
| Ranked top-20 (the method) | 20 | 6 — 30.0% | +6.549 | +9.856 | 14/20 |
| Random ×64, all layers | 40 | 0 — 0.0% | −0.003 | +1.725 | 0/40 |
| Random ×64, layer 21 only | 20 | 0 — 0.0% | +0.001 | +0.220 | 0/20 |
Earlier in this review I suggested that rank 2's behaviour — largest margin gain, malformed output — pointed toward "a large attention perturbation jolts a 0.5B model off its failure mode." That hypothesis is now dead. Sixty random perturbations of exactly the same family and magnitude moved the margin by a median of −0.0007 and produced zero repairs. Whatever else is true, the ranking is doing specific, causal work, and it is not a perturbation artefact.
The lexical caveat survives this and should be read alongside it: among the sites the ranking does select, one of the winners (row 132) sits in text the prompt marks non-authoritative, and a repair needs Δmargin ≳ +6.7 to flip the token at all. So the ranking finds real causal sites; the question that remains is what those sites mean.
This is the finding I would most want the authors to see. The README frames the tool as settling "either it is attending to the wrong tokens, or it is attending correctly and deciding wrongly." But amplifying a string in text the prompt says to ignore produces the same repair. That is closer to lexical amplification of a target token than to restoring attention to the authoritative source. The effect is graded rather than purely lexical — rows 122 and 142 gain margin without flipping the answer — so the honest reading is "attention magnitude on the target string, wherever it sits."
The fixture defines legacy(v) = v.strip().lower().swapcase() (uppercase)
and current(v) = v.strip().upper().swapcase() (lowercase) — deliberately
inverted names. All six tests assert the same behaviour on six inputs. Any expression whose
outermost call is legacy passes all six; anything else passes at most
test_empty. That single bit is exactly what the objective
(prefer_token 'legacy') maximises. Note also that
api.legacy(value) alone scores 6/6 — the winning answer's inner
api.current call is redundant.
The review fleet extracted a base64 evidence capsule from notebook cell 2 containing
SEARCH_HISTORY.json. I tallied it independently: of 107 attempts, 85 were
excluded because a control already solved them and 11 had invalid controls. Ten cases
reached an attention edit. One passed. The winning study
(real_repair_api_expressions) was itself a single hand-built case run after three
consecutive failures in the preceding study.
| Outcome across 8 studies | Cases | Reaches an attention edit? |
|---|---|---|
| A control already solved the task | 85 | no — task too easy |
| Controls not both valid test failures | 11 | no — invalid fixture |
| Both controls failed, ranked edit did not pass | 9 | yes — failed |
| Both controls failed, ranked edit passed | 1 | yes — the headline |
| Total attempts started | 107 | eligible: 10 |
The repo reports exactly one predicted-versus-executed pair. Since the capture makes scoring free and each execution is a single forward pass, I built the curve: 75 candidates sampled across the full score range, every one natively executed and verified.
This plot is, I think, the single most persuasive artifact this project could publish, and it did not exist. It converts "the contraction is a prediction with no bound" from a caveat into a measured, honest, and rather good result. A global shrinkage of 0.874 barely helps (median error 0.242 → 0.238), because the residual is heteroscedastic rather than a scale error — worth reporting as an error band that widens with |prediction|.
The README's sharpest methodological claim: "Everyone else linearises. The edit that fixed our headline case was a ×64 reweight, and at that magnitude a first-order approximation is not slightly off. It ranks the wrong candidate." This is checkable offline from one capture, so I checked it across all 109,080 candidates.
| Reweight magnitude | Spearman | Top-1 | Top-10 | Top-100 | Rank of exact's #1 |
|---|---|---|---|---|---|
| ×2 | 0.9977 | 100% | 100% | 95% | 1 |
| ×8 | 0.9906 | 100% | 80% | 81% | 1 |
| ×32 | 0.9681 | 100% | 80% | 68% | 1 |
| ×64 — the headline magnitude | 0.9485 | 100% | 80% | 59% | 1 |
| All templates pooled | 0.9678 | 100% | 80% | 53% | 1 |
The linearised score puts L21 row 79 ×64 at rank 1, exactly as the exact score does. The sentence is not supported by the case it cites. The mechanism is instructive: the first-order score is exactly proportional to log(factor) (0.939, 1.878, 2.816, 3.755… — perfectly linear), while the exact score saturates as p→1. So linearisation is systematically biased toward extreme edits, and ×64 is the largest factor offered. The two agree here partly by luck.
Linearisation is badly wrong about magnitude: over the exact top-1000, the first-order score is a median 0.216× the exact value — a five-fold underestimate. At the winner it predicts +5.63 where the exact predicts +11.36 and execution delivers +9.40, so first-order is the only one of the three that would mislead you about whether the edit is worth running. And it does misrank: within 18 of the 24 individual layers, exact and first-order disagree on the top candidate, and top-100 agreement falls to 59% at ×64. All of that is defensible, checkable, and stronger than the sentence currently in the README.
Ten findings survived two adversarial verifiers each. None is a mathematical error; the fleet
found no sign, transpose, or scaling defect anywhere in ranking.py,
margin.py, edits.py, or native.py.
| Sev | Finding | Location |
|---|---|---|
| High | Case-insensitive filesystems (macOS, Windows) silently collapse git-tracked paths differing only in case, breaking the manifest hash chain with no error. The pre-snapshot re-check cannot catch it. | workspace.py:47–98 |
| Med | The full check argv — including any embedded secret — is written verbatim into report.json, the artifact designed to be handed to a human, once per branch. | workspace.py:147 repair.py:197,209 |
| Med | emphasis='body' hardcodes 'return value.strip().upper()' regardless of API style. For indexed/flags/aliases that line is absent; for composed — the headline case's own style — it matches inside the wrong function. I confirmed the consequence empirically: that emphasis steers the model to api.current. | case_study.py:138 |
| Med | Every GQA fixture in all 107 tests fixes the ratio at 4:2. True MQA (num_key_value_heads=1, H>1) and plain MHA (G=H) are never constructed, so an off-by-one in the head-grouping arithmetic would pass CI. | test_native.py:31 ranking.py:44 |
| Med | Scorer.changes() fancy-indexes the full (H,N,D) key and value arrays on every singleton call where a view would do — 360 unnecessary full-array copies at headline scale. | ranking.py:148 |
| Med | The stale-document negative case (README:59–67, "sixteen head configurations", −4.26 → −1.47) has no data, script, or notebook cell anywhere in either repo. | README.md:59 |
| Med | nala.UserError and nala.VerificationError — raised by every input-validation path in the documented workflow — are not exported from the package. | __init__.py:8 |
| Low | Every ranking report hardcodes 'scope': 'one layer…' while candidate_count arithmetically spans all 24. The report contradicts itself. | search.py:86 |
| Low | generate_ids()'s no-edit path reaches private transformers internals with no version gate; the 4.57.3 pin is enforced only via QwenAdapter, which that path never constructs. | native.py:294 |
| Low | Norm fields in native_query_patch are reported in a different, non-isometric vector space from the top-level budget norms when a query projection is used, with nothing marking the difference. | edits.py:694 |
Judged against its own stated contract — "content snapshots, not an OS security sandbox" — the repair subsystem is sound. Symlink refusal, ambiguity refusal, timeout handling, and the stale-workspace invalidation all hold up. The two findings above are gaps within that contract, not violations of a claim it never made.
Ranked by evidence gained per unit effort. Four of these I have already run, and their results are above — I have marked those, because the remaining work is what actually moves the project.
capture.npzThe single file blocking external replication. Only layer 21 is exported today, which makes every cross-layer question unanswerable from shipped data. Shipped — and it is 7.9 MB, not the ~30 MB estimated here: the whole 109,080-candidate ranking now reproduces from it with no model.
"109,080 tests" → "109,080 scored candidates" (there are 107 tests, 140 lines
later). "0.35 seconds" → note the 2.078 s capture it excludes. "107 attempts shipped in the repo"
→ they are not; and the eligible denominator is 1/10. "no prompt could" → falsified by
emphasis='definition'. "ranks the wrong candidate" → replace with the layer-level
and magnitude results, which are true. Delete or publish the stale-document anecdote.
85 too easy / 11 invalid / 9 failed / 1 passed is a more compelling story told straight than the current framing, because it shows the controls were doing real work. Hiding it in a base64 notebook capsule is the worst of both worlds.
View instead of copy in Scorer.changes()
(ranking.py:148), and an O(N) partition instead of a full argsort for the
top-k (ranking.py:241). Both shipped, but the second needed
care I had not anticipated: a bare np.argpartition would break the tie contract the
comment above that line declares, so it is wrapped to reproduce stable-argsort order exactly,
verified bit-identical over 4,000 randomised arrays and all 360 real ones.
There is no workflow file. test_all.py --require-models runs 107 tests
in 9.8 s with no downloads — this is close to free, and the project's whole value proposition is
verifiability.
I executed ranks 1, 2, 5, 9 and four more (§4). The remaining work is the random control: 20–50 magnitude-matched ×64 reweights at random tokens and layers, with a paired sign test. Until that exists, nothing separates "the ranking found the causal token" from "a large attention perturbation jolts a 0.5B model off its failure mode." My rank-2 result — largest margin gain, malformed output — suggests the answer is partly the latter.
api_style='direct'Under composed, nesting self-cancels and the tests certify one bit.
Under direct the names are not inverted and a nested expression is not free. This is
the cheapest test of whether the result depends on the fixture's peculiar algebra.
legacy-vs-current marginThe recorded objective is legacy vs lookup — but
lookup is the ordinary branch's own failed output. The competitor that actually decided
the outcome is current, and that margin is recorded nowhere. One line of
instrumentation.
The honest framing is "exact finite response vs. attribution patching, same
frozen gradient". My §6 numbers are the first half; a pass-rate comparison over a task set is
the second. paper.tex already cites the literature — the README should too.
Before building new fixtures. catalog() emits 24 cases and only
api_style='direct'; the winning case came from an unshipped catalog. A single
pre-registered protocol across all 24 gives a real denominator instead of an adaptive one.
§5. n=75, r=0.97. Extend to several hundred and stratify by edit family; publish the error band. This belongs in the paper.
§6. All 109,080 candidates, all 24 layers. The per-layer disagreement (18/24) and the 5× magnitude error are the publishable findings.
§4. Top-25 decoded and classified by prompt region. Eight of the top nine boost some
occurrence of the string legacy; rank 2 is an instruction token. Worth publishing as a
figure — it is the most informative thing in the capture.
Six of the fifteen templates are one monotone reweight family, so 109,080 counts the same intervention six times per site. The distinct-site figure is 7,272, and the top-20 contains only nine distinct sites and zero non-reweight edits. Report both.
Predicted gain is monotone in the factor for 130 of 303 rows and still rising at
the cap in ranking.py:85. The search chose the site; the magnitude was chosen
by a validator constant. Either widen the cap and report where gain turns over, or say plainly that
the magnitude is fixed.
0.35 s is not a bottleneck and batching worsens peak memory. Document the memory
ceiling in LIMITS.md rather than engineering for a scale nothing approaches. The
identity has now been confirmed to 1e−14 against a live model by an independent party; the dense
oracles already catch targeted mutations to 1e−12. Spend the effort on T6.
The five model-run items were run under a protocol frozen before any inference. Four are answered. One is not, and the reason it cannot be answered is itself the result.
| Item | Verdict | |
|---|---|---|
| T6 | Adversarial control battery | proven — ranked 6/20 vs random 0/60, p = 1.3×10⁻⁴ |
| T7 | Does it depend on api_style? | answered — needs composed and adversarial naming, jointly |
| T8 | The legacy-vs-current margin | answered — the recorded objective is the wrong yardstick |
| T9 | Exact vs linearized, head to head | not proven — tie at n=1, cannot be powered here |
| T10 | Frozen sweep of the 24-case catalog | answered — 0/24 eligible |
Across all 32 cases, ordinary generation passes 0, full_source
emphasis passes 31, and one line naming the correct definition passes
32 of 32 — including an exact reconstruction of the headline case that
full_source emphasis fails. Under the declared eligibility rule, no case in 32
reaches the attention machinery at all; under the original study's looser rule, exactly one
does, and it is the headline cell. This independently reproduces the authors' own
real_repair_v2 record: 24 started, 24 solved by a control.
Two incidental findings fall out. Distractor count is inert — 8, 32, 64 and 0 legacy examples give
byte-identical outcomes on every branch, so the specification's stated hypothesis about legacy call
sites biasing API selection is not what drives the baseline failure. And ordinary generation never
writes the competing API: in all 24 cases it writes lookup(value), the name of the
client function being repaired. The baseline failure is the model parroting the nearest enclosing
identifier.
| Branch | argmax | legacy − lookup | legacy − current | Tests |
|---|---|---|---|---|
| ordinary, no edit | lookup | −6.6838 | −1.2380 | 0/6 |
| ordinary + the ×64 edit | legacy | +2.7151 | +6.9623 | 6/6 |
| full_source emphasis, no edit | current | +5.8480 | −1.4797 | 1/6 |
The catalog's defaults are already the stronger choices — objective good vs
bad, emphasis definition. The headline case overrode both, and both
overrides move it toward a weaker comparison.
None of this disturbs T6. When the ranking is invoked it beats chance decisively. What this sweep establishes is how seldom it needs to be: on this fixture family, roughly one case in thirty-two, and only under a specific conjunction of an opaque implementation and a name asserting the opposite.
The sweep left T9 unanswerable: with no case where prompting fails, there is nothing for the ranking to be better than. So the next step was to build the missing fixtures.
The obvious lever is to move the answer away from the definition the prompt points at — delegate
through a helper, route through a dispatch table — so that reading def good(value): no
longer reveals the behaviour. Across 48 generated single-call cases, at three depths of indirection
and four levels of body opacity, it fails completely: definition emphasis still
passes 6/6 on every one, including where the body is return _apply(value, _SELECTOR).
The instructive part is the comparison. Naming the function outright — a strictly more explicit
instruction — passes only 34 of 48. The weaker-looking prompt beats the stronger one, and the
difference is position: the definition message ends with the literal
def legacy(value):, putting the target token adjacent to where the answer is generated.
That is the same lexical-adjacency mechanism the attention edit exploits, delivered through the
prompt instead.
If the answer is an ordered pair of calls and no single call passes, there is no function a prompt can name.
| Prompt arm | 48 single-call cases | 18 compose cases |
|---|---|---|
| ordinary generation | 0/48 | 0/18 |
| definition emphasis | 48/48 | 0/18 |
| full-source emphasis | — | 0/18 |
| naming the answer outright | 34/48 | 10/18 |
Nine of the eighteen had a definable margin objective. On those the top-ranked attention edit
repaired one, and the no-op control repaired none. The success —
L21, row 88, reweight ×64 on ' legacy', producing
legacy(current(value)) — independently regenerates the headline case's structure:
same layer, same factor, same token, same output shape. On this case the claim
"repaired a program that no prompt could" is true, in the way it was not
true of the recorded one. The rate is one in seven of the cases that are prompt-proof but still
answerable when the model is told the answer.
Across all nine eligible cases, exact and linearized ranking chose the same site 9/9 and produced the same outcome 9/9. With the recorded case's identical global top-1 and the earlier tie at n=1, the verdict is that in this task family the two scorers are indistinguishable on selection. Exact remains clearly better on magnitude — a median five-fold difference, and the only one of the two that correctly signals the size of the effect — but there is no evidence it picks different candidates.
One limitation is mine rather than the repo's: nine of the eighteen could not be scored because
the two API names share a first token (fetch_new and fetch_old both begin
fetch), leaving the first-distinct-token margin undefined. My harness called
capture_margin directly and skipped them. The repo handles this correctly —
prepare_probe appends the shared prefix to the conditioning sequence and takes the first
distinct tokens. A fuller sweep should route through it, and would recover those nine. It is worth
flagging only because shared-prefix names are the ordinary case in real API migrations.
Two data items remained, plus the nine cases T9 could not score. All three are now closed, and one of them corrects a conclusion stated earlier in this report.
§10 scored only nine of eighteen generated cases: the rest have API names sharing a first token, leaving the first-distinct-token margin undefined. Routing through the repo's own shared-prefix conditioning recovers all nine.
| Batch | n | Same site | Same outcome |
|---|---|---|---|
| conflict names, direct objective | 9 | 9/9 | 9/9 |
| neutral names, shared-prefix conditioning | 9 | 4/9 | 9/9 |
| pooled | 18 | 13/18 | 18/18 |
§10 concluded that exact and linearized ranking are "indistinguishable on selection". That was drawn from the conflict batch alone. Across the full eighteen they pick a different site in 5 of 18 cases. They are not indistinguishable. What survives is narrower and more useful: they diverge in selection roughly a quarter of the time, and in this task family the divergence never changed the outcome. Read with §6 — where exact and first-order disagree on the top candidate within 18 of 24 individual layers — the consistent picture is that the two scorers genuinely differ in what they pick, and it has not yet been shown to matter for what happens. That is a better open question than agreement would have been.
ranking.py:82 caps reweight at 64, noting the range "is exercised by the real repair
study". Lifting only that bound and sweeping the headline site:
| factor | predicted | executed | p(row 79) | tests |
|---|---|---|---|---|
| 16 | +7.6565 | +6.7243 | 0.2283 | 6/6 |
| 64 — shipped cap | +11.3610 | +9.3989 | 0.3906 | 6/6 |
| 128 | +12.4411 | +10.2565 | 0.4728 | 6/6 |
| 256 | +12.9562 | +10.8124 | 0.5520 | 6/6 |
| 1024 | +12.1517 | +10.7054 | 0.6942 | 6/6 |
| 4096 | +10.0024 | +9.3069 | 0.7951 | 6/6 |
| 65536 | +8.2913 | +7.9825 | 0.8746 | 6/6 |
| 1048576 | +8.5416 | +7.9706 | 0.9393 | 6/6 |
Why it turns over. Not in any head's response — all 14 are individually
monotone in the factor. The non-monotonicity is entirely in the pooling. The gain is
Σh(p'h − ph)(ah − complementh),
and at this site the per-head coefficients have mixed signs — 11 heads positive, mass +18.77;
3 negative, mass −8.36 — while each head's probability saturates at a rate set by its own
baseline, which ranges from ~0 to 0.154. The positive heads saturate first; the negative ones keep
growing afterwards and pull the sum back to its asymptote. The non-monotonicity is a real property
of the exact finite response, and it is invisible to a first-order score, which is proportional to
log(factor) and therefore monotone forever.
The outcome does not care. The check passes 6/6 from ×16 to ×1,048,576 — five
orders of magnitude, producing legacy(current(value)) at every one. So the 64 in the
headline is arbitrary within a very wide plateau; what mattered was crossing a threshold near ×16.
Margin and outcome come apart again here, in the opposite direction from rank 2 in §4: there a
large margin gain gave a malformed answer, here a 15% better margin gives an identical one.
109,080 candidates are 7,272 distinct (layer, token) sites × 15 templates, and
seven of those fifteen are reweight — one monotone family counted seven times per site. Four edit
kinds actually appear; RANKING.md documents seven, so key,
value and joint were never used. The concentration at the top is sharper
than the totals suggest: the top-20 holds nine distinct sites and only six distinct
tokens, all reweight, with L21 row 79 alone taking four of the twenty
slots at ×8, ×16, ×32 and ×64. Top-100 covers 46 sites; top-1000 covers 413. Reporting both figures
would be more informative than either.
The recorded repair is one case on one 0.5B model. Running the identical fixture at 0.5B, 1.5B, 3B and 7B separates two things that had been travelling together: the ranking's choice of where to intervene, and whether intervening there changes the answer.
The site generalises. The repair does not. Every scale independently selects the same token, and only 0.5B flips.
| layers | H/G | ordinary | definition | full-source | ranked edit | no-op | |
|---|---|---|---|---|---|---|---|
| 0.5B | 24 | 14/2 | 0/6 | 6/6 | 1/6 | 6/6 | 0/6 |
| 1.5B | 28 | 12/2 | 0/6 | 0/6 | 0/6 | 0/6 | 0/6 |
| 3B | 36 | 16/2 | 0/6 | 1/6 | 1/6 | 0/6 | 0/6 |
| 7B | 28 | 28/4 | 1/6 | 1/6 | 0/6 | 1/6 | 1/6 |
| winner | relative depth | predicted | executed | |
|---|---|---|---|---|
| 0.5B | L21/24 row 79 ×64 | 0.875 | +11.36 | +9.40 |
| 1.5B | L26/28 row 79 ×64 | 0.929 | +11.22 | +8.03 |
| 3B | L33/36 row 79 ×32 | 0.917 | +18.58 | +10.83 |
| 7B | L22/28 row 79 ×64 | 0.786 | +7.89 | +7.64 |
Under the legacy-vs-current objective — the competitor the model
actually offers, per §11:
| baseline | executed change | after | flips the answer? | |
|---|---|---|---|---|
| 0.5B | −1.238 | +8.200 | +6.962 | yes |
| 1.5B | +1.551 | +7.039 | +8.590 | no |
| 3B | −8.766 | +9.782 | +1.016 | no |
| 7B | −6.888 | +3.881 | −3.007 | no |
The cause is visible at the token level. At 1.5B the first generated token is
api with p = 0.9971, while legacy and
current together hold 8.3×10⁻⁵. The objective compares
two tokens carrying no mass at the position where the model is deciding, so it can move ±8 nats
without touching the argmax.
Underneath that sits a tokenisation asymmetry: .current and
.lookup are single merged tokens, and .legacy is not — it
splits into . + legacy. In the api.foo(value) format the larger
models prefer, the correct answer is reachable only through a two-token path competing against
one-token alternatives. This is §11's finding in its strongest form: the first-distinct-token
margin is not the quantity that decides the output, and above 0.5B it is not even measured on the
model's own path.
Corrected in §15: the residuals in this paragraph were produced by a check that could not fail. The conclusion stands and is now properly measured; the figures below were not evidence for it.
Recomputed in an overflow-safe form over every layer and head: residual 9.77e−15 at 0.5B, 8.44e−15 at 1.5B, 1.42e−14 at 3B and 1.33e−14 at 7B, across 336, 336, 576 and 784 (layer, head) pairs. The identity holds everywhere. It is the behavioural claim that is 0.5B-specific.
A decoding bug that changed an answer. I used model.generate() for the
no-edit branches and a bare argmax loop for the edited ones. The checkpoint's
repetition_penalty (1.1 at 0.5B, 1.05 at 3B) is active even with
do_sample=False, so the branches were decoded differently, and the penalty is no part
of the margin the ranking optimises. At 3B this changed the result outright — penalised argmax
current, raw argmax api at p = 0.73. Every cross-branch number from before the
fix was void and all four sizes were re-run on one decoding path.
A reading I discarded. A diagnostic forcing the prefix api. appeared to
show 1.5B preferring legacy at p = 0.999. But tok("api.") is api
+ . as two tokens, a state the model never visits, because its own path merges the dot into
.current. Off-path conditioning is not evidence about on-path behaviour. I also found my
identity formula overflowing at 3B and 7B, returning 1e+121 and 1e+46, and recomputed all four.
So the headline should be described as demonstrated at 0.5B and not reproduced at 1.5B, 3B
or 7B on the same fixture. A fair test above 0.5B needs the objective and the response contract
re-derived per model, since both are tokenisation-dependent — itself worth stating in
LIMITS.md.
§12 could not say whether the repair fails above 0.5B or whether the harness fails to measure it. Both, as it turns out — and both are fixable.
A fixture declares one response format and one objective. Neither travels, and when they break they break quietly: the study still returns numbers, and the numbers look like model behaviour.
| writes unaided | fixture grammar | objective mass at the decision | |
|---|---|---|---|
| 0.5B | lookup(value) | accepts | 0.0055 |
| 1.5B | api.current(value) | rejects | 8.3×10⁻⁵ |
| 3B | api.current(value) | rejects | 2.0×10⁻⁴ |
| 7B | current(value) | accepts | 0.84 |
Format comes from one unforced greedy decode. The objective comes from the first token at which
the preferred answer and the model's own answer diverge — taking the competitor
from the model is what keeps it on-distribution, because the avoid branch is by
construction the thing the model was going to do.
| prefer | avoid | decision mass | one-token | full-answer | |
|---|---|---|---|---|---|
| 0.5B | legacy | lookup | 0.9890 | −6.684 | −9.741 |
| 1.5B | . | .current | 0.9855 | −7.628 | −7.830 |
| 3B | . | .current | 0.9515 | −10.315 | −10.453 |
| 7B | legacy | current | 0.8407 | −6.887 | −6.635 |
The derivation refuses rather than returning a plausible-looking contract: an off-path shared prefix; a vacuous on-path check when nothing is shared; mass below a floor; one answer a token-prefix of the other; the model already writing the answer; and a one-token margin whose sign disagrees with the full teacher-forced answer margin. A contract that mis-derives silently is worse than none.
Every study in this review began as a separate script — about seventy of them, none
versioned or tested — and the same defects recurred. Three are now fixed once, in shared code,
each with a regression test keyed to the incident it came from: one decoding path,
after a harness used model.generate() for unedited branches and a bare argmax loop for
edited ones, letting the checkpoint's repetition_penalty apply to half a comparison and
change a result at 3B; overflow-safe arithmetic, after an identity residual returned
1e+121 at 3B rather than raising; and one answer scorer, reporting the strict and
lenient readings separately rather than choosing between them.
A design review flagged ambiguous-fork dilution: a bare . carries generic
continuation mass, so the one-token margin might point opposite to the answers it stands for —
citing opposite signs at 1.5B. Measured, all four agree (1.5B: −7.63 against −7.83). The
guard ships anyway, because the condition that would trip it is a property of the vocabulary rather
than of these four checkpoints, and it costs two forward passes. It is carried as a guard, not as a
fix for an observed failure, and the documentation says so.
The same review found a real hole I had missed: with nothing shared, path[:0] == [] is
vacuously true and proves nothing. Fixed and tested. I also twice wrote unverified test counts into
the README from a run of the environment that has Torch and therefore skips nothing — the same
class of error this review has spent its length on.
What this does not do is rescue §12's conclusion. A well-posed objective at 1.5B and 3B means the scaling result can now be measured rather than confounded; it does not make the repair work there. That experiment is the obvious next one, and it is now possible.
§13 built the contracts; this runs the same recorded case at all four sizes through them. The question it can now answer, and §12 could not, is whether the repair fails above 0.5B or whether the harness failed to measure it.
The negative result stands, and it was not an artefact of the objective. Only 0.5B repairs, on a well-posed objective at every size. But the explanation changes: margin and outcome are no longer decoupled. Every size whose margin crosses zero repairs, and every size whose margin does not, does not.
Until this reads yes, no margin measured underneath it means anything — which is what made §12 unreadable at 1.5B and 3B.
legacy-vs-current pair was already the
right question there, which is why the red ring sits on the green mark.| writes unaided | ordinary | definition | full-source | ranked edit | no-op | |
|---|---|---|---|---|---|---|
| 0.5B | lookup(value) | 0/6 | 6/6 | 1/6 | 6/6 | 0/6 |
| 1.5B | api.current(value) | 1/6 | 1/6 | 1/6 | 1/6 | 1/6 |
| 3B | api.current(value) | 1/6 | 1/6 | 1/6 | 1/6 | 1/6 |
| 7B | current(value) | 1/6 | 1/6 | 0/6 | 1/6 | 1/6 |
| baseline | executed | after | winner | predicted | repairs? | |
|---|---|---|---|---|---|---|
| 0.5B | −6.684 | +9.399 | +2.715 | L21/24 row 79 ' legacy' | +11.36 | yes, 6/6 |
| 1.5B | −7.628 | +3.135 | −4.492 | L26/28 row 79 ' legacy' | +2.55 | no |
| 3B | −10.315 | +3.931 | −6.384 | L29/36 row 81 '):\n' | +5.68 | no |
| 7B | −6.888 | +3.881 | −3.007 | L22/28 row 79 ' legacy' | +5.87 | no |
The executed gains were inflated. §12 reported +8.03 at 1.5B and +10.83 at 3B. Those are real numbers about an off-path quantity: they moved a margin between two tokens the model was not choosing between. On the derived objective the same edits at the same sites move +3.14 and +3.93. The intervention is roughly a third as strong as it looked, and only at 0.5B does it exceed the deficit it has to close.
The site is three of four, not four of four. §12's most surprising result was that every scale independently selected row 79, the token ' legacy' in the authoritative source. Under the derived objective 0.5B, 1.5B and 7B still do. 3B does not: it selects row 81, '):\n', at L29/36. Three checkpoints across three GQA ratios and 24–28 layers converging on the same source token is still a striking result; four was an overstatement, and it was the mis-posed objective that produced it.
This callout read: residual 9.77e−15 at 0.5B through 1.33e−14 at 7B, and closed by calling the identity “the one thing here that has never needed a correction.”
It needed one. The check that produced those numbers could not fail: it dropped the term in which μ being the uniform mean does any work, leaving an expression identically equal to the softmax output for any μ at all. Measured on the shipped code, μ = the zero vector gives 0.00e+00. Properly measured the values are 8.0e−15, 1.2e−14, 1.1e−14 and 1.1e−14, and the conclusion is unchanged — but it was not evidenced here. §15 has the correction.
What the re-run buys is not a different verdict but an honest one. The repair is 0.5B-specific because at 0.5B, and only at 0.5B, the best single-site edit supplies more gain than the model's deficit — +9.40 against −6.68. Above it the achievable gain drops to roughly +3 to +4 nats while the deficit does not shrink, so the margin moves in the right direction, by a well-calibrated amount, and stops short. That is a quantitative limit on what one edit at one site can do, which is a far more useful thing to have measured than a formatting failure.
The measurement below stands. The size reading of it does not. A third family, outside the Qwen lineage and pre-registered before the run, puts a checkpoint smaller than either of these two firmly among the non-repairs. The two that repair here are the smallest of their own families, and that turns out to be a coincidence of these two ladders rather than a property of parameter count. Everything below is left as measured; §20 has the correction and the third ladder.
Everything to this point runs on Qwen2.5. So the result — repair at the smallest checkpoint, nothing above it — could equally have been a property of scale or a property of Qwen2.5. Qwen3 at matched sizes separates them.
The pattern replicates in an independently trained family. Three criteria — gain over deficit, margin crossing zero, program passing — agree on all eight checkpoints in both families.
But crossing zero turns out to be necessary, not sufficient, and §16 is where that is established. On these eight edits the three criteria coincide exactly, which invites the reading that enough gain produces a repair. A pre-registered follow-up over 48 executed edits refutes it: eleven crossed zero without repairing.
These are two ladders, not one. Qwen3-0.6B is not the rung after Qwen2.5-0.5B: different training data, different tokenizer merges, a different architecture, a different generation mode. A difference between families at a matched size is not a scale effect, and the cross-family claim here is only that the shape of the result recurs.
| family | deficit | gain | gain/deficit | after | identity | repairs? | |
|---|---|---|---|---|---|---|---|
| Qwen2.5 | 0.5B | 6.68 | +9.40 | 1.41 | +2.72 | 8.0e−15 | yes, 6/6 |
| Qwen2.5 | 1.5B | 7.63 | +3.14 | 0.41 | −4.49 | 1.2e−14 | no |
| Qwen2.5 | 3B | 10.31 | +3.93 | 0.38 | −6.38 | 1.1e−14 | no |
| Qwen2.5 | 7B | 6.89 | +3.88 | 0.56 | −3.01 | 1.1e−14 | no |
| Qwen3 | 0.6B | 3.42 | +4.88 | 1.42 | +1.45 | 3.5e−14 | yes, 6/6 |
| Qwen3 | 1.7B | 23.84 | +13.09 | 0.55 | −10.75 | 8.9e−14 | no |
| Qwen3 | 4B | 32.88 | +16.62 | 0.51 | −16.26 | 3.3e−14 | no |
| Qwen3 | 8B | 30.25 | +15.48 | 0.51 | −14.77 | 3.7e−14 | no |
Qwen3 applies a per-head RMSNorm to the query and key projections before RoPE.
Re-implementing the attention forward without it moves Qwen3-0.6B's logits by 20.08
— and every bank, every score and every identity residual in this package is computed from the
q and k that forward returns. The projection is now one shared function used by all four
re-implemented forwards, applying the norm when the module carries one. head_dim is read
from the module and never derived: at Qwen3-0.6B and 4B it is 128 against a derived 64 and 80.
Qwen3 is hybrid-reasoning. Under its default chat template, Qwen3-0.6B answers this case with
<think>\nOkay, let's see. The user wants me to… and never reaches an
answer inside the token budget. Every contract derived from that would describe reasoning
text, and would look entirely ordinary in the recorded data — a full scaling gradient,
plausible throughout, measuring the wrong thing. All Qwen3 runs use
enable_thinking=False, which closes an empty think block in the prompt itself; the same
model then writes api.lookup(value). Qwen2.5 has no equivalent mode, so this is a real
asymmetry between the ladders rather than a nuisance parameter, and it is recorded on every record.
Unedited and under the no-op control the model writes api.lookup(value) — the
client's own function name — scoring 0/6. After the ranked edit it writes
api.legacy(value), the correct answer, scoring 6/6 once the
api. prefix the model itself uses is stripped. Under the fixture's strict grammar it
scores 0/6, because the grammar rejects that prefix.
The lenient reading was added as an amendment in §12, so that a failure to comply could not masquerade as a failure to repair. Read strictly, this run reports no repair anywhere in Qwen3 and the cross-family replication — the entire point of the exercise — is invisible. The amendment earned itself here.
The identity residual verified nothing. identity_residual dropped the
−e⁻ᵐ/Z term because it multiplies
Σⱼ(vⱼ−μ), which is zero for the uniform mean. That
is correct, and exactly why dropping it was wrong: what remained is identically
Σⱼpⱼvⱼ for any μ, since the probabilities
sum to one. It returned 0.00e+00 for μ set to the zero vector and 1.3e−14 for
random noise. It was verifying float64 associativity. Every per-size identity residual in §12,
§14 and issue #15 was that tautology — and the μ-pinning those figures were cited as
evidence for was never exercised by them. The overflow that motivated dropping the term is removed by
the gauge, not the term: centred scores force
max t ≥ 0, so e⁻ᵐ ≤ 1. Corrected, it
rejects a softmax-weighted mean at 4.5e−01, a zero μ at 5.8e−01 and an arbitrary constant
at 8.4e+01. The values above barely move; what they mean does not survive unchanged. This does not
touch §3 or the secant filings, which form ΔM explicitly and were always real checks.
The study compared two different models. The contract is derived through the model's own forward; every branch is generated through a re-implementation of it. Every other gate in the pipeline compares the re-implementation against itself, so a disagreement was structurally undetectable — a missing Qwen3 query/key norm moves the logits by ~20 and is invisible to all of them. The two are now measured directly and recorded: 0.0 at all eight checkpoints.
Both were introduced by this review, in the code written to make the larger models testable. Both were found by adversarially auditing that code rather than by the tests meant to cover it, which is the same lesson as everything else here, turned around and pointed the other way.
§15's rule rests on eight observations in which crossing zero and repairing coincide exactly. That is the shape of a law, and it is worth trying to break before it is believed. This is the attempt: pre-registered, 48 executed edits, and the rule half breaks.
Crossing zero is necessary and not sufficient. No arm in 48 repaired without crossing. Eleven crossed and did not repair. And nothing measured in this review — not the size of the margin, not where in the prompt the edit lands — predicts which crossings repair.
The plan was to raise the achievable gain with multi-site edits: two sites ought to buy roughly twice the margin, so 7B (needing 1.78×) should flip and 3B (needing 2.62×) should not. The capture already shipped in the repository refutes that at no model cost. At the recorded winning layer the two best sites give +11.3766 against a best singleton of +11.3610 — the second site buys 0.14%. Greedy to eight sites reaches 1.49×.
There is a closed form behind it, verified against the exact scorer to 8.9e−15: for a reweight by f over a site set S, the per-head gain is (f−1)·Wₓ / (1 + (f−1)·Pₓ). The denominator grows with the attended mass of S, so the joint gain is at most the sum of the singletons whenever the weights share a sign — and in the limit it tends to a mass-weighted average bounded by the best single row. Adding sites cannot raise the per-head ceiling. The sub-additivity is structural, not a quirk of this case.
A pilot at 0.5B gave the real question. Greedy multi-site at layer 14 crosses zero at every k from 1 to 8 — after-margins +3.17 to +8.61 — and scores 0/6 every time, while the same sweep at layer 21 seeded on the recorded winner repairs 6/6 at every k. At matched margin one site repairs and the other does not.
The first hypothesis was that repair follows the authoritative source. It was
withdrawn before registration, because this review's own §4 already refutes it: boosting
legacy inside the block the prompt marks not authoritative repairs 6/6. The
hypothesis actually registered was §4's own reading — repair follows the
answer token, wherever it sits. That one survived to measurement and died there.
| arm | after-margin | generated | tests | |
|---|---|---|---|---|
| Qwen2.5-7B | authoritative source | +0.913 | api.current(value) | 0/6 |
| Qwen2.5-7B | instruction prose | +1.334 | legacy(value) | 6/6 |
| Qwen3-0.6B | authoritative source | +2.161 | api.legacy_example_0(…) | 0/6 |
| Qwen3-0.6B | legacy examples | +1.888 | api.legacy_example_0(…) | 0/6 |
| Qwen2.5-0.5B | instruction prose | +4.891 | api.current(value).upper() | 0/6 |
The necessary half, and more strongly than before: 48 of 48. Sixteen arms crossed zero, five repaired, and every repair had a positive after-margin. No arm anywhere repaired without crossing. §15 established that on eight single-site observations; it now rests on 48 executed edits across two families and six regions of the prompt.
Arms were selected by predicted gain, and predicted gain is a poor selector in the
multi-site regime: its rank correlation with executed gain is 0.418 for pairs
against 0.779 for singletons, missing badly in both directions. So “the
target arm did not cross at 7B” was a fact about a proxy-guided search rather than about that
region. §19 tested that and closed it: putting the measurement inside the
search loop finds better sets in every arm and changes no verdict, so the proxy was weak and was not
the binding constraint. The claim about the 7B target arm remains untested there,
not supported. Two further gaps surfaced while auditing the design, both
previously unrecorded: execute_candidate returned a prediction error that nothing in
the package ever thresholded, and the gate that does raise compares the scorer against native attention
at the same layer — exact by construction, so it always passes and cannot see
downstream linearisation error, which is 17% on the recorded singleton. Both are now closed: a
sign-flipped prediction on the recorded winner still yields verified=True from
the layer-local audit, and is refused by a downstream gate whose threshold was calibrated from 75
executed candidates rather than chosen — sign conflict above a floor that 0 of 35 comparable
candidates trip.
The pre-registration is the point. The first prediction was wrong and the capture said so before any model ran; the second was refuted by its own prior evidence and withdrawn before it was committed; the third was registered, measured, and falsified. Three accounts of what makes an attention edit work, and the data disposed of all three. What survives is the negative statement this review keeps arriving at from different directions: the first-distinct-token margin is not the quantity that decides what the model writes — necessary, never sufficient, and still not understood.
Every finding to this point is a negative. This one is not, and it is the only result in the review that holds at every scale tested.
The ranking does specific, causal work at every checkpoint — including the six where the repair never happens. 640 edits executed. Random edits of identical family and magnitude move the margin by a median within ±0.013 everywhere; ranked edits move it by +1.4 to +9.7. 480 random edits produced zero repairs.
| deficit | ranked | random | ranked median | random median | ranked max | random max | |
|---|---|---|---|---|---|---|---|
| Qwen2.5-0.5B | 6.68 | 6/20 | 0/60 | +6.549 | +0.000 | +9.856 | +4.245 |
| Qwen2.5-1.5B | 7.63 | 0/20 | 0/60 | +1.394 | −0.001 | +3.638 | +0.730 |
| Qwen2.5-3B | 10.31 | 0/20 | 0/60 | +3.273 | −0.000 | +4.930 | +1.840 |
| Qwen2.5-7B | 6.89 | 0/20 | 0/60 | +3.550 | +0.005 | +4.128 | +1.226 |
| Qwen3-0.6B | 3.42 | 2/20 | 0/60 | +3.409 | +0.001 | +6.045 | +1.095 |
| Qwen3-1.7B | 23.84 | 0/20 | 0/60 | +6.693 | +0.013 | +19.644 | +4.099 |
| Qwen3-4B | 32.88 | 0/20 | 0/60 | +9.702 | −0.004 | +34.084 | +4.282 |
| Qwen3-8B | 30.25 | 0/20 | 0/60 | +9.253 | −0.013 | +15.479 | +1.557 |
This separates two claims the scaling result had left entangled. The repair fails above the smallest checkpoint of each family. The ranking does not: it finds real causal sites everywhere, and what fails above 0.5B is the ability of any single site to supply enough gain to cross the deficit — which §15 measured and §16 showed is structurally capped.
The 0.5B battery was re-run through the new code and required to reproduce the recorded result
before anything else was measured. It does, exactly: 6/20 against 0/60, median +6.549, max +9.856,
Fisher p = 1.29×10⁻⁴. The first version returned 3/20 — it
ranked only the reweight ×64 family, where the recorded battery ranks over all
fifteen templates, and restricting the family silently selects a different top-20. The error was
visible only because 0.5B had a known answer. Run first at a scale with no recorded result,
it would have produced a plausible number and no way to catch it.
At six checkpoints neither arm repairs, so Fisher returns p = 1 there. That is construction, not evidence against the ranking, and the protocol said so before the run: the repair-based test is informative at two checkpoints, the margin comparison at all eight.
Eight checkpoints across two families are eight points on one synthetic fixture. That has been the most criticisable thing in this review throughout. This varies the axis that had been pinned at n=1 from the beginning.
The necessary condition is not a property of the fixture. “Crossing zero is necessary for repair” stood at 48/48 plus 640 edits, all on one case. It now holds across 29 distinct cases, 6 name pairs and 3 checkpoints, with zero violations. And sufficiency fails harder here: 29 of 32 crossings did not repair.
| eligible | solved by a control | refused | repairs | crossed zero | |
|---|---|---|---|---|---|
| Qwen2.5-0.5B | 12 | 48 | 0 | 1 | 9 |
| Qwen3-0.6B | 19 | 41 | 0 | 2 | 17 |
| Qwen2.5-1.5B | 22 | 32 | 6 | 0 | 6 |
| total | 53 | 121 | 6 | 3 | 32 |
Every one of the 121 ineligible runs was solved by the same control —
definition emphasis, pointing at the correct definition — and not one by ordinary
generation or by full-source emphasis. That reproduces the central finding of the generator work on
a population with six name pairs instead of two, and it holds at indirection 2, where the body is
return _apply(value, _SELECTOR) and the behaviour is genuinely non-local.
Composition still defeats it: all 36 of 36 compose runs were eligible, against 17
of 144 single-call, because no single call passes and a prompt naming one function has nothing to
name.
Three repairs, 3 of 53 — a 5.7% top-1 rate. One is the generator study's own headline case, reproducing under a corrected prompt. Two are new: single-call cases at indirection 1 and 2 on a name pair that had never been built before this study, repaired on a checkpoint from the other family. This is a top-1 rate — one candidate executed per case — and is never placed beside the recorded 6/20 or the 1-in-10 anecdote, which are different quantities.
Parameters that never reached the files. Body opacity is selected only at indirection 0; deeper levels delegate and ignore it, and a compose case takes neither it nor the depth. The metadata echoed whatever was requested anyway, so cases differing only in an inert parameter were byte-identical under a shared name. The enumerator advertised 52 configurations containing 28 distinct cases; the generator study's own 48-case space contains 24, with eight of them counted four times each.
Compose prompts forbade their own answer. A compose case is validated to have no single-call solution, so its only answer is nested — but the prompt demanded “the form function_name(value)” and never said a nested expression was allowed. Every control arm was asked for something the prompt forbade, which made “no prompt solved it” true by construction. This is §4's finding against the upstream repository, reproduced in the generator written to test for it. Re-measured with the permission restored, the conclusion survives — source-pointing prompts still fail, naming the answer still succeeds — but the measurement was invalid as posed.
A declared objective that fails its own checks, and a lenient reading that switched itself off: the second reading was gated on a prefix derived from the model's unaided output while the branch being scored is the edited one, so a model that answers bare disabled it entirely — measured, that was the whole 0.5B arm.
§16's conclusions came with a caveat: its arms were chosen by a predicted quantity whose rank correlation with the executed one is 0.418. So “the arm did not cross” might have been a fact about a weak search rather than about the model. That caveat had never been tested. This tests it.
The proxy was weak, and it was not the binding constraint. Putting the measurement inside the search loop — executing every candidate rather than scoring it — finds better sets in all three arms and changes no verdict. The ceilings were genuinely out of reach, not merely out of the proxy's reach.
| arm | deficit | proxy-guided | executed-guided | gain | still short by | |
|---|---|---|---|---|---|---|
| Qwen2.5-3B | non_target | 10.31 | +8.575 | +9.449 | +0.874 | 0.866 |
| Qwen2.5-7B | target | 6.89 | +4.714 | +4.787 | +0.072 | 2.101 |
| Qwen2.5-7B | legacy | 6.89 | +5.285 | +5.666 | +0.381 | 1.222 |
So §16's verdicts stand as recorded, and a stated caveat becomes a measured one. The 7B
target arm still does not cross, so §16's own claim about it remains
untested there — reported as untested rather than as supported, which the
protocol required in advance.
| sites | executed | added by the last site |
|---|---|---|
| 1 | +3.881 | — |
| 2 | +4.773 | +0.892 |
| 3 | +4.782 | +0.010 |
| 4 | +4.786 | +0.004 |
| 5 | +4.787 | +0.000 |
Both ladders in §15 are Qwen — one lab, related tokenizers, overlapping
corpora. That was the largest remaining qualification on “the repair reproduces at the smallest
checkpoint and nowhere above it”, and no further Qwen checkpoint could reduce it. SmolLM2 is a
different lab, corpus and tokenizer, on the llama architecture. The prediction that
went with it was registered, in writing, before the run.
P5 — “at least one checkpoint below 1B repairs” — is false. SmolLM2-360M is smaller than every checkpoint this review has ever measured: 0.72× Qwen2.5-0.5B, 0.6× Qwen3-0.6B. It does not repair, and its gain/deficit of 0.47 is not near the 1.41 and 1.42 of the two that do. It lands between Qwen2.5-3B and Qwen3-4B.
So “the smallest models repair” was reading a coincidence of two Qwen ladders as a property of parameter count. What survives is narrower and still holds at ten checkpoints: the gain has to exceed the deficit, and whether a model of a given size manages that is not predicted by its size.
| family | deficit | gain | gain/deficit | after | identity | repairs? | |
|---|---|---|---|---|---|---|---|
| SmolLM2 | 135M | — | — | — | — | — | contract refused |
| SmolLM2 | 360M | 5.62 | +2.62 | 0.47 | −3.01 | 9.8e−15 | no |
| SmolLM2 | 1.7B | 4.27 | +2.43 | 0.57 | −1.84 | 9.5e−15 | no |
nala.contract declined to derive an objective: at the position where the model
diverges, the two candidate answers hold 0.165 of the probability against the 0.25
it requires. A margin over tokens the model is not choosing between can move without changing what it
writes — which is precisely the defect §14 found in the fixture's own hand-written
objective, caught in advance this time rather than after publication.
It is recorded as untestable, not as a checkpoint that failed to repair. The protocol
pre-specified that distinction because 135M was the checkpoint most likely to need it, and it
pre-specified the floor too: two of three eligible is exactly the minimum for reading this
ladder's shape at all. Three points, one refused.
The ranking's chosen site is ' legacy' in the authoritative source at
every measured checkpoint in all three families, with reweight ×64
the winning template every time, at relative depths from 0.68 to 0.94. At SmolLM2 it is row
145 rather than 79 — the same token at a different index, because the tokenizer
is different. That now spans GQA ratios from 14:2 to 32:8, head dims of 64 and 128, 24 to 36 layers,
three tokenizers and two architectures.
The repair still does not: two of ten. Which is the finding this review has held since §12, now measured on a family that shares nothing with the recorded case's model but the transformer.
§07 records that every GQA fixture in the 107-test suite pins the ratio at 4:2, so plain
multi-head attention — num_key_value_heads == num_attention_heads, where
the head-to-group mapping degenerates — is never built and an off-by-one there would pass CI.
SmolLM2-1.7B is exactly that case: 32 heads, 32 key/value heads, one group. It executes, and
paths_agree reads 0.0. PR #19 had already covered MQA and MHA with synthetic
fixtures; this is the first time the degenerate mapping has run against a real checkpoint
rather than a constructed one.
P1 held, and thinly. Nothing repaired anywhere in SmolLM2, so “no repair without crossing zero” could not have been violated here. Two more non-violations, not two more confirmations, and it is recorded that way. P4 — the three criteria agreeing — held 2/2 in the all-three-say-no direction only: no SmolLM2 checkpoint had gain above deficit, so the positive direction was never exercised.
Three checkpoints, one of them refused, one synthetic fixture, single-site edits, CPU fp32, greedy. The sizes are not matched to the Qwen ladders — only 1.7B has a near-match — so this is a third ladder read on its own, and a difference from Qwen at “a similar size” is not a scale effect.
NaLa is real instrumentation. The engine is correct, the numerical gates are enforced rather than decorative, the adapter genuinely edits a live forward pass and verifies itself against it, and the whole thing runs in ten seconds on a laptop with no network. The secant identity is exact, elegant, and — contrary to the obvious objection — not a tautology. I could not find a mathematical defect, and neither could eleven independent reviewers working in parallel.
Two findings run strongly in the method's favour, and both were things I doubted before measuring. The ranking beats chance decisively, and §17 shows it does so at every scale tested: over 640 executed edits, 480 magnitude-matched random ones produced zero repairs, and random edits moved the margin by a median within ±0.013 at every one of eight checkpoints while ranked edits moved it by +1.4 to +9.7. That is the one result here that is both positive and general. And the site it selects is the same token at seven of eight checkpoints across two independently trained model families — all four Qwen3 sizes and three of four Qwen2.5 — over GQA ratios from 14:2 to 32:8, head dims of 64 and 128, and 24 to 36 layers, always deep in the network. Whatever the ranking is doing, it is specific, causal, not a small-model accident, and not an artefact of one tokenizer.
The gap is between that instrument and the claims made for it. Three README sentences do not survive contact with the repository's own code and data: a prompt does fix the case, first-order does rank the same candidate first, and the negative case has no evidence at all. The success denominator is 1 in 10, not 1 in 107. Boosting a token the prompt explicitly marks as non-authoritative repairs the program just as well as boosting the correct definition. And the repair reproduces at only two of ten checkpoints across three families. §15 measures what separates them — gain over deficit, 1.41 and 1.42 for the two that work against 0.38 to 0.57 for the eight that do not — §20 shows that it is not size, with a 360M model sitting among the large ones, and §16 shows the quantity is necessary but not sufficient: an edit can carry the margin across zero and still write the wrong program, and nothing measured here predicts which crossings repair. So the diagnostic story, the part that would make this important, remains the part that is least supported.
What is striking is that the disconfirming evidence is almost all in the authors' own artifacts — the frozen-reuse table, the gauge family, the search history, the ranking's own top-20. That is what careful work looks like. The recommendation is not to claim less; it is to claim the things the data actually supports, several of which are stronger and more interesting than what is currently on the front page. The random-edit control and the cross-scale stability of the selected site are both better evidence than the single anecdote they sit behind — and the recurring lesson underneath every negative result here is the same one: the first-distinct-token logit margin is not the quantity that decides what the model writes.
All of the above was submitted to the authors on 10 Sep 2026 — code fixes as a pull request, the empirical findings as issues, because how the work is framed is the authors' call and not a defect to be patched unilaterally.
Roughly forty minutes later, leochlon/nala stopped resolving. The
repository returns 404, this fork's parent link has detached, and the pull request and all five
nala issues are unreachable with it. The owner's account is active and their other 24 repositories
are unaffected — leochlon/secant is untouched and its issue is still open. No repository
of that name exists under the account, so this was a removal or a switch to private, not a rename.
I have no information about why, and the sequence is not evidence of a cause.
Nothing has been re-filed upstream. The work is retained as issues and a pull request against the fork itself, which has been made private out of deference to the takedown; the secant issue, on a repository that is unaffected, is left up.
| Artifact | Subject | Upstream | Retained |
|---|---|---|---|
| Prompt control | A prompt does repair the case — emphasis='definition' scores 6/6. | gone | #1 |
| Ranks 2/5/9 | A non-authoritative occurrence of legacy also repairs 6/6. Corrected: its perturbation hypothesis is refuted by #6. | gone | #2 |
| Linearisation | First-order ranks the same top candidate at ×64. Its magnitude claim survives; its selection claim is settled by #10. | gone | #3 |
| Documentation | The eligible success rate is 1/10; three README figures need reconciling. | gone | #4 |
| Calibration | Predicted-vs-executed over 75 executed candidates, r = 0.97, with the data. | gone | #5 |
| Control battery | Ranked 6/20 vs random 0/60, p = 1.3×10⁻⁴. The ranking beats chance decisively. | n/a | #6 |
| Tier-2 sweep | T6–T10 under a frozen protocol. 0/24 eligible; emphasis='definition' solves 32/32. | n/a | #8 |
| Hard-case generator | 18/18 compose cases defeat every source-pointing prompt; one repair no prompt could produce; T9 answered. | n/a | #10 |
| Tier-2/3 completion | T9 at n=18 (site agreement 13/18, correcting #10); D5 gain peaks at ×256 above the cap; D4 7,272 distinct sites. | n/a | #11 |
| Code — five fixes | The emphasis='body' bug (+3 regression tests), exception exports, the self-contradicting scope string, the bank copy in Scorer.changes(), and CI. | gone | PR #7 merged |
| Code — generator | nala/hardcase.py and its eight tests, generating cases no source-pointing prompt solves. | n/a | PR #9 merged |
| Code — Tier 1 | The 24-layer capture (7.9 MB) and the search history, the attempt-funnel figure, six README claims corrected against measurement, and a tie-exact O(N) top-k. | gone | PR #12 merged |
| Code — GQA and case collisions | Both GQA edges covered against an independently written mapping, since the dense oracle shares the code under test; case-colliding tracked paths refused before any hashing. Suite 118 → 124. | gone | PR #13 merged |
| Code — last two defects | The plain generation path gated on the transformers pin it already depended on, the norm coordinate spaces labelled on both families so a budget figure cannot be read in the wrong space, and the attribution-patching and fast-weight lineage cited. | gone | PR #14 merged |
| Model scaling | 0.5B→7B on the same fixture. The winning site is the same token at every scale; the repair reproduces only at 0.5B. Identity holds at ~1e−14 throughout. | n/a | #15 |
| Code — contracts | Per-model response format and objective derived from the model and verified, with the shared study harness. Decision mass 0.84–0.99 against 8.3e−5. Suite 126 → 147. | n/a | PR #16 merged |
| Scaling, re-run | 0.5B→7B through the derived contracts. Decision mass 0.84–0.99 at every size; only 0.5B crosses zero and only 0.5B repairs. Corrects two §12 figures. | n/a | PR #17 merged |
| Code — second family | Qwen3 0.6B→8B at matched sizes. The pattern replicates: gain over deficit separates repair from no-repair on all eight checkpoints. Adds the Qwen3 projection path, a real identity check replacing a tautological one, and a native-vs-re-implemented cross-check. Suite 147 → 158. | n/a | PR #18 merged |
| Code — GQA and README | The head-to-group mapping covered at all six production ratios plus MQA and MHA, the NumPy and torch implementations checked against each other and against repeat_kv, and the real edit path run at those ratios. Mutation-tested. README opening reconciled with the retraction forty lines below it. Suite 158 → 168. | n/a | PR #19 merged |
| Multi-site, pre-registered | 48 executed edits against predictions frozen before any run. Crossing zero is necessary (48/48) and not sufficient (11 crossings, no repair). Multi-site gain is structurally capped: the second site buys 0.14%. | n/a | PR #20 merged |
| Code — prediction gate | The prediction_error that was written and never read is now gated. The pre-existing audit compares the scorer against native attention at the edited layer, where the algebra is exact by construction: a sign-flipped prediction still reports verified=True. Threshold calibrated from 75 executed candidates, not chosen. Suite 189 → 201. | n/a | PR #21 merged |
| Ranking vs chance, at scale | 640 executed edits over eight checkpoints. 480 magnitude-matched random edits, zero repairs. The ranking does causal work at every scale, including where the repair never happens. | n/a | PR #22 merged |
| Case variation | 60 cases over 12 decisions, 3 checkpoints. The necessary condition holds across 29 distinct cases; sufficiency fails in 29 of 32 crossings. Four generator defects found and fixed, and issue #10 corrected. | n/a | PR #23 merged |
| Executed-guided search | The proxy that bounded §16 was weak and not the binding constraint: direct measurement buys +0.07 to +0.87 nats and changes no verdict. | n/a | PR #24 merged |
| Scope documents | Both still said “No Qwen3 adapter” long after it shipped, and FAMILIES.md never documented head_dim: deriving it is correct at two Qwen3 sizes, raises at a third, and at 0.6B silently returns 32 heads of 64 instead of 16 of 128. | n/a | PR #25 merged |
| Code — third family | llama added to the dispatch. The blocker was one absent attribute: LlamaAttention has no sliding_window where Qwen always sets one, so four call sites raised. paths_agree 0.0 at all three SmolLM2 checkpoints, including multi-head at 32:32. Six stale family lists derived from the tuple. Suite 216 → 221. | n/a | PR #26 merged |
| Third family, pre-registered | P5 falsified. SmolLM2-360M is smaller than any checkpoint measured here and does not repair, at gain/deficit 0.47 — among the large models. Size is not the variable. The winning site holds at ten of ten across three tokenizers; 135M’s contract was refused, not failed. | n/a | PR #27 merged |
| Secant identity | Verified to 7.88e−14 on the paper's own model and layer; the descent figure corrected from 56% to 11% in the paper's favour, and the issue title corrected to match, since it carried the retracted figure. | issue #1 | — |
| Secant — capture | 1 MB reference capture at layer 23 of base Qwen2.5-0.5B plus a NumPy-only verification script: identity, gradient and gauge freedom in one command. | PR #2 open | — |