docs(05): 锚点补记十五——W43(中性文案逐字 + 重试静默的阈值/记账/清零口径与一处待过目边界)、主人四条裁决的落点、以及一次没跑成的 W41 回归(如实记为未验证,附可复用的 WS 拦截代理与教训)

This commit is contained in:
AskaEth committed 2026-10-05 15:23:04 +08:00
1 parent 3c1d3fd44c
commit 4460ca9277
1 file changed
+39
+39
View File
@@ -1010,3 +1010,42 @@ curl -s -X PATCH "$BASE/api/v1/sessions/$SID" -H "Authorization: Bearer $TOK" \
> ### 待办(本节的)
> 1. **W42 真机**:多选器交互、输入栏那排缩略图观感、N 张落成 N 条的落库形态(模拟器或真机都行)。
> 2. 上一条那两个决定等主人一句话。
> ## ★★ 锚点补记十五(2026-10-06 · W43 + W41/W42 的拍板结果 + 一次**没跑成**的回归)
>
> ### 状态
> `android` = `origin/android` = **`3c1d3fd`**(W43 合并提交;分支提交 `5556573`);主树 **1150 测试 / 0 失败 / 0 错误**。worktree 只剩主树。
>
> ### 主人 2026-10-06 的四条裁决
> | 指令 | 落点 |
> |---|---|
> | N≥2 时「忙时发消息」偏好只套第一条 ⇒ **按我推荐** | **保留现状**(唯一不会「打断自己刚起的上一轮」的选项) |
> | 超限文案改中性 ⇒ **按我推荐** | W43 已改(见下) |
> | 跑 W41 回归 | **没跑成**(见下,是操作问题) |
> | 长文/图片/附件的 REST 失败**放着不做**;但加一条:**多次重试失败就静默** | W43 已实现 |
>
> ### ① 超限告知新文案(**逐字**,两处共用同一句)
> ```
> 一次最多 4 张,超出的没发,只发送前 3 张
> ```
> (`$MAX_IMAGES` / `$kept` 插值;`dropped == 0` 时仍回 `null`。)说清三件事:上限 4 张、超出的没发、发出去的是前 N 张;**无**「失败」「错误」,**无**「分享」。
>
> ### ②「多次重试失败就静默」
> - **阈值 3**(`QUEUED_RESEND_SILENCE_THRESHOLD`,`ui/chat/SendQueue.kt`):第 1 次失败必说,2、3 次仍允许说,之后不再说(取 1~2 等于没告知,故禁止)。
> - **记账口径**:本会话的一个**补发批次**(队列从空到非空那一段),落在 VM 实例字段 ⇒ 天然按会话,**无全局单例**。只计「补发没能上路、内容仍留在队列里」那种失败。
> - **清零**:补发**真的成功一次**就归零(`dropQueuedSend(sent = true)`);回滚/被收编那两种出队**不**清零。
> - **静默 ≠ 丢弃**:这个数只进告知判据,`queuedForConnection` / `nextQueuedSend` / 出队逻辑一行未动;连接一好照旧按序补发(同一个 `clientMsgId`)。测试 `silence never touches the queue` 钉住。
> - ⚠️ **一处要主人过目的边界**(子代理主动交代):**静默一旦生效会持续到某次补发真正成功**,不是「每轮结束就恢复」;期间气泡的「排队中 · 还没连上」小标照常可见。要改成「每轮结束恢复告知」只改一行(清零点从 `sent=true` 移到 `forgetQueuedNoticeIfDrained`)。
>
> ### ⛔ W41 的真机回归:**没跑成**(如实记,结论是「未验证」)
> **场景造出来了,而且判据很干净**:我写了个只掐 `/ws/chat` 的窄代理 `app/build/e2e-shots/ws_block_proxy.py`,`adb reverse tcp:10942 tcp:18098` 把 App 引过去。代理日志证明:
> - `BLOCKED GET /ws/chat?token=…` ×9(**WS 确实断了**,App 在退避重试)
> - `PASS GET /api/v1/sessions/web/messages?limit=50 / meta/enums / sessions / personas -> 200`(**HTTP 确实通**)
>
> **但代理日志里一条 `/api/v1/health` 都没有** ⇒ **App 从来没探过健康端点** ⇒ **消息压根没发出去,三级阶梯一次都没被触发**。
> 原因**在我**:第一次软键盘是弹着的(布局上移,坐标落到键盘上);第二次禁用 IME 后重试仍未命中(大概率输入框没拿到焦点,而我没先确认就复用了坐标)。
> ⇒ **不能写成「通过」,也不能写成「失败」——它是「未验证」。**
>
> **可复用资产与教训**:
> - **`ws_block_proxy.py` 值得留着**:因为 **Web 前端直连 127.0.0.1:10942、不经过 `adb reverse`**,所以**代理日志里的每一行都只可能来自 App** —— 这是分辨「App 到底发了什么」的最干净判据。
> - **打字前必须先截图确认输入框已聚焦**,别复用坐标(这条我今天栽了两次;补记八第 1 条的黑屏坑是同一类)。