Repository navigation
Studio: retire the permission set's two delegated-admin switches (manageBindings, authorEnvironmentSets) that objectstack#23488 retires from the spec #12406
Description
Filing gate ③ the maintainer's ruling, on objectstack-ai/objectstack#23488 (6181988435; the maintainer said 「同意」 to letter A). Item 4, verbatim: "objectui: Studio's two switches, the help strings, the i18n keys and the pin test retire in an objectui p1 follow-up on objectui#12334, landed before or with the .objectui-sha move that carries the tombstoned type."
- Filed by:
domain:specseat 2 ([PM seat] domain:spec · seat 2 — 🟢 os-bill · session_01LFqdRsuM5nkqoJdHd5ztVk · p1/p2 only (maintainer) objectstack#18549) ·os-bill· sessionsession_01LFqdRsuM5nkqoJdHd5ztVk, at the claim of [finding] AdminScope.manageBindings and authorEnvironmentSets are honoured by no write path after C3; the ADR-0090 D9/D12 junction gates are unmeasured; permissions docs describe removed gates objectstack#23488 (6182195274). ⛔ Not a claim. - Grade and lane are triage's. Triage's entry on the spec card (
6173885890) read it as p1: without it, Studio keeps writing a key the protocol refuses.
Reader who acts: the objectui domain:ui seat, in one PR, once an @objectstack/spec release that carries the two tombstones is installable here. That is the cross-repo unlock criterion, not the merge of the upstream PR.
Landing (read on objectui origin/main dbc8c1169)
packages/app-shell/src/views/metadata-admin/PermissionAdvancedFacets.tsx:662-663: the two switch rows. The docblock at:49names the keys.packages/app-shell/src/views/metadata-admin/i18n.ts:2475-2476and:5764-5765: the four strings.packages/app-shell/src/views/metadata-admin/PermissionAdvancedFacets.adminScopeAnchor.test.tsx:110-111: the pin.docs/adr/0056-permission-editing-studio.md:142also names the keys. It is governed text, so it is out of this card unless the seat decides otherwise.
Done
Studio offers neither switch and writes neither key. manageAssignments stays as the control.
Dedupe
Two semantic search_issues queries in objectui, all states:
- "Studio permission set adminScope manageBindings authorEnvironmentSets switches retire delegated admin": 0 hits.
- The control, "permission set editor Studio delegated administration scope facets": 5 hits (metadata-admin: register a
ref-multi:permissionwidget (multi-pick declared permission sets by name) so the position form'spermissionSetsrow can bind the registry (objectstack#22682 item 3, ADR-0131 D4) #12126, Studio: package-declared permission sets render locked, with Clone-to-customize as the only edit path (UI half of objectstack#11513) #5987, PermissionMatrixEditor does not model the artifact-backed write tier that ResourceEditPage does — an env-scope edit of a code-declared permission set can offer Save and get 403 #4518, Epic: Permission sets — Studio designs every facet, Setup assigns users (ADR-0056) #2398, feat(app-shell): CEL authoring safety for RLS policies — lint, field autocomplete, test-run #2413). None of them is about these switches.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 15, 2026
Triage: first grade ·
enhancement·priority:p1+target:v18·domain:ui·area:studio· stayspm:blocked· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-15T01:59ZRead fresh. Ruling A on objectstack-ai/objectstack#23488 (
6181988435) retiresAdminScope.manageBindingsandauthorEnvironmentSets. Its item 4 puts Studio's two switches, their strings, the i18n keys and the pin into an objectui p1 follow-up on #12334.priority:p1under the consumer-follow-up rule: without it, Studio keeps writing two keys the protocol now refuses.target:v18: listed on release(v18): objectui's first 18.x release — the syncmajor, Changesets pre mode onnext, and the two gate edits (the maintainer's ruling on #12030), after #12030 lands #12334.domain:ui(PermissionAdvancedFacets.tsx,i18n.ts, the anchor pin). ADR-0056's line stays out unless the seat decides otherwise, as the card says.pm:blocked. The unlock is an@objectstack/specnextrelease carrying the two tombstones that objectui resolves, not the upstream merge.Blocked-by: objectstack-ai/objectstack#23488is in the body.next, together with the p3 question already asked there.objectstack-fleet commentedon Oct 16, 2026
State:
pm:blocked→pm:on-hold·domain:uiseat 1 ·session_01JZnppgHRp4sREcouhkQYDB· 2026-10-16T01:46ZThis is the seat's unlock scan on its routine fire. The upstream closed, but the fix is not installable here yet. Per the cross-repo unlock rule (SKILL.md 〈状态模型〉, 「未发版 ⇒ 转
pm:on-hold+Restart-when:」), the card moves to on-hold. ⛔ It does not go back topm:queue.completedat 2026-10-15T05:33Z.@objectstack/specdist-tagnextis18.0.0-next.1, published at 2026-10-14T12:08Z, before that close.main7b5e55893b'spnpm-lock.yamlresolves@objectstack/spec@18.0.0-next.1.@objectstack/*bump card pastnext.1(objectui#12370, thenext.1bump, is closed). The next bump card's author reads this line.Restart-when: objectui
main'spnpm-lock.yamlresolves an@objectstack/specrelease later than18.0.0-next.1whoseAdminScoperefusesmanageBindingsandauthorEnvironmentSets(the two tombstones of objectstack-ai/objectstack#23488)Dispatch shape on wake (
domain:ui, S,mode:subagent,Clause-②: no):PermissionAdvancedFacets.tsxretire, with their help strings, their four i18n entries inmetadata-admin/i18n.ts, and the anchor pinPermissionAdvancedFacets.adminScopeAnchor.test.tsx. Re-read every location on themainof that day; the body's line numbers are fromdbc8c1169.docs/adr/**is governed). If the seat folds it in, the PR is Tier H.AdminScoperefuses both keys.Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
Unlock:
pm:on-hold→pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-16T04:03ZBlocked-by: objectstack-ai/objectstack#23488(closed 2026-10-15T05:33Z) needed an installable@objectstack/spec. npm@objectstack/spec@nextis18.0.0-next.2(published 2026-10-16T03:11Z, built frome5136ff10f, which carries it), read in this act.^18.0.0-next.1resolves18.0.0-next.2.⛔ Not a claim.
objectstack-fleet commentedon Oct 16, 2026
Back to
pm:blocked, now on #12629 (thenext.2bump) · correcting this seat's R433 unlock · triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-16T06:55Zpm:queueon the npm publish of@objectstack/spec@18.0.0-next.2. But objectuimain'spnpm-lock.yamlstill resolves18.0.0-next.1, so this card cannot land green until the lockfile moves.domain:ui,pm:queue). The body now starts withBlocked-by: #12629.AdminScoperefusal of the two keys is then in the installed spec.⛔ Not a claim.
objectstack-fleet commentedon Oct 16, 2026
Blocked-by:re-pointed: #12629 (closed, a duplicate) → #12626, thenext.2bump in flight · triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-16T07:54Z6208172639,pm:dispatched). deps(v18): move objectui's @objectstack/* from 18.0.0-next.1 to 18.0.0-next.2 and follow its contract — the bump objectui#12406, #12592, #12486 and #12285 wait on #12629 closes as its duplicate.18.0.0-next.2.⛔ Not a claim.
objectstack-fleet commentedon Oct 16, 2026
Claim: PM loop round 3 (
priority:p1; item 4 of the maintainer's letter A on objectstack-ai/objectstack#23488), unlocked in this claim: both body blockers are closed (objectui#12626 landed asmainf62b6ff4e1; objectstack-ai/objectstack#23488 closedcompleted), and no new blocker is derived:maininstalls@objectstack/spec@18.0.0-next.2, whoseAdminScopeSchemarefuses both keys (measured in #12626's landing commit message)Session:
session_011K9g23W67dy2zwnyzaoB6oAccount:
os-teslaBranch:
claude/issue-12406-retire-admin-switchesWorktree:
objectui-issue-12406Domain:
domain:uiSeat:
domain:ui#1File surface:
packages/app-shell/src/views/metadata-admin/PermissionAdvancedFacets.tsx(the two switch rows, its docblock at:49, and any save path that would still send either key),packages/app-shell/src/views/metadata-admin/i18n.ts(the fourperm.admin.manageBindings/perm.admin.authorEnvironmentSetsstrings),PermissionAdvancedFacets.adminScopeAnchor.test.tsxand new tests beside, and one.changeset/12406-*.md(stop on breach; explain in the report). Outside:docs/adr/0056-permission-editing-studio.md:142(governed text; reported, not edited) and any objectstack file.Container & model:
S,mode:subagent,model: opus(default tier, not the floor: whether a stored permission set that already carries either key is cleaned on save is a judgment call;dispatch-gates --tier --repo objectstack-ai/objectuiover the 4 planned paths: no path-derived mandate)Clause-②: no
Clause-② reason: neither
PermissionAdvancedFacetsnor the metadata-admin dictionary is exported from@object-ui/app-shell's entry, and the change removes what Studio writes to match a key the spec already refuses. No published type, prop, export or pack key changes.Responsibility: n/a — not a defect card
Thread-read: 6210817094
Serial constraints cleared: read at objectui
mainf62b6ff4e1. No open PR or in-flight claim namesmetadata-admin/PermissionAdvancedFacets*ormetadata-admin/i18n.ts. This seat's in-flight objectui#12642 and #12489 editpackages/fields,plugin-detailandrecord-preview, all disjoint.Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
os-dev-report
{ "issue": 12406, "status": "done", "branch": "claude/issue-12406-retire-admin-switches", "pr": "https://github.com/objectstack-ai/objectui/pull/12659", "session": "session_011K9g23W67dy2zwnyzaoB6o — the dispatching seat's id (mode:subagent runs inside it)", "premise_still_valid": true, "summary": "Studio's Delegated Admin Scope facet no longer draws the Manage bindings and Author env sets switches. Their four i18n strings (perm.admin.manageBindings / perm.admin.authorEnvironmentSets, English and Chinese) are gone, and perm.admin.help no longer offers to 'manage bindings' in either language. That help text is the ruling's 'help strings': same file, and named here because the claim's parenthetical listed only the four strings. Manage assignments stays and now writes its key by name, setScopeDetail({ manageAssignments: !!v }), with no cast. The cast was the only reason the old tuple-list write compiled against next.2's tombstone type (H4). H1 and H2 held. H3 measured: the facet round-trips the stored scope verbatim, and the host's whole-record Save sends draft.adminScope untouched. But the objectstack server (read at 0af559e) serves overlay and draft rows through convertStoredItem and applyConversionsToStoredItem, which drop both keys before Studio sees them. That strip was measured here with the installed spec. Decision B, on the four axes: Studio strips neither key. The strip has no input on an 18 server, it would be a second client-side copy of the spec's D2 retirement list, it would replace a loud 422 with silent client tolerance, and it adds code with no pull. The RLS priority precedent differs, because Studio itself seeded that key. Draft PR #12659 is assigned to os-tesla and carries Fixes #12406 and Clause-②: no. The worktree was removed after the push was confirmed (local head equals remote head 165e820). Commits carry the model-free trailer pair per AGENTS.md, which takes precedence over the harness's model-named attribution reminder.", "tests": "All on head 165e820 (the final commit); exit codes captured before any pipe. (1) pnpm exec vitest run packages/app-shell/src/views/metadata-admin/ under os-verify-lock: VERDICT command-exit 0, 'Test Files 509 passed (509)', 'Tests 5742 passed | 1 skipped (5743)'; it held the lock 940s on a shared box, the dispatch-prescribed scope. (2) New describe 'PermissionAdvancedFacets · the retired delegated-admin keys (objectui#12406)', 3 cases: a CONTROL that the installed spec refuses each key at its own path, false included; the facet draws exactly the includeSubtree and manageAssignments switches; flipping every switch it draws writes a scope the spec accepts, with neither retired key. The old 'three manage-* switches are inert' case now covers manageAssignments only. (3) Ablation, wrap mode, objectstack scripts/ablation-replace.mjs: the two retired rows were restored exactly as on main (tuple list plus cast). The run read 'Tests 2 failed | 10 passed (12)', with both new pins red: 'expected [ perm.admin.includeSubtree, …(3) ] to deeply equal [ …(1) ]' and 'expected [ manageBindings, …(1) ] to deeply equal []'. Restore was proven: blob after restore 9636eb58469d equals blob at HEAD, and git diff HEAD is empty. The test imports the component from source, so no build is needed. (4) Type reverse check (H4): setScopeDetail({ manageBindings: !!v }) was written at the switch, and tsc --noEmit gave exit 2 with TS2322 'Type boolean is not assignable to type' the '[REMOVED] Key retired' mark. Restored the same way, blob == HEAD. (5) Probes, not committed: node against @objectstack/spec 18.0.0-next.2 showed AdminScopeSchema refusing manageBindings and authorEnvironmentSets with invalid_type at each key, for true and false, while the control scope with the live keys parsed. applyConversionsToStoredItem('permission', …) turned the stored scope into {businessUnit, manageAssignments} with 2 notices from permission-admin-scope-binding-authoring-removed. A throwaway facet mount showed one Include-subtree flip keeping manageBindings:true and authorEnvironmentSets:false in the written scope. The probe file was deleted before the commit.", "gates": "Local, all exit 0 on 165e820: turbo build --filter='@object-ui/app-shell^...' --concurrency=2 ('Tasks: 28 successful, 28 total', lock 200s); pnpm --filter @object-ui/app-shell type-check (echoes 'tsc --noEmit && tsc -p tsconfig.test.json'; tsconfig.test.json includes src/**/*.test.tsx); pnpm check:changeset-claims; pnpm changeset:check; pnpm check:test-path-roots; pnpm check:spec-symbols; node scripts/check-changeset-presence.mjs ('3 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)'); pnpm check:new-line-citations ('0 new citation(s)'); check-governed-queue-guard --test over the 4 paths ('NOT GOVERNED'); eslint on the 3 changed source files (0 errors, 3 warnings, all on lines this diff does not touch). objectui has no dispatch-gates --ran reconciliation; the list was hand-derived from the dispatch. The repo-wide lint and the whole app-shell suite are left to CI. PR check-runs at report time (35 total): completed success = Build Docs, Changeset Bump Policy, Changeset Fixed Group Check, label; completed skipped = Test (coverage), the Test (coverage shard) matrix, dependabot; in_progress = Build & E2E, Bundle Analysis, Changeset Claim Re-read, Changeset Declaration, Changeset Overwrite Report, Governed Surface Queue Guard, Line Citation Gate, Lint, Live E2E (informational), Repo Gates, Test (dist pins), Test (shard 1/16 to 16/16), Type Check. NOT MEASURED for the in_progress families, because CI convergence belongs to the seat. Note: os-verify-lock printed its long-holder warning for the 940s metadata-admin directory run. That run is the dispatch's prescribed scope, not a one-off.", "mcp_calls": "0 — no MCP GitHub tool used", "api_writes": "2 — two POST /repos/objectstack-ai/objectstack/dispatches (fleet-write relay, executed as objectstack-fleet[bot]): stroke 1 = pr_create, which became POST /repos/objectstack-ai/objectui/pulls (draft) + POST /repos/objectstack-ai/objectui/issues/12659/assignees (os-tesla); stroke 2 = comment, which became POST /repos/objectstack-ai/objectui/issues/12406/comments (this report). git push (2) is not REST. Zero label writes: the dispatch named no labels, and labeler.yml applied 'tests' and 'package: app-shell'.", "open_questions": [], "out_of_scope_findings": [ "carrier: none (承接者:无) · noted, not filed — docs/adr/0056-permission-editing-studio.md, the AdminScopeSchema bullet ('the exact target shape for the admin_scope editor'), still lists manageBindings and authorEnvironmentSets. It is governed text (docs/adr/**, Tier H if edited), so it is not edited here. The ruling's item 5 Tier H docs PR covers ADR-0090 and ADR-0086 in objectstack, not this objectui ADR. In PR #12659's Acceptance notes · dedupe words: ADR-0056 AdminScopeSchema manageBindings authorEnvironmentSets retired", "carrier: none (承接者:无) · noted, not filed — packages/app-shell/src/__tests__/spec-symbol-parity.test.ts has a comment, '…and the other five are defaulted', and two of those five are now tombstones. It is a comment only, the assertions still hold, and the file is outside this card's surface. In PR #12659's Acceptance notes." ] }Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
ACCEPT → PR #12659 comment 6215739642 ·
Clause-②: no(no contract review owed) ·domain:uiseat 1 ·session_011K9g23W67dy2zwnyzaoB6o· 2026-10-16T12:42ZGenerated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
Landed ·
domain:uiseat 1 ·session_011K9g23W67dy2zwnyzaoB6o· 2026-10-16T12:57Zmaina98a23c787, with one parent,f78efdd1e3. It is an ancestor oforigin/main.165e82050d, line for line: 4 files, +115/−38. Positive control at the merge commit:perm.admin.manageBindingshas 0 hits inmetadata-admin/i18n.ts, andPermissionAdvancedFacets.tsxnamesmanageBindingsonly in the docblock that records its retirement.completedbyFixes #12406. This note precedes the strip ofpm:dispatched.Generated by Claude Code