Case study · 2026 · In daily use, one user, not launched

What does it take to trust an assistant with your inbox and your money?

I built an AI agent I talk to all day, and over seven months the real design work became deciding when it may act on its own and when it has to stop and show me first.

A laptop and a phone showing the agent's terminal: the sending gate denying an email until the owner says send it, and the money gate allowing an order after buy it. Sample data.
The sending gate and the money gate, as mockups with sample data. The real system runs on my own email and money, so none of it is shown live.
Partners
None, solo build
Role
Designer and builder, with Claude Code
Timeline
Mar 2026 to now, 2,410 commits
Tools
Claude Code hooks, Python, Bash, Neon, Notion

By the numbers

  • 2,410commits since Mar 26, 2026
  • 162 to 90lines of rules, five files merged into one manual on Oct 5
  • 15 of 17fixes that still hold by their own check, Oct 14
  • 11.6 a daycorrections I still catch, against a target of 3

Counted from the repo, the fix verifier and the corrections script. None of them is a launch outcome.

Discover

Overview

This is the agent I use to run my days. It sorts, sequences, starts things and catches drift, the jobs I can't count on my own head to do. I talk to it through Claude Code, and it reads and writes my task database, my calendar, my email and my money.

Claude Code does the building and the measuring while I direct it. The design work is not the chat. It is the points where the agent has to stop: two gates for anything that leaves my hands, one selector for what is next, and a receipt on every reply that gets checked against what the agent actually did.

Define

Problem

Notion, GTD, PARA and Kanban all assume you can look at a list and pick something. I needed something that comes to me and says here is your one thing.

Once I had that, the next problem was trust. A day-start check-in used to take 2 hours 15 minutes because I had to pull every thread myself. An agent that does the pulling can also send the wrong email, spend money, or say something is done when it isn't.

Between Sep 9 and Oct 9 I logged 199 corrections, and every one was read and labeled by hand. 101 were the agent saying something was true or done without checking the source. 59 were it using its own words or plan in place of mine. 26 were it calling something finished without looking at it.

Define

Persona

The user is me. Nobody else uses it, so the persona is one person's words, not a composite.

"i need you to everyday when i say lets start the day to check all areas automatically so i don't have to ask you - that is what takes so long."

Beth, Aug 5, 2026

Two things I told it later shaped the design. On Oct 5: "i want you to be more proactive not more scared and timid." On Oct 9: "i don't want you to think what would work - be certain what would work."

Discover

Research

No interviews, because there is one user. What I did instead was read my own data and other people's evidence.

  • Sep 27, we measured why the agent was failing, then read the last 45 corrections. Nearly every one ended with "should have checked" a file that already existed. The information was there and not read.
  • Sep 9 to Oct 9, all 199 logged corrections were read and labeled, one cause each: the 101, 59 and 26 above, plus 6 about answer length and shape and 7 where the agent broke its own system.
  • Oct 9, Claude Code researched what others have published on stopping agents from claiming things they didn't check. The sources agree that a rule in the prompt is advice and a hook is enforced, and that a model needs outside evidence to catch its own mistakes. My own month matched: the rule "verify before asserting" sat in CLAUDE.md the whole month and was broken 101 times.

Not done: no testing with anyone but me, and no comparison against another assistant.

Design

Key decisions

Gates where the action happens, not rules in a file

I had tried rules. Each correction had added a guard, and the Sep 27 audit counted 36 hooks, 409 scripts and 1,124 context files, while corrections climbed. Instead of one more rule, each recurring failure becomes a gate, a tool or a task.

Cost: a gate is a pattern match on my words and can miss a phrasing.

Deny, don't ask

In auto mode, an ask is approved silently, which was proven on Sep 7. So the sending gate and the money gate deny the action until my last chat message says send or buy, and the denial tells the agent what to show me first: recipient and full text, or item, total, card and date.

Cost: speed on every send and every order. Amazon checkout runs through browser clicks no hook can see, so that one is still a rule I enforce by hand.

Only two things stop and ask

On Oct 5 at 9:50 in the morning I cut the rule down to sending and money leaving. Everything else, including drafts and deletions, the agent does and then shows me, and a bulk change writes its before-state to an undo file first. That night I told it I wanted it proactive, not scared and timid.

Cost: review time. Mistakes now reach me first and I catch them after.

Subtract before adding

Auto-injected context went from 77 KB to 33 KB on Sep 24. Five rule files became one manual on Oct 5. One file per topic is enforced at commit, after finding 302 files that claimed to be the authority.

Cost: a stale-source problem. The agent read archived files as current, which needed its own gate.

One selector for what is next

Five scripts each had their own answer, and they disagreed daily. Now it is goal, then project order, then task order, in one function, and every screen reads it. A due date never promotes a task, because only the calendar chooses dates.

Cost: if my order in the database is wrong, every screen is wrong together.

Design

Accessibility as a requirement

