diff --git a/.workbuddy/memory/2026-09-24.md b/.workbuddy/memory/2026-09-24.md index 3427288..a03ef5d 100644 --- a/.workbuddy/memory/2026-09-24.md +++ b/.workbuddy/memory/2026-09-24.md @@ -187,3 +187,13 @@ - 顺带发现技能自身 2 处过时:`dsh-auto-handoff-chain/SKILL.md` §⑤ 仍写「cwds 必须反斜杠+大写盘符」,与 09-24 代码级实测(去重键 = `path.trim().toLowerCase()`,只小写、不统一斜杠;正解 = `E:/ProgramData/AIProject/aliyun-dsh-server` **正斜杠**)**打架**,且命令模板用的还是旧路径 ⇒ 待改。 - **处置(自决,未上抛)**:两处修复合计 >160 文件 ⇒ 命中「批量 >10 文件」红线 + 技能一类**必须逐条判**(不可机械替换)⇒ **建接力棒**。产出:`交付物/引用技能规则-体检报告-20260924.md` + `接续包_引用与技能纠偏_20260924.md`(**最终 md5 `ab17bde7bb65782d10be7d122546a8c5`**)+ automation **`8117f930-0cce-4a0e-a18d-50b32eb86fb8`**(一次性 · 08:15 · `cwds = E:/ProgramData/AIProject/aliyun-dsh-server`)。commit **`75c6612` → `17e2092`** 已推(远端 = 本地)。 - ⚠️ 口径约定:接续包**不自述 md5**(自述即自指)⇒ 校验值一律放 automation prompt 与 automation 记忆。 + +## 引用与技能纠偏 · 执行棒(会话 `引用纠偏1` · 08:15–08:5x · 已收口) + +- 接续包 `接续包_引用与技能纠偏_20260924.md` §5 全做完(md5 校验相符);锁已释放。回填见该包 §6。 +- **A 工作区 16 件**:`AI技能`→`AIProject`(含连字符化转录目录名)⇒ 残留 0;实测必改档 16 件(报告写 12),`交付物/**` 实测 9 件含旧路径(报告写 7)⇒ 按「含可执行命令者改」判 2 改 / 7 不改。 +- **B 文档库**:引用纠偏 16 件(`08-skills` 8 + `07-scripts` 4 + `01-规范` 2 + `INDEX`/`BRIEF`);**过度替换逐条判**——库错回改 12 件(`/api/skills`、`~/.workbuddy/skills`、技能自身 `scripts/`、官方仓 `native/system|apps/desktop`、平台仓 `scripts/`、`presets/*/skills`、`DSH_HOME skills/`),库对补本机 4 件(`05-交接单/`、`01-规范/`、`07-scripts/handoff-guard.sh`、`07-scripts/extract-user-voice.py`);技能本机↔库 **12/12 全同**。 +- **B4**:`dsh-auto-handoff-chain/SKILL.md` 律⑤ 改为「只写与手动开会话 cwd 逐字同形;判据 = 实测 `sessions.cwd`;正解 = `E:/ProgramData/AIProject/aliyun-dsh-server`(正斜杠)」,并按其自身「教训二」同步改 frontmatter `description`。 +- **C 收口**:四件套 rc=0 ×4|技能 12/12|活路径残留 0(历史叙述保留 12 处)|对账 289/289 文件一致、**内容 263/289**(26 件 = 改库未推服务器)。 +- **只报不改**:推镜像 26 件;`E:/ProgramData/AIProject/dsh-ai1net-github/` 5 常量+1 命令模板仍指已 GONE 的旧根 ⇒ 脚本失效,属别的线。 +- 🔧 教训:同一文件多处替换**必须聚合内存再一次写盘**(逐条写盘互相覆盖;本轮首跑踩到,靠复算发现)。校验法:命中数断言 + 幂等(`count==0 且新串已在` ⇒ 跳过)。 diff --git a/.workbuddy/memory/automations/8117f930-0cce-4a0e-a18d-50b32eb86fb8/memory.md b/.workbuddy/memory/automations/8117f930-0cce-4a0e-a18d-50b32eb86fb8/memory.md new file mode 100644 index 0000000..f3232de --- /dev/null +++ b/.workbuddy/memory/automations/8117f930-0cce-4a0e-a18d-50b32eb86fb8/memory.md @@ -0,0 +1,9 @@ +# automation 执行记忆 · 引用与技能纠偏线 + +- **2026-09-24 08:15–08:5x|执行棒(会话 `引用纠偏1`)** —— 接续包 §5 全做完,锁已释放。 + - 开工四步全过:`state.py`|接续包 md5 `ab17bde7bb65782d10be7d122546a8c5` **相符**|4 域锁抢到|库内规则章已读。 + - **A 工作区侧 16 件**落 `AI技能`→`AIProject`,该 16 件残留全 0(先 `README.md` 单点验证再推广)。 + - **B 文档库侧**:引用纠偏 16 件落地;过度替换**逐条判**(回改 12 件 / 补本机 4 件,全部存在性探针取证);技能本机↔库 **12/12 md5 全同 · 0 差异**;`dsh-auto-handoff-chain` 律⑤ 口径(实测 `sessions.cwd` + 正斜杠)+ `description` 同步改。 + - **C 收口**:四件套 rc=0 ×4|技能 12/12|活路径残留 0(历史叙述保留 12 处)|🔴 **对账 289/289 文件一致、内容 263/289** —— 26 件不一致 = 改库未推服务器的必然结果(§4 只报不改)。 + - **遗留(下一棒)**:① 推镜像 26 件 `/opt/dsh/docs` ② `dsh-ai1net-github` 5 常量+1 命令模板仍指旧根(脚本已失效,属别的线)③ 服务器 `08-skills` 落后一版。 + - 🔧 工具教训:多模式改同一文件必须**聚合内存再一次写盘**(逐条写盘会互相覆盖,本轮首跑即踩)。 diff --git a/.workbuddy/tools/find-session-by-title.py b/.workbuddy/tools/find-session-by-title.py index c84b70d..5e0b7a9 100644 --- a/.workbuddy/tools/find-session-by-title.py +++ b/.workbuddy/tools/find-session-by-title.py @@ -55,7 +55,7 @@ for size, proj, fn, titles, nu, fr in sorted(out, key=lambda x: -x[0]): print("=" * 78) print("本工作区全部会话的身份卡(标题 + 首问),供交叉确认") print("=" * 78) -d = os.path.join(ROOT, "e-ProgramData-AI技能-aliyun-dsh-server") +d = os.path.join(ROOT, "e-ProgramData-AIProject-aliyun-dsh-server") for fn in sorted(os.listdir(d)): if not fn.endswith(".jsonl"): continue diff --git a/.workbuddy/tools/guard-replay.py b/.workbuddy/tools/guard-replay.py index a98b7db..d68ce43 100644 --- a/.workbuddy/tools/guard-replay.py +++ b/.workbuddy/tools/guard-replay.py @@ -11,7 +11,7 @@ import json import os GUARD = r"D:\github\dsh_shenxian\dsh-server-docs\scripts\bash-output-guard.py" -PROJ = r"E:\ProgramData\.workbuddy\projects\e-ProgramData-AI技能-aliyun-dsh-server" +PROJ = r"E:\ProgramData\.workbuddy\projects\e-ProgramData-AIProject-aliyun-dsh-server" sp = importlib.util.spec_from_file_location("g", GUARD) g = importlib.util.module_from_spec(sp) diff --git a/.workbuddy/tools/relay-transfer.sh b/.workbuddy/tools/relay-transfer.sh index b9cef00..da78513 100644 --- a/.workbuddy/tools/relay-transfer.sh +++ b/.workbuddy/tools/relay-transfer.sh @@ -5,7 +5,7 @@ export PATH="/d/Program Files/Git/usr/bin:/c/Windows/System32:/c/Windows:$PATH" SSH="ssh -o BatchMode=yes -o ConnectTimeout=15" SCP="scp -q -o BatchMode=yes -o ConnectTimeout=15" P="$1"; N="$2"; DEST="$3" -L="/e/ProgramData/AI技能/aliyun-dsh-server/_relay-$N" +L="/e/ProgramData/AIProject/aliyun-dsh-server/_relay-$N" mkdir -p "$L" $SSH bt-server "stat -c '%s %n' /tmp/$P-*" > "$L/remote.txt" TOTAL=$(wc -l < "$L/remote.txt") diff --git a/.workbuddy/tools/sess-credit-report.py b/.workbuddy/tools/sess-credit-report.py index 78dc22f..ac21fe2 100644 --- a/.workbuddy/tools/sess-credit-report.py +++ b/.workbuddy/tools/sess-credit-report.py @@ -13,7 +13,7 @@ import re import sys from collections import Counter -PROJ = r"E:\ProgramData\.workbuddy\projects\e-ProgramData-AI技能-aliyun-dsh-server" +PROJ = r"E:\ProgramData\.workbuddy\projects\e-ProgramData-AIProject-aliyun-dsh-server" SID8 = sys.argv[1] if len(sys.argv) > 1 else "7057685c" P = None for fn in os.listdir(PROJ): diff --git a/.workbuddy/待落地/verify-stop-hook.py b/.workbuddy/待落地/verify-stop-hook.py index a665e83..3f54f70 100644 --- a/.workbuddy/待落地/verify-stop-hook.py +++ b/.workbuddy/待落地/verify-stop-hook.py @@ -12,7 +12,7 @@ import shutil import subprocess import time -WS = r'E:/ProgramData/AI技能/aliyun-dsh-server' +WS = r'E:/ProgramData/AIProject/aliyun-dsh-server' S = r'E:/ProgramData/.workbuddy/settings.json' CLI = r'C:/Users/Administrator/AppData/Local/Programs/WorkBuddy/resources/app.asar.unpacked/cli/dist/codebuddy-headless.js' NODE = r'E:/ProgramData/.workbuddy/binaries/node/versions/22.22.2-3/node.exe' diff --git a/.workbuddy/待落地/重启后待办.md b/.workbuddy/待落地/重启后待办.md index 456643e..d315a07 100644 --- a/.workbuddy/待落地/重启后待办.md +++ b/.workbuddy/待落地/重启后待办.md @@ -5,7 +5,7 @@ ## 1. ★ UserPromptSubmit 探针定论(最高优先,1 分钟) ```bash -cat "E:/ProgramData/AI技能/aliyun-dsh-server/.workbuddy/stop-dialog-guard.log" +cat "E:/ProgramData/AIProject/aliyun-dsh-server/.workbuddy/stop-dialog-guard.log" ``` | 观测 | 结论 | 动作 | |---|---|---| diff --git a/CODEBUDDY.md b/CODEBUDDY.md index 7f60d77..59beff9 100644 --- a/CODEBUDDY.md +++ b/CODEBUDDY.md @@ -58,7 +58,7 @@ | 当你准备… | 去查 | |---|---| -| **想知道"当前什么状态"(锁 / git 基线 / 待办 / 上次收口点)** | **先跑这一条**:`"E:/ProgramData/.workbuddy/binaries/python/versions/3.13.12/python.exe" "E:/ProgramData/AI技能/aliyun-dsh-server/state.py"`(约 30 行输出;`--online` 追加远端基线比对)。**它 1 次调用顶你十几轮探索** ⇒ ⛔ 跑完它之前**不许** Glob/Grep 全库摸底 | +| **想知道"当前什么状态"(锁 / git 基线 / 待办 / 上次收口点)** | **先跑这一条**:`"E:/ProgramData/.workbuddy/binaries/python/versions/3.13.12/python.exe" "E:/ProgramData/AIProject/aliyun-dsh-server/state.py"`(约 30 行输出;`--online` 追加远端基线比对)。**它 1 次调用顶你十几轮探索** ⇒ ⛔ 跑完它之前**不许** Glob/Grep 全库摸底 | | 回答"现在是什么状态 / 该读哪篇" | `D:\github\dsh_shenxian\dsh-server-docs\BRIEF.md`(现行事实,30 秒读完);**覆盖网络线**另有唯一入口 = 工作区根 `接续入口_覆盖网络线_20260916.md` | | **改任何文件之前(第一步,不是"检查"是"抢")** | **先抢全局执行锁**:`bash D:\github\dsh_shenxian\dsh-server-docs\07-scripts/handoff-guard.sh --claim-exec "<你的会话名>"` —— **抢到之前不要动任何文件**;**抢不到 = 有会话在跑 = 停手**。抢到后再跑一次信息模式,看占用与越界改动 | | 写 / 改前端页面(`web/*.html`、`.css`、client bundle) | `D:\github\dsh_shenxian\dsh-server-docs\01-规范\06-工作台UI规范.md`(**强制基线**;冲突时以其**实测 Token** 为准) | diff --git a/README.md b/README.md index 4a4871a..d8b22bd 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # 工作区目录规范 -本工作区(`E:\ProgramData\AI技能\aliyun-dsh-server`)的文件落位规则。新增任何文件前,先按本文决定放哪;根目录**不再新增散落文件**。 +本工作区(`E:\ProgramData\AIProject\aliyun-dsh-server`)的文件落位规则。新增任何文件前,先按本文决定放哪;根目录**不再新增散落文件**。 --- @@ -95,7 +95,7 @@ aliyun-dsh-server/ | | 本工作区 | 文档库 | |---|---|---| -| 路径 | `E:\ProgramData\AI技能\aliyun-dsh-server\` | `D:\github\dsh_shenxian\dsh-server-docs\` | +| 路径 | `E:\ProgramData\AIProject\aliyun-dsh-server\` | `D:\github\dsh_shenxian\dsh-server-docs\` | | 性质 | **工作现场**:过程文档、临时产物、线入口 | **正式档案库**:编号档案 `调整方案/01–141`、`BRIEF.md`、UI 规范、`INDEX.md` | | 版本控制 | 非 git 仓 | git 仓(单一来源,改动只从本机推送) | | 改动前 | 抢全局执行锁(`handoff-guard.sh --claim-exec`) | 抢锁 + 双端对账 | diff --git a/docs/覆盖网络/参数表_覆盖网络_20260917.md b/docs/覆盖网络/参数表_覆盖网络_20260917.md index c888a5e..09e8c42 100644 --- a/docs/覆盖网络/参数表_覆盖网络_20260917.md +++ b/docs/覆盖网络/参数表_覆盖网络_20260917.md @@ -29,7 +29,7 @@ - **观测阈值行格式**:``| `OBS-NN` | 指标 | 阈值(引用键或字面值) | 判据 |`` - ✅ **`scripts/overlay-probe.cjs` 的每一个阈值都从本表读**,⛔ 脚本内**不许有魔数**(判据 = 交接单 §6 **E6**)。 - 探针运行方式(**一条命令**,cwd = 工作区根): - `cd "E:/ProgramData/AI技能/aliyun-dsh-server" && node "D:/github/dsh_shenxian/scripts/overlay-probe.cjs"` + `cd "E:/ProgramData/AIProject/aliyun-dsh-server" && node "D:/github/dsh_shenxian/scripts/overlay-probe.cjs"` --- @@ -823,7 +823,7 @@ RELAY_MAX_HOSTS = floor(C_RELAY × DESIGN_MARGIN) = floor(16700 × 0.45) `{"degraded":true,"degradedLegs":["joinConf"],"joinConf":{"available":false,"reason":"module-missing","missing":[{"spec":"../lib/net/relay/registry.js",…}]}}` ⇒ 文本行 `join 回读:⛔ 不可用(module-missing)—— 缺 …|⚠️ 这是「没装」不是「没采到」`。**其余子命令与其余读数照常**(106 上 `status` / `punch` / `selfcheck` **三条全通**,`candAcc=3 / candRej=9 / silent=0 / 打洞双向=true / 冷却 300000 / 零值 throws`)。🔴 **⛔ 不许静默返"没有"**:缺块**不填** `direct` / `readback`("没装"与"跑了但读数为空"**形状不同** = 可分)。 - ⚠️ **随之而来的 `OBS-26` 子判据口径(登记在此,§6 行文本本棒 ⛔ 未改 —— 为保 §10 指纹)**:读数生产方**显式**给出 `joinConf.available === false` 时,`OBS-26` 的 join 子判据取 **SKIP + 留痕**(⛔ 不判红,detail 点名缺哪个模块);**老形状(无 `available` 键)走原路径、判定与文本逐字不变**。⇒ 下次有键值变更时**顺带并入 §6 `OBS-26` 行**。 -**④ 读数(零回归 + 106 侧)**:探针 **28 PASS / 0 SKIP / 0 FAIL**(rc=0;**代码仓根不给 `--table` 一次 + 收口后工作区根一次,两次同值**)|`npm.cmd test` **201/200/0/1**(逐字同基线;`duration_ms=53315.1989`)|`--scene all`(**无 `--table`,从代码仓根**)**12 PASS / 0 SKIP / 0 FAIL**(rc=0;**6m23s**;`幕4-C` **17240 ms / 30000 ms**;表路径原文 `# 参数表=E:\ProgramData\AI技能\aliyun-dsh-server\参数表_覆盖网络_20260917.md`)。**106 侧**:`status` / `selfcheck --json` / `punch --peer 47.77.182.89:21100` **三条 rc=0**(punch 原文 `窗内零收包(deadline 3000 ms,实耗 3000 ms,发 21 包)⇒ 判死 + 进冷却 300000 ms`)。**探针三处副本 md5 全同** = `4734686b5270059697ccbcf966c34ade`(仓 / 47 `/opt/dshs/scripts` / 106 `/opt/dshs-cluster/scripts`);**回滚点** = 两机 `/opt/dsh/backups/seq43-20260918-150549/`(md5 `8d1ea60a01fc09fb5f56e492afb76fc9`)。 +**④ 读数(零回归 + 106 侧)**:探针 **28 PASS / 0 SKIP / 0 FAIL**(rc=0;**代码仓根不给 `--table` 一次 + 收口后工作区根一次,两次同值**)|`npm.cmd test` **201/200/0/1**(逐字同基线;`duration_ms=53315.1989`)|`--scene all`(**无 `--table`,从代码仓根**)**12 PASS / 0 SKIP / 0 FAIL**(rc=0;**6m23s**;`幕4-C` **17240 ms / 30000 ms**;表路径原文 `# 参数表=E:\ProgramData\AIProject\aliyun-dsh-server\参数表_覆盖网络_20260917.md`)。**106 侧**:`status` / `selfcheck --json` / `punch --peer 47.77.182.89:21100` **三条 rc=0**(punch 原文 `窗内零收包(deadline 3000 ms,实耗 3000 ms,发 21 包)⇒ 判死 + 进冷却 300000 ms`)。**探针三处副本 md5 全同** = `4734686b5270059697ccbcf966c34ade`(仓 / 47 `/opt/dshs/scripts` / 106 `/opt/dshs-cluster/scripts`);**回滚点** = 两机 `/opt/dsh/backups/seq43-20260918-150549/`(md5 `8d1ea60a01fc09fb5f56e492afb76fc9`)。 **⑤ 产物** = 工作区根 **`交接单_覆盖网络直连与P2P_20260918.md` §8.10**(**§8 前前缀 `8925c2460810c6dc5cdbc075b6cdaed2` 写入后逐字不变** ✅)。🔴 **D8(云安全组)本棒零动作**(⛔ 未改云侧规则、⛔ 无 `0.0.0.0/0` 形态、⛔ 未索取 / 未硬编码 AK/SK)—— 仍在册待拍板。 diff --git a/docs/覆盖网络/覆盖网络_设备登录接入_决策与改造方案_20260920.md b/docs/覆盖网络/覆盖网络_设备登录接入_决策与改造方案_20260920.md index 9e80b57..e00e7a1 100644 --- a/docs/覆盖网络/覆盖网络_设备登录接入_决策与改造方案_20260920.md +++ b/docs/覆盖网络/覆盖网络_设备登录接入_决策与改造方案_20260920.md @@ -108,6 +108,6 @@ ## §7 关联文档 - 交接单(执行载体):`dsh-server-docs/交接单/覆盖网络-序46-设备登录接入网络.md` -- 对接(桌面线):`E:\ProgramData\AI技能\dsh-ai1net-desktop\docs\对接单_桌面端接入覆盖网络_给平台会话_20260920.md` +- 对接(桌面线):`E:\ProgramData\AIProject\dsh-ai1net-desktop\docs\对接单_桌面端接入覆盖网络_给平台会话_20260920.md` - 规模推演(千台量级):`覆盖网络_千台全场景推演_20260916.md`、`覆盖网络_百台规模推演_20260916.md` - 路径/参数:`参数表_覆盖网络_20260917.md`;线入口 = 工作区根 `接续入口_覆盖网络线_20260916.md` diff --git a/交付物/DB修复-workbuddy.db损坏诊断与方案-20260923.md b/交付物/DB修复-workbuddy.db损坏诊断与方案-20260923.md index c18d3c9..122aa0c 100644 --- a/交付物/DB修复-workbuddy.db损坏诊断与方案-20260923.md +++ b/交付物/DB修复-workbuddy.db损坏诊断与方案-20260923.md @@ -75,7 +75,7 @@ Get-Process WorkBuddy -ErrorAction SilentlyContinue # 1. 停掉 WorkBuddy(关闭应用) # 2. 应急副本(已在 2026-09-23 18:36 生成一份,可再确认) -# E:\ProgramData\AI技能\aliyun-dsh-server\tmp\dbrescue-20260923\ +# E:\ProgramData\AIProject\aliyun-dsh-server\tmp\dbrescue-20260923\ # (workbuddy.db / -wal / -shm 三件套,35,377,152 + 4,346,632 + 32,768 字节) # 3. 把坏的三件套改名(⛔ 不删,留回退路) @@ -85,8 +85,8 @@ Rename-Item workbuddy.db-wal workbuddy.db-wal.broken-20260923 Rename-Item workbuddy.db-shm workbuddy.db-shm.broken-20260923 # 4. 顺手保一份独立数据面(文件形态,防 app 重建时一并重置) -Copy-Item -Recurse E:\ProgramData\.workbuddy\sessions E:\ProgramData\AI技能\aliyun-dsh-server\tmp\dbrescue-20260923\sessions -Copy-Item -Recurse E:\ProgramData\.workbuddy\tasks E:\ProgramData\AI技能\aliyun-dsh-server\tmp\dbrescue-20260923\tasks +Copy-Item -Recurse E:\ProgramData\.workbuddy\sessions E:\ProgramData\AIProject\aliyun-dsh-server\tmp\dbrescue-20260923\sessions +Copy-Item -Recurse E:\ProgramData\.workbuddy\tasks E:\ProgramData\AIProject\aliyun-dsh-server\tmp\dbrescue-20260923\tasks # 5. 重启 WorkBuddy ⇒ app 依据 .workbuddy-sqlite-migrations 自动建新库 ``` diff --git a/交付物/插件建库权限-一次性执行.sh b/交付物/插件建库权限-一次性执行.sh index 88776d7..fc126cb 100644 --- a/交付物/插件建库权限-一次性执行.sh +++ b/交付物/插件建库权限-一次性执行.sh @@ -5,7 +5,7 @@ # 替代件:交付物/建库权限-D档被证伪与修正判定-20260923.md # ============================================================================== # D 档一次性落地:建库函数 + 7 条验收 + 锁管理(幂等 · 可重复跑) -# 用法: bash "E:/ProgramData/AI技能/aliyun-dsh-server/交付物/插件建库权限-一次性执行.sh" +# 用法: bash "E:/ProgramData/AIProject/aliyun-dsh-server/交付物/插件建库权限-一次性执行.sh" # 设计目标:**把占锁窗口压到 ~40 秒**(抢不到就立刻退出,不空转) # 退出码: 0=全绿 2=DDL/验收失败 3=抢锁失败(别的会话在跑) # ⚠️ 本脚本会 `su postgres` 建 SECURITY DEFINER 函数 —— 已由用户 2026-09-22 19:3x 拍板 D diff --git a/接续入口_IM线_20260922.md b/接续入口_IM线_20260922.md index 6e9ca7b..0084232 100644 --- a/接续入口_IM线_20260922.md +++ b/接续入口_IM线_20260922.md @@ -4,7 +4,7 @@ > **开线棒**:会话 `aliyun-dsh-server` · 2026-09-22 16:4x(用户当场提要求,本会话因上下文过高收口开线) > **上游文档**(文档库 = `D:\github\dsh_shenxian\dsh-server-docs`):`调整方案/142-IM群组对话-需求基线与方案.md`(需求基线)+ 五份交接单 `交接单/IM群组-{A,B,C,D,E}-*.md`(均已按 09-22 两份架构定稿对齐,各单 §〇) > **代码基线**:`D:\github\dsh_shenxian`(生产口径 `dshs`) -> 🔴 **cwds 判据(2026-09-23 加;**优先级高于本文任何历史记录**)**:本线接续棒的 automation `cwds` 一律写 **小写盘符 + 反斜杠** —— `e:\ProgramData\AI技能\aliyun-dsh-server`。宿主**逐字落库、⛔ 不规范化**(连大小写也不),写法不同即裂成**两个同名会话分组**(09-22 正斜杠裂一次、**09-23 大写盘符又裂一次**)。⛔ **下文出现的 `cwds = E:\…`(大写盘符)全是误写的历史记录,登记新棒时不得照抄其大小写。** +> 🔴 **cwds 判据(2026-09-23 加;**优先级高于本文任何历史记录**)**:本线接续棒的 automation `cwds` 一律写 **小写盘符 + 反斜杠** —— `e:\ProgramData\AIProject\aliyun-dsh-server`。宿主**逐字落库、⛔ 不规范化**(连大小写也不),写法不同即裂成**两个同名会话分组**(09-22 正斜杠裂一次、**09-23 大写盘符又裂一次**)。⛔ **下文出现的 `cwds = E:\…`(大写盘符)全是误写的历史记录,登记新棒时不得照抄其大小写。** --- @@ -131,7 +131,7 @@ - ✅ **2026-09-23 19:0x|automation 库已自愈(app 自动重建)+ 第 12 棒接续棒已补登** —— **库状态(实测)**:`workbuddy.db` **magic 已恢复为 `SQLite format 3`**(mtime **18:55**);损坏库被 app 自动改名留档 = `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`)⇒ 下行「登记受阻」块**已解**。 + **补登结果**:第 12 棒(动工连接层 B 案)已登记 = automation **`89e11630-4a06-41ca-bfc7-3c66ff4d8a53`**(一次性 · `scheduledAt = 2026-09-23T19:10` · `cwds = E:\ProgramData\AIProject\aliyun-dsh-server`)⇒ 下行「登记受阻」块**已解**。 🔴 **B 案零开工取证(本行实跑)**:`grep -ril "centrifugo\|ImConnectionBackend\|connection-backend" src poc test` ⇒ **零命中**;`src/im/` 仍为原 8 文件 + `sdk/` ⇒ 与「第 11 棒收口时⛔尚无一行按新档位改动的代码」一致。 🔴 **编号口径更正(本节内两处撞号)**:§2 那段标题与下行受阻块原写「第 11 棒」,与 §0 已完成的第 11 棒(①档位重写 + 收口)**撞号** ⇒ 本节起**下一棒 = 第 12 棒**(与手工接力模板的会话名 `IM线-第12棒` 一致)。 🔴 **E 单线上可见面的缺口(本行实查,⛔ 尚无人认领)**:投放线入口 `接续入口_插件投放与分库线_20260922.md` 里 **`im-conversation-tabs` 零命中** ⇒ 该投放**没有落在任何一方的待办清单上**(本线 §0/§3-③ 说"须投放线接力",投放线入口没登记它)⇒ **第 12 棒收口时须显式登记到投放线**(或本线自行排棒)。 @@ -148,7 +148,7 @@ ⚠️ **口径更正(本棒)**:「心跳超时率 = 0」**不能**直接用 `e2sum.py` 的 `hbTimeoutRate`(它把爬坡期建立的连接也算作"应完成整轮" ⇒ 结构性非零:1k 0.0005 / 5k 0.0067 / 10k 0.042–0.052)⇒ **权威判据应改为「服务端 `num_clients` 不下降 + worker `closed=0`」**(E-7 的 `conn` 口径两条都满足)。 ⚠️ **未完成项**:在线态取数**未接线**(`stats().presenceIngest='not-wired'`)|gateway **未部署**(47/106 一行未动)|**客户端侧垫片未接线**(被 P0 阻塞)|50k 以上容量为线性外推、CPU 未测。 ⛔ 未 commit/push/scp|⛔ 未部署|⛔ 未动 47/106|⛔ 未引入新依赖|⛔ 未改 A–E 五单结论|⛔ 未替用户拍 §14.6 的未决项。 - **下一棒(唯一)** = **第 13 棒 · 执行棒** = automation **`31f0b0d7-f652-4081-88d0-3aec69136949`**(一次性 · `scheduledAt = 2026-09-23T19:43` · `cwds = E:\ProgramData\AI技能\aliyun-dsh-server`)= **修 §15.7 的 P0(客户端协议对齐 + 保活垫片接进客户端传输层)**,动作见 **§2「⏭️ 第 13 棒」**。排它的理由 = **先修掉阻塞「已交付功能」的缺陷**(属客观可判,非业务优先级);② 部署 + ③ 在线态接线排在它之后。 + **下一棒(唯一)** = **第 13 棒 · 执行棒** = automation **`31f0b0d7-f652-4081-88d0-3aec69136949`**(一次性 · `scheduledAt = 2026-09-23T19:43` · `cwds = E:\ProgramData\AIProject\aliyun-dsh-server`)= **修 §15.7 的 P0(客户端协议对齐 + 保活垫片接进客户端传输层)**,动作见 **§2「⏭️ 第 13 棒」**。排它的理由 = **先修掉阻塞「已交付功能」的缺陷**(属客观可判,非业务优先级);② 部署 + ③ 在线态接线排在它之后。 ✅ **收尾五件全过**:① 结果回填(选型单 §十五)② 域锁已 `--release-exec`(复核 `交接单/.locks/` 为空)③ 下一棒已登记(= 上行 automation `31f0b0d7`;automation 库本轮实测**可写**)④ 入口 §0/§2 已推进 ⑤ 当日日志 `.workbuddy/memory/2026-09-23.md` 已追加。 ✅ **顺带办掉一条跨线缺口(本行第 136–137 行)**:E 单投放面此前"两不管" ⇒ 已在**投放线入口 §5「本线后续」新增第 5 条**(写明"硬阻塞 = 本棒 P0")+ 改正该入口 §0 末行「automation 不可用」的**过时前提**(库 18:55 已由 app 重建)。⚠️ **该投放的归属仍未认领** ⇒ 已列进 §2「第 13 棒」的连带待办。 ⚠️ **编辑事故与修复**:插入 §2「第 13 棒」块时**误把 §3 的标题行当作了 `old_string`** ⇒ 一度删掉 `## §3 已取事实…`;本棒已复原,`grep "^## §"` 复核 §0/§1/§2/§3/§4/§5/§6 **齐全**。教训:用 Edit 插块时 ⛔ 不要把**下一节的标题行**当锚点。 @@ -162,9 +162,9 @@ **三处口径偏离(已逐条写进回报 §6)**:① `resume` 的 `since` **不用** `subscribed` 回带的 `cursor`(那是**房间最新 seq** ⇒ 补拉取出 0 条),改用**本端自己的进度** `cursorRef.current` ② 发送路径**保持 REST**(入口那条以"bundle 没有发送路径"为前提,**该前提不成立** ⇒ ⛔ 未做未被要求的路径变更)③ REST `pull(cursorRef.current)` **保留不动**(E 单既有判据 `E-9c`),与 WS `resume` 并存且按 `m.id` 去重。 🔴 **未完成项**:**E 单线上可见面(生效链路第 ④ 关)仍未验收** —— 须走候选池投放 → 用户自助启用 → **重启实例** ⇒ E 单 ⛔ **仍不能判「已交付」**;本棒只解掉它的**唯一硬阻塞**。 ⛔ 未改 `src/im/**` | ⛔ 未改 A–E 五单结论 | ⛔ 未部署 / 未投放 | ⛔ 未 commit/push/scp | ⛔ 未引入新依赖 | ⛔ 未动 47 / 106 | ⛔ 未碰 §14.6 未决项。 - **下一棒(唯一)** = **第 14 棒 · 执行棒** = automation **`2d059ec8-0664-45de-a1c1-e8478f1686df`**(一次性 · `scheduledAt = 2026-09-23T20:15` · `cwds = E:\ProgramData\AI技能\aliyun-dsh-server`)= **认领并执行 `im-conversation-tabs` 的投放(可自动部分)+ 出线上取证清单**,动作见 **§2「⏭️ 第 14 棒」**。 + **下一棒(唯一)** = **第 14 棒 · 执行棒** = automation **`2d059ec8-0664-45de-a1c1-e8478f1686df`**(一次性 · `scheduledAt = 2026-09-23T20:15` · `cwds = E:\ProgramData\AIProject\aliyun-dsh-server`)= **认领并执行 `im-conversation-tabs` 的投放(可自动部分)+ 出线上取证清单**,动作见 **§2「⏭️ 第 14 棒」**。 -- ✅ **2026-09-23 20:2x|第 14 棒(执行棒)✅ 完成 —— `im-conversation-tabs` 的投放(可自动部分)已落地 47;E 单只剩「用户点启用」这一步** —— 回填见 `交接单/IM群组-E-会话界面UI.md` 新追加的 **§执行回报(IM 线第 14 棒)**(⛔ E 单正文与结论一字未改)+ 操作单 `E:\ProgramData\AI技能\aliyun-dsh-server\交付物\IM群组-ui投放与线上取证操作单-20260923.md`。 +- ✅ **2026-09-23 20:2x|第 14 棒(执行棒)✅ 完成 —— `im-conversation-tabs` 的投放(可自动部分)已落地 47;E 单只剩「用户点启用」这一步** —— 回填见 `交接单/IM群组-E-会话界面UI.md` 新追加的 **§执行回报(IM 线第 14 棒)**(⛔ E 单正文与结论一字未改)+ 操作单 `E:\ProgramData\AIProject\aliyun-dsh-server\交付物\IM群组-ui投放与线上取证操作单-20260923.md`。 **投放物**:`@dsh-local/im-conversation-tabs` v`0.1.0`|tgz sha256 **`c9b1184aca8eadd6c84316d2e79427546a65f59f0614a2ec9704c895a311bfb1`**(21,494 B)|`lib/client.js` md5 **`21fbc52fdedc9915238dd1c3f5c5e827`**(=第 13 棒修完 P0 的那一版,本机源 / tgz 包内 / 47 共享层**三处逐字一致**)。 **判据读数**:① 包三件齐断言 **rc=0**(`exports['./client']` / `dsh.client.platform='web'` / `dsh.bundle.patch`)② `POST /api/plugins/business` ⇒ **http=200**、池 **4 → 5**、`replaced:false`、`trustedOverride:false`、`compat.level:"unknown"`(非 incompatible)、无 P0 命中 ③ `POST /api/plugins/business/share` ⇒ **http=200 `action:"created"`**、`fileRef = link:/var/lib/dshs/bundled-plugins/_dsh-local_im-conversation-tabs`(root:root、全 world-readable)④ 审计 `audit_log` id **360**(upload)/ **361**(share)⑤ 回滚素材 `/opt/dsh/backups/plugins/_dsh-local_im-conversation-tabs/0.1.0.tgz`。⛔ 未铺 profile、⛔ 未改任何源码、⛔ 未 commit/push/scp。 🔴 **本棒自决项(可推翻)**:入口 §2 只写「打进候选池」,本棒**同时发布到共享层** —— 装配协议是 `link:`(09-23 拍板)⇒ profile 写的是软链依赖、目标是共享层目录,**只进池不发布**用户启用必撞 `plugin_bundle_missing`(=半成品投放)。⇒ 已写进投放线入口 §5-5:**本线后续给任何插件投放都要带上这一步**。 @@ -172,7 +172,7 @@ ⚠️ **另两条实测发现(只报告未动,R7)**:① 47 上在跑的 **admin 实例**其 bwrap **没有** `--ro-bind-try /var/lib/dshs/bundled-plugins`(scope 启动于 **09-21 00:55**,早于该绑定上线;47 的 `orchestrator.js:1047-1048` 已含)⇒ **必须走一次重启**才带上——**启用动作自带重启**,无需额外动作;106 在跑的实例 cmdline 里**有**该绑定。② 47 admin profile 有一条 **09-21 的陈旧软链** `node_modules/@dsh-local/storyforge`(`dependencies`/`bundles` 里都已无),第 8 棒探针残留;③ 发现 **13 条 `user_agent='poc-curl2'` 的历史临时 admin 会话**未清(TTL 600 s ⇒ 早已过期)——本棒**只删自己那一条**(`deleted_sessions=1`),其余只报告。 ⚠️ **未完成项(卡点,⛔ 非"更慢更绕")**:① **E 单「线上可见面」仍未验收** —— 卡在**用户动作**(实例「功能管理」启用),本棒把"无解"推进到"只差点一下",⛔ 不能替用户点 ② **106 共享层缺该包** ⇒ 若目标实例在 106 启用会失败(属「跨节点内容分发」立项面,操作单 §四-1 已给手工同步命令,**本棒未执行**)③ 在线态取数未接线 / gateway 未部署(与第 12 棒同一批,排在再后)。 ⛔ 未改 `src/im/**` | ⛔ 未改 `poc/im-conversation-tabs/**`(打包只做**只读复制**)| ⛔ 未改 A–E 五单结论 | ⛔ 未 commit/push/scp | ⛔ 未引入新依赖 | ⛔ 未铺 profile | ⛔ 未取用 47 的 PG 凭据 | ⛔ 未碰 §14.6 未决项 | ⛔ 未替用户点启用。 - **下一棒(唯一)** = **第 15 棒 · 执行棒** = automation **`4e08cc77-c222-43ee-a3f5-521baebe2d70`**(一次性 · `scheduledAt = 2026-09-23T20:45` · `cwds = E:\ProgramData\AI技能\aliyun-dsh-server`)= **47 就地部署连接层 gateway + 在线态取数接线**(第 12 棒 §十五 的两个未完成项),动作见 **§2「⏭️ 第 15 棒」**。⚠️ 若用户先反馈了操作单 §三 的六条取证结果 ⇒ **优先按反馈处置**(那是"已交付功能"的验收面)。 + **下一棒(唯一)** = **第 15 棒 · 执行棒** = automation **`4e08cc77-c222-43ee-a3f5-521baebe2d70`**(一次性 · `scheduledAt = 2026-09-23T20:45` · `cwds = E:\ProgramData\AIProject\aliyun-dsh-server`)= **47 就地部署连接层 gateway + 在线态取数接线**(第 12 棒 §十五 的两个未完成项),动作见 **§2「⏭️ 第 15 棒」**。⚠️ 若用户先反馈了操作单 §三 的六条取证结果 ⇒ **优先按反馈处置**(那是"已交付功能"的验收面)。 - ✅ **2026-09-23 21:3x|第 15 棒(执行棒)✅ 完成 —— 47 就地部署连接层 gateway + 在线态取数接线(第 12 棒 §十五 的两个未完成项**全部闭合**)** —— 回填见选型单 `交接单/IM群组-稳定性机制与框架选型.md` 新追加的 **§15.11**(⚠️ 落点**不是**本入口原写的「§15.8」—— §15.8 已被「未完成项 / 已知限」占用 ⇒ 改落 §15.11,⛔ §十五 既有小节一字未改,只在 §15.8 表前加了一段 🔻 状态标注)。 **交付(①代码面 / ②47 部署面)**:① `src/im/presence-ingest.ts` **新建**(取数端口 + fail-closed 解析器 + 常量时间 `secretEquals`)+ `src/im/connection-backend.ts`(增可选 `presenceIngest`)+ `backends/{native,gateway}.ts`(自述如实报 `local-hub` / 未接线则仍自曝 `not-wired`)+ `src/web/routes/im.ts`(**网关回调面 `POST /api/im/gateway/presence`** + 成员表/发消息的在线态改走端口 + `stats()` 增 `presenceIngest` / `presenceOnline`)+ 新测 `test/im-presence-ingest.test.mjs` **13 用例**;② 47 上 **20 个 `lib/**` 产物逐字一致**(属主 `root:root`)+ 网关进程 `/opt/dsh-gateway/centrifugo`(v6.9.6,sha256 `f4869bf9…a848c`)+ `config.json`/`gateway.env`(600)+ 单元 `dsh-gateway.service`(enabled+active、**只绑 `127.0.0.1:18081`**、公网 IP 探测 rc=7)+ 边缘片段落盘 + 旧产物备份 `/opt/dsh/backups/im-gateway-deploy-20260923-210125/`。 @@ -182,8 +182,8 @@ ⚠️ **未完成项(卡点,⛔ 非"更慢更绕")**:① **边缘未接进生效 vhost**(边界明令本棒不切流;片段已落盘 + `nginx -t` rc=0、生效 vhost md5 `897c26bf89165e55a7a22a8c46932972` 未变 ⇒ 只剩"插入 `ai1net.com.conf` 443 块 + reload"一步)② **客户端侧未按网关协议接入**(E 单 bundle 传输层仍按平台协议 ⇒ **切流的硬前置**)③ **106 未部署**(本棒只做 47)④ **容量未复测**(未切流 ⇒ 复测条件未到)。 ⚠️ **一条异常(原因已查明)**:抢锁约 30 分钟后 `交接单/.locks/` **被清空**(本会话域锁消失、写文档被 hook 拦下)⇒ 已**重抢同一组域**并复核 `OWNER`(会话名/session_id 吻合)后继续。🔴 **原因 = 另一条线的棒放锁跑了 `--release-exec "<会话名>"`(脚本不读位置参数、取 `_who="${ME:-}"`,其 shell `ME` 未设)⇒ 命中 `-z` 分支 ⇒ 遍历 `.locks/*` 全删**(已记当日日志 + 沉淀 PLAYBOOK §24.4)⇒ ⛔ 与本棒无关。✅ 正确姿势 = `ME="<会话名>" bash scripts/handoff-guard.sh --release-exec` + 放锁后必核 `.locks/`;本棒收口已按此执行(**只释放自己的锁**)。 ⛔ 未 commit/push/scp 源码(部署产物除外)|⛔ 未动 `poc/im-conversation-tabs/**` 一行|⛔ 未改 A–E 五单结论|⛔ 未引新依赖进 `src/**`(网关是**外部进程**)|⛔ 未动 106 用户实例面|⛔ 未取用 DB 凭据|✅ 清场:`poc-curl2` 临时会话 **0**、47 `/tmp` 残留 **0**、演练连接 **0**。 - **下一棒(唯一)** = **第 16 棒 · 执行棒** = automation **`e14edc3d-0ab2-4a78-84be-c93752308bb9`**(一次性 · `scheduledAt = 2026-09-23T21:43` · `cwds = e:\ProgramData\AI技能\aliyun-dsh-server` **小写盘符**)= **换连接层的剩余代码面:① 能力口径修正(`providesServerHeartbeat`)② 平台侧接入面(令牌 / `connect` 代理二选一,执行棒自决)③ E 单客户端传输层双模化(含"按连接回 `{}`")④ 本机回环 E2E**,动作见 **§2「⏭️ 第 16 棒」**。⚠️ 若用户先反馈了操作单 §三 的六条取证结果 ⇒ **优先按反馈处置**。⚠️ **本棒不切流 / 不重打包 / 不重投放 / 无需部署**(切流 + 重投放 + 目标档位复测留第 17 棒,届时再排)。 - ⚠️ **`cwds` 字面取证 —— 本棒一次差点写错的更正(⛔ 记下来别再犯)**:判据群体 = **`sessions.cwd`**(宿主就是按它分组)—— **小写 `e:\ProgramData\AI技能\aliyun-dsh-server` = 159** vs 大写 `E:\ProgramData\AI技能\aliyun-dsh-server` = **4** ⇒ **正解 = 小写**。🔴 **陷阱**:若只量 `automations.cwds` 会**得出反结论**(大写 3 / 小写 1)—— 那只是"前面几棒写错的人多"(棒 12/13/15 用的正是那 4 条错字面里的),⛔ **不是判据**。⇒ 第 16 棒 `cwds` 已按**小写**登记(本棒初登记时曾误用大写,已当场改正)。 + **下一棒(唯一)** = **第 16 棒 · 执行棒** = automation **`e14edc3d-0ab2-4a78-84be-c93752308bb9`**(一次性 · `scheduledAt = 2026-09-23T21:43` · `cwds = e:\ProgramData\AIProject\aliyun-dsh-server` **小写盘符**)= **换连接层的剩余代码面:① 能力口径修正(`providesServerHeartbeat`)② 平台侧接入面(令牌 / `connect` 代理二选一,执行棒自决)③ E 单客户端传输层双模化(含"按连接回 `{}`")④ 本机回环 E2E**,动作见 **§2「⏭️ 第 16 棒」**。⚠️ 若用户先反馈了操作单 §三 的六条取证结果 ⇒ **优先按反馈处置**。⚠️ **本棒不切流 / 不重打包 / 不重投放 / 无需部署**(切流 + 重投放 + 目标档位复测留第 17 棒,届时再排)。 + ⚠️ **`cwds` 字面取证 —— 本棒一次差点写错的更正(⛔ 记下来别再犯)**:判据群体 = **`sessions.cwd`**(宿主就是按它分组)—— **小写 `e:\ProgramData\AIProject\aliyun-dsh-server` = 159** vs 大写 `E:\ProgramData\AIProject\aliyun-dsh-server` = **4** ⇒ **正解 = 小写**。🔴 **陷阱**:若只量 `automations.cwds` 会**得出反结论**(大写 3 / 小写 1)—— 那只是"前面几棒写错的人多"(棒 12/13/15 用的正是那 4 条错字面里的),⛔ **不是判据**。⇒ 第 16 棒 `cwds` 已按**小写**登记(本棒初登记时曾误用大写,已当场改正)。 - ✅ **2026-09-23 23:1x|第 16 棒(执行棒)✅ 完成 —— 换连接层的剩余代码面全部闭合** —— 回填见选型单 `交接单/IM群组-稳定性机制与框架选型.md` **新建 §十六**(⛔ §十五 既有小节一字未改)+ E 单 `交接单/IM群组-E-会话界面UI.md` **追加**「§执行回报(IM 线第 16 棒)」(⛔ 未改既有正文)。 **交付(三项代码 + 一份 E2E)**:① `src/im/backends/gateway.ts` 的 `providesServerHeartbeat` **`false`⇒`true`**(依据 = §15.11.3 三向实测)+ **连带**新增结构性判据 `fanoutOffsite && !needsKeepaliveShim ⇒ throw`(否则原"构造即抛"因该字段改真而**变成装饰**)~ 口径依据 = 「会不会自己发 ping」与「平台能不能替远端 socket 代发」**正交**;② 平台侧接入面 **选 (a) 发二层票据 + 新增订阅回检**(`POST /api/im/gateway/token`、`POST /api/im/gateway/subscribe`、`GET /api/im/transport`、`stats()` 增 `gatewayAccess`)~ 被否 (b) `connect` 代理(理由:改动落部署物、回滚面更大、鉴权依赖边缘带 cookie ⇒ **与"边缘未接 vhost"耦合**,且工作量不更少);③ `poc/im-conversation-tabs/lib/client.js` 传输层**双模化**(`native` **逐字不变**、分发共用一个 `onAppFrame`;`gateway` 走网关协议:`connect` → `subscribe` → **空对象即回 `{}`** → `push.pub.data.frame` 后照原路径分发;模式**从平台只读面取,⛔ 未硬编码**);④ 新增测试 `test/im-gateway-access.test.mjs` **15 用例**(**G-8/G-9 直接驱动真客户端件**)。 **判据读数**:`npm run build` **rc=0**|新测 **15 / 15**|B 组 **28 / 28**|presence 组 **13 / 13**|`npm test`(Node 22)**507 用例 / 505 过 / 0 败 / 2 跳过**|`check-layering` **rc=0**(未归类 1 = 既有 `src/platform-paths.ts`)|**本机回环 E2E(真 Centrifugo v6.9.6 + 真平台进程 + 真客户端件)16 / 16 PASS**:`upgrade=101/101/101 connect应答=3/3`、订阅票据 `alice=200 / bob=403 not-a-member`、带票据订阅 `{"id":2,"subscribe":{…}}`、**不带票据**非成员 `{"id":2,"error":{"code":403,"message":"not-a-member"}}`(回检兜底生效)、一条消息 `发送=200 delivered=1` 双端收到且原文含标记、presence `进=true 出=true`、**保活 `ping数=10 / alice.closed=false / carol.closed=false / num_clients=2`(掉线 0,两侧同证)**。 @@ -191,7 +191,7 @@ ⚠️ **本机载体受限(与产品无关)**:Windows 版网关二进制**不可得**(GitHub 0–19 KB/s、六镜像全败、106 亦 rc=28)⇒ 用 **106 上已有 Linux 版**(md5 `17f814b5e048d1393508d4617b104a98`,回传后逐字一致)+ 混合载体(**网关跑 WSL 回环 18099**、**平台跑 Windows**,因 `better-sqlite3` 是 Windows 版原生模块)⇒ 两条链路均已实测。 ⚠️ **未完成项(卡点,⛔ 非"更慢更绕")**:① **presence 回填生产侧缺调用方**(Centrifugo OSS 无 join/leave 回调,如实记 §16.7-1)② 切流 / 106 部署 / 容量复测(按边界留第 17 棒)③ **E 单线上可见面仍未验收** —— 卡在**用户动作**(实例「功能管理」启用现版 `v0.1.0`),⛔ 不能替用户点。 ⛔ 未切流|⛔ 未重打包|⛔ 未重投放|⛔ 未 commit/push/scp|⛔ 未引新依赖进 `src/**`|⛔ 未改 A–E 五单结论|⛔ 未动 §14.6|⛔ 未动 106 用户实例面|⛔ 未取用 DB 凭据|⛔ 网关密钥未打印/未进日志/未进文档|✅ 网关全程只绑回环 + 端口避开 47 的 `18081`|✅ 清场:本机与 WSL 网关进程 **0**。 - **下一棒(唯一)** = **第 17 棒 · 执行棒** = automation **`19904b63-431a-4f0a-85cc-c80fcb47221f`**(一次性 · `scheduledAt = 2026-09-23T23:37` · `cwds = e:\ProgramData\AI技能\aliyun-dsh-server` **小写盘符**)= **重打包 + 重投放 + 边缘接 vhost + 切流 + 目标档位复测(`2000` / `10` / `30 s`)+ 本棒新增面的部署同步**(`lib/**` 产物 + 47 网关 `config.json` 回检块按 §16.5-2 修正形态落盘),动作见 **§2「⏭️ 第 17 棒」**。⚠️ 若用户先反馈了操作单 §三 六条取证结果 ⇒ **优先按反馈处置**。 + **下一棒(唯一)** = **第 17 棒 · 执行棒** = automation **`19904b63-431a-4f0a-85cc-c80fcb47221f`**(一次性 · `scheduledAt = 2026-09-23T23:37` · `cwds = e:\ProgramData\AIProject\aliyun-dsh-server` **小写盘符**)= **重打包 + 重投放 + 边缘接 vhost + 切流 + 目标档位复测(`2000` / `10` / `30 s`)+ 本棒新增面的部署同步**(`lib/**` 产物 + 47 网关 `config.json` 回检块按 §16.5-2 修正形态落盘),动作见 **§2「⏭️ 第 17 棒」**。⚠️ 若用户先反馈了操作单 §三 六条取证结果 ⇒ **优先按反馈处置**。 ## §1 目标(**用户原话,⛔ 不得改写**) @@ -374,7 +374,7 @@ **✅ 手工接力方式(⛔ 现已不需要 —— 19:0x 已补登 automation,本段仅存档)**:入口 §2「第 12 棒」段**已自包含**(动工范围 + 三条硬实现项 + 验收判据对账表 + 环境注意 + 边界)⇒ 万一 automation 再次不可用,**用户手工开一个新会话**,说: -> 按 `E:\ProgramData\AI技能\aliyun-dsh-server\接续入口_IM线_20260922.md` 的 **§0 最新行 + §2「第 12 棒」**段执行(会话名 `IM线-第12棒`);开工第 0 步跑 `state.py`,第 1 步抢全局执行锁。 +> 按 `E:\ProgramData\AIProject\aliyun-dsh-server\接续入口_IM线_20260922.md` 的 **§0 最新行 + §2「第 12 棒」**段执行(会话名 `IM线-第12棒`);开工第 0 步跑 `state.py`,第 1 步抢全局执行锁。 **✅ 回头必做 —— 已于 19:0x 完成**:库由 app 自愈后**已立即补登**第 12 棒接续棒(`89e11630-4a06-41ca-bfc7-3c66ff4d8a53`),「补登完成」已写进 §0。 🔴 **连带待办(本线 ⛔ 别忘)**:**其余各线的接续棒全部丢失**(automation 记录随重建清空)⇒ 各线开工前须先按自家入口 §2 重登。 @@ -582,7 +582,7 @@ - **源仓 HEAD**:`git -C D:/github/dsh_shenxian log --oneline -1`(以实跑为准)。 - **入口漂移判据**:以本文件 **§0 最新一行** 为准;若 §0 与 §2 冲突 ⇒ 以 §0 为准。 - ⚠️ **本机 Bash 工具 shim 已坏**(`dirname: command not found` ⇒ `ls`/`cat`/`mkdir` 全 not found,`export PATH` 救不回)⇒ 抢锁 / 放锁 / 任何需要 shell 的活**一律走**: - `"E:/ProgramData/.workbuddy/binaries/python/versions/3.13.12/python.exe" "E:/ProgramData/AI技能/aliyun-dsh-server/tmp/claim_lock.py" --claim-exec "<线名>-第N棒"`(该脚本用 `subprocess` 调 PortableGit 的 `bash.exe` 并给足 `usr/bin`+`bin`+`mingw64/bin`)。 + `"E:/ProgramData/.workbuddy/binaries/python/versions/3.13.12/python.exe" "E:/ProgramData/AIProject/aliyun-dsh-server/tmp/claim_lock.py" --claim-exec "<线名>-第N棒"`(该脚本用 `subprocess` 调 PortableGit 的 `bash.exe` 并给足 `usr/bin`+`bin`+`mingw64/bin`)。 ⚠️ 抢锁失败时脚本 **rc=1 且中文输出乱码** ⇒ 别把「乱码」误判成「锁被占」,**解锁文件**读 `dsh-server-docs/交接单/.exec-lock/OWNER` 才准。 ## §6 ⛔ 不要重做 diff --git a/接续入口_技能重组线_20260922.md b/接续入口_技能重组线_20260922.md index f3a532e..523d9dd 100644 --- a/接续入口_技能重组线_20260922.md +++ b/接续入口_技能重组线_20260922.md @@ -48,9 +48,9 @@ **第 1 个动作**(具体命令,非"继续处理"): ```bash -mkdir -p "E:/ProgramData/AI技能/aliyun-dsh-server/tmp/_keep-20260922/split-bak" && \ +mkdir -p "E:/ProgramData/AIProject/aliyun-dsh-server/tmp/_keep-20260922/split-bak" && \ cp "E:/ProgramData/.workbuddy/skills/dsh-change-workflow/SKILL.md" \ - "E:/ProgramData/AI技能/aliyun-dsh-server/tmp/_keep-20260922/split-bak/" + "E:/ProgramData/AIProject/aliyun-dsh-server/tmp/_keep-20260922/split-bak/" ``` (先备份 = 回滚点)。之后 ② 先做 `dsh-change-workflow`、③ 再做 `dsh-opensource-release`、④ 验收。 diff --git a/接续入口_插件投放与分库线_20260922.md b/接续入口_插件投放与分库线_20260922.md index 6d5aaf1..cc00064 100644 --- a/接续入口_插件投放与分库线_20260922.md +++ b/接续入口_插件投放与分库线_20260922.md @@ -223,7 +223,7 @@ - **为什么以前没人做**:本入口此前对 `im-conversation-tabs` **零命中** ⇒ IM 线以为"投放线会接力"、投放线没登记 ⇒ **两不管**。 - ~~🔴 **硬阻塞(⛔ 未解,先别投)**:IM 线查出一处 **P0 协议不一致** ……~~ ✅ **已解(2026-09-23 19:5x,IM 线第 13 棒)** —— 客户端已对齐平台的 **op 制**(出站收敛到 `subscribe / ping / resume`,入站 `switch (msg.op)` 全量 9 分支),并新增**两侧源码机械对账**用例 `E-14` 守着;⛔ 不再有 `type:` 出站帧。 - ✅ **投放已执行(2026-09-23 20:2x,IM 线第 14 棒)**:按本线既有流程走完 —— admin `POST /api/plugins/business`(http=200,池 4→5,`trustedOverride:false`)→ `POST /api/plugins/business/share`(http=200 `action:"created"`,`fileRef = link:/var/lib/dshs/bundled-plugins/_dsh-local_im-conversation-tabs`)→ 回滚素材 `/opt/dsh/backups/plugins/_dsh-local_im-conversation-tabs/0.1.0.tgz`;审计 `audit_log` id **360 / 361**。⛔ 未铺 profile、未 commit、未改动本线任何代码。⚠️ **「共享层发布」这一步是 `link:` 装配协议的必需项**(只进池不发布 ⇒ 用户启用撞 `plugin_bundle_missing`)—— 本线后续给任何插件投放时**都要带上这一步**。 - - 📌 **归属 = IM 线自行认领完结**(2026-09-23 20:2x 第 14 棒):投放的**可自动部分**由 IM 线做完;剩余**唯一未闭合项 = 用户在实例「功能管理」启用**(用户动作,属投放语义),操作单 ⇒ `E:\ProgramData\AI技能\aliyun-dsh-server\交付物\IM群组-ui投放与线上取证操作单-20260923.md`。⇒ **本线不再有该条的待办**,⛔ 不要重复认领。⚠️ **一条留在本线名下的关联缺口**:目标实例若在 **106**,其**共享层缺该包** ⇒ 与本入口 §5-2「跨节点内容分发(需单独立项)」是同一件事,操作单里给了手工同步命令。 + - 📌 **归属 = IM 线自行认领完结**(2026-09-23 20:2x 第 14 棒):投放的**可自动部分**由 IM 线做完;剩余**唯一未闭合项 = 用户在实例「功能管理」启用**(用户动作,属投放语义),操作单 ⇒ `E:\ProgramData\AIProject\aliyun-dsh-server\交付物\IM群组-ui投放与线上取证操作单-20260923.md`。⇒ **本线不再有该条的待办**,⛔ 不要重复认领。⚠️ **一条留在本线名下的关联缺口**:目标实例若在 **106**,其**共享层缺该包** ⇒ 与本入口 §5-2「跨节点内容分发(需单独立项)」是同一件事,操作单里给了手工同步命令。 > 📌 **状态更正(2026-09-23 19:4x,IM 线第 12 棒顺带核对 ⇒ ⛔ 未替本线排棒)**:§0 末行「`automation_update` 返回 `file is not a database` ⇒ 全机 automation 功能不可用」的**前提已消失** —— 宿主活动库已由 app **自动重建**(2026-09-23 18:55;坏库改名 `workbuddy.db.corrupt-2026-09-23T10-55-47-845Z` 留档,代价 = 历史 automation 记录全丢)。本会话实测 `mode=list` / `mode=create` **均可用** ⇒ 本线「下一棒」**可以正常登记**了。⚠️ 排棒时机仍由本线收口时自行决定(⛔ 不预登记队列)。 diff --git a/接续包_引用与技能纠偏_20260924.md b/接续包_引用与技能纠偏_20260924.md index 454ef10..83df80a 100644 --- a/接续包_引用与技能纠偏_20260924.md +++ b/接续包_引用与技能纠偏_20260924.md @@ -191,3 +191,16 @@ PY ## §6 执行记录(各棒追加) - **2026-09-24 08:2x|建包棒(会话 `整理收官1`)** —— 只做体检与建包,不落修复。产出:`交付物/引用技能规则-体检报告-20260924.md` 本包。规则已绿(四件套 rc=0 + 对账 289/289);引用与技能各 1 类缺陷已定位到判据与逐文件清单。 +- **2026-09-24 08:1x–08:5x|执行棒(会话 `引用纠偏1`)** —— §5 全做完,锁已释放。 + **① 开工四步**:`state.py` ✅|本包 md5 = `ab17bde7bb65782d10be7d122546a8c5` **相符** ✅|抢锁成功(4 域:`08-skills` / `01-规范` / `07-scripts` / `INDEX.md`)✅|库内 `CODEBUDDY.md` 「文档库结构与命名规则」章已读 ✅。 + **② A 工作区侧(16 件,逐文件)**:`CODEBUDDY.md`|`README.md`|`接续入口_IM线` (12 处)|`接续入口_技能重组线` (2)|`接续入口_插件投放与分库线` (1)|`接续包_文档库治理_20260923.md` (2)|`.workbuddy/tools/{find-session-by-title,guard-replay,sess-credit-report}.py + relay-transfer.sh` (含连字符化转录目录名 `e-ProgramData-AI技能-…` 一并对齐)|`.workbuddy/待落地/{verify-stop-hook.py,重启后待办.md}`|`docs/覆盖网络/{参数表,设备登录接入方案}`|`交付物/{插件建库权限-一次性执行.sh, DB修复-workbuddy.db损坏诊断与方案}.md` ⇒ **该 16 件 `grep -c "AI技能"` 全 = 0**;单点验证先做 `README.md` 再推广。 + ⚠️ **口径与 §3.1 的两处差异(以实测为准)**:ⓐ 工作区「必改档」实测 **16 件**(§3.1 写 12 件,未含 `docs/覆盖网络` 2 + `交付物` 2);ⓑ `交付物/**` 实测 9 件含旧路径(非 7),按「含可执行命令者改」判 **2 件改 / 7 件不改**(不改的含体检报告本身)。 + **③ B 文档库侧**: + - **B1 引用纠偏**:`08-skills` 8 + `07-scripts` 4 + `01-规范` 2(`01-规划与架构.md` 改到现真源 `D:/github/dsh_shenxian/dsh-server-docs/`;`06-工作台UI规范.md` 3 处)+ `INDEX.md` + `BRIEF.md` = **16 件落地**。 + - **B2 过度替换回改**:逐条按「目标属谁」判 + 存在性探针。**库侧错 ⇒ 回改 12 件**:`/api/skills/{shared,mine}`、`~/.workbuddy/08-skills/`、`DSH_HOME` 的 `skills/`、`presets/
/skills/`、技能自身 `scripts/`(`短视频工作台`/`split_skill.py`/`chain_report.py`/`resident-rules.py`)、官方仓 `native/system/scripts/`+`apps/desktop/scripts/`、**平台仓** `scripts/`(探针:`install-egress-guard.sh`/`install-python-runtime.sh`/`install-shared-tools.sh`/`runtime-baseline.cjs`/`verify-inject.cjs`/`verify-dsh-install.mjs` **全部只在 `D:\github\dsh_shenxian\scripts\`**)。**库侧对 ⇒ 补到本机 4 件**:`05-交接单/`、`01-规范/06-工作台UI规范`、`bash 07-scripts/handoff-guard.sh`、`07-scripts/extract-user-voice.py`(探针:`handoff-guard.sh` 只在文档库 `07-scripts/`)。 + - **B3 三处同步**:本机 `~/.workbuddy/skills` ↔ 库 `08-skills` **12/12 md5 全同 · 0 差异**(方向 = 本机为工作副本 ⇒ 推库,符合库内 README 的「单向推进 本机 → 此处」口径;库侧 06:0x 那批改动内容上仅「改名」一处,未丢内容;`dsh-auto-handoff-chain` 库侧为 09-21 旧版 ⇒ 以本机 09-23 新版为准)。**服务器 `/opt/dsh/docs/08-skills` 按 §4 只报不改**。 + - **B4 技能内容 2 条**:`dsh-auto-handoff-chain/SKILL.md` 律⑤ 改为「**只写与手动开会话 cwd 逐字同形;判据 = 实测 `sessions.cwd`;当前正解 = `E:/ProgramData/AIProject/aliyun-dsh-server`(正斜杠)**」+ 标题行/判据行/自查行 + 🔴 **frontmatter `description` 同步改**(依据该文件自身「教训二:改路径字面必须枚举全部复制面,漏 `description` ⇒ 曝光度最高」);§⑤ 判据行命令路径同步 `AI技能`→`AIProject`。`version` 未动(仍 1.7.2)。 + **④ C 收口**:四件套 **rc=0 ×4** ✅|技能复算 **12/12 · 0 差异** ✅|旧路径「活路径」残留 **0**;**保留 12 处历史叙述**(`dsh-auto-handoff-chain` 6:污染源/迁移对照/连字符化示例|`dsh-opensource-release/SKILL.md` 2:frontmatter 版本历史 + 用户原话引用|`dsh-change-workflow/references/00-平台速查.md` 1:勘误引述旧文|`01-规范/03-路线图与待办.md` 3:历史迁移条目)—— 判据 = 「照着做会失败的活路径」改、「记录当时事实」不改。🔴 **对账 = 文件数 289/289 一致,但内容 263/289**(**26 件不一致 = 本次改库而按 §4 未推服务器的必然结果**)。锁已 `--release-exec` 释放。 + ⚠️ **本棒不改、只报(§4)**:ⓐ 推镜像 26 件到 `/opt/dsh/docs`(清单见对账输出)ⓑ **`E:\ProgramData\AIProject\dsh-ai1net-github\` 5 常量 + 1 命令模板仍指旧根**(`_build_export.py:14,763`|`_verify_tsc.mjs:5`|`_sop_check.mjs:5`|`_upload_audit.mjs:5`|`_verify_all.mjs:5`)⇒ 旧根已 GONE、**这些脚本现已失效**,属别的线 ⓒ 服务器 `08-skills` 落后本机一版。 + 🔧 **工具教训(可复用)**:改同一文件的多处字符串时,**必须先把所有替换聚合到内存再一次写盘** —— 逐条 `open(...,"wb")` 会让后一条覆盖前一条(本轮首跑即踩,52 项写入只生效每文件最后一项,靠 `12/12` 复算才发现)。配套:命中数断言 + 幂等(`count==0 且新串已在` ⇒ 跳过重跑)。 + diff --git a/接续包_文档库治理_20260923.md b/接续包_文档库治理_20260923.md index 833daad..c8de4b8 100644 --- a/接续包_文档库治理_20260923.md +++ b/接续包_文档库治理_20260923.md @@ -1,6 +1,6 @@ # 接续包 · 文档库治理(2026-09-23) -> **工作区**:`E:\ProgramData\AI技能\aliyun-dsh-server` **线名**:插件投放与分库线(本轮为即席应答,非接续棒) +> **工作区**:`E:\ProgramData\AIProject\aliyun-dsh-server` **线名**:插件投放与分库线(本轮为即席应答,非接续棒) > **触发来源**:用户连续三轮问「`dsh-server-docs` 归类 / `04-` 是什么 / 根级 01–09 是干啥的、文件夹要不要合并」 > **性质**:**接续包(7 段)** —— 供下一棒直接开工,⛔ 不含平台代码改动。 > @@ -73,7 +73,7 @@ | E6 | ⛔ **不动**:`交接单/`(域锁目录)· `skills/`(三处同步链路)· `scripts/` · `archive/`(收纳位)· `tmp/` | 机制约束 | **必改引用(执行时逐条核,改完 grep 复核零悬空)** -1. **工作区 `E:\ProgramData\AI技能\aliyun-dsh-server\CODEBUDDY.md`** —— §2 表格里写死了 `dsh-server-docs\01-…`/`02-…`/`03-…`/`06-…`/`07-…` 等路径(约 10 处)。⚠️ **属机制层 ⇒ 必须独占锁;改后需重启会话才重载**;改前先备份。 +1. **工作区 `E:\ProgramData\AIProject\aliyun-dsh-server\CODEBUDDY.md`** —— §2 表格里写死了 `dsh-server-docs\01-…`/`02-…`/`03-…`/`06-…`/`07-…` 等路径(约 10 处)。⚠️ **属机制层 ⇒ 必须独占锁;改后需重启会话才重载**;改前先备份。 2. 文档库内:`INDEX.md`(场景表指向 01/02/03/06/07/08/09 的行)· `README.md` · `BRIEF.md` · `DEPLOY-本部署.md` · `交接单/插件投放与分库线-①…md` · 技能 `dsh-change-workflow`/`dsh-knowledge-upkeep` 等对编号件的引用。 3. `docs-manifest.json` ⇒ 用 `dsh-server-docs/scripts/docs-manifest.py` **重生成**(⛔ 不手改)。