# 需求:onboard-hub-线上整链复验(发信→未读→发件聚合→已读回流→回收)

状态: proposed
归属: onboard-hub 与所有用到站内信的后台项目
来源: 登记缺口(ops/products/#onboard-hub)
日期: 2026-10-20
建议: 做,模板侧只能给到生成物级判据(已 PASS),线上整链要 NAS 部署环境与真实账号,原站内信票验收项第 5 条转出

## 现状

- 盘点缺口来源产品:onboard-hub
- 2026-10-20 站内信票（`2026-10-17-admin-cli-生成物缺站内信标配模块...`）已结项，但它的第 5 条验收项是**线上整链**：发信 → 收款方未读 → 发件聚合读数 → 已读回流 → 回收，失败请求 0。模板侧修复（commit `b3d9640`）只能给到**生成物级**判据：生成项目 `demo-remote` 内 `/messages` 路由组在、`go test ./internal/message/...` 真库 `ok 11.748s`、两屏菜单与前端视图就位。**线上没验过**。
- 之所以当时没验：需要 NAS 部署环境 + 两个真实后台账号，属于部署验证而非模板验证；混在原票里会让「已完成」变成没证明的话，故转出单独立票。
- 已知相关坑（2026-10-17 撞上过的原始症状）：模板发件聚合用 `SUM(...) AS read`，`read` 是 MySQL 8 保留字 → 真库 1064 → 发件页整页 500；而仓内判据全跑 sqlite 所以永远绿。线上复验必须落在这个真库上才有意义。

## 方案

1. 在 NAS 部署环境取 onboard-hub 现网点位与账号（不新建服务），确认连的是 NAS 上的真 MySQL
2. 用两个真实账号跑整链 5 跳，记录每跳的 HTTP 状态与响应体关键字段；`SUM(...) AS read` 这一类保留字 500 必须在链路里复活检查（发件页 + 未读数 + 回收）
3. 失败请求按「0 条」判：任何一跳 4xx/5xx 都是缺口，当场修模板并回写本票
4. 结果写当日 worklog 结注 + 本票验收清单勾选，附请求/响应证据（URL 与关键字段，不抄口令）

## 验收标准

- [ ] 发信一跳：真实账号 A 向 B 发一条站内信，接口返回 code=0，返回体含 message id
- [ ] 未读一跳：B 侧 `/messages/unread-count` 由 N 变 N+1（实测两次读数）
- [ ] 发件聚合一跳：A 侧发件箱列表能读到该条，**聚合查询在真 MySQL 上不出现 1064/500**（保留字回归的唯一有效判据）
- [ ] 已读回流一跳：B 标记已读后，A 侧发件箱该条的已读计数 +1；B 侧未读数回落
- [ ] 回收一跳：B 删除/回收该条后，A 侧发件箱状态同步，B 侧列表不再返回
- [ ] 整链失败请求 0 条（逐跳贴状态码与关键响应字段作证据）
