← Adversarial Math From First Principles

The Claim Before the Proof

The engine's primary object is a versioned claim, not a proof: what a claim contract contains, how fingerprints bind evidence to exact claim versions, and why one sentence can be three different claims.

“Lorentz boosts preserve the interval.” Is that true?

It depends on which sentence you mean.

  • If $\gamma$ is any real number with $\gamma^2(1-v^2)=1$, yes, by a three-line expansion.
  • If $\gamma$ is defined as $1/\sqrt{1-v^2}$, it takes an extra argument, and it needs $\lvert v\rvert<1$ so that the square root is real and nonzero.
  • If “preserve” means that the physical world obeys the formula, no theorem settles it.

One sentence, three claims. A tool that reports “verified” for the sentence has told you nothing until you know which claim it checked. The design record behind the engine puts it plainly: the same sentence “can acquire materially different meanings when translated to SymPy, Z3, Lean, Rocq, or Isabelle,” and “a proof may also be correct under a stronger assumption than the prose disclosed.”

So the engine’s primary object is not a proof. It is a versioned claim: a record that says exactly which statement is meant, so that every proof, solver run and counterexample can be attached to that statement and no other. This chapter introduces that record and the fingerprint that ties evidence to it. Every later chapter depends on both.

The sentence ‘Lorentz boosts preserve the interval’ splits into three claims. A, the algebraic reading: gamma is any real number with gamma squared times one minus v squared equal to one, and the interval is preserved; checked by the Lean and Rocq kernels. B, the physical reading: gamma is one over the square root of one minus v squared with the absolute value of v below one, a theorem about the real-number model checked in both kernels. C, the empirical reading, drawn dashed in red: the physical world obeys the model, which no theorem settles. A separate box, the gamma bridge, is marked as a separate claim, not a reading; it turns reading B’s definition into reading A’s hypothesis.

One sentence, three claims. The gamma bridge is a fourth, separate claim that links the first two; the empirical reading stays outside every proof.

Why the split matters

Expanding the boost $t'=\gamma(t-vx)$, $x'=\gamma(x-vt)$ gives

$$ t'^2 - x'^2 = \gamma^2(1-v^2)\,(t^2 - x^2). $$
So the algebraic claim needs exactly one fact about $\gamma$, namely $\gamma^2(1-v^2)=1$. The physical claim has to *derive* that fact from a definition plus a side condition. The two are connected by a separate theorem, the gamma bridge, and the engine keeps them as separate claims so that each can be verified, refuted or left open on its own. In the design record's words, "MATH01 separates the physical Lorentz claim, the square-root-to-algebraic gamma bridge, the algebraic interval theorem, and the deliberately false control." MATH01 is the engine's first case study, and the book follows it throughout.

These are its claims:

Claim What it says
lorentz-interval-invariance-1d-algebraic@1.0.0 For real $t, x, v, \gamma$ with $\gamma^2(1-v^2)=1$, the boost preserves $t^2-x^2$.
lorentz-interval-invariance-1d-physical@1.0.0 The same, with $\gamma = 1/\sqrt{1-v^2}$ and $\lvert v\rvert<1$.
lorentz-interval-invariance-1d-physical@1.1.0 The same claim, revised so that $\gamma$ is quantified explicitly.
lorentz-gamma-relation-1d@1.0.0 and @1.1.0 $\gamma = 1/\sqrt{1-v^2}$ implies $\gamma^2(1-v^2)=1$.
incorrect-transform-preserves-interval@1.0.0 The shear $t'=t$, $x'=x+vt$ preserves $t^2-x^2$. This one is false, on purpose.

Each row is a separate object with its own evidence. The opening sentence has been split into the first three, and the version numbers already hint at the second idea of this chapter: when a claim’s meaning changes, it becomes a new version, and evidence for the old version does not carry over.

What a claim contains

A claim is a frozen record (Claim, in models.py). Its fields, in the order they matter:

Field Purpose
claim_id, version Identity. A change in meaning gets a new version.
human_statement The prose a reader sees. Never the thing checked.
canonical_formulation The same statement with every quantifier explicit.
domain, structures Where the variables live (here, the reals).
definitions Named terms such as t' = γ(t − vx) and interval = t² − x².
assumptions Each with an ID, a canonical form and a role (Chapter 2).
quantifiers forall or exists, the variable, its domain and restrictions.
dependencies, sources What this claim rests on, and where it came from.
formalizations Declared bindings to SymPy, Z3, Lean and Rocq.
unresolved_obligations, limitations What is not shown.
provenance Who or what produced the record.

