NaLa Under Replication
Independent replication·leochlon/nala @ d4ca882· leochlon/secant @ 4245ceb·10 Sep 2026

NaLa Under Replication

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.

Qwen2.5-0.5B-Instruct @7ae5576 · fp32 eager · macOS arm64, torch 2.14.0, transformers 4.57.3 · CPU
107/107
tests pass, 0 skipped
1e−14
identity error, real model
r = 0.97
new calibration, n=75
1 / 10
true success denominator
3
headline claims falsified
2 of 10
repair: not predicted by size
01

What this is

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.

Method

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.

02

The reproduction ledger

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.

ClaimRepo statesI measuredVerdict
Full test suite, no downloads107 pass107 pass, 0 skip, 9.8 sreproduced
Candidate count109,080303 × 24 × 15 = 109,080exact
Baseline logit margin−6.683786−6.683828reproduced
Top-ranked predicted gain+11.360970+11.3609637 s.f.
Executed margin gain+9.398861+9.3989exact
Winning interventionL21 row 79 ×64L21 row 79 ×64rank 1
Generated programlegacy(current(value))legacy(current(value))identical
Fixed check6/66/6reproduced
Ordinary / emphasis / no-op controls0 / 1 / 0 of 60 / 1 / 0 of 6reproduced
Secant identity, synthetic~1e−30 (f64)2.2e−16 max absexact
Secant identity, live Qwen2.5—6.4e−14, all 336 headsexact
"0.35 seconds"0.35 s0.349 s scoring + 2.078 s capture
"107 attempts shipped in the repo"1071 attempt + a 2 KB tallynot shipped
Negative stale-document case−4.26 → −1.47absent from both reposunverifiable
Recorded values from nala/data/repair_case.json and the evidence capsule embedded in notebooks/nala_real_repair_colab.ipynb. Mine from a fresh capture, different OS, different torch build.

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.

03

The identity is real. "Gradient step" is exact about the gradient.

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.

Verifiedμ must be the uniform mean, and that is what does the work

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 choice2.2e−161.1e−16
Softmax-weighted mean3.662.6e−01
Zero vector4.002.9e−01
Arbitrary constant22.91.6e+00
μ is pinned, not fitted. The identity is a constraint, not a definition — so it is substantive.

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.

Whether the step descends is contingent, not guaranteed

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

A correction to my own figure

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.

ConfigurationE(ΔM) > E(0)λmax(H)
layer 23, base model — the paper's own setting3 of 28 — 11%median 0.51
layer 23, Instruct1 of 14 — 7%median 0.47
all 24 layers pooled — what I originally reported188 of 336 — 56%—
layer 013 of 146.55
layer 410 of 1421.41
layers 16 and abovenear zero< 1
The 56% is driven almost entirely by early layers. On the layer the paper actually studies the unit step descends in roughly nine heads in ten.

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.

Verified on the paper's own configuration

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 configurationResult
max │ydirect − (μ + qTΔM)│7.88e−14
max │⟨∇E(0) + ΔM, u⟩│, random directions6.75e−12
gauge freedom, κ ∈ {0, 1, 2, −3}all reproduce y to ~1e−14
NumPy only, no model, no network. The gauge row makes the paper's own eq. gauge concrete: κ = 1 is a choice, not a necessity. Shipped as a 1 MB capture plus a verification script in secant#2.

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 fair statement

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.

04

The headline repair, re-examined

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.

FalsifiedA prompt does fix it — using the repo's own emphasis mode README "It repaired a program that no prompt could" · case_study.py:138

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 armGeneratedTestsNote
A. Ordinary (recorded baseline)lookup(value)0/6matches recorded
B. full_source emphasis (recorded control)current(value)matches recorded
C. definition emphasis — never runlegacy(value)6/6the missing control
D. Name the target outrightlegacy(value)6/6upper bound
E. Semantic hint, no namelookup(value)0/6task is genuinely hard
F. Chain-of-thought nudgelookup(value)0/6task is genuinely hard
G1. Point at the wrong definitioncurrent(value)pointing is causal
G3. Irrelevant appended textlookup(value)0/6not a length artifact
Greedy, temperature 0, identical protocol, every arm run twice — fully deterministic. Arms A and B reproduce the recorded branches exactly, which validates the harness. G1 and G3 are controls on arm C: pointing steers the model to whichever definition you point at, and appended text alone does nothing.

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.

