Commit b821b29
该规则注册为 `input: 'parsed'`,看到的是 `ObjectStackSchema` 解析后的产物。
#4984 修掉了 sharing rule 字段层的 `??` 别名读法,同一文件里还留着四条同形
分支,读的键 spec 都不声明 —— 逐条对着 schema 的 `.shape` 与 `safeParse`
实测核过:
- `cfg.permissions ?? cfg.permissionSets` → `cfg.permissions`。
`ObjectStackSchema.shape` 无 `permissionSets`;stack 根 strip 未声明键,
实测 `safeParse({ manifest, permissionSets: [...] })` 成功但 `data` 里
没有该键 —— 规则看到 stack 之前它已经不存在。
- `cfg.sharingRules ?? cfg.sharing`(两处)→ `cfg.sharingRules`。同上。
- `str(rule.object ?? rule.objectName)` → `str(rule.object)`。
`SharingRuleSchema` 是 `.strict()`,`objectName` 被按名拒绝
("Unrecognized key(s) on this sharing rule: `objectName`");`object`
又是必填,解析过的规则上不可能缺。
- `asArray(object.rowLevelSecurity ?? object.rls)` 整段遍历(约 20 行)
**删除**。依据:`ObjectSchema.shape` 两个键都没有(实测键表里只有
`sharingModel` / `access` / `tenancy` 等,无 `rowLevelSecurity`、无 `rls`),
且 `ObjectSchema` 是 `.strict()` —— 带对象级 RLS 的 stack 在
`os validate` / `os build` 被整包拒绝,报 "Unrecognized key(s) on this
object: `rowLevelSecurity`"。对象级 RLS 从来不是可授权面
(`authorable-surface.json` 里只有 `security/PermissionSet:rowLevelSecurity`)。
对任何 spec 合法的 stack,判定结果不变 —— 反向验证:新测试跑在改动前的
实现上,29 条由 `safeParse` fixture 驱动的断言全绿,8 条转红的全部是
(a) 扫源码的 meta-guard,或 (b) 喂非 spec 合法 stack 的新钉子测试。
代价从来不是漏报,是误导:那段死代码连 `objects[N].rowLevelSecurity[M].using`
的诊断 path 都写好了,足以让下一位作者相信对象级 RLS 是真实授权面并照着写
(#5008 差点如此)。别名容忍属于 producer 的拒绝,不属于 consumer(Prime
Directive #12)。
meta-guard(#4992 模式),让下一条死分支在 review 前就红:
- declared-key guard:规则源码里从 stack / permission set / RLS policy /
object / sharing rule 上读的每个键,必须出现在对应 schema 自己的 `.shape`
里。扫源码而非行为是刻意的 —— 不可达分支没有行为可断言。
- reachability guard:每个 `findings.push` 调用点都必须被至少一条过
`safeParse` 的 fixture 触达(现存三个点,全覆盖)。
- 规则 ① 的 fixture 现在也走 `PermissionSetSchema.safeParse`。
四条分支各自做过变异验证:加回任意一条,至少两条测试转红。
真实元数据零新红:examples/ 与 default-permission-sets 中无
`parent_organization_id`,唯一的 `rowLevelSecurity` 用法在 permission set
(保留的那条分支)上,`sharing:` 出现在 view 定义内而非 stack 根。
邻居规则同形别名读法已另行记账为 #5017(未认领),不在本 PR 范围。
Claude-Session: https://claude.ai/code/session_018iARDqtrhQgz6fVHDeDkbQ
Co-authored-by: Claude <noreply@anthropic.com>
1 parent bf1edef commit b821b29
3 files changed
Lines changed: 524 additions & 53 deletions
File tree
- .changeset
- packages/lint/src
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
0 commit comments