Skip to content

rest-openapi-route.test.ts 的 #5821 幽灵路径钉子已静默失效 —— for (const path of stale) 输入集合实测为空集,循环一次都不跑 #6894

Description

@os-project-manager

#5969 的「同族小尾巴」一节拆出立卡(domain:cli 座位分诊,2026-08-09)。#5969 主体(路由注册携带 body 契约以恢复 $ref)按 ADR-0049 保持封存、不入队 —— 那是需要真实拉力的新能力面。本卡只取那条已经失效的钉子,它是可以现在就修的。

事实(数据来自 #5969 的实测,须由实施者复测)

packages/rest/src/rest-openapi-route.test.ts#5821 留下的钉子形如:

for (const path of stale) {
  // 断言服务出的文档里不出现这些幽灵路径
}

#5744 合入(spec 侧不再 emit 静态 paths 段)之后,stale输入集合变成空集 —— #5969 实测记录为:

#5821 pin input set (stale paths): [] -> size 0

循环体一次都不执行。 「服务出的文档不许泄漏静态产物的幽灵路径」这层语义因此静默失效,而测试照绿、CI 照过、没有任何信号。

同一处的措辞也已经过期,同属本卡:

  • 用例标题:discards the static artifact section even though spec still emits it —— spec 已不再 emit;
  • 注释:Leg 2 (#5744) removes the spec-side generation. Until it lands, the bundled artifact really does carry /api/{object} & co. —— 它已经 land 了

这不是整体空洞化 —— 先读清楚再改

⚠️ 文件没有变成幻影测试,不要按「删掉了事」处理。循环之后的三条断言仍然咬合:components.schemas 键集逐字相等、securitySchemes 深等、info.title 相等 —— 它们今天钉的是「spec 拥有的那半边原样穿过 serve 期」,是真实且有价值的。

失效的只有循环那一层。所以本卡的目标是补回那一层,不是清场。

修法方向(#5969 已给,非强制)

要保住「不许泄漏」的语义,得换一条幸存段仍能触及的输入 —— 例如构造一份带 paths 的 artifact 喂给 loadOpenApiSpec 的缓存,让钉子重新有东西可断言 —— 而不是依赖静态产物继续发错段来供货(那等于要求生产侧保留一个已被正确移除的缺陷,来喂一个测试)。

实施者可以另提更好的形状,但必须满足交付判据

交付判据(硬)

必须证明钉子重新会红。 具体地:构造/恢复输入之后,故意让服务出的文档泄漏一条幽灵路径,展示该用例变红;再撤掉,展示变绿。⛔ 只把 size 0 改成 size N 而不做这个双向实证,等于用另一个绿灯换掉当前这个绿灯 —— 本卡就白做了。

若复测发现 stale 今天并非空集(#5969 的测量点在 main 的某个较早状态,可能已漂移),立即停手并在卡上如实报告,不要为了让卡成立而制造一个红。那种情况下本卡应当降级为纯措辞修正。

不在范围

关联:#5969(来源)、#5821(钉子出处)、#5744(使其失效的那一棒)、#5588#4984(幻影检查家族)、ADR-0049。

Metadata

Metadata

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions