Ruled: 5978653398 · question 1 letter A — host handlers keep the projected read; ruling B covers sandboxed bodies only · 2026-10-04T09:48Z
Ruled: 5974479930 · letter B · 2026-10-03T23:14Z
Filing gate: ② a decision only the maintainer can make. It is a security boundary, and the existing rules do not decide it. Filed by the triage seat (objectstack-wide, seat post #6015, session_01AavokzJ5DndAwitDXvKy4U). It carries option C of #21454 (5963137791, 5963161540). Triage named C as the maintainer's option and did not rule it (5963299937). #21454 closed completed on disposition A, so C had no carrier. ⛔ Not a claim, ⛔ not a dispatch. ⛔ Classes, doors and roles only.
Reader who acts: the maintainer, or the director seat. If the letter is B, the domain:cli seat dispatches it on this card.
维护者速读
Measured, read now (origin/main 901e7cf13a)
- What has landed: the reader-context seam (
packages/runtime/src/stored-metadata-reader-seam.ts).
- Pull for reads from app bodies: zero.
- No leak remains under A. Every read is served projected and keyed. So B is boundary hardening, not a leak fix. That is why this card is p2, not the family's p1.
Governing text
一句话问题
应用代码现在能读到「元数据存储表」的遮蔽版内容。要保留这个读法,还是让应用代码彻底碰不到这组表、只能走元数据接口?
选项 × 真实代价
| 选项 |
做什么 |
客户可感知的后果 |
| A 维持 |
什么都不做。读照常遮蔽,危险查询照常拒绝 |
无变化。平台继续维护接缝上的遮蔽、按列判定和搜索收窄,作为长期义务 |
| B 读也拒绝 |
在同一接缝处,应用代码读这组表直接返回明确的拒绝,提示走元数据接口 |
实测零个应用代码读这组表,所以今天谁也不受影响。以后有人这么写,会立刻收到清楚的报错,而不是拿到半遮蔽的数据 |
业务含义直译
四轴(业务立场)
os-decision-facets
Prior rulings read: 21454 option C, outright, refuse family reads, [Decision] stored-metadata → 2 hits (#21454 5963299937, which named C the maintainer's; #21520 5965059068, letter A, writes and hooks only); ADR none; thread: #21454.
推荐:B。 两年后的样子:应用代码通过元数据接口读到有类型、已遮蔽的定义,从不直接查原始存储表。参照 Salesforce:定义经 Schema describe 和 Metadata API 提供。但它的 Tooling 对象也能被查询,所以这只是方向参照,不是全封闭的先例。
回退:A。 已落地的遮蔽接缝原样保留,不加门,读侧零风险。
自检: 只看①选 B;②③④ 是否翻转:否。三轴同向,只影响时序:B 可以在 #21520 的认领之后单独一个 PR。
置信缺口: 我看不到私有客户的应用包,零拉动只覆盖 objectstack examples 和 hotcrm。常设规则「新门默认否」偏向 A。B 是新增的拒绝,所以维护者不回字时按 A 处理。
裁后执行
Ruled: 5978653398 · question 1 letter A — host handlers keep the projected read; ruling B covers sandboxed bodies only · 2026-10-04T09:48Z
Ruled: 5974479930 · letter B · 2026-10-03T23:14Z
Filing gate: ② a decision only the maintainer can make. It is a security boundary, and the existing rules do not decide it. Filed by the triage seat (objectstack-wide, seat post #6015,
session_01AavokzJ5DndAwitDXvKy4U). It carries option C of #21454 (5963137791,5963161540). Triage named C as the maintainer's option and did not rule it (5963299937). #21454 closedcompletedon disposition A, so C had no carrier. ⛔ Not a claim, ⛔ not a dispatch. ⛔ Classes, doors and roles only.Reader who acts: the maintainer, or the director seat. If the letter is B, the
domain:cliseat dispatches it on this card.维护者速读
Measured, read now (
origin/main901e7cf13a)packages/runtime/src/stored-metadata-reader-seam.ts).serveStoredMetadataReadsThroughserves the family's reads projected and keyed, at the three author contexts: a body's object API, a handler's scoped API and a handler's engine handle.refuseStoredMetadataBodyWritescarries [Decision] security(runtime): may an app-authored body touch the stored-metadata family's tables at all — a hook bound to them, or an elevated body writing them directly (#21454 items 3 and 4) #21520's A, which refuses writes and hook binding.examples/**at901e7cf13a: the family's table names appear in changelog prose and comments only, never in a body.94668373: no hit insrc/**orpackages/**.packages/**is a platform internal, which [finding] [security] An action/automation body's object API and an action handler's engine handle read the stored-metadata family outside its body projection and keyed serve (reach NOT MEASURED) #21454's dev measured (5963137791).Governing text
5965059068, maintainer 「同意」): app bodies may not bind to the family or write it. Metadata changes go through the metadata API. It ruled writes and hooks only, not reads.docs/adrforonly reader,sole readerandmetadata APItogether withbody: 0 hits.一句话问题
应用代码现在能读到「元数据存储表」的遮蔽版内容。要保留这个读法,还是让应用代码彻底碰不到这组表、只能走元数据接口?
选项 × 真实代价
业务含义直译
四轴(业务立场)
os-decision-facets
Prior rulings read:
21454 option C,outright,refuse family reads,[Decision] stored-metadata→ 2 hits (#214545963299937, which named C the maintainer's; #215205965059068, letter A, writes and hooks only); ADR none; thread: #21454.推荐:B。 两年后的样子:应用代码通过元数据接口读到有类型、已遮蔽的定义,从不直接查原始存储表。参照 Salesforce:定义经 Schema describe 和 Metadata API 提供。但它的 Tooling 对象也能被查询,所以这只是方向参照,不是全封闭的先例。
回退:A。 已落地的遮蔽接缝原样保留,不加门,读侧零风险。
自检: 只看①选 B;②③④ 是否翻转:否。三轴同向,只影响时序:B 可以在 #21520 的认领之后单独一个 PR。
置信缺口: 我看不到私有客户的应用包,零拉动只覆盖 objectstack examples 和 hotcrm。常设规则「新门默认否」偏向 A。B 是新增的拒绝,所以维护者不回字时按 A 处理。
裁后执行
not planned关闭,并在 [finding] [security] An action/automation body's object API and an action handler's engine handle read the stored-metadata family outside its body projection and keyed serve (reach NOT MEASURED) #21454 记录一行。已落地的接缝不动。pm:queue(domain:cli)。认领先对 examples、hotcrm 和 cloud 的应用代码体做一次读侧普查,再动手。serveStoredMetadataReadsThrough处,把读改为拒绝,提示点名元数据接口。!、Clause-②: yes (narrowing)、ADR-0087 标记、minor),与 PR fix(runtime)!: refuse the stored-metadata family evaluate shapes and serve write returns at the reader-context seams #21539 同形。