Files
dsh_ai1net_server/执行会话/目标-本机协作-3e3182/目标执行状态.md
T
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

143 lines
11 KiB
Markdown
Raw 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.
# 目标执行状态
> 🔴 **本文件=检查会话判断目标状态的唯一依据**(用户 2026-10-03 10:5x 要求逐字:
> 「目标执行情况也要有文档,这样检查会话**直接根据文档判断目标状态**,避免检查会话到处找信息」)。
> ⛔ 检查会话**不许再去工作区里翻文件**找目标状态 —— 读本文件 + `tasks.json` 就够了。
- **目标标题**:检查会话协作是否运行正常 + 协作机制问题排查与修复
- **目标简称**:本机协作
- **目标生命周期**:**已完成**(2026-10-03 12:18 由 `[检查]-[目标检查]-ai1net-dsh-server-第4棒` 判定并写入)
- **本文件由谁更新**:**目标检查会话**(`[检查]-[目标检查]-…`)在核对完成后改「目标生命周期」并更新本文档
- **最后实测时间**:2026-10-03 12:18(所有读数均为**现测**,⛔ 不是转述)
## 一、怎么用这份文档(检查会话照此判断,别自己另立口径)
1. 先读 `tmp/supervise-inbox/tasks.json`(队列四态台账)—— 那是「活干完了吗」。
2. 再读**本文档** —— 那是「目标达成了吗」。
3. **⛔ 两者都不许跳**。三路取并集,**任一路"没完"就是没完**:
- 台账里有 `pending`/`running`/`blocked` 的件;
- 任务图(`交付物/任务图-会话协作自检.json`)里还有 `status != done` 的节点;
- **本文档第二节里还有任何一条判据没过**。
4. 全部满足 ⇒ 才可把目标生命周期改成「已完成」,并在本文档把「结论」那一行更新掉。
## 二、验收判据(逐条,⛔ 判据值是中文写法:`过|…`/`🔴 不过|…`)
### V1 协作程序常驻一直运行
- **结论:过**
- **实测**:`supervise-heartbeat.json` → `pid=38988`、`round` 持续上涨(10 s/轮)、`ts_h=2026-10-03 10:35:21`。
- **判据**:pid 活 **∧** 心跳新鲜(<90 s)—— 与 `selftest.py::t_supervise_ensure` 同一口径。
### V2 队列与检查会话链路
- **结论:过**
- **实测**:`tasks.json` 读数 `S5=done(带 artifact)`、`S12=done(带 artifact)`;
`queue_pending()=0`(真源 `tasks.json` 四态口径);闸②`_all_sessions_idle()=True`、闸④`ws_pending_schedules()=[]`、闸③ 走 `queue-empty`。
- ⚠️ **旧判据「跟进会话链接得住(零条活着 / 今日投递成功 0 次)」已作废** —— 唤醒/跟进/队列投递
**整套退役**(用户 2026-10-03 定案),那条判据**永远不可能满足**。⇒ 本条改为校验**现行链路**。
### V3 协作会话在台账里留有产物文档
- **结论:过**
- **实测**:`S5.artifact` 指向 `references/architecture.md §2.3.0f`;`S12.artifact` 指向 `机制排查与修复/S12_清理报告_20261002.md`。
- **判据**:每条 `done` **必须**有 `artifact`。⇒ 机制侧已加硬约束:`--report --state done` **缺 `--artifact` 直接拒收(rc=3)**。
### V4 看板可服务
- **结论:过**
- **实测**:`netstat` → `127.0.0.1:8788` **LISTENING**(pid 41764);`/board.json` → HTTP 200、`ts=2026-10-03 10:52:35`。
- **判据**:能起得来 + 回环 HTTP 200(⛔ 不看页面像不像,看接口读数)。
### V5 机制自测全绿
- **结论:过**
- **实测**:`selftest.py` → **PASS 55 / FAIL 0**。
- ⚠️ **基线是 FAIL 1**(`技能侧零项目串` 那条,已于 2026-10-03 上午修掉:域键锚点词表三处对齐 + 结构性豁免)。
⇒ 判据写成「**FAIL 0**」,⛔ 不写「与基线持平」—— 那种写法会让真红也通过。
### V6 协作程序格能显示"检查程序在运行"
- **结论:过**
- **实测**:`/board.json` → `runtime.check = {"n":0,"label":"无检查在跑"}`。
**端到端验过**:临时把一条检查会话置 `working` ⇒ 线上 `runtime.check.n=1`、`label=有结果检查在运行`;还原后回 `n=0`。
- **判据**:`runtime.check` 字段在位 + 与真库 `working` 检查会话数**一致**(不许恒绿)。
- ⚠️ **旧判据「跟进会话角色落地(名册 11 条)」已作废** —— 跟进会话整套退役。
### V7 检查会话按规范命名、且**不进协作会话区**
- **结论:过**
- ⚠️ **本条已于 2026-10-03 11:1x 重写** —— 上一版写的是「按 `[协作]-[…]` 命名、判 `worker`、画进协作会话区」,
**已被用户明确纠正**(逐字:「检查会话不是协作会话,不应该出现在看板协作会话区域中;
它属于协作程序的会话,可以放在协作程序框图中展示」)⇒ 旧写法**作废**。
- **实测(现行口径)**:
- 排期名=**`[检查]-[结果检查]-<工作区>-第N棒`**(角色词是 `检查`,⛔ 不是 `协作`;第二段仍带方括号)。
- `parse_session_name()` ⇒ **`role=check / topic=结果检查 / ok=True`**;旧式光杆名(`结果检查-…`)也判 `check`。
- `is_main_side_session()` ⇒ **False**(⛔ 不算主侧 ⇒ 不进协作会话那一排)。
- 线上 `/board.json`:**`sessions_checks` 里有它、`role=检查会话`**;协作会话区域**不含**它。
- **判据**:`role=check` + `topic` 非空 + **两侧解析零漂移** +
⛔ 协作会话排的判据**显式排除**检查会话(前端也挡一次)。
- ⚠️ **旧判据「开工建齐三类(唤醒/协作/跟进)」已作废** —— 会话类别已收敛(主会话/协作会话/**检查会话**)。
### V8 协作程序在线状态读数**不是假读数**
- **结论:过**
- **实测(线上 `/board.json`)**:`runtime.prog.label=在线`、`up=true`、
`by=常驻 --supervise(round N)`、`heartbeat_age_min≈0.1`、`heartbeat_pid=48896`;
旧退役戳 `legacy_tick_age_min≈861.6` **单列且不参与判定**。
- **判据**:判据**读常驻心跳**(`logs/supervise-heartbeat.json`),
⛔ **不读** `_tick.stamp`/`collabd-once.stamp`(已退役投递机制的遗留,实测停在 2026-10-02 21:24)。
- ⚠️ **四态文案必须分清**(2026-10-03 11:35x 用户报障「已 849.6 分钟没轮」后确立):
**在线** / **已停·进程不在**(pid 没了)/ **没轮(进程还在)**(活着但卡住)/
**心跳读不到·判据已降级**(⛔ 不提进程 —— 提了就是编)。
- ⚠️ **本机实况**:后台进程**活不过工具调用边界** ⇒ 长期载体必须是**会话后台任务**;
`Popen(DETACHED|NO_WINDOW)` 起的常驻实测**约 2 分钟就被回收**。
## 三、结论
- **8 条判据全部通过** ⇒ 目标「检查会话协作是否运行正常」这一部分**已经达成**。
- ✅ **2026-10-03 12:15 更新:任务图 12 个节点现已全部 `done`** —— 最后一个卡住的 `S12`
(`await-verify`)已由 `[协作]-[机制排查与修复]-S12解体检刷新` 以**真读数**转 `done`。
当时阻塞它的是**机制层真死锁**:`health()` 因 `busy` 早退 ⇒ 体检报告 mtime 停在 10-02 20:50:22
⇒ 判据第二条「体检报告确认」永远无法过。修法见 `S12_体检刷新解锁_20261003.md`。
- ✅✅ **2026-10-03 12:18 终判:目标生命周期 =「已完成」**(`[检查]-[目标检查]-ai1net-dsh-server-第4棒`)。
三路取并集**无一路「没完」**:
1. **台账 `tasks.json`**:S5/S12 均 `done` 且各带 `artifact` ⇒ 无 pending/running/blocked(**零僵尸件**)。
2. **任务图**:12 个节点全部 `status=done`(含最后一个卡住的 S12)。
3. **本文档 V1–V8**:全部「过」。
本棒**按 §一 的要求重跑了一遍 V1–V8**(⛔ 未沿用 10:52 的旧读数),现读数:
- **V1 过** —— 心跳 `pid=36868`、两次采样 `round 90→92`(10 s/轮)、`ts_h=12:18:25`(<90 s);
进程表 `Win32_Process` 独立佐证 pid 36868 **在**(起 2026-10-03 12:03:13,命令行=`collabd.py --supervise`)。
⚠️ **踩坑留档(P0-22 同族)**:先用「`OpenProcess` + `WaitForSingleObject`」判存活**读出 `DEAD`(假阴性)**,
与心跳新鲜**自相矛盾** ⇒ 改用进程表交叉验才定案。**判据冲突时必须找第二路,否则会把「判据假红」当成「机制真死」**。
- **V2 过** —— 同上(台账两件 done 带 artifact)。
- **V3 过** —— S5/S12 的 `artifact` 均非空。
- **V4 过** —— `netstat` → `127.0.0.1:8788` LISTENING(pid 7236);`/board.json` → HTTP 200(1.6 ms)。
- **V5 过** —— `selftest.py` → **PASS 60 / FAIL 0**(rc=0)⇒ 判据是「FAIL 0」,达标。
- **V6 过** —— `/board.json` → `runtime.check = {"n":1,"kinds":["目标检查"],"label":"有目标检查在运行"}`
(`n=1` **不是恒绿**:`n` 跟真库 `working` 检查会话数一致,此刻正是本棒自己在跑)。
- **V7 过** —— `sessions_checks` 现读 **3 条**检查会话,标题分别为
`[检查]-[目标检查]-ai1net-dsh-server-第3棒`/`第2棒`/`结果检查-ai1net-dsh-server-第1棒`,
`role=检查会话`(⛔ 不是 `协作会话`)⇒ 走检查会话区、**不进协作会话那一排**。
- **V8 过** —— `runtime.prog`:`label=在线`、`up=true`、`by=常驻 --supervise(round 89)`、
`heartbeat_age_min≈0.17`、`heartbeat_pid=36868`;旧退役戳 `legacy_tick_age_min≈893.5` **单列不参与判定**。
⇒ 故 `goal.json.acceptance_state` 的机读副本**保持 V1–V8 全「过|过」**(与本文档一致,无需改动),
并已回读确认 `lifecycle=已完成`(`lifecycle_at=2026-10-03T12:18:51`)。
- 🔴 **后续口径(不阻塞本目标)**:目标已标「已完成」后,本检查排期**不再有可派集合**
⇒ 无需再按本目标派协作棒;若日后出现新的「协作机制问题排查与修复」诉求,
**重新 declare 一个目标**(`goalctl.py declare --title … --topics … --yes`)再起排期,⛔ 别复用本目标。
## 四、旧判据的作废清单(⛔ 别再拿它们判)
| 旧判据 | 作废原因 |
|---|---|
| V2-跟进会话链接得住(零条活着/今日投递成功 0 次) | 唤醒/跟进/队列投递**整套退役**,永远不可能满足 |
| V6-跟进会话角色落地(名册 11 条) | 同上 |
| V7-开工建齐三类会话(唤醒/协作/跟进) | 会话类别已收敛为主/协作/**检查** |
| V7-旧版:检查会话按 `[协作]-` 命名、判 `worker`、进协作会话区 | 2026-10-03 11:1x **用户纠正**(逐字见上)⇒ 改 `[检查]` + `role=check` + 画进协作程序框 |
| 协作程序状态=「已 N 分钟没轮」(单一判据读 `_tick.stamp`) | 2026-10-03 11:35x 实测:那两个戳 **10-02 后无人写** ⇒ 报"849 分钟"=假读数 ⇒ 改读常驻心跳 + 四态 |
⚠️ 本清单**不是为了好看** —— 留着它们,目标状态就**永远判不出来**(同族红线:
「一条判据都没有 ⇒ 判不出来,⛔ 不许当成已完成」的反面:**有一条永远红的 ⇒ 也不许当成未完成**)。