观察类发现,来自 #5588(PR #5821)的实现过程,按 Prime Directive #10 单独立单。今天没有用户会撞到:它只影响文档覆盖面,不影响任何路由的可用性。
事实
packages/rest 有两个 registrar 绕过 RouteManager、直接注册到 IHttpServer:
packages/rest/src/package-routes.ts —— POST /api/v1/packages/publish、GET /api/v1/packages、GET /api/v1/packages/:id、DELETE /api/v1/packages/:id
packages/rest/src/external-datasource-routes.ts —— datasources/:name/external/* 5 条
台账 packages/rest/src/rest-route-ledger.ts 里它们是 source: 'direct-mount' 的 9 行,其中 8 行 disposition: 'sdk'(packages.list / packages.get / packages.uninstall / datasources.external.* 都是 SDK 表达得出来的真实能力)。
由 rest-api-plugin.ts 分别在 packageService / external-datasource 服务存在时调用,RestServer 自身不持有任何记录:RestServer.getRoutes()(= routeManager.getAll())看不到它们。
后果
#5588 裁定 C 之后,GET {apiPath}/openapi.json 的 built-in 段由 routeManager.getAll() 产出(PR #5821)。这 9 条因此不在文档里 —— 这是 #5821 刻意选的边界并写进了 PR 正文:本服务器不持有「本次 boot 它们是否挂载」的事实,凭空补上就是 #5588 修的那类幽灵。所以现状是 honest but incomplete,不是 bug:
- 拿
/openapi.json 生成客户端的 consumer 拿不到 packages.* 与 datasources.external.* 这 9 条(其中 8 条 SDK 有对应方法),要自己照台账手写;
- 除 openapi 之外,任何基于
getRoutes() 的自省(调试、路由清单、未来的门禁)同样看不见它们;rest-route-ledger.conformance.test.ts 之所以能守住它们,是因为它另起一套枚举方式(用 mock server 捕获注册调用),而不是问服务器。
可能的处置(留给分诊,不预设)
- 让两个 registrar 返回自己挂载的路由描述,由
rest-api-plugin.ts 交给 RestServer 登记为「已挂载」—— 事实来自实际调用点,不新增第二真相源;
- 或者把它们迁到
RouteManager 注册(需确认当初绕开是否有原因 —— package-routes.ts 的注释只解释了为什么不用 POST /packages,没解释为什么绕开 RouteManager);
- 或者维持现状,把「文档不含 direct-mount」明确为契约。
处置口径上 (1) 与 (2) 都会顺带让 rest-route-ledger.conformance.test.ts 的两套枚举收敛成一套。
Generated by Claude Code
观察类发现,来自 #5588(PR #5821)的实现过程,按 Prime Directive #10 单独立单。今天没有用户会撞到:它只影响文档覆盖面,不影响任何路由的可用性。
事实
packages/rest有两个 registrar 绕过RouteManager、直接注册到IHttpServer:packages/rest/src/package-routes.ts——POST /api/v1/packages/publish、GET /api/v1/packages、GET /api/v1/packages/:id、DELETE /api/v1/packages/:idpackages/rest/src/external-datasource-routes.ts——datasources/:name/external/*5 条台账
packages/rest/src/rest-route-ledger.ts里它们是source: 'direct-mount'的 9 行,其中 8 行disposition: 'sdk'(packages.list/packages.get/packages.uninstall/datasources.external.*都是 SDK 表达得出来的真实能力)。由
rest-api-plugin.ts分别在packageService/ external-datasource 服务存在时调用,RestServer自身不持有任何记录:RestServer.getRoutes()(=routeManager.getAll())看不到它们。后果
#5588 裁定 C 之后,
GET {apiPath}/openapi.json的 built-in 段由routeManager.getAll()产出(PR #5821)。这 9 条因此不在文档里 —— 这是 #5821 刻意选的边界并写进了 PR 正文:本服务器不持有「本次 boot 它们是否挂载」的事实,凭空补上就是 #5588 修的那类幽灵。所以现状是 honest but incomplete,不是 bug:/openapi.json生成客户端的 consumer 拿不到packages.*与datasources.external.*这 9 条(其中 8 条 SDK 有对应方法),要自己照台账手写;getRoutes()的自省(调试、路由清单、未来的门禁)同样看不见它们;rest-route-ledger.conformance.test.ts之所以能守住它们,是因为它另起一套枚举方式(用 mock server 捕获注册调用),而不是问服务器。可能的处置(留给分诊,不预设)
rest-api-plugin.ts交给RestServer登记为「已挂载」—— 事实来自实际调用点,不新增第二真相源;RouteManager注册(需确认当初绕开是否有原因 ——package-routes.ts的注释只解释了为什么不用POST /packages,没解释为什么绕开 RouteManager);处置口径上 (1) 与 (2) 都会顺带让
rest-route-ledger.conformance.test.ts的两套枚举收敛成一套。Generated by Claude Code