Repository navigation
Commit 6bf7f1c
docs(permissions,qa): the unscoped admin_full_access anchor confers platform-admin standing under single only (#19876)
Part of #19145
Clause-②: no
Carriers 1 and 2 of #19145 (the two documentation carriers), plus one
more carrier of the same claim that the sweep found in the same tree.
Carriers 3 (`packages/runtime/src/domains/automation.ts`
`RUN_LIFECYCLE_DENY_MESSAGE`) and 4
(`packages/platform-objects/src/identity/sys-user.object.ts`
`role.description`) are **not touched here**. They belong to other
lanes, and a split has been requested from triage. #19145 remains open
for them.
## The rule as the code decides it (all at `2bbb4623`)
- `packages/core/src/security/resolve-authz-context.ts:865`:
`legacyGrantAnchorRetired =
postureEnforcesWall(resolveTenancyPosture())`. This reads the
**requested** posture (the environment), not the effective one, so a
walled deployment that is running degraded is still treated as walled.
- `packages/spec/src/security/tenancy-posture.ts:54`:
`postureEnforcesWall` returns `posture !== 'single'`. The walled
postures are `group` and `isolated`.
- `resolve-authz-context.ts:958`: an unscoped `admin_full_access` row
sets `hasPlatformAdminGrant` only when `!legacyGrantAnchorRetired`, so
only under `single`. The set's name and capabilities are still pushed on
every posture, so the anchor is retired but the grant is not (pinned at
`resolve-authz-context.platform-admin-config.test.ts:404`).
- `resolve-authz-context.ts:1009`: the config anchor
(`OS_PLATFORM_OWNER_EMAIL`, verified stored row) has no posture gate and
confers on every posture.
- The request path has no per-request pointer any more.
`reportLegacyPlatformAdminGrant` and
`resetLegacyPlatformAdminGrantReport` are gone (absence pinned at
`platform-admin.test.ts:267`, with positive controls). The only
operator-facing line left is the boot-time fail-closed error at
`packages/plugins/plugin-security/src/bootstrap-platform-admin.ts:897`,
which names the legacy holder at `:912`.
- The `single` half is described as it ships. Its fate is #11979's
(Choice 4B), and nothing here anticipates that decision.
## Per carrier: old text, new text, code site
**1. `content/docs/permissions/authorization.mdx` (combination
semantics, step 3)**
- Old: "That posture is derived at one site from **two anchors**, either
of which is sufficient: the configured administrator list … and an
**unscoped `admin_full_access` grant** row."
- New: The anchors depend on the tenancy posture. The configured list is
sufficient under every posture. The unscoped grant row is sufficient
only under `single`. Under `group` / `isolated` it is no longer an
anchor: the set still grants what any held set grants, but it confers no
`PLATFORM_ADMIN` standing, so standing comes from configuration alone.
Adds a link to the tenancy-modes page.
- Code: `resolve-authz-context.ts:865`, `:958`, `:1009`;
`tenancy-posture.ts:54`.
**1b. `content/docs/permissions/permission-sets.mdx` (who holds
`admin_full_access`). The sweep found this; it was not in the card.**
- Old: "derived at a single site from **two anchors**, and either one is
sufficient" and, for the grant row, "It still confers standing, and it
is **deprecated**: a deployment resolving through it logs a pointer,
once per process, at the configuration line that re-anchors it."
- New: Which anchor is sufficient depends on posture. The config anchor
is read under every posture. The grant row confers standing under
`single` only. Under walled postures it is not an anchor, and nothing is
logged about it per request. If a walled deployment holding such a row
has no usable configured administrator, the boot log reports zero
administrators, names the account holding the row, and points at
`OS_PLATFORM_OWNER_EMAIL`.
- Code: as above, plus `bootstrap-platform-admin.ts:897` / `:912` for
the boot line.
**2. `docs/qa/platform-checklist/areas/access-security.json`, item
`access-security.platform-owner-email-anchor`, revision 1 to 2 (history
appended; revision 1 untouched)**
- Step 6. Old: "grep the process log for the once-per-process
legacy-grant re-anchor pointer". New: run the #11663 L5 posture-split
unit pins named in clause 6 and cite their output. The step states that
there is no live log line to grep and that the only operator-facing line
left is the boot-time fail-closed error.
- Clause 6. Old: "the legacy anchor is honoured and loudly re-pointed …
the once-per-process [authz] pointer names the OS_PLATFORM_OWNER_EMAIL
config line … (reportLegacyPlatformAdminGrant, platform-admin.ts)",
oracle `log`. New: the legacy grant is an anchor under `single` only,
and a silent one. Under a walled posture (`postureEnforcesWall`, the
requested posture) it confers no `PLATFORM_ADMIN` standing, although the
held set keeps its capabilities. The config anchor still confers on that
rig. The request path logs nothing. The oracle is now `test` (the L5
describes in `resolve-authz-context.platform-admin-config.test.ts` and
`platform-admin.test.ts`), and the clause records that a change to the
`single` half is #11979's to make.
- Source parenthetical. Old: "… matchesConfiguredPlatformAdmin
verified-only, reportLegacyPlatformAdminGrant". New: "…
resolvePlatformAdminEmails loud-once resolve,
matchesConfiguredPlatformAdmin verified-only" (all live symbols). Adds
two anchors: `resolve-authz-context.ts#legacyGrantAnchorRetired` and
`tenancy-posture.ts#postureEnforcesWall`.
- The same claim appeared elsewhere in the item, so these parts were
fixed to keep the item true:
- Step 1 booted `isolated` with the variable unset. That boot is refused
today (`packages/plugins/plugin-auth/src/auth-plugin.ts:551`).
- Under a walled posture the seeded admin holds no grant-anchored
standing, because no row is written and an existing row confers nothing.
That made clause 1, clause 3 and the seeded-admin both-sides control
false under `isolated`.
- The live legs now boot `single` (the zero-config default) and keep it
across restarts. Clause 1, the persona and the knownGap name the
posture. A walled variant was added. `automated.ref` now says clause 6
is test-only.
- Code: as above, plus `auth-plugin.ts:551`.
## Verification (head `2505ca61`)
- `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack
--commands` derived 45 commands. All 45 were run and each exit code was
recorded. All 45 exited 0. `check:skill-examples` first exited 3
(PREREQUISITE NOT MET: client-react not built). That is not a
measurement. It exited 0 after `@objectstack/client-react` /
`@objectstack/client` were built. `--ran` reconciles as 45 derived / 45
run / 0 unrun.
- `pnpm check:platform-checklist`: OK. Symbol anchors went from 620/638
to 622/640 resolved. The `areas/access-security.json` anchor census went
from **44 to 46** against its floor of 44, and the floor and ledger are
unchanged.
- The control-byte self-scan over the three files found 0 hits.
- Not measured locally, and declared to CI: the Build Docs job, the Test
Core shards and the type-check lanes that the derivation lists as
CI-only.
## Changeset
None. `content/docs/**` and `docs/qa/**` are not in any published
package's `files[]` (checked over every non-private `package.json`), so
nothing publishes. This is `skip-changeset` territory, and no label was
written by this seat, per the dispatch.
## Acceptance notes
- **Sweep** (`content/docs/**`, `docs/qa/**`, excluding the
auto-generated `references/` and `releases/`) for `either of which`,
`two anchors`, `once-per-process`, `reportLegacyPlatformAdminGrant`,
`unscoped admin_full_access`, `re-anchor` and `admin_full_access`:
- The only other carrier of the claim was `permission-sets.mdx:167-183`,
fixed above.
- `authorization.mdx` (validity-window and deactivation sections): "an
expired / deactivated unscoped `admin_full_access` grant no longer
derives `platform_admin`" is still true on every posture, so it was left
alone.
- `deployment/self-hosting.mdx` first-boot section: already
posture-correct.
- **File surface beyond the claim:**
`content/docs/permissions/permission-sets.mdx` is outside the claim's
declared file surface. It was fixed in place because it is the same
defect class, a mechanical prose fix in the same tree, and no other
claim holds it. The claim's surface needs to be widened by the seat.
- **Step 1 of the checklist item** could not run as written,
independently of #19136, because an `isolated` boot with the variable
unset is refused. It was fixed in the same edit because the item's other
clauses depended on the boot posture.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01VDtqoecgES7ScQYGbFVDRv)_
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent f3a3afc commit 6bf7f1c
3 files changed
Lines changed: 43 additions & 22 deletions
File tree
- content/docs/permissions
- docs/qa/platform-checklist/areas
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
111 | 111 | | |
112 | 112 | | |
113 | 113 | | |
114 | | - | |
115 | | - | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
116 | 117 | | |
117 | | - | |
118 | | - | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
119 | 124 | | |
120 | 125 | | |
121 | 126 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
165 | 165 | | |
166 | 166 | | |
167 | 167 | | |
168 | | - | |
169 | | - | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
170 | 171 | | |
171 | 172 | | |
172 | 173 | | |
| |||
177 | 178 | | |
178 | 179 | | |
179 | 180 | | |
| 181 | + | |
180 | 182 | | |
181 | | - | |
182 | | - | |
183 | | - | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
184 | 191 | | |
185 | 192 | | |
186 | 193 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2403 | 2403 | | |
2404 | 2404 | | |
2405 | 2405 | | |
2406 | | - | |
| 2406 | + | |
2407 | 2407 | | |
2408 | 2408 | | |
2409 | 2409 | | |
2410 | | - | |
| 2410 | + | |
2411 | 2411 | | |
2412 | 2412 | | |
2413 | 2413 | | |
| |||
2417 | 2417 | | |
2418 | 2418 | | |
2419 | 2419 | | |
2420 | | - | |
| 2420 | + | |
2421 | 2421 | | |
2422 | 2422 | | |
2423 | 2423 | | |
2424 | | - | |
| 2424 | + | |
2425 | 2425 | | |
2426 | 2426 | | |
2427 | 2427 | | |
2428 | 2428 | | |
2429 | | - | |
| 2429 | + | |
2430 | 2430 | | |
2431 | 2431 | | |
2432 | 2432 | | |
2433 | | - | |
| 2433 | + | |
2434 | 2434 | | |
2435 | 2435 | | |
2436 | 2436 | | |
| |||
2460 | 2460 | | |
2461 | 2461 | | |
2462 | 2462 | | |
2463 | | - | |
2464 | | - | |
2465 | | - | |
2466 | | - | |
| 2463 | + | |
| 2464 | + | |
| 2465 | + | |
| 2466 | + | |
2467 | 2467 | | |
2468 | 2468 | | |
2469 | 2469 | | |
| |||
2478 | 2478 | | |
2479 | 2479 | | |
2480 | 2480 | | |
2481 | | - | |
| 2481 | + | |
| 2482 | + | |
2482 | 2483 | | |
2483 | 2484 | | |
2484 | 2485 | | |
2485 | 2486 | | |
2486 | 2487 | | |
2487 | 2488 | | |
2488 | 2489 | | |
2489 | | - | |
| 2490 | + | |
2490 | 2491 | | |
2491 | 2492 | | |
2492 | 2493 | | |
2493 | | - | |
| 2494 | + | |
| 2495 | + | |
| 2496 | + | |
2494 | 2497 | | |
2495 | 2498 | | |
2496 | 2499 | | |
| |||
2503 | 2506 | | |
2504 | 2507 | | |
2505 | 2508 | | |
| 2509 | + | |
| 2510 | + | |
| 2511 | + | |
| 2512 | + | |
| 2513 | + | |
| 2514 | + | |
2506 | 2515 | | |
2507 | 2516 | | |
2508 | 2517 | | |
| |||
0 commit comments