The record forbids unknown fields and checks its internal references when it loads. An assumption that cites an unknown source, or a formalization that cites an unknown assumption, fails to load.

The formalizations field deserves a word now, because it is easy to over-read. Each binding states the quantifiers, assumption IDs, units and conventions one tool will use, and exposes a hash over them (contract_signature()). Two bindings with the same signature are declared aligned. The code’s own documentation is careful here: the binding “is evidence about intent, not a proof of semantic equivalence.” Chapter 15 is about the gap between those two things.

The fingerprint

How does a proof know which claim it proves? Through a hash.

Claim.fingerprint is the SHA-256 of the claim’s canonical JSON, with provenance left out. Every EvidenceResult stores the claim ID, the version and the fingerprint it was produced for, and assess_claim counts only evidence whose three values all match. Evidence from any other version is stale by default.

Here is what happens to the fingerprint of the committed claim lorentz-interval-invariance-1d-algebraic@1.0.0 under small edits (executed ad hoc, not recorded in an evidence bundle):

Edit Fingerprint (first 16 hex)
none 5493a872385fddc2
clear the provenance list 5493a872385fddc2 (unchanged)
reword human_statement (“preserves” to “keeps”) ae129bab82f2bbf3
change (1-v^2) to (1+v^2) in canonical_formulation 5419514342e60fb5

Two consequences follow. A prose edit counts as a change, because the engine cannot tell a harmless rewording from a changed meaning. And the fingerprint protects against silent drift: an old proof cannot be attached to a revised claim without someone noticing, because the hashes disagree.

What it does not protect against is a wrong claim. The fingerprint says that evidence and claim match. It says nothing about whether the claim says what you meant. Getting that right is the work of the next two chapters.

What this establishes

This chapter presents a data model, not a proof, so there is no derivation for a human to review. The behaviours described (the fingerprint excludes provenance and includes the prose) were observed by executing the model, not by reading its tests.

A claim contract is bookkeeping. It makes disagreement between tools visible; it does not make anything true. In particular it does not say that the physical claim describes nature. That is a separate question, taken up in Chapter 4.

The design record also lists the alternatives it rejected:

  • a single boolean verified field, judged “too coarse”;
  • majority voting among tools, because “a mistranslation can make every tool agree on the wrong proposition”;
  • letting an AI judge its own proof text.

Try it yourself

uv sync --all-groups --locked
uv run pytest tests/test_models.py

Seeded error. Edit any assumption’s canonical_formulation in a claim file and re-run the report consistency check. Stored evidence should be reported as stale, not silently reused. (This edition did not run that check; confirm it before relying on it.)

Exercise. Expand $\gamma^2(t-vx)^2 - \gamma^2(x-vt)^2$ by hand and confirm that it equals $\gamma^2(1-v^2)(t^2-x^2)$. Which terms cancel?

Open questions.

  1. Is it right that a prose-only edit changes the fingerprint? A claim author may want a prose-only change to be free.
  2. What goes wrong if provenance were included? What if human_statement were excluded?
  3. Can two claims with different canonical formulations still mean the same thing? The fingerprint says they differ; only a proof of equivalence says otherwise.

Evidence record

Claim ID and version Fingerprint (first 16 hex)
lorentz-interval-invariance-1d-algebraic@1.0.0 5493a872385fddc2
lorentz-interval-invariance-1d-physical@1.0.0 acf0193ab4b17e25
lorentz-interval-invariance-1d-physical@1.1.0 85c55b6abc027519
lorentz-gamma-relation-1d@1.0.0 / @1.1.0 bb601c71a98a5ad9 / 412d37941a112762
incorrect-transform-preserves-interval@1.0.0 acd1fd6ee8c17a89

The accepted R2 report records, for the first three claims, the statuses formally_verified (algebraic, and gamma at 1.0.0) and computation_verified_within_stated_domain (physical at 1.0.0). It records no kernel proof of the physical claim at 1.0.0, and says why: the composition was an open obligation at the time. Version 1.1.0 of the physical claim, with $\gamma$ quantified explicitly, is the claim after the R4 revision. Chapter 20 has the full table.

Sources

The design rationale is ADR 0001 — Evidence-first, versioned claim contracts (accepted 2026-10-22). The claim model is in src/math_engine/models.py.