Repository navigation
docs(permissions): the hand-written pages describe the security catalog main serves, not the four retired row objects - #23322
Merged
objectstack-fleet[bot] merged 1 commit intoOct 13, 2026
Conversation
…og main serves, not the four retired row objects The catalog-row docs sweep after stage 8. Positions, permission sets and capabilities are definitions the environment registry serves by name (ADR-0131 D3); assignments name them. The pages no longer describe the sys_permission_set projection, the data-door write-through, the binding rows or the row-object Setup pages as live. Claude-Session: https://claude.ai/code/session_012zwsLMxQBwHUYJgPyrpEvx Co-authored-by: Claude <noreply@anthropic.com>
This was referenced Oct 13, 2026
This was referenced Oct 13, 2026
objectstack-fleet
Bot
deleted the
claude/issue-22976-catalog-row-docs-sweep
branch
October 13, 2026 19:31
This was referenced Oct 13, 2026
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 #22976
Clause-②: no (docs)
What this changes
After C3 stage 8 (#23222) and stage 7b (#23302),
mainserves positions, permission sets and capabilities as catalog definitions. The environment registry holds them and answers them by name (ADR-0131 D3), and assignments name them. Nine of the ten hand-written pages on the card still described the four retired row objects (sys_position,sys_permission_set,sys_position_permission_set,sys_capability) as stored tables. Some also described the ADR-0094 projector, the data-door write-through, binding rows, or the row-object Setup pages as live. This PR rewrites those passages to say whatmaindoes. Each rewrite was checked against source atmain404fc477e5. The tenth page,protocol/backward-compatibility.mdx, has one mention, and that mention is correct release history, so it is unchanged.Docs only: 9 files, +149 / −136. There are no edits under
content/docs/releases/**,CHANGELOG.md, ADRs (thedomain:skillscard #22978) or the generated reference pages.Re-measure on
main404fc477e5The grep
sys_position|sys_permission_set|sys_capabilityovercontent/docs/**, excludingreleases/**andreferences/**, matches exactly the card's 10 pages: authorization 11, permission-sets 6, delegated-administration 5, capabilities 3, positions 3, system-context 2, and 1 each on the other four. A second grep for the removed mechanisms (projector, projection, write-through, backfill, walled catalog data door,isRowActive,SystemObjectName.POSITION, the data-door URLs) adds no page. Its hits outside these pages describe mechanisms that are still live:deployment/cli.mdx: "mutation projectors". The datasource-admin plugin still registers one.kernel/cluster.mdx: the registry write-through,applyRegistryWriteThrough.The two generated reference pages that still mention the objects (
references/api/protocol.mdx3,references/identity/eval-user.mdx2) render spec.describe()text. That text is residue for the 8-post stage, so those pages are not edited here.Each mention was judged either a mis-statement or a correct retired statement. A correct "no row is written" or "retired" sentence is kept, as the card allows.
mainconcepts/metadata-lifecyclePOST /api/v1/data/sys_permission_setas a clone path and says "the refusal does not name it yet".data-modeling/objectssys_position_permission_setas a member of thesystem-databucket.deployment/environment-variablespermissions/authorizationsys_permission_setandsys_position.manage_metadata, operator-only under a wall,NOT_OVERRIDABLEnaming the clone.activecolumn.sys_capabilityseed.permissions/capabilitiesactiveflag" implies the row is still served.permissions/delegated-administrationpermissions/permission-setseveryoneis derived, and the gate runs on the derived definition.manageBindings,sys_position_permission_set).main.permissions/positionssys_position.namedescribed as live.permissions/system-contextmainit still names the data door on the three retired objects.protocol/backward-compatibility17.2.0retiredsys_position.permissions).Sources for the rewrites (
main404fc477e5)packages/core/src/security/security-catalog.ts(module doc). Positions, permission sets and capabilities are read by name from the engine registry first, then from the metadata service. No row is read.sys-user-permission-set.object.ts:109(permission_set,Field.text) and:86(the legacypermission_set_id, plain text, which grants nothing).sys-user-position.object.ts:84(position). The plugin registers three objects (objects/index.ts:12-14).singleand under a wall:metadata-core/src/meta-write-capability.ts:82admits a/metawrite formanage_metadataorisSystemonly.:169-195(walledCatalogWriteVerdict): undergrouporisolated, only the platform operator orisSystemmay write the catalog. Undersinglethe verdict is inert (:182).plugin-security/src/security-plugin.ts:1543-1545(/apps/setup/metadata/TYPE?scope=environment).1fb1ced3:app-shell/src/views/metadata-admin/catalog-activation.tsandResourceListPage.tsx:148. It writesPOST /security/_activation/:type/:name.metadata-protocol/src/packaged-base-regime.ts:194-199(the clone routes the refusal names) andmanagedItemSealedSentence(NOT_OVERRIDABLE/ 403). Delete:protocol.ts:17772(refusePackagedBaseRemoval).permissionmerges at read, so a delete removes only a stored row, and the package's definition stays served.core/src/security/resolve-user-grants-cache.ts:117-125(watched set).security-plugin.ts:1850-1866bumps themetadataepoch on every metadata change.lint/src/validate-capability-references.ts:16-26. A seed row is not a source.delegated-admin-gate.ts:131-149(the governed set still names the two retired objects) and:396-405(dispatch).:818:manageAssignmentsalso gates direct grants.:993-1048:manageBindingsandauthorEnvironmentSetsstill take part in containment.showcase-permission-zoo.dogfood.test.ts:173-177.plugin-security/src/cleanup-package-permissions.ts:13-25revokes the grants that name a declared set.plugin-security/src/builtin-positions.ts:121registersguestwith nopermissionSets.:138deriveseveryonefrom the baseline.objectql/src/engine.ts:10276(resolveObjectNamethrowsOBJECT_NOT_FOUNDfor an unregistered object).plugin-security/src/auto-org-admin-grant.ts:154-176catches the error and answers[].cli/src/utils/organization-ownership-apply.ts:38-53and:399-405. Undersingle, authored sets and positions are converted. Authored capability rows are reported. Seeded copies are deleted.Measured against ADR-0131 D2/D3 text
The ADR's original reading was that Setup authoring under
singleneeds no Studio capability (the organization admin's object grants). The ADR's own text withdraws that reading: the 2026-10-10 note in D2 and D3 (#22621) says Setup authoring undersinglerequiresmanage_metadata.maindoes what the withdrawal says (meta-write-capability.ts:82), and the pages followmain.Shared pages
system-context.mdx(it adds row 47c after row 47) andbackward-compatibility.mdx(lines 117 and 195, the package count). This PR touches neither hunk. It does not editbackward-compatibility.mdxat all, and itssystem-context.mdxedits are rows 11 and the census paragraph near line 410. Whichever PR lands second mergesmain.claude/issue-23231-walled-environment-metadata-writesate7fdcc48e2). Its branch edits three of these pages:capabilities.mdx(the walled-refusal paragraph, lines 243–249),permission-sets.mdx(the walled/packagessentences, lines 354–360) andsystem-context.mdx(row 55b). This PR leaves those lines unchanged. Onpermission-sets.mdx, lines 351–353 sit unchanged between the two hunks. Row 55b onmainstill names the data door on the three retired objects. [Decision] 墙内组织里持有 manage_metadata 的人仍能改共用的对象、视图、流程:只放行平台运营者(A)、禁止组织范围授予(B),还是维持并写明(C) #23231's rewrite already scopes that clause to "while those objects are registered", so the row is left to it.Acceptance notes
.describe()texts still cite the retired objects:permission.zod.tspackageIdandmanagedBy("persisted onsys_permission_setrecords",bootstrapDeclaredPermissions),AdminScopeSchema.manageBindings, andsys-user-position.object.tsposition("referencessys_position.name"). Two generated reference pages render that text.adminScope.manageBindingsandauthorEnvironmentSetsare spec-declared keys whose primary gates target objectsmainno longer registers. They now take part only in strict containment. The showcase still declares both asfalse. Thepermissionliveness row'sadminScopeevidence still cites the two retired objects.createPermissionSetWriteThroughandregisterPermissionSetProjectionare still exported from@objectstack/plugin-security(index.ts:79-80), but nothing registers them.sys_permission_setandsys_position(auto-org-admin-grant.ts:343-356,delegated-admin-gate.ts:1317,:1330, and the grant-name backfill) throwOBJECT_NOT_FOUND. The errors are caught, so each read answers no rows.delegated-administration.mdxsays "sys_memberis not one of the gate's governed objects" (the invitation role cap).GOVERNED_OBJECTSlists it (delegated-admin-gate.ts:148). This is unrelated to the catalog objects, so it is not changed here.permissions/administrator-guide.mdxis not added to the page list. It names none of the four objects and none of the removed mechanisms. Its Setup walkthrough was not checked against the console at the pin.Verification
Local runs on head
260137da82. CI is not complete yet.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 44 commands; all 44 ran and exited 0.--ranreconciles: "44 derived famil(ies) accounted for — 44 run, 0 NOT-MEASURED (a DERIVED zero — all 44 recorded an exit code and none of them is 3)". Selected verdict lines:check:doc-anchors: 499 internal fragment links resolve, including the newpermission-sets#package-suggestion--isdefault-adr-0090-d5.check:system-context-census: "OK — 133 elevation read sites … the page cites 126 symbol(s) against 126 required".check:doc-authoring,check:corpus-claim-drift,check:role-word,check:overlay-whitelist-table,check:docs-transcript-drift, speccheck:docs("226 generated files in sync") and speccheck:skill-examples(263 prose examples type-check): all green.PREREQUISITE NOT MET. Both were re-run after the lock-held builds of@objectstack/lint...and@objectstack/client-react...(VERDICT command-exit 0), and both then exited 0.lychee 0.24.2withcheck-links.yml's argv (--offline --root-dir content --fallback-extensions mdx,md --config lychee.tomlover the four globs): "2460 Total … 0 Errors".node scripts/check-adr-links.mjs: 730 links resolve.@mdx-js/mdx3.1.1 withremark-gfmcompiled all nine edited pages (9/9). Control: an unclosedCalloutfails with "Expected a closing tag".skip-changeset. The diff is onlycontent/docs/**. Of the 71 non-privatepackage.jsonmanifests, none has afiles[]entry namingcontent/. Control: the same scan forlivenessmatchespackages/spec.Generated by Claude Code