Independent Audit — Phase A Findings
How to read this page
Three ways to read this page. Precise is the document itself, exactly as it is written in the repository. Plain and Clear were written for this website to help you meet that document — they are about it. They are not it, and they are not evidence.
A laboratory built around the bacterial flagellar motor. It holds a deterministic reduced model of the motor, analysis of recorded single-motor events, and a cross-study parity programme. Alongside those sit the scientific gates the work has to clear, and independent audits of both the model and the repository around it. The framing throughout is hierarchical active inference.
It is for a reader with a scientific interest, and especially for one who has come to check whether a model fit has quietly become a claim about biology. The laboratory's central discipline is a labelling one: every visible layer carries exactly one class — recorded observation, structural reconstruction, reduced model, or physical teaching analogue — and those classes may not be blended. Behavioural observations of one species are held apart from structural work on another, so that nothing on the page can read as a single measured specimen.
Start with the Living Science Walkthrough, which sets out those classes and the truth contract they belong to. Then the scientific and mathematical contract, then the parity gates, which state what would have to hold before a parity claim could stand.
What it is not: a claim of biological parity. The walkthrough is explicit that the release does not turn a model fit into a biological identity claim, and full biological parity is recorded as false and printed as false. Passing this repository's software tests is necessary here and is not the same thing as agreement with a living motor.
Your browser cannot switch reading levels, so the document itself is shown.
Precise — the source document
This is the document. Rendered from the repository at the commit above, with nothing rewritten for the web. A gate re-renders it on every deploy and fails the build if a single byte differs.
Audited commit: 9c3a644e4b57e8ac27f925dcec84222463063aa1 (main)
Auditor: Claude Opus 4.8, independent verification engineer
Contracts followed: CLAUDE.md, docs/CLAUDE_ULTRACODE_INDEPENDENT_AUDIT_PROMPT.md
Flow: OBSERVE → BOUND → PREDICT → ACT → VERIFY → FALSIFY → UPDATE → RECORD
Status: Phase A (empirical baseline) complete. Phases B–D not started.
This document exists to be reviewed and challenged. Predictions were committed before execution; refutations of the auditor's own claims are recorded in §7 rather than silently corrected.
1. Scope and method
Phase A executed the full CLAUDE.md:107-117 required-validation block for the
first time, on a genuinely clean clone, plus all three authorized external
evidence retrievals.
Isolation discipline. The primary checkout was never written to. All
execution occurred in five independent --no-hardlinks clones. git worktree
was deliberately not used, because worktree add writes metadata into the
primary's .git/. The primary was proved byte-identical to its pre-audit state
by raw on-disk hashing of all 106 tracked files (not by git status — see §4③).
Instrument. Two independent hash oracles were used throughout
(git hash-object --no-filters and PowerShell Get-FileHash), cross-checked
and agreeing on all 106 files. Raw on-disk hashing was used for every
comparison because git's content model is blind to the defect class in §4③.
Environment. Windows 11 build 26200, i7-10700T 8C/16T, 63.7 GB RAM.
Node v25.0.0 / npm 11.6.2 ambient; Node v22.13.1 / npm 10.9.2 provisioned as a
checksum-verified portable extraction with zero global mutation.
Python 3.12.10, numpy 2.3.5, scipy 1.16.3 (exact match to
requirements-experiments.txt). See evidence/host.txt.
2. Gate ledger — all gates executed
| Gate | Result | Note |
|---|---|---|
npm ci |
PASS | all four matrix cells, exit 0 |
npm test |
PASS (Node 25) / FAIL (Node 22.13.1) | see §4① |
npm run lint |
PASS | exit 0 |
npx tsc --noEmit |
PASS | exit 0 |
npm run science:verify |
PASS | exit 0 |
npm run cross-study:verify |
PASS | exit 0 |
npm run experiment:verify |
PASS | independent Python oracle |
npm run cross-study:verify-raw |
PASS | was BLOCKED; now earned, §5② |
npm audit --omit=dev --audit-level=moderate |
PASS | 0 production vulnerabilities |
npm audit |
FAIL | 12 (1 low, 5 moderate, 6 high) — all development-only |
Excluded by design: db:generate (writes tracked drizzle/meta/_journal.json)
and scripts/export-cad.mjs (unwired to any npm script). Neither is in the
required-validation set.
npm / Node compatibility matrix
| Cell | Node | npm | npm ci |
npm test |
|---|---|---|---|---|
| A | 25.0.0 | 11.6.2 | exit 0 | exit 0 |
| B | 25.0.0 | 10.9.8 | exit 0 | exit 0 |
| C | 22.13.1 | 10.9.2 | exit 0 | exit 1 |
| D | 22.13.1 | 11.6.2 | exit 0 | exit 1 |
Fully crossed. The failure depends solely on the Node axis; the npm axis has
no effect. package-lock.json was verified to remain at blob
984bc7f4d989d4872ea00354c529ae22a13de1e1 after every npm invocation —
commit 0c73d94 was never silently reverted.
CLAUDE.md:105 (npm 10 compatibility) is CONFIRMED. The suspected hazard —
package.json:50-52 declaring overrides.postcss while package-lock.json
contains no overrides key — does not break npm 10's ci sync check.
3. Test accounting
34 is the first node --test invocation over five files:
model(9) + observed-experiment(7) + science-gates(5) + cross-study-parity(6) + walkthrough(7) = 34.
tests/rendered-html.test.mjs is a 35th case in a separate post-build
invocation that imports dist/server/index.js. Because package.json:12 chains
with &&, a failure in the first invocation means the build never runs and the
35th test never executes — it is NOT RUN, not passing.
4. Adverse findings
① CRITICAL — artifact identity depends on the Node version
experiments/results/observed-experiment-report.json carries runId
1c4b71f42193bb74edd5634da6ff1ea38dd3ab4767f9aadfb783d4a5b0def666.
| Runtime | runId produced |
|---|---|
Node 22.13.1 (V8 12.4) — the declared engines floor |
308d09d83fe556ef9d4ea03948ae34acbebcb5f8493a73cec773bb41d6dd1884 |
| Node 25.0.0 (V8 14.1) | 1c4b71f42193bb74edd5634da6ff1ea38dd3ab4767f9aadfb783d4a5b0def666 ✅ matches committed |
Affected claim. experiments/results/audit-manifest.json:53 states:
"Run the analysis twice from identical protocol, event artifact, and code identities; the report SHA-256 must be identical."
All three named identities were held constant. Only V8 differed. The report SHA-256 changed. The stated determinism condition is insufficient — the true condition includes the JavaScript engine version.
Consequence. package.json:6 declares engines.node >= 22.13.0, but on that
exact floor the repository cannot reproduce its own frozen evidence and
tests/observed-experiment.test.mjs:34 fails.
Magnitude — stated plainly so this is not over-read. The divergence is 1–2
ULP (17th significant digit), confined to the 2000-replicate bootstrap interval
mixtureVsWeibull and a small number of Weibull calibration entries:
weibull 0.05514041629405715 vs 0.05514041629405717
mixtureVsWeibull lower -0.017969164982541544 vs -0.01796916498254155
No scientific conclusion moves. The lognormal still out-scores the mixture; the interval still straddles zero. This is a reproducibility and evidence-chain-identity defect, not a scientific-invalidity finding.
Determinism holds within a version. Three consecutive runs on each of Node
22.13.1 and Node 25.0.0 produced identical runIds. This is a clean,
reproducible cross-version dependency, not flakiness.
Open question (not resolved). A probe of Math.exp, Math.log, Math.pow,
Math.sin and the full Lanczos logGamma across V8 12.4 and 14.1 found
bit-identical results. The auditor's hypothesis of transcendental drift is
refuted. The divergence originates somewhere in the bootstrap accumulation
path and has not yet been localized.
Evidence: evidence/runid-node22.txt, evidence/runid-node25.txt.
② HIGH — X01_SOURCE_INTEGRITY is a proven tautology
scripts/run-cross-study-parity.py:360-363 computes X01 from
all(item["verified"]) and cacheVerification["status"] == "PASS" — JSON
literals read out of the corpus file the gate is meant to validate. It touches
the filesystem zero times.
This was demonstrated empirically, not merely read from source:
| Run | experiments/upstream-cache/ contents |
Report SHA-256 | X01 |
|---|---|---|---|
| 1 | empty | bd3838c40b8d2563… |
PASS |
| 2 | 12 artifacts, 75,001,736 B, every digest verified | bd3838c40b8d2563… |
PASS |
Adding 75 MB of genuine, independently-verified upstream evidence changed the
report by zero bytes. Meanwhile X01's own evidence block declares
"declaredLocalArtifacts": 12 and cites a 4,085,227,742-byte archive.
tests/cross-study-parity.test.mjs:39 wraps the only real hashing in
fs.existsSync, and :45 explicitly blesses checkedArtifacts === 0.
No NOT_RUN or EXTERNAL_VALIDATION_REQUIRED status value exists anywhere in
the repository. The complete vocabulary is PASS, FAIL, NOT_ESTABLISHED,
BLOCKED_EXTERNAL, SOURCE_ONLY. The honest status is currently
unrepresentable, contrary to CLAUDE.md:119-121.
③ HIGH — experiment:run corrupts a hash-pinned artifact, invisibly to git diff
scripts/run-observed-experiments.mjs:35 performs
fs.copyFileSync(datasetPath, publicEventsPath) across a .gitattributes eol
boundary. .gitattributes:3 pins experiments/data/wadhwa-2022-events.json to
eol=crlf (508,103 B on disk); public/wadhwa-2022-derived-events.json is
eol=lf (487,890 B). Both resolve to one identical LF blob in the index.
Demonstrated end-to-end:
- Run the three generators → exactly one file changes on disk (predicted in
advance and confirmed):
public/wadhwa-2022-derived-events.json, 487,890 → 508,103 B, sha256d119ca60…→32ec7ebf…, +20,213 CR bytes. git diff --numstatreports 0 lines.git diff --statis empty. The normalized blob is unchanged, so the corruption cannot even be committed.git status --porcelainshowsM— but a developer inspecting withgit diffsees nothing and would reasonably dismiss it as an eol flag.tests/walkthrough.test.mjs:58fails correctly:WADHWA_2022_EVENTS hash + '32ec7ebf…' - 'd119ca60…', exit 1.
The failing test for this defect already exists. No new test is required;
the correction should reuse the pattern already used correctly at
scripts/run-science-gates.py:590 (write_text(..., newline="\n")).
Evidence: evidence/generator-rerun-changed-files.txt,
evidence/raw-index-divergence.txt.
④ Prior finding, unchanged by Phase A
scripts/run-science-gates.py:391 and :404 pass the bare string "PASS" for
G00_SOURCE_IDENTITY and G01_OBSERVATION_BOUNDARY. Compare :417, a real
conditional. G01 loads observed_report["audit"]["noMotorLeakage"] into its
evidence at :407 and never reads it. Not yet mutation-tested (Phase B).
5. Positive findings, earned by measurement
① All 12 Tier-1 upstream digests are genuine
All 12 artifacts were retrieved from their published Springer/Zenodo URLs and
independently hashed. 12/12 SHA-256 digests match the repository's declared
pins exactly, totalling precisely 75,001,736 bytes. This is the first time the
"verified": true assertions in
experiments/data/cross-study-motor-evidence.json have ever been checked
against real bytes. They are true.
Evidence: evidence/tier1-digest-verification.json.
② The 4.09 GB Ito archive is authentic, and its committed ledger was truthful
Retrieved from Figshare DOI 10.6084/m9.figshare.14371232.v2. Observed
4,085,227,742 bytes and MD5 d42879e66142ff7190f256f4276db111 — both exact.
scripts/verify-ito-raw-archive.py then confirmed 505 ZIP entries,
10,160,270,466 uncompressed bytes, and zipCrcFailure: null — every member
CRC verified — in 64 s.
The regenerated ledger is byte-identical to the committed
experiments/results/ito-raw-archive-verification.json (raw blob
bd9c386f09fc92af1cff5a59c1300dace28bbc34 before and after). The committed
PASS was a truthful record of an archive the repository could not prove it
had.
Limitation retained: this tier is pinned by MD5 only; no SHA-256 for it
exists anywhere in the repository. MD5 establishes accidental-corruption
integrity, not adversarial provenance. This audit computed and records
SHA-256 4b266cdedc0242ad3cb6bd2022fde761b06ec275a46ccf8bead56b60f5b5efac
(evidence/tier2-independent-hashes.txt) so a stronger pin is available.
③ The raw → derived ingestion chain reproduces exactly
The Wadhwa raw .mat was retrieved at pinned commit c8311913 and hashes to
c14de12cc11df8af2ab87f1ec94629eebc249c0e1475c24f850f5a28ddd1ea22 — matching
experiments/preregistration.v1.json:15 exactly.
Re-deriving through scripts/ingest-wadhwa-data.py (output redirected to a
scratch path, never over the tracked artifact) produced a file
content-identical to the committed experiments/data/wadhwa-2022-events.json
(JSON.stringify equality). The full raw → derived transformation is
reproducible from genuine source.
④ Sample-size discipline is sound
Direct measurement: 1,349 events across 109 distinct motorIds, partitioned
89 train + 20 holdout = 109. The cross-study corpus uses 109, and
154 + 40 + 106 + 109 = 409 against X02_CORPUS_BREADTH's threshold of 400.
X02 is sound.
Note: the ingest script's transient stdout reports motorCount: 129
(106 train + 23 holdout) — the pre-exclusion cohort. This number appears in no
artifact and does not propagate. It is a cosmetic logging discrepancy, but a
reader recording it from the console would get a number 20 higher than the
motors actually represented.
⑤ The adverse lognormal result survives independent rederivation
npm run experiment:verify (scripts/independent-statistical-check.py, zero
repo imports, independent SciPy refit) reports:
score.lognormal independent -3.012890173336541 production -3.012890170946554
score.mixture independent -3.049756690911415 production -3.0497565695441344
The lognormal baseline out-scores the project's own two-timescale mixture, and this is confirmed by a second implementation in a different language. The repository's most important self-criticism is genuine and independently replicated.
⑥ Other confirmations
- Determinism is exact within a Node version (3/3 identical runs each).
- Production dependency tree: 0 vulnerabilities. All 12 are dev-only.
- CRLF/LF split materializes identically in fresh clones.
scripts/verify-ito-raw-archive.py:33-34hard-exits on a missing cache and never fabricates a pass — honest by contrast with X01.
6. Nuance on the "independent" oracle
scripts/independent-science-check.mjs emits status: "PASS" and
publicArtifactMismatchDetected: true as hard-coded literals inside its
console.log (:48-53). However, the assert.equal calls at :44-46 are real
and would throw — they pin fullBiologicalParityAchieved === false,
G03 === "FAIL" and G10 === "NOT_ESTABLISHED".
Its enforcement is genuine; its reported output is partly decorative. Both
facts belong in the record. Separately, :41 contains
assert.ok(Math.abs(x + (1 - x) - 1) < 1e-14), which is identically true for
every finite double — a vacuous assertion inside the designated oracle.
7. Refutations — including of the auditor's own claims
Recorded rather than silently corrected, per CLAUDE.md:33-35.
| # | Claim | Status |
|---|---|---|
| 1 | Auditor: "git status will report a clean tree after CRLF corruption" |
Refuted. git status shows M; it is git diff that reports nothing. |
| 2 | Auditor: the external requirement is "a 4.09 GB archive" | Refuted. Two distinct tiers: 75 MB (SHA-256) + 4.09 GB (MD5). |
| 3 | Auditor: retrieval information may be missing from the repo | Refuted. All 13 artifacts plus the raw .mat have in-repo URLs or DOI+commit. |
| 4 | Auditor: V8 transcendental drift explains the runId divergence |
Refuted. Primitives and logGamma are bit-identical across V8 12.4 and 14.1. |
| 5 | Prior recon: only 99 Wadhwa motors are analyzed → 399 vs a 400 threshold → X02 fails | Refuted. 109 motors, all partitioned; 409 vs 400; X02 passes. |
| 6 | Prior recon: 109 may be rightCensoredDwells mistaken for a motor count |
Refuted. 109 is the true count of distinct motorIds. The coincidence is real but meaningless. |
8. Resonance ledger
| Axis | Pre-audit | After Phase A | Driver |
|---|---|---|---|
| 1 source observation & provenance | DISSONANT | PARTIAL ↑ | every upstream digest verified genuine; raw→derived chain reproduces |
| 2 variables, units, equations | PARTIAL | PARTIAL | untouched by Phase A |
| 3 implementation & deterministic runtime | PARTIAL | DISSONANT ↓ | §4① Node-dependent artifact identity |
| 4 prospective prediction | DISSONANT | DISSONANT | unrecoverable; no tags, no signatures |
| 5 UI truth badge & species label | DISSONANT | DISSONANT | untouched by Phase A |
| 6 gate criterion & result | PARTIAL | DISSONANT ↓ | §4② vacuity now proven, not inferred |
| 7 report, export, artifact hash | PARTIAL | PARTIAL | mirrors byte-exact; reproduction command now qualified by §4① |
Thesis, now empirically confirmed at four independent points (G01, X01, the Ito ledger, the raw ingestion chain): the repository's claims are substantially true; the gates that assert them frequently do not test them. The science is honest; several guarantees are unearned.
9. Explicitly NOT done
- Phase B — mutation battery (12 mandated mutations + 4 named falsifiers), independent rederivation of bootstrap intervals, EFE algebra verdict.
- Phase C — any code correction. No source file has been modified.
- Phase D — deep falsification, model competition, validity-domain map.
- The
runIddivergence has not been localized to a specific operation. npm run cross-study:ingestwas not run. It has an undeclared dependency onverify-raw(scripts/ingest-cross-study-evidence.py:253-258raises unless the Ito ledger isPASS), and:255writespublic/before later stages can fail — a partial-run mutation hazard.- No push, publish, tag, deploy, or external mutation occurred.
10. Reproduction
git clone https://github.com/TMDLRG/UNI-FLAGELLUM.git && cd UNI-FLAGELLUM
git checkout 9c3a644e4b57e8ac27f925dcec84222463063aa1
# §4① — requires two Node runtimes; expect different runIds
npm ci && npm test # exit 0 on Node 25.x, exit 1 on Node 22.13.x
# §4② — the tautology, no download required
python scripts/run-cross-study-parity.py
sha256sum experiments/results/cross-study-parity-report.json
# populate experiments/upstream-cache/ then re-run; the digest is unchanged
# §4③ — expect exactly one changed file, and `git diff` to report nothing
node scripts/run-observed-experiments.mjs
git diff --numstat # 0 lines
node --test tests/walkthrough.test.mjs # fails at :58
11. Decision points for the reviewing agent
- §4① severity. Is a Node-version-dependent
runIda release blocker, or a documentation fix (enginespin + a stated reproduction runtime)? Note that pinningengines.nodeto the runtime that actually produced the artifacts would make the claim true without touching any science. - §4② remediation shape. Introducing
NOT_RUNtouches nine files. Should the status vocabulary become a validated single source of truth (none exists today — a typo'd status renders unstyled, unglossed, and fails no test)? - §4③ correction choice. Normalize on write, or unify the
.gitattributeseol? The latter changes the on-disk bytes ofexperiments/data/wadhwa-2022-events.jsonand cascades intoaudit-manifest.json:18and the dual-identity problem. - Published-number cascade. If G00/G01 become real conditionals and any
status changes,
runIdchanges and README /docs/SCIENCE-GATES.md/ the walkthrough / the UI must move together in one auditable commit. Pre-committed rule: report whether the number moved before any framing. - Phase B ordering. Recommend independent rederivation of the mixture fit
before any deeper model competition: if the mixture sits on a local
optimum of the grid-then-refine search at
lib/observed-experiment.js:105-135, every comparison against it — including the celebrated lognormal result — is a comparison against a mis-fit model. README.md:23instructsnpm install, which under npm 11 rewritespackage-lock.jsonand silently reverts commit0c73d94. Onlynpm ciis safe. Recommend correcting the instruction.README.md:89callscross-study:verify-raw"optional";CLAUDE.md:127lists it as required, and it is in fact a hard dependency ofcross-study:ingest. Recommend resolving towardCLAUDE.md.
sha256 2422749cd3bc6235 — of the original file, so what was ingested stays checkable.
Plain — written for this website, not the source document
This is the first stage of an independent audit, written to be argued with. It says so on its first page: predictions were committed before the work ran, and the auditor's own mistakes are listed near the end rather than quietly fixed.
The auditor ran every required check on a genuinely clean copy, fetched the outside evidence the project cites, and hashed it all independently. Most of it holds up. The published files really are what the project says they are, the raw data really does turn into the derived data, and the project's most awkward self-criticism survives being redone in a different language.
The trouble is elsewhere. The identity of one frozen result depends on which version of the runtime produced it, so on the version the project declares as its floor it cannot reproduce its own evidence. One gate reports a pass by reading a claim rather than checking a file. One generator quietly corrupts a pinned file in a way one common command does not show.
The auditor's summary: the claims are substantially true, and the gates that assert them frequently do not test them.
Plain · written 2026-08-01 by claude-opus-5 · not yet checked by a person · about the document whose sha256 is 2422749cd3bc6235
Clear — written for this website, not the source document
The document records the empirical baseline stage of an audit. Later stages had not started when it was written, and it says so.
The method section is careful about isolation. The primary copy was never written to; all work happened in separate clones, and the primary was checked byte by byte before and after with two independent hashing tools that agreed. The environment is recorded down to tool versions.
Then a list of every required command with its result. Most pass. One passes on the newer runtime and fails on the declared minimum. The dependency audit separates production from development risk, reporting no production vulnerabilities alongside a set of development-only ones. A crossed matrix shows the failure depends only on the runtime axis. A short section corrects the test count, and notes that because the commands are chained, an early failure means one later test never runs at all — which is not the same as passing.
The adverse findings follow. The first is that a frozen report's identity changes with the runtime version, even when protocol, data and code identities are held constant, so the stated condition for reproducibility is incomplete. The auditor states the magnitude plainly rather than over-reading it: the divergence is in the last digits of a bootstrap interval, no scientific conclusion moves, the ordering of the models is unchanged. The auditor's own hypothesis about the cause is then refuted by a probe, and the true cause is recorded as not yet localized.
The second is that a source-integrity gate computes its result from claims written inside the very file it is supposed to validate, and never touches the filesystem. This is demonstrated rather than merely read: adding many megabytes of genuine, independently verified evidence changed the generated report by zero bytes. The auditor also notes that the honest status is currently unrepresentable, because no not-run or external-validation-required value exists anywhere in the project's vocabulary.
The third is a line-ending trap. One generator copies a file across a boundary where the two paths declare different line endings, so the copy changes on disk while the normalized version stays identical. One inspection command reports nothing at all, and a developer looking at it would reasonably dismiss the change. A test already fails correctly on it.
The positive findings are earned by measurement, not assumed. Every upstream artifact was retrieved from its published address and hashed, and all match the declared pins — the first time those assertions had ever been checked against real bytes. A very large archive was retrieved and its committed verification list regenerated byte-identically. The raw-to-derived ingestion reproduces exactly. The sample-size accounting is sound. And the adverse result the project keeps about itself — a plain baseline out-scoring its own model — is reproduced by an independent implementation in another language.
A short section adds nuance about the designated independent checker: some of its printed output is hard-coded, while the assertions underneath are real and would throw. One assertion inside it is true for every finite number and therefore tests nothing.
Then refutations, including of the auditor's own earlier claims, each with what actually happened. A resonance table scores seven axes before and after, and two of them move downward because the audit found something. The thesis is stated in one line: the claims are substantially true, and the gates that assert them frequently do not test them.
The document ends by listing what was explicitly not done, giving commands to reproduce each finding, and putting a numbered set of open decisions to whoever reviews it.
Clear · written 2026-08-01 by claude-opus-5 · not yet checked by a person · about the document whose sha256 is 2422749cd3bc6235