WORKBENCH PROTOTYPE. FICTIONAL COMPANY. SYNTHETIC DATA.BACK TO THE WORKBENCH

Fictional company (Kestrel Supply Co.). SYNTHETIC data. ILLUSTRATIVE prices. Proof of concept.

AI Spend and Value Tracker: case study

Fictional company (Kestrel Supply Co.). SYNTHETIC and ILLUSTRATIVE data. Proof of concept.

The problem

Companies buy AI seats quickly and review them slowly. A usage report shows who used a tool, not what the work was worth. A leader still has to decide which tools to keep, which to trim and which to question. I wanted to build that decision for a made-up company, show my working, and be clear about how sure the answer is.

What I built

I built a generator that makes 52 weeks of synthetic usage for 80 staff, with problems hidden in it on purpose. I built a seat classifier that sorts each of the 120 seats into a state. I built a range model that turns hours saved into a return, always as low, base and high. A set of rules gives each of the six tools one answer, and says how sure it is. I built a static page where a reader can change the assumptions. It draws the seats as stools in a members' cafe. I also built a one-page memo. It is a proof of concept on synthetic data. It has not been used on real data.

What I expected

I wrote these expectations before I saw the page. They are in preregistration.md, committed on 2026-10-26 in commit cd2e04a, and copied here without a change.

Written 26 October 2026, after I had seen the verdict table and both challenge rounds.

1. What will confuse a first-time viewer most on the dashboard?

Terminology. How to read the dashboard if they don't know the terms. Too many sidebars and menus to click into. They'd need a clean, clutter free dashboard with adjustments that is all on one page - that can be scrolled up and down.

2. Will the memo number-trace fail on its first run, and why?

Yes. If people round up - for example, “about $4,300” when the file says $4,285. They calculate new figures “roughly a quarter of seats” that nothing stores. They reword. They aren't meticulous and don't enter data verbatim.

3. If a reviewer sets hours saved to 0.5 a week, which verdicts do you expect to move?

Dollar amounts.

4. On a real company’s data, what would break in this method first?

Messy exports. Date formats, missing user IDs, one person with two emails.

Out-of-date HR records. The leaver check depends on the roster being right.

Seats that don’t map to one person. Team accounts, contractors and service accounts.

Change management. Reclaiming seats feels unfair to the people who lose them.

5. What would change your mind about the transcriber’s “investigate” verdict?

Moving to keep: people read the emailed summaries and never need the full transcript, so “opened” understates the value.

Moving to cut: interviews show nobody uses it, and nothing else depends on it.

Something else entirely: a records or compliance requirement means you have to keep it regardless.

The numbers

Every figure below is read from the file named beside it by a script. All money is for one month, and prices are ILLUSTRATIVE.

Seats classified. The classifier scored 120 seats (results/recovery.json). 116 are paid for and 4 were already cancelled (results.json). Of the 116 paid seats: 85 active, 13 light use, 9 idle, 2 never used, 3 owner has left, 4 new starter (results.json).

Money that is not earning its keep (results.json). Idle seats (certain): $480 to $520 a month, from 13 to 14 of 116 seats. Consolidation savings (a choice): $0 to $315 a month, up to 9 seats. The two are never added together.

An answer for each tool (results.json). Break-even hours are the hours a week each active user must save for the tool to pay for itself. They run from the dearest hour to the cheapest. An hour of time costs $45, $65 or $90 (low, base, high), and a month is 4.33 weeks (assumptions.yaml). The hours saved are my guesses.

The numbers: table with columns Tool, Answer, How sure we are, Break-even hours a week
ToolAnswerHow sure we areBreak-even hours a week
Chat assistant AConsolidateLow0.118 to 0.236 (base 0.164)
Chat assistant BConsolidateLow0.103 to 0.207 (base 0.143)
Coding assistantKeepHigh0.154 to 0.308 (base 0.213)
Image generatorRight-sizeLow0.11 to 0.22 (base 0.152)
Meeting transcriberInvestigateHigh0.073 to 0.145 (base 0.1)
Support-desk AI add-onRight-sizeHigh0.185 to 0.371 (base 0.257)