FalsifiedBoosting a token the prompt marks "not authoritative" repairs it just as well executed: L21 row 132 ×64

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 interventionRegion of the promptΔmarginGeneratedTests
Baseline — no edit—+0.0000lookup(value)0/6
No-op, L21 r79 ×1.0authoritative api.py+0.0000lookup(value)0/6
Rank 1 — L21 r79 ×64 ' legacy'authoritative api.py+9.3989legacy(current(value))6/6
Rank 2 — L14 r288 ×64 ' expression'+9.8562api.current(value).tri…malformed
Rank 5 — L21 r132 ×64 'legacy'non-authoritative history+8.1121legacy(current(value))6/6
Rank 9 — L21 r122 ×64 'legacy'non-authoritative history+6.4177lookup(value)0/6
L21 r142 ×64 'legacy'non-authoritative history+1.3601lookup(value)0/6
L21 r129 ×64 '.current'non-authoritative history−0.0176lookup(value)0/6
Every row natively verified against the adapter's own numerical gates. Rank 2 attains the largest executed margin gain of all and produces an answer that violates the response grammar — the margin objective is satisfiable without solving the task.
Ranking vindicatedThe random-edit control: 6/20 ranked vs 0/60 random executed battery, n=80

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.

ArmnPassed 6/6Median ΔmarginMax ΔmarginΔ > +5
Ranked top-20 (the method)206 — 30.0%+6.549+9.85614/20
Random ×64, all layers400 — 0.0%−0.003+1.7250/40
Random ×64, layer 21 only200 — 0.0%+0.001+0.2200/20
Fisher exact, ranked vs pooled random: p = 1.3×10⁻⁴. Random edits of identical family and magnitude do essentially nothing to the margin — the 5th–95th percentile spread is [−0.32, +0.32], and not one of 60 exceeded +5, against 14 of 20 ranked. The layer-21-restricted arm is also 0/20, so this is not "layer 21 is special": the ranking is selecting the right token.
A correction to my own reading

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

Overstated"6/6 tests" is one bit of evidence, measured six times

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.

OverstatedThe denominator is 1 in 10, not 1 in 107 README:70 · docs/REPAIR_CASE.md:88

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 studiesCasesReaches an attention edit?
A control already solved the task85no — task too easy
Controls not both valid test failures11no — invalid fixture
Both controls failed, ranked edit did not pass9
Both controls failed, ranked edit passed1yes — the headline
Total attempts started107eligible: 10
Tallied from SEARCH_HISTORY.json. "107 attempts" is task-construction attempts, 82% of which never tested the method at all. README:70 also says these are "shipped in the repo"; REPAIR_CASE.md:98 says the archive is a separate deliverable. Only one attempt ships.
05

New evidence, in the method's favour

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.

the headline edit -8-40+4+8+12 -8-40+4+8+12 PREDICTED MARGIN GAIN EXECUTED
75 candidates, each natively executed on Qwen2.5-0.5B. Pearson r = 0.9696, Spearman r = 0.9793, sign agreement 97.3%, median absolute error 0.24. Dashed line is executed = predicted. Larger marks are |predicted| > 4. The frozen-gradient contraction is well calibrated in the middle of the range and systematically over-confident at both extremes — executed/predicted averages 0.876, and the worst case is a candidate predicted at −7.25 that executed at −3.99.

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

06

The linearisation claim, corrected

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 magnitudeSpearmanTop-1Top-10Top-100Rank of exact's #1
×20.9977100%100%95%1
×80.9906100%80%81%1
×320.9681100%80%68%1
×64 — the headline magnitude0.9485100%80%1
All templates pooled0.9678100%80%53%1
Exact finite scoring vs. a first-order (attribution-patching style) score computed from the same capture, holding the downstream gradient frozen identically in both.
Falsified as statedFirst-order ranks the same candidate first, at every magnitude

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.

The stronger true claim they could make instead

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.

07

Code and documentation defects

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.

