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.
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
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
verifiedfield, 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.
- Is it right that a prose-only edit changes the fingerprint? A claim author may want a prose-only change to be free.
- What goes wrong if
provenancewere included? What ifhuman_statementwere excluded? - 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.