Permissions | Blog

~/blog/tag/permissions

Permissions

What the agent is allowed to do, which of those rules actually hold, and the difference between a boundary and a suggestion.

What I write about here

Permissions are where the gap between what you configured and what is actually enforced shows up fastest.

The recurring finding across these posts is that the two halves behave differently. A rule that takes capability away tends to bind immediately and everywhere. A rule that hands capability over waits for something: a dialog someone has to accept, a workspace someone has to trust, a mode that is not active in the session you happen to be in. Write both into the same file and only one of them is doing what you think.

The second recurring finding is that a permission boundary is usually thinner than its name suggests. A denied path can still surface in the output of a shell command that lists it. An approval given inside a throwaway workspace can outlive the workspace. A file that keeps local overrides out of git turns out to be excluded by a global ignore rule that the repository never records, so a hand-created one has no protection at all.

None of this is an argument against configuring permissions. It is an argument for knowing which of your rules are load-bearing. The ones that restrict, plus a hook, are the two things that hold on their own.

The wider picture of what you hand over when you give an agent tools is in the MCP and security guide.

latest
securitytoolingpermissions
10 minInfrastructure #5

CI runner security when an agent writes your workflow

Self-hosting your forge and your runner is a defensible call in 2026. Nobody writes the CI runner security guide for the platform you moved to, and an agent permission model built around a dialog does not survive the trip into a pipeline.

read →