patch_api_tasks_id_config
const url = 'https://example.com/api/tasks/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/config';const options = { method: 'PATCH', headers: { cookie: 'supacloud_session=<supacloud_session>', 'Content-Type': 'application/json' }, body: '{"effort":"example","mode":"example","model":"example","subagents":"example"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request PATCH \ --url https://example.com/api/tasks/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/config \ --header 'Content-Type: application/json' \ --cookie supacloud_session=<supacloud_session> \ --data '{ "effort": "example", "mode": "example", "model": "example", "subagents": "example" }'Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Task id
Request Bodyrequired
Section titled “Request Bodyrequired”ADR 0049 §4 + Axis 1/2 (mig 272) — PATCH /tasks/{id}/config (Tier A) body. The Tier-A
surface allowlists ONLY effort + model + mode + subagents; deny_unknown_fields
rejects ANY other key with a 400 (parse, don’t sanitize — a caller cannot smuggle e.g.
agent_type through this focused endpoint, which would be a privilege/scope escalation
past the allowlist). At least one field must be present (an all-absent body is a 400 at
the service layer).
object
Axis 2 (mig 272) — the harness-native MODE (build|plan; empty clears). An
allowlisted Tier-A axis like effort/model; any other field stays a 400.
Axis 1 (mig 272) — the decoupled subagent toggle (on|off; empty clears).
Examplegenerated
{ "effort": "example", "mode": "example", "model": "example", "subagents": "example"}Responses
Section titled “Responses”Applied (non-running) or restart-required (running) — see applied
ADR 0049 §4 — PATCH /tasks/{id}/config response. applied is true when the
effort/model were persisted to the task’s stored config — that is, BOTH the
non-running merge AND a Tier-B live apply (the config is always persisted in both,
so applied means “the value is now the task’s config”). applied_live is true
only for the Tier-B path: the change was ALSO delivered to the running agent and
takes effect mid-session (no restart needed). When the task is running on a
restart-only harness (or its container is unreachable here), applied is false
and restart carries the [Restart now] affordance (the config was NOT mutated).
object
ADR 0049 §4 Tier-B — the change was applied LIVE to the running agent (claude
today) and takes effect on the next turn without a restart. Implies applied.
ADR 0049 §4 — the [Restart now] affordance a RUNNING task’s config-update
returns instead of a silent live mutation. It mirrors the ① Affordance /
CommandInvocation contract on the wire: a render-ready label + optional
glyph, and the replayable command word + its resolved args. A surface
renders it as a one-tap action that re-runs the task with the requested
effort/model folded in.
object
object
Examplegenerated
{ "applied": true, "applied_live": true, "restart": { "args": { "additionalProperty": "example" }, "command": "example", "glyph": "example", "label": "example" }}Structured client error (non-allowlisted field, invalid effort, or empty body)
Authentication required
Permission denied
Task not found
Structured server error