Inspiration

A satellite can see that something's wrong with a crop, but it can't tell you what. It sees one signal — plants looking less healthy than they should — and that could be disease, drought, a field that was already harvested, or just a cloud on the wrong day. Every satellite ag tool alerts on that drop, and because most of those alerts are nothing, farmers learn to ignore them. A tool that cries wolf is worse than no tool at all. We wanted an agent that does what a good agronomist does: distrust the alert and try to prove it wrong before bothering anyone.

What it does

Fieldhand is a fleet of agents that checks a farm's fields from orbit every morning — nobody logs in. For each field worth looking at, four agents run in sequence: a Diagnostician reads the satellite evidence and proposes a diagnosis; a Skeptic attacks it, checking neighbouring fields and the field's own history in prior years to see if the alarm is real; an Agronomist decides whether treatment is even warranted and finds a legal spray window (wind, rain, temperature); and Operations turns the plan into work orders. Anything that costs money or leaves the farm stops at an approval queue and waits for a human. On real data it correctly refuses a false drought alarm on a harvested field, and acts on a genuine heat-stress signal by escalating a scouting task — from the same starting alert.

How we built it

Google ADK orchestrates the fleet — LlmAgent, SequentialAgent, and a LoopAgent wrapping a ParallelAgent for the Skeptic's two disconfirmation probes. Gemini 3.5 and 3.7 Flash on Vertex AI do the reasoning; Gemma handles the plain-language rewrite for growers. The sensing pipeline pulls free Sentinel-2 imagery from the Earth Search STAC catalogue and computes vegetation indices; Open-Meteo supplies weather. Everything runs on Cloud Run (three services), with Firestore for parcels, alerts, the approval queue, and an append-only audit ledger, Cloud Storage for imagery, and Cloud Scheduler + Pub/Sub driving the autonomous daily sweep.

Challenges we ran into

On Gemini 3.x, max_output_tokens is a combined ceiling over reasoning and visible output — budgets ported from another provider got eaten by thinking and returned truncated fragments with no error. Gemini also sends numeric tool arguments as strings ("$6,044"), which crashed the policy layer until we coerced at the tool boundary. The subtlest bug: season-relative history has to anchor to the scene's date, not today — comparing a June scene against late-August history gives exactly the wrong answer.

Accomplishments that we're proud of

The Skeptic. Given identical evidence, it reaches opposite, correct conclusions depending on whether a field's decline is unique to it — and it does that with arithmetic, not vibes, so it can't be talked out of its answer. And the whole autonomy story stops at a policy layer that is plain code with no model in it: even a wrong or prompt-injected agent physically cannot spend a grower's money.

What we learned

The interesting engineering wasn't making the agents smart — it was deciding where agents don't get a vote. Triage is deterministic code, the policy gate is model-free code, and the disconfirmation checks are arithmetic. The model does the judgement; everything with a correct answer stays out of its hands.

What's next for Fieldhand

Per-parcel rolling baselines to replace the per-crop constants, more crops and named diseases, and turning the drafted outbound actions (co-op messages, crew assignments) into real integrations behind the same approval gate.

Built With

Share this project:

Updates

Submission history