One definition, and the resolution chain that explains any value it takes. "Why is
this org on daily?" is answerable here without reading four scopes by hand — which is the
support question this console exists to end.
Digest frequency — how often batched notifications are delivered.
| displayName | Digest frequency |
| valueType | enum |
| enumValues | hourly · daily · weekly |
| defaultValue | daily |
| allowedScopes | platform · portal · org · user |
| precedence | most-specific-wins |
| category / sortOrder | Delivery / 10 |
| tags | delivery · digest |
| isSystem / isHidden / isSecret / isReadonly | false · false · false · false |
| requiresRestart | true |
| deprecatedAt / replacedBy | — / — |
daily from the org.
The chain must be as readable when nothing is overridden. "No differences" is a real answer to "why is this value what it is" and needs its own designed treatment — not an empty diff table.
A lock does not merely win — it stops resolution and refuses writes beneath. The chain view must show the scopes below the lock as unreachable, not merely as "no override", or an admin will keep trying to set them.
lockReason: "SMS is disabled tenant-wide pending carrier review."
LOCKED_BY_ANCESTOR while the portal lock stands.
Contract. The definition panel is GET /v1/namespaces/{namespace}/keys/{key} →
KeyDefinition. The chain is built from GET /v1/config read at each scope in
the chain — every Scope carries its scopeType, so no step is identified by a
bare id.
precedence is not cosmetic. Under least-specific-wins the same chain
resolves the other way and the arrows reverse — the view reads definition.precedence
rather than assuming most-specific.