SevFindingLocation
HighCase-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
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
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
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
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
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
nala.UserError and nala.VerificationError — raised by every input-validation path in the documented workflow — are not exported from the package.__init__.py:8
LowEvery ranking report hardcodes 'scope': 'one layer…' while candidate_count arithmetically spans all 24. The report contradicts itself.search.py:86
Lowgenerate_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
LowNorm 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
Six of these ten are now fixed in the fork — the emphasis='body' bug, the exception exports, the scope string and the bank copy in PR #7; the GQA hole and the case-collision guard in PR #13. The argv record stays open by choice, since redacting would weaken the audit trail the report exists to provide; the version gate and the norm-space reporting are small leftovers. The GQA finding proved sharper than filed, twice. First, the dense oracle consumes bank.groups itself, so a head-grouping bug would be shared by the oracle and the code under test — two of three mutation probes passed all 118 tests before PR #13. Then PR #13's coverage turned out to stop at the edges: no fixture ran at a ratio any published number was produced at (Qwen2.5 runs at 7, 6, 8 and 7; Qwen3 at 2, 2, 4 and 4), and the mapping had two implementations — NumPy for the scores, torch for the edit — that nothing compared. PR #19 closed both. Swapping the torch expression for a wrong one leaves the old tests green and trips the package's own N4 gate under the new ones. Eight further findings were refuted by adversarial verification and discarded — including a prior-art claim that NaLa fails to cite attribution patching, which the completeness critic disproved by opening paper.tex, a 1930-line file no other reviewer read: it has a subsection titled "Attribution patching and exact joint responses" citing Syed et al. and Kramár et al.

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.

08

What to do next

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.

Tier 1 — doneshipped in PR #12; see §11
T1
Ship the full 24-layer capture.npz

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

T2
Fix six specific claims in the README

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

T3
Publish the 107-attempt funnel as a figure

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.

T4
Two measured hot-path fixes

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.

T5
Add CI

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.

Tier 2 — doneexecuted; see §9 and §11
T6
The adversarial control battery done

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.

T7
Rerun the case with 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.

T8
Report the legacy-vs-current margin

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

T9
Head-to-head against attribution patching

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.

T10
Exhaust the existing 24-case catalog under one frozen protocol

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.

Tier 3 — doneexecuted; see §5, §6 and §11
D1
Predicted-vs-executed calibration curve done

§5. n=75, r=0.97. Extend to several hundred and stratify by edit family; publish the error band. This belongs in the paper.

D2
Exact vs. linearised re-ranking done

§6. All 109,080 candidates, all 24 layers. The per-layer disagreement (18/24) and the 5× magnitude error are the publishable findings.

D3
Score distribution and token classification done

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

D4
Distinct-site count, not template count

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.

D5
Escape the ×64 boundary

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.

Not worth it
—
A batched-einsum rewrite of the scorer, 128k/7B memory engineering, or further re-verification of the identity

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.

09

Tier 2, executed

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.

ItemVerdict
T6Adversarial control batteryproven — ranked 6/20 vs random 0/60, p = 1.3×10⁻⁴
T7Does it depend on api_style?answered — needs composed and adversarial naming, jointly
T8The legacy-vs-current marginanswered — the recorded objective is the wrong yardstick
T9Exact vs linearized, head to head
T10Frozen sweep of the 24-case cataloganswered — 0/24 eligible
32 cases: the 24 shipped catalog cases pre-registered, plus a declared 2×2 follow-up after the sweep returned nothing eligible.

The ranking is rarely reached

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.

T8: a control can satisfy the objective and still fail

Branchargmaxlegacy − lookuplegacy − currentTests
ordinary, no editlookup−6.6838−1.23800/6
ordinary + the ×64 editlegacy+2.7151+6.96236/6
full_source emphasis, no editcurrent−1.47971/6
The third row is the point. The prompt control moves the recorded objective by +12.53 — a larger swing than the attention edit's +9.40 — and still writes the wrong call. The deciding quantity is legacy − current, which goes −1.24 → +6.96 under the edit and is recorded nowhere. The edit's real achievement is +8.20 against a meaningful competitor, not +9.40 against a parroting artifact.

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.

10

A generator for cases prompting cannot solve

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.

What does not work: indirection

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.

What works: remove the thing to name

If the answer is an ordered pair of calls and no single call passes, there is no function a prompt can name.

Prompt arm48 single-call cases18 compose cases
ordinary generation0/480/18
definition emphasis48/480/18
full-source emphasis—0/18
naming the answer outright
Passing the fixed six-test check. Every compose case defeats all three source-pointing prompts; eight of eighteen defeat naming the answer as well. Each generated case self-validates — exactly one winning ordered pair, no single-call winner — and is refused rather than shipped if invalid.

A repair no prompt could produce

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.

T9, answered

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.

