ADR-027: Permissions

Date: 2026-08-05 Status: Stub, except TOKATTEST. The statements are made; the phases say what is decided.

Statements

The credential does not carry the permission

"i want to be able to change it at will"

Grant fuses who the caller is with what they may do, so changing what a token may do means minting a different one. A credential says who, a policy says what, and they are edited apart — change the policy and every credential under it changes at once, untouched.

The token record keeps identity and loses scope. Minting asks for a label, and 515bedc5 removed the scope boxes because every answer was the same answer — this is why they do not come back.

Phases

TOKATTEST — a token attests as itself

ATTESTOR is a token that can attest, minted by the User that owns it (ADR-031).

"each token is its own actor in the predicate by"

Its own, which says whose it is rather than how many there are. Two actors can make contradictory claims about the same subject and both are valid (docs/attestation.html), so the token's DID leads and what a caller names stands after it.

A node opens a namespace on the first request that names it, so a token is minted for any namespace its minter is admitted to. A token reaching several says which one a request is; a write lands somewhere definite or nowhere.

27-2 — ground

Policy is declared in ground's controls and attested into the node. The mutable field from TOKATTEST leaves the credential and becomes one of those.

Blocked on: nothing in ground's evaluation path takes an actor. scopeMatches takes a cwd, evaluatePermission takes a cwd and a command, CheckFn takes a cwd and an input, and the actor on every attestation it emits is the literal ground.

27-3 — every part of QNTX behind it