opbox

The steptype.* family (3 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.

Archivesteptype.archive

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

Withdraw a step_type from NEW authoring: flip is_archived to true. { key }. Existing matters/boards that pinned the kind are UNAFFECTED (board.validate still resolves it, R11); only new authoring should avoid a withdrawn kind. Status-not-timestamp (INV-3), never a hard DELETE; retained-not-deleted (INV-8). Reversible via steptype.register (a re-author clears is_archived). Idempotent: re-archiving an already-archived key is a no-op success; a missing key is a not-found BadInput. (Mirrors board.archive’s guarded-flip + re-read shape.)

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

Liststeptype.list

PropertyValue
Capabilitysteptype.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

List the box-global step-type registry. { isTerminal?, limit? }. Optional isTerminal boolean filter (terminal vs non-terminal kinds). Paginated (NFR-PERF-3).

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

Registersteptype.register

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

Upsert a step_type by key (the PRIMARY KEY). { key, label, handlerVerb?, configSchema?, isTerminal? }. A re-register of an existing key UPDATES the label / handler / schema / terminality in place (ON CONFLICT(key) DO UPDATE) - the box-global registry is authored, not append-only. handlerVerb defaults to matter.advance (the generic completion path, ADR-0016: step-types ARE verbs). Re-registering an archived key clears is_archived (a re-author reinstates it - the reversible twin of steptype.archive). Idempotent: registering the same shape twice is the same row.

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