From 866a3c37cd767cbd17b70e15183e1897cf81b2af Mon Sep 17 00:00:00 2001 From: AskaEth Date: Mon, 5 Oct 2026 15:29:54 +0800 Subject: [PATCH] =?UTF-8?q?docs(05):=20=E8=A1=A5=E8=AE=B0=E5=8D=81?= =?UTF-8?q?=E4=BA=94=C2=B7=E8=A1=A5=E2=80=94=E2=80=94W41=20=E5=9B=9E?= =?UTF-8?q?=E5=BD=92=E9=87=8D=E8=B7=91=E6=88=90=E5=8A=9F=E5=B9=B6=E6=89=BE?= =?UTF-8?q?=E5=88=B0=E4=B8=80=E4=B8=AA=E7=9C=9F=E7=BC=BA=E5=8F=A3=EF=BC=9A?= =?UTF-8?q?WS=20=E6=96=AD/HTTP=20=E9=80=9A=E6=97=B6=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E8=BF=9B=E4=BA=86=E9=98=9F=E5=88=97=E8=80=8C=E4=B8=8D=E6=98=AF?= =?UTF-8?q?=E5=9B=9E=E8=90=BD=20REST=EF=BC=8C=E4=B8=94=E6=8E=A2=E6=B5=8B?= =?UTF-8?q?=E8=AF=B7=E6=B1=82=E6=A0=B9=E6=9C=AC=E6=B2=A1=E5=8F=91=E5=87=BA?= =?UTF-8?q?=EF=BC=88=E5=90=AB=20dump=20=E5=86=B3=E5=AE=9A=E6=80=A7?= =?UTF-8?q?=E5=88=A4=E6=8D=AE=E4=B8=8E=E4=B8=8B=E4=B8=80=E6=AD=A5=E8=AF=A5?= =?UTF-8?q?=E6=9F=A5=E7=9A=84=E4=BD=8D=E7=BD=AE=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- devdocs/05-开发进度与交接.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/devdocs/05-开发进度与交接.md b/devdocs/05-开发进度与交接.md index adb7155..754f3dc 100644 --- a/devdocs/05-开发进度与交接.md +++ b/devdocs/05-开发进度与交接.md @@ -1049,3 +1049,30 @@ curl -s -X PATCH "$BASE/api/v1/sessions/$SID" -H "Authorization: Bearer $TOK" \ > **可复用资产与教训**: > - **`ws_block_proxy.py` 值得留着**:因为 **Web 前端直连 127.0.0.1:10942、不经过 `adb reverse`**,所以**代理日志里的每一行都只可能来自 App** —— 这是分辨「App 到底发了什么」的最干净判据。 > - **打字前必须先截图确认输入框已聚焦**,别复用坐标(这条我今天栽了两次;补记八第 1 条的黑屏坑是同一类)。 + +> ### 🔴 补记十五·补(2026-10-06 · W41 回归**重跑成功**,并且**找到一个真缺口**) +> +> **场景复现成功**(`ws_block_proxy.py` + `adb reverse tcp:10942 tcp:18098`,表头显示「重连中…」而不是「离线」)。这次消息**真的发出去了**——但它**进了队列**,不是回落 REST。 +> +> **判据(`uiautomator dump` 原文,决定性)**: +> ``` +> text="" class="android.view.View" clickable="true" enabled="false" bounds="[867,2130][1047,2268]" +> └ text="发送" ← 按钮 disabled(因为草稿已清空) +> text="w41c" … bounds="[891,1916][1002,1970]" ← "w41c" 不在输入框,而是一条待发气泡 +> text="排队中 · 还没连上" … bounds="[792,2015][1024,2059]" ← 正是 W41 新增的角标 ⇒ 它进了 queuedForConnection +> EditText … 占位文案「和昔涟说点什么…」 ← 输入框是空的 +> ``` +> **代理日志(只可能来自 App)**:`BLOCKED /ws/chat` ×N、`sessions / messages / enums / personas` 全 200,**但一条 `/api/v1/health` 都没有**。 +> +> ### 结论 +> 1. **路由选了 `Queue` 而不是 `Rest`** —— 在「WS 断、HTTP 通……」这个**正是它为它而写**的场景里,三级阶梯**没有生效**。 +> 2. **探测请求根本没发出去**(代理日志一条都没有)。而表头是「重连中…」(`Reconnecting`)不是「离线」,按 `sendRouteFor` 判据**应该**去探测。 +> ⇒ **最可能:探测在「发出请求之前」就失败了**,被 `probeReachability` 外面的 `catch(Exception) → Unreachable` 兜住 ⇒ 落到 fail-closed 的 `Queue`。 +> ⇒ **下一步该查**:`data/api/ApiClientFactory.kt` 的 `createProbe`(它是否真能建出可用的 client?baseUrl / 拦截器 / `callTimeout` 是否与主链路一致?)与 `data/repository/ConnectivityRepository.probe` 的错误映射。 +> ⚠️ **HTTP 侧本身是通的**(`sessions`/`messages`/`enums`/`personas` 都 200 走过同一个代理)⇒ 不是「代理挡住了探测」。 +> 3. **这不是本轮新增的 bug**:W41 只在编译 + 纯判据单测层面验过(子代理明确说了没做真机)。**这正是「真机回归」存在的意义** —— 纯函数判据全绿,运行时接线却断了。 +> 4. 顺带坐实一条既有边界:那条被排进队列的消息在**我 `force-stop` 之后跟着没了**(队列只在进程内存里)——与 W40/W41 文档一致,不是新问题。 +> +> ### 另外两轮的失败原因(免得下次又猜) +> 第 1、2 轮之所以「什么都没发生」:**前台根本不是我们的 App,而是 `com.android.settings/.SubSettings`**(`dumpsys window` 看出来的)。所以我的点击全落在设置页上。 +> ⇒ 教训升级:**不只要确认输入框聚焦,还要先确认前台就是我们的 App**(`dumpsys window | grep mCurrentFocus`)。