11

Tier 3, and the last Tier-2 gap

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.

T9 at full strength — and a correction

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

BatchnSame siteSame outcome
conflict names, direct objective99/99/9
neutral names, shared-prefix conditioning99/9
pooled1818/18
The forced shared prefix hands the model the common token; none of the nine repaired (all 2/6, a single call where the compose answer needs a pair). The head-to-head is valid, but it compares two scorers that both failed.
Correcting §10

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

D5: the ×64 cap sits below the optimum

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:

factorpredictedexecutedp(row 79)tests
16+7.6565+6.72430.22836/6
64 — shipped cap+11.3610+9.39890.39066/6
128+12.4411+10.25650.47286/6
256+12.9562+10.81240.55206/6
1024+12.1517+10.70540.69426/6
4096+10.0024+9.30690.79516/6
65536+8.2913+7.98250.87466/6
1048576+8.5416+7.97060.93936/6
Predicted and executed gain both peak at ×256, not ×64 — an executed +10.81 against the reported +9.40, about 15% better, and excluded by the cap.

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.

D4: the search space is smaller than 109,080

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.

12

Does it survive scale?

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 finding

The site generalises. The repair does not. Every scale independently selects the same token, and only 0.5B flips.

layersH/Gordinarydefinitionfull-sourceranked editno-op
0.5B2414/20/66/66/60/6
1.5B2812/20/60/60/60/60/6
3B3616/20/60/60/6
7B2828/40/61/6
The same fixture, the same six fixed tests, one decoding path throughout. None of the four writes a passing call unaided, so the task is not simply outgrown — the failure mode changes instead: 0.5B parrots the client function's own name lookup, while every larger model makes a real but wrong API choice.

The site is stable to a degree I did not expect

winnerrelative depthpredictedexecuted
0.5BL21/24 row 79 ×640.875+11.36+9.40
1.5BL26/28 row 79 ×640.929+11.22+8.03
3BL33/36 row 79 ×320.917+18.58
7BL22/28 row 79 ×640.786+7.89+7.64
Row 79 is the token ' legacy' in the authoritative source. The same token is chosen across four checkpoints, three GQA ratios and 24–36 layers, always in the deep quarter of the network. Calibration degrades unevenly rather than monotonically: 7B is tight, 3B overshoots by 70%.

Why it stops working: the margin decouples from the output

Under the legacy-vs-current objective — the competitor the model actually offers, per §11:

baselineexecuted changeafterflips the answer?
0.5B−1.238+8.200+6.962yes
1.5B+7.039no
3B−8.766+9.782no
7B−6.888+3.881−3.007no
At 1.5B the margin is already positive before the edit and reaches +8.59 after it, and the model writes current(value) throughout. At 3B it crosses zero and nothing moves. Only at 7B does the margin fail to cross, which is the single case where not flipping is consistent with the objective.

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.

The mathematics is scale-independent

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.

Two errors of mine, both caught mid-study

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.

13

Making the larger models testable

§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 unaidedfixture grammarobjective mass at the decision
0.5Blookup(value)accepts
1.5Bapi.current(value)rejects8.3×10⁻⁵
3Bapi.current(value)rejects2.0×10⁻⁴
7Bcurrent(value)accepts0.84
Two independent failures. The grammar rejected 1.5B and 3B on format — and rejected the controls identically, so a failure to repair could not be told from a failure to comply. And the objective was measured where the model was not choosing.

Derive both from the model, not the fixture

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.

preferavoiddecision massone-tokenfull-answer
0.5Blegacylookup0.9890−6.684−9.741
1.5B..current0.9855−7.628−7.830
3B..current0.9515−10.315−10.453
7Blegacycurrent0.8407−6.887−6.635
0.84–0.99, against 8.3×10⁻⁵ under the fixture's own objective at 1.5B. The 1.5B and 3B rows are the tokenisation asymmetry made explicit: .current and .lookup are single merged tokens and .legacy is not, so the real decision is a bare . against a merged .current — something no hand-written pair of names can express.

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.

The harness itself needed the same treatment

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.

An objection I could not reproduce

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.

14

The sweep, re-run

§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 finding

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.

First: was the model asked the right question?

Until this reads yes, no margin measured underneath it means anything — which is what made §12 unreadable at 1.5B and 3B.

