fix(spec): OpenAPI components.schemas 不再是空的 —— lazySchema Proxy 撞上 typeof === 'object',并补上产物自洽门禁 - #5459
Conversation
….schemas 为空 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018fxLGQdatPbBUvCgiVxg6D
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018fxLGQdatPbBUvCgiVxg6D
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
📓 Docs Drift CheckThis PR changes 1 package(s): 11 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:
|
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 31010196973 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 失败的 job(日志抽取,best effort):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
|
分诊(spec 车道 PM):第 3 型 —— 同批连坐,非本 PR 回归,非 flaky,不需人工重排。 失败测试 已核实:队列已自动将本 PR 重建到纯 main( Generated by Claude Code |
Fixes #5168
前提复核(基线已前移)
单子写的基线是
81e2744,现已前移到ed0d2aac0;#5293昨日动过build-openapi.ts(退役HttpServerConfigSchema)。逐条对origin/main复核,前提完全成立:packages/spec/scripts/build-openapi.ts:255,一字未动;origin/main上复现,唯一变量是 Proxy:$ref与单子列的完全一致:ApiError/CreateRequest/DeleteResponse/ListRecordResponse/SingleRecordResponse/UpdateRequest,defined schemas: [];typeof是'function',而'_zod' in schema是true。改动一:放宽判据(建议 1)
判据同时接受
'object'与'function'。lazySchema不需要改动 —— 它专门维护了_zodfacade 供toJSONSchema遍历,判据的第二段对 Proxy 本来就有效。改动二:产物自洽门禁(建议 2)
生成器在写盘之前自检两条,任一不满足即非零退出,自恰不了的文档根本不会被写出来(红臂实测:失败时
json-schema/openapi.json未被创建):$ref必须解析得到 —— 按 JSON Pointer 解析而非按#/components/schemas/前缀匹配,将来新增的#/$defs/...引用自动覆盖;报错逐条点名悬空$ref及其文档位置,并把「已定义 schema 列表」一并打出(哪一侧是空的是读者最先需要的信息)。if (像 zod) { 收 }且没有 else,正是这个静默跳过的形状让九次跳过发布成了空文档;现在声明即强制。z.toJSONSchema()抛错时原先塞一个{type:'object'}占位冒充契约,同样改为响亮失败(当前九个全部干净转换,零占位)。接线点选择(实测后定):接在生成器内部,不做独立
check:脚本。因为packages/spec/json-schema/在.gitignore:61、每次pnpm build重新生成 —— 独立检查脚本无论如何都要先跑一次生成器才有东西可查。「产物自洽」这类断言不需要任何基线快照,比「产物最新」更便宜。关于「提交
json-schema/openapi.json」做不到,也不该做:该目录是 gitignore 的,产物不入库,由
pnpm build(gen:schema && gen:openapi && tsup)每次重新生成,并通过files+exports随包发布。所以本 PR 不含产物文件;真实pnpm --filter @objectstack/spec build产出的结果已在报告与下方 tests 中附上(components: 9,DANGLING: NONE)。typeof === 'object'普查结果(只报告,未改)没有第二处。
'_zod' in这个成员测试全仓仅此一处。其它生成器用的是instanceof z.ZodType(仅build-schemas.ts),而实测instanceof对 Proxy 返回 true —— 即这个惯用法是 Proxy 安全的,不存在同类隐患。另外build-schemas.ts/build-react-blocks-contract.ts/check-liveness.mts/check-variant-docs.mts/check-react-blocks-declaration-parity.ts都在文件顶部设了OS_EAGER_SCHEMAS=1,build-openapi.ts是唯一没设的 —— 本 PR 让它对 Proxy 直接免疫,比依赖环境变量更稳。packages/rest侧:仅注释,无行为改动三处以现在时陈述「
components.schemas是空的」的注释被本 PR 证伪,已按事实更新(openapi-endpoints.ts一处、openapi-endpoints.test.ts两处)。行为与断言一字未改:声明式端点的 enrichment 仍然只写type: object而不编造$ref—— 理由从「components 是空的」修正为「九个契约 schema 是通用 CRUD 信封,不是某个具体对象的 body 形状」,结论不变。越范围发现
已立 #5456(
finding,未认领、未进pm:queue):base spec 用 7 条手写 path 描述路由面,与 rest 真实路由无任何对账,漂移了不会红 —— 即check:generatedledger 里gen:openapi那条why真正说的那件事(本 PR 补的是自洽,不是对账)。实测当前未漂移,故为休眠缺口。该单顺带澄清:「最新性门」(单子建议 3)在这里没有对象,因为产物不入库,没有入库快照可以变陈旧 —— 建议按「对账」而非「最新性」定级。Generated by Claude Code