---
title: "Update Decision Settings"
method: PUT
path: "/snapshots/{snapshot_id}/decisions/settings"
tags: ["dashboard"]
---

# Update Decision Settings

`PUT /snapshots/{snapshot_id}/decisions/settings`

Merge a patch into the repository's capture policy and return the result.

Only the snapshot owner may edit, matching the page-notes rule: a public
ownerless snapshot is readable but not configurable.

The patch is sparse. Keys nobody set stay unset and keep resolving from the
preset, so a stored policy does not freeze today's defaults.

`etag` is checked when the client sends one. The shared panel autosaves, so
two people on the same settings page would otherwise overwrite each other
with nothing to show that anything was lost.

## Path parameters

- `snapshot_id` string, required

## Request body

- DecisionSettingsUpdate — A sparse patch onto the stored policy. Absent keys stay unset.
  - `preset` string, nullable
  - `enabled` boolean, nullable
  - `llm` boolean, nullable
  - `sources` object, nullable
  - `discovery` object, nullable
  - `agent_acceptance` boolean, nullable
  - `capture_prompt` boolean, nullable
  - `etag` string, nullable

## Response `200`

Successful Response

- DecisionSettingsResponse — The resolved capture policy, as the shared settings panel expects it. Resolved rather than stored: the column holds only the keys somebody set, and the engine's resolver fills the rest from the preset on every read. So a repository never silently acquires a capture source because a default moved, and never silently keeps one either. ``provider_available`` is what the repository's last index run actually had for model-backed capture, stamped by the indexer on ``repos.decision_capture`` -- the web process reads a different environment than the one the provider is built from, so it cannot answer this for itself. False when the last run had no provider, and also when the repository has not been indexed since the stamp existed; a warning says which. With it false, each source reports its deterministic stage running and its model stage skipped, with the reason. ``etag`` is the concurrency token. The panel sends it back on write and a stale one is refused, so two people editing the same policy cannot silently overwrite each other.
  - `enabled` boolean, required
  - `llm` boolean, required
  - `preset` string, required
  - `discovery` object, required
  - `sources` object[], required
  - `agent_acceptance` boolean
  - `capture_prompt` boolean
  - `provider_available` boolean
  - `warnings` string[]
  - `legacy_keys` string[]
  - `etag` string

## Other responses

- `422` — Validation Error

## Changes

- **2026-09-21** `cce15d886f2b` — 4 info
  - added the new optional request property `agent_acceptance`
  - added the new optional request property `capture_prompt`
  - added the optional property `agent_acceptance` to the response with the `200` status
  - added the optional property `capture_prompt` to the response with the `200` status

[Change history](https://skmtc.dev/repowise/apis/repowise-hosted-api/changes/snapshots/:snapshot_id/decisions/settings/put.md)

---

[API](https://skmtc.dev/repowise/apis/repowise-hosted-api.md) · [All operations](https://skmtc.dev/repowise/apis/repowise-hosted-api/llms.txt) · [OpenAPI document](https://skmtc.dev/repowise/apis/repowise-hosted-api/revisions/29a9df53f763?raw)
