NaLa Evidence Ledger
Evidence ledger·companion to NaLa Under Replication· 14 Sep 2026

What Was Measured, and How to Check It

Every experiment in the replication, with its protocol, its data, and whether its prediction was registered before the measurement or written after it.

This page exists so the claims in the report can be checked rather than taken on anyone's word. It is addressed to the authors of NaLa and secant: the studies below were run against their code, and several of them correct things this review itself got wrong.

The work was done against the repositories on 10–14 September. arXiv:2609.14127 appeared on 12 September and every finding here has since been checked against it: none of them contradicts a claim the paper makes. The criticisms in the report are aimed at the toolkit's README, and the paper scopes those claims differently. §05 sets out what is left once that is taken into account.

One limit, stated up front. The code, data and protocols live in a fork that is private, and stays private until the authors say otherwise — it was closed when leochlon/nala became unreachable mid-review, out of deference to that. So everything below can be read and audited, and nothing below can be re-run by a reader who has not been given access. That is a real limit on this document and not a formality.

216 tests, green · 8 checkpoints, 2 model families · 14 pull requests merged · 10 issues
12
studies, all data shipped
7
pre-registered before measuring
1,400+
edits executed end to end
10
of my own findings corrected
0
contradictions with the paper
01

How to read this

Three things distinguish a measurement here from an assertion, and each is recorded per study rather than claimed in general.

Registered or not. Six of the eleven studies froze their predictions in a committed file before any inference, with the falsification conditions and the uninformative outcomes written down in advance. The others were exploratory and are labelled as such. A result from an exploratory study is a description; a result from a registered one is a test.

Recorded data. Every study writes a machine-readable record into replication/ in the fork, alongside the script that produced it. Where a claim cannot be re-derived even from those records, that is stated — there is one such case and it is called out below. The records exist; access to them is the authors' to grant.

What would have falsified it. A prediction that could not fail is not a test. Several checks in this work were mutation-tested: the code was deliberately broken to confirm the check notices. Where that was done, it is recorded.

The honest summary

The mathematics survives everything. The engineering survives everything. One behavioural claim generalises — the ranking beats chance at every scale tested. The headline repair does not generalise, and three separate accounts of why an edit works have been proposed and refuted, two of them mine. What remains is a necessary condition with no sufficient one attached.

02

The studies

StudyRegisteredScopeResultData
Identity verification
docs/MATH.md
exploratory 336 (layer, head) pairs, live model; 4 choices of μ Holds at 6.4e−14. Only the uniform mean works; the other three fail by 1015×. The identity is a constraint, not a definition. capture_all_layers.npz
Prompt controls
issue #1
exploratory 8 arms, deterministic, run twice A prompt does repair the recorded case — the repo's own definition emphasis scores 6/6. Falsifies “no prompt could”. —
Predicted vs executed
issue #5
exploratory 75 candidates, natively executed r = 0.97, sign agreement 97.3%. Converts “a prediction with no bound” into a measured, good result. In the method's favour. prediction-envelope.json
Exact vs linearised
issue #3
exploratory all 109,080 candidates, 5 magnitudes First-order ranks the same top candidate at every magnitude. The README's selection claim does not survive; its magnitude claim does, and is stronger. capture_all_layers.npz
Model scaling
protocols/model-scaling.md
registered 4 checkpoints, 0.5B→7B The repair reproduces at 0.5B and nowhere above. Two amendments declared in flight; both were my own errors. scaling.json
Second family
docs/FAMILIES.md
registered Qwen3, 4 checkpoints, matched sizes The pattern replicates in an independently trained family. Two ladders, never conflated. Identity holds on a second architecture. scaling-qwen3.json
Multi-site edits
protocols/multi-site.md
registered 48 executed arms, 8 checkpoints Crossing zero is necessary (48/48) and not sufficient (11 crossings, no repair). The registered hypothesis was falsified. multisite-preregistration.json
multisite-results.json
Prediction envelope
docs/VALIDATION.md
exploratory 75 candidates, −7.25 to +11.36 Calibrates a gate from data rather than choosing a threshold: sign conflict above a floor that 0 of 35 comparable candidates trip. prediction-envelope.json
Ranking vs chance
protocols/control-battery.md
registered 640 edits, 8 checkpoints 480 random edits, zero repairs. All four predictions held 8/8. The one positive result that generalises. control-qwen2.5.json
control-qwen3.json
Case variation
protocols/case-variation.md
registered 60 cases / 12 decisions, 180 runs The necessary condition survives a new axis: 29 distinct cases, zero violations. Sufficiency fails in 29 of 32 crossings. cases.json
Executed-guided search
protocols/executed-search.md
registered 3 arms, measurement inside the loop The proxy was weak but not the binding constraint: +0.07 to +0.87 nats, no verdict changed. Closes a stated caveat. executed-search.json
Third family
protocols/third-family.md
registered SmolLM2 135M–1.7B, outside the Qwen lineage The registered prediction was falsified, and it was one of mine. A 360M model — smaller than any checkpoint measured here — 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. scaling-smollm2.json
Twelve studies. Seven registered their predictions, falsification conditions and uninformative outcomes in a committed file before any inference — and the last of them falsified its own registered prediction, which is what registration is for. Every row's data is in replication/ and reproduces from the shipped scripts.

