# Bucket E — 通知链路 UAT 实跑

**优先级**：P1
**估时**：0.5 天 + UAT infra 配置时间

## 背景

PR #208 已经接入 IN_APP（DB-only），EmailAdapter 也存在并初始化（AWS SES Region us-west-2），但**生产/UAT SMTP 实跑没验过**。还有 DingTalk 通道未在 schema 中——需要决策。

## 范围

### 1. EMAIL 渠道 UAT 实跑
- [ ] UAT 配齐 `AWS_SES_*` env（access key / region）
- [ ] 触发一次审批通知（如 PENDING_APPROVAL → 通知审批人）
- [ ] 验证邮件实际投递到收件人
- [ ] notification_log 状态从 SENDING → SENT
- [ ] 失败路径：故意发到无效邮箱 → notification_log 状态 FAILED + retryCount

### 2. IN_APP 渠道前端消息中心
- [ ] 前端"消息中心"组件查询当前用户未读 notification_log（channel=IN_APP）
- [ ] 标记已读 endpoint
- [ ] 实时推送（可选：WebSocket 或轮询，决策点）
- [ ] 消息中心 i18n 双语

### 3. DingTalk 通道 — 决策 + 可选实现
**决策点**：你们实际有钉钉接入需求吗？
- ✅ 有 → 加入 NotificationChannel enum + DingTalkAdapter（webhook 方式）+ 配置注入
- ❌ 没真业务驱动 → **删掉文档承诺**，矩阵 #139 标 ❌（已实现部分回滚）

### 4. 触发场景验证
确认以下业务事件都触发通知：
- [ ] 审批人收到待办通知（提交时）
- [ ] 申请人收到结果通知（通过/驳回/撤回）
- [ ] CC 用户收到抄送通知
- [ ] 超时催办（如 #119 实现后）

## 交付物

- UAT 实跑报告
- 前端消息中心 UI（如未实现）
- DingTalk 决策记录到 `.learnings/`
- 矩阵 #138/#139/#140 状态最终确定

## 完成条件

- 至少 EMAIL + IN_APP 两通道 UAT 实跑通过
- DingTalk 决策落地（实现 or 移除）
- 删除本文件
