⛔ Block discharged 2026-09-11T12:15Z — moved to needs-user-decision, which is what this card’s own ## 推荐 asked for.
⚠️ The Blocked-by: line in this body was — (an em-dash, naming no target) for the whole time the card was pm:blocked. The real target lived in a comment (5578193799, Blocked-by: #16335), which the unlock scan reads but a body-only reader does not. ⇒ the body line is replaced by this note rather than left as a dash that says nothing. #16335 closed completed 2026-09-09T22:36:24Z.
维护者速读
事情 — 没装 service-messaging 的部署上,GET /api/v1/notifications 按设计应答 501 NOT_IMPLEMENTED(意思是「这个部署没装这个可选服务」,不是「坏了」)。Studio 会轮询这个接口,而 #14310 的裁决要求每个 5xx 都记一条 error 日志 —— 所以每次轮询都打一行 error。
为什么现在问 — 本卡原先压在 #16335 上,它已于 2026-09-09 落地并且恰好补上了选项 B 缺的那一块:信封现在有了「生产者声明这是一次刻意拒绝」的机器可读标记(declaredServerFaultAnswer,两扇门共读)。⇒ 当初写下「B 需要一个两扇门共读的定义,中途发明它就是本仓反复付费修的逐门分叉」时,那个定义不存在;现在存在了,所以 B 从「要先发明一个谓词」变成了「读一个已有的标记」。
三个选项(卡上有完整四维分析)
- A — 保持现状(已发货):字面执行裁决,每个 5xx 都记。代价是声明式 501/503 在轮询路由上逐请求刷 error,可能把这条刚建立的日志通道训练成运维忽略的噪音。
- B — 把「声明式能力缺席」排除在响亮之外,其余一律响亮。⚠️ 现在可做且不需新发明。
- C — 声明式缺席按 route 每进程只记一次(去重):保留信号、压掉体量。
风险不对称 — 噪音可达但尚未在真实部署上量到(当初只证明了路径存在);而 A 已经修掉的是一个真实 P1(500 零日志)。⇒ 不动的代价是日志噪音,动错的代价是把刚修好的信号又弄哑。
⇒ 请裁一个字母:A(维持现状)、B(排除声明式缺席)还是 C(每进程去重)?
背景
#14310 的裁决是「4xx may stay quiet; 5xx never」,PR #14654 按字面实现:每个 5xx 信封在唯一漏斗 logServerFault 记一条 error 级日志。dev 实测到一个可达后果:没有安装 service-messaging 的部署上,GET /api/v1/notifications 应答声明式 501 NOT_IMPLEMENTED,而 Studio 会轮询它 —— 于是每次轮询都打一行 error。这条日志通道是本卡刚建立的,让它逐请求叫狼可能把它训练成运维会忽略的噪音。
选项
- A(已发货):字面执行,每个 5xx 都记。零发明,与裁决一致;代价是声明式 501/503 在轮询路由上的逐请求噪音。
- B:排除「声明式能力缺席」(NOT_IMPLEMENTED / SERVICE_UNAVAILABLE 回答的是配置事实而非故障),其余一律响亮。
packages/rest 已有先例:isExpectedRouteError 把 502/503 当正常生命周期结果。需要一个两扇门共读的「声明式缺席」定义。
- C:声明式缺席按 route 每进程只记一次(去重),保留信号、压掉体量。
四维分析
- 实际业务需求:噪音可达但未在真实部署上量到(dev 只证明了路径存在);今天没有用户被它伤到。有拉动的是 A 已经修掉的 P1(500 零日志)。
- 项目长远合理性(≥50%):B 是原则上的终态 —— 「这个部署没装可选服务」是配置事实不是故障,逐轮询叫狼的通道最终退化回沉默;但 B 需要一个两扇门(REST / 派发器)共读的谓词,在修复中途发明它正是本仓反复付费修的「逐门分叉」。
- 防 AI 犯错:中性;若做 B,谓词必须住在
@objectstack/types 与 logServerFault 同家,⛔ 不在任一门里各写一份。
- 创业阶段不扩散:无拉动不新增第二个谓词;A 先落地,B/C 等到噪音被观测到再做。
推荐
维持 A 落地(PR #14654),本卡挂 needs-user-decision 等维护者裁 B 或 C 的时机;若裁 B,作为独立卡派发,谓词落在 types 包与漏斗同家并带两扇门的一致性 pin。
Source: os-dev report on #14310 (open question 1).
Generated by Claude Code
⛔ Block discharged 2026-09-11T12:15Z — moved to
needs-user-decision, which is what this card’s own## 推荐asked for.Blocked-by:line in this body was—(an em-dash, naming no target) for the whole time the card waspm:blocked. The real target lived in a comment (5578193799,Blocked-by: #16335), which the unlock scan reads but a body-only reader does not. ⇒ the body line is replaced by this note rather than left as a dash that says nothing. #16335 closedcompleted2026-09-09T22:36:24Z.维护者速读
事情 — 没装
service-messaging的部署上,GET /api/v1/notifications按设计应答 501 NOT_IMPLEMENTED(意思是「这个部署没装这个可选服务」,不是「坏了」)。Studio 会轮询这个接口,而 #14310 的裁决要求每个 5xx 都记一条 error 日志 —— 所以每次轮询都打一行 error。为什么现在问 — 本卡原先压在 #16335 上,它已于 2026-09-09 落地并且恰好补上了选项 B 缺的那一块:信封现在有了「生产者声明这是一次刻意拒绝」的机器可读标记(
declaredServerFaultAnswer,两扇门共读)。⇒ 当初写下「B 需要一个两扇门共读的定义,中途发明它就是本仓反复付费修的逐门分叉」时,那个定义不存在;现在存在了,所以 B 从「要先发明一个谓词」变成了「读一个已有的标记」。三个选项(卡上有完整四维分析)
风险不对称 — 噪音可达但尚未在真实部署上量到(当初只证明了路径存在);而 A 已经修掉的是一个真实 P1(500 零日志)。⇒ 不动的代价是日志噪音,动错的代价是把刚修好的信号又弄哑。
⇒ 请裁一个字母:A(维持现状)、B(排除声明式缺席)还是 C(每进程去重)?
背景
#14310 的裁决是「4xx may stay quiet; 5xx never」,PR #14654 按字面实现:每个 5xx 信封在唯一漏斗
logServerFault记一条 error 级日志。dev 实测到一个可达后果:没有安装service-messaging的部署上,GET /api/v1/notifications应答声明式 501 NOT_IMPLEMENTED,而 Studio 会轮询它 —— 于是每次轮询都打一行 error。这条日志通道是本卡刚建立的,让它逐请求叫狼可能把它训练成运维会忽略的噪音。选项
packages/rest已有先例:isExpectedRouteError把 502/503 当正常生命周期结果。需要一个两扇门共读的「声明式缺席」定义。四维分析
@objectstack/types与logServerFault同家,⛔ 不在任一门里各写一份。推荐
维持 A 落地(PR #14654),本卡挂
needs-user-decision等维护者裁 B 或 C 的时机;若裁 B,作为独立卡派发,谓词落在 types 包与漏斗同家并带两扇门的一致性 pin。Source: os-dev report on #14310 (open question 1).
Generated by Claude Code