Every month I sit rink-side and do the same reconciliation. My state requires 875 hours of homeschool instruction per school year, and I have to be able to prove it. The proof lives in four exports: a math-practice platform, a reading log, a calendar feed, and a prose progress summary.
The four sources disagree about almost everything that matters.
One export counts "a month" as a rolling thirty days; the law counts calendar months. One logs an 85-minute session span with zero activity events inside it — elapsed time, not attention. Two files carry the same name and different numbers. A summary declares a total that its own detail rows don't add up to.
For months I merged all of this by hand. And here is the thing I learned doing it: the danger was never the workload. The danger was that every wrong way of merging them still produces a clean, confident, plausible number. The rolling-window mistake produces a number. The double-count produces a number.
And the stakes are bigger than one year's checkbox. 875 hours is this state's number — homeschool requirements differ state to state, and they change when you move. What my family actually needs is an archive that travels: proof of what was actually learned, every digit able to show its evidence, credible in front of whoever asks next — another state, a school, any future that asks what my kids can actually do. A confident total that cannot show its receipts stops being worth anything the moment the audience changes.
So when Google's All Things Agentic hackathon asked for an agent that takes a messy, multi-step chore off your plate — bring your own friction — I brought this one. The agent is called unreconciled. Its tagline is the rule I had already been enforcing by hand:
What "autonomous" means here
The obvious way to build this is a chatbot that walks me through my files. That is also the wrong way — a chatbot asking "does this look right?" forty times a month is just my manual process with extra typing.
Instead, one trigger walks five months of evidence through the whole pipeline, unattended, in about eight seconds — live model calls included. Per batch and per row, the system decides among three exits:
ATTESTED FLOOR
A confident minimum. Every digit walks back to a source row. It may understate; it may never overstate.
REFUSED
Coverage is structurally broken. No number is emitted at all — a partial total would still read as "the total" downstream.
HELD
Suspicious but not decidable. A person is asked, and the hold names the exact evidence that would settle it.
In the demo round there is a garbage file sitting in the middle month, on purpose. The parser refuses it loudly — a guessed timezone would produce well-formed wrong timestamps — files the refusal as that month's outcome, and the months after it keep running. No prompt is answered mid-round. I show up after, to read what was held.
Refusal is not the system failing to act. Refusal is the autonomous action.
All Things Agentic hackathon artifact
Watch the unattended round run
The experiment that surprised me
The architecture keeps the models on a leash: a reader model proposes a pointer— the figure plus the verbatim sentence it came from — and ordinary code re-checks both halves against the raw bytes before anything counts. So I expected a tidy story: weaker model, more misreads, gate earns its keep on a nice rising curve.
The measured result refused to cooperate. Across five readers on 48 synthetic months each — the shipping Gemini 3.6, three Gemini 2.5 tiers, and an open-weights Gemma 4 — the prose barely gets misread at all: the cheapest Gemini slipped twice, the other four never. I could have made the synthetic prose nastier until the curve appeared. I didn't, because manufacturing difficulty to flatter your own mechanism is exactly the confident-wrong-number behavior this system exists to refuse.
One of those misreads was worth the whole experiment. The cheapest reader grabbed the monthly goal— a planned figure, stated right there in the text — as the actual total, verbatim quote and all. The leash admits it, because the quote really is verbatim. And then the corroboration check downstream names the gap to the digit, and nothing reaches the floor. A wrong read cost a question, not a wrong number.
That is the honest headline: a weaker reader cannot make this system lie. It can only make it ask more often.
The other number I care about
An agent that refuses everything is 100% safe and 100% useless. So the refinement axis is measured too: the coarse rules asked a person 231 timesacross 60 months; refined rules — where a scenario may leave "ask a person" only by naming the evidence that decides it mechanically — asked 40 times. The attested floor never moved above truth in either configuration, and floor completeness went from 90.1% to 100%: the coarse rules had been holding real instruction hostage.
| measured | gates off / coarse | gates on / refined |
|---|---|---|
| Confident-wrong totals | 180 / 400 | 0 / 400 |
| Human asks, same 60 months | 231 | 40 |
| Floors above truth | 0 / 240 | 0 / 240 |
| Wrong figures attested, 5 readers | 0 / 240 — worst misread rate 2/48, held or refused, never landed | |
Shrinking the held set without adding evidence would not have been refinement. It would have just been confidence.
Where it runs
Gemini 3.6 Flash + ADK Python + Cloud Run, sessions persisted in Cloud SQL — because an agent that forgets its own attestation history on every container recycle would be one more source that disagrees with itself. The repo, the seeded experiments, and the unattended-round capture are public.
The first real month-end this system runs for its original owner is September. The residue of holds is my roadmap: every one of them prints the evidence that would retire it. And the archive is the long game — it follows the learners, not the state.
Hackathon proof points
- Track: Google All Things Agentic Hackathon, The Taskmaster.
- Workflow:one trigger, five months, three exits — unattended, ~8 seconds, refusal included.
- Architecture: models propose pointers; ordinary code re-grounds, gates, and holds; the floor is a minimum, never an estimate.
- Impact: an evidence archive that stays credible wherever it travels, because it never claims what it cannot show.
All demo data is synthetic by construction — seeded generators, planted defects, no real learners anywhere in the repository. That is the privacy boundary, not a shortcut. I created this post for the purposes of entering the All Things Agentic Hackathon.
