Files
dsh_ai1net_server/交付物/手机接入-进度看板.md
admin c1b5e4d966 chore(工作区): 全量入库 + 补齐 .gitignore(以工作区为准)
- 变更规模:新增 514 / 修改 62 / 重命名 155 / 删除 4(归档重组与文档轮次)
- .gitignore 修:`归档/**/db-cwd归一-备份-*/` —— 原规则写绝对层级(归档/db-cwd归一-…),
  目录搬进 归档/配置与备份/ 后**静默失效**,43 MB 的 DB 备份又变成未跟踪
- .gitignore 补:嵌套 git 内部数据(归档/内嵌git-20261008/、归档/skills-git-旧线-20261007/dotgit-原样移出/)
- .gitignore 补:运行态与部署副本(.workbuddy/collab/、.workbuddy/tools/、.workbuddy/.load-pending、.workbuddy/tmp-*)
- .gitignore 补:备份件(*.bak-*)
- 未跟踪文件从 2190 降到 890(其余为 归档/ 归档件与 .workbuddy/memory/ 知识文件,按口径入库)
2026-10-10 23:13:22 +08:00

148 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 手机接入 · 进度看板
> 🔴 **本看板=「手机接入」的唯一进度汇总入口**(用户只需看这里)
> 收敛条件 = **V1–V7 全过**
> 更新时间:**2026-09-30 08:2x**(监管轮 · 会话 `手机接入-监管-0815` · 域锁 `ai1net-dsh-server/`)
---
## 0. 一句话(先看这三行)
1. 🟢 **判据层面仍是 6 过 1 差一格** —— **V2/V3/V4/V5/V6/V7 有机器读数**;**V1 只差「真机腿」**(要你在手机上点一次 USB 授权)。
2. 🟢🆕 **R1(链路能活多久)本轮拿下一半** —— **中继客户端半边已治本**:不再挂在会话名下,改由 **Windows 计划任务**持有(父链 `powershell←svchost←services←wininit`,**无 bash / 无沙箱 / 无 WorkBuddy**),我本轮**独立复核**通过(注册语义行 4→5,新增 `08:07:16`)。
3. 🔴 **20090 半边判「结构性不可行」** —— 它活在 DSH 宿主进程内;要脱离会话就必须交给计划任务,而计划任务上下文**读不到网关口令**(现场复测 `envPresent=false / envLen=0`,入口 `fail-closed rc=3`)。⇒ **需你在三条路里放行一条**(§五 ②)。**此刻链路仍不可用**(20090 无监听 ⇒ 手机拿 503)。
---
## 一、验收判据逐项(V1–V7)
| # | 判据 | 状态 | 依据(机器读数 · 产物) |
|---|---|---|---|
| V1 | 手机(真机、非 USB)能看到桌面会话列表与最新消息 | 🟡 **未完全过(只差真机腿)** | 端侧腿在**真 WebView**(模拟器真壳 APK + CDP)全通:无 cookie 6 探针全 `401` 真响应、带 cookie 6 探针全 `200`、列表 `可操作 11 · 不可发 53` 且 id 序列 ≡ 直连垫片、`/history` 200 渲染 8 条(`ai1net-dsh-anywhere/docs/实测单_N17_端侧同源与凭据载体_20260929.md`)。**真机腿未验**(需你 USB 授权)—— 增量,非新缺陷 |
| V2 | 手机发出的消息**进入桌面会话** | ✅ **过** | 经真设备入口 `POST …/reply` **200 `{delivered:true}`**,目标会话 `replay` 出现 `user_message_chunk`、文本**逐字全等**;1 h 窗口内 **5/5 段复现命中**(N9/N10) |
| V3 | 桌面正在用的会话不被夺走 | ✅ **过** | `live` 前后**同值**、`writerOccupied=true`,**全程走 `reply`,⛔ 未做 `session/load`**;**83/83** 次非空采样零漂移 |
| V4 | `src/net/relay/**` 零协议改动 | ✅ **过** | 该目录全部文件 mtime ∈ 09-16 ~ 09-26;**本轮 desktop 棒只"运行"其 `relay/main.js`,未改一行**(R1 实测单 §8 自检) |
| V5 | 权限面不扩大:不开对外端口、准入四闸、默认关 | ✅ **过** | 非回环监听集 **33 条前后 `diff` 为空**;`20090` 恒只绑 `127.0.0.1`;`device_web_enabled` 默认 = 0;入口四闸 401 / 403(他人) / 403(user-switch-off) / 200 逐级正确 |
| V6 | 插件形态正确:垫片是 **DSH 客户端插件**(并入 ai1net 包第 6 模块),⛔ 不是独立进程 | ✅ **过** | 包内模块⑥ `lib/device-access.js`;在用 profile = `C:\Users\Administrator\.dsh\profiles\desktop`,`bundles = [dsh-base, dsh-web-app, @dsh-local/ai1net]`(md5 `2ca1321c…`);`20090` 由 DSH 客户端**自己的 host 子进程**持有;全机扫 `device-access\|ai1net` **零独立进程** |
| V7 | 🔴 绝不影响 WorkBuddy 本身的运行(T1–T7) | ✅ **过** | N10:同一连续 1 h 窗口内六项同时成立(三基线 pid **84/84** `present`、宿主回 idle、当前对话零漂移、**200 次操作 0×429**、对外端口 33→33、配置目录哈希零差异);**本棒再加一笔**:desktop 棒全线**经脚本 spawn**、未装 hook、未写 settings、未 kill/restart WorkBuddy;主进程 `#3176`(09-28 13:55 起)**仍在** |
> 🔴 **V6 的覆写说明(用户 07:4x 明令)**:09-29 那版 V6 判 `fail`,其依据来自**两处非在用目录** ⇒ 旧判**作废**,以本行为准。
### 1.1 口径与增量(如实登记)
| 项 | 说明 |
|---|---|
| V1 的「真机腿」 | 需用户**点一次 USB 授权**;⛔ AI 侧做不到。不影响其余六项。 |
| V1 的判据口径 | 本线经 N8/N17 协商后以「**真 WebView 为准,真机腿为增量**」收口。 |
| 垫片作用域(R3) | 垫片 `/info.cwd = mcn-short-video` ⇒ 手机端可见会话由 **22+ 条降到 1 条**。**是不是本意**需你定(见 §五 ③)。 |
| 🆕 **R1 主判据的 ≥10 分钟口径** | 由**本棒在会话内自证**(详见 §三),⛔ 不再单独排"复核棒"去取这一格。 |
---
## 二、三线本轮产出(已按物品核对,不认自述)
| 线 | 本轮产物 | 结论 |
|---|---|---|
| **客户端线** `ai1net-dsh-desktop` | 🆕 `docs/实测单_R1链路持续性_20260930.md`(08:04–08:0x)· `docs/实测单_前置恢复_2026-09-30.md`(07:57)· `docs/README.md`(08:08)· 宿主 run `4953e96d` = `ACCEPTED` | 🟢🆕 **R1 中继半边治本(我独立复核通过);20090 半边判结构性不可行** ⇒ 如实登记 + 三条候选上抛 |
| **手机接入线** `ai1net-dsh-anywhere` | 今日无新产物(最近 = 02:14 的 N10 长时稳定性) | ⚪ 关键路径 `N8→N9→N10` 全收口 ⇒ 无缺口 |
| **插件线** `ai1net_ui` | 今日无新产物(最近 = 09-29 13:19 的棒1f) | ⚪ 无缺口待办 |
---
## 三、本棒现场实测(2026-09-30 08:15–08:2x · 只读)
| 面 | 读数 | 判 |
|---|---|---|
| 中继守护 | `powershell.exe#3212`(CREATED `08:07:13`)父链 = **`svchost.exe#3008 ← services.exe#1980 ← wininit.exe#1824`** | ✅ **真脱离会话** |
| 中继客户端 | `relay/main.js --client`(`#60196`,`08:07:14`)· 日志 `state=up(for 478470ms)` · `attempts=0 restarts=0 reconnects=0` | ✅ **在册且持续** |
| 语义行(口径=**只比语义行**) | `overlay-daemon.log` 的 `UP -- registered` 行数 **4 → 5**,新增行 = `2026-09-30 08:07:16 … accepted=[20090] session=4624335519876c48`(前一条是 09-29 22:26:58) | ✅ **本轮新增** |
| 垫片 `127.0.0.1:20090` | `netstat` 无 `LISTENING`;`tasklist \| grep -ci electron` = **0** | 🔴 **不通**(**如实状态**,未做"照起无口令的 20090"这类假绿) |
| WorkBuddy 主进程 | `WorkBuddy.exe#3176` 仍在;进程数未减 | ✅ **未受影响** |
| 守护进程(协作程序) | `collabd.py --supervise` pid **55332**(起 `06:02:07`)在跑 · `交付物/手机接入-实时状态.md` mtime = 08:15:01(10s 心跳) | ✅ **KEEPER_UP** |
| 平台域锁 | 本棒 `--claim-exec` **RC=0** | ✅ |
> 🆕 **口径更正(本轮实测 · 登记)**:SOP §9.4 的"`bind :20099` 失败即 KEEPER_DOWN"**有假阴性** —— 本棒实测它报 `KEEPER_DOWN`,而 `collabd.py --supervise` **实际一直在跑**(pid 55332)⇒ 正确判据 = **进程命令行含 `collabd.py` + 状态文件 mtime < 30 s**,⛔ 不用 bind 探针单独下结论。⇒ **本棒据此未做任何"重起守护"动作**(避免重复起第二个实例)。
### 3.1 🔴 另一笔**域锁泄漏**(沿用登记 · 本棒复核仍在 · ⛔ 未动)
| 项 | 读数 |
|---|---|
| 锁路径 | `dsh-server-docs/05-交接单/.locks/________N9______-2248-224852526` |
| 占的域 | **`ai1net-dsh-anywhere`**(=手机接入线的域) |
| 持有者 | `[协作]N9复测-2248`(**开始 09-29 22:48**) |
| mtime | **09-30 08:15 复核:仍在**(已 **≈13.5 小时**未动,持有者会话早已收口) |
| 影响 | 任何声明 `ai1net-dsh-anywhere` 的棒都会抢不到锁 ⇒ 按 R9 只能停手(09-29 22:5x 已实际发生:会话 `a7fcfc52` 第 0 步被挡、零产出) |
| ⛔ 本棒处置 | **按 R9 未删、未接管**(处置权只属持有者本人/用户) |
> 建议:**由用户本人删掉该目录**(与 09-29 11:30 那笔全域锁同类)。在那之前,手机接入线派棒应**声明更窄的显式域**,别声明整个 `ai1net-dsh-anywhere/`。
### 3.2 ⚠️ 一次性自动化积压(沿用登记 · 本棒只计数)
`automations` 表 **ACTIVE 81 条**,其中 **`once` 且已过期(`scheduled_at < 09-30 08:00`)= 76 条**(多为 09-27/09-28/09-29 的哑火棒)。
⛔ **本棒未删**(属批量改动,命中 R7「>10 条先出清单 + 确认」)⇒ 见 §五 ④。
---
## 四、下一棒(已挂 · 一棒一线)
| 对象 | 内容(本棒所派) | 时刻 |
|---|---|---|
| `ai1net-dsh-desktop`(客户端线) | **R1 中继半边「≥30 分钟长时观察」(只读复核)**:① 只读比**语义行**(`overlay-daemon.log` 的 `UP -- registered` 行数、客户端日志 `state=up` 行数,⛔ **不比总行数**)② 判守护/客户端父链是否仍为 `powershell←svchost`、`restarts/reconnects` 是否仍为 0 ③ 顺手记 `20090` 实况(**预期仍无监听,如实记**)。⛔ **不要起 20090 临时恢复、⛔ 不改任何脚本/任务定义**。判据=**收口后 ≥30 分钟仍在册**、`state=up` 持续、父链不变。 | **08:40**(一次性 · 属白名单「接续会话」) |
**为什么只派这一棒**:其余缺口**全部在用户手上**(20090 三条路径、真机腿 USB 授权),⛔ 无合规可自决的下一棒 —— 派了就是"为派活而派活"。
**关键路径状态**:`N5 → N8 → N9 → N10` **已全部 done** ⇒ 关键路径**没有剩余节点**。
---
## 五、待用户(边界外 · 逐条编号)
**① 真机腿(V1 的最后一格)** —— **为什么问你**:**需要你在手机上操作**(USB 授权),AI 侧做不到。**要什么**:手机连数据线后**点一次「允许 USB 调试」**,此后真机验收本线自动跑完。
**② 链路持续性(R1)走哪条路**(=本轮 desktop 棒 §7 的三条候选,**倾向 A 案**)—— **为什么问你**:这条决定「这功能平时到底能不能用」,且三选一**没有客观优劣**,还牵涉你愿不愿意为它放行一条现有红线。三条都**不**改官方 dsh、**不**碰平台仓、**不**影响正在跑的 WorkBuddy:
- **A 案(推荐)|给垫片开一条「口令入站」通道** —— 常驻垫片(计划任务)+ 会话侧一个极薄推送者,把**当前**口令经**回环**推给垫片(只进内存、不落盘)。
**优点**:全部硬约束都能满足(不落盘、只回环、不夺会话、口令恒新),手机侧行为与今天完全一致。
**缺点**:要**改 M6 垫片本体**(凭据面扩大 ⇒ 须走评审),另需一条周期性会话侧动作。
- **B 案|让 WorkBuddy 在「应用生命周期」里拉起客户端** —— 不经任何会话,由 WorkBuddy 自己在启动阶段拉起。
**优点**:最干净 —— 口令天然可读、生命周期天然正确、**不需要任何新通道**。
**缺点**:现行规则**明确禁止**改 WorkBuddy 的配置与进程 ⇒ **要你先放行这条红线**,且属平台侧能力,本线做不了。
- **C 案|让口令在磁盘上有"你自己指定的"稳定副本**(用户级持久环境变量或 WorkBuddy 的 `gateway` 设置)。
**优点**:**不改任何代码、不加新通道**,机制已就位,现在就能用。
**缺点**:口令**落盘**(与本线「令牌不落盘」红线相冲,须你明确豁免);口令不再随重启轮换;要重启一次 WorkBuddy 才生效。
**③ 垫片作用域是不是本意** —— **为什么问你**:垫片当前工作目录 = `mcn-short-video` ⇒ **手机上只能看到 1 条会话**(此前是 22+ 条)。是"只让手机看这一个项目"的本意,还是应该放开到全部会话?(**影响你能在手机上操作多少东西**。)
**④ 是否清理 76 条哑火的一次性自动化** —— **为什么问你**:属**批量改动**(命中 R7),涉及面超出单条棒,且部分是你自己排的棒。**默认动作(本棒已采用)=不删,只计数**。
**⑤ 域锁泄漏 `[协作]N9复测-2248`(域 `ai1net-dsh-anywhere`,已 ~13.5 h)** —— **为什么问你**:按 R9 **只有持有者本人或你能释放**,AI 删锁=违规。**要什么**:由你删掉 `05-交接单/.locks/________N9______-2248-224852526/` 目录(或告知可释放)。
---
## 六、本棒动作记录(监管轮 · 08:15–08:2x)
| 动作 | 对象 | 说明 |
|---|---|---|
| ✅ 抢域锁 | `ai1net-dsh-server/` | `手机接入-监管-0815`,**RC=0** |
| ✅ 跑状态 + 探守护 | `state.py` · `collabd.py` 进程 · 20099 | KEEPER_UP(并更正 bind 探针假阴性) |
| ✅ 收三线产出并**独立复核** | desktop 的 R1 实测单(+前置恢复/README)· anywhere/ai1net_ui 无新件 | **不认自述**:亲读宿主 run、亲查父链与语义行、亲查端口 |
| ✅ 判 V1–V7 + 覆写本看板 | 全表 | 见 §一(V1 仍「只差真机腿」,其余不变) |
| ✅ 现场取证 | 父链 · 语义行 · `20090` · WorkBuddy 进程 · 域锁 · automation 积压计数 | 见 §三 |
| ✅ 派 1 棒 | `ai1net-dsh-desktop` | 一次性 **08:40**(R1 中继半边 ≥30 min 只读复核) |
| ✅ 更正 `goal.json` 的 `acceptance_state` 注记 | `_更新` / `_依据` | V1 仍 `fail`;其余 `pass` 不变(状态本身**未变**,只刷新注记) |
| ⛔ 未新增其它自动化 | — | 本棒自身跑完即止 |
| ⛔ 未替别线动手 | — | 未起垫片/web 客户端、未 `restart dshs`、未改 WorkBuddy 配置、未删任何锁 |
| ⛔ 未起会话后台任务 / 未跑超时命令 | — | 全程前台只读,单条命令均短 |
---
## 七、机械层误报(沿用 + 本轮新增)
| 机械层原话 | 实况 |
|---|---|
| 「服务探针:不通」/ `collabd-state.kp.shim_20090` | ⚠️ **既有假阳性**(持续报不通而实况曾 200)⇒ 判垫片死活一律**连测 ≥3 次** + 进程起始时间,⛔ 不用单次读数 |
| 🆕 SOP §9.4「`bind :20099` 失败 ⇒ KEEPER_DOWN」 | 🔴 **假阴性(本轮实测)**:报 DOWN 而 `collabd.py` 实际在跑 ⇒ 判据改为**进程命令行 + 状态文件 mtime** |
| 「关键路径 N5→N8→N9→N10」 | ⚠️ 该四节点**已全 done**;机械层仍显示为"关键路径" ⇒ 看板此列已更新为「无剩余节点」 |
| `ai1net_ui`「棒1b/1c 实测缺」 | ❌ 误报(产物在 `ai1net_ui/docs/执行单_棒1c_真装与验通_20260929.md`,仅文件名前缀不符) |
| 「有自动化已过 validUntil(心跳会断)」 | ❌ 误报(过期的是已废的 `004f6bc2`) |