refusal floor 0.25 0.5B0.989 1.5B0.985 3B0.952 7B0.841 1e-51e-41e-31e-21e-11e0 MASS HELD BY THE COMPARED PAIR, WHERE THE MODEL DECIDES fixture objectivederived from the model
The fixture's hand-written pair against the pair derived from each model, at the position where that model actually decides. The fixture objective falls below the 0.25 refusal floor at three of four sizes and by four orders of magnitude at 1.5B; every derived objective clears it. At 7B the two coincide — the fixture's legacy-vs-current pair was already the right question there, which is why the red ring sits on the green mark.

What each model wrote, under its own contract

writes unaidedordinarydefinitionfull-sourceranked editno-op
0.5Blookup(value)0/66/66/60/6
1.5Bapi.current(value)1/6
3Bapi.current(value)1/6
7Bcurrent(value)0/61/6
Scored under the lenient reading, which strips the module prefix the contract says the model emits, so a right answer in the model's own format is not counted as a failure to repair when it is a failure to comply. This is the correction that matters at 1.5B and 3B: in §12 their every branch read 0/6 because the grammar rejected api., and a failure to repair could not be told from a failure to comply. Read correctly they score 1/6 throughout — a real but wrong API choice, unmoved by the edit. Only 0.5B's branches separate at all. The 7B full-source cell is the one genuine malformation in the sweep: api.current(value).strip().upper().swapcase().

Then: does the edit move the margin across zero?

the answer flips here 0.5B-6.68+2.72repaired 6/6 1.5B-7.63-4.49not repaired 3B-10.31-6.38not repaired 7B-6.89-3.01not repaired -12-8-4+4 FIRST-DIVERGENT-TOKEN MARGIN, NATS
Baseline margin, and where the top-ranked edit takes it. Crossing zero is the repair, and the two now agree at every size — unlike §12, where 1.5B started positive and 3B crossed and neither answer moved. The deficit is comparable at 0.5B and 7B (−6.68 against −6.89); what differs is the gain the single best site can supply, +9.40 against +3.88.
baselineexecutedafterwinnerpredictedrepairs?
0.5B−6.684+9.399+2.715L21/24 row 79 ' legacy'+11.36yes, 6/6
1.5B−7.628+3.135−4.492L26/28 row 79 ' legacy'+2.55no
3B−10.315+3.931−6.384L29/36 row 81 '):\n'+5.68no
7B−6.888+3.881−3.007L22/28 row 79 ' legacy'+5.87no
All five branches conditioned on the contract's shared prefix, so the objective and the generation describe the same decision, and one decoding path throughout. Search space 109,080 to 164,160 candidates per size. At 7B the baseline, executed gain and post-edit margin are identical to §12's decoupling table — the one size whose fixture objective was already well posed gives the same numbers under the derived one, which is the consistency check I wanted on the new harness. (Its predicted value differs because §12 reported predictions from the other objective, the one tabulated under “the site is stable”.)

Two corrections to §12

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.

The identity, once more — retracted in §15

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.

15

A second family

Partly superseded by §20

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 finding

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.

00771414212128283535 gain = deficit above: the edit can flip the answer below: it moves the margin and falls short Qwen2.5 0.5B Qwen2.5 1.5B Qwen2.5 3B Qwen2.5 7B Qwen3 0.6B Qwen3 1.7B Qwen3 4B Qwen3 8B DEFICIT AT BASELINE (NATS) EXECUTED GAIN repairsdoes notcircle Qwen2.5square Qwen3
Every checkpoint in both families. The diagonal is gain = deficit. Above it the single best edit can in principle flip the answer; below it the edit is well calibrated, moves the margin the right way, and cannot get there. The two smallest models sit above at ratios 1.41 and 1.42; the six larger ones below at 0.38 to 0.56. Nothing was observed in between. Note how far right the Qwen3 points sit — that family is far more confident in the wrong answer, and its achievable gains are correspondingly larger.
familydeficitgaingain/deficitafteridentityrepairs?
Qwen2.50.5B6.68+9.401.41+2.728.0e−15yes, 6/6
Qwen2.51.5B7.63+3.140.41−4.491.2e−14no
Qwen2.53B10.31+3.930.38−6.381.1e−14no
Qwen2.57B6.89+3.880.56−3.011.1e−14no
Qwen30.6B3.42+4.881.42+1.453.5e−14yes, 6/6
Qwen31.7B23.84+13.090.55−10.758.9e−14no
Qwen34B32.88+16.620.51−16.263.3e−14no
Qwen38B30.25+15.480.51−14.773.7e−14no
The ranking's chosen site is row 79, the token ' legacy' in the authoritative source, at seven of eight checkpoints — all four Qwen3 sizes and three of four Qwen2.5 — across GQA ratios from 14:2 to 32:8, head dims of 64 and 128, and 24 to 36 layers. Magnitudes do not transfer: Qwen3's deficits above the smallest size are three to five times Qwen2.5's. The ratio carries across families; “an edit buys about N nats” does not.

