The acl.* family (3 verbs). Every verb enters through the one front door: it is capability-checked, permission-checked, scope-checked and audited before it runs (see Security & permissions). Each entry below lists its capability, risk class (which fixes the minimum autonomy level), the minimum caller permission, its availability tier, whether it is idempotent, and any outbound egress.
Grantacl.grant
| Property | Value |
|---|---|
| Capability | acl.write |
| Risk class | Write - autonomy L1 |
| Min. permission | Member |
| Availability | On demand (MCP tier 2) |
| Idempotent | No |
| Egress | None - in-box (pure Postgres, no outbound call) |
Confers level
(1 view | 2 edit | 3 manage) on the object to the grantee, fail-closed under NO-AMPLIFICATION: the
grantor must itself hold AT LEAST level on the object (reusing the org.rs clamp shape - a conferred
level above the grantor’s own is a HARD reject, never silently clamped), and at least edit (2) to
share at all (a mere viewer cannot re-share). Upserts the (object, grantee) grant (highest set wins;
re-granting updates the level). Emits ONE append_event (INV-8, by dispatch) + fans an ACL_GRANTED
notify to an actor grantee.
Input { objectType, objectId, granteeType, granteeId, level } (fields ending in ? are optional)
Call POST /v/acl.grant with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool acl.grant.
Listacl.list
| Property | Value |
|---|---|
| Capability | acl.read |
| Risk class | Read - autonomy L0 |
| Min. permission | Member |
| Availability | On demand (MCP tier 2) |
| Idempotent | No |
| Egress | None - in-box (pure Postgres, no outbound call) |
| Render schema | Yes - drives an inline chat artefact and a GUI panel |
Lists the grants on an object - but ONLY if the caller can READ the object (else the not-found-equivalent deny; you cannot enumerate the share list of an object you cannot see). Each row: grantee + level + grantor.
Input { objectType, objectId } (fields ending in ? are optional)
Call POST /v/acl.list with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool acl.list.
Revokeacl.revoke
| Property | Value |
|---|---|
| Capability | acl.write |
| Risk class | Write - autonomy L1 |
| Min. permission | Member |
| Availability | On demand (MCP tier 2) |
| Idempotent | Yes |
| Egress | None - in-box (pure Postgres, no outbound call) |
Removes the grant; the grantee
loses access on its NEXT call (membership/grant resolved at read time). Requires the caller to hold at
least edit (2) on the object (the share-management authority). Idempotent: revoking a non-existent
grant is a no-op success. Anti-enumeration: an unreachable object reads back not-found.
Input { objectType, objectId, granteeType, granteeId } (fields ending in ? are optional)
Call POST /v/acl.revoke with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool acl.revoke.