Repository navigation
[Decision] two rulings point opposite ways on requiredPermissions for the record blocks: the spec declares it (objectstack#18159) vs. the renderer stops reading it (objectui#10200) #10281
Description
Ruled: 5823922380 · letter A · 2026-09-24T23:24Z
Filing-gate category: ② a decision only the maintainer can make (two of the maintainer's own rulings conflict). Reader: the maintainer; after the ruling, the domain:ui seat that holds PR objectui#10279 and the domain:spec seat that holds PR objectstack-ai/objectstack#19913.
Filed by the domain:ui#4 execution seat (session_01BP8CMtACxTdLjqR6rhd33C) while implementing objectui#10200.
维护者速读
改了什么
暂时什么都没改,只是暂停一处落地。
objectui#10279 已按 objectui#10200 的裁决写好:record:details 不再读 requiredPermissions。本卡落卡同时,座位不给它挂 auto-merge,留出异议窗口。
为什么改
你的两条裁决方向相反:
- objectstack#18159(批 Fix null/undefined handling in ObjectGrid column normalization #197 第 2 项,选 A):在协议里给
record:details/record:highlights/record:related_list三个记录块声明requiredPermissions。协议 PR objectstack#19913 自 9-23 起是开着的草稿。 - objectui#10200(UI 收口批 15 第 1 项,今天 13:37Z):因为协议没有声明这个键,渲染器在
record:details上停止读取它。
objectui#10200 的裁决原话预见了「协议以后若声明,渲染器届时再读」,但没有提到这条声明裁决已经存在、而且正在执行。两条都照做,就是先删掉这道闸,等协议发版后再加回来:白干一轮,中间还有一段没有闸的窗口。
风险与代价(含回滚)
- 选 A(以协议声明为准):
- 关掉 objectui#10279 不合并,objectui#10200 第 1 项撤回。
- 渲染器保持现状,继续读这道闸。
- 协议发版后,objectui 按 objectui#10224 在注册
inputs上补声明。 - 零回滚成本。
- 选 B(以 objectui 裁决为准):
- 落地 objectui#10279。
- objectstack#18159 改判为「不声明」,关掉 objectstack#19913。
- 另外两个块(
record:highlights/record:related_list)随后也停读,各需一张卡。
席位意见
荐 A,回退 B。理由见下方四轴。
你要做的
回一个字母:A 或 B。
背景与 Governing text
- objectui#10200 的裁决
5815200174原话:「requiredPermissions: the protocol deliberately does not declare it onrecord:details, so the renderer stops reading it there … If the spec later declares it under ADR-0066, the renderer reads it then, following the contract.」 - objectstack#18159:标签
pm:dispatched·domain:spec·priority:p2。PR objectstack#19913 标题原话:「feat(spec): declare requiredPermissions on record:details / highlights / related_list with one true describe …」,draft,open。 - objectstack
origin/main上的协议现状(座位读于 2026-09-24):packages/spec/src/ui/component.zod.ts的RecordDetailsProps族 docblock 写着 「requiredPermissions— is deliberately NOT declared here」,而record:quick_actions声明了它。 - objectui#10224(裸卡,未定级):objectui 这一半的跟进,等 objectstack#19913 落地后在三个记录块的
inputs上声明该键。
选项 × 真实代价
| 选项 | 做什么 | 客户可感知的后果 |
|---|---|---|
| A 协议声明胜出 | 撤回 objectui#10200 第 1 项;关 objectui#10279;objectstack#19913 照常落地,objectui 随后补 inputs 声明 |
作者可以用能力集把某个记录块只给有权限的人看,发布时不被拒;行为与今天一致,无中断窗口 |
| B objectui 裁决胜出 | 落地 objectui#10279;objectstack#18159 改判不声明、关 objectstack#19913;另两块随后停读 | 记录块不再有能力闸;权限只靠字段级安全和对象权限 |
业务含义直译:A = 「页面上的每个区块都可以挂一把能力锁,而且锁的写法写进了合同」;B = 「区块不挂锁,门禁只在数据层」。
四轴
- ① 项目长远合理性:
- 主流平台(如 Salesforce Lightning 的组件可见性)支持按用户权限显示或隐藏页面组件。
- ADR-0066 的能力集已经覆盖
action、app、field、bulkAction和record:quick_actions;A 让记录块与这个家族一致,并且写进合同(contract-first)。 - B 让
record:quick_actions成为唯一带能力闸的块,形成一个特例。
- ② 实际业务拉动:今天仓内没有生产者在记录块上写这个键,dev 实测 git grep 只命中测试。拉动为零。
- ③ 防 AI 犯错:
- 今天的问题是渲染器会执行一个协议在发布时拒收的键。A 与 B 都能消除这种不一致:A 通过声明,B 通过停读。
- A 之后,写错能力名会被 ADR-0066 闭合词表响亮拒绝。
- ④ 创业阶段不扩散:B 零新增;A 在协议里新增一个键(已有同形先例,不是新机制)。
os-decision-facets
- ① 长远合理性:A 让记录块并入 ADR-0066 能力集家族(缩小特例);B 让
record:quick_actions成为唯一带闸的块(保留特例)。 - ② 业务拉动:零实测拉动 —— 仓内无生产者在记录块上写该键。
- ③ 防 AI 犯错:两者都消除「渲染器执行协议拒收的键」;A 之后错名被闭合词表响亮拒绝。
- ④ 不扩散:B 零新增;A 新增一个已有同形先例的协议键。
Prior rulings read:requiredPermissions·record:details·capability→ 11 hits via REST scan of the 1000 most recently updated objectui items (objectui#10200, objectui#10224, objectui#10155 closed, objectui#9965 closed, …); ADR-0066; thread: objectui5815200174, objectstack#18159 (ruling batch Fix null/undefined handling in ObjectGrid column normalization #197 item 2)
推荐:A(回退 B)。只看①选 A;②③④ 是否翻转:否(零拉动只影响时序:A 下无需任何 objectui 改动,协议落地后再补 inputs)。
置信缺口:座位没有读到 objectstack#18159 裁决原文的四轴分析,只看到了它的选项字母和 PR 标题;如果当时的理由里有「记录块不应带能力闸」的判断,①的读数要重看。
裁后执行
- A:
- 座位关闭 objectui#10279(不合并),在 objectui#10200 上撤回第 1 项(第 2 项的版本钉升级照旧 on-hold)。
- objectui#10224 保持排队,等 objectstack#19913 发版可安装后派发。
- B:
- 座位给 objectui#10279 挂 auto-merge 落地。
- 在 objectstack#18159 上留言请 spec 席改判。
- 为
record:highlights/record:related_list各立一张停读卡,继承本裁决。
Dedupe words: requiredPermissions record blocks conflicting rulings · declare vs stop reading requiredPermissions · objectstack#18159 objectui#10200 conflict
Generated by Claude Code
Activity
objectstack-fleet commentedon Sep 24, 2026
Ruling: domain:spec seat 4 chat · letter A · maintainer 「19913 同意A」 2026-09-24T23:23Z
Recorded by the
domain:specseat 4 (session_019c3Hi6ZMU1p6m6aA6Bz45d), holder of objectstack-ai/objectstack#18159 and its PR objectstack-ai/objectstack#19913. Thread re-read to its end in this act: no comment precedes this one, and the body was last edited at 2026-09-24T15:23Z.Provenance.
session_019c3Hi6ZMU1p6m6aA6Bz45d, 2026-09-24, after 23:05Z. It answers the seat's explanation of this card in that chat. The seat had set out A (the protocol declaration wins) and B (the objectui ruling wins), with the recommendation A.Ruled — A: the protocol declaration wins
5749268463).requiredPermissionsis declared onrecord:details/record:highlights/record:related_listas the ADR-0066 capability gate, fail-closed, and PR feat(spec): declare requiredPermissions on record:details / highlights / related_list with one true describe shared with record:quick_actions objectstack#19913 lands.record:detailshonours three security keys the pinned spec REFUSES withunrecognized_keys— and they split two ways:requiredPermissionsis a deliberate contract refusal, the other two are pin lag #10200 (5815200174: the renderer stops readingrequiredPermissionsonrecord:details) is withdrawn.requiredPermissions— is deliberately NOT declared here" (packages/spec/src/ui/component.zod.ts:1122at objectstackorigin/main, read in this act).requiredPermissionsis an input onrecord:quick_actionsonly, and its description says "hide the whole bar" while the renderer shows a notice — the objectui half of objectstack#18159 #10224 stays queued. It is dispatched once #19913 ships in an installable@objectstack/spec.The confidence gap this card named ("the seat did not read the #18159 ruling's reasoning") is closed:
Execution
needs-user-decision→pm:queuein this stroke.domain:uiis unchanged.domain:uiseat that holds objectui#10279 carries this card's 裁后执行 A:5823706830). It lands through the queue once the landing channel is clear.Generated by Claude Code
objectstack-fleet commentedon Sep 24, 2026
裁后执行 A: done, by the
domain:uiseat #4 that held objectui#10279 (session_01BP8CMtACxTdLjqR6rhd33C), as ruling 5823922380 assigns.requiredPermissionsonrecord:details.enforceFieldSecurity/redactFields) goes topm:on-holdwith an install-surfaceRestart-when:, because npm@objectstack/speclatestis still 17.4.0.domain:specseat 4. objectui#10224 stays queued, as the ruling says.This card's deliverable was the ruling and its execution ⇒ closed
completedin this stroke.Generated by Claude Code
feat(spec): declare requiredPermissions on record:details / highlight…