# 群 @ 联动私聊目录：桌面回接与回归

## 需求与本轮范围

群内我 @ 对方或对方 @ 我后，已有的对应私聊入口按最新互动更新预览和活动排序；仍遵守置顶和隐藏规则。收到的互动提醒以 Chat 权威计数为准，自己发出的 @ 不产生自己的未读。读原群消息后刷新对应互动计数，保留其他群互动和直接私聊未读。

仅修改桌面插件和固定端口 3098 的 Web 预览；没有修改或部署手机、Chat 后端，没有发送真实测试消息，没有自动创建私聊或恢复主动隐藏的入口。

## 修复的根因

1. 旧目录按完整 `sourceRef` 匹配互动。普通目录引用带备注名和目录元数据，互动引用带昵称；同一联系人因此变成两行，真实浏览器可见“狗才”的群互动卡片与“周鹏”的旧私聊卡片并存。现按账号绑定的 `sourceKey` 合并，标题保留备注名，选中态也用同一稳定身份。
2. 旧实现从 occurrence 明细最多读取 500 条，全部读完才更新；普通目录 revision 变化又会取消整个读取。现接入 `/api/v1/chats/interwoven/directory/query`，每位联系人的最新预览、排序和完整互动计数由 Chat 返回，不再累计首批明细猜未读。
3. 收发、群已读及权限失效没有完整接入侧栏互动刷新。现订阅既有失效通道，覆盖成功发送群 @、会话增量、消息变化、已读 ACK、成员/权限变化、重连及回到前台；单路请求合并密集事件，账号切换丢弃迟到结果。

## 接口与安全边界

- Host 内部只读入口：`private-interaction.directory`，页大小不超过 100；不接受浏览器指定用户身份或任意上游路径。
- 复用普通目录 bundle 解析、联系人头像引用和会话入口可见性校验。互动计数与普通私聊未读分开；不增加全局徽标重复计数、不修改原群/私聊已读游标。
- 范围仍为 `chat_group_mentions`，未覆盖旧 World 历史。没有现成私聊入口的联系人是否创建入口，仍由已有业务规则决定。
- 权限/读取失败不伪装为零未读；旧请求不能覆盖新事件、账号或阅读结果。

## 实际联调发现：版本稳定性仍需后端检查

2026-09-20 18:21–18:24，使用现有账号做只读查询：

- 最新一页能返回“周鹏”、17:46 的群 @ 预览与正确的零未读事实，页面可以正确去重和排序。
- 50 条分页时，首个成功请求耗时约 4996 ms；带返回的游标和版本读下一页，约 3133 ms 后得到 HTTP 409 `version_changed`。
- 随后的不带游标首屏请求也曾在约 4669 ms 后返回同样错误；再次首屏请求约 4771 ms 成功。不能据此断言没有真实业务状态变化，需后端核对快照日志。
- Chat 当前实现对全账号目录、关系、成员、策略和读游标做版本哈希，读取/装饰前后重验。请排查版本是否受无关更新或非确定性排序影响，检查 `facts/recheck/hydration` 阶段耗时，以及正常活跃账号能否稳定续页；不能取消权限复核来消除 409。

桌面处理：按合同使用 100 条页，先展示已成功的近期页；版本变化时有界重读第一页。持续续页冲突时，**再独立核验最新一页**，丢弃旧分页内容，并明确显示“较早群互动暂未加载，点击重试”。再次核验也失败则清除互动投影、保留普通目录并显示失败提示。不声称此时全目录已完整加载，也不把缓存当作新的权限事实。

## 验证

- 最终 3098 页面也读取到用户新发出的 18:32 “@狗才 测试再次”，在同一个“周鹏”备注名卡片显示“群名 · 我：…”；保留固定置顶排序，没有另建昵称卡片。
- 针对稳定身份、备注名、完整计数、自己发送不新增未读、直接消息优先、排除隐藏入口、分批发布、版本变化、重试、取消、跨账号迟到结果及实时失效补充自动回归。
- 同时回归“我的一天”新接口读取；编译/打包单独验证。
- 浏览器只读取现有业务消息验证卡片，没有通过真实发送或真实修改读游标制造测试数据。两端实时往返仍需双方安装同一修复版本后验收；其他端不会因更新本地 Web 预览而自动升级。
