(agent, target) so a single line shows every capability the agent has on that target.
Listing permissions
The permissions table groups rows by(agent, target) pair, where the target is an item or a profile. Each row shows:
- Agent name and kind
- Target — item label and storage mode, or the profile name for profile-wide grants
- Capabilities — one chip per granted capability, with
readbeforeuse - Expires — the soonest deadline among the group’s capabilities, or “Mixed” when capabilities have different expiries
- A small
✕on each chip to revoke that one capability without touching the others
Creating a permission
Click Grant permission to open the panel.1
Select an agent
Only enabled, non-revoked agents are listed.
2
Choose a target
Single item grants access to one credential. Entire profile grants access to every item in the profile, now and in the future. Then pick the item or profile.
3
Pick one or more capabilities
The dashboard shows only capabilities valid for the chosen agent + target, based on the capability matrix (for a profile target, it intersects the matrix across the profile’s current items). Tick as many as you need — multi-grant is atomic. A capability the agent already holds on the target is dimmed and labelled “already granted”.
4
(Optional) Set an expiry
A date. Applies to every capability you ticked in this submission. Leave blank for non-expiring grants. To grant some capabilities with one expiry and others with another, submit two batches.
5
Save
The whole batch lands atomically — every ticked capability becomes one row, all in one transaction. Future access attempts check those rows.
(agentId, itemId, capability) means each triple has at most one row. The router pre-checks for duplicates so the error envelope can list every conflicting capability up front (meta.duplicateCapabilities).
Capability cheatsheet
Invalid combinations (for example, a remote agent +
use) are rejected at create time with INVALID_CAPABILITY_LOCALITY or INVALID_CAPABILITY_STORAGE.
Revoking a permission
Each capability chip has its own✕ button. Clicking it deletes that single permission row immediately — sibling capabilities on the same (agent, item) pair are untouched. Any in-flight access attempt that hasn’t yet checked the row sees the deletion and is denied. Audit entries get permission.revoke (one per capability revoked) and permission.revoke_cascade for cascaded denials.
Expiring permissions
SetexpiresAt to a future ISO timestamp when granting. The server treats a permission as missing once the time passes. Audit entries show result: expired.
There is no auto-renewal. To extend a permission, revoke and re-grant with a later expiry.