Repository navigation
feat(plugin-security)!: retire the four security-catalog row objects (#15204 stage 8) - #23222
Merged
Merged
Conversation
…efusal diagnostics and managed_by normalizer (#15204 stage 6b-2) Claude-Session: https://claude.ai/code/session_013XKtmoR5QCUSTMjiQ3os49 Co-authored-by: Claude <noreply@anthropic.com>
…log row; os meta resync is retired (#15204 stage 6b-2) Claude-Session: https://claude.ai/code/session_013XKtmoR5QCUSTMjiQ3os49 Co-authored-by: Claude <noreply@anthropic.com>
…us retires with its writer (#15204 stage 6b-2) Claude-Session: https://claude.ai/code/session_013XKtmoR5QCUSTMjiQ3os49 Co-authored-by: Claude <noreply@anthropic.com>
…stage 6b-2) Claude-Session: https://claude.ai/code/session_013XKtmoR5QCUSTMjiQ3os49 Co-authored-by: Claude <noreply@anthropic.com>
…ift_status / drift_detail (#15204 stage 6b-2) Claude-Session: https://claude.ai/code/session_013XKtmoR5QCUSTMjiQ3os49 Co-authored-by: Claude <noreply@anthropic.com>
…the legacy platform-bucket rows themselves (#15204 stage 6b-2) Claude-Session: https://claude.ai/code/session_013XKtmoR5QCUSTMjiQ3os49 Co-authored-by: Claude <noreply@anthropic.com>
…face-only disposition (#15204 stage 6b-2) Claude-Session: https://claude.ai/code/session_013XKtmoR5QCUSTMjiQ3os49 Co-authored-by: Claude <noreply@anthropic.com>
…6b-2) Claude-Session: https://claude.ai/code/session_013XKtmoR5QCUSTMjiQ3os49 Co-authored-by: Claude <noreply@anthropic.com>
…ed seeders (#15204 stage 6b-2) Claude-Session: https://claude.ai/code/session_013XKtmoR5QCUSTMjiQ3os49 Co-authored-by: Claude <noreply@anthropic.com>
…new one (#15204 stage 6b-2) Claude-Session: https://claude.ai/code/session_013XKtmoR5QCUSTMjiQ3os49 Co-authored-by: Claude <noreply@anthropic.com>
…wn changeset (#15204 stage 6b-2a) Claude-Session: https://claude.ai/code/session_013XKtmoR5QCUSTMjiQ3os49 Co-authored-by: Claude <noreply@anthropic.com>
…ermission_set row; existing-database cases write the legacy row themselves (#15204 stage 6b-2) Claude-Session: https://claude.ai/code/session_013XKtmoR5QCUSTMjiQ3os49 Co-authored-by: Claude <noreply@anthropic.com>
…places did (#15204 stage 6b-2) Claude-Session: https://claude.ai/code/session_013XKtmoR5QCUSTMjiQ3os49 Co-authored-by: Claude <noreply@anthropic.com>
…r, a command that exists (#15204 stage 6b-2a) Claude-Session: https://claude.ai/code/session_013XKtmoR5QCUSTMjiQ3os49 Co-authored-by: Claude <noreply@anthropic.com>
… seeder was the only caller of (#15204 stage 6b-2) warnOrganizationLessRows, catalogIsPerOrganization and listSeedOrganizationIds had one caller, bootstrap-declared-permissions.ts, deleted in this PR. Re-measured: no live caller and no test. Internal (never exported from the package index). Also carries T1's buildExistingByName key-set fence byte-for-byte. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013XKtmoR5QCUSTMjiQ3os49
…15204 stage 6b-2) No assertion changes; keeps the residual under the 3,000-line ruling after the organization-scope deletion. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013XKtmoR5QCUSTMjiQ3os49
# Conflicts: # content/docs/permissions/tenant-audit-census.mdx # docs/audits/2026-08-tenant-audit-write-call-sites.counts.md # examples/app-showcase/test/inert-wirings.test.ts # packages/cli/src/utils/schema-migrate.lazy-driver-import.test.ts
…og row objects (#15204 stage 8, S8-T) Every touched suite stays green on main and on main + D + S8, where sys_position, sys_permission_set, sys_position_permission_set and sys_capability are no longer registered (ADR-0131 D3). - a testkit holds the retired tables' shapes for suites that model an existing database; - pins of the retired declarations, the unwired data-door write-throughs, the projection, the row lock and the junction gates are deleted; - fixtures author permission sets through the metadata door; - prose and floor pins span the route move and the retired page; - new: a fresh-boot promotion golden (E6) and a metadata-door-reaches- the-catalog dogfood test (the premise of E1). Claude-Session: https://claude.ai/code/session_01MGoWgeE8rhsrig77V4oUZn Co-authored-by: Claude <noreply@anthropic.com>
…15204 stage 8) sys_position, sys_permission_set, sys_position_permission_set and sys_capability are no longer registered (ADR-0131 D3): their data and REST routes and their Setup object pages go; the tables and rows stay for the organization-ownership migration (D10). - E1: the permission mutation projector and its reconcile, both data-door write-throughs and the row-only position backfill are unwired; a metadata-door save reaches the catalog through the door's own registry write-through. - E3: sys_user_permission_set.permission_set_id is Field.text (maxLength 255): same column, ids and indexes. - E6: the first-admin promotion reads no catalog row; an unscoped grant that names no set and carries a legacy id still withholds it. - Uninstall revokes every grant naming a set the package declared; the doors read the names before the withdrawal (declared). - Setup nav opens the registry lists; residue lists, prose, help text, the lint seed-row source and isRowActive go; translations, censuses, reference docs and the keyed-text-bounds record are regenerated; an ADR-0087 semantic entry registers the retirement. Claude-Session: https://claude.ai/code/session_01MGoWgeE8rhsrig77V4oUZn Co-authored-by: Claude <noreply@anthropic.com>
…8 test half resolved onto main Conflicts resolved by the stage-8 report's D-merge recipe: - S8-T's deletions taken over main's edits: bootstrap-platform-admin- refused-existence-read, position-write-through, and the dogfood files permission-set-lock-row-provenance, permission-set-write-through- package-binding, showcase-permission-projection, two-doors-permission; rbac-objects keeps S8-T's removal of the retired declaration pins. - main's catalogPermissionSet reads kept in activity-text-predicate, approval-snapshot-masked-field, sharing-rule-org-less-caller and showcase-crud-persona-matrix. - showcase-permission-zoo takes S8-T's side; showcase-fls-read-mask-strip takes S8-T's metadata-door authoring and keeps main's catalog read. - plugin-security imports keep main's seedLegacyPlatformBucket and point the object shapes at the legacy-catalog-objects testkit. - ensureLegacyPermissionSetRow leaves the dogfood catalog helper: every caller is deleted. showcase-permission-seeding's row census runs only where sys_permission_set is still registered. - the runtime seeder-copy suite keeps main's "no row" pin beside S8-T's registered-object guard; the record-page label-map floor is restated for B2's two dropped maps and the retired position page. Claude-Session: https://claude.ai/code/session_01ADzJtzYTLUfgrRZHxkagkX Co-Authored-By: Claude <noreply@anthropic.com>
…s declared names shape D (#22900) landed the uninstall cleanup's declared names as `UninstallDeclared` ({ permission: string[] }), not the bare name array the stage-8 branch was built against. The suite now passes that shape and drops its signature cast; D's two named-grant pins are restated over S8-T's fixture so each holds whether the sweep also reaches the package's catalog rows (main) or reaches its sets by the declared names alone (after C3 stage 8). The runner suite's comment attributes `declared` to the names D captures. Claude-Session: https://claude.ai/code/session_01ADzJtzYTLUfgrRZHxkagkX Co-Authored-By: Claude <noreply@anthropic.com>
… D's final form The branch carried an early D (fcaedfd) merged by hand; main now carries D as landed (c8a9783). The resolution is main plus S8's own commit (dbae752 against its first parent 1d5c2b2), replayed as a three-way cherry-pick, so no line of the early D that the landed D dropped survives. - Uninstall cleanup: D's landed capture (captureUninstallDeclared, UninstallDeclared { permission }) supersedes S8's declaredCatalogItemsOf / UninstalledCatalogItem. S8 no longer edits metadata-protocol's protocol.ts or index.ts, nor cloud-connection's install-local door or vitest config. cleanupPackagePermissions keeps D's signature and drops the row legs (catalog-row read, position bindings, by-id grant leg), as stage 8 rules. - security-plugin: the walled catalog data-door refusal registered since S8 was built (ADR-0131 D3) guards only the retired objects; it is unregistered with the write-throughs. The cleanup registration is D's. - sys_user_permission_set.permission_set_id: Field.text (E3) keeps B2's hidden flag. - Generated files (translations, tenant-audit census, tenancy census, reference docs) took main's side here and are regenerated next. Claude-Session: https://claude.ai/code/session_01ADzJtzYTLUfgrRZHxkagkX Co-Authored-By: Claude <noreply@anthropic.com>
…he four catalog row objects Three files that reached main after S8-T's base read the retired objects: - walled-catalog-data-door.test.ts is deleted: it pins the walled catalog refusal's data-door registration on sys_position, sys_permission_set and sys_capability, which stage 8 unregisters with the write-throughs (the precedent of position-write-through.test.ts); - wall-catalog-refusal's data-door case answers 403 PERMISSION_DENIED while the row objects are registered and 404 OBJECT_NOT_FOUND once they are retired, and asserts no definition either way; - mail-message-pool-read-gate reads its fixture sets from the security catalog: no boot has written a sys_permission_set row since D, so the row read failed on main as well. Claude-Session: https://claude.ai/code/session_01ADzJtzYTLUfgrRZHxkagkX Co-Authored-By: Claude <noreply@anthropic.com>
…e merged tree The merge took main's side of every generated file; regenerated here from the merged sources (main + stage 8): - plugin-security en object translations (check-i18n-bundles --write; the other locales and every other bundle were already in sync), - the spec reference page for permission (gen:docs), - the platform-object tenancy census (four retired objects leave it), - the tenant-audit census page and its counts ledger. Claude-Session: https://claude.ai/code/session_01ADzJtzYTLUfgrRZHxkagkX Co-Authored-By: Claude <noreply@anthropic.com>
…h: the stage-8 test half under the code half S8-T is draft PR #22962 and carries a merge of main at f931e76, after D (c8a9783). Clean merge, no file in common with stage 8's own diff; every one of S8-T's 93 files here is byte-identical to its head. Until S8-T lands on main this branch's diff also carries its hunks. Claude-Session: https://claude.ai/code/session_01ADzJtzYTLUfgrRZHxkagkX Co-Authored-By: Claude <noreply@anthropic.com>
…catalog objects The README ships in the package (files[]), and stage 8 makes three of its sentences false: sets resolve against SysPermissionSet metadata, SysPosition and SysPermissionSet are exported objects, and sys_position / sys_permission_set are system objects the plugin registers. It now names the security catalog as the home of positions, permission sets and capabilities (ADR-0131 D3), and lists the three objects the plugin still registers. Claude-Session: https://claude.ai/code/session_01ADzJtzYTLUfgrRZHxkagkX Co-Authored-By: Claude <noreply@anthropic.com>
…door behaviour on D's landed form - metadata-protocol is a patch (refusal prose only): the uninstall capture is D's captureUninstallDeclared, so stage 8 exports nothing new there, and cloud-connection is no longer touched. - The uninstall bullet says what stage 8 changes on top of D: the cleanup revokes by the declared names alone and reads or removes no catalog row. - The walled catalog refusal's data-door half goes with the objects: a data-door write on the three retired names answers 404 OBJECT_NOT_FOUND (protocol.assertObjectRegistered) for every caller. Claude-Session: https://claude.ai/code/session_01ADzJtzYTLUfgrRZHxkagkX Co-Authored-By: Claude <noreply@anthropic.com>
On D's landed form stage 8 adds no export and widens no accept set: the one widening the early build carried, the declaredCatalogItemsOf export, is D's captureUninstallDeclared now. What remains narrows (routes, object pages, exports, the walled data door's admitted operator writes, the lint seed-row source), so the value is no and the arm is narrowing. Claude-Session: https://claude.ai/code/session_01ADzJtzYTLUfgrRZHxkagkX Co-Authored-By: Claude <noreply@anthropic.com>
Measured on a local main + S8-T + S8 tree: - plugin-auth's two grant-reader suites seed the legacy platform-bucket rows only where sys_permission_set is still registered; - builtin-positions expects the walled tenant create refusal while the plugin declares the sys_position row object, which stage 8 retires together with that refusal; - the record-page label-map floor is 38, the count with B2's two maps and the retired position page gone. Claude-Session: https://claude.ai/code/session_01ADzJtzYTLUfgrRZHxkagkX Co-Authored-By: Claude <noreply@anthropic.com>
Contributor
Author
维护者速读 · PR #23222(S8,C3 第 8 阶段的代码半边)·
|
os-zhuang
approved these changes
Oct 13, 2026
os-zhuang
marked this pull request as ready for review
October 13, 2026 14:14
This was referenced Oct 13, 2026
This was referenced Oct 13, 2026
This was referenced Oct 13, 2026
github-merge-queue Bot
pushed a commit
that referenced
this pull request
Oct 13, 2026
…row-only position backfill (C3 stage 7b) (#23302) Refs #22975 Clause-②: no C3 (#15204) stage 7b: delete the position write-through and the row-only position backfill. Stage 8 left both unreferenced, so this is dead-code deletion. It is the parallel half of 7a; 8-post follows once both have landed. #22975 stays open. ## What this changes Stage 8 (#23222) stopped registering the `sys_position` row object, the `sys_position` data-door write-through and the row-only position backfill. Their modules stayed in the tree with no caller. This PR deletes them. - **Deleted:** `position-write-through.ts` and `position-environment-backfill.ts`. Measured on `main` before this PR: no file imports `position-environment-backfill`, and only `catalog-reference-report.ts` imports `position-write-through` (for `POSITION_OBJECT` and `metadataDoorAcceptsPositionName`). The backfill is deleted rather than switched to core's `positionDefinitionFromRow`. That mapper (#22959) stays in core for the upgrade ceremony; no boot path calls it. - **`PositionNameConflictError`** goes with the write-through, its only thrower (ruling Q4 → A). It was never exported from the package's entry. - **The catalog reference report** (`catalog-reference-report.ts`) drops categories 4 and 5: - category 4: a position row with no definition; - category 5: a position name that several rows carry. It also drops the `posture` input, which only those two categories read. No composition registers `sys_position` after stage 8, so those categories could never read a row. Legacy position rows are the upgrade ceremony's to convert and report (ADR-0131 D10). The report still lists, per organization: - every assignment whose position the catalog does not resolve; - every grant whose permission set the catalog does not resolve; - every grant that names no permission set. The report is not exported. Seat answer Q1 → A. - **Generated, regenerated with the repo's own tools:** - row 11b leaves `content/docs/permissions/system-context.mdx`; - the write-through's `UNTYPED_RECEIVERS` row leaves `scripts/tenant-audit-census.mjs`; - the tenant-audit census page and counts are regenerated with `node scripts/tenant-audit-census.mjs --write`, and the prose figures the gate names are updated (228 → 225 sites). No export of `@objectstack/plugin-security`'s entry changes. The changeset is a `patch`, so no ADR-0087 marker is needed. ## Acceptance notes - **Overlap with 7a.** 7a edits the same census, system-context and `security-plugin.ts` regions. Whichever PR lands second merges `main`, re-runs `node scripts/tenant-audit-census.mjs --write` and updates the census prose figures. - **Not here:** - the comment sweep and the remaining catalog gates (8-post); - the catalog reference report's sixth class (8-post, director ruling #23229 → B). ## Verification On head `8c7ee7f06a` (`main` `026391d5d8` merged in), unless noted: - `plugin-security` unit suite: 188/188 files, 3,854 passed (45 skipped). Typecheck: exit 0. eslint on the changed files: exit 0. - `check:tenant-audit-census` and `check:system-context-census`: exit 0. - The derived gate sweep (`dispatch-gates --commands`): 114 derived and 114 run, all exit 0; `--ran` reconciles with 0 NOT-MEASURED and 0 UNRUN. This was measured on `05dee10c89`, the head before the last merge of `main`, whose five commits touch none of these files. - The three symbol-anchor sweeps (adr, scripts, spec-docblock): exit 0. - `check:dual-build-cjs-loads` on a full build (74/74 tasks): exit 0. - `check:platform-checklist`: exit 1 with 8 reds. The same 8 reds appear on `main` (they are pre-existing). - Dogfood: 254 files passed (1 skipped), 2,106 tests passed. - CLI integration tier (`--project integration`): 119/119 files, 1,036 tests passed. - objectui pinned sibling: no export of `@objectstack/plugin-security`'s entry changes, so nothing the console imports moves. CI's Console Pin Gate covers it. --- _Generated by [Claude Code](https://claude.ai/code/session_01287UbjvrigpWwNfGDmdwpS)_ Co-authored-by: Claude <noreply@anthropic.com>
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.
Part of #15204
Clause-②: no (narrowing): it retires four declared objects with their data and REST routes, Setup object pages and exports. It adds no export and widens no accept set; the one widening of the early build (a new metadata-protocol export) is D's landed captureUninstallDeclared now.
C3 stage 8, the code half (S8), card #23056. It lands after S8-T (#22962, the test half) and D (#22900). #15204 stays open: 7a/7b (dead modules, #22975), 8-post (residue), C7b (#22937 / #15211, the id-to-name rewrite and the column drop) and the docs sweep follow.
What this changes
The four security-catalog row objects (
sys_position,sys_permission_set,sys_position_permission_set,sys_capability) are no longer registered (ADR-0131 D3). Their data and REST routes go, and so do their Setup object pages. Tables and rows stay for the organization-ownership migration (ADR-0131 D10).permissionmutation projector and its reconcile, thesys_permission_setandsys_positiondata-door write-throughs and the row-only position backfill are no longer registered. A metadata-door save reaches the catalog through the door's own registry write-through. S8-T'spermission-metadata-door-reaches-catalog.dogfood.test.tspins this. The modules stay for 7a/7b to delete.grouporisolateddeployment, a data-door write on those names now answers404 OBJECT_NOT_FOUND(protocol.assertObjectRegistered) for every caller. S8-T'swall-catalog-refusaldogfood pins this./meta, at the clone door and at the/packagesdoors is unchanged.walled-catalog-data-door.test.tspinned the registration and is deleted with it. The modulewalled-catalog-data-door.tsstays, unreferenced, for 7a/7b.sys_user_permission_set.permission_set_idis nowField.text(maxLength 255) and keeps B2'shidden. The column, its ids and both indexes stay the same.grant-readers-unnamed-grant.cleanupPackagePermissionskeeps D's signature (declared: { permission }, captured bycaptureUninstallDeclaredin both uninstall doors) and drops the row legs: the catalog-row read, the position-binding delete and the by-id grant leg. It revokes by the declared names alone. The by-id leg is C7b's./apps/setup/metadata/TYPE?scope=environment.bypassObjects, the organization_admin and showcase object-permission entries,SystemObjectName.POSITION/PERMISSION_SET, the platform-object name lists and the tenancy entry.capability-reference-unknownseed-row source goes.sys_permission_setdata route.isRowActiveis deleted.MEASUREDrecord.access-security.packaged-permission-set-lifecycleis retired.catalog-row-objects-retired.sys-permission-set.object.ts#managedBy. It now says the row object is retired and anchors to18.catalog-row-objects-retired.ts;check-adr-symbol-anchorswould otherwise red. That one line putsdocs/adr/**in this diff.18.walled-catalog-tenant-writes-retiredno longer promises a data-door403on the three retired objects: itssurfaceandacceptanceCriteriasay the refusal held while the objects were registered, and that the data door now answers404.@objectstack/objectql'sPLATFORM_OBJECT_TENANCYlosing itssys_permission_setkey (objectqlis gradedminor), andos migrate planlisting the four tables as unmanaged on an existing database (report-only).scripts/check-keyed-text-bounds.mjs'sMEASUREDrecord and header name the tree its five counts hold on.mainafter S8-T (each still pins its own predicate):plugin-security/src/explain-principal-person.test.ts(from fix(plugin-approvals,plugin-security): the approval request actions name the request in their success copy, and Explain access names the principal as a person #23202) takes the retired shapes from the legacy testkit.cli/src/utils/unmanaged-tables.integration.test.tsusessys_user_permission_setas its plugin-declared negative control; the retired table is now a true positive.cli/src/utils/schema-migrate.host-composition.integration.test.tspins pending work, coverage and the write absence onsys_user_position/sys_user_permission_set. Its legacy-unique drift moves tosys_audience_binding_suggestion's organization-respelled unique (the samereplace_unique_indexplan).Reconciliation with D (#22900,
c8a9783eca)This branch was first built on an early D (
fcaedfdaa1). Themainmerge resolves it as main plus this stage's own commit (dbae752f6eagainst its first parent), replayed three-way, so no line of the early D that the landed D dropped survives.captureUninstallDeclared/UninstallDeclared { permission }supersedes this stage's earlierdeclaredCatalogItemsOf/UninstalledCatalogItem. As a result this diff does not touchpackages/metadata-protocol/src/protocol.tsor its index, nor cloud-connection's install-local door or vitest config.security-plugin.tsis D's. TheresolveCbpRelationregion is untouched.Verification
Branch head
23e450a684: main6d7f4df3c9plus this diff, 75 files, +456 / −3352. All heavy runs went throughos-verify-lock; times are shared-box readings.turbo run build(74 of 74), andturbo run typecheck(147 of 147, on016d329a36).plugin-securityandclitypecheck are green after the merge ofmainthat brought fix(plugin-approvals,plugin-security): the approval request actions name the request in their success copy, and Explain access names the principal as a person #23202's suite.pnpm --filter @objectstack/spec check:generatedreports all 14 artifacts current. The tenant-audit census (regenerated on the merged tree), the platform-object tenancy census andcheck-i18n-bundlesare in sync.b22a9ee6bf(main4f5679c261plus this diff; the latermainmerge touches no package this diff does): 254 files plus 1 skipped, 2099 tests. CI skips the dogfood shards on PRs.976023f0da:a29bede970,@objectstack/cliwhole (unit and integration, as CI runs it): 403 of 404 files. The one red wasschema-migrate.host-composition.integration.test.ts, re-pinned since;016d329a36:permissionsave reaches the catalog with the projector unwired.permission-metadata-door-reaches-catalog.dogfood.test.tsis green in the full dogfood run above, and no live caller of the projector, either write-through, the backfill or the walled door remains.SecurityPlugin, holds 36 tables and none of the four retired ones.origin/main(150 families), unioned with the dispatch's lead list, ran on the final head.dispatch-gates --ranreconciles every derived family, and every gate exits 0 exceptcheck:platform-checklist.ABSENT SYMBOL/ anchor-floor findings are identical onmain150da61aa5(line-for-line comparison), and the gate is kept out of per-PR CI.check-adr-symbol-anchors,check:adr-anchors,check:adr-0087-registration,check:spec-changes,check:upgrade-guide,check:keyed-text-boundsandcheck:pm-governed-mergesare green.check-governed-merges --test: GOVERNED,docs/adr/**×1, and over 3000 changed lines.pnpm lint(the repo-wide scan is CI's).Acceptance notes
permission-set-projection.ts,position-write-through.ts,position-environment-backfill.ts,walled-catalog-data-door.ts(and its ADR anchor) and thewritesExecutedByDataDoorWeakSet.catalog-reference-report.tsandposition-environment-backfill.tstakePOSITION_OBJECTandmetadataDoorAcceptsPositionNamefromposition-write-through.ts;packaged-permission-set-overlay-detection.tstakestryFindandProjectionLoggerfrompermission-set-projection.ts.index.tsstill exports the projector functions.security-plugin.tsanddelegated-admin-gate.ts, andSYSTEM_ROW_PROVENANCE.auto-org-admin-grantresolvePermissionSetIdsForName, the grant-name backfill (now a permanentobjects-absentno-op), the by-id uninstall leg, and the blank-name leg-C edge of the first-admin promotion (not measured).content/docspages and ADRs that name the objects, includingsystem-context.mdxrow 55b's data-door clause.18.0.0-next.0's CHANGELOG entry for the walled refusal names a data-door403on the three objects. That is true ofnext.0, and this diff's changeset records the move to404for the next release; the unreleased ADR-0087 entry is corrected in this diff.docs/adr/**in this diff, so the PR is Tier H by path as well as by size (check-governed-merges --test: GOVERNED,docs/adr/**×1). The line is here because the anchor names a file this diff deletes, andcheck-adr-symbol-anchorsreds without it.lint/src/validate-capability-references.seed-row.test.tspins new behaviour that cannot pass onmainbefore this lands, so it rides here rather than in S8-T.1fb1ced362has themetadata/:typecatalog route with?scope=environment. It imports none of the removed exports (SystemObjectName.POSITION/PERMISSION_SET,SysPositionDetailPage,isRowActive); itssys_permission_setstring checks become dead branches, not build breaks.维护者速读(草稿)
改了什么
为什么改
风险与代价(含回滚)
/api/v1/data/sys_permission_set等四个对象接口的客户端会收到 404。changeset 写明了 FROM → TO 迁移:改用/api/v1/meta/permission|position|capability和克隆接口。/meta、克隆门和包门生效。数据门那一半随对象一起消失,统一答 404。docs/adr/**,按路径也属 Tier H,不只是按规模。席位意见
你要做的
docs/adr/**,又超过 3000 行,需要你批准后由席位落地。批准前席位会附上合约复核结论。Generated by Claude Code