Skip to content

[finding] 声明的粗类型「臂」没有任何门禁与 spec 比对 —— #3832 让臂可写之后,一条假臂能让 manifest 门放行 spec 拒绝的值,且全绿 #4971

Description

@yinlianghui

发现于 #3832 实施时的反向验证(变异 ③)。观察类:今天零个假臂 —— #3832 落地的五处臂都逐一对 spec / 渲染器实测过 —— 所以这是门禁强度的空缺,不是活缺陷。

机制

apps/console/src/__tests__/registry-inputs-spec-parity.test.ts 两个方向都只比键名(它自己的文件头写着这一条)。类型的宽窄它看不见。

#3832 之前这条空缺的后果有限:type 只能承载一个粗类型,写窄是唯一的失败模式,而写窄只会产生噪音(对合法值报警)。#3832 之后 type 可以承载臂数组,于是多出一个反向失败模式:多写一条 spec 不接受的臂,门就会放行 spec 拒绝的值 —— 从「门比契约窄」变成「门比契约宽」,而后者不再是噪音,是漏报。

实测(变异 ③,两半答案不同,这正是本卡的判据)

在 PR(#3832)的分支上,分别给一个标本加一条 spec 不接受的假臂:

  • ③aelement:text_input.defaultValue'object' 臂(spec 在该键上拒绝映射,实测):
    packages/components/src/__tests__/text-input-inputs-spec-parity.test.ts钉红,
    AssertionError: expected [ 'number', 'object', 'string' ] to deeply equal [ 'number', 'string' ]
    —— 因为那个 per-block 测试是把臂当集合对 spec 的裁决逐条比对的。
  • ③bpage:card.title'number' 臂(spec 拒绝数字标题):
    Test Files 93 passed | Tests 856 passed —— 全绿,无一处门禁察觉。

同一次变异下门的行为实测:

declared arms: ["string","object","number"]
string -> CLEAN
i18n map -> CLEAN
number (假臂 —— spec 拒绝) -> CLEAN ← 漏报
boolean (不命中任何臂) -> warning/type-mismatch: prop "title" expected a string or an object or a number
array (不命中任何臂) -> warning/type-mismatch: 同上

即:「联合不是放行一切」这半成立(不命中任何臂照旧报告),而「臂对齐契约」这半今天靠的是 per-block 纪律,不是门禁 —— 有 per-block 测试的键(#3832 五个标本都有)红,没有的键全绿。

可能的方向(不预设结论)

倾向 (b) 起步:它对齐的是「declared = enforced」,而且假臂是新引入的那个方向,窄化至少还是响的(噪音),宽化是静默的。

关联:#3832 / 本卡的 PR、#3809(同一个「只比键名」根因的墓碑盲区)、#3795(成员形状的 open question)、#3797 / #3808(键名两个方向)、AGENTS.md #0.1

Metadata

Metadata

Assignees

No one assigned

    Labels

    domain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repopm:queuetooling

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions