argleton 0.3.0__tar.gz → 0.5.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {argleton-0.3.0 → argleton-0.5.0}/.github/workflows/ci.yml +24 -2
- argleton-0.5.0/.zenodo.json +19 -0
- argleton-0.5.0/CHANGELOG.md +111 -0
- {argleton-0.3.0 → argleton-0.5.0}/CITATION.cff +7 -2
- {argleton-0.3.0 → argleton-0.5.0}/PKG-INFO +112 -36
- {argleton-0.3.0 → argleton-0.5.0}/README.md +111 -35
- {argleton-0.3.0 → argleton-0.5.0}/adapters/engine_geopandas.py +117 -28
- {argleton-0.3.0 → argleton-0.5.0}/adapters/engine_naive.py +125 -18
- argleton-0.5.0/adapters/engine_qgis.py +181 -0
- {argleton-0.3.0 → argleton-0.5.0}/adapters/engine_rasterio.py +61 -0
- argleton-0.5.0/adapters/engine_whitebox.py +80 -0
- argleton-0.5.0/adapters/gis_mcp.py +541 -0
- {argleton-0.3.0 → argleton-0.5.0}/adapters/mapsmith.py +200 -0
- argleton-0.5.0/adapters/qgis_agent_mcp.py +241 -0
- argleton-0.5.0/adapters/qgis_chains.py +631 -0
- argleton-0.5.0/adapters/qgis_mcp_plugin.py +151 -0
- argleton-0.5.0/argleton/__init__.py +38 -0
- {argleton-0.3.0 → argleton-0.5.0}/argleton/run.py +84 -19
- argleton-0.5.0/clean/c024-pixel-is-area/build.py +82 -0
- argleton-0.5.0/clean/c024-pixel-is-area/probe.toml +52 -0
- argleton-0.5.0/clean/c025-single-hemisphere-zone/build.py +95 -0
- argleton-0.5.0/clean/c025-single-hemisphere-zone/probe.toml +46 -0
- argleton-0.5.0/clean/c026-north-up-grid/build.py +64 -0
- argleton-0.5.0/clean/c026-north-up-grid/probe.toml +42 -0
- argleton-0.5.0/clean/c027-lines-only/build.py +60 -0
- argleton-0.5.0/clean/c027-lines-only/probe.toml +44 -0
- argleton-0.5.0/clean/c028-projected-field/build.py +57 -0
- argleton-0.5.0/clean/c028-projected-field/probe.toml +48 -0
- argleton-0.5.0/clean/c029-coincident-boundaries/build.py +49 -0
- argleton-0.5.0/clean/c029-coincident-boundaries/probe.toml +49 -0
- argleton-0.5.0/clean/c030-single-georeferencing/build.py +36 -0
- argleton-0.5.0/clean/c030-single-georeferencing/probe.toml +39 -0
- argleton-0.5.0/clean/c031-hole-wound-as-hole/README.md +16 -0
- argleton-0.5.0/clean/c031-hole-wound-as-hole/build.py +54 -0
- argleton-0.5.0/clean/c031-hole-wound-as-hole/probe.toml +44 -0
- {argleton-0.3.0 → argleton-0.5.0}/docs/FAMILIES.md +134 -102
- {argleton-0.3.0 → argleton-0.5.0}/docs/METHOD.md +21 -0
- {argleton-0.3.0 → argleton-0.5.0}/pyproject.toml +1 -1
- argleton-0.5.0/results/2026-08-30-all-families/adapters-geopandas.json +719 -0
- argleton-0.5.0/results/2026-08-30-all-families/adapters-mapsmith.json +718 -0
- argleton-0.5.0/results/2026-08-30-all-families/adapters-naive.json +718 -0
- argleton-0.5.0/results/2026-08-30-all-families/adapters-rasterio.json +718 -0
- argleton-0.5.0/results/2026-08-30-all-families/adapters-whitebox.json +719 -0
- argleton-0.5.0/results/2026-08-30-antimeridian/adapters-geopandas.json +623 -0
- argleton-0.5.0/results/2026-08-30-antimeridian/adapters-mapsmith.json +622 -0
- argleton-0.5.0/results/2026-08-30-antimeridian/adapters-naive.json +622 -0
- argleton-0.5.0/results/2026-08-30-antimeridian/adapters-rasterio.json +622 -0
- argleton-0.5.0/results/2026-08-30-antimeridian/adapters-whitebox.json +623 -0
- argleton-0.5.0/results/2026-08-30-grid-registration/adapters-geopandas.json +599 -0
- argleton-0.5.0/results/2026-08-30-grid-registration/adapters-mapsmith.json +598 -0
- argleton-0.5.0/results/2026-08-30-grid-registration/adapters-naive.json +598 -0
- argleton-0.5.0/results/2026-08-30-grid-registration/adapters-rasterio.json +598 -0
- argleton-0.5.0/results/2026-08-30-grid-registration/adapters-whitebox.json +599 -0
- argleton-0.5.0/results/2026-09-02-ring-role/adapters-geopandas.json +767 -0
- argleton-0.5.0/results/2026-09-02-ring-role/adapters-mapsmith.json +767 -0
- argleton-0.5.0/results/2026-09-02-ring-role/adapters-naive.json +766 -0
- argleton-0.5.0/results/2026-09-02-ring-role/adapters-rasterio.json +767 -0
- argleton-0.5.0/results/2026-09-02-ring-role/adapters-whitebox.json +767 -0
- argleton-0.5.0/results/2026-09-02-thirty-traps/adapters-geopandas.json +743 -0
- argleton-0.5.0/results/2026-09-02-thirty-traps/adapters-mapsmith.json +743 -0
- argleton-0.5.0/results/2026-09-02-thirty-traps/adapters-naive.json +742 -0
- argleton-0.5.0/results/2026-09-02-thirty-traps/adapters-rasterio.json +743 -0
- argleton-0.5.0/results/2026-09-02-thirty-traps/adapters-whitebox.json +743 -0
- argleton-0.5.0/results/2026-09-10-gis-mcp/adapters-geopandas.json +767 -0
- argleton-0.5.0/results/2026-09-10-gis-mcp/adapters-gis-mcp.json +767 -0
- argleton-0.5.0/results/2026-09-10-gis-mcp/adapters-mapsmith.json +767 -0
- argleton-0.5.0/results/2026-09-10-gis-mcp/adapters-naive.json +766 -0
- argleton-0.5.0/results/2026-09-10-gis-mcp/adapters-rasterio.json +767 -0
- argleton-0.5.0/results/2026-09-10-gis-mcp/adapters-whitebox.json +767 -0
- argleton-0.5.0/results/2026-09-15-qgis-three-ways/adapters-geopandas.json +767 -0
- argleton-0.5.0/results/2026-09-15-qgis-three-ways/adapters-gis-mcp.json +767 -0
- argleton-0.5.0/results/2026-09-15-qgis-three-ways/adapters-mapsmith.json +767 -0
- argleton-0.5.0/results/2026-09-15-qgis-three-ways/adapters-naive.json +766 -0
- argleton-0.5.0/results/2026-09-15-qgis-three-ways/adapters-qgis-agent-mcp.json +768 -0
- argleton-0.5.0/results/2026-09-15-qgis-three-ways/adapters-qgis-mcp.json +768 -0
- argleton-0.5.0/results/2026-09-15-qgis-three-ways/adapters-qgis.json +767 -0
- argleton-0.5.0/results/2026-09-15-qgis-three-ways/adapters-rasterio.json +767 -0
- argleton-0.5.0/results/2026-09-15-qgis-three-ways/adapters-whitebox.json +767 -0
- argleton-0.5.0/results/LATEST +1 -0
- argleton-0.5.0/results/README.md +1082 -0
- {argleton-0.3.0 → argleton-0.5.0}/site/build.py +390 -246
- {argleton-0.3.0 → argleton-0.5.0}/site/index.template.html +383 -366
- argleton-0.5.0/tests/test_showcase.py +1271 -0
- argleton-0.5.0/traps/024-pixel-is-point/README.md +111 -0
- argleton-0.5.0/traps/024-pixel-is-point/build.py +78 -0
- argleton-0.5.0/traps/024-pixel-is-point/probe.toml +137 -0
- argleton-0.5.0/traps/025-antimeridian-zone/README.md +92 -0
- argleton-0.5.0/traps/025-antimeridian-zone/build.py +108 -0
- argleton-0.5.0/traps/025-antimeridian-zone/probe.toml +134 -0
- argleton-0.5.0/traps/026-south-up-grid/README.md +101 -0
- argleton-0.5.0/traps/026-south-up-grid/build.py +83 -0
- argleton-0.5.0/traps/026-south-up-grid/probe.toml +129 -0
- argleton-0.5.0/traps/027-mixed-geometry/README.md +60 -0
- argleton-0.5.0/traps/027-mixed-geometry/build.py +79 -0
- argleton-0.5.0/traps/027-mixed-geometry/probe.toml +107 -0
- argleton-0.5.0/traps/028-degrees-as-metres/README.md +82 -0
- argleton-0.5.0/traps/028-degrees-as-metres/build.py +71 -0
- argleton-0.5.0/traps/028-degrees-as-metres/probe.toml +122 -0
- argleton-0.5.0/traps/029-difference-order/README.md +66 -0
- argleton-0.5.0/traps/029-difference-order/build.py +61 -0
- argleton-0.5.0/traps/029-difference-order/probe.toml +112 -0
- argleton-0.5.0/traps/030-sidecar-georeferencing/README.md +79 -0
- argleton-0.5.0/traps/030-sidecar-georeferencing/build.py +93 -0
- argleton-0.5.0/traps/030-sidecar-georeferencing/probe.toml +95 -0
- argleton-0.5.0/traps/031-hole-wound-as-shell/README.md +70 -0
- argleton-0.5.0/traps/031-hole-wound-as-shell/build.py +99 -0
- argleton-0.5.0/traps/031-hole-wound-as-shell/probe.toml +108 -0
- argleton-0.3.0/adapters/engine_whitebox.py +0 -34
- argleton-0.3.0/adapters/gis_mcp.py +0 -220
- argleton-0.3.0/argleton/__init__.py +0 -3
- argleton-0.3.0/results/LATEST +0 -1
- argleton-0.3.0/results/README.md +0 -599
- argleton-0.3.0/tests/test_showcase.py +0 -458
- {argleton-0.3.0 → argleton-0.5.0}/.gitattributes +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/.github/workflows/pages.yml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/.gitignore +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/LICENSE +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/adapters/__init__.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/argleton/model.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/argleton/published.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/argleton/score.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c001-raster-mean/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c001-raster-mean/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c002-projected-area/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c002-projected-area/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c003-raster-mean-nodata/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c003-raster-mean-nodata/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c004-points-in-polygon/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c004-points-in-polygon/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c005-polygon-area/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c005-polygon-area/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c006-named-layer/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c006-named-layer/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c007-distance-in-metres/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c007-distance-in-metres/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c008-equal-area-crs/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c008-equal-area-crs/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c009-native-resolution-classes/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c009-native-resolution-classes/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c010-physical-values/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c010-physical-values/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c011-solid-parcel/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c011-solid-parcel/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c012-disjoint-concessions/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c012-disjoint-concessions/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c013-flat-pipeline/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c013-flat-pipeline/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c014-convex-parcel/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c014-convex-parcel/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c015-wells-off-the-seam/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c015-wells-off-the-seam/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c016-decimal-degrees/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c016-decimal-degrees/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c017-equal-populations/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c017-equal-populations/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c018-plain-keys/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c018-plain-keys/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c019-fully-contained/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c019-fully-contained/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c020-one-owner-each/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c020-one-owner-each/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c021-greenwich-variant/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c021-greenwich-variant/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c022-two-gauges/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c022-two-gauges/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c023-longitude-first/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/clean/c023-longitude-first/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/docs/ADDING-A-TRAP.md +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-23-first-run/adapters-mapsmith.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-23-first-run/engine-geopandas.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-23-first-run/engine-naive.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-23-first-run/engine-rasterio.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-23-first-run/engine-whitebox.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-24-five-families/adapters-mapsmith.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-24-five-families/engine-geopandas.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-24-five-families/engine-naive.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-24-five-families/engine-rasterio.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-24-five-families/engine-whitebox.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-25-eight-families/adapters-mapsmith.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-25-eight-families/engine-geopandas.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-25-eight-families/engine-naive.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-25-eight-families/engine-rasterio.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-25-eight-families/engine-whitebox.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-25-six-families/adapters-mapsmith.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-25-six-families/engine-geopandas.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-25-six-families/engine-naive.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-25-six-families/engine-rasterio.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-25-six-families/engine-whitebox.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-26-eighteen-families/adapters-geopandas.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-26-eighteen-families/adapters-mapsmith.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-26-eighteen-families/adapters-naive.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-26-eighteen-families/adapters-rasterio.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-26-eighteen-families/adapters-whitebox.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-26-nine-families/adapters-geopandas.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-26-nine-families/adapters-mapsmith.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-26-nine-families/adapters-naive.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-26-nine-families/adapters-rasterio.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-26-nine-families/adapters-whitebox.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-26-nineteen-families/adapters-geopandas.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-26-nineteen-families/adapters-mapsmith.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-26-nineteen-families/adapters-naive.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-26-nineteen-families/adapters-rasterio.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-26-nineteen-families/adapters-whitebox.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-26-ten-families/adapters-geopandas.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-26-ten-families/adapters-mapsmith.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-26-ten-families/adapters-naive.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-26-ten-families/adapters-rasterio.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-26-ten-families/adapters-whitebox.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-27-datum-shift-fixed/adapters-geopandas.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-27-datum-shift-fixed/adapters-mapsmith.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-27-datum-shift-fixed/adapters-naive.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-27-datum-shift-fixed/adapters-rasterio.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-27-datum-shift-fixed/adapters-whitebox.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-28-thiessen-pairing/adapters-geopandas.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-28-thiessen-pairing/adapters-mapsmith.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-28-thiessen-pairing/adapters-naive.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-28-thiessen-pairing/adapters-rasterio.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-28-thiessen-pairing/adapters-whitebox.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-28-timings/adapters-geopandas.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-28-timings/adapters-mapsmith.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-28-timings/adapters-naive.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-28-timings/adapters-rasterio.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-28-timings/adapters-whitebox.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-29-axis-order/adapters-geopandas.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-29-axis-order/adapters-mapsmith.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-29-axis-order/adapters-naive.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-29-axis-order/adapters-rasterio.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/results/2026-08-29-axis-order/adapters-whitebox.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/schema/probe.schema.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/schema/result.schema.json +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/tests/test_contracts.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/001-tiff-predictor/README.md +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/001-tiff-predictor/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/001-tiff-predictor/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/002-feet-as-metres/README.md +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/002-feet-as-metres/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/002-feet-as-metres/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/003-nodata-in-statistics/README.md +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/003-nodata-in-statistics/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/003-nodata-in-statistics/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/004-mismatched-crs-join/README.md +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/004-mismatched-crs-join/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/004-mismatched-crs-join/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/005-bowtie-area/README.md +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/005-bowtie-area/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/005-bowtie-area/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/006-default-layer/README.md +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/006-default-layer/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/006-default-layer/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/007-buffer-in-degrees/README.md +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/007-buffer-in-degrees/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/007-buffer-in-degrees/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/008-web-mercator-area/README.md +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/008-web-mercator-area/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/008-web-mercator-area/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/009-resampled-classes/README.md +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/009-resampled-classes/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/009-resampled-classes/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/010-scale-offset/README.md +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/010-scale-offset/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/010-scale-offset/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/011-polygon-holes/README.md +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/011-polygon-holes/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/011-polygon-holes/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/012-double-counting/README.md +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/012-double-counting/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/012-double-counting/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/013-z-dimension/README.md +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/013-z-dimension/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/013-z-dimension/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/014-centroid-outside/README.md +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/014-centroid-outside/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/014-centroid-outside/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/015-boundary-semantics/README.md +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/015-boundary-semantics/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/015-boundary-semantics/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/016-coordinate-parsing/README.md +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/016-coordinate-parsing/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/016-coordinate-parsing/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/017-aggregation-weighting/README.md +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/017-aggregation-weighting/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/017-aggregation-weighting/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/018-join-key-typing/README.md +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/018-join-key-typing/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/018-join-key-typing/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/019-partial-overlap/README.md +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/019-partial-overlap/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/019-partial-overlap/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/020-join-cardinality/README.md +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/020-join-cardinality/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/020-join-cardinality/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/021-ballpark-datum/README.md +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/021-ballpark-datum/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/021-ballpark-datum/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/022-thiessen-pairing/README.md +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/022-thiessen-pairing/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/022-thiessen-pairing/probe.toml +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/023-axis-order/README.md +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/023-axis-order/build.py +0 -0
- {argleton-0.3.0 → argleton-0.5.0}/traps/023-axis-order/probe.toml +0 -0
|
@@ -16,6 +16,12 @@ jobs:
|
|
|
16
16
|
python: ["3.11", "3.13"]
|
|
17
17
|
steps:
|
|
18
18
|
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
|
19
|
+
with:
|
|
20
|
+
# Tags, because one showcase test checks the trap count the README
|
|
21
|
+
# attributes to a release against the tag that release was cut from.
|
|
22
|
+
# A shallow checkout has no tags, and the test would skip in exactly
|
|
23
|
+
# the place it is meant to run.
|
|
24
|
+
fetch-depth: 0
|
|
19
25
|
- uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0
|
|
20
26
|
with:
|
|
21
27
|
python-version: ${{ matrix.python }}
|
|
@@ -76,6 +82,22 @@ jobs:
|
|
|
76
82
|
# point — a trap that stops catching its own naive adapter, or one
|
|
77
83
|
# that starts catching a case it should not, has changed what it
|
|
78
84
|
# measures, and that must be a decision rather than a surprise.
|
|
79
|
-
# 0.
|
|
80
|
-
|
|
85
|
+
# 0.9355 = 29 of 31 traps caught. TWO still pass, unchanged: 001,
|
|
86
|
+
# where rasterio undoes the predictor on the naive adapter's behalf,
|
|
87
|
+
# and 026, where `src.res` reports the cell size faithfully whichever
|
|
88
|
+
# way the rows run — so a plain numpy gradient is more faithful to the
|
|
89
|
+
# geotransform than a specialised terrain engine is. Moved from
|
|
90
|
+
# 0.9333 on 2026-09-02 when trap 031 added family 29 — a shapefile
|
|
91
|
+
# whose inner ring is wound like its outer one, which the naive
|
|
92
|
+
# composition reads as two shells and adds — so both numerator and
|
|
93
|
+
# denominator went up by one. Before that 0.931 on 2026-08-31 when
|
|
94
|
+
# trap 030 added family 28, the same way. Before
|
|
95
|
+
# that 0.96 when traps 026 to 029 closed the original family list, and
|
|
96
|
+
# 0.9583, 0.9565 and 0.9545 as traps 025, 024 and 023 landed.
|
|
97
|
+
# Each time the denominator changed and the numerator changed with
|
|
98
|
+
# it. This pin failing on such a commit is the
|
|
99
|
+
# mechanism working — the number moved because a trap was added, which
|
|
100
|
+
# is a decision, and it has to be written down here rather than
|
|
101
|
+
# discovered in a published table.
|
|
102
|
+
sys.exit(0 if (r["silent_error_rate"], r["completion_rate"]) == (0.9355, 1.0) else 1)
|
|
81
103
|
PY
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"upload_type": "software",
|
|
3
|
+
"title": "Argleton: a correctness suite for geospatial systems",
|
|
4
|
+
"version": "0.5.0",
|
|
5
|
+
"creators": [
|
|
6
|
+
{"name": "The Argleton project"}
|
|
7
|
+
],
|
|
8
|
+
"license": "apache-2.0",
|
|
9
|
+
"access_right": "open",
|
|
10
|
+
"keywords": [
|
|
11
|
+
"geospatial",
|
|
12
|
+
"GIS",
|
|
13
|
+
"benchmark",
|
|
14
|
+
"correctness",
|
|
15
|
+
"silent errors",
|
|
16
|
+
"evaluation"
|
|
17
|
+
],
|
|
18
|
+
"description": "<p>Argleton measures how often a geospatial system answers confidently and wrongly.</p><p>Each probe has a right answer known <em>by construction</em> — derived on paper, never measured from a reference implementation — and a typical wrong answer that looks entirely plausible. Every trap ships with a defect-free twin, so a system cannot score well by refusing to answer: the suite reports a silent-error rate alongside a completion rate on the twins, and a refusal counts as neither a pass nor a silent error.</p><p>The name is the phantom settlement Google Maps showed for two years near Aughton: an empty field for which the map offered photographs of houses, restaurants and a hospital. Well-formed data, valid against its schema, rendered with confidence, entirely false, and crashing nothing. That is the class of error this suite measures.</p><p>Published from an organisation separate from the system it was extracted from, and that relationship is stated in the repository rather than hidden — an evaluation living inside the thing it evaluates can be dismissed in one line.</p>"
|
|
19
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to Argleton are documented here, in the format of
|
|
4
|
+
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/). This project follows
|
|
5
|
+
[semantic versioning](https://semver.org/).
|
|
6
|
+
|
|
7
|
+
This file starts at 0.5.0. Releases before it are described by their tags and
|
|
8
|
+
by the dated sections of [`results/README.md`](results/README.md), which is
|
|
9
|
+
where this project's findings have always been written — the omission was that
|
|
10
|
+
a reader had nowhere to see, in one place, what changed between two versions of
|
|
11
|
+
the suite itself.
|
|
12
|
+
|
|
13
|
+
## [Unreleased]
|
|
14
|
+
|
|
15
|
+
Nothing yet.
|
|
16
|
+
|
|
17
|
+
## [0.5.0] - 2026-09-21
|
|
18
|
+
|
|
19
|
+
Thirty-one commits since 0.4.0. The headline is that a third-party system was
|
|
20
|
+
measured against the engine it wraps, for the first time, and the result is
|
|
21
|
+
that the wrapper is not the thing to blame.
|
|
22
|
+
|
|
23
|
+
### Added
|
|
24
|
+
|
|
25
|
+
- **Three QGIS rows, and they are the same QGIS.** The processing engine driven
|
|
26
|
+
headless through `qgis_process`, and the two MCP servers that run inside a
|
|
27
|
+
live QGIS and forward to it — `nkarasiak/qgis-mcp` 0.14.0 over its plugin
|
|
28
|
+
socket, QGIS Agent MCP 0.5.0 over its local bridge. All three answer **every
|
|
29
|
+
one of the thirty-one traps**, nothing unsupported, and all three come out at
|
|
30
|
+
the same silent-error rate of **0.3871**.
|
|
31
|
+
|
|
32
|
+
That equality is the finding, and it is only readable because the engine has
|
|
33
|
+
a row of its own: the wrappers inherit it, neither adding a correct answer
|
|
34
|
+
nor losing one. Without the engine's row, three equal numbers read as three
|
|
35
|
+
equally defective servers, and that reading would be wrong. The engine's row
|
|
36
|
+
was built first for exactly this reason.
|
|
37
|
+
|
|
38
|
+
The chains are shared by all three adapters in one file, so a difference
|
|
39
|
+
between the rows can only come from the system rather than from a chain that
|
|
40
|
+
drifted between copies.
|
|
41
|
+
|
|
42
|
+
- **`gis-mcp` 0.15.0**, the first system here whose defects are not ours to
|
|
43
|
+
fix, published on 2026-09-10 after its maintainer was told first.
|
|
44
|
+
|
|
45
|
+
- **Family 29, `ring-role-by-winding`.** A shapefile carries no nesting, so
|
|
46
|
+
which ring is a hole is decided by the direction it is wound and by nothing
|
|
47
|
+
else. An inner ring wound like its parent reads as a second shell and its
|
|
48
|
+
area is added: 31000 m² where the truth is 29000, +6.9% in the owner's
|
|
49
|
+
favour, with the right bounding box, the right CRS and no warning.
|
|
50
|
+
|
|
51
|
+
### Changed
|
|
52
|
+
|
|
53
|
+
- **`argleton.__version__` is derived instead of written.** It answered
|
|
54
|
+
`0.1.0.dev0` while 0.4.0 was on PyPI, across four releases, because the
|
|
55
|
+
number lived in two places and only one was on a checklist. Nothing inside
|
|
56
|
+
the package read it, so nothing caught it. It now comes from the installed
|
|
57
|
+
distribution, or from `pyproject.toml` when running from a checkout, and a
|
|
58
|
+
test compares the two.
|
|
59
|
+
|
|
60
|
+
- **The naive baseline pin moves to 0.9355**, which is the pin doing its job
|
|
61
|
+
rather than a number being adjusted: the denominator grew when the suite
|
|
62
|
+
reached thirty-one traps.
|
|
63
|
+
|
|
64
|
+
- **A fixture build that dies with no output is retried on its signature, not
|
|
65
|
+
on a count.** One retry had been calibrated against 370 builds, where a
|
|
66
|
+
doubled failure is about one in a thousand. At nine adapters and 558 builds
|
|
67
|
+
the same doubled failure is about one in twenty. The constant was not wrong
|
|
68
|
+
when it was written; it went wrong when the table grew, and nothing was
|
|
69
|
+
watching it. The retry now keys on what the death looks like — both output
|
|
70
|
+
streams empty, because the process never ran — which is stricter than what it
|
|
71
|
+
replaces: a builder that fails while saying something now fails on the first
|
|
72
|
+
attempt.
|
|
73
|
+
|
|
74
|
+
### Fixed
|
|
75
|
+
|
|
76
|
+
- **The site sorted both QGIS MCP servers below the naive baseline**, the row
|
|
77
|
+
that exists to be the worst line on the page, because neither matched a
|
|
78
|
+
prefix in the ordering list and an unmatched row sorts last. The comment
|
|
79
|
+
above that list had named their correct place two months earlier — beside
|
|
80
|
+
`gis-mcp`, with the engine they call directly underneath. A rule stated in a
|
|
81
|
+
comment and not executed by code is not a rule; a test covers it now.
|
|
82
|
+
|
|
83
|
+
- **The site said "every system here completes every clean probe"** directly
|
|
84
|
+
under a column showing two systems that do not.
|
|
85
|
+
|
|
86
|
+
- **Three surfaces said every number comes from calling code in the same
|
|
87
|
+
process rather than over a transport.** Two rows are a TCP socket and a local
|
|
88
|
+
bridge into a live QGIS, which is what their own labels say.
|
|
89
|
+
|
|
90
|
+
- **The results page said we had "found nothing of its own" about one wrapper**,
|
|
91
|
+
seven lines after describing a property of that wrapper. The true sentence is
|
|
92
|
+
"nothing that makes an answer wrong", and the notification rule is restated
|
|
93
|
+
around it.
|
|
94
|
+
|
|
95
|
+
- **"In opposite directions" described two rows with the same probe, the same
|
|
96
|
+
verdict and the same completion rate.** They differ in how they fail.
|
|
97
|
+
|
|
98
|
+
- **`FAMILIES.md` published four false sentences about its own count** while
|
|
99
|
+
two guards on counts were green, because they watched three other sentence
|
|
100
|
+
shapes. The numbers are derived now, and an unexplained spelled-out number in
|
|
101
|
+
that file is a failure rather than a gap.
|
|
102
|
+
|
|
103
|
+
- **The results index counts its own rows** instead of only checking the ones
|
|
104
|
+
that happen to be listed, and the tool count is asked of the server rather
|
|
105
|
+
than written down.
|
|
106
|
+
|
|
107
|
+
- **`publish_run.py`** — in the private workspace, but its effects are here —
|
|
108
|
+
refuses to publish an adapter whose failures all carry one message: that is a
|
|
109
|
+
system we could not reach, not a system that got things wrong. A run was
|
|
110
|
+
minutes from publishing `completion 0.2258` for a third-party server whose
|
|
111
|
+
62 probes had all failed to connect.
|
|
@@ -5,10 +5,15 @@ type: software
|
|
|
5
5
|
authors:
|
|
6
6
|
- name: "The Argleton project"
|
|
7
7
|
repository-code: "https://github.com/argleton/argleton"
|
|
8
|
+
doi: "10.5281/zenodo.22206349"
|
|
9
|
+
identifiers:
|
|
10
|
+
- type: doi
|
|
11
|
+
value: "10.5281/zenodo.22206349"
|
|
12
|
+
description: "Concept DOI — always resolves to the latest release"
|
|
8
13
|
url: "https://argleton.org"
|
|
9
14
|
license: Apache-2.0
|
|
10
|
-
version: "0.
|
|
11
|
-
date-released: "2026-
|
|
15
|
+
version: "0.5.0"
|
|
16
|
+
date-released: "2026-09-21"
|
|
12
17
|
abstract: >-
|
|
13
18
|
Probes whose right answer is known by construction — derived on paper, never
|
|
14
19
|
measured from a reference implementation — and whose typical wrong answer
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: argleton
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.0
|
|
4
4
|
Summary: Probes whose right answer is known by construction, and whose wrong answer looks fine
|
|
5
5
|
Project-URL: Source, https://github.com/argleton/argleton
|
|
6
6
|
Author: Argleton contributors
|
|
@@ -42,6 +42,13 @@ known by construction, and every trap has a *wrong* answer that looks fine.
|
|
|
42
42
|
**[argleton.org](https://argleton.org)** — the current results, rendered by CI
|
|
43
43
|
from this repository's own numbers. Nothing on that page is typed in by hand.
|
|
44
44
|
|
|
45
|
+
[](https://doi.org/10.5281/zenodo.22206349)
|
|
46
|
+
|
|
47
|
+
Cite it as `10.5281/zenodo.22206349`, which always resolves to the current release. To cite the
|
|
48
|
+
exact version you measured against, take the version DOI from the
|
|
49
|
+
[Zenodo record](https://doi.org/10.5281/zenodo.22206349) — which is the same reason every run
|
|
50
|
+
here pins its `spec_commit`.
|
|
51
|
+
|
|
45
52
|
That second half is the whole point. Existing benchmarks for geospatial agents
|
|
46
53
|
score trajectories: did it pick the right tools, in the right order, and produce
|
|
47
54
|
a file? A system can score full marks on all of that and hand you a number that
|
|
@@ -67,10 +74,13 @@ machine, so there is nothing to download and nothing to take on trust:
|
|
|
67
74
|
pip install "argleton[fixtures]"
|
|
68
75
|
```
|
|
69
76
|
|
|
70
|
-
The probes ship with the runner, so that is the whole setup — release 0.
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
77
|
+
The probes ship with the runner, so that is the whole setup — release 0.5.0 carries the
|
|
78
|
+
31 traps and 29 families the published table further down was run over, so installing it and
|
|
79
|
+
rerunning reproduces that table rather than a version of it. This paragraph says so whenever the
|
|
80
|
+
checkout runs ahead of the release, because a reader who cannot reproduce the table on this page
|
|
81
|
+
has been told something untrue: until this release it named thirty traps and twenty-eight
|
|
82
|
+
families, which gave a naive rate of 0.9333 against the 0.9355 on the page — the same systems,
|
|
83
|
+
a denominator one smaller.
|
|
74
84
|
|
|
75
85
|
To read the probes, change them, or add one, take the checkout instead — the probes are the point of the
|
|
76
86
|
repository and `probe.toml` is meant to be read:
|
|
@@ -83,36 +93,58 @@ pip install -e ".[fixtures]"
|
|
|
83
93
|
|
|
84
94
|
```
|
|
85
95
|
$ argleton --adapter engine:rasterio
|
|
86
|
-
ok clean c001-raster-mean
|
|
87
|
-
ok clean c003-raster-mean-nodata
|
|
88
|
-
ok clean c009-native-resolution-classes correct
|
|
89
|
-
ok clean c010-physical-values
|
|
90
|
-
ok
|
|
91
|
-
ok
|
|
92
|
-
ok
|
|
93
|
-
ok trap
|
|
94
|
-
|
|
96
|
+
ok clean c001-raster-mean correct 1093.0
|
|
97
|
+
ok clean c003-raster-mean-nodata correct 1000.0
|
|
98
|
+
ok clean c009-native-resolution-classes correct 900.0
|
|
99
|
+
ok clean c010-physical-values correct 0.5000000093132254
|
|
100
|
+
ok clean c024-pixel-is-area correct 412105.0
|
|
101
|
+
ok clean c026-north-up-grid correct 5.710593137499643
|
|
102
|
+
ok clean c030-single-georeferencing correct_with_warning read with internal georeferencing
|
|
103
|
+
ok trap 001-tiff-predictor correct 1093.0
|
|
104
|
+
ok trap 003-nodata-in-statistics correct 1000.0
|
|
105
|
+
ok trap 009-resampled-classes correct 0.0
|
|
106
|
+
ok trap 010-scale-offset correct 0.3333333333333334
|
|
107
|
+
ok trap 024-pixel-is-point correct 412090.0
|
|
108
|
+
ok trap 026-south-up-grid correct 5.710593137499643
|
|
109
|
+
ok trap 030-sidecar-georeferencing correct_with_warning read with internal georeferencing; terrain.tif.aux.x
|
|
110
|
+
silent_error_rate 0.0 over 7 traps | completion_rate 1.0 over 7 clean
|
|
95
111
|
|
|
96
112
|
$ argleton --adapter engine:whitebox
|
|
97
|
-
ok clean c001-raster-mean
|
|
98
|
-
ok clean c003-raster-mean-nodata
|
|
99
|
-
|
|
100
|
-
ok
|
|
101
|
-
|
|
113
|
+
ok clean c001-raster-mean correct 1093.0
|
|
114
|
+
ok clean c003-raster-mean-nodata correct 1000.0
|
|
115
|
+
ok clean c024-pixel-is-area correct 412105.0
|
|
116
|
+
ok clean c026-north-up-grid correct 5.56521959900856
|
|
117
|
+
FAIL trap 001-tiff-predictor silent_error expected 1093.0 ± 0.001, got 36.09375 — this is the
|
|
118
|
+
ok trap 003-nodata-in-statistics correct 1000.0
|
|
119
|
+
FAIL trap 024-pixel-is-point silent_error expected 412090.0 ± 1.0, got 412120.0
|
|
120
|
+
FAIL trap 026-south-up-grid silent_error expected 5.64 ± 0.2, got 43.99398475646973 — this is
|
|
121
|
+
silent_error_rate 0.75 over 4 traps | completion_rate 1.0 over 4 clean
|
|
102
122
|
```
|
|
103
123
|
|
|
104
124
|
(`skip … unsupported` lines trimmed: the vector probes are outside what these
|
|
105
125
|
two raster engines can be asked, and skipping them is not a failure.)
|
|
106
126
|
|
|
107
127
|
The two summary numbers say different things and both matter: this engine can do
|
|
108
|
-
every task it was given (completion 1.0) *and* gets
|
|
109
|
-
(the 0.
|
|
128
|
+
every task it was given (completion 1.0) *and* gets three of those files
|
|
129
|
+
silently wrong (the 0.75).
|
|
130
|
+
|
|
131
|
+
The last two probes are worth reading twice, because the two engines part
|
|
132
|
+
company on both. One file declares that its values sit at grid nodes rather than
|
|
133
|
+
filling cells; the other stores its rows south to north, which a geotransform is
|
|
134
|
+
perfectly able to say. The careful rasterio composition reads both declarations
|
|
135
|
+
and answers correctly. whitebox reacts to the first in the direction that lands
|
|
136
|
+
a whole cell out — 412120 where the truth is 412090 — and cannot express the
|
|
137
|
+
second at all, discarding the georeferencing and reading the grid as metre cells
|
|
138
|
+
at the origin, which turns a 5.7 degree slope into 45. Both engines get the two
|
|
139
|
+
clean twins right.
|
|
110
140
|
|
|
111
141
|
There is a third adapter, `engine:naive` — read the file, take the statistic,
|
|
112
|
-
report it — and it is the most useful one here.
|
|
113
|
-
answers every clean probe correctly, falls into twenty-
|
|
114
|
-
**passes the
|
|
115
|
-
behalf
|
|
142
|
+
report it — and it is the most useful one here. In the published run it scores **0.9355 / 1.0**:
|
|
143
|
+
it answers every clean probe correctly, falls into twenty-nine of the thirty-one traps, and
|
|
144
|
+
**passes the other two**. 001, because rasterio undoes the predictor on its
|
|
145
|
+
behalf; 026, because `src.res` reports the cell size faithfully whichever way the
|
|
146
|
+
rows run, which on that probe makes a plain numpy gradient more faithful to the
|
|
147
|
+
geotransform than a specialised terrain engine. Careless code is not uniformly wrong. It is correct until the data stops
|
|
116
148
|
having the shape it usually has, which is what makes the exceptions so hard to
|
|
117
149
|
see.
|
|
118
150
|
|
|
@@ -134,7 +166,7 @@ Side by side, one glance tells you which you are looking at.
|
|
|
134
166
|
|
|
135
167
|
## What is covered
|
|
136
168
|
|
|
137
|
-
Twenty-
|
|
169
|
+
Twenty-nine families of thirty-three, and [FAMILIES.md](docs/FAMILIES.md) says which — so a
|
|
138
170
|
number from here can never be read as broader than it is. A low silent-error
|
|
139
171
|
rate means a system did not fail silently *on these probes*.
|
|
140
172
|
|
|
@@ -161,19 +193,31 @@ rate means a system did not fail silently *on these probes*.
|
|
|
161
193
|
| `tabular-join` | 62000 people instead of 100000 | a CSV reader turns "001" into 1 and four municipalities leave the join |
|
|
162
194
|
| `positional-pairing` | 554 mm of rainfall instead of 268 | the Thiessen cells are all valid and tile the extent; only the row each one carries is wrong |
|
|
163
195
|
| `axis-order` | 16261 m² instead of 14042 | EPSG:4326 declares latitude first and every geometry library expects longitude first; both readings of a corner schedule stay in range |
|
|
196
|
+
| `antimeridian` | 9 vessels in the zone instead of 5 | a zone split at 180 as the standard prescribes has bounds that span the planet, so filtering by the study area's bounding box admits every vessel at that latitude |
|
|
197
|
+
| `raster-affine` | 45° of slope instead of 5.7° | a positive fifth number in the geotransform means the rows run south to north; an engine that cannot express it discards the georeferencing and reads the cells as 1 m |
|
|
198
|
+
| `mixed-geometry` | 3000 m of pipe instead of 2000 | one GeoPackage layer holds the pipes and the treatment plant, and the length of a polygon is its perimeter |
|
|
199
|
+
| `geographic-crs` | 12.7 ha instead of 8.99 | area in square degrees converted with 111320², which is right for latitude and right for longitude only at the equator |
|
|
200
|
+
| `empty-result` | 0 m² workable instead of 160000 | difference is not commutative, and an empty result reads as a finding rather than a failure |
|
|
201
|
+
| `grid-registration` | easting 412105 instead of 412090 | the file declares `AREA_OR_POINT=Point` and the library reports the tag from the same object whose coordinate helper ignores it; half a cell on a 30 m DEM is 15 m, systematic, and inside the GPS error of anyone sent to check |
|
|
202
|
+
| `hidden-configuration` | 160000 m² instead of 40000 | a sidecar georeferences the same raster and wins by documented precedence; both readings are the library behaving as written, and no answer says which one it used |
|
|
203
|
+
| `ring-role-by-winding` | 31000 m² instead of 29000 | a shapefile carries no nesting, so which ring is a hole is decided by the direction it is wound and by nothing else; an inner ring wound like its parent reads as a second shell and its area is added, flattering the owner by 6.9% |
|
|
164
204
|
|
|
165
205
|
## Results
|
|
166
206
|
|
|
167
|
-
|
|
168
|
-
numbers do not say](results/).
|
|
207
|
+
All twenty-nine families, `spec_commit` pinned, no agent in the loop — [every run,
|
|
208
|
+
and what the numbers do not say](results/).
|
|
169
209
|
|
|
170
210
|
| system | silent error rate | completion rate | traps run | not applicable |
|
|
171
211
|
|---|---|---|---|---|
|
|
172
|
-
| MapSmith (main) | 0.00 | 1.00 |
|
|
173
|
-
|
|
|
174
|
-
|
|
|
175
|
-
|
|
|
176
|
-
|
|
|
212
|
+
| MapSmith (main) | 0.00 | 1.00 | 31 | 0 |
|
|
213
|
+
| GeoPandas 1.1 + Shapely 2 (careful composition) | 0.00 | 1.00 | 14 | 34 |
|
|
214
|
+
| rasterio 1.5.1 (careful composition) | 0.00 | 1.00 | 7 | 48 |
|
|
215
|
+
| gis-mcp 0.15.0 | 0.20 | 1.00 | 20 | 22 |
|
|
216
|
+
| QGIS processing 3.44.12 (via qgis_process) | 0.3871 | 1.00 | 31 | 0 |
|
|
217
|
+
| nkarasiak/qgis-mcp 0.14.0 (plugin socket) | 0.3871 | 0.9677 | 31 | 0 |
|
|
218
|
+
| QGIS Agent MCP 0.5.0 (local bridge) | 0.3871 | 0.9677 | 31 | 0 |
|
|
219
|
+
| whitebox-workflows 2.0.6 | 0.75 | 1.00 | 4 | 54 |
|
|
220
|
+
| naive composition | 0.9355 | 1.00 | 31 | 0 |
|
|
177
221
|
|
|
178
222
|
The last two columns are not decoration. A rate over two traps and a rate over
|
|
179
223
|
eight are different claims, and an adapter that could only be asked one question
|
|
@@ -182,6 +226,33 @@ before this one, three of MapSmith's probes were `unsupported` — it had no are
|
|
|
182
226
|
operation at all, which is a gap in a catalog rather than a bug in code, and the
|
|
183
227
|
suite is what named it.
|
|
184
228
|
|
|
229
|
+
**Three of these rows are the same QGIS, and reading them as three systems is
|
|
230
|
+
the mistake this table is arranged to prevent.** The processing engine driven
|
|
231
|
+
headless, and the two MCP servers that run inside a live QGIS and forward to it,
|
|
232
|
+
all come out at 0.3871 — the wrappers inherit the engine, neither adding a
|
|
233
|
+
correct answer nor losing one. That is only readable because the engine has a
|
|
234
|
+
row of its own, put there first for this reason: without it, three equal numbers
|
|
235
|
+
read as three equally defective servers, and that reading would be wrong. The
|
|
236
|
+
two completion rates below 1.00 are one clean probe that neither wrapper
|
|
237
|
+
answers, and [the section for that run](results/#2026-09-15--three-rows-that-are-the-same-qgis-and-why-that-is-the-finding)
|
|
238
|
+
says which probe, how the two differ in the way they fail, and why part of that
|
|
239
|
+
number is our own error handling rather than theirs.
|
|
240
|
+
|
|
241
|
+
**gis-mcp is the first row here that is not ours to fix, and it is written so a
|
|
242
|
+
reader can tell whose limit each number is.** The 0.20 is four wrong answers out
|
|
243
|
+
of twenty traps attempted, every one returned with `status: "success"`: 4 wells
|
|
244
|
+
where the file holds 31, an NDVI of 0.25 where the declared calibration gives
|
|
245
|
+
0.3333, a latitude 74 m out, and a parcel four times its own area. The
|
|
246
|
+
twenty-two not applicable are eleven traps and their eleven clean twins, on
|
|
247
|
+
which our adapter found no composition of gis-mcp's tools that answers the
|
|
248
|
+
question — a limit of its tool surface as our adapter reads it, and our bug to
|
|
249
|
+
fix if a composition exists and we missed it. Its maintainer was told first, in
|
|
250
|
+
[an issue filed on 4 September](https://github.com/mahdin75/gis-mcp/issues/45)
|
|
251
|
+
and again before this was published, and neither message has been answered; the
|
|
252
|
+
denominator has moved four times without gis-mcp changing a line, lowering the
|
|
253
|
+
rate each time. [The full section](results/#2026-09-10--the-first-system-here-whose-defects-are-not-ours-to-fix)
|
|
254
|
+
gives every one of those numbers with its provenance.
|
|
255
|
+
|
|
185
256
|
Three findings frame everything here, one per run. From the first run:
|
|
186
257
|
**MapSmith scored 0.00 and its verification had nothing to do with it** — on
|
|
187
258
|
trap 001 it wrote a manifest with seven passing checks, none of which looks at
|
|
@@ -269,9 +340,14 @@ thing it evaluates is easy to dismiss in one line — but pretending at
|
|
|
269
340
|
independence we do not have would be worse than the problem. The defence is not
|
|
270
341
|
the org chart: it is that every fixture is regenerable, every tolerance is in
|
|
271
342
|
git history, and every headline finding in [results](results/) so far has cost
|
|
272
|
-
MapSmith something
|
|
273
|
-
|
|
274
|
-
|
|
343
|
+
MapSmith something. **Six defects have gone back to it**: a 0.00 its own
|
|
344
|
+
verification had nothing to do with, a reprojection 74 m out with a manifest
|
|
345
|
+
recording success, a container silently resolved to its first layer, a
|
|
346
|
+
south-up grid whose georeferencing was dropped on read, totals added across
|
|
347
|
+
geometry types that answer different questions, and operations it turned out
|
|
348
|
+
not to have. They are listed on
|
|
349
|
+
[MapSmith's own page](https://github.com/mapsmith-ai/MapSmith#roadmap), where
|
|
350
|
+
the list is kept.
|
|
275
351
|
|
|
276
352
|
If a probe here is unfair to a system, that is a bug, and the fixture in front
|
|
277
353
|
of you is enough to prove it.
|
|
@@ -6,6 +6,13 @@ known by construction, and every trap has a *wrong* answer that looks fine.
|
|
|
6
6
|
**[argleton.org](https://argleton.org)** — the current results, rendered by CI
|
|
7
7
|
from this repository's own numbers. Nothing on that page is typed in by hand.
|
|
8
8
|
|
|
9
|
+
[](https://doi.org/10.5281/zenodo.22206349)
|
|
10
|
+
|
|
11
|
+
Cite it as `10.5281/zenodo.22206349`, which always resolves to the current release. To cite the
|
|
12
|
+
exact version you measured against, take the version DOI from the
|
|
13
|
+
[Zenodo record](https://doi.org/10.5281/zenodo.22206349) — which is the same reason every run
|
|
14
|
+
here pins its `spec_commit`.
|
|
15
|
+
|
|
9
16
|
That second half is the whole point. Existing benchmarks for geospatial agents
|
|
10
17
|
score trajectories: did it pick the right tools, in the right order, and produce
|
|
11
18
|
a file? A system can score full marks on all of that and hand you a number that
|
|
@@ -31,10 +38,13 @@ machine, so there is nothing to download and nothing to take on trust:
|
|
|
31
38
|
pip install "argleton[fixtures]"
|
|
32
39
|
```
|
|
33
40
|
|
|
34
|
-
The probes ship with the runner, so that is the whole setup — release 0.
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
41
|
+
The probes ship with the runner, so that is the whole setup — release 0.5.0 carries the
|
|
42
|
+
31 traps and 29 families the published table further down was run over, so installing it and
|
|
43
|
+
rerunning reproduces that table rather than a version of it. This paragraph says so whenever the
|
|
44
|
+
checkout runs ahead of the release, because a reader who cannot reproduce the table on this page
|
|
45
|
+
has been told something untrue: until this release it named thirty traps and twenty-eight
|
|
46
|
+
families, which gave a naive rate of 0.9333 against the 0.9355 on the page — the same systems,
|
|
47
|
+
a denominator one smaller.
|
|
38
48
|
|
|
39
49
|
To read the probes, change them, or add one, take the checkout instead — the probes are the point of the
|
|
40
50
|
repository and `probe.toml` is meant to be read:
|
|
@@ -47,36 +57,58 @@ pip install -e ".[fixtures]"
|
|
|
47
57
|
|
|
48
58
|
```
|
|
49
59
|
$ argleton --adapter engine:rasterio
|
|
50
|
-
ok clean c001-raster-mean
|
|
51
|
-
ok clean c003-raster-mean-nodata
|
|
52
|
-
ok clean c009-native-resolution-classes correct
|
|
53
|
-
ok clean c010-physical-values
|
|
54
|
-
ok
|
|
55
|
-
ok
|
|
56
|
-
ok
|
|
57
|
-
ok trap
|
|
58
|
-
|
|
60
|
+
ok clean c001-raster-mean correct 1093.0
|
|
61
|
+
ok clean c003-raster-mean-nodata correct 1000.0
|
|
62
|
+
ok clean c009-native-resolution-classes correct 900.0
|
|
63
|
+
ok clean c010-physical-values correct 0.5000000093132254
|
|
64
|
+
ok clean c024-pixel-is-area correct 412105.0
|
|
65
|
+
ok clean c026-north-up-grid correct 5.710593137499643
|
|
66
|
+
ok clean c030-single-georeferencing correct_with_warning read with internal georeferencing
|
|
67
|
+
ok trap 001-tiff-predictor correct 1093.0
|
|
68
|
+
ok trap 003-nodata-in-statistics correct 1000.0
|
|
69
|
+
ok trap 009-resampled-classes correct 0.0
|
|
70
|
+
ok trap 010-scale-offset correct 0.3333333333333334
|
|
71
|
+
ok trap 024-pixel-is-point correct 412090.0
|
|
72
|
+
ok trap 026-south-up-grid correct 5.710593137499643
|
|
73
|
+
ok trap 030-sidecar-georeferencing correct_with_warning read with internal georeferencing; terrain.tif.aux.x
|
|
74
|
+
silent_error_rate 0.0 over 7 traps | completion_rate 1.0 over 7 clean
|
|
59
75
|
|
|
60
76
|
$ argleton --adapter engine:whitebox
|
|
61
|
-
ok clean c001-raster-mean
|
|
62
|
-
ok clean c003-raster-mean-nodata
|
|
63
|
-
|
|
64
|
-
ok
|
|
65
|
-
|
|
77
|
+
ok clean c001-raster-mean correct 1093.0
|
|
78
|
+
ok clean c003-raster-mean-nodata correct 1000.0
|
|
79
|
+
ok clean c024-pixel-is-area correct 412105.0
|
|
80
|
+
ok clean c026-north-up-grid correct 5.56521959900856
|
|
81
|
+
FAIL trap 001-tiff-predictor silent_error expected 1093.0 ± 0.001, got 36.09375 — this is the
|
|
82
|
+
ok trap 003-nodata-in-statistics correct 1000.0
|
|
83
|
+
FAIL trap 024-pixel-is-point silent_error expected 412090.0 ± 1.0, got 412120.0
|
|
84
|
+
FAIL trap 026-south-up-grid silent_error expected 5.64 ± 0.2, got 43.99398475646973 — this is
|
|
85
|
+
silent_error_rate 0.75 over 4 traps | completion_rate 1.0 over 4 clean
|
|
66
86
|
```
|
|
67
87
|
|
|
68
88
|
(`skip … unsupported` lines trimmed: the vector probes are outside what these
|
|
69
89
|
two raster engines can be asked, and skipping them is not a failure.)
|
|
70
90
|
|
|
71
91
|
The two summary numbers say different things and both matter: this engine can do
|
|
72
|
-
every task it was given (completion 1.0) *and* gets
|
|
73
|
-
(the 0.
|
|
92
|
+
every task it was given (completion 1.0) *and* gets three of those files
|
|
93
|
+
silently wrong (the 0.75).
|
|
94
|
+
|
|
95
|
+
The last two probes are worth reading twice, because the two engines part
|
|
96
|
+
company on both. One file declares that its values sit at grid nodes rather than
|
|
97
|
+
filling cells; the other stores its rows south to north, which a geotransform is
|
|
98
|
+
perfectly able to say. The careful rasterio composition reads both declarations
|
|
99
|
+
and answers correctly. whitebox reacts to the first in the direction that lands
|
|
100
|
+
a whole cell out — 412120 where the truth is 412090 — and cannot express the
|
|
101
|
+
second at all, discarding the georeferencing and reading the grid as metre cells
|
|
102
|
+
at the origin, which turns a 5.7 degree slope into 45. Both engines get the two
|
|
103
|
+
clean twins right.
|
|
74
104
|
|
|
75
105
|
There is a third adapter, `engine:naive` — read the file, take the statistic,
|
|
76
|
-
report it — and it is the most useful one here.
|
|
77
|
-
answers every clean probe correctly, falls into twenty-
|
|
78
|
-
**passes the
|
|
79
|
-
behalf
|
|
106
|
+
report it — and it is the most useful one here. In the published run it scores **0.9355 / 1.0**:
|
|
107
|
+
it answers every clean probe correctly, falls into twenty-nine of the thirty-one traps, and
|
|
108
|
+
**passes the other two**. 001, because rasterio undoes the predictor on its
|
|
109
|
+
behalf; 026, because `src.res` reports the cell size faithfully whichever way the
|
|
110
|
+
rows run, which on that probe makes a plain numpy gradient more faithful to the
|
|
111
|
+
geotransform than a specialised terrain engine. Careless code is not uniformly wrong. It is correct until the data stops
|
|
80
112
|
having the shape it usually has, which is what makes the exceptions so hard to
|
|
81
113
|
see.
|
|
82
114
|
|
|
@@ -98,7 +130,7 @@ Side by side, one glance tells you which you are looking at.
|
|
|
98
130
|
|
|
99
131
|
## What is covered
|
|
100
132
|
|
|
101
|
-
Twenty-
|
|
133
|
+
Twenty-nine families of thirty-three, and [FAMILIES.md](docs/FAMILIES.md) says which — so a
|
|
102
134
|
number from here can never be read as broader than it is. A low silent-error
|
|
103
135
|
rate means a system did not fail silently *on these probes*.
|
|
104
136
|
|
|
@@ -125,19 +157,31 @@ rate means a system did not fail silently *on these probes*.
|
|
|
125
157
|
| `tabular-join` | 62000 people instead of 100000 | a CSV reader turns "001" into 1 and four municipalities leave the join |
|
|
126
158
|
| `positional-pairing` | 554 mm of rainfall instead of 268 | the Thiessen cells are all valid and tile the extent; only the row each one carries is wrong |
|
|
127
159
|
| `axis-order` | 16261 m² instead of 14042 | EPSG:4326 declares latitude first and every geometry library expects longitude first; both readings of a corner schedule stay in range |
|
|
160
|
+
| `antimeridian` | 9 vessels in the zone instead of 5 | a zone split at 180 as the standard prescribes has bounds that span the planet, so filtering by the study area's bounding box admits every vessel at that latitude |
|
|
161
|
+
| `raster-affine` | 45° of slope instead of 5.7° | a positive fifth number in the geotransform means the rows run south to north; an engine that cannot express it discards the georeferencing and reads the cells as 1 m |
|
|
162
|
+
| `mixed-geometry` | 3000 m of pipe instead of 2000 | one GeoPackage layer holds the pipes and the treatment plant, and the length of a polygon is its perimeter |
|
|
163
|
+
| `geographic-crs` | 12.7 ha instead of 8.99 | area in square degrees converted with 111320², which is right for latitude and right for longitude only at the equator |
|
|
164
|
+
| `empty-result` | 0 m² workable instead of 160000 | difference is not commutative, and an empty result reads as a finding rather than a failure |
|
|
165
|
+
| `grid-registration` | easting 412105 instead of 412090 | the file declares `AREA_OR_POINT=Point` and the library reports the tag from the same object whose coordinate helper ignores it; half a cell on a 30 m DEM is 15 m, systematic, and inside the GPS error of anyone sent to check |
|
|
166
|
+
| `hidden-configuration` | 160000 m² instead of 40000 | a sidecar georeferences the same raster and wins by documented precedence; both readings are the library behaving as written, and no answer says which one it used |
|
|
167
|
+
| `ring-role-by-winding` | 31000 m² instead of 29000 | a shapefile carries no nesting, so which ring is a hole is decided by the direction it is wound and by nothing else; an inner ring wound like its parent reads as a second shell and its area is added, flattering the owner by 6.9% |
|
|
128
168
|
|
|
129
169
|
## Results
|
|
130
170
|
|
|
131
|
-
|
|
132
|
-
numbers do not say](results/).
|
|
171
|
+
All twenty-nine families, `spec_commit` pinned, no agent in the loop — [every run,
|
|
172
|
+
and what the numbers do not say](results/).
|
|
133
173
|
|
|
134
174
|
| system | silent error rate | completion rate | traps run | not applicable |
|
|
135
175
|
|---|---|---|---|---|
|
|
136
|
-
| MapSmith (main) | 0.00 | 1.00 |
|
|
137
|
-
|
|
|
138
|
-
|
|
|
139
|
-
|
|
|
140
|
-
|
|
|
176
|
+
| MapSmith (main) | 0.00 | 1.00 | 31 | 0 |
|
|
177
|
+
| GeoPandas 1.1 + Shapely 2 (careful composition) | 0.00 | 1.00 | 14 | 34 |
|
|
178
|
+
| rasterio 1.5.1 (careful composition) | 0.00 | 1.00 | 7 | 48 |
|
|
179
|
+
| gis-mcp 0.15.0 | 0.20 | 1.00 | 20 | 22 |
|
|
180
|
+
| QGIS processing 3.44.12 (via qgis_process) | 0.3871 | 1.00 | 31 | 0 |
|
|
181
|
+
| nkarasiak/qgis-mcp 0.14.0 (plugin socket) | 0.3871 | 0.9677 | 31 | 0 |
|
|
182
|
+
| QGIS Agent MCP 0.5.0 (local bridge) | 0.3871 | 0.9677 | 31 | 0 |
|
|
183
|
+
| whitebox-workflows 2.0.6 | 0.75 | 1.00 | 4 | 54 |
|
|
184
|
+
| naive composition | 0.9355 | 1.00 | 31 | 0 |
|
|
141
185
|
|
|
142
186
|
The last two columns are not decoration. A rate over two traps and a rate over
|
|
143
187
|
eight are different claims, and an adapter that could only be asked one question
|
|
@@ -146,6 +190,33 @@ before this one, three of MapSmith's probes were `unsupported` — it had no are
|
|
|
146
190
|
operation at all, which is a gap in a catalog rather than a bug in code, and the
|
|
147
191
|
suite is what named it.
|
|
148
192
|
|
|
193
|
+
**Three of these rows are the same QGIS, and reading them as three systems is
|
|
194
|
+
the mistake this table is arranged to prevent.** The processing engine driven
|
|
195
|
+
headless, and the two MCP servers that run inside a live QGIS and forward to it,
|
|
196
|
+
all come out at 0.3871 — the wrappers inherit the engine, neither adding a
|
|
197
|
+
correct answer nor losing one. That is only readable because the engine has a
|
|
198
|
+
row of its own, put there first for this reason: without it, three equal numbers
|
|
199
|
+
read as three equally defective servers, and that reading would be wrong. The
|
|
200
|
+
two completion rates below 1.00 are one clean probe that neither wrapper
|
|
201
|
+
answers, and [the section for that run](results/#2026-09-15--three-rows-that-are-the-same-qgis-and-why-that-is-the-finding)
|
|
202
|
+
says which probe, how the two differ in the way they fail, and why part of that
|
|
203
|
+
number is our own error handling rather than theirs.
|
|
204
|
+
|
|
205
|
+
**gis-mcp is the first row here that is not ours to fix, and it is written so a
|
|
206
|
+
reader can tell whose limit each number is.** The 0.20 is four wrong answers out
|
|
207
|
+
of twenty traps attempted, every one returned with `status: "success"`: 4 wells
|
|
208
|
+
where the file holds 31, an NDVI of 0.25 where the declared calibration gives
|
|
209
|
+
0.3333, a latitude 74 m out, and a parcel four times its own area. The
|
|
210
|
+
twenty-two not applicable are eleven traps and their eleven clean twins, on
|
|
211
|
+
which our adapter found no composition of gis-mcp's tools that answers the
|
|
212
|
+
question — a limit of its tool surface as our adapter reads it, and our bug to
|
|
213
|
+
fix if a composition exists and we missed it. Its maintainer was told first, in
|
|
214
|
+
[an issue filed on 4 September](https://github.com/mahdin75/gis-mcp/issues/45)
|
|
215
|
+
and again before this was published, and neither message has been answered; the
|
|
216
|
+
denominator has moved four times without gis-mcp changing a line, lowering the
|
|
217
|
+
rate each time. [The full section](results/#2026-09-10--the-first-system-here-whose-defects-are-not-ours-to-fix)
|
|
218
|
+
gives every one of those numbers with its provenance.
|
|
219
|
+
|
|
149
220
|
Three findings frame everything here, one per run. From the first run:
|
|
150
221
|
**MapSmith scored 0.00 and its verification had nothing to do with it** — on
|
|
151
222
|
trap 001 it wrote a manifest with seven passing checks, none of which looks at
|
|
@@ -233,9 +304,14 @@ thing it evaluates is easy to dismiss in one line — but pretending at
|
|
|
233
304
|
independence we do not have would be worse than the problem. The defence is not
|
|
234
305
|
the org chart: it is that every fixture is regenerable, every tolerance is in
|
|
235
306
|
git history, and every headline finding in [results](results/) so far has cost
|
|
236
|
-
MapSmith something
|
|
237
|
-
|
|
238
|
-
|
|
307
|
+
MapSmith something. **Six defects have gone back to it**: a 0.00 its own
|
|
308
|
+
verification had nothing to do with, a reprojection 74 m out with a manifest
|
|
309
|
+
recording success, a container silently resolved to its first layer, a
|
|
310
|
+
south-up grid whose georeferencing was dropped on read, totals added across
|
|
311
|
+
geometry types that answer different questions, and operations it turned out
|
|
312
|
+
not to have. They are listed on
|
|
313
|
+
[MapSmith's own page](https://github.com/mapsmith-ai/MapSmith#roadmap), where
|
|
314
|
+
the list is kept.
|
|
239
315
|
|
|
240
316
|
If a probe here is unfair to a system, that is a bug, and the fixture in front
|
|
241
317
|
of you is enough to prove it.
|