发现于 #3694 的测量(PR #3706)。观察类,不是用户今天会撞到的回归 —— 5 个形状的诊断偏泛化,path 已经准确。分诊定级请自行裁决。
背景:#3694 测出了一个「不存在的」东西的反面
#3694 问「范畴判定只认 invalid_type 是不是漏进语义的实现细节」,授权是再定性 invalid_value,并规定「每一处变化必须是严格改善,否则停手」。
测量结论(PR #3706,51 形状):再定性 invalid_value 的两个方向都不合格 ——
| 谓词 |
改善 |
退化 |
| 视作类型层拒绝 |
5 |
8 |
类型感知(仅当无允许字面量与值同 typeof 时才算拒绝) |
6 |
6 |
于是 #3694 不放宽,把两个方向都钉住结案。
但同一轮测量顺带发现:存在一个 5 改善 / 0 退化的谓词。 它落在授权外,因为它根本不看 issue 的 code —— 它回答的是另一个问题。本单就是记录它。
这个谓词
「证据深度」两层:
- 先取在值内部报过位置的成员(自身相对 path 非空);恰好一个 → 选它。
- 一个都没有 → 回落到今天的普查(只认
invalid_type),恰好一个候选 → 选它。
单调性可证,不是测出来的运气:在值内部报过位置的成员必然没有根上的 invalid_type,所以第 1 层的集合是今天候选集的子集。故第 1 层命中时今天的 k 必 ≥ 1 —— 这条规则只会新增激活,永不去激活。实测 51 形状印证:5 改善 / 0 退化。
改善的 5 处都在 columns[].summary(enum | {type, field}),值是对象时:
config.columns.0.summary / Invalid input (今天)
config.columns.0.summary.type / Invalid option: expected one of "none"|"count"|… (该谓词)
含容器 list.… 与 listViews.v1.… 两条路由。逐处核对过选中的都是作者意图的成员:作者写的是对象,选中的就是 {type, field} 成员。
不是漏做,是刻意不做 —— 它把唯一候选规则的理据换掉了:
两者恰好在 enum-vs-object 上分叉,而这正是全部收益的来源。#3626 / #3677 两次把「不发明偏好」写进代码注释并靠它挡住了 config.sort 的误选;「报进内部的证据强于整体字面量拒绝」是一条新的偏好排序,虽然讲得通,但它是设计裁决,不该由一张授权「再定性某个 code」的卡顺手做掉。
代价已经测过
PR #3706 已把「现状塌陷」也钉住,所以采纳该谓词的代价是确定的:4 条测试变红,全部是钉住现状塌陷的钉子,零回归(对照:视作类型层拒绝 9 红含 5 条真回归;类型感知 8 红含真回归)。按 fixture 三分诊做整体替换即可。
判断这值不值得做
- 赞成:严格改善且单调性可证;代价已量化;现在钉子齐了,做起来是机械动作。
- 反对:收益上限很小(只有
summary 写成对象这一类形状,且 path 今天已准确);它要立第三条局部规则,而这三条的既定归宿是随 objectstack#6391 一起退休;新的偏好排序会伸进未来任何 enum-vs-object 的 union。
倾向:低优先,且优先级应低于 objectstack#6391 —— 若 spec 侧给 union 补上判别入口,summary 这类 union 自带判别式,#3626 / #3678 / #3694 连同本单一起消解,这条规则一天都不用活。
相关:#3626、#3678、#3694、PR #3677、PR #3693、PR #3706、objectstack#6391。
Generated by Claude Code
发现于 #3694 的测量(PR #3706)。观察类,不是用户今天会撞到的回归 —— 5 个形状的诊断偏泛化,path 已经准确。分诊定级请自行裁决。
背景:#3694 测出了一个「不存在的」东西的反面
#3694 问「范畴判定只认
invalid_type是不是漏进语义的实现细节」,授权是再定性invalid_value,并规定「每一处变化必须是严格改善,否则停手」。测量结论(PR #3706,51 形状):再定性
invalid_value的两个方向都不合格 ——typeof时才算拒绝)于是 #3694 不放宽,把两个方向都钉住结案。
但同一轮测量顺带发现:存在一个 5 改善 / 0 退化的谓词。 它落在授权外,因为它根本不看 issue 的
code—— 它回答的是另一个问题。本单就是记录它。这个谓词
「证据深度」两层:
invalid_type),恰好一个候选 → 选它。单调性可证,不是测出来的运气:在值内部报过位置的成员必然没有根上的
invalid_type,所以第 1 层的集合是今天候选集的子集。故第 1 层命中时今天的 k 必 ≥ 1 —— 这条规则只会新增激活,永不去激活。实测 51 形状印证:5 改善 / 0 退化。改善的 5 处都在
columns[].summary(enum | {type, field}),值是对象时:含容器
list.…与listViews.v1.…两条路由。逐处核对过选中的都是作者意图的成员:作者写的是对象,选中的就是{type, field}成员。为什么 #3694 没有顺手做
不是漏做,是刻意不做 —— 它把唯一候选规则的理据换掉了:
两者恰好在 enum-vs-object 上分叉,而这正是全部收益的来源。#3626 / #3677 两次把「不发明偏好」写进代码注释并靠它挡住了
config.sort的误选;「报进内部的证据强于整体字面量拒绝」是一条新的偏好排序,虽然讲得通,但它是设计裁决,不该由一张授权「再定性某个 code」的卡顺手做掉。代价已经测过
PR #3706 已把「现状塌陷」也钉住,所以采纳该谓词的代价是确定的:4 条测试变红,全部是钉住现状塌陷的钉子,零回归(对照:视作类型层拒绝 9 红含 5 条真回归;类型感知 8 红含真回归)。按 fixture 三分诊做整体替换即可。
stops at the next union down, but addressed to it rather than to columns(metadata-admin:嵌套 union(config.columns)的诊断仍塌成「Invalid input」——创建路/编辑路都中 #3626)every nested union shape lands in exactly ONE rule's cell — census(metadata-admin:嵌套 union「只剩一个成员接受了值的类型」时仍塌成 Invalid input(config.sort 等) #3678)an OBJECT summary keeps TWO candidates, so the node stays collapsed(metadata-admin:范畴判定只认 invalid_type,enum 成员对非枚举值答 invalid_value,把可判定的 union 留在塌陷态 #3694)the object-summary collapse is the same on the container and listViews routes(metadata-admin:范畴判定只认 invalid_type,enum 成员对非枚举值答 invalid_value,把可判定的 union 留在塌陷态 #3694)判断这值不值得做
summary写成对象这一类形状,且 path 今天已准确);它要立第三条局部规则,而这三条的既定归宿是随 objectstack#6391 一起退休;新的偏好排序会伸进未来任何 enum-vs-object 的 union。倾向:低优先,且优先级应低于 objectstack#6391 —— 若 spec 侧给 union 补上判别入口,
summary这类 union 自带判别式,#3626 / #3678 / #3694 连同本单一起消解,这条规则一天都不用活。相关:#3626、#3678、#3694、PR #3677、PR #3693、PR #3706、objectstack#6391。
Generated by Claude Code