opbox

The submission.* family (11 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.

Createsubmission.comment.create

PropertyValue
Capabilityother.write
Risk classWrite - autonomy L1
Min. permissionMember
AvailabilityOn demand (MCP tier 2)
IdempotentNo
EgressNone - in-box (pure Postgres, no outbound call)

On a FormSubmission. Mentions/notifications stay FE.

Call POST /v/submission.comment.create with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool submission.comment.create.

Deletesubmission.comment.delete

PropertyValue
Capabilityother.write
Risk classWrite - autonomy L1
Min. permissionMember
AvailabilityOn demand (MCP tier 2)
IdempotentNo
EgressNone - in-box (pure Postgres, no outbound call)

Author-or-admin gate stays FE. Idempotent.

Call POST /v/submission.comment.delete with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool submission.comment.delete.

Updatesubmission.comment.update

PropertyValue
Capabilityother.write
Risk classWrite - autonomy L1
Min. permissionMember
AvailabilityOn demand (MCP tier 2)
IdempotentNo
EgressNone - in-box (pure Postgres, no outbound call)

content edit and/or resolve toggle (author gate stays FE).

Call POST /v/submission.comment.update with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool submission.comment.update.

Createsubmission.create

PropertyValue
Capabilityform.write
Risk classWrite - autonomy L1
Min. permissionMember
AvailabilityOn demand (MCP tier 2)
IdempotentNo
EgressNone - in-box (pure Postgres, no outbound call)

(DEFERRED). Internal submit. MUST honour a caller-supplied id. { id?, formId, userId?, data, metadata?, status?, formVersionId? }. data must already be PII-processed (processSubmissionWrite) in the frontend before the call.

Call POST /v/submission.create with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool submission.create.

Deletesubmission.delete

PropertyValue
Capabilityform.write
Risk classSensitive - autonomy L2
Min. permissionMember
AvailabilityOn demand (MCP tier 2)
IdempotentNo
EgressNone - in-box (pure Postgres, no outbound call)

(DEFERRED, destructive). Fenced id+workspace; FK cascade clears attachments. rows_affected==0 -> BadInput. { id }.

Call POST /v/submission.delete with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool submission.delete.

Getsubmission.get

PropertyValue
Capabilityform.read
Risk classRead - autonomy L0
Min. permissionMember
AvailabilityCore - always on (MCP tier 1)
IdempotentNo
EgressNone - in-box (pure Postgres, no outbound call)
Render schemaYes - drives an inline chat artefact and a GUI panel

A read operation in the submission.* family. Called through the one governed front door: capability, permission tier, autonomy, scope and egress are all resolved before the handler runs, and the call is audited (INV-1, INV-8).

Call POST /v/submission.get with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool submission.get.

Listsubmission.list

PropertyValue
Capabilityform.read
Risk classRead - autonomy L0
Min. permissionMember
AvailabilityCore - always on (MCP tier 1)
IdempotentNo
EgressNone - in-box (pure Postgres, no outbound call)
Render schemaYes - drives an inline chat artefact and a GUI panel

A read operation in the submission.* family. Called through the one governed front door: capability, permission tier, autonomy, scope and egress are all resolved before the handler runs, and the call is audited (INV-1, INV-8).

Call POST /v/submission.list with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool submission.list.

Createsubmission.note.create

PropertyValue
Capabilityother.write
Risk classWrite - autonomy L1
Min. permissionMember
AvailabilityOn demand (MCP tier 2)
IdempotentNo
EgressNone - in-box (pure Postgres, no outbound call)

Plain note append on a FormSubmission (fence in workspace).

Call POST /v/submission.note.create with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool submission.note.create.

Togglesubmission.reaction.toggle

PropertyValue
Capabilityother.write
Risk classWrite - autonomy L1
Min. permissionMember
AvailabilityOn demand (MCP tier 2)
IdempotentNo
EgressNone - in-box (pure Postgres, no outbound call)

toggle on (comment_id,user_id,emoji). Fence the comment in workspace. Delete-if-exists else insert; returns action added|removed.

Call POST /v/submission.reaction.toggle with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool submission.reaction.toggle.

Submitsubmission.submit

PropertyValue
Capabilityform.write
Risk classWrite - autonomy L1
Min. permissionExternal (portal / signer token)
AvailabilityOn demand (MCP tier 2)
IdempotentNo
EgressNone - in-box (pure Postgres, no outbound call)

(DEFERRED, share-token bearer mint missing). Public ingest door. user_id always null. { id?, formId, data, metadata?, status?(=PENDING), formVersionId? }.

Call POST /v/submission.submit with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool submission.submit.

Updatesubmission.update

PropertyValue
Capabilityform.write
Risk classWrite - autonomy L1
Min. permissionMember
AvailabilityOn demand (MCP tier 2)
IdempotentNo
EgressNone - in-box (pure Postgres, no outbound call)

(DEFERRED). Partial PATCH fenced id+workspace, with the expectedStatus guard that reproduces the updateMany status-transition races (PENDING->COMPLETED, COMPLETED->EDITED, PENDING->DRAFT reject): UPDATE … WHERE status=expectedStatus; rows_affected==0 re-reads and returns changed

(still present) or BadInput (gone). { id, data?, metadata?, status?, visibility?, userId?|null, expectedStatus? }.

Call POST /v/submission.update with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool submission.update.