FrankenSuite research program · A shareable brief

FrankenNumPy The NumPy That Ships With Its Own Audit

A shareable brief from the FrankenSuite research program. Every claim below traces to the assessed repository; sources are linked at the end. Assessment pinned September 22, 2026.

Assessment pinned September 22, 2026 (the assessed commit)·~1,177 words·5 sections·Every claim traceable to a source
Six definitions. NODUS is the program’s four-ring verdict scale (Invest, Pilot, Explore, Monitor) assigned per assessment packet. TRL is technology readiness level, scored 1 to 9 per packet. CI is continuous integration: the project’s automated test runs. The pin is the exact commit the assessment froze on; every claim is evaluated at the pin, not at HEAD. The rider is the license clause withholding all rights, including benchmarking and analysis, from OpenAI, Anthropic, their affiliates, and anyone acting for them. Bus factor is how many people can leave before the project stalls; it is 1 for every repo here.

01 · What it is

What NumPy is, and why it matters

NumPy is the bedrock of scientific Python. Look under almost any data tool and you find NumPy arrays: pandas, SciPy, scikit-learn, TensorFlow, and PyTorch are all built on top of it. It is how Python does fast number-crunching. An N-dimensional array object with vectorized operations that run in compiled C instead of slow Python loops, plus the linear algebra, random-number generation, and transforms everything else assumes.

Under that bedrock, in the maintainer's framing, is thirty years of C and Cython carrying every memory bug that code ever had: buffer overruns in parsers, undefined behavior in edge cases, opaque evolved semantics, and no machine-checkable statement of what the behavior is even supposed to be. Everyone depends on NumPy's answers. Nobody can independently audit the machinery that produces them.

02 · Why build it

Why rewrite it in Rust

The maintainer, Jeffrey Emanuel, states the bet plainly: rebuild NumPy's behavior from scratch in safe Rust, with full behavioral compatibility. Not a subset, not "inspired by." Plus a tighter architecture underneath: a deterministic shape-and-stride engine that owns every array decision, a strict/hardened dual-mode runtime that fails closed with a logged posterior, and differential conformance against a real NumPy oracle on every CI (continuous integration: automated checks that run on every change) pass as the proof of equivalence. A fork would inherit the C attack surface and the evolved, undocumented semantics; only a clean room lets every rule (a 324-pair dtype promotion table, the stride calculus, the RNG state schemas) be re-derived as small, readable, tested Rust functions. The project describes itself as "a legible specification of NumPy's actual behavior."

The timing argument is fair. Rust's numerical ecosystem (nightly SIMD, rayon work-stealing parallelism, the PyO3 bridge) is mature enough to attempt NumPy-parity performance without C, and the differential-testing plus evidence-ledger methodology is pitched as a machine-checkable substitute for thirty years of battle-testing.

The counter-arguments, which the packet surfaces. The methodology substituting for battle-testing is unproven: no production users, zero independent coverage. NumPy itself keeps moving (the 2.x line brought accelerated sorts and better threaded scaling), narrowing the "wins where NumPy leaves throughput on the table" story to dtypes NumPy doesn't accelerate. And the headline API number needs its qualifier, which is section 3. Read with the qualifier, the honest pitch is symbiosis, not displacement.

03 · What was built

What the project actually built

A 402,564-line, 11-crate workspace. The numeric core is ten of eleven crates under #![forbid(unsafe_code)], with 642 hand-written unsafe sites confined to the Python-boundary crate. Test counts reproduce to the unit: 8,716 #[test] functions. A 67,641-line ledger of the project's own failures, losses, and reverts. A divergence ledger (behaviors where the Rust disagrees with NumPy) with zero active rows. Ten crates are published on crates.io at version 0.3.0.

The mechanism that matters is the three-tier Python surface. Tier 1: native Rust fast-paths driving real Rust engines. Tier 2: native PyO3 classes. Tier 3: identity-equal re-export. The actual NumPy object rebound under the project's name, by the project's own documented mechanism, so a tier-3 name in the project is the NumPy object. That is how it reaches "100% of numpy.__all__": substantially by re-exporting the incumbent it claims to reimplement. The pip wheel declares numpy>=2.3 as a runtime dependency. A "NumPy reimplementation" that cannot function without NumPy installed is, for every workload touching tier 3, a compatibility layer with fast paths. The per-name tier attribution is unaudited. The experiment that would quantify it (build a wheel with tier 3 severed and measure what still resolves) has not been run.

Then the benchmark honesty, which is the centerpiece. The README's own evidence grade, audited September 2026: of 28 headline ratios, one is contract-grade (isin at 134.5x). Five were measured against a live NumPy in the same invocation with a null control. Roughly 22 are stock Criterion reads with no null, no host field, no binary hash. A fleet audit puts it at 22 of 751 kept performance claims carrying a same-invocation incumbent ratio: 2.9%. The README says to read the table "as a map of where native kernels exist," not as results. And the "did you know": the May 2026 cross-engine table where FrankenNumPy "wins" was measured forty minutes after the project's side of every row had been switched to pass straight through to NumPy. NumPy timed against NumPy plus wrapper overhead. The README says so explicitly, and keeps the table on display as "the parity-era record." A museum of a measurement that proved nothing.

