Repository navigation
feat(plugin-security,platform-objects): grant forms pick a position or permission set by name from the catalog (#15204 B2) - #22939
Conversation
…r permission set by name from the catalog (#15204 B2) The user page's related-list add pickers listed sys_position / sys_permission_set rows, which a deployment need not hold (ADR-0131 D3/D4). Removed; New opens the grant form, whose name field declares widget position-ref / permission-ref. The legacy permission_set_id lookup is hidden from the forms. Remove is the host's row delete, measured independent of add. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013XKtmoR5QCUSTMjiQ3os49
…e grant lists' add labels left (#15204 B2) Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013XKtmoR5QCUSTMjiQ3os49
📓 Docs Drift CheckThis PR changes 3 package(s): 11 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
⛔ 10 release-owned page(s) also name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 41 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin c6d4c0b294bba6e9748fc057aa9341c1ca3f46dc && git checkout c6d4c0b294bba6e9748fc057aa9341c1ca3f46dc
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 51b43a8dc45fef9d86229509ab6b2679ffa9d501 7de0f00c91aaaecd2d70ba59695d373baa290bf1 && git checkout -B drift-repro 51b43a8dc45fef9d86229509ab6b2679ffa9d501 && git merge --no-ff 7de0f00c91aaaecd2d70ba59695d373baa290bf1
node scripts/docs-audit/affected-docs.mjs --json 51b43a8dc45fef9d86229509ab6b2679ffa9d501
|
…, PR-5: position-ref / permission-ref), and re-measure the spec's pin citations Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013XKtmoR5QCUSTMjiQ3os49
This reverts commit e486abb. .objectui-sha is #22874's single-writer path, and objectui from e5311165 on reads allowEnvironmentOverlay only, which main's server sends once #22874 lands. The pin move returns as its own PR after #22874. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013XKtmoR5QCUSTMjiQ3os49
Seat ACCEPT: #22939 (#22865 B2 phase 2: grant name pickers on the user page) at
|
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 38208298792 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 分类: 失败的 job(日志抽取,best effort):
跨 PR 相同签名(24h,按失败测试文件聚合):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
|
Seat note: dequeued on one suite-duration ceiling, in a package this PR does not touch; re-queued once · epic PM What red: queue build 38208298792, Why it is not this PR's:
No fix exists yet. The seat spends this PR's one re-run as one re-queue on the unchanged head Generated by Claude Code |
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 38208631030 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 分类: 失败的 job(日志抽取,best effort):
跨 PR 相同签名(24h,按失败测试文件聚合):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
|
Seat note: re-queued behind W2, whose queue group carries #22949's fix · epic PM This PR left the queue on the suite-duration ceiling step (
Re-queued on the unchanged head Generated by Claude Code |
Part of #15204
Clause-②: no
B2, objectstack half (objectui#7611 names it). Setup's user page grants a position or a permission set by picking its NAME from the security catalog, instead of an
addpicker that listedsys_position/sys_permission_setrows (ADR-0131 D3/D4). This PR is one of the pair that gates #22900 (the boot stops writingsys_permission_setrows): once #22900 lands, a fresh database holds no such row, and the old pickers would offer nothing.What changes
sys-user.page.tsPositions / Permission Sets listsaddpickers oversys_position/sys_permission_setrows, beside Newaddblocks are deleted. New opens the grant form. Remove is the host's row delete (RelatedRecordActionsBridge), unchanged. The Business Units list keeps itsaddsys_user_position.positiontext)widget: 'position-ref': the form listsGET /api/v1/meta/positionand stores the chosen namesys_user_permission_set.permission_setwidget: 'permission-ref': the form listsGET /api/v1/meta/permissionand stores the chosen namesys_user_permission_set.permission_set_id("Permission Set (legacy id)")hidden: true, so it is off the create and edit forms (maintainer, 2026-10-12, 「legacy id 字段隐藏,同意」). The column stays until ADR-0131 C7b drops its dataUntil the console pin moves, the two fields render as text inputs (the type renderer: a text box for the name).
position-ref/permission-refship in objectui#12175 (PR-5, merged as088e0f705520), and this repo's.objectui-shastill pins4997995022f8. An unregistered widget falls back to thetextrenderer, so nothing breaks. The pin follows #22874:.objectui-shais that PR's single-writer path, and objectui frome5311165on readsallowEnvironmentOverlayonly, whichmain's server sends once #22874 lands. A follow-up PR then moves the pin to088e0f705(or later), re-measuring only that hop.mainis unreleased, so no released build shows the gap.This branch briefly carried that pin move (
e486abb9c), reverted by7de0f00c9. The net diff is phase 2 only: 9 files, tree-identical tod4c22c8fe.Measured before the build (phase 1, #15204 6116275825)
On a booted showcase, as the admin:
addblocks deleted, every row still offers Delete, and a delete was exercised end to end (UI 4 → 3 rows; the API shows the row gone).The renderer's
onRowDeleteprefers the host'sonDelete; theadd-based remove is only its fallback when no host bridge is mounted.Pins
packages/qa/dogfood/test/grant-name-pickers.dogfood.test.tsreads the SERVEDGET /meta/object/<name>on a booted showcase:positioncarriesposition-ref;permission_setcarriespermission-ref;permission_set_idishidden, withpermission_setnot hidden as the control.hiddenfrom the objects, then rebuilding, turned all 3 cases red (expected undefined to be 'position-ref', …); restoring turned them green.sys-user-permission-set-window-columns.test.tsasserts that neither grant list carriesadd, with the Business Units list'saddas the control. Ablation: re-adding anaddto the Permission Sets list turned that case red.format.server-ready-dev-admin-audience.test.ts: the CLI banner's "grant it a permission set" pin is re-anchored on the Permission Sets list (its New), since the "Grant permission set" label is gone.platform-page-i18n-parity.test.ts: the anti-vacuity floor of inline locale maps is 44 (was 45), because the twoaddlabels went with their blocks.Browser check against the widget (objectui#12175 head
8237a1cd886d, built locally before it merged; the merge088e0f705520carries the same widget files)registry-ref-position/registry-ref-permission), listing 16 positions and 17 permission sets.auditorandmcp_agent_data_read, then pressing Create, wrote both grant rows (verified through the data API).Verification (local, at this head)
platform-page-i18n-parity27/27);dispatch-gates --ran: 72 derived families, all recorded with exit 0.Changeset
@objectstack/platform-objectsand@objectstack/plugin-securitypatch,Clause-②: no. This changes shipped metadata only; no key anyone authors moves.Acceptance notes
position-refpicker lists theeveryoneaudience anchor among positions, and the server refuses it as a grant target. Not filtered here.🤖 Generated with Claude Code
https://claude.ai/code/session_013XKtmoR5QCUSTMjiQ3os49