Loading…
Loading…
Late on October 4th, a commit to lindhard changed one digit. The third exponent of the ZBL screening function, the standard fitted curve for how electrons screen two colliding nuclei from each other, went from 0.4028 to 0.4029. The comment above it changed more than the number did. It had said the coefficients were "transcribed from the cited papers." After the fix it said they "were entered from memory and are not yet checked digit by digit against them." The agent that wrote the constant had not read the 1985 book. It had remembered it, almost exactly. The fix answered a reviewing agent that had caught the digit and added: "I am working from memory of the paper too, so please verify it against Ch. 2."
We want our open tools to be unambiguously free, MIT or Apache. When the reference implementation's licence cannot allow that, the route is a rewrite from the papers. On September 27th, fasterhenry went out on crates.io under MIT. It extracts resistance and inductance from 3-D conductors: spirals, busbars, bond wires. That has been FastHenry's job since 1994, under an MIT RLE notice that allows "internal, noncommercial" use and forbids distributing copies or derivatives.
The second rewrite, lindhard, is also MIT and unreleased at 0.0.1: Monte Carlo transport of ions and electrons in matter. Its ion half is the problem class of SRIM, which lindhard's README describes as "closed source, Windows-only and non-commercial." lindhard's rules let agents run copyleft codes like RustBCA but not read them. Agents write, review and merge the code, coordinated by Loom.
A rewrite also buys what a licence cannot. Both crates forbid unsafe code, so the Rust compiler rules out a class of memory bugs. On a synthetic serpentine, fasterhenry's dense solver on 28 threads of an Apple M3 Ultra under background load beats single-threaded FastHenry. It takes 2.06 s against 4.52 s at 5,000 filaments, and 83.4 s against 103.7 s at 19,600. That is cores and SIMD, not a better algorithm. Per thread, FastHenry's multipole is 14 times faster at that size, and at 1,000 filaments fasterhenry is the slower one.
Both repositories' CI greps for fingerprints of copied source. lindhard's CONTRIBUTING.md states the limit: "It catches copied files, not paraphrase. Paraphrase is on you." For an agent, paraphrase has an odd shape. Nothing is copied from a file. What leaks in is whatever the model remembers about the physics, which is mostly right and uncited. fasterhenry's rules say "do not transcribe from memory," but a rule cannot tell remembered from read, and on PR #40 neither could the reviewer. The check has to come from something the model's memory did not produce.
For the ZBL digits it came the next morning. A second commit cross-checked the screening coefficients against an independent MIT-licensed implementation, which carries 0.40290. The same commit fixed the scattering code's "magic formula," also entered from memory. Another agent had flagged it the night before: "My recollection is no better than the Builder's," it wrote, and checked it against the code's own numerical integral. The cross-check confirmed it.
The electron engine's muffin-tin potential rests on a closed-access paper, so the feature was deferred. No source "was opened, so none is reconstructed from memory." The module now records each coefficient set's status, down to a prefactor that "has been seen only in secondary sources."
fasterhenry's independent referees are PyPEEC, a voxel solver, and the Greenhouse closed forms. Its validation doc puts a two-turn spiral's inductance 0.47% from PyPEEC against a 2% tolerance, and 0.12% from Greenhouse against 5%. Then issue #59 quoted a CI log: "SKIPPED (pypeec plane reference absent)", followed by a passing test. The CI copies of the PyPEEC gates had never run. The reference path resolved against the wrong directory, and the skip message went to stderr while the check grepped stdout. The job stayed green the whole time.
PR #62 fixed both and made each gate print a positive marker that CI counts. The first real run of the ground-plane slot gate measured 4.97% against a 5.5% bound. The bounds stayed put, because loosening them "to buy CI stability would weaken the independent-oracle accuracy claim the gate exists to defend."
FastHenry itself can still be run. On three decks we wrote, the impedance matrices agree to relative differences between 3.8e-4 and 7.3e-4 at 1 MHz. FastHenry's own example decks are a harder test: on October 5th fasterhenry's reader parsed 3 of the 19 (a 20th, excluded, fails in FastHenry too), and each gap is now an issue. A fourth deck of ours disagreed by about a factor of two, 6.65 nH against 3.2 nH at 1 GHz, and the fault was in our deck. FastHenry's ground planes connect through explicit contact regions, so its vias never attached and it solved a trace with dangling stubs. fasterhenry grew graded contact regions in #36, but nobody has rerun the comparison, so the doc leaves the old number "standing as the last measured one, not claimed as fixed."
lindhard's run-not-read referee is RustBCA. With the same potential, stopping and cutoffs on both sides, lindhard's projected ranges for boron at 5 keV and arsenic at 50 keV into silicon come out 0.2% and 0.6% long, within statistics. Sputter yields do not agree: the two codes decide differently when a struck atom moves, and the validation doc heads the 1 keV argon-on-copper comparison "not comparable as configured." With lindhard's displacement threshold lowered to the surface binding energy, the least an atom needs to escape, its yield rises from 0.47 to 1.93. RustBCA's is 4.17, a factor of 2.2 the doc files as unexplained.
The investigation suspected electronic loss on slow recoils: lindhard dropped every collision beyond an impact-parameter cutoff, under-counting their nuclear loss and roughly doubling the electronic share. The obvious fix (#64) restored part of that loss as TRIDYN's weak collisions (Möller and Eckstein, IPP report 9/64, 1988). The code landed in PR #67 and pushed the yield down to 0.88 instead of up. The thread first reported 0.66. The correction sits under it, with the earlier comment "left as posted." The doc adds: "No default was changed and nothing was tuned."
For boron in amorphous silicon from 1 to 20 keV, lindhard's defaults put the projected range 24 to 36% too deep. A different interatomic potential (Kr-C, with the Lindhard screening length) and 1.46 times Lindhard-Scharff electronic stopping come within 2.7% of all six measurements. Neither value is lindhard's fit: Wittmaack and Mutzke reached the pair in 2017 by fitting their own code to 93 measured ranges. The defaults still have not moved: "Choosing a new default is a model change and belongs in its own issue."
In a self-improvement loop with a referee we argued that chip design gets feedback a machine can check. Here the referee is the literature plus somebody else's running code, provided the gate that consults it actually runs. The ZBL exponent now reads 0.4029, cross-checked against an independent implementation, and the module comment still lists what nobody has checked yet.