Evidence · CI status

What the project’s own CI said at the pin

  • At the pin (the commit the assessment was pinned to), CI was red: the first gate failed on clippy, and gates two through nine never ran.

The uncomfortable findings

Uncomfortable finding

The README badge still read "G1 green," describing a commit three weeks earlier. The Python module has no PyPI release and no wheels. Registry traction tops out at 96 downloads on one crate. The core numeric type stores integers as f64 internally, with exactness preserved through a sidecar for only ten operations: a disclosed precision landmine for large integers, deferred to a later phase. Large dense matrix multiplication loses to OpenBLAS by design, with no BLAS linkage. And the license is MIT plus a rider barring OpenAI, Anthropic, their affiliates, and anyone acting for them from use, where "use" includes benchmarking, testing, and analyzing the code.

04 · Where it stands

Where it stands

In our program's terms: TRL 5, NODUS ring Explore. In plain English, components are validated in the relevant environment. Differential conformance against the live NumPy oracle, re-countable test and census numbers, plus real crates.io releases. But no production deployment, no PyPI wheel, CI red at the pin, and the performance numbers 97% non-contract by the project's own audit. Substantive, unproven, and un-advanceable past Explore while the rider stands.

Technology readiness

TRL 5 on a 1-to-9 scale.

NODUS ring

MonitorExplorePilotInvest

The program’s adoption ring for this project.

Verdict key

NODUS ring
Explore: The default for substantive-but-unproven work.
TRL
Technology Readiness Level, a 1-to-9 scale of how proven a technology is. This brief rates the project at TRL 5.
CI
Continuous integration: the project’s automated checks, run on every change.
The pin
The exact commit the assessment was pinned to. “At the pin” means as of that commit.

Evidence tiers

  1. Tier 1 · Verified — Confirmed by direct inspection of a fresh clone, an API response, or a live page read by the analyst.
  2. Tier 2 · CI-observed — Observed executing on live CI pages. Attests the suite runs, not that it is green, unless pass/fail is legible.
  3. Tier 3 · Maintainer claim — Asserted in README or docs by the maintainer; not independently executed or reproduced.
  4. Tier 4 · External — Independent sources: APIs, papers, press, third-party benchmarks. Absence of coverage is reported as a finding.
  5. Tier 5 · Inference — The analyst’s judgment. Always labeled; never presented as fact.

What this verdict rests on. Tier labels are the assessment packet’s own annotations.

  • Tier 1 · Verified: 402,564 source lines, a 642-site unsafe census at the FFI boundary, and 8,716 tests counted; 10 crates on crates.io.
  • Tier 2 · CI-observed: CI red at the pin: G1 failed on clippy (cargo fmt and cargo check passed), per-job conclusions via the Actions API.
  • Tier 3 · Maintainer claim: Nothing was compiled or executed; the KEEP sampling math was reported, not re-derived.
  • Tier 4 · External: Zero independent coverage; no production users, no PyPI release.
  • Tier 5 · Inference: The Explore ring.

Should you use it?

No.

The Python module has no distributable artifact, and the rider disqualifies the likeliest evaluators.

Should you learn from it?

Yes.

Specifically from the audit discipline. The differential-against-oracle conformance harness, the ledger-hygiene gates, the KEEP-claim incumbent-coverage audit, and the negative-evidence ledger are directly importable patterns. The verifiable core of the project is not the engine. It is the evidence contract.

What would change the verdict, in order

  1. the rider narrowed or removed (nothing else matters without it)
  2. a PyPI release with wheels
  3. the KEEP re-recording campaign reaching contract-grade majority with CI green
  4. the tier-3 severance experiment run, turning the packet's central qualification into a number only the project can produce.

05 · What it teaches

What this teaches about building with agents

The exportable insight is the benchmark evidence contract.

Performance claims from agent-built code should carry a minimum schema: a same-invocation incumbent ratio, a named host, the executing binary's hash, and a null measurement. FrankenNumPy's README encodes exactly this contract, audits its own headline table against it, and prints the audit (22 of 751) in the same document that prints the table. source source The discipline turns "my numbers" into "my numbers, graded." The grading is what survives when the numbers don't.

The second half of the lesson is the ledger. Every benchmark loss, no-ship, and revert is filed in a 67,641-line negative-evidence ledger maintained as carefully as the code. Teams building with agents will generate failures at machine speed. The question is whether the failures get filed or get buried. File them. The project that disavows 97% of its own claims in writing is more credible, not less, than the one that defends 100% of them.

Evidence

This page cites selected evidence. The full claim-by-claim audit is in the assessment packet.

Open a panel to see what each source evidences. Full claim-by-claim audit.

Full claim-by-claim audit with evidence tiers lives in the program's assessment packet.

The repositorygithub.com/Dicklesworthstone/franken_numpy
NumPy tutorialsNumPy tutorials

NumPy's foundational role (pandas, SciPy, scikit-learn, TensorFlow, PyTorch built on it) per NumPy tutorials.