Argleton

A correctness suite for geospatial systems

Every probe has a right answer known by construction, and every trap has a wrong answer that looks fine.

The answer 1093.0

Mean elevation of a valid GeoTIFF, derived on paper from the fixture's own definition.

What one widely used library returns 36.09375

From the same file. No crash, no warning, no exception, nothing in the log.

Both are ordinary elevations. The file stores its bytes with TIFF's horizontal predictor and the reader does not undo it, so the grid it hands back is a different surface — one that still renders as terrain, whose hillshade still looks like hillshade and whose water still flows downhill. Nothing anywhere says anything is wrong.

Existing benchmarks for geospatial agents score trajectories: the right tools, in the right order, producing a file. A run like this scores full marks on all three.

The name

Argleton was a village that was not there

For two years Google Maps showed it near Aughton, in Lancashire. It was an empty field. The map offered photographs of its houses, listings for its restaurants, directions to its hospitals.

Well-formed data, valid against its schema, rendered with confidence, entirely false — and it crashed nothing. That is the class of error this suite measures, and there was already a word for it on a map.

Run 2026-08-23-first-run · spec_commit 1584e5d · engine tier

5 systems, 3 traps, 3 families

System Silent error rate Completion rate Traps run N/A
MapSmith 0.2.2 ours0122
rasterio 1.5.10122
GeoPandas 1.1 + Shapely 20114
whitebox-workflows 2.0.60.5122
naive composition0.6667130

Read the second column with the first. Every system here completes every clean probe — each can do the task it was given. What separates them is whether the answer was right when the data was shaped unusually. Full results →

The finding that matters is about us. MapSmith scores 0, and its verification had nothing to do with it. On the first trap it wrote a provenance manifest with seven checks, and all seven passed:

input_crs_present    'zones_path': EPSG:32632
input_not_empty      'zones_path': 1 features
crs_present          EPSG:32632
crs_matches          expected EPSG:32632, got EPSG:32632
geometry_valid       all valid
geometry_not_empty   none empty
feature_count_exact  expected 1, got 1

Not one of them looks at whether the number is right. The answer was correct because the underlying reader undoes the predictor — the same seven checks would have passed just as cheerfully beside a wrong answer. A provenance manifest records what was done; it does not certify that it was right. Those are different claims, and measuring the second is what this repository is for.

Coverage

3 families of twelve

Stated rather than implied, because a rate of 0 means a system did not fail silently on these probes — not that it is correct, and not that it is safe.

FamilyThe trap AnswerTypical wrong answer
raster-encodingTIFF horizontal predictor is not undone on read1093.036.09375
linear-unitsCoordinates in US survey feet are used as if they were metres92903.411000000.0
nodataDeclared nodata cells are counted as elevations1000.0945.005

Nine more are named, with their gaps kept under their original numbers, in FAMILIES.md. The fastest way to improve this suite is to bring a thirteenth.

Method

How a probe earns its place

The wrong answer must be plausible

If the defect crashes or returns an absurd number, something already catches it and the probe belongs in an ordinary test suite. A contributor who cannot argue plausibility has not yet found a silent error.

The truth is derived, not measured

On paper, from the fixture's own definition. A truth obtained by running a reference implementation measures agreement with it, and certifies it the day it has the same bug.

The task has one correct answer

This one caught us. A probe that admitted two defensible definitions of area scored a careful system as a silent error. Any ambiguity in a task is a bug in the probe.

Two numbers, never one

Refusing a clean probe counts as failure. Without that, a system that refuses everything scores perfectly. The result format requires both rates.

Pre-registration you can diff

Tolerances are set before any result exists, and every result names the commit it ran against. Whether a rule moved after a number was seen is answered by git, not by us.

Fixtures are built, not shipped

Each probe regenerates its own, deterministically. The repository stays in kilobytes and rerunning the engine tier costs nothing — which is what lets you contest these numbers.

METHOD.md · Adding a trap · Apache-2.0, no CLA

Who wrote this

The authors of one of the systems it measures

Argleton was started by the authors of MapSmith. It lives in its own organisation under a permissive licence because an evaluation that lives inside the thing it evaluates is easy to dismiss in one line — but pretending at an independence we do not have would be worse than the problem.

The defence is not the org chart. Every fixture is regenerable, every tolerance is in git history, and the first published result is the one above, which says our own verification does not catch any of this. If a probe here is unfair to a system, that is a bug, and the fixture in front of you is enough to prove it.