Unit 03.04: The permission list as a document you can audit
The permission list should fit on one screen and be checkable against the code.
Read, write, act-with-approval, never
Four categories plus the limits, in a form a non-engineer can read.
Below is one.
{
"read": [
"invoice records",
"contract payment terms",
"internal notes"
],
"write": [
"internal notes"
],
"act_with_approval": [
"issue a refund up to 500",
"email the customer"
],
"never": [
"delete records",
"change contract terms",
"read salary data",
"refunds over 500"
],
"limits": {
"max_refund": 500.0,
"currencies": [
"USD",
"EUR"
]
},
"enforced_by": "tool signatures and argument validation, not instructions"
}
readable in one screen; every line is checkable against the code
The never list is what a reviewer reads first, and the test for every line on it is whether it is enforced by something other than an instruction. "Never read salary data" holds if there is no tool that reads salary data; it does not hold if there is a general query tool and a sentence asking it not to.
enforced_by says this explicitly. Writing that line forces you to check it, which is most of its value.
The mistake this prevents
The mistake is deriving the permission list from the code after the fact. It then describes what the agent can do rather than specifying what it should - and every gap you would have caught by writing it first is now invisible, because the document and the code agree by construction.
Takeaway
Write the permission list first, in four categories, and state what enforces it. Anything on the never list enforced only by an instruction is not actually on it.
