Skip to content

[Decision] Per-user notification locale —— 2026-08-13 裁决所等的「实测拉力」已到(hotcrm:4 个已发布语言 × 16 个 notify 节点 × 0 可本地化) #13881

Description

@huangyiirene

按维护者指示上行立卡(2026-08-31,hotcrm#1185 决裁,逐字:「1185 如果是平台的问题就去平台立卡片」)。

背景:两条既有裁决的交汇

第二条使第一条的目标不可达:投递路径每次通知只解析一个语言(payload.locale 在 fan-out 前插值一次,或部署默认),从不按收件人解析。service-messaging/src/email-channel.ts L86-99 自述此状并写明「a per-user locale, when it lands, plugs in here」。

实测拉力(hotcrm#1185 的 dev 停手报告 + PM 复核,两个独立车道同判)

  • hotcrm 发布 4 个语言(en / zh-CN / ja-JP / es-ES),16 个 notify 节点,0 个可本地化:zh-CN / ja-JP / es-ES 用户从每一条自动化(成单、SLA 违约、升级、任务提醒、合同到期…)收到英文通知;
  • 应用侧无路可走(实测):sys_user 无 locale 列且 protection.lock: 'full',应用加不了;sys_notification_preference 亦无;逐 flow 查偏好的绕行被测量排除(无偏好行用户会以字面量 "undefined" 作 locale 静默死信,严格差于现状)—— 且按 2026-08-31 应用仓三原则([ruled] 应用仓基本原则落编:阻塞是平台缺陷时,应用侧等待平台修复 —— ⛔ 不绕行、不半边落地(维护者 2026-08-31,判例 hotcrm#549) #13848)应用侧绕行本就 ⛔;
  • 独立佐证:objectstack#7684(QA 清单车道,2026-08-11 关闭)同测同判;spec 文档面漂移(docblock 承诺 per-recipient 而实现刻意不做)已另行立卡 objectstack#12178。

要裁的形状(两个候选,均插在 email-channel 预留的 seam 上)

  • A · sys_user.locale:一等公民;动 packages/spec/src/system 的用户面(better-auth 相邻面需核),条款②;
  • B · sys_user_preference 支撑的覆盖位:不动 sys_user;投递 fan-out 时按收件人解析(今天 payload.locale 是 fan-out 前单值 —— 两个形状都要求把解析点移到 per-recipient)。

公共要求:解析链 = 收件人 locale → 部署默认(缺失恒回退,⛔ 不得死信);与 TEMPLATE_* permanent 失败分类的交互写进设计;首个消费者 = hotcrm#1185(已改挂本卡,能力落地日退化为纯元数据转换)。

Refs: hotcrm#1185(拉力测量全records)· #9205 / PR #9224(模板通道)· #12178(文档漂移)· 2026-08-13 裁决(email-channel.ts 注记引用)。


Blocked-by: (resolved 2026-09-03T09:54Z — PR #14775 MERGED as 1401ae7; the #14832 hang was quarantined on main by PR #14871)
Unlock-action: (fired — PR #14775 merged 09:53Z)
(Added by the domain:spec seat 2026-09-03T05:00Z: work complete — PR #14775 review PASS 5519054527, kicked from the merge queue twice by the packages/cli run-dev-unbuilt-workspace.e2e.test.ts defect that survived its first fix (#14648 closed, successor #14832); re-check the PR when #14832 closes, do not re-dispatch.)


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions