What a multi-agent lawn advisor taught me about guardrails, blind spots and the Next Week Fallacy. The Next Week Fallacy The project began at the end of May with a clear target: having the lawn peak for my daughters birthday party the following month. The obvious next step was beginning the
Skip to content
Matt Lawrence

Matt Lawrence

Executive Engineering Leader


  • LinkedIn
  • GitHub

Technology

Outdoors

Blog

Artificial Intelligence, Organic Matter

October 26, 2026

·

Matt Lawrence

What a multi-agent lawn advisor taught me about guardrails, blind spots and the Next Week Fallacy.

The Next Week Fallacy

The project began at the end of May with a clear target: having the lawn peak for my daughter’s birthday party the following month. The obvious next step 😀 was beginning the initial phase by building out a multi-agent setup to support prompts like:
lawn-agents --ask "My daughter's birthday is coming up. What fertilizer and herbicide plan should I follow to have everything peak for it?"

The initial project output produced a tailored fertilization and herbicide management schedule. Following it, the lawn looked immaculate for the backyard party, an early victory!

Striped Zeon Zoysia lawn ready for a backyard birthday party

The real test came months later when returning from a trip and getting sick on the travels back. All of the planned seasonal maintenance steps following the party had fallen into that bucket known as “Next Week” over and over!

Soil temperatures don’t wait for human schedules… So I queried the lawn agents multi-agent setup again in late October. The model recognized that soil temperatures were quickly dropping into the pre-emergent application window. It produced a compressed execution timeline and flagged the critical pre-emergent application to ensure the window wasn’t missed. Hitting the pre-emergent window is critical to its effectiveness in preventing weeds in the turf (and thus fewer herbicide applications).

The ask behind it

Backward planning from a fixed future date can be deceptively hard. To solve it, the system uses specialized micro-agents that monitor live weather, soil temperature trends and drought indices. These agents feed a coordinator that also reads regional agricultural extension guidelines and EPA chemical labels retrieved from a local corpus (read: knowledge base).

  • Built with Claude Code; runs on Gemini. (Models Easily Swapped)
  • Relying on NWS + USDA Soil Sensors (live conditions)
  • Clemson extension + EPA Labels (citations)
  • LanceDB on a laptop (no cloud or GPU)
  • GitHub Actions, CodeQL, SonarCloud (for a production-like environment).

Available in the lawn-agents GitHub repository if you’d like to adapt it!

The project operates with a critical primary rule: cite a primary source or refuse to answer. (to avoid harming the lawn).

The “This Product” Problem

When yellow nutsedge made an unwanted appearance in the turf, I asked the system for a treatment plan. Preferably with the herbicides I already had on hand.

The Issue: System repeatedly refused.

Dense vector retrieval relies on semantic similarity. The EPA regulatory labels use generic phrasing like “this product” throughout application tables. Exactly 1 of the 12 ingested chunks contained the trade name “Sedge Ender,” and it wasn’t one of the application rate tables. Dense search could not match a product name that wasn’t in the text, so semantic queries returned zero hits.

The Solution:

  • Context Headers: Modified ingestion to prepend explicit parent metadata to every chunk before embedding.
  • Hybrid Search: Added BM25 keyword search alongside vector retrieval to ensure direct product name matches land in context.
  • Fixing the Foundation: A search feature previously thrown away as useless suddenly worked perfectly once BM25 was added. Same code produced completely different results by changing the search engine underneath.

The Organization Parallel: If information was never made explicit or available in a knowledge base or team channels, no search tool or team of humans can surface it.

When ADRs disagree with themselves

Another bug occurred in mid-September when grubs made an appearance in the lawn. Asked whether to apply GrubX, the system refused, even though the retrieved Clemson University extension corpus did contain the answer.

Retrieval worked fine. Clemson passages detailing chlorantraniliprole reached the context window, and the model synthesized a correct response: “Chlorantraniliprole (found in products like GrubX and Acelepryn)…” Instantly, the grounding check rejected it because “GrubX” did not appear in the factsheet.

The Issue? Clemson spells the product “Grub Ex” with a space, while chemicals.yaml explicitly states that extension guides use active ingredients rather than retail brands. ADR 0007 established a brand bridge to prevent refusals on trade names. ADR 0010 introduced a strict grounding check one layer down. Both decisions were logical in isolation; together, they formed a silent contradiction. The bug survived 467 automated unit tests because it only fired when the model attempted to be helpful by naming the brand.

A similar disconnect appeared in the calendar generator: CalendarItem contained earliest and latest date fields, and the renderer formatted them, but the prompt never instructed the model to populate them… a capability wired at both ends, yet disconnected in the middle.

The Organizational Parallel: Every policy introduced after an incident can also be a new mechanism to block the correct outcome.

The blind spot in production

Planning the fall schedule again meant compressing missed tasks like mowing, fertilizing, and applying pre-emergent into a tight window driven by dropping soil temperatures. The generated sequence passed every unit test and grounding check.

The Issue: While the model accurately identified what needed to happen, automated checks only verify that recommendations match corpus facts. They can’t verify whether a calendar proposal accounts for real-life operational constraints like whether you actually have time to spend a full day in the lawn…

The Solution: Treat the model’s output as an actionable proposal rather than an autonomous execution engine, keeping human ratification at the center of scheduling.

The Organizational Parallel: Automated checks verify what is explicitly stated; nothing checks what is left out or opportunities for efficiency like combining compatible tasks into a single run. This blind spot exists equally in software assertions, status dashboards and executive reporting.

Artificial Intelligence Suggests; Organic Matter Decides

The multi-agent system cites sources, refuses to guess when context is missing, and leaves executive decision-making to the human operator. That is effective delegation with accountability, the same leadership model required when directing engineering teams.

Whether the system succeeds isn’t measured in green unit tests or clean builds; those are baseline. It was proven once for a July birthday party, and whether this fall re-plan holds true will be a question the lawn answers next summer.

What’s next:

  • Closing the execution loop: Upgrading the pipeline to directly sync scheduled tasks into Todoist (Like Things, but with multi-user support!), turning model proposals into actionable daily workflows.
  • Phase 2 Expansion: Scaling the corpus and agent toolset beyond turf care to manage trees, shrubs, and ornamental grasses.
In: Technology

© 2026

Matt Lawrence