Skip to content

gen:schema rmSync 整个 json-schema/ 会顺手抹掉 gen:openapi 的产物,rest 的 openapi 路由测试随后 503 假红——check:generated 原地跑 build-schemas 也触发 #5371

Description

@os-zhuang

现象(PR #5312 同步接力实测)

packages/spec/scripts/build-schemas.ts(gen:schema)开场 fs.rmSync(OUT_DIR) 清空 packages/spec/json-schema/,而 openapi.json 只由另一条生成链 gen:openapi(build-openapi.ts)写入,且 gitignored、无门(AGENTS.md 已记录 gen:openapi/gen:sbom 无门)。

于是任何「gen:schema(或原地跑 build-schemas 的 check:generated)之后、没有再跑 full spec build/gen:openapi」的窗口里,openapi.json 处于被抹掉状态。此时跑 @objectstack/rest 测试:

FAIL src/rest-openapi-route.test.ts — 5 条
AssertionError: expected 503 to be 200
(loadOpenApiSpec() 找不到 @objectstack/spec/json-schema/openapi.json → OPENAPI_UNAVAILABLE)

失败读起来像 rest 路由坏了,实际是 spec 侧生成物被兄弟生成器清场。归因成本一整圈(§9 陈旧产物陷阱的又一变体:这次不是「陈旧」,是「被抹掉」)。

为什么今天没人在 CI 撞到

CI 的 test job 干净检出后走完整 pnpm build(spec build = gen:schema && gen:openapi && tsup,顺序保证 openapi.json 最后在场);只有本地/agent 工作流会在 build 之后再跑独立 gen:schemacheck:generated,然后再跑 rest 测试。多 agent 接力(合并后重生成基线)恰好就是这个顺序。

候选修法(供 triage)

  • build-schemas.ts 清场时保留 openapi.json(它不属于该生成器的输出集,删别人的产物本身就是越界);
  • gen:schema 末尾顺带触发 gen:openapi(两者本来在 build 里就是连体);
  • 或 rest 测试对缺失产物给出指向性 fail(「run gen:openapi」),把一圈归因变成一行提示。

第一条最小:各生成器只拥有并清理自己的输出。

观察级:CI 与发布产物不受影响,只咬本地/agent 的验证圈。发现于 #5312 同步接力,当场以 pnpm --filter @objectstack/spec gen:openapi 恢复后 rest 40 files / 608 tests 全绿。

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions