fieldmesh

Is public data enough to really test this?#

Researched 2026-10-07, after testing the APIs rather than reading about them.

Short answer: it validates about half of layer zero, and the half it cannot touch is the half we claim is novel.

The data model and the quality checks can be scored against real sensors with real faults, for free, over decades. The transport contract — store-and-forward, the duty cycle, batching, eviction, deduplication, cumulative acknowledgement — cannot be tested by any public dataset, because every archive has already thrown that layer away. A harmonised hourly series is what survives after the problems §5 exists to solve.

What is usable, in order of value#

1. ISMN — the one that matters#

The International Soil Moisture Network hosts 71 networks and 2,842 stations with data from 1952 to the present, the longest continuous records running about forty years. SCAN, SNOTEL, USCRN, ARM and COSMOS all contribute, so US and Tennessee coverage comes with it. Free with registration, CC-BY-4.0, with an MIT-licensed Python reader (ismn) that exposes measurements and their flags as pandas columns.

Four properties make it the right validation set, and the first is decisive:

What this buys, concretely:

2. SCAN directly, via the NRCS AWDB REST API#

Tested on 2026-10-07, no token: https://wcc.sc.egov.usda.gov/awdbRestApi/services/v1/, OpenAPI documented.

Three Tennessee stations — Allen Farms (Giles), McAllister Farm (Lincoln), Eastview Farm (Franklin) — soil moisture and temperature at 2, 4, 8, 20 and 40 inches, hourly through monthly, since June 2003, live to the current day, with QC and QA flags. The element code carries its depth: elements=SMS:-2, not elements=SMS.

But SCAN deletes rather than tags. Measured over 22 years of daily 8-inch readings across the three stations: 23,240 readings, of which 686 carry qcFlag=S for suspect — and the suspect count equals the missing-value count exactly. Asking for returnOriginalValues=true returns neither a value nor an original for those rows. Thirteen readings are E for estimated and do carry values.

So SCAN gives labelled gaps, not labelled bad values: useful for §5.4's gap handling and §4.2's staleness, useless for scoring a value-based check. It is still the best source of regional threshold evidence, and its live endpoint is the simplest thing to point an ingest adapter at.

3. Small datasets with real, documented faults#

4. The Tennessee Mesonet, when it exists#

95 stations, one per county, the same five depths, five-minute cadence, real-time and public, half due operational by the end of 2026. Unlike SCAN's hourly, five minutes is inside §4.2's cross-check window, so a station in the pilot's county is a genuine peer.

What no public data can test#

Everything the transport contract claims, which is most of what is distinctive here:

Clause Why an archive cannot test it
§5.2 duty cycle, batching, payload budget The frames are gone; only the harmonised series survives
§5.3 buffering, eviction, drain order, the resend horizon Same
§5.2 cumulative acknowledgement and abandoning a permanent hole Same, and this was the subtlest bug the sim found
§1 (site, node, boot, seq) deduplication, reboots, wrap Sequence numbers do not survive ingest
§2 transmit-time age stamping Archives carry timestamps, not ages
§6 the command contract Nothing public commands anything
§7.5 subscriptions, §7.6 grants and export Ours to build
Whether a farmer trusts the result Only a season on a farm

This is the honest shape of it: public data validates the half of layer zero that looks like everyone else's, and cannot touch the half that is the reason the project exists. The simulated farm covers the transport half, and §9.2 is right that a simulator is not a season.

What to do about it#

  1. A scoring run against ISMN. Done 2026-10-08 — see ismn-scoring.md: 2.8 million Tennessee readings, the checks quiet in the root zone, and two real defects found (Q23, Q24). tools/ismn_score.py, the ag counterpart of the HVAC fault-detection scoring in campus_twin: load an ISMN download, map its flags into §3.3's, run sdk/checks.py over the real series, and report precision, recall, false-alarm rate on G rows, and per-episode detection. Skips cleanly when the download is absent, like every other optional stage. This is §9.2's "replay of real recorded field data", and it is the strongest validation available without hardware.
  2. An ISMN flag mapping, written down. If §3.3 cannot express C03 (above saturation, which needs a per-soil saturation figure the datastream does not carry) then that is a gap worth knowing about.
  3. Derive the thresholds the canonical farm invented from ISMN statistics, and say in the spec where each number came from.
  4. Leave the transport half to the sim and the pilot. Do not pretend an archive tested it.

Caveats#

Sources#