Recovery of the problems I planted (results/recovery.json). Precision is the share of what was flagged that was planted. Recall is the share of what was planted that was flagged. 6 Retail seats and 4 Finance seats were set as traps, because their quiet spells are normal. None was flagged idle (0 trap failures, 0 edge-case failures).

The numbers: table with columns Planted problem, Planted, Found, Precision, Recall
Planted problemPlantedFoundPrecisionRecall
idle seats9911
never-used seats2211
seats of people who left3311
new starters4411
people using two tools for the same work9911
the pair of overlapping tools1111
the tool whose output is rarely kept1111
the tool with heavy, well-kept use1111

Hard cases, before and after (results/challenge_baseline.json, results/challenge_after.json, results/challenge2_baseline.json and results/challenge2_after.json). The hard cases were suggested by Claude in chat and approved by me. I ran the checker on them first without changing it, then fixed what it missed. The fixes are in the log below.

The numbers: table with columns Round, Cases, Checks, Passed before any fix, Passed after the fixes
RoundCasesChecksPassed before any fixPassed after the fixes
The first round52817 of 2828 of 28
The second round3168 of 1616 of 16

What failed

The entries below are copied word for word from the failure log. Every entry is in the technical log. The page has a short version in its "What failed" part (site/index.html#failed). After each entry, I say what it taught me and which of my expectations was wrong.

2026-10-26 07:23 Phase 2: the traps did not bite my first classifier (no failure to report)

What it taught me, and which expectation was wrong. The Retail and Finance traps did not trip my first classifier. It scored perfectly, which told me little. I wrote the data and the checker, and set the limits with the data in front of me. A perfect score on my own data tests the code. It does not test the world.

2026-10-26 07:44 Challenge baseline: most of the passes prove little

What it taught me, and which expectation was wrong. 17 of 28 sounds respectable, but 8 of those passes were controls, which only show the checker works. The hard cases told the real story. I now ask what a pass could have missed before I trust a score.

2026-10-26 07:44 Challenge case 5 (missing telemetry): a documented blind spot is read as idleness, and evidence strength does not drop

What it taught me, and which expectation was wrong. A silent log is not the same as an idle person. When a tool cannot record some of its use, a quiet seat proves nothing. My first version called those seats idle and stayed confident. I now treat missing records as a reason to be less sure, not as evidence.

2026-10-26 14:34 Challenge cases 1 to 8 were labelled as Chris's, and Chris did not write them

What it taught me, and which expectation was wrong. The hard cases were labelled as mine, but Claude suggested them in chat and I approved them. That matters, because who writes a test changes what it proves. Cases I only approved are not independent evidence either. I now say plainly who did what.

2026-10-27 06:14 First version of the page failed Chris's review

What it taught me, and which expectation was wrong. My first version of the page was long, dense and full of jargon. I reviewed it and sent it back. A correct page that a newcomer cannot read does not help a decision. The redesign cut the length, the sliders and the jargon. I now judge a page by whether a newcomer could explain it after a short read.

2026-10-28 13:15 The animation rows were marked verified before Chris could see the animation

What it taught me, and which expectation was wrong. I told Claude Code the animation had passed my tests. It had not. Windows had animation effects switched off, so I had only seen the still picture, and the log recorded "verified" for something I had not watched. The page's own note gave it away. Now "verified" means only what I have seen myself.

What the method cannot tell you

Activity is not value. A busy tool can be low value. A quiet tool can be critical. Return figures rest on my assumptions. The interactive page lets you change them.

What I would do differently

I would run this against real data, with the right approvals and a real administrator who can act on a seat. I would interview heavy users, and the teams behind quiet seats, before trusting any verdict. I would have someone else write the hard cases from the start, so the person who wrote the classifier does not also mark it. I would add a check that looks at the finished page from day one, because layout problems reached me before any check looked.

Limits

Synthetic data with problems I seeded myself. The analysis finds what I planted, which is a test of the code, not of the world. Not a production tool. The classifier, the data, the checks and the dashboard were all built by one person with AI help.