opbox

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

PropertyValue
Capabilityverification.write
Risk classWrite - autonomy L1
Min. permissionMember
AvailabilityOn demand (MCP tier 2)
IdempotentYes
EgressNone - 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

PropertyValue
Capabilityverification.write
Risk classSensitive - autonomy L2
Min. permissionAdmin
AvailabilityOn demand (MCP tier 2)
IdempotentNo
EgressNone - 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

PropertyValue
Capabilityverification.write
Risk classSensitive - autonomy L2
Min. permissionAdmin
AvailabilityOn demand (MCP tier 2)
IdempotentNo
EgressNone - 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

PropertyValue
Capabilityverification.write
Risk classSensitive - autonomy L2
Min. permissionAdmin
AvailabilityOn demand (MCP tier 2)
IdempotentNo
EgressNone - 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.