Part of #5588
Blocked-by: #5588
维护者 2026-08-06 对 #5588 裁定 C (裁决评论见该单):built-in 路由段的唯一产出方移交 packages/rest(ADR-0076 属主,#5078 确权)。本单是 contract-first 拆分的第二棒(spec 半边) ,落点 packages/spec,按跨座位转移协议转 spec 座位队列(domain:* 标签待分诊座位补)。
范围
packages/spec/scripts/build-openapi.ts 摘除 generateCrudPaths / generateMetadataPaths / generateDiscoveryPaths 三个手写路由段生成函数及其调用 —— 发布的静态 openapi 产物不再携带任何 built-in 路由描述(它们 0/10 命中真实路由,见 发布出去的 /api/v1/openapi.json 描述的 built-in 路由一条都不存在 —— 10 个 operation 真实 boot 全部 404(证伪 #5456 的「当前未漂移」) #5588 正文对照表),只保留 spec 真正拥有的 components.schemas / info / securitySchemes;
发布出去的 OpenAPI 文档 components.schemas 是空的,而 6 个 $ref 全部悬空 —— lazySchema Proxy 撞上 typeof === 'object' 判据 #5168 的产物自洽门按新产物形状调整覆盖面($ref 可解析、契约 schema 真产出的断言保留,path 相关断言随段移除);
check:generated 收尾台账里 gen:openapi 那条 why("no check gate compares it to the routes")随实施改写 —— C 之下无两方可对账,该缺口的表述已失准(gen:openapi 的 base spec 用 7 条手写 path 描述路由面,与 rest 真实路由无任何对账 —— 漂移了不会红(#5168 的剩余那一半) #5456 已依此关闭 not planned)。
为什么 Blocked-by #5588 (第一棒先行)
服务出的 /api/v1/openapi.json = spec 静态产物 + rest serve 期 enrichment。若 spec 先摘段,rest 补齐落地前服务出的文档将缺失 built-in 段(比错误描述更糟的空窗)。第一棒(rest 在 serve 期丢弃静态旧段、自产正确段)合入后,静态段变为纯冗余,本单摘除才是零行为变化的清理。
验收
关联:#5588 (裁决锚点)、#5456 (已关,重开条件在其关闭评论)、#5168 、#5078 、ADR-0076。
Part of #5588
Blocked-by: #5588
维护者 2026-08-06 对 #5588 裁定 C(裁决评论见该单):built-in 路由段的唯一产出方移交
packages/rest(ADR-0076 属主,#5078 确权)。本单是 contract-first 拆分的第二棒(spec 半边),落点packages/spec,按跨座位转移协议转 spec 座位队列(domain:*标签待分诊座位补)。范围
packages/spec/scripts/build-openapi.ts摘除generateCrudPaths/generateMetadataPaths/generateDiscoveryPaths三个手写路由段生成函数及其调用 —— 发布的静态 openapi 产物不再携带任何 built-in 路由描述(它们 0/10 命中真实路由,见 发布出去的/api/v1/openapi.json描述的 built-in 路由一条都不存在 —— 10 个 operation 真实 boot 全部 404(证伪 #5456 的「当前未漂移」) #5588 正文对照表),只保留 spec 真正拥有的components.schemas/info/securitySchemes;components.schemas是空的,而 6 个$ref全部悬空 ——lazySchemaProxy 撞上typeof === 'object'判据 #5168 的产物自洽门按新产物形状调整覆盖面($ref可解析、契约 schema 真产出的断言保留,path 相关断言随段移除);check:generated收尾台账里gen:openapi那条why("no check gate compares it to the routes")随实施改写 —— C 之下无两方可对账,该缺口的表述已失准(gen:openapi的 base spec 用 7 条手写 path 描述路由面,与 rest 真实路由无任何对账 —— 漂移了不会红(#5168 的剩余那一半) #5456 已依此关闭 not planned)。为什么 Blocked-by #5588(第一棒先行)
服务出的
/api/v1/openapi.json= spec 静态产物 + rest serve 期 enrichment。若 spec 先摘段,rest 补齐落地前服务出的文档将缺失 built-in 段(比错误描述更糟的空窗)。第一棒(rest 在 serve 期丢弃静态旧段、自产正确段)合入后,静态段变为纯冗余,本单摘除才是零行为变化的清理。验收
pnpm --filter @objectstack/spec build绿,产物中paths不含手写 built-in 段;GET /api/v1/openapi.json的 built-in 段仍在且正确(由第一棒的 rest 产出承载,回归对照 发布出去的/api/v1/openapi.json描述的 built-in 路由一条都不存在 —— 10 个 operation 真实 boot 全部 404(证伪 #5456 的「当前未漂移」) #5588 正文的探测表);components.schemas是空的,而 6 个$ref全部悬空 ——lazySchemaProxy 撞上typeof === 'object'判据 #5168 门与check:generated台账措辞与新现实一致。关联:#5588(裁决锚点)、#5456(已关,重开条件在其关闭评论)、#5168、#5078、ADR-0076。