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
| Property | Value |
|---|---|
| Capability | other.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) |
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
| Property | Value |
|---|---|
| Capability | other.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) |
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
| Property | Value |
|---|---|
| Capability | other.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) |
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
| Property | Value |
|---|---|
| Capability | form.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) |
(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
| Property | Value |
|---|---|
| Capability | form.write |
| Risk class | Sensitive - autonomy L2 |
| Min. permission | Member |
| Availability | On demand (MCP tier 2) |
| Idempotent | No |
| Egress | None - 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
| Property | Value |
|---|---|
| Capability | form.read |
| Risk class | Read - autonomy L0 |
| Min. permission | Member |
| Availability | Core - always on (MCP tier 1) |
| Idempotent | No |
| Egress | None - in-box (pure Postgres, no outbound call) |
| Render schema | Yes - 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
| Property | Value |
|---|---|
| Capability | form.read |
| Risk class | Read - autonomy L0 |
| Min. permission | Member |
| Availability | Core - always on (MCP tier 1) |
| Idempotent | No |
| Egress | None - in-box (pure Postgres, no outbound call) |
| Render schema | Yes - 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
| Property | Value |
|---|---|
| Capability | other.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) |
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
| Property | Value |
|---|---|
| Capability | other.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) |
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
| Property | Value |
|---|---|
| Capability | form.write |
| Risk class | Write - autonomy L1 |
| Min. permission | External (portal / signer token) |
| Availability | On demand (MCP tier 2) |
| Idempotent | No |
| Egress | None - 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
| Property | Value |
|---|---|
| Capability | form.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) |
(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.