Two rows refute claims that are not in the paper. “Prompt controls” and “Exact vs linearised” falsify sentences from the toolkit's README — that no prompt could repair the case, and that first-order ranking selects a different candidate. arXiv:2609.14127 makes neither claim: it reports one prompt control at 1/6 without asserting that none can succeed, and claims accuracy of magnitude rather than a difference in selection. Read those rows against the README, not against the paper.
03

What this review got wrong

Ten corrections, all to my own work, all found and published rather than quietly fixed. They are listed here because a review that never corrects itself is not measuring anything — and because several of them are the same defect I filed against the repository, reproduced in the code I wrote to test for it.

What I claimedWhat was wrongWhere it was corrected
The unit step increases E in 56% of heads Pooled across all 24 layers of the wrong checkpoint. On the paper's own layer it is 11% — far weaker, in the paper's favour. secant#1, title and body
A large perturbation may simply jolt the model Refuted by my own control battery: 60 random edits of identical magnitude, zero repairs. issue #2
Executed gains of +8.03 and +10.83 above 0.5B Measured on an off-path quantity. Correctly +3.14 and +3.93 — a third as strong. issue #15
The winning site is the same token at all four scales Three of four. The fourth was an artefact of a mis-posed objective. issue #15
Identity residual ~1e−14 at every scale The check could not fail: it returned 0.00e+00 for μ = the zero vector. It verified float64 associativity, not the construction. issue #15, PR #18
Repair follows the authoritative source Refuted by my own issue #2 before it reached registration, and withdrawn. protocols/multi-site.md
Repair follows the answer token, wherever it sits Registered, measured, falsified: at 7B an arm editing task prose containing no occurrence of the answer name crossed and wrote the correct program. PR #20
48 generated cases; 18 of 18 defeat every prompt 24 distinct cases, 8 of them counted 4× each. The compose arm is at most 4 distinct cases. issue #10, title and body
Compose cases defeat every source-pointing prompt Their prompt forbade the nested answer they require, so every control was asked for something impossible. Re-measured with the permission restored, the conclusion survives. issue #10, PR #23
The repair reproduces at the smallest checkpoint and nowhere above it True of both Qwen ladders and not a fact about size. Registered, measured, falsified: a 360M model smaller than either sits at gain/deficit 0.47, among the large ones. issue #15, PR #27
The generator pair is the sharpest. §4 of the report faults the upstream repository for a control that was never given the chance to produce the answer. The generator I wrote to test that finding contained the same defect, and it went unnoticed until the generator was run across its own configuration space for the first time.

