From e60ae7aeccc4a6ce5783a51d118d81d072adaa8a Mon Sep 17 00:00:00 2001 From: AskaEth Date: Mon, 5 Oct 2026 13:43:01 +0800 Subject: [PATCH] =?UTF-8?q?docs(05):=20=E9=94=9A=E7=82=B9=E8=A1=A5?= =?UTF-8?q?=E8=AE=B0=E5=8D=81=E2=80=94=E2=80=94W39=20=E4=B8=89=E5=A4=84?= =?UTF-8?q?=E6=8E=AA=E8=BE=9E=E4=B8=8D=E8=AF=9A=E5=AE=9E=E5=B7=B2=E4=BF=AE?= =?UTF-8?q?=EF=BC=88=E5=91=8A=E7=9F=A5=E4=B8=8D=E5=86=8D=E4=B8=A4=E5=8F=A5?= =?UTF-8?q?=E5=8F=A0=E5=8A=A0=20/=20=E6=9C=AA=E8=BF=9E=E6=8E=A5=E4=B8=8E?= =?UTF-8?q?=E5=8F=91=E5=A4=B1=E8=B4=A5=E5=88=86=E5=BC=80=E8=AF=B4=20/=20Of?= =?UTF-8?q?fline=20=E4=B8=8D=E5=86=8D=E6=89=BF=E8=AF=BA=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=8F=91=E5=87=BA=EF=BC=89=EF=BC=8C=E5=B9=B6=E7=99=BB=E8=AE=B0?= =?UTF-8?q?=E4=B8=A4=E5=A4=84=E5=88=BB=E6=84=8F=E6=9C=AA=E5=81=9A=E4=B8=8E?= =?UTF-8?q?=E4=B8=80=E6=9D=A1=E4=B8=BB=E4=BA=BA=E5=AE=9A=E6=A1=88=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- devdocs/05-开发进度与交接.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/devdocs/05-开发进度与交接.md b/devdocs/05-开发进度与交接.md index 8ccf55a..6ee96c7 100644 --- a/devdocs/05-开发进度与交接.md +++ b/devdocs/05-开发进度与交接.md @@ -840,3 +840,33 @@ curl -s -X PATCH "$BASE/api/v1/sessions/$SID" -H "Authorization: Bearer $TOK" \ > 3. W38 子代理提的三条后续(**未做,待主人定**):① `deliver` 在 WS 未就绪时对**输入栏那条路**仍一律 `rollback(…, "发送失败,请重试")`(「未就绪」与「发失败」仍是两件事);② `WsState.Offline`(不可恢复)目前也走「等 + 连上后自动发出」,会一直等一句永不到来的「连上」,可改成「需要重新登录 / 检查服务器地址」;③ 待发内容只在进程内存里,一直连不上且进程被杀就丢(既有语义)。 > 4. **`02` 的 §四/回执十九 仍以「修法方向」口吻描述这处缺陷** —— 下次动 `02` 时补一句「已修 `aeb3745`」(本次没动它,避免与后端会话的在途追加打架)。 > 5. 旧账:子会话流程(主人搁置)、图片/工具卡实机验证(后端未配工具)、**相册多选→分享**(图片路径仍需真机)。 + +> ## ★★ 锚点补记十(2026-10-05 夜 · W39 三处「措辞不诚实」已修) +> +> ### 状态 +> - `android` = `origin/android` = **`b55d220`**(W39 合并提交;分支提交 `a763592`);主树 **1101 测试 / 0 失败 / 0 错误**。W39 worktree 已清。 +> - ⚠️ **本批只有单测与编译证据,没有真机回归**(真机那三条留给下次或主人)。 +> +> ### ① 分享告知「两句叠加」已消 +> **改前实机原文**:「有 2 个文件读不到,未发送**;**分享的内容是空的,没有可发送的内容」——读起来像两个不同的问题。 +> **改法**:`shareNoticeFor` 里新增 `hasFailedPieces = failedImages > 0 || failedDocuments > 0`,`isEmpty` 那档改成 `isEmpty && !hasFailedPieces`(`ChatScreen.kt:997` / `1002`)。丢件那句**逐字未改**。 +> ⚠️ **子代理发现的事实(值得记)**:加了这个前提之后,「分享的内容是空的」这句**一次都不会再出现**——因为 `worthDelivering` 要求 `isEmpty` 的分享必须带丢件计数或 `contentUnreadable`,而后者已被「读不进来」那档接走。分支**保留并在 KDoc 里写明它已无出口**(没删,避免猜错路径时反而丢告知)。 +> +> ### ② `deliver`:未连接与发送失败分开说(**只改文案,行为不变**) +> - 新常量:`SEND_FAILED_MESSAGE = "发送失败,请重试"`(逐字不变)、`SEND_NOT_CONNECTED_MESSAGE = "还没连上,这条没发出去,请稍后手动重试"`。 +> - 新纯函数 `sendFailureMessage(connection: WsState)`:`Connected` 一句、其余四档另一句;`SendFailureMessageTest` 覆盖 `WsState.entries` 全部。 +> - 接线处取的是 **socket 自己的 `state`**(正是 `sendChat` 判的那个值),**不用界面镜像那格**,避免晚一帧读成 `Connected`。回滚、幂等键、**无自动重发**全部照旧。 +> - ⚠️ **没做**(单列,等主人定案):让「未就绪」像 W38 的分享那样**不取走内容、等连上再发**。那会改变普通发送的重试语义(未连接时是留在输入栏,还是自动排队重发),属产品定案。 +> +> ### ③ `WsState.Offline` 不再承诺「连上后自动发出」 +> - `ShareLanding` 加 `TellOffline`(**时机一字未改**:仍是等够久才说、同一轮只说一次,只换措辞);新纯函数 `shareWaitingNotice(landing)` 决定哪档说哪句,Compose effect 只剩一行接线。 +> - 文案:`SHARE_OFFLINE_NOTICE = "现在处于离线,需要重新登录或检查服务器地址;分享的内容一个字节都没发出去,不会丢"` —— **不含**「连上」「自动发」「失败」。 +> - 仍**不 `take()`、不发送**;恢复 `Connected` 后照旧自动补发(W38 的硬要求未动)。 +> - ⚠️ **没做**:`Offline` 时**立刻**告知(现在仍等 `SHARE_WAIT_NOTICE_MILLIS`)。属独立改动。 +> +> ### 待办(更新) +> 1. **主人定案项**:普通发送在「未连接」时该不该也自动排队重发(现在是留在输入栏 + 诚实文案)。 +> 2. **未纳入新判据的一处字面量**:`ChatViewModel.kt:1552`(REST 回执被拒那条路)仍是 `rejected.message.ifBlank { "发送失败,请重试" }`,刻意未动。 +> 3. `Offline` 立刻告知(不等 3 秒)。 +> 4. **W38/W39 的真机回归**:W38 已验(补记九);W39 这三条只在真机上扫一眼即可(触发条件都少见)。 +> 5. 旧账:子会话流程(主人搁置)、图片/工具卡实机验证(后端未配工具)、**相册多选→分享**(图片路径仍需真机;App 一个权限都没声明 ⇒ adb 造不出可读 URI,这条**只能**走真机或驱动相册 UI)。