The consent.* family (4 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.
Acknowledgeconsent.acknowledge
| Property | Value |
|---|---|
| Capability | verification.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) |
A member records their OWN POLICY_ACKNOWLEDGMENT of an APPROVED policy document. user_id is FORCED to the acting user (never a caller value). Idempotent on (workspace, user, POLICY_ACKNOWLEDGMENT, documentId, documentVersion): a re-ack returns the existing row with idempotent
and writes no new row.{ documentId, documentVersion, version?, ipAddress?, userAgent? }. The APPROVED-policy + version gate stays in the calling lib (a doc-domain read).
Call POST /v/consent.acknowledge with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool consent.acknowledge.
Createconsent.create
| Property | Value |
|---|---|
| Capability | verification.write |
| Risk class | Sensitive - autonomy L2 |
| Min. permission | Admin |
| Availability | On demand (MCP tier 2) |
| Idempotent | No |
| Egress | None - in-box (pure Postgres, no outbound call) |
An admin grants a consent record FOR a user OR a stakeholder. At
least one of userId | stakeholderEmail is required (mirrors the route’s zod refine). Stores
status=GRANTED, granted_at=now. { consentType, userId?, stakeholderEmail?, stakeholderName?, version?, matterId?, notes?, expiresAt?, ipAddress?, userAgent? }.
Call POST /v/consent.create with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool consent.create.
Deleteconsent.delete
| Property | Value |
|---|---|
| Capability | verification.write |
| Risk class | Sensitive - autonomy L2 |
| Min. permission | Admin |
| Availability | On demand (MCP tier 2) |
| Idempotent | No |
| Egress | None - in-box (pure Postgres, no outbound call) |
Hard delete a consent record (workspace-fenced). The route gates
this to ADMIN||OWNER specifically. Captures consent_type/user_id/stakeholder_email before the delete
so the audit trail survives a destructive removal. { id }. (Soft-delete is a possible future posture;
the live route does a hard delete, preserved here.)
Call POST /v/consent.delete with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool consent.delete.
Updateconsent.update
| Property | Value |
|---|---|
| Capability | verification.write |
| Risk class | Sensitive - autonomy L2 |
| Min. permission | Admin |
| Availability | On demand (MCP tier 2) |
| Idempotent | No |
| Egress | None - in-box (pure Postgres, no outbound call) |
Revoke / expire / amend notes on a consent record (the consent
revocation is a sensitive compliance state change). FOR UPDATE state read, workspace-fenced: a record
is never updated cross-workspace by bare id. REVOKED also stamps revoked_at. { id, status?, notes? }.
Call POST /v/consent.update with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool consent.update.