Date: 2026-08-05 Status: Stub, except TOKATTEST. The statements are made; the phases say what is decided.
server/reach. A path no line
names is ROOT's and nobody else's."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.
ATTESTOR is a token that can attest, minted by the User that owns it (ADR-031).
POST /api/attestations. Watchers, plugins,
the CLI and the WebSocket are untouched.Grant.Namespace becomes a list."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.
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.