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:
admin committed 2026-10-10 23:13:22 +08:00
1 parent 30b46dbd0c
commit c1b5e4d966
735 files changed
+153192 -2415

No files matched your search

+18 -18
View File
@@ -244,7 +244,7 @@ ALTER ROLE dshs NOCREATEDB;
- **automation id = `fe16b14a-cd7e-424d-99b0-37a21972365a`**(真 id,来自工具返回值)
- name = 插件投放与分库线 · 执行棒③(S4 代码面:数据面声明+检测+门禁+门户按钮)
- `scheduledAt = 2026-09-23T05:55`(收口 05:47 + 8 分钟,符合 §3.1.1 铁律①)|`nextRunAt = 1790114100000`
- `cwds = E:/ProgramData/AI技能/aliyun-dsh-server`
- `cwds = E:/ProgramData/AIProject/ai1net-dsh-server`
- **同一时刻只挂一个**(§3.1.1 铁律②):list 确认本线无其它待跑棒 ✅
### 收尾四件套
@@ -286,7 +286,7 @@ ALTER ROLE dshs NOCREATEDB;
### 收尾四件套
① 锁:**已 `--release-exec`**(顺序遵守铁律:改完 → 回归 → 才放锁)⇒「✓ 已释放全局执行锁」✅
② 下一棒:automation **`6e8cedcd-f426-4390-9460-937573d93f7d`**(第 4 棒 · 建库口接线)|`scheduledAt = 2026-09-23T06:27`(收口 06:19 + 8 分钟,符合 §3.1.1 铁律①)|`cwds = E:/ProgramData/AI技能/aliyun-dsh-server`|**同一时刻只挂一个** ✅
② 下一棒:automation **`6e8cedcd-f426-4390-9460-937573d93f7d`**(第 4 棒 · 建库口接线)|`scheduledAt = 2026-09-23T06:27`(收口 06:19 + 8 分钟,符合 §3.1.1 铁律①)|`cwds = E:/ProgramData/AIProject/ai1net-dsh-server`|**同一时刻只挂一个** ✅
③ 入口推进:§0 追加本棒完成行 + §5「⏭️ 本轮动作」改标为**第 4 棒(建库口接线 · 5 项)**+「本线下一项」去掉已完成项 ✅
④ 本日志 ✅
@@ -646,7 +646,7 @@ ALTER ROLE dshs NOCREATEDB;
### 二、开工(第 0 步)
`cd` 核对 cwd = `E:/ProgramData/AI技能/aliyun-dsh-server` ✅(`pwd` 输出一致)|`state.py` 跑通(锁空闲 · 入口 mtime 09:52 · HEAD `3d8f50e`)|**抢锁成功**:`handoff-guard.sh --claim-exec "插件投放与分库线-规划棒⑨"` ⇒ 未声明域 ⇒ 退化全局独占(预期)。
`cd` 核对 cwd = `E:/ProgramData/AIProject/ai1net-dsh-server` ✅(`pwd` 输出一致)|`state.py` 跑通(锁空闲 · 入口 mtime 09:52 · HEAD `3d8f50e`)|**抢锁成功**:`handoff-guard.sh --claim-exec "插件投放与分库线-规划棒⑨"` ⇒ 未声明域 ⇒ 退化全局独占(预期)。
### 三、🔴 本轮最有价值的发现(三条硬约束 · 已写进设计件 §二)
@@ -843,7 +843,7 @@ workbuddy.db-shm 共享内存索引(被 app 进程持有句柄)
- `immutable=1` 打开 ⇒ **OK,249 会话**(数据完好)
**已做备份**(三件套一起,⛔ 不动活库):
`E:/ProgramData/AI技能/aliyun-dsh-server/.workbuddy/tmp/db-bak-20260923/`
`E:/ProgramData/AIProject/ai1net-dsh-server/.workbuddy/tmp/db-bak-20260923/`
(`workbuddy.db` + `workbuddy.db-wal` + `workbuddy.db-shm`)
**修复三步**:
@@ -1086,7 +1086,7 @@ await this.post(`/fence`, { userId, epoch: … }, target) // ③ 带 to
- 🔴 **automation 库已于 09-23 18:55 由 app 自愈**:`workbuddy.db` magic 恢复 `SQLite format 3`(200,704 B);坏库改名 `workbuddy.db.corrupt-2026-09-23T10-55-47-845Z`(35,377,152 B)留档 + 落 `workbuddy.db.recovery-pending`(`state=PENDING` / `walReplayed=null`)⇒ **app 自己走了「重建空库」那条路(= DB 修复讨论里的案 A)**。
⇒ **代价 = 历史 automation 记录全丢**(`list` 只剩两条 2026-08-27 旧条目)⇒ **各线接续棒须逐线重登**。
- ✅ **第 12 棒(动工连接层 B 案)接续棒已补登** = automation `89e11630-4a06-41ca-bfc7-3c66ff4d8a53`(一次性 · `scheduledAt = 2026-09-23T19:10` · `cwds = E:\ProgramData\AI技能\aliyun-dsh-server`)⇒ 入口 §2「登记受阻」块已标 ✅ 已解(原块降为存档)。
- ✅ **第 12 棒(动工连接层 B 案)接续棒已补登** = automation `89e11630-4a06-41ca-bfc7-3c66ff4d8a53`(一次性 · `scheduledAt = 2026-09-23T19:10` · `cwds = E:\ProgramData\AIProject\ai1net-dsh-server`)⇒ 入口 §2「登记受阻」块已标 ✅ 已解(原块降为存档)。
- 🔴 **B 案零开工取证**:`grep -ril "centrifugo|ImConnectionBackend|connection-backend" src poc test` ⇒ **零命中**;`src/im/` 仍为原 8 文件 + `sdk/`。
- 🔴 **E 单线上可见面的缺口(本轮新发现 · ⛔ 尚无人认领)**:投放线入口 `接续入口_插件投放与分库线_20260922.md` 里 **`im-conversation-tabs` 零命中** ⇒ 该投放**没落在任何一方的待办清单上**(IM 线说"须投放线接力",投放线入口没登记它)⇒ 第 12 棒收口时须显式登记到投放线,或本线自行排棒。
- ⚠️ **入口编号撞号已修**:§2 那段「第 11 棒」与 §0 中**已完成**的第 11 棒(①档位重写 + 收口)撞号 ⇒ 统一改为 **第 12 棒**(含手工接力模板与 `ME=` 登记门禁名)。
@@ -1136,7 +1136,7 @@ E 单 client bundle 与平台 `/api/im/ws` **协议不一致**:客户端发 `{
⚠️ 编辑中**误删 §3 标题**(`## §3 已取事实…`)⇒ 本轮已复原,`grep "^## §"` 复核 §0/§1/§2/§3/§4/§5/§6 齐全。
🔻 **另修一处自相矛盾**:选型单 §15.10 原标题写「本棒收口时**未排**下一棒」,与 §0「下一棒已排 = `31f0b0d7`」冲突 ⇒ 已改正为「下一棒**已排** = 第 13 棒」,并把 ①/②/③ 的先后标清。
- **锁**:域锁 `IM线-第12棒` **已 `--release-exec` 释放**(复核 `.locks/` 为空)。
- **下一棒**:automation **`31f0b0d7-f652-4081-88d0-3aec69136949`**(一次性 · `cwds = E:\ProgramData\AI技能\aliyun-dsh-server`)= 修上述 P0。⚠️ 其**抢锁域必须含 `poc/im-conversation-tabs`**(第 12 棒只声明了 `poc/im-connection-gateway` ⇒ 该域当时**未在锁内**)。⚠️ automation 库本轮**可写**(`mode=list` 已确认 `31f0b0d7` 在列)⇒ 无需走「手工接力」替代路径。
- **下一棒**:automation **`31f0b0d7-f652-4081-88d0-3aec69136949`**(一次性 · `cwds = E:\ProgramData\AIProject\ai1net-dsh-server`)= 修上述 P0。⚠️ 其**抢锁域必须含 `poc/im-conversation-tabs`**(第 12 棒只声明了 `poc/im-connection-gateway` ⇒ 该域当时**未在锁内**)。⚠️ automation 库本轮**可写**(`mode=list` 已确认 `31f0b0d7` 在列)⇒ 无需走「手工接力」替代路径。
- **跨线缺口已登记(本棒顺带办掉)**:E 单投放面此前"两不管" ⇒ 已在**投放线入口 `接续入口_插件投放与分库线_20260922.md` §5「本线后续」新增第 5 条**(写明"硬阻塞 = 本棒 P0"、投放前须先等第 13 棒修完)+ **改正该入口 §0 末行「automation 不可用」的过时前提**(库 18:55 已由 app 重建;本轮实测 `mode=list` / `mode=create` 均可用)。⚠️ **该投放的归属仍未认领** ⇒ 已列进 §2「第 13 棒」连带待办。
- **⚠️ 编辑事故与修复**:插入 §2「第 13 棒」块时,误把 **§3 的标题行**当成了 `old_string` ⇒ 一度删掉 `## §3 已取事实…`;本棒已复原,`grep "^## §"` 复核 §0/§1/§2/§3/§4/§5/§6 **齐全**。教训:用 Edit 插块时 ⛔ 不要把**下一节的标题行**当锚点。
- **锁的第二轮**:为改投放线入口**重新抢过一次域锁**(域 = 该入口文件),改完即 `--release-exec` ✅ —— 复核 `.locks/` 两次均为空。
@@ -1189,7 +1189,7 @@ E 单 client bundle 与平台 `/api/im/ws` **协议不一致**:客户端发 `{
- **回填**:`交接单/IM群组-E-会话界面UI.md` 新追加「§执行回报(IM 线第 13 棒)」(⛔ E 单正文一字未改)+ 选型单 §15.7 处 🔻 **处置标注**(⛔ 原文未改);入口 §0 新行 + 新写 §2「⏭️ 第 14 棒」自包含块 + §6 加「P0 已修 / ⛔ 别照旧建议发 pong」两条。`grep "^## §"` 复核 §0–§6 **齐全**。
- **锁**:域锁(`poc/im-conversation-tabs` / `test/im-ui.test.mjs` / `dsh-server-docs/交接单` / 入口文件)**已 `--release-exec`**;门禁 `ME="IM线-第13棒"` 跑过 **rc=0 放行**。
- **下一棒**:automation **`2d059ec8-0664-45de-a1c1-e8478f1686df`**(一次性 · `scheduledAt = 2026-09-23T20:15` · `cwds = E:\ProgramData\AI技能\aliyun-dsh-server`)= **认领并执行 `im-conversation-tabs` 的投放(可自动部分)+ 出线上取证清单** —— 兑现入口 §2「本线自行排一棒」那条(⛔ 不推进 ⇒ 投放面又回到"两不管")。⚠️ 该棒**含用户动作**(实例「功能管理」自助启用)⇒ 用户未启用则如实记"未通过"。
- **下一棒**:automation **`2d059ec8-0664-45de-a1c1-e8478f1686df`**(一次性 · `scheduledAt = 2026-09-23T20:15` · `cwds = E:\ProgramData\AIProject\ai1net-dsh-server`)= **认领并执行 `im-conversation-tabs` 的投放(可自动部分)+ 出线上取证清单** —— 兑现入口 §2「本线自行排一棒」那条(⛔ 不推进 ⇒ 投放面又回到"两不管")。⚠️ 该棒**含用户动作**(实例「功能管理」自助启用)⇒ 用户未启用则如实记"未通过"。
- **⚠️ 自律一处**:§0 新行里 automation id 我**先写了占位串**(违反「下一棒 id 只来自工具返回值」)⇒ 已用 `mode=create` 的真实返回值 `2d059ec8…` 更正 ✅。教训:**先登记再写入口**,别图省事。
---
@@ -1199,13 +1199,13 @@ E 单 client bundle 与平台 `/api/im/ws` **协议不一致**:客户端发 `{
**判定**:这次的裂因**不是斜杠**(09-22 那一维),而是**盘符大小写** —— `automation.cwds` 写成**大写** `E:\…`,而工作区存量全是**小写** `e:\…`;宿主**逐字落库、⛔ 连大小写也不规范化** ⇒ 多出一个同名分组。
**取证(全部只读)**
- `sessions.cwd` 分组计数:`e:\ProgramData\AI技能\aliyun-dsh-server` = **158 条**|`E:\…` = **2 条**(= IM 线**第 12 棒** 19:10、**第 13 棒** 19:43 拉起的会话,`is_background_automation=1`)|`workspaces.path` 同为小写|`d:\AI技能\aliyun-dsh-server` 11 条= 09-13 前的旧盘遗留(另一成因,本次未涉及)。
- `sessions.cwd` 分组计数:`e:\ProgramData\AIProject\aliyun-dsh-server` = **158 条**|`E:\…` = **2 条**(= IM 线**第 12 棒** 19:10、**第 13 棒** 19:43 拉起的会话,`is_background_automation=1`)|`workspaces.path` 同为小写|`d:\AI技能\aliyun-dsh-server` 11 条= 09-13 前的旧盘遗留(另一成因,本次未涉及)。
- `automations.cwds` 库内原文:第 12/13/14 棒**三条全是大写**;`created_at` = 19:02 / 19:36 / 20:06 —— **全部在 09-23 18:55 app 重建 automation 库之后**(记录被清空 ⇒ 重登时只能照技能字面抄)。
- 库健康:`quick_check = ok`;WAL 三件套齐(`.db` 647 KB / `-wal` 4.1 MB / `-shm` 32 KB)⇒ **与 09-23 头部损坏事故无关**。
- **规则溯源(真根因)**:技能 `dsh-auto-handoff-chain **§0.6 律⑤**` 原文写着「⛔ **只写反斜杠 + 大写盘符**」「判据:盘符**小写** ⇒ **必错**」—— **方向反了**。⇒ 重登棒严格照字面执行,等于**按规则把事故复现了一遍**。
**已做(止损 + 改根因而非改现象)**
1. **第 14 棒**(`2d059ec8…`,20:15 未跑)的 `cwds` → 小写 `e:\ProgramData\AI技能\aliyun-dsh-server`(工具返回值已确认小写)⇒ 挡住第三次复现。
1. **第 14 棒**(`2d059ec8…`,20:15 未跑)的 `cwds` → 小写 `e:\ProgramData\AIProject\aliyun-dsh-server`(工具返回值已确认小写)⇒ 挡住第三次复现。
2. **技能 §0.6**:律⑤ 内容 / 判据 / 自查句 / 乙类特征行 / §0.6 标题 **五处**改正;**新增「律⑤ 事故·二(2026-09-23)」**小节,含关键教训 —— **「凭记忆规定绝对写法」本身就是错的,正解 = 与存量逐字对齐(现查 `sessions.cwd` 分组计数取最多字面)**;`version 1.7.1 → 1.7.2`、`updated_at → 2026-09-23`。
3. **用户级 `E:\ProgramData\.workbuddy\MEMORY.md` 律④** 与 **本项目 `.workbuddy/memory/MEMORY.md`「会话分组 / cwd」行** —— 同步改为「**反斜杠+小写盘符**」,并记明**两个维度各裂过一次**(09-22 斜杠方向|09-23 盘符大小写)。
@@ -1216,10 +1216,10 @@ E 单 client bundle 与平台 `/api/im/ws` **协议不一致**:客户端发 `{
### 20:19 |用户拍板 **A**(保留现状 · 保证不再新增)→ 收口
- **决定**:已裂出的 **2 条大写会话不归并**(⛔ 不碰 live 库、不停 app)。技能 `dsh-auto-handoff-chain` 事故·二里的「待处置」项**按 A 结**。
- **堵传染路径(本轮新增,A 的实质动作)**:`接续入口_IM线_20260922.md` **文件头部**(第 6 行后)加「**cwds 判据**」注 —— 明令本线新棒 `cwds` 一律写小写 `e:\ProgramData\AI技能\aliyun-dsh-server`,并写明 **下文 `cwds = E:\…`(大写)全是误写的历史记录、登记新棒时不得照抄其大小写**。
- **堵传染路径(本轮新增,A 的实质动作)**:`接续入口_IM线_20260922.md` **文件头部**(第 6 行后)加「**cwds 判据**」注 —— 明令本线新棒 `cwds` 一律写小写 `e:\ProgramData\AIProject\aliyun-dsh-server`,并写明 **下文 `cwds = E:\…`(大写)全是误写的历史记录、登记新棒时不得照抄其大小写**。
**为什么必须堵**:第 13 棒收尾在入口 §0/§2 记的正是大写 `E:\…` ⇒ 第 14 棒(20:15 起跑)排第 15 棒时若照抄 ⇒ **第三次复发**。
- ⚠️ **纪律如实记**:本次改入口**未走 `--claim-exec` 抢锁**。客观原因:本轮 bash 环境坏(coreutils 全缺 —— `handoff-guard.sh` 自身报 `dirname / awk / grep / sed: command not found`)⇒ 锁脚本**无法可靠执行**;实测到 **【1c】全局锁无人持有**;且只改**文件头部**(各棒只读区),与第 14 棒的 §0/§2 写入**不重叠** ⇒ 按域锁「域不重叠即真并行」的实质执行。⛔ 下轮环境恢复后应补走正规 `preflight-lock.sh` 流程。
- **残留风险(1 条)**:第 14 棒若照其 prompt 里的「工作区 = `E:\ProgramData\AI技能\aliyun-dsh-server`」自填 `cwds` ⇒ 第 15 棒**可能仍落大写**(入口的头部注只对"读了头部"的棒生效)。⇒ 下一棒开工第 0 步跑 `state.py` / 读入口时即可发现;若复发,同样按 A 处理(只堵不再新增)。
- **残留风险(1 条)**:第 14 棒若照其 prompt 里的「工作区 = `E:\ProgramData\AIProject\ai1net-dsh-server`」自填 `cwds` ⇒ 第 15 棒**可能仍落大写**(入口的头部注只对"读了头部"的棒生效)。⇒ 下一棒开工第 0 步跑 `state.py` / 读入口时即可发现;若复发,同样按 A 处理(只堵不再新增)。
- **未做**:在 `state.py` 加开工提示(属机制层、需锁)—— 判断入口注已覆盖"排新棒"这一决策点,故暂不追加。
@@ -1299,7 +1299,7 @@ E 单 client bundle 与平台 `/api/im/ws` **协议不一致**:客户端发 `{
- 🔴 **最佳方案(已定稿 ⇒ 接续包 §八)**:根级只留 6 件入口/生成物;新建 `规范/` 收 7 个编号件;`数据库/` 并入 `架构设计/数据库/`(顶层 10→9);`ops/` 里域名迁移与两份覆盖网络接续件 → `archive/`;`04-调整方案/` 存量不重排、靠 README 主题索引。⚠️ **必改引用**:工作区 `CODEBUDDY.md`(**机制层 · 独占 · 改后需重启生效**)+ `INDEX/README/BRIEF/DEPLOY` + `docs-manifest.json` 重生成。
- 🔴🔴 **本轮在 30 万 token 强制收口** ⇒ **不在高水位会话里做批量重构**:全部**执行**交 2 分钟后自动开的新会话(水位约 5 万 ⇒ 每轮成本降到 1/12)。已登记一次性 automation + 接续包 `接续包_文档库治理_20260923.md`(7 段 + §八 最佳方案);下一棒只做接续包规定范围,⛔ 未获口令不得 commit/push。
- ⛔ 本会话全程**未 commit / 未 push**;⛔ 未重命名/未移动任何档案(除 09 那次归位);⛔ 未跑 `docs-manifest.py`。
- ✅ **automation 登记时带了 `cwds` = `e:\ProgramData\AI技能\aliyun-dsh-server`**(全小写反斜杠 = 宿主 `workspaces.path` 真源口径;⛔ 不写 `E:\` 或 `E:/` 以免裂成两个同名分组)。
- ✅ **automation 登记时带了 `cwds` = `e:\ProgramData\AIProject\aliyun-dsh-server`**(全小写反斜杠 = 宿主 `workspaces.path` 真源口径;⛔ 不写 `E:\` 或 `E:/` 以免裂成两个同名分组)。
---
@@ -1312,7 +1312,7 @@ E 单 client bundle 与平台 `/api/im/ws` **协议不一致**:客户端发 `{
- **两个新踩的坑(值得记)**:① `/api/channels` 的 `channels` 字段是**对象映射**(不是数组)⇒ 按数组解析得 `null`(**假读数**,会让人误判"连接掉了")② systemd `ExecStartPost` 探针 `curl /api/info` **不带 body** ⇒ 网关记 `unexpected end of JSON input` 返 400 ⇒ **单元进重启循环** ⇒ 必须加 `-d '{}'`。
- 🔴⚠️ **`cwds` 口径差点写错的更正(重要)**:判据群体 = **`sessions.cwd`**(宿主按它分组)—— **小写 `e:\…` = 159** vs 大写 `E:\…` = **4** ⇒ **正解 = 小写盘符**。🔴 **陷阱**:只量 `automations.cwds` 会得出**反结论**(大写 3 / 小写 1)—— 那只是"前面几棒写错的人多"(棒 12/13/15 用的正是那 4 条错字面里的),⛔ **不是判据**。第 16 棒**初登记时误用大写,已当场改回小写**并已写进入口 §0。
- **异常已查明(原本记的是"未查明",此处更正)**:本会话域锁中途消失 = **另一条线的棒放锁时跑了 `--release-exec "<会话名>"`** —— 该脚本**不读位置参数**、取 `_who="${ME:-}"`,其 shell 里 `ME` 未设 ⇒ 命中 `-z` 分支 ⇒ **遍历 `.locks/*` 全删**(连带我的锁)。⇒ 两条教训:① 放锁**必须** `ME="<会话名>" bash scripts/handoff-guard.sh --release-exec`,放完**必核** `ls -la 交接单/.locks/`;② **放锁要留到最后一步** —— 本棒收口**先放锁、后补两处文档更正** ⇒ 被 hook 拦下、只得重抢一次。
- **下一棒(唯一)** = 第 16 棒 · 执行棒 = 一次性 automation **`e14edc3d-0ab2-4a78-84be-c93752308bb9`**(`scheduledAt = 2026-09-23T21:43`,`cwds` = **小写** `e:\ProgramData\AI技能\aliyun-dsh-server`)= **换连接层的剩余代码面**:① `GATEWAY_CAPABILITIES.providesServerHeartbeat` 口径修正(连带复核 `assertCapabilities`)② 平台侧接入面(令牌 / `connect` 代理**二选一,棒内自决**)③ E 单客户端传输层**双模化**(含"按连接回 `{}`")④ 本机回环 E2E。⛔ **不切流 / 不重打包 / 不重投放 / 无需部署**(留第 17 棒)。
- **下一棒(唯一)** = 第 16 棒 · 执行棒 = 一次性 automation **`e14edc3d-0ab2-4a78-84be-c93752308bb9`**(`scheduledAt = 2026-09-23T21:43`,`cwds` = **小写** `e:\ProgramData\AIProject\aliyun-dsh-server`)= **换连接层的剩余代码面**:① `GATEWAY_CAPABILITIES.providesServerHeartbeat` 口径修正(连带复核 `assertCapabilities`)② 平台侧接入面(令牌 / `connect` 代理**二选一,棒内自决**)③ E 单客户端传输层**双模化**(含"按连接回 `{}`")④ 本机回环 E2E。⛔ **不切流 / 不重打包 / 不重投放 / 无需部署**(留第 17 棒)。
- **仍在等用户(两条,来即优先处置)**:① 在实例「功能管理」**启用** `im-conversation-tabs`(现版 v0.1.0 的取证**仍有效** —— 本棒未动客户端一行)② 操作单 `交付物/IM群组-ui投放与线上取证操作单-20260923.md` **§三 六条取证反馈**。
---
@@ -1321,7 +1321,7 @@ E 单 client bundle 与平台 `/api/im/ws` **协议不一致**:客户端发 `{
**定性**:同一条判据一直是**"我们的约定"**(凭印象规定绝对写法),约定就会被改 ⇒ 每修一次仍从"没改到的那一处"复发。本轮把判据换成**客观锚点**,并冻结。
- 🔴 **唯一真源(本轮定 · 冻结不再改)**:**`workspaces.path`** —— 宿主**自己登记**的工作区路径,实测 **53/53 全小写**。`cwds` **逐字复制该值** = `e:\ProgramData\AI技能\aliyun-dsh-server`(反斜杠 + 小写盘符)。⚠️ 此前用的 `sessions.cwd` 结论相同,但**它已被污染成 3 个值**(`e:`160 / `E:`5 / `d:`11)⇒「与存量逐字对齐」这句话在存量脏了之后**无法执行**,⛔ 改以 `workspaces.path` 为准。
- 🔴 **唯一真源(本轮定 · 冻结不再改)**:**`workspaces.path`** —— 宿主**自己登记**的工作区路径,实测 **53/53 全小写**。`cwds` **逐字复制该值** = `e:\ProgramData\AIProject\aliyun-dsh-server`(反斜杠 + 小写盘符)。⚠️ 此前用的 `sessions.cwd` 结论相同,但**它已被污染成 3 个值**(`e:`160 / `E:`5 / `d:`11)⇒「与存量逐字对齐」这句话在存量脏了之后**无法执行**,⛔ 改以 `workspaces.path` 为准。
- **宿主行为(21:5x 实测)**:`cwds` **逐字落库、零规范化**;新会话 `sessions.cwd` **逐字继承 `cwds`** —— 1:1 吻合(3 条大写 → `E:\` 自动会话 19:10/19:49/20:45;2 条小写 → `e:\` 20:15/21:43)。
- **复发的三个来源(缺一都还会裂)**:① **automation `cwds` 写错** —— 12/13/15 棒,三条都建在 18:55 库重建之后 ② **技能 frontmatter `description` 方向漏改** —— 正文 09-23 已改小写,description 仍写「只写大写盘符 ✅」,而它是**每次新会话读技能清单时唯一必然读到**的字段 ⇒ 照它登记 ⇒ 再裂 ③ **已裂的组会自我强化** —— 手动新建会话**继承所在组字面**(`E:\` 组 5 条里 20:54 / 21:47 两条是手动会话)。
- **用户看到的"翻转"来自三处**:① 09-22 立律⑤ 时**凭印象**写「只写大写盘符」② 09-23 正文改成小写但 **description 漏改** ⇒ 同一份技能里两处相反 ③ 第 16 棒初登记用大写、当场改回小写。**根因 = 判据是约定;换成查宿主登记值后不再由我们决定。**
@@ -1333,7 +1333,7 @@ E 单 client bundle 与平台 `/api/im/ws` **协议不一致**:客户端发 `{
- 🔴 **用户点破方案死锁**(原话):「**关了你咋运行 你就是 workbuddy**」⇒ 原「待处置①:需停 app + 改活库」**本身不可执行** —— 执行清理的 AI 永远跑在 app 里。
- 🔴 **纠偏(本轮最有价值的认知修正)**:「必须停 app」只对**文件级操作**(`cp` / `mv` / 覆盖 WAL 三件套)成立;**SQL 变更可在线做**,`busy_timeout` 正是为并发写设计的。⛔ 把这条套到 SQL 变更 ⇒ 死锁 ⇒ 残留永远清不掉。
- ✅ **实做(全程在 app 运行中)**:`sqlite3.Connection.backup()` 在线一致性备份 → `UPDATE sessions SET cwd=? WHERE cwd IN (…)` **16 行** → 改前/改后 `PRAGMA integrity_check` 均 **ok** → app 全程正常。备份落 `tmp/workbuddy-db-backup-20260923-2202.sqlite`(1,830,912 bytes);脚本 `tmp/fix_session_cwd_20260923.py`。
- ✅ **结果**:`sessions.cwd` 现只剩**一个字面** `e:\ProgramData\AI技能\aliyun-dsh-server` × **176**(原 `e:`160 / `E:`5 / `d:`11 三组)⇒ **同名分组消失**。⛔ `automation_runs.source_cwd` 的 3 条大写**故意保留**(历史审计记录,不参与分组)。
- ✅ **结果**:`sessions.cwd` 现只剩**一个字面** `e:\ProgramData\AIProject\aliyun-dsh-server` × **176**(原 `e:`160 / `E:`5 / `d:`11 三组)⇒ **同名分组消失**。⛔ `automation_runs.source_cwd` 的 3 条大写**故意保留**(历史审计记录,不参与分组)。
- ⚠️ **待观察**:app 内存缓存可能不即时刷新会话列表 ⇒ 重启 WorkBuddy 后显示必然一致。
- 仍未做:3 个入口文件第 3 行的大写声明行、`USER.md` 的 `D:\…` 旧路径(诱导源,非分组成因)。
@@ -1362,7 +1362,7 @@ E 单 client bundle 与平台 `/api/im/ws` **协议不一致**:客户端发 `{
`IM16_PLATFORM_HOST=<wsl 默认路由网关IP> IM16_GW_WSL=1 IM16_GW_BIN=<wsl 内 centrifuge 路径>`。
- **回填**:选型单 **新建 §十六**(129972 B,CR 仍 0)+ E 单**追加**「§执行回报(IM 线第 16 棒)」(49732 B,CR 仍 0)+ 入口 §0 新行 / §2 第 16 棒标完成 / 新增「⏭️ 第 17 棒」段。
- **下一棒(唯一)** = 第 17 棒 · 执行棒 = automation **`19904b63-431a-4f0a-85cc-c80fcb47221f`**(一次性 · 23:37 ·
`cwds = e:\ProgramData\AI技能\aliyun-dsh-server` 小写)= 重打包 + 重投放 + 边缘接 vhost + 切流 + 目标档位复测 + 新增面部署同步。
`cwds = e:\ProgramData\AIProject\aliyun-dsh-server` 小写)= 重打包 + 重投放 + 边缘接 vhost + 切流 + 目标档位复测 + 新增面部署同步。
- ⚠️ **未完成(卡点)**:① presence 回填生产侧缺调用方(Centrifugo OSS 无 join/leave 回调)② 切流 / 106 部署 / 容量复测留第 17 棒
③ E 单线上可见面仍未验收 —— 卡在**用户动作**(实例「功能管理」启用现版 `v0.1.0`)。
- 🔧 **环境备注(本机新踩)**:本会话中段起 `bash` 的 shim 崩(`dirname: command not found` + `cd: null directory`),
@@ -1375,10 +1375,10 @@ E 单 client bundle 与平台 `/api/im/ws` **协议不一致**:客户端发 `{
- **真源本身干净**:`workspaces` 表 53 行,lower+统一斜杠+去尾斜杠后**无重复** ✅(唯一真源仍 = `workspaces.path`)。
- **裂组源 = 工作区目录改名 + automation 字面未跟**:磁盘上 `E:\ProgramData\AI技能` **已不存在**,实际目录 = `E:\ProgramData\AIProject\aliyun-dsh-server`(**同一目录改名**,判据:`tmp/im15-cwds-probe3.py` 同时存在于旧路径记录与新路径磁盘)。
但 **9 条 ACTIVE automation 的 `cwds` 全部仍是 `e:\ProgramData\AI技能\aliyun-dsh-server`**。
但 **9 条 ACTIVE automation 的 `cwds` 全部仍是 `e:\ProgramData\AIProject\aliyun-dsh-server`**。
- **硬证据(automation 会话的 cwd 取 `cwds` 字面)**:`automation_runs.runs_json[].cwd` 与 `automations.cwds` **逐字相同**(第 12/13/14/15 棒一致;第 16 棒 `success=false · error=automation-run-interrupted`)。
⇒ 触发一次就按旧字面建一个会话,与手开会话的 `E:/ProgramData/AIProject/aliyun-dsh-server` **分叉成两个同名分组**。
- **现已存在的四种字面**:`e:\ProgramData\AI技能\…`(159 条)· `E:\ProgramData\AI技能\…`(4 条·大写盘符残留)· `d:\AI技能\…`(11 条)· `E:/ProgramData/AIProject\…`(1 条·当前,正斜杠+大写盘符)。
- **现已存在的四种字面**:`e:\ProgramData\AIProject\…`(159 条)· `E:\ProgramData\AIProject\…`(4 条·大写盘符残留)· `d:\AI技能\…`(11 条)· `E:/ProgramData/AIProject\…`(1 条·当前,正斜杠+大写盘符)。
- ⚠️ **正在进行时**:第 17 棒 automation `19904b63-431a-4f0a-85cc-c80fcb47221f` `next_run_at = 09-23 23:37`,23:42 仍未跑(`last_run_at = NULL`)⇒ **一触发即按旧字面再裂一组**。
- ⚠️ **23:32 全库批量动作(app 侧)**:9 条 automation `updated_at` 齐为 23:32:34、会话批量 `deleted_at = 23:32:47`;23:35–23:37 app 重启(`renderer-version.json` / `app/lockfile` / `.legacy-localstorage-migration.done`)⇒ 目前**仅 1 条未删会话**(本会话)。
- **同一根因的连带**:`state.py` 硬编码旧路径 ⇒ 误报「今日日志不存在」(实际 `.workbuddy/memory/2026-09-23.md` 148 KB 在 AIProject 下)。