<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: OJ</title>
    <description>The latest articles on DEV Community by OJ (@oj-iro).</description>
    <link>https://dev.to/oj-iro</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4092721%2Fe5a4a742-c5d1-4ed5-9e01-9d763cf17d3b.jpg</url>
      <title>DEV Community: OJ</title>
      <link>https://dev.to/oj-iro</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/oj-iro"/>
    <language>en</language>
    <item>
      <title>Built an agent fleet that helps farmer's for free</title>
      <dc:creator>OJ</dc:creator>
      <pubDate>Mon, 31 Aug 2026 23:30:32 +0000</pubDate>
      <link>https://dev.to/oj-iro/built-an-agent-fleet-that-helps-farmers-for-free-ebj</link>
      <guid>https://dev.to/oj-iro/built-an-agent-fleet-that-helps-farmers-for-free-ebj</guid>
      <description>&lt;p&gt;&lt;em&gt;I built this for the All Things Agentic Hackathon. This post covers how it works and what broke along the way.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A satellite can't see crop disease. It sees one signal — plants looking less healthy than they should — and that has a dozen causes: drought, harvest, haze, a field boundary drawn over a car park. Every satellite tool alerts on that drop, and because most alerts are nothing, farmers stop opening them.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Fieldhand&lt;/strong&gt;: a fleet of agents where most of the effort goes into trying to prove its own findings wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  The shape of it
&lt;/h2&gt;

&lt;p&gt;Nobody logs in. Cloud Scheduler → Pub/Sub wakes it at 4am, a &lt;strong&gt;Watchman&lt;/strong&gt; picks the fields worth looking at, and each runs through a Google ADK fleet: &lt;strong&gt;Diagnostician&lt;/strong&gt; (reads the satellite evidence) → &lt;strong&gt;Skeptic&lt;/strong&gt; (attacks the diagnosis) → &lt;strong&gt;Agronomist&lt;/strong&gt; (plans treatment + a real spray window) → &lt;strong&gt;Operations&lt;/strong&gt; (work orders). Anything that costs money stops at a human.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Skeptic is the whole project
&lt;/h2&gt;

&lt;p&gt;It's not told to "verify" — a model asked to verify goes and finds supporting evidence. It's told to find the reason the diagnosis is &lt;em&gt;wrong&lt;/em&gt;. Its main instrument is arithmetic: compare this field to its neighbours, and to its own history in prior years. On a real Palouse field reading −5.5σ (catastrophic), the Skeptic pulled 3 years of history, saw it's harvested and bare every August, and refused to alarm. During testing it also caught a "dying 400-acre field" I'd drawn over downtown Pullman — it looked at the imagery, saw rooftops, and dropped confidence to 0.10.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three things that bit me
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;On Gemini 3.x, &lt;code&gt;max_output_tokens&lt;/code&gt; covers thinking AND the answer.&lt;/strong&gt; Budgets ported from another provider got eaten by reasoning and returned truncated fragments with no error.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini sends numeric tool args as strings&lt;/strong&gt; (&lt;code&gt;"$6,044"&lt;/code&gt;), which crashed the policy layer until I coerced at the tool boundary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A trailing newline in a secret costs an afternoon&lt;/strong&gt; — Python stripped it, TypeScript didn't, every cross-service write 401'd.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Where the autonomy stops
&lt;/h2&gt;

&lt;p&gt;The policy layer is plain code with no model in it. Even a wrong or prompt-injected agent physically can't spend a grower's money. The interesting engineering wasn't making the agents smart — it was deciding where they &lt;em&gt;don't&lt;/em&gt; get a vote.&lt;/p&gt;

&lt;p&gt;Built with Google ADK · Gemini 3.5/3.7 Flash on Vertex AI · Gemma · Cloud Run · Firestore · Cloud Scheduler + Pub/Sub. Data from Sentinel-2 and Open-Meteo, both free.&lt;/p&gt;

&lt;p&gt;Live: &lt;a href="https://fieldhand-web-37zk72cqha-uc.a.run.app" rel="noopener noreferrer"&gt;https://fieldhand-web-37zk72cqha-uc.a.run.app&lt;/a&gt;&lt;br&gt;
Code: &lt;a href="https://github.com/OJ-IRO/fieldhand" rel="noopener noreferrer"&gt;https://github.com/OJ-IRO/fieldhand&lt;/a&gt;&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>automation</category>
    </item>
  </channel>
</rss>