The last row is the one registration caught cleanly. Three of these corrections — the authoritative source, the answer token, and now size — are predictions that were written down, frozen, and then disproved by the run they were written for. That is the mechanism working, not a lapse it caught.
Checks that were themselves checked

Three checks in this work were mutation-tested — the code was deliberately broken to confirm the check notices. Dropping the denominator from the multi-site closed form fails 32 assertions; letting the region search leak outside its region fails 4; swapping the GQA head mapping for a modulo leaves the old tests green and is caught only by the new ones, where it trips the package's own numerical gate. A check that cannot fail is not a check, and this review shipped one before it learned that.

04

How to verify any of it

These are the commands that produced every number on this page. They run on CPU with no network and need no pretrained download, and the shipped capture means the whole 109,080-candidate ranking reproduces with no model at all. They are listed so the method is inspectable and so the work can be re-run the moment the repository is opened — which today it is not. Read them as a specification of what was done, not as an invitation you can currently accept.

python test_all.py --require-models     # 216 tests, no pretrained downloads

python scripts/study_scaling.py --family qwen3          # the second ladder
python scripts/study_control_battery.py --family qwen3  # ranking against chance
python scripts/study_cases.py                           # 60 cases, 12 decisions
python scripts/study_executed_search.py                 # measurement inside the loop
python scripts/scaling_figures.py                       # every figure, from the data

The figures regenerate byte-identical from the committed data, so the charts in the report and the JSON in replication/ cannot drift apart without a test noticing.

If you want to check any of this yourself

Access to the fork is the operators' to offer and yours to decline or accept; it will not be opened unilaterally. If you would like to run any of it, or would rather have a narrower public copy carrying only the replication assets — the captures, the protocols, the recorded results and the scripts that read them — that can be arranged on your say-so. Until then this page is a record of what was measured, and the numbers in it are the part you can hold this review to.

The one claim that cannot be re-derived from shipped data

The per-case results behind the generator study's 18/18, 10/18 and 9/9 figures were never written to replication/ — only the aggregates survive. That is its own defect, it is why the follow-up study records per-case rows, and it is the reason those particular numbers are reported here as corrected rather than as re-verified.

05

If you are the author

This review was run on 10–14 September against leochlon/nala and the leochlon/secant preprint. On 12 September arXiv:2609.14127 appeared — Exact finite attention responses from RoPE derivatives — and the review has since been checked against it line by line. That changes what is worth saying here, so this section was rewritten.

First, the part that matters most

Nothing this review measured contradicts a claim in the paper. Twenty-five of its findings support claims the paper makes, thirteen concern questions the paper does not raise, nine it cannot check, and six are additions. Zero contradictions. The three claims the review falsified were all in the toolkit's README, and none of them survives into the paper. The sixth addition arrived after that audit — a third model family, outside the Qwen lineage — and it did not change the count of contradictions.

The paper had already made the corrections

The README said the method “repaired a program that no prompt could”. The paper reports one prompt control at 1/6 and never asserts that no prompt can solve the case. The README's framing implied a success rate over 107 attempts; Appendix H states that the case “was selected adaptively and uses a supplied correct ranking target… it supplies no success-rate estimate or claim that attention uniquely caused the failure.” The README offered a diagnostic reading — distinguishing attending to the wrong tokens from attending correctly and deciding wrongly; the paper claims no diagnostic capability anywhere.

That is the difference between a repository front page and a paper, and it is to the authors' credit. Read the criticism in the report with that in mind: it is aimed at claims you appear to have already withdrawn.

What survives as a contribution, rather than a correction

