put_api_management_v1_workspaces_slug_state
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”object
object
Optional MCP + skill capability map, mirroring the workspace
manifest shape from ADR-0007. When present, the Management API
applies it via the same apply_capabilities path used by
POST /api/workspace/apply-manifest. Absent keys are no-ops —
existing callers that don’t send this field keep working
unchanged. See bw-infra docs/38 §4.6.
object
object
One MCP or skill override inside a manifest. Mirrors the schema
described in docs/schemas/supacloud-workspace.schema.json.
object
object
object
One MCP or skill override inside a manifest. Mirrors the schema
described in docs/schemas/supacloud-workspace.schema.json.
object
object
object
object
object
object
object
object
#708 X2b — the PR-flow arming fields the management apply honors. auto_developer_enabled
arms the pr_review automation arm; auto_developer_agent_type stamps its
source_filter.harness. The legacy auto_developer_prompt/_modes/_draft_first/… spec
fields were removed with the dropped projects.auto_developer_* columns.
#708 M1/X5 — DEPRECATED. The standalone issue-debate lane was retired (#708 B3/X5): the
council capability is the per-stage council flag, and the auto_issue_debate_* columns
were dropped (migration 302). This field is KEPT only so a stale IaC manifest that tries
to ARM the lane fails LOUDLY: an apply that sets it true is REJECTED with a 422 (see
apply_project) sourced from THIS request field. false / absent stays accepted for
backward-compatible manifests. The other auto_issue_debate_* spec fields were removed.
#708 M1 (K-06) — the project-tier tiered standard-closeout override (mig 283),
reaching parity with the browser project PUT so an IaC apply can set it. A sparse
JSONB bag documented by the CloseoutConfigPatch schema; on apply it is
shape-validated (models::closeout::validate_patch) then merged into the applied
project config exactly like the browser PUT (persisted via
queries::projects::set_closeout_config). null / absent leaves the column
untouched (the project inherits the workspace default). The management owner token
acts as the workspace owner, so no additional per-field gate applies.
object
Gates the Tier-0 closeout MEMORY proposal. None inherits the next tier.
#918 — workspace resources (postgresql / seafile_webdav / telegram_bot / custom / …) with write-only secrets. Additive like every list here: entries absent from the payload are never deleted server-side.
#918 — one workspace resource in the desired state. Mirrors the resource
create/update API surface; the secret is WRITE-ONLY (never echoed back;
the apply result carries a fingerprint at most).
object
Resource kind (closed catalogue + custom, validated by the resources
service). Immutable on update, like the user-facing API.
Resource name — the upsert identity within the workspace (bindings and scripts reference resources by name).
Write-only secret. Absent/null → leave the stored secret alone
(additive contract — IaC can re-apply without re-supplying secrets).
A string is stored as-is; a JSON object (#914 custom structured
secrets) is stored as its canonical JSON serialisation.
object
once | daily | weekly | monthly | interval.
#908 — the step width of an interval cadence in minutes (5–1440).
Required iff cadence = 'interval'; rejected on any other cadence.
Optional task-scope configuration (5-stage MCP allowlist
precedence per ADR-0007). Absent → no scope write. Empty
TaskScopeConfig::default() → wipes all scoping back to “all
enabled MCPs available to every task”.
object
object
object
object
#708 S1 (K-05) — an optional TYPED per-run standard-closeout override, merged into
config.closeout (the exact key the launch path’s resolve_closeout_for_task reads)
by [Self::effective_config], so a M2M-launched task can set its closeout the same way
the web run-start override does. A sparse JSONB bag documented by the
CloseoutConfigPatch schema; null / absent inherits the project/workspace default.
object
Gates the Tier-0 closeout MEMORY proposal. None inherits the next tier.
object
Optional issue-link intent. When BOTH issue_id and issue_url are
present, the launch path links the task to that existing issue by
merging link_issue_id/link_issue_url into config via the typed
services::tasks::IssueLinkConfig builder (ADR 0032, Issue #248). Either
field alone is a no-op, keeping legacy callers that only send config
unchanged.
object
#918 — workflow schedules: one spec creates/updates the schedule row
AND its linked schedule-kind trigger on the workflow.
#918 — one workflow schedule in the desired state: upserts the schedule row
(cadence incl. interval per #908) and ensures the linked schedule-kind
trigger on the workflow exists and is enabled.
object
once | daily | weekly | monthly | interval.
Required iff cadence = 'interval' (5–1440 minutes, #908).
Stable reconcile identity (task_schedules.management_key).
First-fire hint — preserved across re-applies unless the cadence changes (same semantics as managed task schedules).
The workflow’s name (repo-sync slug / display name).
#987 Stage B — workflows MATERIALIZED FROM A SHIPPED TEMPLATE, upserted per
(project, key) via the workflows.management_key column (migration 337).
The blocks above can only RESOLVE an existing workflow by name; this one
CREATES it, which is what makes a mail / scan workspace provisionable in one
declarative request.
#987 Stage B — one workflow MATERIALIZED FROM A SHIPPED TEMPLATE in the desired state.
This is the block that makes a mail / scan workspace provisionable through the
product path: before it, the state-apply could only RESOLVE an already-existing
workflow by name (workflow_triggers / workflow_schedules), never create one,
so an operator had to hand-compose the graph in the builder or via repo-sync
first. Reconciled per (project, key) on workflows.management_key
(migration 337) — deliberately NOT on the workflow NAME, which cannot survive a
rename and is ambiguous across a workspace.
Additive like every list in the document: an entry that disappears from the
payload is never deleted server-side, and a re-apply of an entry whose workflow
already exists is a no-op reporting changed: false (the graph belongs to the
user once it is materialized — the apply never overwrites their edits).
object
The template’s ${{ config.* }} substitution map, plus the per-slug
materialization parameters (e.g. mail_intake’s mailbox_resource_id).
Missing keys fall back to the template’s registry defaults.
A value of the form ${{ resources.<name>.id }} is resolved against the
resources applied EARLIER IN THE SAME REQUEST, so an operator binds a
mailbox or a document library by NAME and never pastes a UUID into a
manifest. An unknown resource name fails the item loudly.
object
Stable reconcile identity within the project (workflows.management_key).
Optional display name for the materialized workflow. Absent → the
template’s own name:. Purely cosmetic: the reconcile identity is key,
so renaming here never orphans the row.
Project that owns the workflow (ManagementProjectSpec.key). Absent → the
workspace’s single project; ambiguous when the workspace has several.
The shipped template slug to materialize (mail_intake, scan_intake,
autodev, …). An unknown slug fails the apply LOUDLY with a 404 rather
than materializing nothing.
#918 — workflow triggers, upserted per (workflow, key) via the
management_key column (migration 325). repo-sync deliberately never
applies triggers: on pull — this is the declarative path.
#918 — one workflow trigger in the desired state, upserted per
(workflow, key) (migration 325 management_key).
object
Stable reconcile identity within the workflow.
Trigger kind (webhook, schedule, telegram, …) — validated by the
triggers service.
Project that owns the workflow (ManagementProjectSpec.key). Absent →
the workflow is looked up across the workspace’s landing project.
The workflow’s name (repo-sync slug / display name).
object
Responses
Section titled “Responses”Workspace desired state applied
object
object
Examplegenerated
{ "changed": true, "results": [ { "changed": true, "fingerprint": "example", "id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "key": "example", "resource_type": "example" } ], "workspace_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0"}