The cross-workspace-task.* 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.
cross-workspace-task.create
| Property | Value |
|---|---|
| Capability | oversight.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). Mint an EXTERNAL_SIGNOFF task. RLS scope = origin_org_id = ctx.workspace_id; target_org_id is a plain column (the cross-workspace counterpart).
Call POST /v/cross-workspace-task.create with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool cross-workspace-task.create.
cross-workspace-task.resolve
| Property | Value |
|---|---|
| Capability | oversight.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) |
(DEFERRED). The POST-COMMIT MIRROR of the signoff outcome.
(PENDING|VIEWED) -> (APPROVED|REJECTED), fenced origin_org_id = ctx.workspace_id. Idempotent on re-run.
{ taskId, status (APPROVED|REJECTED), actionedById?, actionNote? }.
Call POST /v/cross-workspace-task.resolve with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool cross-workspace-task.resolve.
cross-workspace-task.set-token
| Property | Value |
|---|---|
| Capability | oversight.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). Store the re-signed JWT (which embeds the
now-minted task id) after create. Fenced origin_org_id = ctx.workspace_id. { taskId, accessToken, accessTokenExpiresAt? }.
Call POST /v/cross-workspace-task.set-token with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool cross-workspace-task.set-token.
cross-workspace-task.view
| Property | Value |
|---|---|
| Capability | oversight.write |
| Risk class | Write - autonomy L1 |
| Min. permission | External (portal / signer token) |
| Availability | On demand (MCP tier 2) |
| Idempotent | Yes |
| Egress | None - in-box (pure Postgres, no outbound call) |
(DEFERRED). The TARGET side marks PENDING -> VIEWED. Fenced
target_org_id = ctx.workspace_id (reached via a target-workspace seat). Idempotent. { taskId }.
Call POST /v/cross-workspace-task.view with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool cross-workspace-task.view.