What the paper establishesWhat this review adds
Theorem B.1 closes: “The last equality holds exactly for every query and all finite projection weights and inputs.” Verified at layer 23 of Qwen2.5-0.5B and six joint-sweep settings. 336 (layer, head) pairs at 6.4e−14, every layer of a live model — then ~1e−13 on Qwen3, which applies a per-head query/key norm, and 9.5e−15 on llama, which applies none and carries no projection bias. Direct evidence for a claim quantified over every query, on three architectures.
μ is defined as the uniform arithmetic mean and the identity is proved with it. The paper never argues the identity could have been trivial. The counterfactual: softmax-weighted mean, zero and an arbitrary constant each fail by ~1015×. μ is pinned, not fitted — which answers the tautology objection a referee will raise, and which the paper does not currently pre-empt.
Deletion-effect ranking attains Spearman 0.950–0.989 against executed effects, with attention-mass and value-norm controls at 0.343–0.764; plus one adaptively selected repair case. A magnitude-matched random control at eight checkpoints in two model families: 640 executed edits, of which 480 random produced zero repairs, against ranked edits moving the margin by +1.4 to +9.7 nats everywhere. Random edits of identical family and factor move it by a median within ±0.013.
95.36–96.52% sign accuracy across 92,160 executed positional edits on Qwen2.5-1.5B-Instruct. A calibration curve for the reweight family: r = 0.97 over 75 natively executed candidates, executed/predicted averaging 0.876, systematically over-confident at both extremes and heteroscedastic rather than a scale error.
Appendix H records the repair case on PyTorch 2.8.0: 109,080 candidates, token 79 ␣legacy, ×64 at layer 21, predicted 11.361, executed 9.399. Reproduced on PyTorch 2.14.0, a different OS and a six-version gap: 11.360963 and 9.3989. Agreement to seven significant figures across that gap is a stronger reproducibility result than most replications can report.
The selection method is evaluated on Qwen2.5 checkpoints. The paper makes no claim about which models the repair transfers to, and none about model scale. The selected site is the same source token at ten of ten checkpoints across three families and three tokenizers — Qwen2.5, Qwen3 and a llama model from a different lab — with the same template winning every time. The repair reaches only two of the ten, and a registered prediction that this tracked parameter count was falsified: a 360M model, smaller than any other tested, behaves like the large ones. Selection generalises considerably further than repair, and neither is about size.
Every row's data is in the repository. The right column is what the review contributes to the paper rather than what it disputes.

One boundary, offered as support for your scoping

The paper is careful to claim local response accuracy — exactness of the edited attention write, with downstream predictions contracted against a baseline gradient and evaluated by native execution. It never claims that a margin determines what the model writes, and the phrase “first divergent token” does not appear in it.

This review's central negative result is that the scoping is necessary. Crossing zero on the next-token logit margin is required for a repair — no counterexample in over a thousand executed edits, 48 registered arms and 29 distinct generated cases — and it is never sufficient: 11 crossings without repair in one study, 29 of 32 in another, and three separate accounts of what closes that gap were proposed and refuted, two of them the review's own. So the instrument's guarantee stops exactly where the paper stops it. That is not a criticism; it is measured evidence that the line was drawn in the right place, and it is worth a sentence in a limitations section if you want to pre-empt the question.

The one place the review still points at something

The title of the preprint, and section 3.3 of the paper, describe attention as an exact unit gradient step. That is an identity about where the step lands — 0 − ∇BE(0) = ΔM — and the paper never claims the step descends. It is consistent about this: Appendix C.4 uses the quadratic's positivity to characterise the attention-preserving kernel, not to bound the Hessian's spectrum, and no eigenvalue bound appears anywhere.

The word “step” will nonetheless invite the question, so here is the measurement. A unit step reduces E only when λmax < 2. On your own configuration — base Qwen2.5-0.5B, layer 23 — it increases E in 3 of 28 heads, median λmax 0.51, so the step descends about nine times in ten. But λmax reaches 109 in one head at that layer, and pooled across all 24 layers of the Instruct checkpoint the step increases E in 56% of heads. Descent is contingent on the layer's spectrum rather than guaranteed by the construction. One sentence saying so removes a referee's easiest objection, and costs nothing, because the paper never needed descent in the first place.

If you want the underlying work

The repository holding the code, data and protocols is private and stays private until you say otherwise — it was closed when leochlon/nala became unreachable mid-review. Access, or a narrower public copy carrying only the replication assets, is available on your say-so and will not be opened without it.