2 Commits
2 changed files with 32 additions and 0 deletions

No files matched your search

+19
View File
@@ -610,3 +610,22 @@
4. 若你们认为**该开独立端点**而不是塞进消息 DTO,也说一声,我方按你们定的来。
**影响面(我方)**:目前 `ToolCard` 在「已落库消息」那条渲染路径上**是不可达代码**(已落库消息的渲染器签名里没有 tools 参数)。字段一到,我方接线即可;**不需要你们动客户端**。
---
## 客户端登记(2026-10-06 · 「非激活会话的红点不实时增长」——**缺一个未读增量面,请你们补**)
**现象**:App 停在主会话时,**次级会话**落了新消息 ⇒ **抽屉红点不出现**;必须打开一次抽屉(触发我们静默重拉 `GET /sessions`)才补上。
**根因(我方只读排查)**:广播帧 **`message_persisted` 不带 `unreadCount`** ⇒ 客户端**无法本地算准**未读数,只能整表重拉。
证据:我方 `ui/sessions/SessionsViewModel.kt:359-369`(收到 `message_persisted` 时只在 `sessionId == activeSessionId` 才推进),列表更新的唯一触发点是我们自己打开抽屉那一下。
**你们设计文档里也记着这条遗留**:`Cyrene_v2/DevDocs/design/16-会话持久化与主次级会话.md:103`(「非激活会话的红点不会实时增长……需产品决策」)。
**请你们补的**(形状你们定;缺席必须 = 老行为逐字不变):
1. 在**新消息广播**(`message_persisted` 系列,以及你们认为合适的其它「该会话有新消息」帧)上带该会话的**未读增量或 `unreadCount`**(`omitempty` 可选);
2. 语义要说清:它是**绝对未读数**还是**增量**、以**谁**的已读游标为基准(多端/多角色时别让两端互相清零);
3. 若你们认为「不该在广播里带」,另一个可选面是**批量查询**(一次问多个会话的未读),也比现在整表重拉省。
**我方现状(在办)**:先用**客户端自愈**顶着——收到非激活会话的新消息时**节流地静默重拉一次**列表(不是造数,只是缩短它出现的延迟)。**这不能替代你们的增量面**:它每次仍是一次完整 `GET /sessions`,会话多了会变贵。
**影响面(我方)**:抽屉红点滞后(用户以为没人说话)。**不需要你们动客户端。**
+13
View File
@@ -1338,3 +1338,16 @@ curl -s -X PATCH "$BASE/api/v1/sessions/$SID" -H "Authorization: Bearer $TOK" \
> 2. 打字后 **dump 并检查那段文字的 `bounds`**——判断它**在输入框里**(x 落在 275..845、y 被软键盘顶到 ~1293..1435)还是**已经成了列表里的气泡**(y < 2000)。这一步就是「发送到底触发了没有」的判据;
> 3. **不要复用发送键坐标**:软键盘会把整条输入栏顶高约 820px。本轮 `发送` 的真实 bounds 是 `[911,1333][1003,1399]`(不是无键盘时的 `[911,2166][1003,2232]`)⇒ **从 dump 里取 bounds 再点**。
> ⇒ 我今天在这个坑上栽了 4 次(黑屏、前台不是本 App、复用坐标、不确认文字落点)。**这四步之后,设备验证才算「可靠」。**
> ## ★★ 锚点补记二十三(2026-10-06 夜 · 两个子代理在飞 + S6 的契约缺口已登记)
>
> ### 在飞(都已派单,未合并)
> - **W48 `feat/W48-account-scoped-vm`**:① 修 **S1**(换账号/换服务器后聊天页仍显示上一环境的消息 —— 给 `ChatScreen` 的 VM key 加**账号指纹**,沿用 `SessionPreferences` 的 `baseUrl+username` 口径,**不回收旧 VM**);② 改掉 `ChatHomeScreen.kt:26-33` / `ChatScreen.kt:161-164` 那两处**写错的注释**(「VM 立刻被销毁」是错的,行为不动);③ 把 `ws_block_proxy.py` 从 gitignored 的 `app/build/e2e-shots/` **挪进 `devtools/ws-block-proxy/`** 并配 README(否则一次 `clean` 就没了)。
> - **W49 `feat/W49-inactive-unread`**:修 **S6** 的客户端一半 —— 收到**非激活会话**的 `message_persisted` 时**节流地静默重拉**列表,让红点在不开抽屉时也能出现;要求**节流 + trailing 语义**(最后一条之后必须还能再拉一次),且**不许**新写取数路径、不许 loading 闪烁。
>
> ### 已登记给后端(`02`,本轮)
> **S6 的契约缺口**:`message_persisted` **不带 `unreadCount`** ⇒ 客户端算不准未读、只能整表重拉。请他们在新消息广播上带**未读增量或 `unreadCount`**(`omitempty`,缺席=老行为),并说清是绝对值还是增量、以谁的已读游标为基准;或给一个**批量查询未读**的面。**我方自愈不能替代它**(每次仍是一次完整 `GET /sessions`,会话多了会变贵)。
> 顺带提了:这条他们自己的设计文档里也记着(`Cyrene_v2/DevDocs/design/16:103`)。
>
> ### 合并时的纪律(提醒下一轮的自己)
> 两个 worktree 的基线都是 `df8df67`;合并要**分别** `--no-ff` + 全量 `assembleDebug`/`testDebugUnitTest` + 当场 `rm -rf` + `git worktree prune`,并**核对主仓 `git status` 只有 `02` 那笔私有改动**(曾有子代理误写主仓)。