---
title: "Set Requirements State"
method: POST
path: "/internal/evals/rollout-consistency/sweeps/{sweep_id}/requirements/state"
tags: ["internal"]
---

# Set Requirements State

`POST /internal/evals/rollout-consistency/sweeps/{sweep_id}/requirements/state`

## Request

- Base URL: `https://api.kobaltlabs.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.kobaltlabs.com/internal/evals/rollout-consistency/sweeps/{sweep_id}/requirements/state`
- Auth: none declared

Enable, switch off, or remove several requirements at once.

**Removal is archival.** `ARCHIVED` keeps the requirement and every version of it readable,
which is the whole point on regulated compliance material — there is no hard delete here and
adding one would break the audit trail the library exists to keep.

Every requested id gets an outcome row whether it changed or not, and one requirement's refusal
never fails the batch. The three refusals are the single-requirement route's own rules, applied
per item rather than restated: a removed requirement can only be put back (writing a lesser
state over an archive silently downgrades a human decision), a state change that changes nothing
is refused rather than recorded (it would invent history), and an id outside this company is
simply not found.

Each requirement gets its own savepoint, so an unexpected failure on one leaves its siblings
applied — the `start_decompositions` shape, for the same reason.

## Path parameters

- `sweep_id` string, uuid, required

## Request body

- RequirementStateRequest: A bulk enable / disable / remove across selected requirements.
  - `requirement_ids` string[], required
  - `state` 'active' | 'disabled' | 'archived' | 'superseded' | 'proposed', required: Whether a requirement is in the working library, and if not, why not. All of them are recorded as revisions, so every one is reversible and readable. ARCHIVED and SUPERSEDED are deliberately distinct: ARCHIVED is a person deciding this obligation does not apply to them, SUPERSEDED is a newer decomposition of the same guideline taking over. A regeneration must never overwrite the first with the second — that would erase a human decision.
  - `change_note` string, nullable

## Response `200`

Successful Response

- RequirementStateResponse
  - `applied` integer, required
  - `skipped` integer, required
  - `outcomes` RequirementStateOutcome[], required
    - `requirement_id` string, uuid, required
    - `applied` boolean, required
    - `state` 'active' | 'disabled' | 'archived' | 'superseded' | 'proposed', required: Whether a requirement is in the working library, and if not, why not. All of them are recorded as revisions, so every one is reversible and readable. ARCHIVED and SUPERSEDED are deliberately distinct: ARCHIVED is a person deciding this obligation does not apply to them, SUPERSEDED is a newer decomposition of the same guideline taking over. A regeneration must never overwrite the first with the second — that would erase a human decision.
    - `reason` string, nullable, required

## Other responses

- `422`: Validation Error

## Changes

- **2026-09-02** `425d5b8a3c17`: 1 warning, 1 info
  - added the new `proposed` enum value to the `outcomes/items/state/anyOf[subschema #1: GuidelineRequirementState]/` response property for the response status `200`
  - added the new `proposed` enum value to the request property `state`

[Operation history](https://skmtc.dev/kobaltlabs/apis/fastapi/changes/internal/evals/rollout-consistency/sweeps/:sweep_id/requirements/state/post.md)

---

[API](https://skmtc.dev/kobaltlabs/apis/fastapi.md) - [All operations](https://skmtc.dev/kobaltlabs/apis/fastapi/llms.txt) - [OpenAPI document](https://skmtc.dev/kobaltlabs/apis/fastapi/revisions/8587332d5e43?raw)
