You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
实测规模:44 个源码调用点,运行时 52 张表(ui/app.zod.ts 的导航项工厂一个调用点跑九次,每个 type 变体一张)。
关键在于这批表被判到的强度不均,闸门自己也是这么写的:
判据
strictObject 那 235 张
这 44 个直调点
别名 key 不得是已知键
对 .shape 判
对手抄数组判
别名 target 必须是已知键
对 .shape 判(含墓碑检查)
对手抄数组判(墓碑不可见)
表内 aliasProbe 不得撞车
判
判 —— 完全等价
第三条不依赖 shape,所以路线 1 就把它开满了(首测 52 张表 0 撞车)。前两条继承手抄数组与 shape 之间的漂移 —— 数组说 x 是已知键,而 schema 里早就没有了,闸门会照着数组给出绿灯。那正是 strictObject 存在的理由(见其 docblock:"the array is a second copy of the truth"),也正是路线 1 消不掉的那一半。
由 #5483 的过渡看守(路线 1)落地后拆出的后续(未指派,记录测量与边界,不认领)。
现状
#5483 按路线 1 落地:
strictUnknownKeyError自己把{ surface, knownKeys, aliases, guidance }登记进一张内部登记表,packages/spec/src/shared/alias-integrity.test.ts因此把这 44 个直调点也判了 —— 零调用点改动。实测规模:44 个源码调用点,运行时 52 张表(
ui/app.zod.ts的导航项工厂一个调用点跑九次,每个type变体一张)。关键在于这批表被判到的强度不均,闸门自己也是这么写的:
strictObject那 235 张.shape判.shape判(含墓碑检查)aliasProbe不得撞车第三条不依赖 shape,所以路线 1 就把它开满了(首测 52 张表 0 撞车)。前两条继承手抄数组与 shape 之间的漂移 —— 数组说
x是已知键,而 schema 里早就没有了,闸门会照着数组给出绿灯。那正是strictObject存在的理由(见其 docblock:"the array is a second copy of the truth"),也正是路线 1 消不掉的那一半。该做什么
把 44 个调用点分批迁到
strictObject(options, shape):*_KEYS数组连同它的漂移探针测试一起删除;alias-integrity.test.ts里toBeLessThanOrEqual(44)的只减不增棘轮随之降到 0;packages/spec/src/shared/alias-table-registry.ts)与闸门里"直调点"那一整段随最后一个调用点一起删除。分布(实测,基线见下):
迁移时已知的三个坑
data/object.zod.ts的表是延迟构建的(objectUnknownKeyErrorImpl ??= …),为的是绕开一个 temporal dead zone ——UNKNOWN_KEY_GUIDANCE和 shape 都声明在它下面。改成strictObject需要先解决这个顺序问题,不是纯机械替换。ui/app.zod.ts的导航项是一个按变体拼装的工厂,九张表共用一段拼装逻辑,knownKeys是[...BASE, ...NAV_VARIANT_KEYS[variant]]。迁移意味着九个变体 schema 各自成为strictObject,extraKeys可能用得上。同一族还有ui/app.zod.ts导航项:4 条expanded别名在另外 8 个变体上把作者指向该变体同样拒绝的键(二次拒绝) #5555 那条待修缺陷,顺序上建议先修ui/app.zod.ts导航项:4 条expanded别名在另外 8 个变体上把作者指向该变体同样拒绝的键(二次拒绝) #5555 再迁,否则修法要写两遍。data/hook.zod.ts/data/hook-body.zod.ts当时在 [spec] 退役 HookContext session.roles —— #4839 双删后零消费方零生产方(ADR-0049) #5050 手里,分批时避开在飞的文件。基线
分支
claude/issue-5483-strict-unknown-registry,origin/main5acb93a。测量复现:pnpm --filter @objectstack/spec exec vitest run src/shared/alias-integrity.test.ts。