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

Metadata

Metadata

Assignees

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions