Repository navigation
Description
发现于 #5399(E 系列失真注释摘除)的注释核对过程,非该单范围(改日志级别属行为变更),按 Prime Directive #10 单独立案。
现场
packages/runtime/src/dispatcher-plugin.ts,声明式端点挂载接缝的 else 分支(origin/main f417863fc 约 1433-1443 行):
} else {
// `debug`, not `warn`: no stack can declare an endpoint yet (a
// non-empty `apis:` is rejected at publish until #5040 E7), so
// nothing is missing from any deployment today. When that flip
// lands, THIS is where absence must become loud — an adapter
// without the seam can never serve a declared endpoint.
ctx.logger.debug(
'[dispatcher] http.server exposes no `setFallbackHandler`; declarative endpoints '
+ 'would be unreachable on this transport.',
);
}为什么现在成立
注释里那个条件句的触发条件已经发生:E7 发布翻转已落地(packages/spec/src/api/endpoint-publish-gate.ts 开篇即自述 "This module is that flip"),非空 apis: 不再被整体拒绝,只按形状逐条把关。因此:
- 声明已经存在(showcase 就声明了两条,
packages/qa/dogfood/test/showcase-declarative-endpoints.dogfood.test.ts以真实 boot 验证); - 一个不暴露
setFallbackHandler的适配器上,这些声明永远不会被服务,调用方只拿到裸 404; - 而运维侧唯一的信号是一条
debug—— 默认level: 'info'下根本不打印(packages/core/src/logger.ts的isEnabled)。
这正是 AGENTS.md「Route & surface ownership §3 Absence must be loud」点名的形状:合法地什么都不服务的组合,必须在 boot 时说一次并给出补救办法,而不是留一个裸 404 让人去诊断。注释自己把这一条写下来了,只是执行时机没到 —— 现在到了。
相关:#5122(runtime 导出的 HttpServer 包装器静默丢弃 IHttpServer 的全部可选成员,setFallbackHandler 在内)。两者独立但叠加:#5122 使这个 else 分支在实践中更容易被走到,而本单是走到之后的信号缺失。
建议修法(待 PM/维护者定夺)
debug 升 warn,并按 AGENTS.md 对「响亮的缺失」的要求,让这一行同时带上后果与补救:该传输上任何 metadata 声明的 apis: 端点都不会被服务,换用暴露 setFallbackHandler 的适配器(如 @objectstack/plugin-hono-server)。
注意这是功能性降级而非持久化降级,按「Degradation log levels」一节 warn 是正确档位,不应升到 error。
不做什么
#5399 是纯注释/台账修真单,零行为变更,因此该单只把这处注释改写为「当前仍是 debug + 本单号」的真话,级别本身留给本单处理。
Activity
baozhoutao commentedon Aug 5, 2026
分诊(cli 车道 PM,session_01VkPSGsX9o17MsGv3Lbxu2w,2026-08-05):入队
pm:queue,留给下一任 PM 派发。判据:注释自己排期的条件(「翻转落地后此处必须响亮」)已发生 —— 声明式端点在无setFallbackHandler的传输上静默不可服务,唯一信号是默认级别不打印的debug,属「Absence must be loud」的恢复不变量类,直接修。方向:debug升warn(一行 + 钉级别的测试,参照 #5226 的「级别由门禁焊住」姿态);相邻加重因素 #5122(HttpServer 包装器丢弃可选成员)派发时写进派发词。维护者可否决。Generated by Claude Code
baozhoutao commentedon Aug 5, 2026
认领:PM 循环第 1 轮(cli 车道)
会话:
session_016FNvXhtSdnEGEfLEsMmvxh分支:
claude/issue-5400-dispatcher-fallback-warnWorktree:
objectstack-issue-5400域:
domain:cli文件面:
packages/runtime/src/dispatcher-plugin.ts+packages/runtime/test/**(钉级别测试);⛔ 不碰 #5122 的HttpServer包装器本体(相邻但独立,另单处理)执行口径沿 08:14Z 分诊裁定:
debug升warn一行,文案带后果(该传输上 metadata 声明的apis:端点全部不会被服务)与补救(换用暴露setFallbackHandler的适配器),不升error;加钉级别测试(参照 #5226「级别由门禁焊住」姿态)。同日 churn 注记:#5404(#5399)今晨已改写本单目标注释,以origin/main(4b61cf3)为准,issue 引用的f417863fc片段已过时。Generated by Claude Code
baozhoutao commentedon Aug 5, 2026
验收(cli 车道 PM,
session_016FNvXhtSdnEGEfLEsMmvxh):ACCEPT → PR #5409。origin/main(4b61cf3)逐条重核(issue 引用的f417863fc已被 docs(runtime,metadata,rest): 摘除已失真的「structurally unreachable until the E7 flip」注释族 + 多租户 decline 分支补零覆盖 (#5399) #5404 改写,churn 注记生效)。debug升warn一行,文案带后果(metadata 声明的apis:端点在该传输上全部不可达、只回裸 404)与补救(换用实现setFallbackHandler的适配器);按「Degradation log levels」判据留在warn不升error(无持久化承诺,功能性降级)。附结构化 meta 便于机读。objectstack dev --fresh上 sys_audit_log 表不存在 —— 每次元数据写入都以 ERROR + 「Audit write failed」告终,审计轨迹静默丢失 #5226 姿态):退回debug红、误升error也红,合规适配器静默的反例钉住「信号而非噪音」;反向验证方向事前预测、实测命中(两方向各 4 failed | 1 passed)。runtime导出的HttpServer包装器静默丢弃IHttpServer的全部可选成员(getPort/getRawApp/setFallbackHandler) #5122 包装器本体未触碰,过期注释一并改写为翻转后真话。下一步:CI 全绿后转 ready 并入合并队列,跟到 MERGED。
Generated by Claude Code
docs(runtime,metadata,rest): retire the expired "structurally unreach…
fix(runtime): 无 `setFallbackHandler` 的适配器改以 `warn` 宣告声明式端点不可达 (object…