Skip to content

gen:openapi 产物被运行时读盘但无任何门禁——缺失时 /openapi.json 静默 503,check:generated 自报「Generated but ungated」 #5757

Description

@os-zhuang

观察类记录(finding),发现于 #5679 实施过程(PR #5743),按 Prime Directive #10 单独登记,未在该 PR 内处理。

事实(全部实测)

  1. check:generated 自报:「Generated but ungated (2): gen:openapi, gen:sbom — nothing verifies these are current」——工具链自己声明这两个生成器无新鲜度校验。
  2. 其中 gen:openapi 的产物 packages/spec/json-schema/openapi.jsongitignore 的、且被运行时读盘消费:packages/rest/src/rest-server.ts:3388/openapi.json 路由在请求时从磁盘读取该文件。
  3. 缺失时的失败形态是静默 503,不是构建期报错。实证:routes.mcp 是 REST /discovery 发出、objectui 真实消费、但 ApiRoutesSchema 从未声明的键(#4828 同族,低一层) #5679 实施期间 check:authorable-surface 重跑 build-schemas.ts(不含 gen:openapi)清掉了该文件,packages/rest 随即 8 条 OpenAPI 用例以 503 判红——失败形态与「你的改动弄坏了什么」无法区分,定位耗时后才确认是生成顺序副作用(gen:openapi 重跑即恢复 755/755)。
  4. CI 的 build 序列(gen:schema && gen:openapi && tsup)目前顺序正确,所以线上未爆——该缺口是潜在的:任何单跑部分生成器的本地/脚本路径都会复现。

为什么值得记

  • 一个被运行时消费的产物没有「是否新鲜/存在」的门禁,违反本仓 check-generated 机制自己的完备性主张(该机制的价值正在于「生成物不新鲜必被机器发现」);
  • 失败形态(运行时 503)与根因(构建期产物缺失)相距两层,已经造成一次真实的误诊成本(见上第 3 条)。

相邻工作

gen:sbom 同报无门禁,但无运行时消费者,严重度不同。与 #5040 / #5078(check-generated 机制族)相邻,修法大概率是给 check:generated 补两条 freshness/existence 条目或把 openapi.json 改为 build 产物内嵌。

不预设修法,交分诊分级。

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