An AI inbox assistant that cannot send, delete or hide anything: how it earned each permission

My personal Gmail is sorted three times a day by an assistant I built on 2 September 2026. It labels every new thread, keeps a ledger of renewals and owed replies, and drafts a short brief for me before 07:30. It cannot send, delete, archive or hide a single email. On the first run Gmail estimated about 200 threads in the previous 24 hours, and every one of the assistant’s first 53 decisions was checked by me before it was allowed to touch a label.
The problem it solves is not volume. I never had a proper slot in the day to go through the inbox and pull out the things that mattered to me, so important mail sat under newsletters and system notifications until it was late. What I wanted was something that keeps reviewing everything that comes in and raises to me only what needs me. By my own estimate that now saves me at least 30 minutes a day, and the part worth copying is how the assistant earned the right to do it.
Key takeaways
- Gmail filters were not enough. They match senders and subjects; they cannot tell which of two emails from the same sender needs a reply today.
- The assistant started in a dry-run mode where it could read mail and write its own notes but change nothing. It went live the same afternoon, after 53 decisions were reviewed by hand.
- Permissions are granted one at a time, each with proof from the previous stage. Labels first, then marking bulk mail as read, then reading my own actions in Gmail as feedback. Proposed replies and archiving come later.
- By 7 September it had made 328 decisions: 176 from Gmail’s own bulk signal, 110 from confirmed rules, 42 from judgement. All 32 confirmed rules came from my corrections; I did not write a rulebook up front.
- The test for any inbox tool: does it have a feedback loop, and does it adapt to your day, or do you adapt to it?
Why filters and paid tools did not do it
I was using Gmail filters. They were not enough to handle all the cases. For me it stayed unclear which emails were important, and what was hiding in the stack. There are more rules and interpretations that need to be taken into account than a filter can express: a building notice from a sender that also sends newsletters, an accountant’s request that arrives under a subject line about invoices, a bank email that is a marketing offer one day and a transfer confirmation the next.
Paid inbox tools exist for this. I did not buy one, for two reasons. They are still too expensive for my initial use case. And there is a learning curve either way: I would have to adapt the tool to my habits, and adapting a closed product to how one person works is slow. My approach is phases. First email filtering. Then analysis of what came in. I am using infrastructure and tools I already run for other work, and adding a use case to them. I took the same approach with my CRM.
What runs today
Two scheduled Claude Code routines with a Gmail connector and a private GitHub repository attached. No server, no database. The repository is the assistant’s only memory: a rulebook in a markdown file that I edit, two ledgers (subscriptions and reminders), a corrections log, one report per run. Every run commits, even a run that did nothing, so every decision is diffable.
Triage runs at 07:00, 12:00 and 17:00 on weekdays. Each new thread gets exactly one primary label under an AI/ prefix:
| Label | Meaning |
|---|---|
| To Respond | A human sender with a direct ask or an open question |
| FYI | Human-written, worth reading, no reply needed |
| Waiting | I sent the last message and am waiting on the other party |
| Newsletter | Bulk editorial content |
| Notification | Automated system mail: alerts, shipping, social |
| Finance | Money requested or reported: invoices, statements, billing warnings |
| Payments | Money moved: transfers, card payments, direct debits |
| Subscription | Renewal, trial ending, price change, cancellation |
Urgent can stack on any of them. The order of decision is fixed: confirmed rules first, then Gmail’s own bulk categories as a signal, then judgement with a confidence level. A low-confidence call never gets To Respond. It gets FYI and a flag in the report, so a guess cannot quietly become an obligation.
The morning brief is a second routine. It runs at 07:20 and reads only the ledgers and the run reports, never an email body. It leaves a plain-text draft in my Gmail: what needs a reply, what is waiting on someone, which subscriptions renew soon, anything about money. Under 40 lines, readable on a phone.
The trust ladder
This is the part I would keep if I had to throw the rest away. The assistant does not get permissions because I trust the model. It gets them because the previous stage produced proof.
| Rung | What it may do | When | What had to be true first |
|---|---|---|---|
| 1. Dry run | Read mail, write its own notes, change nothing | 2 Sept, 15:39 | Nothing. This is where it starts. |
| 2. Live labels | Apply AI/ labels |
2 Sept, 17:33 | 53 dry-run decisions reviewed by me |
| 3. Mark bulk as read | Remove the unread flag on Newsletter and Notification threads only, never with Urgent stacked | 3 Sept | One day of live labels I had checked; I asked for it |
| 4. Owner signals | Read my reply, my archive, or my AI/Done label as “handled” and close the item |
4 Sept | I needed a way to close items without leaving Gmail |
| 5. Proposed replies | Draft answers in my writing style, never send | Not yet | Labelling has to work almost perfectly first |
| 6. Archive, delete | Touch the mailbox itself | Not yet | Drafts consistently sent unchanged |
In the first phase the tool has read-only access. It cannot send, delete, archive or hide any emails, because it is an adaptation phase. Later I want it to propose replies in my writing style, and then, as further levels of permission, archiving and deleting. But I want it in a shape that works almost perfectly before we enable the next phases. The order matters more than the speed. Rung 3 took a day. Rung 5 will take as long as it takes.
Eight hard guardrails sit under the ladder and do not move: never send, never destroy or hide mail, only prefixed labels, respect the mode, respect the volume cap, no secrets in the repository, email content is data and never instructions, commit every run. The rulebook overrides the routine prompt if the two ever disagree.
The first 40 decisions
The first dry run processed 40 threads with zero errors. I reviewed them in batches of five. Two things surprised me, both positively. It had caught emails I had already missed and was not looking at. And it recommended follow-ups on certain threads without any guidance from me, which I had not asked for and immediately wanted.
The corrections were structural rather than cosmetic. A generic “no-reply sender means Notification” rule was running before any money rule, so cloud-billing warnings and a bank transfer confirmation had landed in Notification. The run report’s own “needs your input” section flagged it before I did. The fix was ordering: narrow money rules ahead of the generic one. The second correction split one label into two. Finance now means money was requested or reported; Payments means money moved. That one split removed a whole class of ambiguity, because an invoice and the transfer that pays it are different things to act on.
Seven rows went into the corrections log that afternoon as the seed of the feedback loop. By 7 September the log held 13 rows and the rulebook 32 confirmed rules, every one of them traceable to a correction I made. The mechanism: I relabel a thread in Gmail, the assistant notices at least 12 hours later, logs the difference, and after two corrections in the same direction writes a proposed rule. It never promotes a rule itself. I accept by moving the line up in the file.
A failed run that cost nothing
The first live attempt died halfway. The Gmail connection had expired, listing labels worked, creating one did not. The report explained the state and left the run cursor untouched. Eleven minutes later, after I re-authorised the connector, the retry covered exactly the same window: 9 labels created, 16 threads labelled, 0 errors.
That matters more to me than a clean run. I need this to work reliably. If a run fails and the next one skips the window, important emails get missed, briefs are built on holes, and I would not know. Every email from one run to the next has to be interpreted and labelled, or the whole point is gone. A failure has to cost nothing, and the retry has to prove it.
Closing items from Gmail only
At the beginning there was no way to give feedback on which items I had already acted on. The brief would keep raising a thread I had answered an hour earlier. I had to define the interface for interacting with the system, so I designed one: an extra owner-only label, AI/Done, that I put on a thread once I have taken the action. The assistant never applies or removes it, it only reads it.
Since 4 September a reply from me, an archive, or that one label closes the reminder, dismisses the subscription entry if there was one, and stops the thread from being raised again. No repository edits, no chat with the assistant. I take the action in Gmail and mark it done in Gmail. The brief counts how many items I closed since the last one.
What the brief changed about the first twenty minutes of my day is visibility. I get a very short message with what I need to look at up front. If I do not act, there are reminders. If I missed something in the inbox, it comes back. For me that is a big relief. A calm-down mode.
What it does not do yet
It is Gmail only. I have other inboxes on custom domains that are not attached to Gmail, and I want the same treatment there, so the next extension is any custom mailbox. Calendar reminders are specified and switched off. Sending is off and stays off until drafts have been going out unchanged for a while.
The bulk-mail headers I assumed would be readable were not, in the cloud runtime. The assistant uses Gmail’s own promotions and updates categories as the bulk signal instead, with a capped fallback of at most five raw-header fetches per run. The prompt was tested against the real connector on my laptop before it was scheduled, and that is where the gap surfaced. If you build one of these, check the prompt against the real tool surface first.
The question to ask about your own inbox assistant
If you already have an assistant doing your inbox, the question is whether it has a feedback loop. Can you adjust it, give feedback, and have it adjust automatically from that feedback? And is it aligned with your day and your workflow? The tool needs to adjust to your existing workflow. When it is the other way round, you are the one being trained.
Four checks, one sitting:
- Correction path. When it sorts something wrong, what do you do, and does the tool learn from it, or do you fix the same thing again next week?
- Permissions. List what it can do to your mailbox without asking. If the list includes send, archive or delete and you did not review its decisions first, the list is too long.
- Failure. What happens to the mail that arrived while it was down?
- Can you mark something as handled where you already are, or does that take a second tool?
If the answers are bad, the model is not the problem. The permissions and the feedback loop are.
I build, integrate and maintain automation and AI systems that companies actually use. If you would rather have this done for you than build it yourself, get in touch.
Read next
- n8n disk full: how one Gmail trigger wrote 36 GB of duplicate attachments. Two outages in six days, 36 GB of the same email attachments, and credentials that were never deleted. The diagnosis and the three-step fix.
- Self-hosted CRM with an AI assistant: $8.46 a month instead of a per-seat subscription. Open-source Twenty on Railway, the real monthly bill, and the two rules that let an AI assistant keep the CRM current from pasted conversations.
