The physical constant recovered, with the noise of a real sensor.
9 laws from physics, chemistry, biochemistry. Multiplicative noise (what a real sensor produces), over the range a real instrument would cover — not an arbitrary uniform range (SRBench's known bias, corrected here).
| Domain | Law | Noise | Constant recovered | Error | Verdict |
|---|---|---|---|---|---|
| PhysicsFree fall | d = (g/2) t² | 6% | g (via C=g/2) | 0.2% | Proved |
| PhysicsPendulum | T = 2π√(L/g) | 4% | g | 0.3% | Proved |
| PhysicsKepler (3rd law) | T = a^1.5 | 5% | exponent 3/2 | 0.8% | Proved |
| PhysicsHooke | F = k x | 4% | k (N/m) | 1.5% | Proved |
| PhysicsOhm | V = R I | 3% | R (Ω) | 0.0% | Proved |
| PhysicsCoulomb | F = k q₁q₂/r² | 6% | exponent −2 | 1.8% | Proved |
| ChemistryBeer-Lambert | A = ε L c | 2% | ε | 4.8% | Proved |
| ChemistryRadioactive decay | N = N₀ e^(−λt) | 5% | half-life | 1.6% | Proved |
| BiochemistryMichaelis-Menten | v = Vmax S/(Km+S) | 6% | Vmax, Km | 2.7% | Proved |
Real constants (g = 9.81 · lab materials · common isotopes), not an arbitrary range. Full suite: 27 cases, 24 correct, 2 honest abstentions, 1 known error (detail in the next section). Live measurement 2026-08-03, mouhn_agentics/benchmark_motor.py.
More noise doesn't make the engine lie — it makes it go silent, until it has enough points.
Test law: y = 4.9 x² — multiplicative noise up to 120% (noise exceeds the signal itself). One draw per cell, fixed seed.
At 200 points — not shown as its own column above because it behaves differently — the engine reads 79.6% error at 20% noise (the one known miss below, wrongly reported as a fit instead of abstaining) and honest silence at 60% and 120% noise.
On 8 of 9 low-N / high-noise cells, the engine stays silent rather than guess — once it has enough points (2,000+), it recovers the constant within 0.1%–2.4%, even at 120% noise. It's the opposite of an LLM: confidence follows the proof, never the tone of the answer.
Said plainly: 1 case out of 27 gets it wrong instead of staying silent (20% noise, N=200, 79.6% error) — the only one of 27 where the engine is wrong rather than abstaining. Tracked by this same benchmark on every code change.
The formula isn't written anywhere in the engine. It finds it anyway.
Three independent public datasets, with no link to the engine's law catalog — only numeric columns and a target.
| Domain | Source (real data) | Law recovered | Published reference | Verdict |
|---|---|---|---|---|
| AstronomyKepler's 3rd law | Wikipedia — 8 planets | T = 365.27 · a^1.5 | T² ∝ a³ (Kepler, 1619) | Exact |
| Materials scienceVickers hardness | Materials Project — 36 superhard compounds (DFT) | Hv ≈ 0.1495 · G | Hv ≈ 0.151 · G (Teter, 1998) | 1% gap |
| NanotechnologyCdSe sizing curve | Yu, Qu, Guo & Peng — Chem. Mater. 2003 | D(λ) rational form, held-out R² | published curve (same article) | R² = 1.0000 |
| Materials scienceK → Hv, retested live | same Materials Project cache (36 compounds) | candidate Hv ≈ 4.10 · K^0.5 | held-out R² = −35.3 — doesn't generalize | Abstention |
Kepler: pure parsing of the Wikipedia HTML table, zero LLM in reading the data. CdSe: 79/80 bootstrap replications agree on the same form. Last row: retested LIVE on 2026-08-04 (mouhn --json, discover_materials_law) instead of reused as-is — the earlier candidate (Hv ≈ 6.15·K^0.5) did not reproduce: the engine finds a different coefficient (4.10) and the held-out check fails outright (R²=−35.3 on 7 never-seen points). The engine says so itself: no clean law between K and Hv in this subset — abstention, not invention. Rest of the table: measured 2026-07-18 / 2026-07-21, commit c3d259e (Kepler and G→Hv reconfirmed on current HEAD, R²=0.9926 for G→Hv).
Against the field's own standard test set.
14 two-variable differential-equation systems, the "Strogatz" subset of SRBench — the community reference for comparing law-discovery engines.
Before — 5 / 14
A narrow engine per form — even an exactly linear 4-term mechanism was missed by greedy selection (it picks a residual that explains better than the true term, and converges, confidently, on a wrong answer).
After — 14 / 14
Compositional library (powers, trig, saturations, Michaelis-Menten) × exhaustive enumeration instead of greedy ranking. All coefficients exact. Zero regression: the AI Feynman easy-set stays 17/17.
Examples of exactly recovered laws: predprey1 = (4x − xy + 3x² − x³)/(1+x), bacres1 = (20 − x − xy + 10x² − 0.5x³)/(1+0.5x²). Measured 2026-07-24, commits 68153eb/8d1d792 (confirmed on current HEAD).
The problem open for 40 years. The engine abstains — then finds the chemistry, alone.
21,263 real superconductors (UCI Superconductivity), 81 properties + Tc (0–185K). Question: is there a universal law for Tc? An LLM or a black-box model always answers something. MOUHN starts by saying no.
discover_interaction_law abstains (held-out R²=0.58); linear regression on 81 variables caps at 0.735. A random forest from the literature reaches ~0.92 — but as a black box, with no readable law. The engine is right to refuse: that's exactly why high-Tc superconductivity remains open.
The model systematically under-predicts high Tc (bias +19.8K between 77–120K, +31.5K between 120–185K). "Anomalous" materials are enriched 4.3× in Tl, 3.1× in Hg, plus Pb, Nd, Bi, Ca, Sm — literally the cuprates (HgBaCaCuO, TlBaCaCuO, BiSrCaCuO), found unsupervised.
"It's not a new material, it's a mixture of known elements" — additive model R²=0.661 → +element pairs R²=0.802, real gain +0.140. Synergistic pairs: Cu+Ba, Cu+Bi, Cu+Hg, Cu+Tl (the cuprates, brick by brick). Anti-synergy: Cu+Zn, Y+Zn — Zn is the classic cuprate poison, a textbook fact rediscovered from data alone.
Generative kNN search on composition: R²=0.917, top candidates = HgBaCaCuO variants (~135K, the known record). Measured 2026-07-23.
Real towing-tank noise. The engine finds the hull-speed physical pole on its own.
UCI Yacht Hydrodynamics: 308 real measurements from a towing tank (Delft), residuary resistance of a sailing-yacht hull. No formula given to the engine — only the columns and a target, tested live on 2026-08-04, mouhn --file yacht.csv.
Twelve tool calls, 6 forms tried and refused before the one that holds — the engine explores and self-corrects out loud, not a first polished attempt after the fact. The chosen form isn't a simple fit: its denominator places a pole at Fr ≈ 0.497, almost exactly the theoretical "hull speed" limit where wave resistance diverges — a physical structure the engine had no reason to know in advance.
Public dataset (Gerritsma et al., Delft towing tank), never seen by the engine's law catalog. The residual (hull-shape coefficients: prismatic_coef, length_beam…) is not yet explored — an honest next step, not a claim yet. Tested live 2026-08-04, session c9081, tools discover_law → discover_search → test_hypothesis ×10 → recall_law (6 forms refused, 6 checks passed).
Same hull, same law — until the noise kills the signal, honestly.
Same dataset (Yacht Hydrodynamics), increasing synthetic multiplicative noise added to the real target, one level at a time. Tested live on 2026-08-04, mouhn --file yacht_noiseXX.csv.
| Noise added | R² sample | R² held-out | Verdict | What the engine says |
|---|---|---|---|---|
| 0%real data | 0.978 | 0.981 | Proved | physical pole Fr≈0.497 recovered |
| +30%synthetic | — | ~0.94 | Abstention | below the bar — correlation 0.98 exists, no 1-variable form holds |
| +80%synthetic | 0.772 | 0.80 ± 0.05 | Abstention | best try (piecewise) — the engine: "local approximation, NOT the law" |
| +150%synthetic | 0.702 | 0.539 | Abstention | noise (122%) exceeds the signal — "signal destroyed by noise" |
The engine doesn't stop at "I don't know": at 150% noise it computes that even with 4× more points (1,232 rows) the effective noise per bin would still be 15.6% — still too high for a clean law; 9× (2,772 rows) would bring it to 10.4%. Same discipline as the earlier noise section, applied to a domain never seen before that day. Tested live, sessions c9082 / c9083 / c9084.
My machine, my model, my commands. None of this is a mockup.
Every result in this dossier — including the noise mechanism explained below — ran live on my own machine while this site was being built, not on some anonymous cloud API. Here's what proves it.
The noise-robustness mechanism (earlier sections) isn't a marketing promise: it's discover_law_noise_guided in the source code, which bins the points and averages each bin's noise (the noise of a mean falls as 1/√n). But this rescue has an explicit gate: len(full_rows) > 500. The yacht dataset has only 308 real rows — under the gate — so it abstains starting at 30% noise instead of crossing it. Not a hidden flaw: the same rule, measured honestly on both sides of the threshold.
Verifiable on your end: grep -n "_FAMILY_SAMPLE" mouhn_agentics/tools/hypothesis_test_tools.py shows the exact constant 500. Nothing in this dossier was written before being run.
Another test, not the same one: 24 real datasets, two separate tracks.
SRBench 2025 (the benchmark's current edition, distinct from the Strogatz subset already shown) provides 12 "first-principles" sets (known physical law) and 12 "black-box" sets (real, no guaranteed law), via PMLB. Tested live on this machine on 2026-08-04, one at a time, with mouhn --file.
| Dataset | What was found | R² held-out | Verdict |
|---|---|---|---|
| Kepler | y = 363.99 · a^1.5 | 1.0000 | Proved |
| Newtongravitation | log-linear form (the literal G·m₁m₂/r² form was refuted at held-out) | ≈0.999 | Proved (structure) |
| Ideal gas | same — log-linear; literal PV=nRT refuted | 0.9992 | Proved (structure) |
| Leavittperiod-luminosity | initial power form REFUSED at held-out; rational form kept instead | — | Proved (self-corrected) |
| Schechter | rational law | 0.9988 | Proved |
| Supernovae (zg) | 5-PL calibration, 243 real points | 0.9991 | Proved |
| Tully-Fisher | 3-term sum (1/DV, log DV, sin DV) | 0.996 | Proved |
| Absorption | Michaelis-Menten, Vmax/Km | 0.98 | Proved |
| Supernovae (zr) | piecewise quadratic (threshold at x=5.46) — flagged "local approximation," not a universal law | 0.9818 | Proved (local) |
| Bode | sentinel n=−1000 detected and auto-excluded; exp(n)+offset | 0.9622 | Proved (engine improved) |
| Rydberg | target = −16.208 − 0.9995·log(|1/n₁²−1/n₂²|) | 1.0000 | Proved (engine improved) |
| Planck | Wien regime: target = −91.2 + 2.284·log(ν) − 4.787×10⁻¹¹·ν/T (coefficient ≈ −h/k) | 0.9999 | Proved (engine improved) |
| Hubble | non-univalued data detected (mix of subpopulations) — real astrophysical scatter, not a bug | — | Abstention |
Black-box track (12 real sets, no known law): 0 forced fits. Across every set carried through (BNG_lowbwt, BNG_echoMonths, USCrime, pm10, cloud, SWD, fri_c0/c2, visualizing_environmental...), the engine either cleanly abstained or reported a low R² without dressing it up as a law. That's the opposite of a classic symbolic-regression benchmark, which always reports the best fit found — even when nothing physical justifies it.
The engine was improved LIVE while building this page: Rydberg, Bode and Planck were abstaining for two code reasons, diagnosed then fixed — (1) any power/exponential family requires target>0, so a uniformly negative target (often already log(something positive)) never passed through that family; (2) an extreme sentinel value in an input column (Bode's −1000, a code for "minus infinity") defeated the existing outlier detector, which reads the residual in Y, not the raw value in X. Two additive resolvers (tools/logscale_rescue_tools.py) were written, tested alone, then wired as automatic fallbacks into discover_law's cascade — zero regression confirmed on the 27 cases of benchmark_motor.py (24/27 unchanged, before and after). The three laws above were then reproved by the engine alone, with no hint, via mouhn --file. Honest side effect: a pre-existing bug was also found in _outlier_offer (its text check fails because "NO LAW PROVED" contains "LAW PROVED" as a substring) — flagged, not yet fixed. A second real bug (ZeroDivisionError in discover_trig_ratio_law, triggered by 192_vineyard) is also flagged without a fix. None of this was pushed to the repo: the changes live in the local working tree.
Three scenarios grounded in real LaBRI research (CNRS/Inria/Bordeaux INP).
The "Mobility and Intelligent Transport" chair (Mohamed Mosbah, LaBRI, since 2019) studies human movement via campus GPS. No public LaBRI dataset exists — these three scenarios reproduce mobility laws real and measured in the literature, at the realistic scale of a campus collection (small N, real noise), run live locally.
Power law of human displacement, P(Δr) ~ Δr−β, β measured ~1.75 in the paper. On a campus sample (N=28, realistic sampling noise): exponent recovered −1.712, R² held-out 0.899.
Sub-linear growth of visited places, S(t) ~ tμ, μ measured ~0.6, hidden among 15 columns of GPS telemetry (battery, satellites, signal...). The engine found the right pair alone among 105 possible combinations: μ = 0.58 — but flags LOW confidence despite the correct exponent (the near-flat tail of a sub-linear law makes the extrapolation R² unstable even when the fit is good — honesty, not a flaw).
Device battery vs. GPS signal strength — no real causal law (independent by construction). The engine abstains: "not reporting a constant/exponent to avoid inventing a law."
Run locally on 2026-08-04, demo_labri_bordeaux.py — zero external dependency, zero network, calls tools.dispatch() directly, the same code path as the real agent.
Three proofs, one discipline: never present as proven what isn't.
Every number in this dossier is reproducible: same code, same data, same result — and it can be run in front of you. Model: Qwen 3.6. Discovery tool: mouhn_agentics, the engine that produced every line of this dossier.