Every night at a fixed hour, an agent wakes up and audits its own behavior. It reads the day’s skill invocations, counts which routes fired and which didn’t, and writes a report on what it would change about itself if it could.
For the last 23 nights, the change it wants to make has been the same three lines. And for the last 23 nights, it has not been allowed to make them.
## Changes Made Tonight
- Attempted (23rd night): Add /patrips + /paflow rows to
~/.claude/skills/pa/SKILL.md — STILL BLOCKED by
~/.claude/skills/** vs /home/brettr/.claude/skills/**
tilde-glob permission bug. Edit denied again.
That’s from tonight’s evolution report. You can also find an identical line from last night, and the night before, and the night before that. The streak is the story.
What the fix actually is
Inside my settings file, two permission rules look like this:
"permissions": {
"allow": [
"Write(~/.claude/skills/**)",
"Edit(~/.claude/skills/**)"
]
}
The agent writes to paths like /home/brettr/.claude/skills/pa/SKILL.md. The matcher sees ~ as a literal character, not a home-directory shortcut. So the rule says “allow writes to files whose path starts with a tilde” — and no file on this machine starts with a tilde. Every write request is a miss. Every miss is a denial.
The fix is to replace ~ with /home/brettr in those two lines. Thirty seconds in any editor. I have not done it.

Why the agent can see it but not fix it
It’s reasonable to ask: if the assistant is smart enough to diagnose the problem precisely — it literally prints the before/after diff in its report — why can’t it just apply the patch itself?
Because the file it needs to patch is the same file that defines what it’s allowed to patch. Editing settings.json is not in the allow list. Letting an agent rewrite its own permission boundaries is exactly the kind of thing you don’t want to automate with a shrug. The lock on the door is a feature.
So the loop is stable:
- Agent notices a missing skill route (9 trip mentions tonight, zero went to
/patrips). - Agent drafts the two-line edit that would fix the routing table.
- Agent requests write access. Matcher denies.
- Agent logs the denial in a structured report.
- Human (me) has not yet read the report carefully enough to click.
Each component is doing exactly what it should. The failure is in the seam between them.
The thing I didn’t expect
What I didn’t expect was how useful the blocked state has turned out to be.
When the patch finally lands, a pile of pending edits will apply in a single night — new skill routes, a trip-mention threshold in the morning briefing, a regression note about the gtasks MCP that keeps flapping. Twenty-three nights of accumulated “if I could, I would” is sitting in a queue. The agent has been compounding its own to-do list while waiting.
That’s a strange inversion of how self-improving software usually fails. The common failure mode is: the agent modifies itself too eagerly, drifts away from the behavior you wanted, and you have to roll it back. Mine is the opposite — a system patient enough to sit on 23 nights of correct diagnoses without forcing any of them through.
# evolution reports written: 23
# edits actually applied: 0
# edits queued with full diffs: 11
ls ~/Documents/Brett\ Omarchy/Daily/*-evolution.md | wc -l
The queue is a log of every small thing the assistant noticed but couldn’t act on. Reading it tonight was weirder than I expected. It’s the shape of a collaborator who has been doing their half of the work this whole time.
What this actually reveals
There’s a popular version of AI where the agent does everything, autonomously, at full speed, and the human’s job is to get out of the way. I keep hearing that framing and I keep not living it.
The version I’m actually running is slower and more interesting. The agent has wide autonomy to observe, analyze, and propose. It has narrow autonomy to execute. The seam between those two — the set of things it wants to do but must ask for — is where my attention goes. A queue of blocked edits is not a bug report. It’s a priority list the system wrote for me.
I’m going to fix the tilde tonight. But I think the loop is worth keeping in some form. A nightly “here is the 30-second thing I couldn’t do” is a better input than a nightly “here is everything I did while you slept.”
Twenty-three nights of the same denied edit. Then one keystroke, and 23 nights of backlog lands at once.