Repository navigation
docs(permissions): describe the packaged permission-set lock in "One authoritative store" - #22391
Merged
objectstack-fleet[bot] merged 4 commits intoOct 9, 2026
Conversation
…authoritative store" The section's first bullet still said a Setup edit of a packaged set becomes an environment overlay that takes effect, and its closing sentence still named an overlay as the way to narrow a packaged set. Since the packaged lock, that edit answers 403 NOT_OVERRIDABLE and stores nothing. The bullet now names the locked population (sets shipped in code: a package's declarations and the platform defaults), the clone remedy the refusal itself names, and the sets that stay editable in place (created here, clones, sets saved into a writable runtime package). The closing sentence now routes narrowing through clone-and-bind-in-its-place, and names narrowing the packaged set itself as the package author's change. Claude-Session: https://claude.ai/code/session_0115N1oNnQS5WqofZ2DzaT3q Co-authored-by: Claude <noreply@anthropic.com>
…rmission-sets-packaged-lock
…th the packaged lock Two more places still said a shipped permission set can be overlaid in the environment. The Provenance paragraph's clause pointed "see below" at the corrected bullet, which now says the opposite; administrator-guide Step 5 and its FAQ answer told admins to overlay a shipped set. Both now state the lock with the same population as the corrected bullet: a set shipped in code (by an installed app, or a platform default) refuses an environment edit with 403 NOT_OVERRIDABLE, and the remedy is clone and adjust. Sets created here, clones and writable-runtime-package sets stay editable in place. Step 5 keeps its order of preference, and the FAQ keeps "or simply left unassigned". Claude-Session: https://claude.ai/code/session_0115N1oNnQS5WqofZ2DzaT3q Co-authored-by: Claude <noreply@anthropic.com>
…rmission-sets-packaged-lock
objectstack-fleet
Bot
deleted the
claude/issue-22379-permission-sets-packaged-lock
branch
October 9, 2026 02:19
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.
Fixes #22379
Clause-②: no
What changed
Two docs pages: four passages that still said a set shipped in code can be overlaid in the environment. +25 / -16 lines against
main.content/docs/permissions/permission-sets.mdx, "One authoritative store — the record is a projection (ADR-0094)"403 NOT_OVERRIDABLEand stores nothing. The bullet now says:*.permission.ts, a stack'spermissionSets) or a platform default such asmember_default;403 NOT_OVERRIDABLE, nothing stored);POST /api/v1/data/sys_permission_set;main, so it is not edited. Evidence is under premise check 5.content/docs/permissions/permission-sets.mdx, "Provenance — package vs environment sets (ADR-0086)",:311-312permission-set-write-through-package-binding.dogfood.test.ts:167-173(a data-door edit ofshowcase_contributoranswers403 NOT_OVERRIDABLE, no row minted), andpermission-set-lock-row-provenance.dogfood.test.ts(the shipped set is refused at both doors, while a clone takes an edit). The clone remedy is theclone_permission_setaction inpackages/plugins/plugin-security/src/objects/sys-permission-set.object.ts:115-160.content/docs/permissions/administrator-guide.mdx, Step 5 (:162-164) and the FAQ (:194-196)member_default— can't be edited in the environment (a save answers403 NOT_OVERRIDABLE): clone it and adjust the clone, which is your own set while upgrades keep reaching the original. Sets created here, clones, and sets saved into a writable runtime package are edited in place. The API name is immutable after creation."permission-set-write-through-package-binding.dogfood.test.ts:167-173andtwo-doors-permission.dogfood.test.ts块2 (showcase_contributoranswers 403, and no overlay is minted).two-doors-permission.dogfood.test.ts(last 块2 case) andshowcase-permission-projection.dogfood.test.ts§2 pin403on amember_defaultedit with no overlay minted. The status is pinned. The code is read from the producer (refusePackagedBaseOverride,NOT_OVERRIDABLE) and is not pinned.permission-set-lock-row-provenance.dogfood.test.tsshapes 1-3 (runtime-package set, org set, clone).userMessageinpackaged-permission-set-lock.ts("The clone is your organization's own permission set, and package upgrades keep reaching the original.").Not touched: the "Declared ≠ enforced — diagnosing a frozen package set" section. PR #22365 (card #22307) adds a clause there in a hunk starting at
:368, and the decision card #22371 may rewrite that section.content/docs/releases/is not touched either.Premise checks against
main(base117d34de3f, now merged up to191543456f)117d34de3f,permission-sets.mdx:332-339("it genuinely takes effect") and:350-352("use an overlay where a packaged set must be narrowed") read as the card quotes them. Holds.packages/qa/dogfood/test/permission-set-write-through-package-binding.dogfood.test.ts:167-173.PATCH /data/sys_permission_set/:idonshowcase_contributoranswers{ status: 403, code: 'NOT_OVERRIDABLE' }, and the activesys_metadatarows are unchanged.PackagedPermissionSetLockedErrorinpackages/plugins/plugin-security/src/packaged-permission-set-lock.ts. The data door's insert and update legs throw it (permission-set-projection.ts,createPermissionSetWriteThrough), and so does the metadata door (packaged-permission-set-lock-gate.ts).classifyPackagedPermissionSetreads the engine SchemaRegistry.declaredPackageIdOfskips projection echoes, tenant-authored stored rows (isTenantAuthored,_provenance: 'org'), and_packageId: 'sys_metadata'shadows.permission-set-write-through-package-binding.dogfood.test.ts:152-160, andpermission-set-lock-row-provenance.dogfood.test.tsshape 1), an org-created set (shape 2), and a clone (shape 3).main. Holds.clone_permission_setaction (sys-permission-set.object.ts:115-160) POSTs to/api/v1/data/sys_permission_set. It carries every permission facet but deliberately notadmin_scope. The lock'suserMessageand the producer's regime sentence (packaged-base-regime.ts:162-167) both name it.sys_position_permission_setrows ("Assigning permission sets" on this page;positions.mdx:7-10).showcase-permission-zoo.dogfood.test.ts:133-143pins a tenant admin binding the package-shippedshowcase_contributorto a position.showcase-permission-projection.dogfood.test.ts("deleting a runtime-only set retires both the definition and the record") andpermission-set-projection.test.ts:785.two-doors-permission.dogfood.test.ts块2 delete case andshowcase-permission-projection.dogfood.test.ts§3 both answer 2xx withsuccess: false, and the record stays.deleteMetaItem(the 2026-08-10 maintainer ruling, themergesOverlayAtReadcarve-out inrefusePackagedBaseRemoval). Pinned byprotocol.legacy-overlay-delete.test.tsandpermission-set-projection.test.ts:926. With no overlay present, the delete changes nothing.Dogfood Regression Gateconcludedsuccesson117d34de3f. Confirming that each cited file appears in the job logs is NOT MEASURED: the log host answeredForbiddenfrom this container.Gates
Derived with
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackon headfc3fdb1b69: 43 commands, the same list as round 1. All 43 ran onfc3fdb1b69and exited 0. Exit codes were captured before any pipe.VERDICT command-exit 0) before the run, so the dist-reading gates measured this tree.--ranwith per-command exit codes): "43 derived famil(ies) accounted for — 43 run, 0 NOT-MEASURED (a DERIVED zero …)".check:skill-examples: "262 prose examples type-check across 3 surface(s)".check:doc-anchors: "468 internal #fragment link(s) across 417 source file(s) all resolve to a real heading".check:nul-bytes: "OK (scanned 10373 text file(s) … no raw ASCII control bytes)".check:doc-authoring: clean.check:docs: "225 generated files in sync with packages/spec".origin/mainmoved to0ef9029da4after this round's merge. That commit only retitlespackages/spectest files and touches no docs, so it was not merged again; CI's merge ref covers it.Build DocsandTest Corejobs, and the type-check lanes.Changeset
None. The diff is docs-only under
content/docs/, which no package publishes, so the PR carries theskip-changesetlabel.Acceptance notes
Accepted by the seat as notes, not filed:
packages/plugins/plugin-security/src/permission-set-projection.ts:559-568, the comment says "A legacy env overlay on an artifact-backed item of a rolled-back type can no longer be REMOVED through the ordinary delete path (403) — only via OS_METADATA_WRITABLE #6960 measures the ordinary delete path refusing to lift" a legacy overlay. The 2026-08-10 ruling since lets that delete go through (protocol.legacy-overlay-delete.test.ts).createPermissionSetWriteThroughdoc comment at:1055-1058still says a package-owned row's update becomes an env-scope overlay.deleteMetaItemwith no package. The repository delete matches any package (sys-metadata-repository.ts,whereFor).readDeclaredBody(permission-set-projection.ts:494) skips_packageId: 'sys_metadata'shadows and projection echoes, but not the tenant-authored (_provenance: 'org') rows the lock's classifier learned to skip.Generated by Claude Code