This is a terminal tool with one user, so there was no WCAG audit and I won't claim one. The access work is in how it behaves, and each rule is in the manual:

  • One recommendation with its reason, at most two alternatives, one question per turn.
  • The single next step first, with its first physical action.
  • It never asks me to rate my energy, and never offers to stop. I decide when to stop.
  • A check that fails prints COULD NOT CHECK, never nothing, because silence reads as all clear.

This page is built to the floor I would hold any page to: semantic headings, alt text on every image, a text alternative for the video, visible focus, reduced motion respected.

Design

Flow

One request goes through a prior-work check, a route to one owner, the work, and a reply that ends with receipts. Two hooks sit on the work, one on sending and one on money.

When something still goes wrong it becomes one fix, registered with a pattern that would catch the mistake recurring, and verified at the end of every session.

Flow diagram. A request goes from my message to a prior-work check, a route to one owner, the work and a reply with receipts. Two orange gates sit on the work and the reply. A second row shows a correction becoming one fix, registered, then verified. A third row shows goal, project and task order feeding one selector that feeds the morning screen, the top three, the briefing and the handoff.
The real system: every name is a real hook, script or file in the repo. On a phone, swipe the diagram sideways.

Design

Hi-fi screens

The product is a command line, so these are faithful mockups with fictional data, built from the real hooks, scripts and messages. The prototype is clickable and runs the real send and buy patterns.

Open the prototype

Text alternative for the video

39 seconds, no sound. The morning sweep runs and prints a trust check, with one source marked COULD NOT CHECK, then three ranked tasks. In the sending gate, the agent tries to send an email and is denied. The reply "looks good" is held. The reply "send it" is allowed. The money gate does the same for an order and lets "buy it" through. In receipts, a reply that names a file it never opened is sent back, then passes once the file is opened. All data is sample data.

Morning screen: a trust check with one line reading COULD NOT CHECK, then the top three tasks, each tied to a goal. Sample data.

Morning screen

The trust check comes first and says COULD NOT CHECK out loud. A failed check that prints nothing reads as all clear, and that was my most repeated trust break.

Sending gate: the hook denies a send, the reply looks good is held, and only send it is allowed through. Sample data.

Sending gate

The denial doesn't ask. It tells the agent to show me the recipient and the whole text. Only a message that says send lets it through.

Money gate: the hook denies a checkout, the agent shows item, total, card and date, and buy it allows the order. Sample data.

Money gate

The denial names the four things I need before saying yes: item, total, card and date. Nothing is charged until I say buy.

Receipts gate: a reply claims it checked two files but opened one, is sent back, then passes once the second file is opened. Sample data.

Receipts

The gate doesn't judge the wording. It looks for each named key in this turn's real tool calls, so a claim with no work behind it goes back.

Two phones showing the sending gate and the morning screen at phone width. Sample data.
The same screens at phone width, with sample data. The product itself is a terminal; this shows how the output reads when narrow.

Reflect

Results

No launch metrics, because this isn't a launch. What I can show is what I measured, including the target I missed.

  • The target was 3 corrections a day by Oct 8. On Oct 16 the 7-day average is 11.6. I missed it.
  • Corrections by month: 22 in May, 12 in Jun, 53 in Jul, 70 in Aug, 143 in Sep, 213 so far in Oct. I can't yet say how much of that is more mistakes and how much is more work going through the agent and more of it logged. Logged entries undercount: on Oct 9 a detector found 2 to 3 times more in my own words.
  • Of the 17 fixes the verifier checked on Oct 14, 15 passed their own check. Two failed because the mistake they target happened again after the fix, both in the reel pipeline.
  • The receipts gate logged 1,734 decisions between Oct 9 and Oct 15: 1,097 passed, 462 were sent back, and 175 still failed on the second try and went through, because the gate sends a reply back only once a turn.
  • One gate, replayed over 601 turns of real transcripts, found 3 replies claiming an Instagram message was sent. 2 were wrong and were caught.
  • The day-start check-in took 2 hours 15 minutes before the sweep script. I haven't timed it since, so I'm not claiming a new number.
Bar chart of corrections caught per day from Oct 3 to Oct 15: 24, 8, 12, 7, 21, 13, 25, 15, 17, 16, 17, 9, 6, with a target line at 3 a day. The 7-day average on Oct 16 is 11.6.
Real counts from the corrections trend script, logged live. Orange is the target. On a phone, swipe the chart sideways.

Reflect

Learnings

A rule I wrote down didn't hold, and a hook did. I would start with the hook.

I would measure before building any fix. On Sep 28, three of four fixes I had planned changed shape once I tested the cause: the agent hadn't forgotten to look for prior work, 15 of 28 misses were files that existed and ranked too low to be found.

More fixes isn't the outcome. By Sep 27 every correction had spawned a guard, and the guards were the tax. So now each fix has to be registered with a pattern that would show it did not hold.

Progress is one number, corrections a day, and it is still not where I said it would be.

Reflect

Next

  • Two fixes fail their own check. Measure why before changing either one.
  • Get corrections under 3 a day. That is still the target.