Agribound v1.0.0: Corrected Inputs, Provenance and Explicit Defaults¶
agribound 1.0.0 is a major release. Most of it is not new functionality but correctness: an audit of 0.1.3 found defects that changed what the engines received and what the pipeline returned, and 1.0.0 fixes them. If you have results from agribound 0.1.x, please read the list of affected results before reusing them.
What was wrong in 0.1.x¶
A few examples from the CHANGELOG, each confirmed in the 0.1.3 code:
- FTW's two season windows were the same image. The composite cache ignored the date window, so both FTW inputs were copies of the annual composite.
- Landsat and HLS inputs were on the wrong scale for FTW and Prithvi, and the HLS SWIR bands of Sentinel-2-derived pixels were red-edge bands.
- Delineate-Anything could silently switch implementation. Without the upstream repository in one of two hard-coded paths, non-Sentinel-2 runs used a simplified path that swapped red and blue and did not merge tile detections.
- GeoAI without a checkpoint ran a building detector.
- Caches and outputs were reused across settings. Intermediates were keyed by source (and sometimes year) only, and any existing output file was returned whatever the configuration.
- The LULC filter could fail quietly, and polygons without land-cover data were dropped as non-crop.
- Outputs held polygons below
min_field_area_m2, because the area filter ran before smoothing and simplification shrank the outlines. - Evaluation matched one prediction to several reference fields, which can inflate precision and recall.
What 1.0.0 does instead¶
- Explicit inputs. Sentinel-2, Landsat and HLS composites are surface
reflectance × 10000 in the UTM zone of the study area; every source declares
its value scale in
agribound.registry; FTW gets real early- and late-season composites from its crop calendar. - No silent fallbacks. A configuration that cannot run raises an error that says what is missing. GeoAI and DINOv3 need a checkpoint (there are no published field weights for them); Delineate-Anything has explicit backends; the LULC filter raises on failure unless you ask it to warn.
- Provenance. Every run writes
<output>.provenance.jsonwith the full configuration and its hash, package versions, device, step timings, peak memory, engine metadata (including weight revisions and SHA-256), counts after each stage and warnings. An output is reused only when the hash matches. - Seeds and cache keys.
seedseeds Python, NumPy, torch and Lightning, and every intermediate is named by a key over the study area, year, window and settings. - Study-area selection. Composites cover the bounding box without masking;
aoi_selectionkeeps the predictions inside an irregular study area. - Evaluation. One-to-one matching by default, area-weighted metrics, over- and under-segmentation, boundary distances and tolerance metrics, per-stratum and per-size-class results, and bootstrap intervals.
- Delineate-Anything v2 is the default model, with pinned weights.
- SAM refinement is a pipeline stage for every engine except the embedding
engine, with SAM 2, SAM 2.1 and two SAM 3 backends (the SAM 3 backends are
untested, and agribound logs a WARNING when one is loaded; see below and
SAM 3 is untested),
and a documented size
gate (in a Kenya Sentinel-2 test, 631 of 634 fields were too small to be
refined at 10 m). By default a refined mask may not take area from a
neighbouring polygon (
sam_overlaps="trim";"keep"restores the 0.1.x behaviour; see the measured trade-off). - Large areas.
agribound tilescuts a region into tiles with halos and runs them as Slurm array jobs (stage on nodes with internet, compute on GPU nodes), with profiles for several NSF ACCESS systems. - An optional agent layer that plans one run from a natural-language
request with read-only tools; a human approves the exact plan, at most one
plan runs, and the session stops. There is no automatic re-tuning. The MCP
server refuses its unauthenticated HTTP transport with execution enabled
or on a non-loopback host unless you pass
--allow-unauthenticated-http.
What the 1.0.0 examples show¶
Examples 02–11 and 13–21 were re-run with 1.0.0 at their defaults, with two exceptions. Example 13 was given example 20's Sentinel-2 output as input, because its default input, example 12's output, was not produced. Example 10's default input is a placeholder path, so it was given a Sentinel-2 composite from example 19. Examples 01 and 12 were not run end to end (see "What has not been verified" below). The gallery was rebuilt from these runs. Each map is drawn on a composite from the run, named under the map with the model and its version: usually the engine's input; for FTW, window A of its two season inputs (in the Andalusia ensemble, Delineate-Anything's input); for the embedding panels, the Sentinel-2 composite SAM 2 read. Every number below comes from the run logs and metrics files.
One model, four resolutions. Delineate Anything v2, used as released, on Landsat (30 m), Sentinel-2 (10 m), SPOT 6/7 (6 m) and NAIP (1 m) of 2018 in San Juan County, New Mexico, evaluated against the 944 NMOSE polygons, which were not used for training or fine-tuning in these runs: object F1 (IoU ≥ 0.5) is 0.15, 0.34, 0.33 and 0.43, and recall rises from 0.08 to 0.44.
The same pattern after fine-tuning, in-sample. DINOv3 fine-tuned on the NMOSE polygons of eastern Lea County for each source, then refined with SAM 2, reaches in-sample F1 0.09 on Landsat, 0.39 on Sentinel-2, 0.48 on SPOT and 0.60 on NAIP. At 30 m the study box also yields only 4 training chips, against 2,014 at 1 m, so the amount of training data changes with the pixel size. SAM 2 helps most at 6 m; at 1 m it raises the mean IoU of matched fields from 0.88 to 0.91, while in-sample F1 is 0.60 with and without it.
Label-free pipelines, side by side. Near Pergamino (Argentina), Delineate Anything v2 outlines most centre pivots on Sentinel-2 and on SPOT. The TESSERA clusters already follow most pivots before SAM 2, while the Google Satellite Embedding clusters split several. SAM 2 was prompted for 442 of 2,372 Google and 511 of 1,923 TESSERA polygons (the rest were below its size rule); it returns one polygon per input polygon, so it does not join the pieces of the Google splits. There is no reference layer there, so this is a comparison of outlines, not of accuracy.
What the crop filter does. In the same county, on Sentinel-2 2019, with both engines used as released and the same NMOSE polygons (not used for training or fine-tuning in these runs) as reference, the Annual NLCD crop filter raises precision from 0.12 to 0.39 for FTW and from 0.40 to 0.58 for Delineate Anything v2, and lowers recall by less than 0.01: of the 963 polygons it removes from FTW's output, 913 overlap no reference field (162 of 182 for Delineate Anything v2).
Other entries show FTW with its two real season windows (Beauce, Kakamega), Delineate Anything v2 on SPOT-Pan against FTW on Sentinel-2 for smallholder fields in West Bengal, the Prithvi label-free modes next to Delineate Anything v2 on SPOT (Narrabri), and the HPC tiling workflow. The 0.1.x screenshots are archived.
Upgrading¶
- Python >= 3.12.
- Two environments:
environment.yml(agribound[all], with FTW) andenvironment-gfm.yml(agribound[all-gfm], with Prithvi), because ftw-tools and terratorch need incompatiblelightningversions. - Delineate-Anything's confidence parameter is
conf_threshold. - Old caches are not read; outputs without a provenance record need
overwrite=True.
The migration guide lists every breaking change.
What has not been verified¶
Some paths were exercised only with stubs or not at all before the release:
the Meta SAM 3 and transformers SAM 3 backends end to end (gated weights),
real Slurm submissions, the agent against the live Claude API, and
Anthropic-compatible local model servers. Delineate-Anything fine-tuning with
real Ultralytics training has been run once, on NAIP 2022 over eastern Lea
County (10 epochs; mask mAP50 0.69 on 135 validation chips held out by a 5 km
block split of the same NMOSE polygons in the same box). The same chips also
selected the checkpoint, so this is not an independent accuracy estimate, and
it is a single check, not a validation across areas. Examples 01 (New Mexico
Landsat time series) and 12 (Lea County multi-engine ensemble) were not run
end to end for 1.0.0; only its NAIP runs were: Delineate-Anything v2, GeoAI
and DINOv3 fine-tuned on the NMOSE polygons (in-sample scores), plus the
released Delineate-Anything v2 weights with example 12's settings (a run the
example itself does not include). Its Delineate-Anything small run on NAIP and
its NAIP ensemble were not run. The GeoAI NAIP run showed two engine problems,
fixed in 1.0.0: a fixed 256 px chip cannot hold a field larger than 256 m at
1 m, and fields crossing inference-window edges came out cut (in-sample F1
0.01, then 0.25 with 1,024 px chips, 0.48 after joining the pieces). GeoAI
fine-tuning now sizes its chips from the reference fields (1.25 × the
90th-percentile field bounding-box side, 256–1024 px; engine_params["chip_size"]
overrides), and the engine joins instances split at the window edges
(engine_params["merge_window_seams"], on by default).
Citation¶
The accompanying manuscript is now titled Measuring what geospatial AI delivers for policy-grade agricultural field boundaries (in preparation for Remote Sensing of Environment). Please cite the software through its Zenodo DOI, 10.5281/zenodo.19229665, and the models and datasets you use; see Citation & References.



