States are contract, not decoration. A frame set that shows only the populated editor produces an editor that handles only the populated case. Each block below is a state the implementation must render and QA must drive.
Skeleton rows preserve the two-column key/value rhythm so the layout does not jump when entries arrive. No spinner-over-empty-form: an empty form is indistinguishable from "this namespace has no settings".
The namespace is registered but declares no visible keys at this scope. This is a legitimate 200, not an error and not a "no results" — the search box must not be blamed. It is also what a user sees when every key in the namespace is hidden (see D).
The notifications namespace is registered but has no keys you can see or set at org Acme Corp. Nothing is wrong — there is simply nothing to configure here yet.
Retryable, and it must never present an empty form the user could type into and
"save" — the editor has no baseline version to send as expectedVersion, so a write here
could clobber a concurrent edit.
This is the state most likely to be built wrong, because building it wrong looks identical on screen. Hidden keys are omitted by the API; the editor performs no client-side filtering and must have no code path that could render one. A hidden key that arrives, is rendered, and then CSS-hidden has already leaked into the browser.
| Key | In catalog | In GET /v1/config |
|---|---|---|
| notifications.digest.frequency | yes | yes |
| notifications.retry.backoff | yes | yes |
| notifications.internal.shardKey hidden | yes | absent |
| notifications.internal.debugSink hidden | yes | absent |
Hidden keys are visible only to a platform admin, only in the catalog view — frame (g).
Every entry arrives with editable: false. The editor renders the whole
surface read-only with no save bar at all — never inputs and a Save button that only
403s. The UI is not the authorization boundary; it reflects a decision Permit already made.
editable: false
Why D is called out separately. The epic's success metric is zero hidden keys reaching the
browser. A client-side filter(k => !k.isHidden) would satisfy every visual review and
fail that metric completely. QA asserts on the network payload, not on the absence of a rendered row.
Contract. GET /v1/config · EffectiveConfig.entries — "One entry per
visible key. Hidden keys are absent entirely."