What made this a port rather than a parameter

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.

The trap I expected, confirmed

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.

The Qwen3-0.6B repair is semantic, and strictly a format failure

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.

Two defects in my own code, found by auditing the port

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.

16

What crossing zero does not buy

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

The finding

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 prediction was falsified before it was registered

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.

Two hypotheses about sufficiency, both refuted

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.

armafter-margingeneratedtests
Qwen2.5-7Bauthoritative source+0.913api.current(value)0/6
Qwen2.5-7Binstruction prose+1.334legacy(value)6/6
Qwen3-0.6Bauthoritative source+2.161api.legacy_example_0(…)0/6
Qwen3-0.6Blegacy examples+1.888api.legacy_example_0(…)0/6
Qwen2.5-0.5Binstruction prose+4.891api.current(value).upper()0/6
Five of the eleven crossings that did not repair. At 7B the arm editing the authoritative definition crossed higher and answered wrongly, while the arm editing the task prose — which contains no occurrence of the answer name — crossed lower and answered correctly. That single row falsifies the registered prediction. At Qwen3-0.6B, boosting the real definition produced nonsense.

What survived

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.

The limitation that bounds all of this

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.

17

The ranking against chance, at every scale

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 finding

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.

deficitrankedrandomranked medianrandom medianranked maxrandom max
Qwen2.5-0.5B6.686/200/60+6.549+0.000+9.856+4.245
Qwen2.5-1.5B7.630/200/60+1.394−0.001+3.638+0.730
Qwen2.5-3B10.310/200/60+3.273−0.000+4.930+1.840
Qwen2.5-7B6.890/200/60+3.550+0.005+4.128+1.226
Qwen3-0.6B3.422/200/60+3.409+0.001+6.045+1.095
Qwen3-1.7B23.840/200/60+6.693+0.013+19.644+4.099
Qwen3-4B32.880/200/60+9.702−0.004+34.084+4.282
Qwen3-8B30.250/200/60+9.253−0.013+15.479+1.557
Top-20 ranked candidates over the whole 109,080-candidate space against 60 magnitude-matched random edits — the same template and factor, so the injected log-odds is identical and only the site differs. All four pre-registered predictions held 8 of 8. At Qwen3-4B the best ranked edit reaches +34.08 against a random best of +4.28.

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 validation that caught an error before it became a number

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.

18

Varying the case, not the model

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 finding

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.

eligiblesolved by a controlrefusedrepairscrossed zero
Qwen2.5-0.5B1248019
Qwen3-0.6B19410217
Qwen2.5-1.5B223206
total531216332
60 cases carrying 12 distinct decisions, three checkpoints, 180 case-runs. Both counts are reported everywhere, because a rate over fixtures is not a rate over problems. A case is eligible only if ordinary generation and both source-pointing prompts fail.

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.

Four defects in my own generator, all found by using it at scale

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.

19

Searching by execution

§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 finding

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.

armdeficitproxy-guidedexecuted-guidedgainstill short by
Qwen2.5-3Bnon_target10.31+8.575+9.449+0.8740.866
Qwen2.5-7Btarget6.89+4.714+4.787+0.0722.101
Qwen2.5-7Blegacy6.89+5.285+5.666+0.3811.222
The three arms where the predicted ceiling cleared the deficit and the executed gain did not — the only place a better search could change a verdict rather than improve a number. The prediction shortlists; it never chooses. Direct measurement buys +0.07 to +0.87 nats and crosses nothing.

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.

sitesexecutedadded 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
The 7B target arm under a measured search. Sites three through five together buy +0.014 nats. §16's closed form predicted exactly this from the algebra — the joint gain tends to a mass-weighted average bounded by the best single row, so adding sites cannot raise the per-head ceiling. Here it is observed by execution, with the predicted score kept out of the selection entirely.
20

