Skip to content

zodShapeOf 补完 union + prefault 后仍剩两格不对齐:不下探 array element / record valueType,且 depth 上限 12 是四个 walker 里最窄的 #6232

Description

@os-zhuang

观察类发现,来自 #6098 收尾时对四个同族 walker 的逐格对照。今天两格都被 fail-closed 兜住(解不出 shape 时 reachableVia 返回 'root-graph',宁可多要一个 tombstone),没有已知错误产物。记录在案,免得下一轮把「补齐了吗」当成已答之问。

#6098 补掉的是 union 分支与 prefault,这两格补完之后 zodShapeOf 与三个同族 walker 的包装器集合、lazy、pipe 方向、union 键面已经一致。剩下的不一致有两处,都不是 #6098 的范围。

格 1 —— 不下探 array element / record valueType

walker arrayelement recordvalueType
scripts/lib/zod-graph.ts zodShapeOf
scripts/liveness/check-liveness.mts unwrap
src/kernel/metadata-authoring-lint.ts unwrap
src/system/metadata-form-zod-reconciliation.test.ts unwrap d.element d.valueType

所以这一格三比一,而且是唯一一个下探的那位跟另外三个不同——不能直接说「zodShapeOf 窄」。真正要先答的是语义问题:对 z.array(SomeObject) 这样的节点,「作者在这个节点上写的 shape」到底是不是元素的 shape?

现存标本:data/FilterArray(一个 lazyarray 的 emitted def,visited=false)今天 zodShapeOf 解不出 shape,落在 fail-closed 兜底上答 root-graph#6098 实测的 1610 个 def 里只有它一个属于这一类。

格 2 —— depth 上限 12,是四个里最窄的

scripts/lib/zod-graph.ts                                12   (zodShapeOf 与 pipeInIsTransform 各一处)
scripts/liveness/check-liveness.mts                     16
src/kernel/metadata-authoring-lint.ts                   25
src/system/metadata-form-zod-reconciliation.test.ts     25

#6098 之后这一格的重要性上升了一点:union 分支是逐成员递归的(mergedUnionShape 对每个成员 depth + 1),嵌套 union 会比以前更快吃掉预算。今天没有截断——view 这条最深的链在 depth ≤ 3 就解完了——但「最窄的那个上限」正好落在喂删除门禁的这个 walker 上,方向不理想。

超限的后果同样是 return null → fail-closed,所以是保守而非错答。

#6098 的关系

#6098 的正文只点名了两格(union、prefault),这两格已随 PR #6222 合入并完成 #5056 测量轮。本条是那一轮收尾对照时发现的剩余项,单独记录而不是塞进那个 PR——因为格 1 会动桥表,必须有自己的测量轮。

建议

参考:#6098 · PR #6222 · #5317 · #5056 · #6221

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions