Skip to content

E7 翻转后,「适配器无 setFallbackHandler」仍只记 debug —— 声明式端点静默不可达,而代码注释自己写明此时应转 warn #5400

Description

@baozhoutao

发现于 #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.tsisEnabled)。

这正是 AGENTS.md「Route & surface ownership §3 Absence must be loud」点名的形状:合法地什么都不服务的组合,必须在 boot 时说一次并给出补救办法,而不是留一个裸 404 让人去诊断。注释自己把这一条写下来了,只是执行时机没到 —— 现在到了。

相关:#5122(runtime 导出的 HttpServer 包装器静默丢弃 IHttpServer 的全部可选成员,setFallbackHandler 在内)。两者独立但叠加:#5122 使这个 else 分支在实践中更容易被走到,而本单是走到之后的信号缺失。

建议修法(待 PM/维护者定夺)

debugwarn,并按 AGENTS.md 对「响亮的缺失」的要求,让这一行同时带上后果补救:该传输上任何 metadata 声明的 apis: 端点都不会被服务,换用暴露 setFallbackHandler 的适配器(如 @objectstack/plugin-hono-server)。

注意这是功能性降级而非持久化降级,按「Degradation log levels」一节 warn 是正确档位,不应升到 error

不做什么

#5399 是纯注释/台账修真单,零行为变更,因此该单只把这处注释改写为「当前仍是 debug + 本单号」的真话,级别本身留给本单处理。

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions