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/ 知识文件,按口径入库)
This commit is contained in:
1 parent
30b46dbd0c
commit
c1b5e4d966
735 files changed
+153192
-2415
No files matched your search
@@ -0,0 +1,118 @@
|
||||
# 自动化记忆 · `主控 · 唤醒机制线 · 棒:worker 退出后能否被外部叫起(无人值守决定性一问)`
|
||||
|
||||
- 自动化 id:`b68e2b24-0964-400c-b7d8-be097211d23d`(一次性,排期 2026-09-30 19:33)
|
||||
- 线:机制线 · 唤醒机制探索 | 域锁:`唤醒机制-无人值守棒` @ `ai1net-dsh-server/`(收尾已 `--release-exec`)
|
||||
- 会话:`a202550c-d6d9-480d-b8a8-0abfdf5f0045`(宿主 = prewarm 条目 `wb-pool-1790767873531-bb4877`,pid 81372)
|
||||
|
||||
## 本次执行摘要(2026-09-30 19:33–19:5x)
|
||||
|
||||
**结论:🔴 不能**("把已退出的会话从外部叫起来续跑"结构上无路);**但"无人值守"仍可实现 = 无人值守地新起一个会话(=自动化派棒,1 小时粒度)**。
|
||||
|
||||
三条判据(均已成文,不在此重复):
|
||||
1. 网关口长在 worker 进程里 ⇒ worker 退出 ⇒ 端口消失(实测 3 网关 ↔ 3 个在跑会话)。
|
||||
2. `POST /api/v1/runs` 不选会话:`id` 只当消息 id/conversation.id,路由先取宿主自己的 `primarySession`(`take(1)`,一辈子不变)。
|
||||
3. 宿主不自愈:`CliPrewarmPool` 对 activated 条目意外退出只写 warn,不补池不重拉;唯一有效复活动因在桌面端 **pipe** 上,外部接不上。
|
||||
|
||||
端到端实测:body `id=706d2476` 打到另一活网关 → **202 accepted / run active=true**,但目标会话 transcript **一字未变**(230 行 / md5 `7c404bfd…` / mtime 19:09:15.929),`activeSessionId` 全程是投递方自己的会话。
|
||||
|
||||
## 产出(落点)
|
||||
|
||||
- `交付物/唤醒-无人值守可行性-20260930.md` —— 判定 + 三问逐条 + 端到端证据链 + 源码判据 + 泳道图 + 事故链图 + worker 存活时长实测 + 替代路径与代价
|
||||
- `交付物/唤醒-无人值守可行性-20260930-图.html` —— 两张 SVG 图(泳道图 / 事故链图,dark theme)
|
||||
- 当日日志已 append(`.workbuddy/memory/2026-09-30.md`,本棒小节见文末)
|
||||
|
||||
## 复用要点(下次同类棒直接用)
|
||||
|
||||
- 网关枚举/投递器现成:`.workbuddy/collab/wake-session.py --list`;⛔ **判真网关的唯一下水岭 = 不带凭据时 `/api/v1/health` 必须 401**(垫片 20090 与真网关一样带根页标记,但 health=200)。
|
||||
- 读 `app.asar` 用 `tmp/wb-phone/asar-peek.mjs`(`find` / `slice` / `extract`)+ `reflow.mjs`;本棒相关偏移:网关控制器 ≈@7.10M、`createRun` ≈@6435743、`GatewayAcpBridge.getOrCreateSession` ≈@6232k、`main/cli-prewarm-pool.js` 的 `child.on("exit")`;
|
||||
- 宿主日志:`logs/2026-09-30/workbuddyMainThread__22be230a230dcc2f1d23d3d261812acb.log`(`[CliPrewarmPool]` 关键字)。⚠️ **per-workspace 日志(`ai1net-dsh-server__….log`)今天 19:36 之后不再增长**,别把"日志没长"读成"没发生"。
|
||||
- ⚠️ 大的 `Read` 会被守门拦下 ⇒ 用 `grep -n` 定位 + `sed -n` 取小窗。
|
||||
- ⚠️ 目标会话 transcript 在 `E:/ProgramData/.workbuddy/projects/e-ProgramData-AIProject-ai1net-dsh-server/<sid>.jsonl`;**判"有没有被叫起来"必须同时看 行数 + md5 + mtime**(只看 mtime 会被 UI 的 artifact 查询误导)。
|
||||
|
||||
## 未决 / 是否排下一棒
|
||||
|
||||
- **未排下一棒**(本轮只做这一件事,目标已达成)。唯一能改判定的未知量:`code=1` 静默退出(`stderr tail: <empty>`、`signal=none`、非人为 kill)是"回合结束被主动回收"还是"崩溃" —— 若为前者,上一棒的 idle 钩子闭环方案(③)**结构性不成立**。留待用户决定是否开一棒。
|
||||
- ⚠️ 本棒往**自己**投过一条 runs 探针(runId `c2f4941d-3a0e-42bf-88af-d84790c85ffa`,按边界"只投给自己")。它**排队等空闲边界**才交付 ⇒ 本会话在收官后**可能多跑一轮**(正文是一行确认);若没出现,恰好反证"自动化会话跑完即 worker 退出、投递随之消失"。
|
||||
|
||||
---
|
||||
|
||||
## 追加执行(2026-09-30 21:0x)· 同一工作区 · 多任务类别
|
||||
|
||||
- 线:协作机制 / 唤醒机制 | 域锁:`唤醒机制-同工作区多任务棒` @ `ai1net-dsh-server/`(**收尾已 `--release-exec`**)
|
||||
- **本轮目标**:把协作机制的归属锚点从「跨工作区(cwd)」改成「**同一工作区 + 名称前缀(任务类别)**」。
|
||||
|
||||
**结论**:已落地并验证。核心 = 把「**任务类别**」提为一等公民(`goal.topics` ≡ 标题里的 `<类别>` ≡ 台账 `line` ≡ 分工板一行);
|
||||
归属判据从单 `short` 泛化为**类别集合**;主会话从**一条**改成**每类各一条**(`resolve_mains()` + `main_for_topic()`);投递**按件的类别**选路(⛔ 不投给别类别,没解析出就**降级报告**)。
|
||||
|
||||
**改动落点**(详 ⇒ `交付物/协作-同工作区多任务类别-20260930.md`):
|
||||
- 技能侧 `scripts/{collabd.py,board.py,guard.py,selftest.py}` + `SKILL.md` + `references/architecture.md`(§2.3 正名「任务类别」+新增 §2.3.0)
|
||||
- 本工作区 `tmp/supervise-inbox/goal.json`(新增 `topics`;`lines` 与 `topics` 统一)
|
||||
- 排期 `caca9a89…`/`16bec5ce…` 改名 `[协作]-唤醒机制-唤醒轮A/B · …`(**PAUSED,未启停、未改 rrule**)
|
||||
|
||||
**验证**:自测 **PASS 28 / FAIL 0**(主会话用例 12→22 项、归属判据 7→15 例);真实工作区冒烟:分工板首个按类别归位 `唤醒机制 state=busy`、`default=a202550c(prefix:主控, switched_from=fe146dd9)`(**登记的旧主会话已死 ⇒ 正确跟随**)。
|
||||
🔴 **冒烟抓到一个真 bug**:两处 `_scan_*` 的 `by_topic` 结构不一致(collabd 存 dict / board 曾存裸 sid)⇒ 会把整 dict 当 sid 用。已统一 + 加自测结构断言防回潮。
|
||||
|
||||
**复用要点(下次同类棒直接用)**:
|
||||
- `goal.json` 的 `topics` 是**唯一类别源**(缺省回落 `short`);**主会话维护**,改完**下一轮钩子即时生效**(⛔ 不必重启)。
|
||||
- 命名:协作棒(含**自动唤醒任务**)`[协作]-<类别>-<具体>`;主会话 `主控 · <类别> · <具体>`。
|
||||
- ⚠️ 类别名走**子串匹配**(主会话命名是口语式、无方括号)⇒ **别取太通用的词**(如"机制")。
|
||||
|
||||
**未排下一棒**(本轮目标已达成)。
|
||||
|
||||
---
|
||||
|
||||
## 追加执行(2026-09-30 21:2x)· 收尾:整体验证 → 改看板 → 看流程对不对
|
||||
|
||||
- 线:协作机制 | 域锁:`唤醒机制-同工作区多任务棒` @ `ai1net-dsh-server/`(**收尾复核:`.exec-lock` 已无占用,未新抢**)
|
||||
- **用户要求**(原话):「改完记得整体验证,确定一切正常 就修改看板 看看流程对不对」
|
||||
|
||||
**结论**:三步全部完成。整体验证过程中**抓到并修掉两条「同族红线」级真 bug**(形状=不崩溃、只少说一句话);
|
||||
看板已全面改成「任务类别」;流程已用「渲染断言 + 几何自检 + 离线预览页」验过。
|
||||
|
||||
**修掉的两个 bug(细节见 `交付物/协作-同工作区多任务类别-20260930.md §八`,不在此重复)**
|
||||
1. `acceptance_state` 只有 `_说明`/`_更新` 时被读成"全过" ⇒ 新增 `goal_state()` **三态** `open/pass/undeclared`;
|
||||
`board.py` 命令行摘要同族(`… or "无"`)一并收敛到 `_acc_summary()`。
|
||||
2. 台账里 2 条旧工作区线(各 2 件已完成)在架构图上**整块不见**(图上只画前 4 格,恰好全是 0 件的类别)
|
||||
⇒ `labor[].kind` + `orphan` 汇总 + **折叠成「未归类」格照画** + 图外点名 + 表内标「旧值」。
|
||||
|
||||
**验证读数**:技能自测 **31/31**;看板渲染断言 **18/18**;架构图几何自检 **3/3**(R3 现 5 格零重叠)。
|
||||
⚠️ **关键坑(已写进 `SKILL.md §0.5.4`)**:DOM 桩**必须当场从 `board.html` 现取主脚本**,
|
||||
⛔ 不许读上一轮导出的副本(副本形态不同 ⇒ 造出**稳定的假绿**;本轮因此白跑一轮)。
|
||||
|
||||
**复用要点**
|
||||
- 本机 9223 无独立浏览器、且**明令禁止自起 headless chrome /附着用户 Chrome** ⇒ 验看板走三步:
|
||||
① `node --check` 主脚本 ② 极简 DOM 桩跑真 `render()` 断言 DOM 内容 ③ 解析渲染出的 SVG 做几何自检
|
||||
(下界/行带不重叠/格间零重叠)。另出**离线预览页**(快照内联、`file://` 直开)给人眼复核。
|
||||
- 🔴 **`multi-session-collab` 是 WorkBuddy 宿主侧技能,只有"本机一处"** ——
|
||||
实测文档库 `08-skills/` 与服务器 `/opt/dsh/docs/skills/` **都没有它** ⇒ **不需要"技能三处"同步**
|
||||
(别按 DSH 技能的规矩去推,省一步)。
|
||||
|
||||
**产出**:`交付物/看板-离线快照预览-20260930.html`(看板真实渲染)/
|
||||
`交付物/协作-同工作区多任务类别-20260930-图.html`(新增图③泳道、图④事故链)/
|
||||
同名 `.md` 新增 §八;技能侧 `SKILL.md`(§0.5.4 + last_change)+ `references/architecture.md §2.3.2`。
|
||||
|
||||
**未排下一棒**(本轮目标已达成)。待用户拍板仍只有一条:`goal.json.topics` 是否就定成这 4 类。
|
||||
|
||||
---
|
||||
|
||||
## 追加执行(2026-10-01 00:2x)· 用户两条订正
|
||||
|
||||
- **用户原话**:① 「目标是 通过对话在调用 会话协作skill时说明的,不是固定的」② 「我说的看板是 实时动态看板 现在被关闭了」
|
||||
|
||||
**① 目标不是固定配置** —— 我上一轮把 `goal.json.topics` 按**接续入口文件名**猜了 4 类,还拿去请你拍板;那是**猜**不是**说明**。
|
||||
⇒ ①`SKILL.md §0.05` + `architecture.md §0.1` 写明"四样都由对话产生、⛔ 不许预设、⛔ 不许从文件名推"
|
||||
②使用方 `goalctl.py` 新增 **`declare`**(说明的唯一落点;⛔ 默认干跑、`--title` 必填、省略则不动该项)
|
||||
③看板新增 `project.topics_source`(`declared/fallback/none`,未说明时**显式标「⚠ 未声明 ⇒ 暂回落目标简称」**)
|
||||
④数据订正:我猜的 3 类移出 `topics` → `_topics候选`;`topics` 只留有依据的 `唤醒机制`。
|
||||
后备份 `tmp/bak-目标来源订正-20261001/`。
|
||||
|
||||
**② 看板=实时动态看板** —— 09-30 20:27 的 `goalctl stop --yes` 把它一起停了,我之后给的是**离线快照页**(不是你要的)。
|
||||
⇒ 已恢复 `http://127.0.0.1:8788/`(**会话后台任务 + stdout 落文件**,⛔ 必须带 `COLLABD_CONFIG` + `DSH_COLLAB_WS`)。
|
||||
读数:`GET /` 200/59,076 B|`/board.json` 200/9,551 B|两次 `epoch` 变了 ⇒ 真·实时|只绑回环(PID 34184)。
|
||||
⚠️ 刚起 3 秒内 `/board.json` 返回 `{"warming": true}`(53 B)—— 不是起失败。
|
||||
⇒ `SKILL.md §0.5.0` 新增「看板默认指那个实时动态看板」+ 两条边界(会话后台任务 ⇒ 关会话即停,**本机做不到真常驻**;
|
||||
且该会话有后台任务时**宿主 idle 钩子被压制** ⇒ 起看板别放在承担派活职责的会话里);`goalctl start` 的 ③ 补上起看板命令。
|
||||
|
||||
**验证**:自测 **32/32**;渲染断言 **18/18**(顺带修掉一处**写死数字**的假红断言 ⇒ 改为从快照现算);几何 3/3。
|
||||
|
||||
**未排下一棒**。待用户拍板项**已撤销**(目标/类别由对话说明,⛔ 不再问"要不要定死")。
|
||||
Reference in new issue
Block a user