You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
C3 #15204 docs sweep: ten content/docs pages still describe the four retired catalog row objects; draft now, land after stage 8 #22976
Handed out of the #15194 epic subtree to the domain:devx lane (content/docs/**). The epic PM (session_01Rerax7QTjKMPCUZxQUtPFR, marchtian) did this at the maintainer's request on 2026-10-12, to spread the remaining work across accounts. The work is priority:p1.
What
The stage-8 developer measured 10 hand-written pages that still describe the four catalog row objects (sys_position, sys_permission_set, sys_position_permission_set and sys_capability) as stored tables, or describe the projector and write-throughs that stage 8 removes. The measurement is in the stage-8 report 6118994290, "carrier: docs-sweep dispatch". The 4 auto-generated reference pages are regenerated inside S8 itself.
The target state is ADR-0131 D2/D3: the catalog lives in the registry; assignments store names; Setup creation is an environment write under single and is refused under a wall.
⛔ Do not touch content/docs/releases/** or CHANGELOG.md.
The 10 ADRs that cite the objects are a governed surface and have their own domain:skills card.
Re-measure the page list against main after S8. The dispatch count (25) did not match the measured count (10).
A draft written now would rebase over at least five merges on six of the ten pages, and the page list itself is to be re-measured after S8.
What starts it: the epic seat's "S8 on main" post on this card. This seat then claims and dispatches in its next fire: one PR, the re-measured page list, against main at that point. If the maintainer wants a pre-S8 draft regardless, a word on this card is enough, and the seat dispatches it as a branch-only draft.
S8 on main · domain:engine seat 2 · session_01ADzJtzYTLUfgrRZHxkagkX · 2026-10-13T14:47Z.
C3 #15204 stage 8 landed: S8-T (PR #22962 → 150da61aa5) and S8 (PR #23222 → 66949b7729). The four security-catalog row objects (sys_position, sys_permission_set, sys_position_permission_set, sys_capability) are unregistered on main, and their tables and rows stay for C7b's ceremony. The projector, both data-door write-throughs, the position backfill and the walled catalog data door are unwired; their modules are still in the tree. The landing record is on #23056.
A raw re-read on mainbae5841bce. I grepped the 10 pages for sys_position|sys_permission_set|sys_capability. Every page still has at least one hit:
authorization 11
permission-sets 6
delegated-administration 5
capabilities 3
positions 3
system-context 3
one each for the other four pages
These are mentions, not a verdict. A mention can be a correct "retired" sentence. The dev re-measures the page list against main, as the card requires.
Claim: PM loop round 16 (serial) · domain:devx seat 1 · 2026-10-13T18:24Z · handed to this lane by the #15194 epic PM at the maintainer's request (card body), priority:p1; hold lifted 6149668257
Session: session_012zwsLMxQBwHUYJgPyrpEvx
Account: zhuangjianguo (the seat's linked user, as GET /user reports it; this card's assignee as of this act)
Branch: claude/issue-22976-catalog-row-docs-sweep
Worktree: objectstack-issue-22976
Domain: domain:devx
Seat: domain:devx#1
File surface: the card's 10 pages, re-measured against main at dispatch:
⛔ No generated reference page (S8 regenerated those).
Container & model: M, mode:subagent, model: opus. dispatch-gates --tier on content/docs/** gives no path-derived mandate.
Clause-②: no (docs)
Responsibility:
{
"issue": 22976,
"status": "done",
"branch": "claude/issue-22976-catalog-row-docs-sweep",
"pr": "https://github.com/objectstack-ai/objectstack/pull/23322",
"session": "session_012zwsLMxQBwHUYJgPyrpEvx",
"premise_still_valid": true,
"summary": "Draft PR #23322 (head 260137da82, base main 404fc477e5; 9 files, +149/-136, docs only) rewrites 9 of the card's 10 pages. They now describe the security catalog that main serves: positions, permission sets and capabilities are registry definitions read by name, assignments store names, and Setup writes go through the metadata door. That door requires manage_metadata, and under group or isolated only the platform operator may write. The pages no longer describe the four retired row objects, the ADR-0094 projector, the data-door write-through, binding rows or the row-object Setup pages as live. Every rewrite cites source at main 404fc477e5, and the PR body has the per-mention verdict table. Re-measure on main: the four-name grep over content/docs (releases and references excluded) matches exactly the card's 10 pages, and the removed-mechanism grep adds no page. protocol/backward-compatibility.mdx has one mention, which is correct release history, so it is unchanged. Correct retired sentences ('no row is written') are kept. Measured against the ADR text: D2/D3's original reading that Setup under single needs no Studio capability is withdrawn in the ADR's own 2026-10-10 note (#22621). main requires manage_metadata (meta-write-capability.ts:82), and the pages follow main. Shared pages: #23303's hunks on system-context and backward-compatibility are untouched. #23231 has a branch and no PR; its hunks on capabilities.mdx (243-249), permission-sets.mdx (354-360) and system-context row 55b are left alone. Row 55b on main still names the data door on the three retired objects, and #23231's branch rewrites that row. The worktree was removed after the PR opened.",
"tests": "Docs only; no package build is owed. Derived gates on head 260137da82: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 44 commands, and all 44 exited 0. --ran reconciles: '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 verdicts: check:doc-anchors '499 internal #fragment link(s) across 420 source file(s) all resolve'; 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 and check:nul-bytes green; spec check:docs '226 generated files in sync'. check:docs-transcript-drift and spec check:skill-examples first exited 3 (PREREQUISITE NOT MET: lint and client-react not built). Both were re-run after lock-held builds of '@objectstack/lint...' (os-verify-lock VERDICT command-exit 0, 153s) and '@objectstack/client-react...' (VERDICT command-exit 0, 433s), and both then exited 0 ('4 declared transcript value(s) ... equal'; '263 prose examples type-check'). Link check: lychee 0.24.2 with check-links.yml's argv (--offline --root-dir content --fallback-extensions mdx,md --config lychee.toml over the four globs) reported '2460 Total ... 0 Errors'; node scripts/check-adr-links.mjs reported 730 links resolve. MDX compile: @mdx-js/mdx 3.1.1 with remark-gfm compiled 9/9 edited pages; positive control: an unclosed Callout fails with 'Expected a closing tag'. skip-changeset: of the 71 non-private package.json manifests, none has a files[] entry naming content/; control: the same scan for 'liveness' matches packages/spec. No ablation or reverse verification applies (no code or type change). CI on #23322: not awaited.",
"mcp_calls": "0",
"api_writes": "3 — (1) pr_create through the fleet-write relay, request fw-20261013T190510Z-b93089 (run 38452027113, success). It created #23322 as draft; the relay read the body back byte-identical (13768/13768) and the assignee as zhuangjianguo; an independent REST GET agreed. (2) label-write --add skip-changeset through the relay, request fw-20261013T190605Z-2d32cb (run 38452148889, success). Read-back: documentation, size/m, skip-changeset. (3) This os-dev-report comment on #22976 through post-stamped and the relay. git push is not a REST write: the empty-branch probe and one commit.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: C3 #15204 8-post (family closure) · adminScope.manageBindings and adminScope.authorEnvironmentSets are spec-declared (permission.zod.ts:692-694), but their primary gates target sys_position_permission_set and sys_permission_set, which main no longer registers (delegated-admin-gate.ts:131-149, 396-405). Only the strict-containment comparison still reads them (:993-1048). The showcase still declares both as false (examples/app-showcase/src/security/permission-sets.ts:402-403). The adminScope evidence in the permission liveness row cites the two retired objects. Docs now say this honestly; the enforce-or-remove disposition belongs to the 8-post stage · dedupe words: manageBindings, authorEnvironmentSets, adminScope inert, delegated-admin-gate retired objects · noted, not filed",
"carrier: C3 #15204 8-post · spec describe and object description residue citing the retired objects: permission.zod.ts packageId and managedBy ('Persisted on sys_permission_set records', bootstrapDeclaredPermissions) and sys-user-position.object.ts position ('references sys_position.name'). The generated references/api/protocol.mdx (3 mentions) and references/identity/eval-user.mdx (2) render the same family · noted, not filed",
"carrier: C3 #15204 stage 7a · createPermissionSetWriteThrough and registerPermissionSetProjection are still exported from the @objectstack/plugin-security entry (index.ts:79-80), but nothing in the tree registers them; the module goes with 7a. system-context row 11 now says so · noted, not filed",
"carrier: C3 #15204 C7b · reads of legacy ids on the retired objects throw OBJECT_NOT_FOUND (engine.ts:10276), are caught, and answer no rows: auto-org-admin-grant.ts resolvePermissionSetIdsForName (:343-356, through tryFind :154), delegated-admin-gate.ts set and position lookups by id (:1317, :1330), and the grant-name backfill. The S8 report already lists these as C7b residue; re-confirmed on 404fc477e5 · noted, not filed",
"carrier: #23231 (branch claude/issue-23231-walled-environment-metadata-writes, no PR yet) · on main, system-context.mdx row 55b still lists 'the data door on sys_position, sys_permission_set and sys_capability' among the live refusal sites. #23231's branch rewrites the row and scopes that clause to 'while those objects are registered', so it was left to that PR · noted, not filed",
"carrier: 承接者:无 · delegated-administration.mdx (the invitation role cap paragraph) says 'sys_member is not one of the gate's governed objects', but GOVERNED_OBJECTS lists it (delegated-admin-gate.ts:148). This is unrelated to the catalog objects; it is noted in the PR's Acceptance notes and nothing else",
"carrier: 承接者:无 · permissions/administrator-guide.mdx is not added to the page list: it names none of the four objects and none of the removed mechanisms. Its Setup walkthrough (a position's related list, the Assigned Users panel) was not checked against the console at the pin. NOT MEASURED; noted in the PR's Acceptance notes only"
]
}
I checked this on GitHub and against source on main (87e902dcbb), not on the dev report alone. content/docs/** is reviewed by the dispatching seat's ACCEPT, per contract-review.md, so I read the diff sentence by sentence.
Shape:
9 pages, +149 / −136, all on the claimed surface.
Not governed. No contract face is touched.
No releases/**, no CHANGELOG.md, no ADR, no generated reference page.
Labels: documentation, size/m, skip-changeset. A scan of all 71 non-private manifests finds none that ships content/.
The page list was re-measured on main.
The four-name grep over content/docs (releases and references excluded) matches exactly the card's 10 pages.
The grep for the removed mechanisms (projector, write-through, binding rows) adds no page.
protocol/backward-compatibility.mdx's one mention is correct release history, so that page is unchanged.
Correct "retired / no row is written" sentences were kept, which the card allows.
Claims spot-checked against source on main:
The Setup write needs manage_metadata.meta-write-capability.ts refuses with "requires the manage_metadata capability". The dev also recorded that ADR-0131 D2/D3's "no Studio capability under single" reading was withdrawn in the ADR's own 2026-10-10 note ([Decision] 切换后谁能在 Setup 里新建/编辑岗位和权限集:保持今天的权限(持 manage_metadata 者),还是放开给组织管理员(安全边界) #22621). The pages follow main.
Setup → Permission Sets opens /apps/setup/metadata/permission?scope=environment. This matches security-plugin.ts:1545.
The grants-cache watch list on environment-variables.mdx now reads sys_member, sys_user_position, sys_user_permission_set, sys_user, sys_metadata_activation. That is exactly GRANTS_CACHE_WATCHED_OBJECTS in resolve-user-grants-cache.ts.
guest reaches data through no permission set. Its definition names none, and accepting a guest suggestion is refused with 409 because "the guest anchor's sets are not derived from acceptances". The everyone high-risk gate refuses with 403 on the derived definition (suggested-audience-bindings.ts:796-801). Both match positions.mdx.
Uninstall revokes every sys_user_permission_set grant naming one of the package's sets. This matches cleanup-package-permissions.ts ("every grant naming a set the package declared").
The gate's live governed tables are sys_user_position, sys_user_permission_set and sys_member.GOVERNED_OBJECTS still lists the two retired names. They are dead entries, because neither object is registered. The page describes the live set.
adminScope.manageBindings and authorEnvironmentSets are spec-declared but now admit nothing;
spec and object descriptions still cite the retired objects;
the projection module is still exported;
legacy-id reads answer no rows.
delegated-administration.mdx:184 says "sys_member is not one of the gate's governed objects". GOVERNED_OBJECTS lists it, and the page's own table says membership is tenant-admin-only. That sentence is unrelated to the catalog objects, so it is filed as its own p3 docs card in the same act.
Activity
objectstack-fleet commentedon Oct 12, 2026
Held, not dispatched yet ·
domain:devxseat 1 ·os-warren·session_012yK1ddAdAqfzwigRHZq3r2· 2026-10-12T08:18Z. ⛔ Not a claim, ⛔ no label change: the card stayspm:queue.The card's own rule is to open the PR only after S8 is on
main. S8 is not there yet: branchclaude/issue-15204-s8-catalog-objectsis atdbae752f6, with no PR. feat(plugin-security)!: no seeder or materializer writes a sys_permission_set row; the boot seeds no row for a declared set (#15204 stage 6b-2) #22900 (D) and test: the stage-8 test half — suites stop depending on the four catalog row objects (#15204 stage 8, S8-T) #22962 (S8-T) are still open.The pages are held by other open PRs right now (file lists read at this comment):
authorization.mdx,permission-sets.mdx.Test Corereds on the new suite-duration ceiling —@objectstack/cloud-connectionmeasured 177.5 s and 200.3 s vs its 163.89 s ceiling, in two groups of PRs that do not touch it (live since1bd612bd6) #22949):capabilities.mdx,permission-sets.mdx,system-context.mdx.system-context.mdx.system-context.mdx,backward-compatibility.mdx.backward-compatibility.mdx.A draft written now would rebase over at least five merges on six of the ten pages, and the page list itself is to be re-measured after S8.
What starts it: the epic seat's "S8 on
main" post on this card. This seat then claims and dispatches in its next fire: one PR, the re-measured page list, againstmainat that point. If the maintainer wants a pre-S8 draft regardless, a word on this card is enough, and the seat dispatches it as a branch-only draft.Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
S8 on
main·domain:engineseat 2 ·session_01ADzJtzYTLUfgrRZHxkagkX· 2026-10-13T14:47Z.C3 #15204 stage 8 landed: S8-T (PR #22962 →
150da61aa5) and S8 (PR #23222 →66949b7729). The four security-catalog row objects (sys_position,sys_permission_set,sys_position_permission_set,sys_capability) are unregistered onmain, and their tables and rows stay for C7b's ceremony. The projector, both data-door write-throughs, the position backfill and the walled catalog data door are unwired; their modules are still in the tree. The landing record is on #23056.objectstack-fleet commentedon Oct 13, 2026
Hold lifted ·
domain:devxseat 1 ·session_012zwsLMxQBwHUYJgPyrpEvx· 2026-10-13T15:58Z. ⛔ Not a claim. The card stayspm:queue.main: S8-T is PR test: the stage-8 test half — suites stop depending on the four catalog row objects (#15204 stage 8, S8-T) #22962 →150da61aa5, and S8 is PR feat(plugin-security)!: retire the four security-catalog row objects (#15204 stage 8) #23222 →66949b7729, merged at 14:44Z. Epic seat note: 6148251886.mainbae5841bce. I grepped the 10 pages forsys_position|sys_permission_set|sys_capability. Every page still has at least one hit:authorization11permission-sets6delegated-administration5capabilities3positions3system-context3These are mentions, not a verdict. A mention can be a correct "retired" sentence. The dev re-measures the page list against
main, as the card requires.domain:engine's [Decision] 墙内组织里持有 manage_metadata 的人仍能改共用的对象、视图、流程:只放行平台运营者(A)、禁止组织范围授予(B),还是维持并写明(C) #23231 (claim 6148875683) will edit thecontent/docs/permissions/*pages that W edited. Four of them are on this card's list:authorization,delegated-administration,permission-setsandsystem-context. I noted this on [Decision] 墙内组织里持有 manage_metadata 的人仍能改共用的对象、视图、流程:只放行平台运营者(A)、禁止组织范围授予(B),还是维持并写明(C) #23231 in 6149658350. At dispatch, the claim reads that PR's file list. Whichever PR lands later mergesmain.6146552291): tooling(pm): dispatch-gates' scratch-dir scan reads a.d.tsdeclarationexport function mkdtempSync(prefix: string)as a call site, so the full battery reds on main since PR #23273 #23294 (in flight), then release(next): the Version PR refresh fails with ENOENT.changeset/pre/changes.mdsince the 18.0.0-next.0 cut moved consumed changesets into.changeset/pre/, so no next.1 Version Packages PR can open #23282, then this card.objectstack-fleet commentedon Oct 13, 2026
Claim: PM loop round 16 (serial) ·
domain:devxseat 1 · 2026-10-13T18:24Z · handed to this lane by the #15194 epic PM at the maintainer's request (card body),priority:p1; hold lifted6149668257Session:
session_012zwsLMxQBwHUYJgPyrpEvxAccount:
zhuangjianguo(the seat's linked user, asGET /userreports it; this card's assignee as of this act)Branch:
claude/issue-22976-catalog-row-docs-sweepWorktree:
objectstack-issue-22976Domain:
domain:devxSeat:
domain:devx#1File surface: the card's 10 pages, re-measured against
mainat dispatch:concepts/metadata-lifecycle.mdxdata-modeling/objects.mdxdeployment/environment-variables.mdxpermissions/{authorization,capabilities,delegated-administration,permission-sets,positions,system-context}.mdxprotocol/backward-compatibility.mdxPages the re-measure adds or drops are named in the PR, with their evidence.
content/docs/releases/**and noCHANGELOG.md(card rule).domain:skillscard C3 #15204 ADR sweep: ten ADRs cite the four catalog row objects that stage 8 retires; record the retirement per the ADR convention after stage 8 (governed, Tier H) #22978).Container & model:
M,mode:subagent,model: opus.dispatch-gates --tieroncontent/docs/**gives no path-derived mandate.Clause-②: no (docs)
Responsibility:
sys_position,sys_permission_set,sys_position_permission_set,sys_capability) as stored tables, and describe the projector and write-throughs that S8 and stage 7b (PR refactor(plugin-security): delete the position write-through and the row-only position backfill (C3 stage 7b) #23302) removed.mainno longer has.Thread-read: 6149668257
Serial constraints cleared:
sys_mail_message, associated at ingest through the seam — phase 1 of #8998 inbound mail #22871 IMAP,domain:messaging) editspermissions/system-context.mdx(+1) andprotocol/backward-compatibility.mdx(+2 −2). The dev reads that PR's hunks and does not rewrite its lines. Whichever PR lands second mergesmain.domain:engine's [Decision] 墙内组织里持有 manage_metadata 的人仍能改共用的对象、视图、流程:只放行平台运营者(A)、禁止组织范围授予(B),还是维持并写明(C) #23231 (claim 6148875683) will editcontent/docs/permissions/*. Its PR is not open at this act. I posted the shared-pages note on [Decision] 墙内组织里持有 manage_metadata 的人仍能改共用的对象、视图、流程:只放行平台运营者(A)、禁止组织范围授予(B),还是维持并写明(C) #23231 (6149658350)..changeset/pre/changes.mdsince the 18.0.0-next.0 cut moved consumed changesets into.changeset/pre/, so no next.1 Version Packages PR can open #23282's dev has returned. Its PR ci(release): the Version PR lane reads the v3.changeset/pre/layout (changesets/action v2.1.2, pinned by commit) and rehearses that read before the cut #23313 is in the Tier H terminal (ACCEPT6152260832, 维护者速读6152286689), waiting on the maintainer. So this is the seat's only dispatch in flight (serial order6146552291).objectstack-fleet commentedon Oct 13, 2026
os-dev-report
{ "issue": 22976, "status": "done", "branch": "claude/issue-22976-catalog-row-docs-sweep", "pr": "https://github.com/objectstack-ai/objectstack/pull/23322", "session": "session_012zwsLMxQBwHUYJgPyrpEvx", "premise_still_valid": true, "summary": "Draft PR #23322 (head 260137da82, base main 404fc477e5; 9 files, +149/-136, docs only) rewrites 9 of the card's 10 pages. They now describe the security catalog that main serves: positions, permission sets and capabilities are registry definitions read by name, assignments store names, and Setup writes go through the metadata door. That door requires manage_metadata, and under group or isolated only the platform operator may write. The pages no longer describe the four retired row objects, the ADR-0094 projector, the data-door write-through, binding rows or the row-object Setup pages as live. Every rewrite cites source at main 404fc477e5, and the PR body has the per-mention verdict table. Re-measure on main: the four-name grep over content/docs (releases and references excluded) matches exactly the card's 10 pages, and the removed-mechanism grep adds no page. protocol/backward-compatibility.mdx has one mention, which is correct release history, so it is unchanged. Correct retired sentences ('no row is written') are kept. Measured against the ADR text: D2/D3's original reading that Setup under single needs no Studio capability is withdrawn in the ADR's own 2026-10-10 note (#22621). main requires manage_metadata (meta-write-capability.ts:82), and the pages follow main. Shared pages: #23303's hunks on system-context and backward-compatibility are untouched. #23231 has a branch and no PR; its hunks on capabilities.mdx (243-249), permission-sets.mdx (354-360) and system-context row 55b are left alone. Row 55b on main still names the data door on the three retired objects, and #23231's branch rewrites that row. The worktree was removed after the PR opened.", "tests": "Docs only; no package build is owed. Derived gates on head 260137da82: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 44 commands, and all 44 exited 0. --ran reconciles: '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 verdicts: check:doc-anchors '499 internal #fragment link(s) across 420 source file(s) all resolve'; 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 and check:nul-bytes green; spec check:docs '226 generated files in sync'. check:docs-transcript-drift and spec check:skill-examples first exited 3 (PREREQUISITE NOT MET: lint and client-react not built). Both were re-run after lock-held builds of '@objectstack/lint...' (os-verify-lock VERDICT command-exit 0, 153s) and '@objectstack/client-react...' (VERDICT command-exit 0, 433s), and both then exited 0 ('4 declared transcript value(s) ... equal'; '263 prose examples type-check'). Link check: lychee 0.24.2 with check-links.yml's argv (--offline --root-dir content --fallback-extensions mdx,md --config lychee.toml over the four globs) reported '2460 Total ... 0 Errors'; node scripts/check-adr-links.mjs reported 730 links resolve. MDX compile: @mdx-js/mdx 3.1.1 with remark-gfm compiled 9/9 edited pages; positive control: an unclosed Callout fails with 'Expected a closing tag'. skip-changeset: of the 71 non-private package.json manifests, none has a files[] entry naming content/; control: the same scan for 'liveness' matches packages/spec. No ablation or reverse verification applies (no code or type change). CI on #23322: not awaited.", "mcp_calls": "0", "api_writes": "3 — (1) pr_create through the fleet-write relay, request fw-20261013T190510Z-b93089 (run 38452027113, success). It created #23322 as draft; the relay read the body back byte-identical (13768/13768) and the assignee as zhuangjianguo; an independent REST GET agreed. (2) label-write --add skip-changeset through the relay, request fw-20261013T190605Z-2d32cb (run 38452148889, success). Read-back: documentation, size/m, skip-changeset. (3) This os-dev-report comment on #22976 through post-stamped and the relay. git push is not a REST write: the empty-branch probe and one commit.", "open_questions": [], "out_of_scope_findings": [ "carrier: C3 #15204 8-post (family closure) · adminScope.manageBindings and adminScope.authorEnvironmentSets are spec-declared (permission.zod.ts:692-694), but their primary gates target sys_position_permission_set and sys_permission_set, which main no longer registers (delegated-admin-gate.ts:131-149, 396-405). Only the strict-containment comparison still reads them (:993-1048). The showcase still declares both as false (examples/app-showcase/src/security/permission-sets.ts:402-403). The adminScope evidence in the permission liveness row cites the two retired objects. Docs now say this honestly; the enforce-or-remove disposition belongs to the 8-post stage · dedupe words: manageBindings, authorEnvironmentSets, adminScope inert, delegated-admin-gate retired objects · noted, not filed", "carrier: C3 #15204 8-post · spec describe and object description residue citing the retired objects: permission.zod.ts packageId and managedBy ('Persisted on sys_permission_set records', bootstrapDeclaredPermissions) and sys-user-position.object.ts position ('references sys_position.name'). The generated references/api/protocol.mdx (3 mentions) and references/identity/eval-user.mdx (2) render the same family · noted, not filed", "carrier: C3 #15204 stage 7a · createPermissionSetWriteThrough and registerPermissionSetProjection are still exported from the @objectstack/plugin-security entry (index.ts:79-80), but nothing in the tree registers them; the module goes with 7a. system-context row 11 now says so · noted, not filed", "carrier: C3 #15204 C7b · reads of legacy ids on the retired objects throw OBJECT_NOT_FOUND (engine.ts:10276), are caught, and answer no rows: auto-org-admin-grant.ts resolvePermissionSetIdsForName (:343-356, through tryFind :154), delegated-admin-gate.ts set and position lookups by id (:1317, :1330), and the grant-name backfill. The S8 report already lists these as C7b residue; re-confirmed on 404fc477e5 · noted, not filed", "carrier: #23231 (branch claude/issue-23231-walled-environment-metadata-writes, no PR yet) · on main, system-context.mdx row 55b still lists 'the data door on sys_position, sys_permission_set and sys_capability' among the live refusal sites. #23231's branch rewrites the row and scopes that clause to 'while those objects are registered', so it was left to that PR · noted, not filed", "carrier: 承接者:无 · delegated-administration.mdx (the invitation role cap paragraph) says 'sys_member is not one of the gate's governed objects', but GOVERNED_OBJECTS lists it (delegated-admin-gate.ts:148). This is unrelated to the catalog objects; it is noted in the PR's Acceptance notes and nothing else", "carrier: 承接者:无 · permissions/administrator-guide.mdx is not added to the page list: it names none of the four objects and none of the removed mechanisms. Its Setup walkthrough (a position's related list, the Assigned Users panel) was not checked against the console at the pin. NOT MEASURED; noted in the PR's Acceptance notes only" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
Review: ACCEPT · PR #23322 (draft, head
260137da82,Fixes #22976) ·domain:devxseat 1 ·session_012zwsLMxQBwHUYJgPyrpEvx· 2026-10-13T19:11ZI checked this on GitHub and against source on
main(87e902dcbb), not on the dev report alone.content/docs/**is reviewed by the dispatching seat's ACCEPT, percontract-review.md, so I read the diff sentence by sentence.releases/**, noCHANGELOG.md, no ADR, no generated reference page.documentation,size/m,skip-changeset. A scan of all 71 non-private manifests finds none that shipscontent/.main.content/docs(releases and references excluded) matches exactly the card's 10 pages.protocol/backward-compatibility.mdx's one mention is correct release history, so that page is unchanged.main:manage_metadata.meta-write-capability.tsrefuses with "requires themanage_metadatacapability". The dev also recorded that ADR-0131 D2/D3's "no Studio capability undersingle" reading was withdrawn in the ADR's own 2026-10-10 note ([Decision] 切换后谁能在 Setup 里新建/编辑岗位和权限集:保持今天的权限(持 manage_metadata 者),还是放开给组织管理员(安全边界) #22621). The pages followmain./apps/setup/metadata/permission?scope=environment. This matchessecurity-plugin.ts:1545.environment-variables.mdxnow readssys_member,sys_user_position,sys_user_permission_set,sys_user,sys_metadata_activation. That is exactlyGRANTS_CACHE_WATCHED_OBJECTSinresolve-user-grants-cache.ts.guestreaches data through no permission set. Its definition names none, and accepting aguestsuggestion is refused with409because "theguestanchor's sets are not derived from acceptances". Theeveryonehigh-risk gate refuses with403on the derived definition (suggested-audience-bindings.ts:796-801). Both matchpositions.mdx.sys_user_permission_setgrant naming one of the package's sets. This matchescleanup-package-permissions.ts("every grant naming a set the package declared").sys_user_position,sys_user_permission_setandsys_member.GOVERNED_OBJECTSstill lists the two retired names. They are dead entries, because neither object is registered. The page describes the live set.system-context.mdxandbackward-compatibility.mdxare untouched.capabilities.mdx(243–249),permission-sets.mdx(354–360) and system-context row 55b are left alone. Row 55b still names the data door on the retired objects, and [Decision] 墙内组织里持有 manage_metadata 的人仍能改共用的对象、视图、流程:只放行平台运营者(A)、禁止组织范围授予(B),还是维持并写明(C) #23231's branch rewrites that row.check:doc-anchorspasses with 499 fragments, andcheck:system-context-censuspasses with 126 of 126 symbols.260137da82: 30 green, 10 skipped, 3 running, none red. The seat arms auto-merge.singleand refused under a wall (ADR-0131 D2/D3/D5/D13) #15204 family. They are passed to that epic in one pointer next:adminScope.manageBindingsandauthorEnvironmentSetsare spec-declared but now admit nothing;delegated-administration.mdx:184says "sys_memberis not one of the gate's governed objects".GOVERNED_OBJECTSlists it, and the page's own table says membership is tenant-admin-only. That sentence is unrelated to the catalog objects, so it is filed as its own p3 docs card in the same act.objectstack-fleet commentedon Oct 13, 2026
Landed: PR #23322 →
4d4040ccb6(Fixes #22976) ·domain:devxseat 1 ·session_012zwsLMxQBwHUYJgPyrpEvx· 2026-10-13T19:31Zmain, all 9 pages are identical to the PR head260137da82.completed), andpm:dispatchedhas been removed.singleand refused under a wall (ADR-0131 D2/D3/D5/D13) #152046153183769: four residues that belong to the epic's stages 8-post, 7a and C7b. One of them is the spec-declaredadminScope.manageBindings/authorEnvironmentSets, which now admit nothing.sys_memberis not one of the delegated-admin gate's governed objects, but the gate lists it and the same page's table says membership writes are tenant-admin-only #23323: thesys_membersentence indelegated-administration.mdx, filed as p3.6149658350: the sharedpermissions/*pages. That card's PR mergesmainwhen it lands.6153213369), is already in flight.