Files
dsh_ai1net_server/交付物/N9卡点判定与派活-20260929.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

71 lines
5.2 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.
# N9 卡点判定与派活(2026-09-29 22:19 · 主会话)
> 触发:监管程序报警 `STALL.md`「有会话在跑但 **398 分钟无成果**」(22:14:30)。
> 本轮唯一任务 = 判「该谁动」(有活就派/被卡就明确报用户)。执行会话:`[主]STALL判定与派活-2216`,域锁 = `ai1net-dsh-server/tmp` + `ai1net-dsh-server/交付物`。
---
## 0 一句话结论
**报警是口径假阴性**(没有「结算事件」≠ 没有成果);**真卡点是跨线工程缺口**:设备侧 relay worker 通道不在 ⇒ 入口④闸 503。**不需要用户授权**,已派桌面线一棒解卡(`41182645` @22:23)。
## 1 「398 分钟无成果」为什么是假信号
| 项 | 实测读数 |
|---|---|
| 报警 | `STALL.md`:有会话在跑但 398 分钟无成果(22:14:30) |
| 被指对象 | `9443dbb5` = `[协作] N9 派活 · V2…`,宿主库 `status=working`,`updated_at` = **22:14:57**(仍活着) |
| 它其实有成果 | 22:13 落了 `ai1net-dsh-anywhere/docs/实测单_N9_发送腿与入口四闸_20260929.md`(含泳道图+事故链图);22:14:03 上报 N9 → `blocked` 并带 `block_reason` |
| 病灶 | `collabd-state.json` 的 `last_progress_at` 只认宿主 **ACCEPTED** run;21:56 起的 N9 棒是 **IN_PROGRESS** ⇒ 不刷新 ⇒ 报警器把「上次结算(15:36:17)到现在」当成「无成果」 |
| 已自愈 | 本轮跑 `collabd.py --once` 后,摘要变「在跑 1 个;**4 分钟** 无成果」,`STALL.md` 已消除 |
## 2 真卡点:唯一红格 = 设备侧 worker
链路:手机 → 平台入口**四闸** → relay → **设备侧 worker** → 垫片 `127.0.0.1:20090` → WorkBuddy 网关 → 桌面会话
| 环节 | 读数 | 判 |
|---|---|---|
| relay | `refuse d-bdf89014-c66f-4060-a2df-995d8c18a951-626dc095:20090 (worker offline)` | 🟥 无 worker 通道 |
| 平台④闸 | `503 device-unreachable`(`声明的端口全部离线(20090)`,连打 3 次) | 🟥 请求进不来 |
| 设备侧 worker | 匹配 `overlay-device-join\|dsh-worker\|relay` 的进程 **0 个**;`overlay-daemon.log` 最后一次 `UP -- registered … accepted=[20090]` = **2026-09-29 11:06:46** | 🟥 之后掉了 |
| 垫片 20090 | `/api/v1/health` = 200 · 直连 `/api/v1/sessions` = 200(22 条 / 7103 B) | ✅ 不是它的问题 |
**为什么掉**(最可能):11:06 那次是当**会话后台任务**起的 ⇒ 工具调用/会话一结束被沙箱回收。⇒ 解卡必须用**独立进程**拉起。
## 3 本轮唯一动作:派活(不动手做别线的事)
| 项 | 值 |
|---|---|
| 棒名 | `[协作]N9解卡 · 桌面线:设备侧节点守护独立拉起(relay 通道恢复 · 20090)` |
| automation id | **`41182645-6253-4d96-90ce-49a0de18de16`** |
| 排期 / 域 | 22:23 / `ai1net-dsh-desktop`(与 N9 线的 `ai1net-dsh-anywhere` 不重叠 ⇒ 可并行) |
| 要它做的 | 用**独立进程**拉起测试身份的节点守护(DataRoot `E:\dsh-worker-dev`,凭据有效期至 **09-30 11:06**)⇒ relay 重新 `online`+`ports=[20090]` ⇒ 复测④闸不再 503 |
| 已同时提示的坑 | ⛔ 别启用计划任务 `DSH-Worker-Dev`(2026-09-20 已退役的 S1 遗留任务,占 9411,与覆盖网络节点守护无关) |
同线接续棒(不是本轮派的):`c048a986` @22:20 = ④闸复测 + 桌面 `/sessions/live` 指针**受控归还**(N9 棒探针把指针移到了 `nope-0000`)。
## 4 要不要用户出手
| 档 | 内容 |
|---|---|
| ① 现在 | **不用**。测试身份凭据在有效期内(expiresAt `2026-09-30T03:06:10Z` = 本地 09-30 11:06)⇒ 解卡 AI 可自做 |
| ② 待触发 | 真账号验收要用**「用户身份」**的设备在线,而它凭据 **09-28 20:35:27 已过期(约 25.7 h)** ⇒ 到那一步**只能**你登一次(命令见 `tmp/supervise-inbox/NEED-USER.md` §②) |
⇒ 本轮**未**以「需用户授权」上抛(21:26 那版上抛是**过期信号**,你 21:51 已授权且已办结)。
## 5 顺手登记的机制缺陷(⛔ 本轮未动机制层 —— 需独占锁+你确认)
| # | 缺陷 | 后果 |
|---|---|---|
| M1 | `last_progress_at` 只认宿主 **ACCEPTED** run | 「在干」被判成「没干」⇒ 每轮假报警(本轮 STALL) |
| M2 | `collabd.py` 的受阻模板把**一切**受阻渲染成「需人处理 · 要哪一句授权」 | 跨线等待被当成「要用户放行」⇒ **假升级**(本轮已用 `NEED-USER.md §① 无` 对冲) |
| M3 | `taskgraph().ready` 只按 deps 算 ⇒ `running` / `blocked` 的节点仍算「可派」 | `digest` 喊「可派 N9」而队首空 ⇒ 口径打架、有重复派活风险(本轮用 `blocked.json` 兜住) |
| M4 | 泄漏锁无 TTL、持有者 `completed` 不自动失效 | 必留泄漏锁(21:5x 那把已按 R9 授权处置) |
## 6 收尾核验(可复跑)
- `cat tmp/supervise-inbox/queue.json` → `head=null` · `pending=0` · `blocked={N9: 跨线等待…}` · `gate=free`
- `cat tmp/supervise-inbox/digest.md` → 「可派:无」·「等待:N10」· 无 398 分钟报警
- `ls tmp/supervise-inbox/` → `STALL.md` 已消;`NEXT.md` = 受阻通报(内容引 `NEED-USER.md`)
- 归档:`tmp/lock-forensics/n9-20260929-2149/`(`blocked.json.empty-20260929-2218` · `NEED-USER.md.as-cleared-20260929-2218`)