> ## Documentation index
> Fetch the complete documentation index at: https://rolter-ai-rolter.docs7.io/llms.txt
> Ask it with GET https://rolter-ai-rolter.docs7.io/ask?q=<keywords or question>. Short keywords rank best.
> Use these to discover all available pages before exploring further.

# Experimental Subsystems in the Rolter Control Plane

> GET /api/v1/stability lists the subsystems this build marks experimental — the ones that may change shape or be removed in a minor release. Absence means stable.

Rolter ships a wide surface, and not all of it is equally settled. A handful of
subsystems are still moving: their shape may change, or they may be withdrawn,
in a **minor** release. `GET /api/v1/stability` is the list, and it is the same
list the dashboard reads to put an _Experimental_ marker beside a nav entry.

Everything not in that list is stable and carries whatever compatibility promise
the release makes. **Absence is the signal** — `"stability": "stable"` is never
sent, because a badge on every page is a badge nobody reads.

## Request

```bash
curl -H "Authorization: Bearer $ROLTER_SESSION_TOKEN" \
  http://localhost:4001/api/v1/stability
```

Any signed-in caller may read it, including a viewer with no membership
anywhere: it describes the build, not a tenant's data. An anonymous request is
`401`.

## Response

```json
[
  {
    "id": "labels",
    "stability": "experimental",
    "note": "labels are display and filter only: no route can select its targets by label yet, and making them selectable turns them into configuration the data plane consumes",
    "nav_keys": []
  },
  {
    "id": "realtime",
    "stability": "experimental",
    "note": "guardrails, the guardrail webhook and pre_upstream plugins run on /v1/realtime text events and function-call arguments, but the PII sanitizer and pre_route / post_response plugins do not; a fail_closed PII sanitizer refuses the session, a fail_open one admits it unsanitized (#2489)",
    "nav_keys": []
  }
]
```

| Field       | Meaning                                                                                                                                                                                              |
| ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `id`        | stable subsystem identifier, `snake_case`. Never renamed once published, so it is safe to key off                                                                                                    |
| `stability` | `experimental` today. `stable` exists in the vocabulary but is never sent                                                                                                                            |
| `note`      | one sentence naming what specifically is unfinished, in English. Written to be shown verbatim; the dashboard shows its own translation for the same `id` instead, in whichever language it is set to |
| `nav_keys`  | the dashboard screens this subsystem owns, if any. Empty is normal — a gateway surface or a cross-cutting concept has no screen of its own                                                           |

An empty array is a healthy answer: it means this build marks nothing
experimental.

<Note>
  The list is compiled into the binary. It changes only when you upgrade, it is
  identical for every caller, and no setting alters it — it says how finished
  the code is, not whether a subsystem is available or turned on.
</Note>

## What the marker does and does not say

`experimental` withholds exactly one guarantee: that the subsystem will still
have the same shape, or exist at all, in the next minor release. On an
experimental subsystem a minor release may rename or withdraw API paths and
fields, rename or drop configuration keys, change what stored rows mean, or
remove a dashboard screen.

It is **not** a quality warning, a support disclaimer, or a schedule. An
experimental subsystem is held to the same review, test and security standards
as the rest of Rolter, a bug in one is still a bug that gets fixed, and nothing
graduates on a date. It is also unrelated to whether a subsystem is enabled —
every entry in the list is usable in a default deployment.

The operation appears as `getStability` in the
[control-plane OpenAPI document](/api/control-plane-openapi), with a
`SubsystemStability` schema, so a generated SDK carries it too.
