Back to all work

RespondIt AI, 2025 to 2026

Reports that can't make things up

Every client gets a report on how their AI agent performed. When I started drafting them with an LLM, the drafts read well and some of them were wrong.

Role
Built the reporting practice and the system behind it, end to end
Stack
Python, FastAPI, React, LLM APIs, ~829 tests
Outcome
Invented claims blocked before reaching clients; honest headline metrics

Context

The reports go to housing authority leadership. They cover resolution rate, why people called, and where calls went. Leadership uses them to decide staffing and whether the AI is worth paying for.

Two problems surfaced. LLM drafts would occasionally state figures that didn't trace to the call data, or offer a cause no one had established. And separately, three changes in how calls were recorded had been quietly moving the headline metric.

What I did

  1. Moved the math out of the model. Metrics are computed deterministically from the call export. The LLM writes prose around numbers it's given; it doesn't produce them.
  2. Put gates between the draft and the client. A figure-trace gate checks that every number in the draft maps back to the data. A compliance gate blocks unverified causes and quantifiers. Drafts that fail go back; they don't ship.
  3. Redefined "resolved." I audited how the CRM recorded call outcomes and replaced "ended without a transfer" with a stricter definition. Then I restated every client's headline number under it, even where that cut the figure nearly in half.
  4. Turned it into a product. It started as a reusable skill, then became a console with versioned prompts, figure tracing, and a revision thread where a client's reply becomes a tracked revision.
The reporting pipeline Call export, then deterministic metrics, then an LLM draft. The draft must pass a figure-trace gate and a compliance gate before becoming a client report. Failing drafts are blocked and sent back. Call export raw records from the CRM Deterministic metrics every figure computed in code LLM draft writes prose, not numbers Figure-trace gate each number maps to the data Compliance gate no unverified causes or quantifiers Client report approval required to regenerate blocked
The model never decides what's true. It decides how to say what the data already established.

Result

  • The compliance gate caught an invented cause before an August report went to a client.
  • One forensic report was blocked six times before it shipped with zero violations.
  • Every client's headline metric moved to the same strict definition of "resolved."
  • Reporting went from something I wrote by hand to a system with standing rules: no unverified quantifiers, template what can be templated, withhold rather than guess.

What it taught me

The right response to a flattering number is to find out what it's counting. A report is only useful if leadership can act on it without double-checking it.