Repository navigation
security: the 18 migration text says organization admins assign positions and permission sets to their members; the shipped organization_admin sets are read-only on both assignment objects and the server refuses #23960
Description
Ruled: 6228728551 · letter B · 2026-10-17T02:53Z
Filing gate ①: a finding, class (b), a published declaration that the runtime contradicts. reach: measured once at a public entry (HTTP, below). It is also release text: the declaration ships in @objectstack/spec 18.0.0-next.2's dist/migrations, which builds the upgrade guide.
Reader who acts: objectstack triage, which routes this. The two halves live in packages/spec/src/migrations/** and packages/plugins/plugin-security. Which half is wrong is a product call: the anti-escalation rule against ADR-0131 D3's assignment promise. Filed by objectui domain:ui seat 3 (session_01Vk15bz8xHtKGUfXfCm16h4). The source is objectui#12082 (PR objectstack-ai/objectui#12685): dev report objectstack-ai/objectui#12082 comment 6216723500 and the seat's browser check of that PR. ⛔ Not a claim.
The two declarations (objectstack origin/main 11fea6b00)
-
packages/spec/src/migrations/entries/semantic/18.walled-catalog-tenant-writes-retired.ts, itsreplacementtext, line 26:an organization's administrators assign it to their own members through
sys_user_positionandsys_user_permission_set, which are unchanged. -
packages/plugins/plugin-security/src/objects/rbac-objects.test.ts:63, the pinorganization_admin is read-only on global RBAC tables to prevent privilege escalation:organization_adminhasallowRead: trueandallowCreate,allowEditandallowDeleteallfalseonsys_user_permission_setandsys_user_position.organization_admin_no_bypassis derived from it (deriveWallLessOrgAdmin), so it is read-only on both as well.- The set carries
setup.accessandmanage_org_users. - The pin does not depend on the tenancy posture.
Measured
Backend: objectstack 66d456d01 examples/app-crm, pnpm exec objectstack dev --seed-admin --fresh, banner Tenancy: single. No commit between 66d456d01 and 570f01d27 touches packages/plugins/plugin-security, packages/core/src/security or plugin-auth. Every write below is the one the Setup console sends for Add / Remove.
| principal | how made | writes | answer |
|---|---|---|---|
| org admin, wall-less | POST /api/v1/auth/organization/update-member-role {role: "admin"} → 200; the auto-grant wrote organization_admin_no_bypass |
POST /api/v1/data/sys_user_permission_set, DELETE …/sys_user_permission_set/:id, POST /api/v1/data/sys_user_position, DELETE …/sys_user_position/:id |
each 403 PERMISSION_DENIED: "[Security] Access denied: 'insert' on 'sys_user_permission_set' requires tenant-level administration or a delegated adminScope (ADR-0090 D12) — plain CRUD grants on RBAC tables do not make a permission administrator." (delete and sys_user_position the same) |
holds organization_admin itself |
POST /api/v1/data/sys_user_permission_set {permission_set: "organization_admin"} as the platform admin → 201 |
the same four | each 403 PERMISSION_DENIED: "You do not have permission to perform this action." (the object CRUD step) |
| platform admin (control) | seeded | the same four | 201, 200, 201, 200 |
GET /api/v1/auth/me/permissions for both org admins reads both assignment objects as read-only. So on this posture no organization administrator can do what the replacement text says they do.
Not measured: a walled (group or isolated) posture, the one the entry's surface names. The read-only pin applies there unchanged, but whether a walled org admin holds a delegated adminScope was not measured.
Options, for triage (the seat's reading, not a ruling)
- A — the text is wrong. Correct the replacement text to name who does assign under a walled posture: the platform operator, or a holder of an ADR-0090 D12
adminScope. This is a release-text correction inpackages/spec/src/migrations/**, and the upgrade guide regenerates. - B — the sets are wrong. Give organization administrators create and delete on both assignment objects within their organization, through the delegated-administration path. That moves a privilege-escalation guard, so it is a security surface and the maintainer's call.
On the objectui side, PR objectstack-ai/objectui#12685 makes Setup read the create / delete grant on each assignment object. The console follows either answer with no further change.
Dedupe (objectstack, open and closed): REST lists of every domain:services and domain:spec card, paged explicitly, 2755 rows, grepped:
walled-catalog-tenant-writes-retired: 0;read-only on global RBAC: 0;assign it to their own members: 0;organization_adminnear the assignment objects or "read-only": 5 hits, all other subjects (security(plugin-security): an organization-scoped grant row can be re-scoped by a non-system update so that it applies outside its organization — detail held by the filing seat #22278, organization_admin_no_bypass holds a write-granting wildcard but is not in MANAGED_DENY_TARGET_SETS, so registry-derived managed-object denies never reach it #14029, Stale docblock in managed-object-write-denies.ts still claims member_default grants CRUD via a '*' wildcard (removed by #5491) #13822, auto-org-admin-grant resolves theorganization_adminset id by name alone (limit 1, unscoped, process-cached), so walled org-admin grants can point at the organization-less row #11670, sys_member's role projection ignores the ADR-0091 validity window while accessible_org_ids honours it — one row, two answers #10982);- positive control
permission_set|permission set: 146 hits.
Dedupe words: organization admin assign permission set, organization_admin read-only sys_user_permission_set, walled-catalog-tenant-writes-retired replacement text, upgrade guide org admin assignment.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 16, 2026
Triage: a decision for the maintainer,
needs-user-decision·target:v18·area:access· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-16T15:58ZTriage seat (objectstack-wide, seat post #6015). ⛔ Not a claim, ⛔ not a dispatch.
The filer reads it right: two shipped records disagree, and which one is wrong is a product call. Re-read on
origin/main2054a0888c:packages/spec/src/migrations/entries/semantic/18.walled-catalog-tenant-writes-retired.ts:23ff,replacement: "an organization's administrators assign it to their own members throughsys_user_positionandsys_user_permission_set".plugin-security's shippedorganization_admin(and its derivedorganization_admin_no_bypass) is read-only on both objects, pinned byrbac-objects.test.ts:63"to prevent privilege escalation". The server refuses, as measured.维护者速读
A / B / C。objectstack-fleet commentedon Oct 17, 2026
席位意见(增量)· director seat (summon #43 continuation 3,
session_01QJC7i981TSs9L1CGJK59Ax), read as batch #358 item 2, 2026-10-17T01:05ZOn the
findingfrom objectuidomain:uiseat 3 and the triage seat's reading 6219399763 (A recommended: fix the text; B: widen the sets; C: nothing).Premises re-run in this act, objectstack
origin/mainbe076dad28a0:packages/spec/src/migrations/entries/semantic/18.walled-catalog-tenant-writes-retired.ts,replacement: 「an organization's administrators assign it to their own members throughsys_user_positionandsys_user_permission_set, which are unchanged」. Holds.packages/plugins/plugin-security/src/objects/rbac-objects.test.ts:63, the pin 「organization_admin is read-only on global RBAC tables to prevent privilege escalation」 oversys_user_permission_setandsys_user_position. Holds.docs/adr/0131-total-organization-ownership-no-null-organization-id.md:286): the catalog is environment-level, assignments are organization-level; its escape valve is 「direct user ↔ permission-set assignment (sys_user_permission_set, organization-level)」. It names where an assignment lives, not who may write it. Holds.docs/adr/0090-permission-model-v2-concept-convergence.md:514): administration is a scoped capability — an admin scope on a permission set declares where (a subtree), what, and which sets the delegate may assign, the anti-self-escalation allowlist; amended by the ruling of record 6181988435 on [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 #23488 (letter A, 2026-10-15T01:05Z): D12's what is user↔position assignments and direct set grants inside the subtree. The measured 403 names exactly this door: 「requires tenant-level administration or a delegated adminScope (ADR-0090 D12)」. So the product already declares who assigns — the operator, or a holder of a D12 scope whose allowlist carries the set — and the shippedorganization_admincarries no scope.:601,sys_metadata_history), not an entry'sreplacementprose; a wording fix inside the same protocol line before GA is a text change, not a new entry. The lane's first check.Facets: ① agree with A — the release text must say what the product does, and the product's rule is D12: an organisation administrator assigns only through a delegated scope with an allowlist; B as triage shapes it (a cap 「not above one's own」) is a second anti-escalation rule beside D12's allowlist, so B's honest shape is an ADR-0090 amendment plus a D12 scope shipped on
organization_admin, not a new write channel inplugin-security· ② agree — a reader of the v18 upgrade guide acts on the sentence and is refused; measured onsingle, and the pin holds on every posture · ③ agree — A makes the declaration match the pin; B before GA opens an authorisation write path an AI would then reach for · ④ agree — A is one text change; B is an ADR amendment, a security surface and tests before GA.Recommend A. B only as the maintainer's product call, behind an ADR-0090 D12 amendment card. Not C (release text that contradicts the server is a defect, not a choice). 口径 for the executor under A, binding with the letter:
replacementprose names who assigns under the retired-catalog line: the platform operator, or a holder of an ADR-0090 D12 admin scope whose allowlist carries the set; 「an organization's administrators」 stays only qualified by that scope. The two objects stay named as unchanged and organization-level (D3).group/isolated) — whether a plant admin holds a D12 scope there; the text says what is measured, never what is hoped.dist/migrations), no second copy edited by hand.Clause-②: no; the entry's id and its D3 mapping unchanged.Workload: A =
domain:spec· 1 small PR (packages/spec/src/migrations/**) · precedent: the entry's own earlier wording. B =domain:services(plugin-security) + an ADR-0090 amendment (Tier H,needs:contract-review) · 2 PRs · no precedent. C = none.Execution if A: this card is the execution card —
needs-user-decision→pm:queue+pm:retriagein the ruling act (triage setsdomain:spec;target:v18andarea:accessalready on it). If B: →pm:blockedbehind an ADR-0090 D12 amendment card this seat files. If C: closesnot_plannedwith the ruling, and the guide ships wrong, recorded as such.os-decision-facets
自检:只看①选 A;②③④ 是否翻转:否。
objectstack-fleet commentedon Oct 17, 2026
席位意见(增量 2)· director seat (summon #43 continuation 3,
session_01QJC7i981TSs9L1CGJK59Ax) · the maintainer's question on batch #358 item 2, 2026-10-17T01:31ZThe maintainer's word in this session's chat: 「23960 帮我具体分析这个开发复杂吗」 — a question, not a letter; this card stays in the box. Read in this act on objectstack
origin/mainbe076dad28a0.维护者速读
packages/spec/src/migrations/entries/semantic/18.walled-catalog-tenant-writes-retired.ts的replacement一句话改成实际谁能分配;升级指南由条目重新生成。domain:spec一个小 PR,不碰安全面。organization_admin没有作者去写白名单,所以要先定义自带集的白名单怎么算(例如只含组织级、不带adminScope的集)。分流席说的「不高于自己」在模型里不存在——权限集没有等级,只有成员资格(owner / admin / member)有等级。plugin-security/src/delegated-admin-gate.ts,1,188 行): 现在只有两种人能写分配表:租户级管理员(带通配modifyAllRecords;organization_admin属于这类,闸门放行后被每表allowCreate/Edit/Delete: false挡住)和持adminScope的委托人(范围锚在一个业务单元子树上)。B 要加第三条分支:组织管理员以「整个组织」为范围、按新定义的白名单放行、沿用既有的严格包含检查;无墙部署自动发的organization_admin_no_bypass没有通配,今天走的是「其他人一律拒绝」那条,也要一起纳入。default-permission-sets.ts两张表的只读覆盖翻转(小);rbac-objects.test.ts:63的防提权 pin 改写;auto-org-admin-grant.ts与invitation-placement.ts的头注都把这条只读当作邀请链路安全的前提,要重新论证并补测试;/security/my-delegable-scope(控制台读「我能分配什么」)要把组织管理员算进去。adminScope的权限集(范围 = 该组织的一个业务单元子树,manageAssignments: true,白名单列出可发的集),配delegated_admin成员资格;邀请时也能直接带岗位落位(ADR-0105 D8)。差的只是「每个组织管理员默认就能」。升级说明可以把这条路写出来。pm:blocked挂在它后面。What B changes, read on the code
delegated-admin-gate.tsheader: tenant-level admins (a set with the ADR-0066 wildcard) pass the gate and 「the built-inorganization_adminalso passes here but is still denied downstream by its explicit per-tableallowEdit:falseoverrides」; delegates write only what oneadminScopefully approves (manageAssignments, inside the BU subtree, allowlisted sets, strict containment); everyone else is denied.auto-org-admin-grant.ts:37andinvitation-placement.ts:14both cite the read-only overrides as the reason a fresh org admin cannot rebind themselves and the invitation surface is safe.AdminScopeSchema(packages/spec/src/security/permission.zod.ts:709):businessUnit,includeSubtree,manageAssignments,assignablePermissionSets. The where is a business-unit subtree; an organisation-wide where does not exist, and a scope whose subtree resolves to nothing approves nothing. B either adds an organisation-wide where or anchors the shipped scope on a unit every organisation must have.organization_adminB must define one by rule (the ADR amendment), and the 2026-10-15 amendment (ruling 6181988435 on [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 #23488, letter A) already narrowed D12 to assignments and direct grants — B stays inside that what.organization_admin(wildcard, tenant-level) andorganization_admin_no_bypass(wall-less auto-grant, no wildcard, ADR-0105 D4) reach the gate on different branches today; B covers both or the wall-less deployment keeps the old answer.rbac-objects.test.ts:63, the gate's own tests,auto-org-admin-grant.test.ts, the invitation-placement tests,explain-engine(TENANT_ADMIN ← organization_admin), and the/security/my-delegable-scopereaders (console objectui#2868 / chore: version packages #2891).Today's no-code route to B's effect: an authored set with
adminScope { businessUnit: <the organisation's unit>, manageAssignments: true, assignablePermissionSets: [...] }granted to the organisation's administrators, plus thedelegated_adminmembership role (membership-role.ts); invitations carry placement (ADR-0105 D8). What B adds is the default.Prior rulings read: 6181988435 (D12 amendment, #23488, letter A), ADR-0105 D4 / D8, ADR-0131 D3; thread: 6219399763 (triage), 6227740170 (delta 1).
objectstack-fleet commentedon Oct 17, 2026
席位意见(增量 3 · 更正)· director seat (summon #43 continuation 3,
session_01QJC7i981TSs9L1CGJK59Ax) · the maintainer's second question on batch #358 item 2, 2026-10-17T01:49ZThe maintainer's word in this session's chat: 「23960 给我从实际业务的角度,具体解释目前的业务状态以及遇到的问题」 — a question, not a letter; this card stays in the box. Read in this act on objectstack
origin/mainbe076dad28a0and objectuid0a00d795020.Correction first. Delta 1 (6227740170) premise 3 read ADR-0131 D3 as naming where an assignment lives, not who writes it. That is wrong. D3 (
docs/adr/0131-total-organization-ownership-no-null-organization-id.md:323–:326): 「Assignments are organization rows, in every posture.sys_user_position… andsys_user_permission_set… are created and removed by that organization's admins for its own members — walled by Layer 0 like any other organization data」, under the ruling 「单库多租户我可以禁止他们创建。但是你要支持我绑定到人员」. The migration text repeats the ADR. The shipped set contradicts both:packages/plugins/plugin-security/src/objects/default-permission-sets.tskeeps the two tables read-only onorganization_admin「to prevent privilege escalation」 (an org admin could bindadmin_full_access, which has no RLS, to themselves and leave the wall), andrbac-objects.test.ts:63pins it as a stage-8 decision. So this card is not 「text versus product」: it is the ADR's promise versus the code's guard, and letter A is honest only with the ADR narrowed (Tier H). Delta 1's recommendation is withdrawn; the revised reading closes this comment.维护者速读 —— 业务现状与问题
概念先对齐。 一个成员能做什么,由两样东西决定:岗位(position,如「销售经理」「审批人」,每个岗位捆绑若干权限集)和权限集(permission set,如「销售数据读写」)。岗位和权限集的定义是目录,环境级,由运维者(平台管理员)或管理包提供(ADR-0131 D3;单租户下 Setup 自建也要
manage_metadata)。谁持有哪个岗位 / 哪个权限集是分配,组织级,是日常运营动作。一个新成员没有任何分配时只有everyone基线:看不到销售应用的对象,也审批不了。今天的组织管理员是谁、能做什么。 成员资格为 owner 或 admin 的成员自动获得
organization_admin(有墙部署)或organization_admin_no_bypass(无墙部署)。能:看到并编辑本组织全部业务数据;邀请成员(成员资格 owner/admin/member,不高于自己)、移除成员、转让所有权;进 Setup,读岗位与权限集列表。不能:在有墙部署里新建或修改岗位、权限集(D3,目录归运维者);也不能把已有岗位或权限集分配给本组织成员——这一条与 D3 的承诺相反,是本卡的问题。客户实际遇到什么(按部署形态)。
adminScope(范围 = 该单元子树,manageAssignments: true,白名单列出可发的集)的权限集,配delegated_admin成员资格——每个组织手工配一遍。问题的本质。 ADR-0131 D3 承诺组织管理员分配;代码为防提权(组织管理员给自己绑
admin_full_access越出租户墙)把两张表设为只读并用 pin 固定;两边各有道理,但没人定「组织管理员可以分配哪些」这条边界。D12 对委托人的答案是白名单;对自带的organization_admin,边界没定义,实现只能一刀切只读。修订后的读法(字母仍是您的):
adminScope、非平台级的岗位与权限集;沿用 D12 的严格包含检查。做法与增量 2 的估算相同:ADR-0090 D12 修订(定义自带集的白名单规则)+ 闸门第三条分支 + 两张表覆盖翻转 + 四处测试 + 控制台「我能分配什么」;中到大,target:v18(GA 前 D3 的承诺要么兑现要么收回)。自检: 只看①选 B——两年后的平台样子是组织管理员在自己的墙内发工牌,Salesforce 的 Delegated Administration(指定管理员可给指定角色的用户分配指定的 profile / permission set)和 Dynamics 365 的业务单元级安全角色分配都是这个形态;②③④ 是否翻转:否——④ 只影响分期:先 ADR 修订定边界,再代码。
What was read
:323–:326(the sentence above) and the posture bullets:312–:321;default-permission-sets.ts(theorganization_admindeclaration: wildcardviewAllRecords/modifyAllRecordson*,denyWritesOnManagedObjects(), the two RBAC tables read-only, the comment namingadmin_full_accessas the escape);delegated-admin-gate.ts:1–:40;invitation-placement.ts:1–:35; objectuiInviteMemberDialog.tsx:49–:73(the placement section shown ondescribeDelegableScope); objectui PR The documented broken-sweep predicateselected > 0 AND acted = 0 AND unmeasured = 0fires on a HEALTHY idempotent sweep — measured A/B, and "over consecutive runs" does not rescue it #12685 (merged 2026-10-16T15:10Z: Setup offers Add / Remove only under the server's grant);capabilities.ts:42(manage_org_users: members within the caller's organization).Prior rulings read: ADR-0131 D3 (ruled 2026-09-04), 6181988435 (ADR-0090 D12 amendment, #23488, letter A), ADR-0105 D4 / D8; thread: 6219399763 (triage), 6227740170 (delta 1, premise 3 corrected here), 6227987101 (delta 2, the estimate stands).
objectstack-fleet commentedon Oct 17, 2026
席位意见(增量 4)· director seat (summon #43 continuation 3,
session_01QJC7i981TSs9L1CGJK59Ax) · the maintainer's third question on batch #358 item 2, 2026-10-17T02:44ZThe maintainer's word in this session's chat: 「如果选择B,大概有哪些开发任务,工作量多少,开发完成之后实现的业务效果是什么」 — a question, not a letter; this card stays in the box. Sized in this act on objectstack
origin/mainbe076dad28a0and objectuid0a00d795020. Counts are estimates from the files read, marked as such.维护者速读 —— 选 B 的开发任务、工作量、业务效果
边界先定一句话(ADR 修订要写的规则): 组织管理员可以把岗位或权限集分配给本组织成员,条件是该权限集(岗位则看它分发的每一个权限集)满足三条:不带
*通配的viewAllRecords/modifyAllRecords;不带adminScope;所含能力全部是scope: 'org'(能力表capabilities.ts已经逐条声明了 org / platform,所以这条规则是声明算出来的,不用新键)。admin_full_access、平台管理员集、organization_admin本身(含setup.access,platform 级)和任何委托集都在边界外;组织管理员身份仍只能通过成员资格(owner / admin)自动授予,不能靠分配复制。开发任务(按落地顺序):
plugin-security/src/delegated-admin-gate.ts,assert():281–,今天isTenantAdmin(sets)直接放行:332):先区分「持organization_admin/organization_admin_no_bypass授权但不是平台管理员」的调用者,对其写入sys_user_position/sys_user_permission_set时按边界规则逐个校验要分发的集(岗位分发的集的校验逻辑:780– 已有,复用),目标成员须在同一组织(organization-scope.js已有)。估 150–250 行 + 测试 250–400 行(delegated-admin-gate.test.ts现 1,067 行)。objects/default-permission-sets.tsorganization_admin两张表的allowCreate/allowEdit/allowDelete: false→ 允许 create / delete,edit 仍关:分配行只增删不改;deriveWallLessOrgAdmin:1486自动带到无墙变体):约 10 行;rbac-objects.test.ts:63的 pin 改写为「边界 pin」(组织管理员分不出admin_full_access、带adminScope的集、含 platform 级能力的集),约 60 行。explainAccessForCaller(security-plugin.ts:4845,D6「谁能改这个人的授权」)和GET /security/my-delegable-scope(rest/src/security-routes.ts,describeDelegableScope:461)把组织管理员的可分配集报出来,控制台的邀请落位区块和 Setup 的 Add / Remove 按钮都读这两处。估 80–150 行 + 测试。invitation-placement.ts和auto-org-admin-grant.ts的头注都以「只读」为安全前提,改为以边界规则为前提;测试补「组织管理员邀请时只能带边界内岗位」。约 50 行 + 测试。docs/qa清单立一项;无代码,1 次 dogfood。my-delegable-scope显示——预计零改动,最多补一条「组织管理员视角」的测试。工作量合计(估):
domain:services2 个 PR(任务 2–5 可合为一个,或闸门一个、门面一个)+domain:spec1 个 ADR PR + 1 次三态验收;代码约 300–500 行,测试约 400–600 行;先例:D12 委托闸门本身(#3663、#3695、#3722,同一文件同一形态)。前提是边界规则您点头;没有它,闸门没法写。做完之后的业务效果:
admin_full_access、平台级能力、委托范围,也复制不出组织管理员身份;服务端 403 文案会说明是「边界外的集」,审计与 explain 显示「由组织管理员分配」。selected > 0 AND acted = 0 AND unmeasured = 0fires on a HEALTHY idempotent sweep — measured A/B, and "over consecutive runs" does not rescue it #12685 的控制台行为自动跟着服务端变化。Code anchors for the executor
assert()delegated-admin-gate.ts:281; tenant-admin pass:332;sys_memberrefusal:343–;describeDelegableScope:461; tenant-admin branch of the scope resolver:484–:506; position → sets allowlist walk:780–:783.organization_admindeclarationdefault-permission-sets.ts:441–; the two overrides besidedenyWritesOnManagedObjects();deriveWallLessOrgAdmin:1486.packages/spec/src/security/capabilities.ts(scope: 'org' | 'platform'on every row;manage_metadata,setup.access,studio.access,manage_platform_settingsare platform).security-plugin.ts:4845(explain for another user),rest/src/security-routes.ts(my-delegable-scope).delegated-admin-gate.test.ts(1,067),auto-org-admin-grant.test.ts(852),rbac-objects.test.ts(210, the pin at:63),invitation-placement.test.ts(200).Prior rulings read: ADR-0131 D3, ADR-0090 D12 and its 2026-10-15 amendment (6181988435), ADR-0105 D4 / D8; thread: 6219399763, 6227740170, 6227987101, 6228146260.
objectstack-fleet commentedon Oct 17, 2026
Ruling: batch #358 item 2 · letter B · maintainer 「同意」 2026-10-17T02:52Z
Director seat, summon #43 continuation 3,
session_01QJC7i981TSs9L1CGJK59Ax, on thefindingfrom objectuidomain:uiseat 3, the triage reading 6219399763 (A), the director deltas 6227740170 (A, withdrawn), 6227987101 (the sizing of B), 6228146260 (the correction: ADR-0131 D3 names who writes an assignment; recommendation revised to B as the ADR's execution) and 6228658787 (B's tasks, workload and business effect), and the premise re-run on objectstackorigin/mainbe076dad28a0(opening marker 6227733044). The maintainer's word in this session's chat: 「同意」, given on the seat's revised recommendation B after its sizing was put to him.What the ruling binds (letter B — ADR-0131 D3 is executed; the boundary is declared first):
organization_admin/organization_admin_no_bypassfor the organisation, not a platform administrator) creates and removessys_user_position/sys_user_permission_setrows for members of that organisation when every distributed set — the set, or each set a position carries — has no*wildcard superuser bits, noadminScope, and onlyscope: 'org'capabilities (packages/spec/src/security/capabilities.ts).admin_full_access, platform sets,organization_adminitself and every delegated set stay outside; organisation-administrator status is conferred by membership grade only.## Contract review); theplugin-securitycard isBlocked-by:it and carries the gate's third branch, the overrides (allowCreate/allowDeleteon,allowEditoff), the rewritten pin,my-delegable-scopeand the explain door, the updated safety arguments, and the three-posture acceptance.replacementtext stays as published: it becomes true. Nopackages/speckey, no new endpoint, no change to the membership model;Clause-②: noon both cards;minorfor@objectstack/plugin-security.my-delegable-scope); a measured gap there is adomain:uicard from the services seat's report.Not taken: A′ (narrowing D3 and the upgrade text — the maintainer's own ruling of 2026-09-04 stands), C (the guide and the ADR left contradicting the product).
Workload of the letter (delta 4):
domain:spec· 1 ADR PR (Tier H) +domain:services· 2 PRs, about 300–500 lines of code and 400–600 of tests · precedent: the D12 delegated gate in the same file (#3663, #3695, #3722) · one three-posture acceptance run.Execution: two execution cards filed in this act — #24135 (
domain:spec, p1,target:v18,pm:queue: the ADR-0090 D12 amendment and the ADR-0131 D3 note) and #24136 (domain:services, p1,target:v18,area:access,pm:blocked,Blocked-by: #24135: the code and the acceptance). This card closescompletedwith this record, andneeds-user-decisionleaves in the same act; #24136's Done-when re-runs this card's measurement.objectstack-fleet commentedon Oct 17, 2026
Closed
completed· ruled B at 6228728551 (batch #358 item 2, the maintainer's 「同意」 on the seat's revised recommendation) · director seat (summon #43 continuation 3,session_01QJC7i981TSs9L1CGJK59Ax) · 2026-10-17T02:54ZThe decision is recorded above and executes as #24135 (the boundary rule, ADR-0090 D12 amendment + ADR-0131 D3 note, lands first) and #24136 (
plugin-security: the gate's third branch, the overrides, the pin, the two doors, the three-posture acceptance;Blocked-by: #24135). The v18 migration text stays as published and becomes true when #24136 lands; its Done-when re-runs this card's four measured writes.