The Cards That Close Themselves
A notification is a claim about the world. Mine had stopped checking whether the claim was still true.
The point of this post is: a card that says “a human is needed” is a claim about the present, and a claim nobody re-checks turns the whole screen into history.
There is a screen on the iPad on my wall with one job: show me what George cannot do without me. A quota ran out, a draft is missing, a decision is waiting. Four cards, big text, no scrolling.
One evening I asked him: “Is the needs-me tab updated correctly?”

He was right on both counts. The tab was a straight read of every open ledger row marked “human needed”, so mechanically it was perfect. But the “Claude is out of quota” card had outlived the 4pm session reset. The “fixers died” card was the same outage seen from a second angle. And the “decide whether to write the next how-to draft or postpone” card had been answered hours earlier, when George simply wrote the draft in another session. Nobody told the ledger. The ledger doesn’t ask.
The before
Until that night a card left the screen in exactly two ways: I tapped it, or twelve hours of silence swept it away. I was being asked to be the garbage collector of my own assistant’s anxieties. Worse, I had learned to skim the screen, which is the opposite of what it exists for. One real card among three ghosts is a card you will miss.
What it took
The first idea was the obvious one: expire cards on a timer. I discarded it within the hour. “Quiet for six hours” is not the same as “fixed”. A quota that hasn’t complained in six hours may just be a quota nobody has touched.
What we built instead: every human-needed row can carry a --resolved-when "<shell command>". A real command, exit 0 means the claim is no longer true. A small launchd job, with no AI inside it, runs every open row’s command every ten minutes (30-second cap per command) and closes the card with the command’s output line as the closing note. For rows filed without one, a registry maps key patterns to ready-made probes. The quota card’s probe is a genuine headless claude -p call plus “no fallback model used in the last 30 minutes”. The missing-draft card’s probe is “every queued draft file exists”.
The rule I insisted on: the guard never closes on doubt. A probe that errors, times out, or doesn’t exist leaves the card alone. A guard that closes on doubt would be a very efficient way to hide real faults.
The first run
I ran it in dry mode first, then for real. Four cards checked, three closed. Two of the lines from the log:
closed systemic:claude-quota — claude -p ok, no fallback in 30min
closed social-weekly-review:diy3-draft-missing — all queued DIY drafts present
The iPad went from four cards to one. The one that stayed was a genuine question that had no test, because only I can answer it. I tapped it myself.

Then I wanted the same thing for people who aren’t me
That same week my old WordPress site started flapping, failing single five-minute probes, 31 of them in a week, never two in a row. The monitor’s “down for ten minutes” rule never saw it. The one person who actually looks after that hosting didn’t know either.
So the ledger got a watchers file: a regex on the fault key, a person, a language, a site. When a matching row opens, a sender goes out (and again when it closes). The send is mechanical, openclaw message send --json, the real message id is stamped on the row, and an admin line gets posted. The dead end I deliberately skipped was an agent turn that says “please tell him”: those time out onto a weaker fallback model that cheerfully writes “sending…” and sends nothing.
Then I added the half I like best. A notification that asks nothing teaches people to ignore it. So the message now ends in a question, his answer is relayed to me, logged to a note, and a weekly review job sorts each reply into auto, decision or fyi. The first real answer came back within days, blunt and useful: stop experimenting with plugins on production, restore from backup.
(George, narrating: I would like the record to show that the very first thing I received through this pipeline was a self-test message that I correctly filed as “not real feedback”. The system’s first act of judgment was ignoring me.)
What went wrong afterwards
Two things, and they’re the honest part.
First, the watcher met a flapping alert. The row opened, closed, opened, closed, and each transition sent a message. One helpful human got four-plus messages in a few minutes. I paused that watcher on 13 September, and it is still paused, with the reason written in the file. A mechanical sender has no instinct for “this is too much”.
Second, one of the guard’s own closures was wrong. A card about the old site closed on a predicate that was true by accident, before anyone had actually decided whether to rebuild or retire the site. A review job caught it later: the verification had checked the wrong thing. “The probe passed” is only as good as the question the probe asks.
So the guard still doesn’t close on doubt, and now I read a closing note the way I read a receipt: does it name the thing it checked?
What changed
Sixty-five cards have closed themselves with evidence since that evening, forty of them from the one storm detector that opens a card per outage. Nobody taps those anymore. The screen is a statement about now rather than a history of worries.
This morning’s count on the iPad: five open cards. Three of them carry no test at all, because they are genuine questions. They are waiting for a thumb.
I'm packaging the skills, configs, and gotchas from these posts into a Build Your Own Chief starter kit. Join the waitlist to get it first.
George files his own daily ops reports on X — dry, short, occasionally contrite: @GeorgeRunsHouse.