Repository navigation
docs(permissions,qa): the unscoped admin_full_access anchor confers platform-admin standing under single only - #19876
Merged
objectstack-fleet[bot] merged 2 commits intoSep 24, 2026
Conversation
…form-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>
…grant retirement Step 6 and clause 6 asked the runner to grep the process log for the retired once-per-process re-anchor pointer and cited the deleted reportLegacyPlatformAdminGrant. Clause 6 now states the posture split with the L5 unit pins as its oracle, the live legs boot `single` (an isolated boot with the variable unset refuses to start, and a walled seeded admin holds no grant-anchored standing), and the source anchors name live symbols. Revision 2, history appended. Claude-Session: https://claude.ai/code/session_01VDtqoecgES7ScQYGbFVDRv Co-authored-by: Claude <noreply@anthropic.com>
Contributor
Author
Contract reviewServed-tier: ① Derived judgmentsEvery changed sentence checked against The rule as it ships:
Checklist item
② Semver levelNone (docs/QA only). No ③ Boundary flags
Implemented-by: VERDICT: PASS Isolated at-tier reviewer, adopted by the Generated by Claude Code |
This was referenced Sep 23, 2026
objectstack-fleet
Bot
deleted the
claude/issue-19145-walled-admin-anchor-docs
branch
September 24, 2026 16:21
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.tsRUN_LIFECYCLE_DENY_MESSAGE) and 4 (packages/platform-objects/src/identity/sys-user.object.tsrole.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:postureEnforcesWallreturnsposture !== 'single'. The walled postures aregroupandisolated.resolve-authz-context.ts:958: an unscopedadmin_full_accessrow setshasPlatformAdminGrantonly when!legacyGrantAnchorRetired, so only undersingle. The set's name and capabilities are still pushed on every posture, so the anchor is retired but the grant is not (pinned atresolve-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.reportLegacyPlatformAdminGrantandresetLegacyPlatformAdminGrantReportare gone (absence pinned atplatform-admin.test.ts:267, with positive controls). The only operator-facing line left is the boot-time fail-closed error atpackages/plugins/plugin-security/src/bootstrap-platform-admin.ts:897, which names the legacy holder at:912.singlehalf is described as it ships. Its fate is platform-admin re-anchor follow-up (Choice 4B): config-anchor thesingleposture — first-user promotion becomes development-only fallback #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)admin_full_accessgrant row."single. Undergroup/isolatedit is no longer an anchor: the set still grants what any held set grants, but it confers noPLATFORM_ADMINstanding, so standing comes from configuration alone. Adds a link to the tenancy-modes page.resolve-authz-context.ts:865,:958,:1009;tenancy-posture.ts:54.1b.
content/docs/permissions/permission-sets.mdx(who holdsadmin_full_access). The sweep found this; it was not in the card.singleonly. 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 atOS_PLATFORM_OWNER_EMAIL.bootstrap-platform-admin.ts:897/:912for the boot line.2.
docs/qa/platform-checklist/areas/access-security.json, itemaccess-security.platform-owner-email-anchor, revision 1 to 2 (history appended; revision 1 untouched)admin_full_accessbecomes a kernel metadata declaration; WHO holds it comes from env-configured verified emails — retiring the org-less row anchor #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.log. New: the legacy grant is an anchor undersingleonly, and a silent one. Under a walled posture (postureEnforcesWall, the requested posture) it confers noPLATFORM_ADMINstanding, although the held set keeps its capabilities. The config anchor still confers on that rig. The request path logs nothing. The oracle is nowtest(the L5 describes inresolve-authz-context.platform-admin-config.test.tsandplatform-admin.test.ts), and the clause records that a change to thesinglehalf is platform-admin re-anchor follow-up (Choice 4B): config-anchor thesingleposture — first-user promotion becomes development-only fallback #11979's to make.resolve-authz-context.ts#legacyGrantAnchorRetiredandtenancy-posture.ts#postureEnforcesWall.isolatedwith the variable unset. That boot is refused today (packages/plugins/plugin-auth/src/auth-plugin.ts:551).isolated.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.refnow says clause 6 is test-only.auth-plugin.ts:551.Verification (head
2505ca61)node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commandsderived 45 commands. All 45 were run and each exit code was recorded. All 45 exited 0.check:skill-examplesfirst exited 3 (PREREQUISITE NOT MET: client-react not built). That is not a measurement. It exited 0 after@objectstack/client-react/@objectstack/clientwere built.--ranreconciles as 45 derived / 45 run / 0 unrun.pnpm check:platform-checklist: OK. Symbol anchors went from 620/638 to 622/640 resolved. Theareas/access-security.jsonanchor census went from 44 to 46 against its floor of 44, and the floor and ledger are unchanged.Changeset
None.
content/docs/**anddocs/qa/**are not in any published package'sfiles[](checked over every non-privatepackage.json), so nothing publishes. This isskip-changesetterritory, and no label was written by this seat, per the dispatch.Acceptance notes
content/docs/**,docs/qa/**, excluding the auto-generatedreferences/andreleases/) foreither of which,two anchors,once-per-process,reportLegacyPlatformAdminGrant,unscoped admin_full_access,re-anchorandadmin_full_access:permission-sets.mdx:167-183, fixed above.authorization.mdx(validity-window and deactivation sections): "an expired / deactivated unscopedadmin_full_accessgrant no longer derivesplatform_admin" is still true on every posture, so it was left alone.deployment/self-hosting.mdxfirst-boot section: already posture-correct.content/docs/permissions/permission-sets.mdxis 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.isolatedboot 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