How far can noise climb before the law is lost? Does it rediscover laws already published, on data it has never seen? And what does it do when the law doesn't exist?
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 (next section). Live measurement 2026-08-03, mouhn_agentics/benchmark_motor.py.
Test law y = 4.9x², multiplicative noise up to 120% — noise exceeding the signal itself. One draw per cell, fixed seed.
recovered error (%) vs. noise level — both series measured, none interpolated
| Noise level | 2,000 points | 20,000 points |
|---|---|---|
| 20% noise | 0.5% Proved | 0.1% Proved |
| 60% noise | 2.4% Proved | 0.2% Proved |
| 120% noise | 2.2% Proved | 0.1% Proved |
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, 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.
Three independent public datasets, no link to the engine's law catalog — only numeric columns and a target. This one is checkable by eye: the 8 real planets, plotted.
log(period) vs. log(distance), Mercury → Neptune — public values, zero LLM in reading the data
| 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). No clean law between K and Hv in this subset — abstention, not invention. Rest of table: measured 2026-07-18/21, commit c3d259e (Kepler and G→Hv reconfirmed on current HEAD, R²=0.9926 for G→Hv).
14 two-variable differential-equation systems, the "Strogatz" subset of SRBench — the community reference for comparing law-discovery engines.
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.
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.
Exactly recovered, e.g.: 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).
21,263 real superconductors (UCI Superconductivity), 81 properties + Tc (0–185K). 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 in the exact elements of the cuprates — found unsupervised:
— literally the cuprates (HgBaCaCuO, TlBaCaCuO, BiSrCaCuO). Zn is the classic cuprate poison, rediscovered from data alone.
"It's not a new material, it's a mixture of known elements" — additive model → +element pairs, a real gain of +0.140 in R².
Synergistic pairs: Cu+Ba, Cu+Bi, Cu+Hg, Cu+Tl — the cuprates, brick by brick. Anti-synergy: Cu+Zn, Y+Zn.
Generative kNN search on composition: R²=0.917, top candidates = HgBaCaCuO variants (~135K, the known record). Measured 2026-07-23.
UCI Yacht Hydrodynamics: 308 real measurements from a towing tank (Delft), residuary resistance of a sailing-yacht hull. No formula given — only columns and a target, tested live 2026-08-04.
R(Fr) = Fr^3.922 · e^(−2.78·Fr) / (1 − Fr/0.497), plotted directly from the recovered equation
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 denominator places a pole at Fr ≈ 0.497, almost exactly the theoretical "hull speed" limit where wave resistance diverges.
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 dataset, increasing synthetic multiplicative noise added to the real target. Tested live 2026-08-04.
at +30% the engine already abstains — correlation exists (0.98) but no single-variable form holds cleanly
| 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 applied to a domain never seen before that day. Tested live, sessions c9082/c9083/c9084.
Every result in this dossier ran live on my own machine while this site was being built — not a generic cloud API.
mouhn --file yacht.csv "..."c9081 (clean law) · c9082/c9083/c9084 (noise sweep)The noise-robustness mechanism isn't a marketing promise: it's discover_law_noise_guided in the source, which bins the points and averages each bin's noise (falls as 1/√n) — but with 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.
SRBench 2025 (the benchmark's current edition) provides 12 "first-principles" sets and 12 "black-box" sets, via PMLB. Tested live on this machine, 2026-08-04, one at a time.
The one hollow dot is Hubble: non-univalued data detected (real astrophysical scatter, mixed subpopulations) — reported honestly, not forced.
Across all 11 real sets 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 — the opposite of a classic symbolic-regression benchmark, which always reports the best fit found, even when nothing physical justifies it.
| Dataset | What was found | R² held-out | Verdict |
|---|---|---|---|
| Kepler | y = 363.99 · a^1.5 | 1.0000 | Proved |
| Newtongravitation | log-linear form (literal G·m₁m₂/r² refuted at held-out) | ≈0.999 | Proved (structure) |
| Ideal gas | log-linear; literal PV=nRT refuted | 0.9992 | Proved (structure) |
| Leavittperiod-luminosity | initial power form REFUSED at held-out; rational form kept | — | 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" | 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 — real scatter, not a bug | — | Abstention |
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.
The "Mobility and Intelligent Transport" chair (Mohamed Mosbah, LaBRI, since 2019) studies human movement via campus GPS. These three scenarios reproduce mobility laws real and measured in the literature, at campus scale, run live locally.
exponent −1.712 recovered on a campus sample (N=28) vs. −1.75 published (Gonzalez, Hidalgo & Barabási, Nature 2008) — R² held-out 0.899
Sub-linear growth of visited places, S(t) ~ t^μ, μ measured ~0.6, hidden among 15 columns of GPS telemetry. The engine found the right pair alone among 105 possible combinations: μ = 0.58 — flagged LOW confidence despite the correct exponent (the near-flat tail makes 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.
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.