A third family, and what size does not explain

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.

The registered prediction, falsified

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.

nothing observed in here 0 0.5 1.0 1.5 gain = deficit SmolLM2 135Mcontract refused — no measurement SmolLM2 360M0.466 Qwen2.5 0.5B1.406 Qwen3 0.6B1.424 Qwen2.5 1.5B0.411 Qwen3 1.7B0.549 SmolLM2 1.7B0.569 Qwen2.5 3B0.381 Qwen3 4B0.506 Qwen2.5 7B0.563 Qwen3 8B0.512 EXECUTED GAIN / BASELINE DEFICIT repairs does not
Eleven checkpoints, ordered by parameter count, smallest at the top. If size were the variable, the green dots would be the top two. They are the third and fourth: the smallest checkpoint with a measurement, SmolLM2-360M, sits at 0.47 among the large models. The band between 0.569 and 1.406 has never been occupied — ten points, three families, three tokenizers, two architectures, nothing in between. That gap is real and it is ten points.
familydeficitgaingain/deficitafteridentityrepairs?
SmolLM2135M—————
SmolLM2360M5.62+2.620.47−3.019.8e−15no
SmolLM21.7B4.27+2.430.57−1.849.5e−15no
The identity holds on llama at 9.5e−15 — level with Qwen2.5 rather than with Qwen3, which tracks head width (64 against 128) and not family. paths_agree is 0.0 exactly at all three, including the refused one, so the re-implemented forward is bit-identical to the native one on a third architecture.

135M was refused, not failed

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.

What survived: the site, at ten of ten

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.

A path the upstream suite never constructed

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

What this run does not establish

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.

21

Closing assessment

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.

22

Filed upstream

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.

ArtifactSubjectUpstreamRetained
Prompt controlA prompt does repair the case — emphasis='definition' scores 6/6.gone#1
Ranks 2/5/9A non-authoritative occurrence of legacy also repairs 6/6. Corrected: its perturbation hypothesis is refuted by #6.gone#2
LinearisationFirst-order ranks the same top candidate at ×64. Its magnitude claim survives; its selection claim is settled by #10.gone#3
DocumentationThe eligible success rate is 1/10; three README figures need reconciling.gone#4
CalibrationPredicted-vs-executed over 75 executed candidates, r = 0.97, with the data.gone#5
Control batteryRanked 6/20 vs random 0/60, p = 1.3×10⁻⁴. The ranking beats chance decisively.n/a#6
Tier-2 sweepT6–T10 under a frozen protocol. 0/24 eligible; emphasis='definition' solves 32/32.n/a#8
Hard-case generator18/18 compose cases defeat every source-pointing prompt; one repair no prompt could produce; T9 answered.n/a#10
Tier-2/3 completionT9 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 fixesThe emphasis='body' bug (+3 regression tests), exception exports, the self-contradicting scope string, the bank copy in Scorer.changes(), and CI.gonePR #7 merged
Code — generatornala/hardcase.py and its eight tests, generating cases no source-pointing prompt solves.n/aPR #9 merged
Code — Tier 1The 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.gonePR #12 merged
Code — GQA and case collisionsBoth 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.gonePR #13 merged
Code — last two defectsThe 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.gonePR #14 merged
Model scaling0.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 — contractsPer-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/aPR #16 merged
Scaling, re-run0.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/aPR #17 merged
Code — second familyQwen3 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/aPR #18 merged
Code — GQA and READMEThe 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/aPR #19 merged
Multi-site, pre-registered48 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/aPR #20 merged
Code — prediction gateThe 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/aPR #21 merged
Ranking vs chance, at scale640 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/aPR #22 merged
Case variation60 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/aPR #23 merged
Executed-guided searchThe 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/aPR #24 merged
Scope documentsBoth 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/aPR #25 merged
Code — third familyllama 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/aPR #26 merged
Third family, pre-registeredP5 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/aPR #27 merged
Secant identityVerified 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 — capture1 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—
Retained in elementalcollision/nala, now private and detached from its deleted parent, so those references resolve only for the repository owner. Seventeen pull requests merged, ten issues, no open work. The suite on main is 221 tests, green in CI, and the whole 109,080-candidate ranking now reproduces from the shipped capture with no model. Every artifact carries the agent byline and none carries a vendor or tool trailer, per the operator's disclosure standard. The one public artifact is the secant issue, left up at the operator's direction.