ASK MY AI
Life OS · all systems

The bookkeeper

Saying "done" is not the same as being done. One list where finishing and recording are the same act.

livesince Sep 2026in the repo: the register

07:15 · checking open to-dos against the world

✓ closed Mail the signed form to the HOA

evidence: found in Sent, Oct 21 4:02 p.m.

✓ closed Save the tax receipts folder

evidence: file exists

· open Book the oil change

no calendar event yet

Reply blocked

It says “booked the oil change”, but that to-do is still open. Close it, or fix the sentence.

Sample with invented data. The real one looks the same.

What it does

  • When a to-do is opened, closed, snoozed or dropped, one record changes and every older list is regenerated from it in the same step.
  • When a to-do can be checked against the real world (an email in Sent, a file on disk, an event on the calendar), a 7:15 job checks and closes it with evidence.
  • When Claude ends a reply saying something is finished while the record is still open, a hook stops the reply until it either closes the item or fixes the sentence.
  • Once a week it audits for rot: things the diary calls finished that are still open, "I can't" claims nobody proved, reminders long past their date.

How it works

  1. 1 · Hears

    One file holds every promise. One command is the only way to change it, and a mistyped id fails loudly.

  2. 2 · Thinks

    Where the world can answer "is it done?", it asks the world: Gmail, the calendar, the file system, the house.

  3. 3 · Does

    Views, reminders and the diary update together, so the record is a side effect of doing the work.

What broke

  • "Delete it", in prose

    A review concluded a reminder was moot and wrote "delete it" into the notes. Nothing reads notes, so the reminder kept nagging for 21 more days. The rule since: prose is not an action.

  • A typo that read like success

    A close ran against a mistyped id, failed silently, and the session reported it done. The reminder went on nagging for two days. Now failures are loud.

  • The checker that cried wolf

    Its first version matched words across sentences and declared an unrelated task finished. It was rewritten to work sentence by sentence, and both real cases are kept as tests.

By the numbers

280
promises recorded
7:15
daily check against the real world
7
kinds of rot it audits

The call that mattered

A false block costs one extra step. A false "done" costs a missed deadline. So the checker errs toward blocking.

Built with

Node.js, no dependencies · Claude Code Stop hook · Gmail + Calendar checks