Skip to content

Commit 85a3231

Browse files
committed
docs(permissions): the unscoped admin_full_access anchor confers platform-admin standing under single only
Since the walled legacy-anchor retirement (74832b6), resolveUserAuthzGrants derives PLATFORM_ADMIN from an unscoped admin_full_access grant only when postureEnforcesWall(resolveTenancyPosture()) is false, i.e. under `single`. The authorization and permission-sets pages still said either anchor is sufficient everywhere, and that the grant logs a once-per-process pointer. Claude-Session: https://claude.ai/code/session_01VDtqoecgES7ScQYGbFVDRv Co-authored-by: Claude <noreply@anthropic.com>
1 parent 2bbb462 commit 85a3231

2 files changed

Lines changed: 21 additions & 9 deletions

File tree

‎content/docs/permissions/authorization.mdx‎

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,16 @@ implementation detail:
111111
`viewAllRecords` / `modifyAllRecords` (super-user bypass, posture-gated)
112112
short-circuit the object's *business* RLS. Crossing the **tenant wall**,
113113
though, requires the **`PLATFORM_ADMIN` posture** (ADR-0099 D1). That posture
114-
is derived at one site from **two anchors**, either of which is sufficient:
115-
the deployment's **configured administrator list** — an address declared in
114+
is derived at one site, and which anchors it reads depends on the
115+
deployment's [tenancy posture](/docs/deployment/tenancy-modes). The
116+
deployment's **configured administrator list** — an address declared in
116117
`OS_PLATFORM_OWNER_EMAIL`, matched against the caller's own stored and
117-
**email-verified** `sys_user` row — and an **unscoped `admin_full_access`
118-
grant** row. See
118+
**email-verified** `sys_user` row — is sufficient under every posture. An
119+
**unscoped `admin_full_access` grant** row is sufficient only under
120+
`single`; under the walled postures (`group` / `isolated`) it is no longer
121+
an anchor — the set it names still grants what any held set grants, but it
122+
confers no `PLATFORM_ADMIN` standing, so there standing comes from
123+
configuration alone. See
119124
[who holds `admin_full_access`](/docs/permissions/permission-sets#built-in-permission-sets)
120125
for both. A *scoped* grant, or
121126
piecemeal platform capabilities (`studio.access`, `manage_users`, …), grant

‎content/docs/permissions/permission-sets.mdx‎

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -165,8 +165,9 @@ Auto-seeded on boot by `plugin-security`
165165
| `viewer_readonly` | Per-org | Read access only | Auditors / read-only stakeholders |
166166

167167
**Who holds `admin_full_access` is not (only) a grant row.** `PLATFORM_ADMIN`
168-
standing is derived at a single site from **two anchors**, and either one is
169-
sufficient:
168+
standing is derived at a single site from **two anchors**. Which of them is
169+
sufficient depends on the deployment's
170+
[tenancy posture](/docs/deployment/tenancy-modes):
170171

171172
- **Configuration — `OS_PLATFORM_OWNER_EMAIL`.** The deployment declares its
172173
administrators as one email address, or a comma-separated list of them. A
@@ -177,10 +178,16 @@ sufficient:
177178
compared trimmed and lower-cased, so `Ada@Example.com` and `ada@example.com`
178179
are one administrator, not two half-matches. Nothing is stored and nothing is
179180
granted — the answer is recomputed from configuration on every resolution.
181+
This anchor is read under every posture.
180182
- **An unscoped `admin_full_access` grant row** — a `sys_user_permission_set`
181-
row with `organization_id = NULL`, the original anchor. It still confers
182-
standing, and it is **deprecated**: a deployment resolving through it logs a
183-
pointer, once per process, at the configuration line that re-anchors it.
183+
row with `organization_id = NULL`, the original anchor. It confers standing
184+
under the `single` posture only. Under the walled postures (`group` /
185+
`isolated`) the row is no longer an anchor: the set it names still grants
186+
what any held set grants, but it confers no `PLATFORM_ADMIN` standing, and
187+
nothing is logged about it per request. If a walled deployment holding such a
188+
row ends up with no usable configured administrator, the boot log says it has
189+
zero platform administrators, names the account that holds the row, and points
190+
at `OS_PLATFORM_OWNER_EMAIL` as the way to restore that account's standing.
184191

185192
Which anchor a fresh deployment gets depends on its
186193
[tenancy posture](/docs/deployment/tenancy-modes). Under `single` the first

0 commit comments

Comments
 (0)