
An AI coding agent bills you per task and tells you it succeeded. Nobody goes back a week later to check whether the code it charged for is still in the repository, or what the context window was actually spent on. IBM Bob measures both, precisely, on every task. Then the session closes and those numbers are gone. I ran into this while building something else. A Bob session was charged for a 65-byte divide-by-zero guard. A human approved it after 9,567 milliseconds of review. That guard never reached git HEAD. Three commits touch the file and none of them contain it, and every system in the chain, Bob included, reported the task a success. Receipts reads Bob's exported task-session JSON, and nothing else, and writes one static page, committed to the repo. For each task it finds the commit that task produced, then runs git blame at HEAD to count how many of the lines it wrote are still there. It also reads back the context breakdown Bob already records. This snapshot covers 6 sessions across three workspaces. 1.894928 Bobcoins billed. 27 of 29 authored lines still credited to Bob at HEAD. One session was paid 0.285058 Bobcoins for a single line that a human rewrote one commit later, and 3 more never reached a commit at all. Those last two get counted separately, because code somebody threw away and code that never landed are not the same problem. The finding I did not expect came out of Bob's own numbers. In the heaviest session, 19,009 tokens, or 63.4% of the itemised context window, were skill definitions sitting in context before the operator typed anything, while the loadedSkills array in that same export was empty. It is empty in all six. Across the corpus the figure moves between 18,572 and 19,009, so the page reports the range rather than an average that would look more certain than it is. It is built for whoever signs off on the spend. You export a session, run one command, and the page regenerates. Open any row for its commit, per-file line counts and how the join resolved. Hover the context bar to read each bucket. Where a rule fires, you can copy the task text and hand it back to Bob yourself. Receipts writes that text and nothing more. It has never sent anything to Bob, and the page says so. There is no model call anywhere in it. The measurement is git blame and arithmetic over committed files, so the same repository always gives the same answer. Clone it and run node tools/replay.mjs: it rebuilds the sibling workspaces from checked-in history, re-derives the verdict, and exits non-zero if it disagrees with what I shipped. Then it caught me. Writing the rule engine overwrote a JSDoc line Bob had authored, that session dropped to 24 of 25, and the corpus went from 28 of 29 to 27 of 29 on its own. I did not touch a figure.
27 Sep 2026

THE PROBLEM Sales reps improvise on live calls. One sentence - "we can do a verbal discount on the extra seats" - can promise something the signed contract forbids. Nobody catches it while the call is happening, so it surfaces weeks later as a customer dispute instead of a one-sentence correction. WHAT IT DOES Upload the contract PDF and ClauseCatcher pulls out every clause, word for word. During the call: 1. AssemblyAI Streaming STT v3 transcribes the rep continuously, seeded with keyterms from the contract. 2. Each finished sentence is checked against that customer's clauses. The model returns only a verdict and a clause ID - never text. 3. On a contradiction, an AssemblyAI Voice Agent reads the contract's literal clause aloud, mid-call, and the cockpit shows the alert. WHY IT CAN BE TRUSTED Everything spoken or shown is the contract's own words. The LLM picks which clause applies; it never writes clause language. A failed or timed-out check resolves to "unclear", never an accusation, and the app says so on screen rather than claiming a clean call. MEASURED, NOT PROJECTED - 14 of 14 contradictions caught, 0 false alarms, correct clause every time, across 32 labelled sentences (median 3.5s). - Alerts land 4-6.5s after the sentence ends, across five logged live runs. - $0.08-$0.15 of API cost per call, by the app's own meter. - 151 backend and 42 frontend tests pass. TRY IT Live: https://clausecatcher.onrender.com - no microphone needed, click "Use the demo contract", start the call and type into "Simulate rep line". Free tier, so allow ~60s to wake. MARKET BLS counts 1.59M US wholesale and manufacturing sales reps. At a $30-60 per-seat hypothesis (untested with buyers), that is a $0.6-1.1B serviceable market; the beachhead is the 292,000 technical and scientific reps on the hardest contracts. WHAT'S NEXT Zoom and Google Meet audio, CRM write-back, multi-contract accounts, and a paid per-seat pilot.
30 Sep 2026