From d8e44c6692d2431fccc46fb791e42661d52dd1d0 Mon Sep 17 00:00:00 2001 From: AskaEth Date: Tue, 6 Oct 2026 19:00:03 +0800 Subject: [PATCH] =?UTF-8?q?docs(05):=20=E9=94=9A=E7=82=B9=E8=A1=A5?= =?UTF-8?q?=E8=AE=B0=E4=B8=89=E5=8D=81=E4=B8=80=20=E2=80=94=E2=80=94=20W53?= =?UTF-8?q?=20=E5=9B=9B=E9=A1=B9=E8=90=BD=E5=9C=B0=EF=BC=88=E5=90=8E?= =?UTF-8?q?=E5=8F=B0=E9=80=9A=E7=9F=A5/=E9=80=80=E5=87=BA=E7=A1=AE?= =?UTF-8?q?=E8=AE=A4=E6=A1=86/=E4=BF=9D=E6=B4=BB=E6=96=87=E6=A1=88?= =?UTF-8?q?=E4=B8=8E=E5=85=A5=E5=8F=A3/=E5=88=86=E4=BA=AB=E7=A1=AE?= =?UTF-8?q?=E8=AE=A4=E9=9D=A2=E6=9D=BF=EF=BC=89+=20=E7=9C=9F=E6=9C=BA?= =?UTF-8?q?=E9=AA=8C=E6=94=B6=E5=85=A8=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 三支各自的机制与判据要点,含两条「子代理纠正任务书」的记录(Miuix 0.9.3 没有 extra.* 包; proactive 判据后端放在 data 里而不是帧壳顶层——我读后端源码核过)+ 我自己补的那处 (AppPresence 补同源 StateFlow 当 key,修「去系统设置授权后回来服务没起」)。 - 真机验收逐条证据(后台通知的形状与点它回主会话、退出确认框、保活文案与「去系统设置」、 分享面板确实没被直接发出、INTERNET 来源是源码)。 - 仍未验/已知缺口如实列出(两条路去重只有单测、通知 id 覆盖、Activity 销毁后收不到帧、 转屏丢已取走的分享、S4 对照组没跑干净)。 --- devdocs/05-开发进度与交接.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/devdocs/05-开发进度与交接.md b/devdocs/05-开发进度与交接.md index 136677b..ce24ded 100644 --- a/devdocs/05-开发进度与交接.md +++ b/devdocs/05-开发进度与交接.md @@ -1661,3 +1661,34 @@ S2 我第一次测出「没生效」,差点去改代码——真因是**设备 **主人要的**:像其他 IM 一样给一个**确认面板** —— ① **能预览**支持的文件(图片缩略图 / 文件名字与大小);② 下方一个**输入框**让用户附上文字描述;③ 由用户点「发送」才真的发出去(可取消)。 **指派**:`W53X`(与 W53N/W53S 并行;它只许在 `ChatScreen.kt` 的分享落地那一小段动刀,其余放新文件)。 **边界**:不动 `shareLanding` / `shareNoticeFor` / `shareWaitingNotice` 的语义,不动 `sendShared` 的「超长文本走文件」那条(主人当时的裁决),不发则不 take 之前的内容——**take 只许发生一次**(否则 effect 重跑会重复弹面板)。 + +--- + +## ★★ 锚点补记三十一 · W53 落地(主人拍板那批 + 分享确认面板)——**均已合并推送,真机验收全过** + +### 1. 代码(`53c7494` / `6505512` / `62f552f` / `77fbedc`,均已推) +主树全量 `--rerun` **真跑**:**110 suite / 1330 tests / 0 失败 / 0 error**(基线 1270 ⇒ +60)。三支的 worktree/分支已清、锁已放。 +- **W53N(后台通知,只做「她主动说的话」这一档)**:**读回**被丢掉的 `proactive` 判据(**核过后端**:它在帧的 **`data`** 里而不是帧壳顶层 —— `broadcast.go:44-49`;客户端两层都读,两种说法都吃得住);纯判据 `shouldNotifyProactive(inForeground, viewingTargetSession)` =「这条此刻会不会正好被看到」;去重账本(进程级、容量 64、键 = 落库行 id > IM 消息号 > 时间字面量 > 正文);点通知 ⇒ 打开 App 并切主会话;**渠道 `proactive`(DEFAULT)、通知 id=2**,与保活的 `keep_alive`(id=1) 分开。 +- **W53S(设置页两件)**:退出登录加 **Miuix `OverlayDialog`** 确认框(⚠️ **更正我任务书里的错**:Miuix 0.9.3 **没有** `extra.*` 包,对话框只有 `overlay.*` / `window.*` 两族);保活那行补「**24 小时内累计最多 6 小时**」+ 权限被拒/被撤时给「去系统设置」(`ACTION_APP_NOTIFICATION_SETTINGS` + 兜底 `ACTION_APPLICATION_DETAILS_SETTINGS`)。 +- **W53X(分享确认面板)**:分享进来**不再直接发**,弹面板(图片缩略图 / 文件 chip(复用 `DocumentChipRow`)/ 可附文字的输入框(预填分享自带的文本)/ 发送·取消);用 **`window.WindowDialog`**(⚠️ 硬理由已写进 KDoc:`OverlayDialog` 需要 Miuix `Scaffold` 提供的 composition local,而它的调用点在 `ChatScreen` 的 Scaffold **外面** ⇒ 会「不报错也不显示」);`take()` 只发生一次(effect 的键里加了 `shareConfirm == null`,面板关掉后自动接上下一条)。 +- **我自己补的一处**(`77fbedc`):W53S 标出的「去系统设置授权后回来,UI 说已开而服务其实没起」——给 `AppPresence` 补一条与 `appInForeground` **同源**的 StateFlow,让 `CyreneApp` 那个起停 effect 收它当 key(「回到前台」正是从系统设置返回必经、且必然变化的那一位)。**没加任何依赖**。 + +### 2. 真机验收(`emulator-5554` + 假后端) +| 项 | 证据 | +|---|---| +| **后台通知** | App 切后台 ⇒ 注入 `proactive_message` ⇒ `NotificationRecord(pkg=top.yeij.cyrene, id=2, channel=proactive, category=msg, AUTO_CANCEL)`;通知栏显示「Cyrene / 昔涟 / 通知验收:她主动说了一句」 | +| **点通知** | 点它 ⇒ 回前台,且**聊天页正是主会话、那条主动消息就在屏幕上**(带「发送至 网页」) | +| **退出确认框** | 点条目 ⇒ `退出登录?` +「退出后本机会清空登录信息(服务器地址也要重填),需要重新登录」+ 取消/退出登录;取消后仍在设置页、**没登出** | +| **保活文案与入口** | 开着时含「24 小时内累计最多 6 小时,用满会被停下」;**撤掉权限后**文案变「通知权限现在是关的,服务起不来…」+ 出现**「去系统设置」**按钮 | +| **保活服务**(上批欠的) | 开 ⇒ `isForeground=true`、`types=dataSync`、`channel=keep_alive`、静音常驻;关 ⇒ 服务停;13+ 权限弹窗真实 | +| **分享确认面板** | 外部 `ACTION_SEND` 分享一段文字 ⇒ **对端上行流水里没有任何 chat 帧**(确实没被直接发出),而是弹出面板(标题「发送给昔涟」+「分享的文字」预览 + 预填的输入框 + 取消/发送) | +| **`INTERNET`** | `:app:processReleaseMainManifest` 的 merger 报告:`ADDED from app/src/main/AndroidManifest.xml` + `MERGED from [okhttp-android]` ⇒ **来源是源码** | + +### 3. 仍未验 / 已知缺口(如实) +- **「两条路只弹一次」只有单测**:真后端要走 IM 桥那条路由才会同时来两帧,本机造不出来。 +- **通知频率**:恒用 id=2 ⇒ 她连说几句时**后到的覆盖先到的**(KDoc 已写明;要「一事一条」得按 id 生成通知 id)。 +- **通知挂在 `SessionsViewModel`(Activity 存活期内)**:Activity 被销毁而进程被前台服务保活那一档(例如从最近任务划掉)收不到帧 ⇒ 不弹(要覆盖得把订阅提到进程级)。 +- **转屏会静默丢掉「已取走」的那份分享**(面板状态是 `remember(sessionId)`,`take()` 不可逆)——W53X 列了两条更糟的修法,我没动;要收口得把状态挪进 VM。 +- **面板里正文出现两次**(预览 3 行 + 输入框预填):W53X 问要不要删掉预览那块,**我的建议是删**(输入框已经显示且可编辑),一处小改即可 —— **等主人一句话**。 +- **S4 回收**:正向证据有了(超 3 格后回到最早的次级 ⇒ 重新拉一次 `messages`);**对照组没跑干净**(我几次点击没落到达标的抽屉行上),如实标注。 +- 给后端的一条(不影响我们):他们的注释写 `proactive` 是「帧顶」,代码实际放在 `data` 里(`broadcast.go:49`)——**我们两层都读,所以都能用**,但他们的注释值得对一下。