Files
workbuddy_skills/dsh-workflow/references/01-多棒自动接力.md
T

479 lines
58 KiB
Markdown
Raw Normal View History

# 多棒自动接力编排法(规划棒 ↔ 执行棒)
> **归属**:技能 `dsh-workflow` · 详情档(主干 `../SKILL.md`)
> **本档覆盖**:原技能 `dsh-auto-handoff-chain` **全文**(正文 308 行 + frontmatter �更历�)
> **provenance**:本机版(WorkBuddy 实况)
> **��方�**:**�行未改**;内部附件链接已改写为 `dsh-auto-handoff-chain/<附件�>`(附件在本目录下)
> ⚠� 原技能 `dsh-auto-handoff-chain` **已�并退役** ⇒ �到该�按本档读。
> 🔴 **2026-10-01 用户�径(最新)**:**「接续会� 时间缩短 3-4 分钟���** ⇒ 本档中一切「收� + 5~8 分钟�**一律按 3~4 分钟读**(原值作废)。
---
# dsh-auto-handoff-chain — 多棒自动接力编排法
> **一��**:��用「一� prompt 跑完整�工作线�,而是让**�一棒��一件事**,�完**自己把下一棒排上**。
用户原�(2026-09-17 立项):
> 「�次执行完毕� 自动根�方法决策 自动新建会�接续处�,**在处�多步骤任务的时候�常好**�
---
## 0. 与其他技能 / 文档的分工
| � | 管什么 |
|---|---|
| **本技能** | **怎么把长任务排�一�自动接力的链�**(编排层) |
| `dsh-change-workflow` | �次改造怎么�地(六阶段) |
| `session-mechanism` | �次��怎么定得对(**规划棒应加载**) |
| 工作区 `会�接续规范_20260916.md` | 上下文超�时的**接续包 v2 模� / 开机四步 / 多线并行**(本技能是其"多棒编排"的补充,**���**它已写的接续包字段与�本公�) |
| 工作区 `接续入�_<线�>_<日期>.md` | **�一�工作线的唯一执行��**(本技能的核心�赖) |
### 0.6 🔴 工作区归属五律(2026-09-21 立①②③④ / 2026-09-22 加⑤ / **2026-09-23 修⑤ 盘符大�写** / **2026-09-24 修⑤ 判�:实测 `sessions.cwd` + 正斜�** —— 治「�考别的工作区的规则 ⇒ 会��错家�+「�一工作区裂�两个��分组�)
**背景实测**:�工作区会�「�考接续会�的规则�时照抄了 `aliyun-dsh-server` 的路径 ⇒ 把**入�文件**和**接续任务**都�到了平�工作区,而它那�线自己的家是 `dsh-plugin-forge`。�一份入�出现两处�md5 相� = **第二真相�**;平�工作区的 `state.py` 因此把**别线**报�了自己的线(实测报"2 �工作线",其中一��是它的)。
| 律 | 内容 | �例(都真�生过) |
|---|---|---|
| ① **入���许一份** | �置 = **那�线自己的工作区根**;头部必须写 `> 🔴 **工作区**:<该工作区�对路径>` | 两处�改(forge + aliyun �一份,md5 相�) |
| ② **`cwds` = 本工作区** | automation 的 `cwds` �认**那�线自己的工作区**;⛔ �因"脚本在别的工作区"就把 `cwds` 设过去 | 照抄"第 0 步跑 `state.py`" ⇒ `cwds` 写�脚本所在的工作区 |
| ③ **�考规则 = 加载本技能** | �副本就�制**规则文档**到本工作区 `docs/会�与接续/`;⛔ **入�文件��制** | 直接读别的工作区的 `接续入�_*.md`,照抄其中路径 |
| ④ **`cwds` 写对 ≠ 会��对**(2026-09-21 加) | `cwds` �是**登记项**,管�到会�从哪个目录被拉起 ⇒ prompt 里**�外**写死「开工�先 `cd` 到 `<工作区�对路径>`�+「收尾校验产物�点� | **乙类(下)**:6 棒 `cwds` 全写对,会��全�在 `E:\ProgramData\WorkBuddy\<时戳>` |
| ⑤ **`cwds` 路径写法必须归一化**(2026-09-22 加;**09-23 修盘符方�**;**09-24 修判�**) | ⛔ **�写「与手动开会�的 cwd �字�形�**:**当�正解 = `E:/ProgramData/AIProject/ai1net-dsh-server`(正斜�)**。**判� = 实测 `sessions.cwd`**(⛔ �凭记忆定「�对写法�—— 09-22 / 09-23 �翻烧饼一次);⚠� 宿主去�键 = `path.trim().toLowerCase()` ⇒ **��写��统一斜�**:斜�风格���裂��分组(09-24 代�级实�);⚠� 改路径字�必须**枚举全部�制�**(技能正文 + 本技能 `description` + `MEMORY.md` + 入�声明行 + automation prompt) | **写法一�就当两个 cwd** ⇒ UI 里**�一工作区裂�两个��会�分组**(实测:09-22 = 斜�方�,aliyun 151 vs 6�capability 5 vs 4;09-23 = 盘符大�写,aliyun 158 vs 2) |
**律⑤ 的实测事故·一(2026-09-22 排查,「�产生了两个��的会�分组�|污染维度 = 斜�方�)**
| 环节 | 事实 |
|---|---|
| 现象 | UI 里�一个工作区出现**两个��分组**(用户原�:「�产生了 两个��的会�分组�) |
| 宿主行为 | 会� `cwd` **�字抄** `automation.cwds`,**��任何规范化**(实测 10/10 �字一致) |
| 污染� | **10 � automation 的 `cwds` 写�正斜�** `E:/ProgramData/AI技能/…`,集中在 09-21 06:48 → 09-23 09:52 的接续棒 |
| 影�� | `aliyun-dsh-server`:�斜� 151 会� vs 正斜� 6 会�|`dsh-ai1net-capability`:5 vs 4 |
| 传染路径 | �任棒次在**日志里把正斜�当规范记下**(`2026-09-23.md` 的 `cwds = E:/…`)⇒ �棒照抄 ⇒ 一路正斜� |
**判�**:⛔ 凭记忆定「�对写法�必错(09-22 定「大写�/ 09-23 改「�写�,�裂一次)⇒ **一律�实测 `sessions.cwd` 里�数最多的那�字��字�制**。会�已�裂开 ⇒ �能**�现�清�**(旧组�会自动消失,且会自我强化);⛔ **新建 automation 一律写「与手动开会�的 cwd �字�形�**。
**自查一�**:我这个 `cwds` 与**手动新建会�实际�库的 cwd** 是�**�字�形**(斜�方�也必须�形)?(当�正解 = `E:/ProgramData/AIProject/ai1net-dsh-server`)
🔎 **�确定就现查存�**(比记忆��):在 `CODEBUDDY_CONFIG_DIR` 下的 `workbuddy.db` 里跑 `SELECT cwd, COUNT(*) FROM sessions WHERE cwd LIKE '%<工作区�>%' GROUP BY cwd ORDER BY 2 DESC` ⇒ �**�数最多**的那一�**字�**�字�制。
**律⑤ 的实测事故·二(2026-09-23 排查,用户原�「为什么�出现了多个 aliyun-dsh-server 会�分组�|污染维度 = 盘符大�写)**
| 环节 | 事实 |
|---|---|
| 现象 | �一工作区**�次**裂�两个��分组(�事故·一�隔一天) |
| 污染� | **3 �接续棒(IM 线第 12 / 13 / 15 棒)的 `cwds` 写�大写盘符** `E:\ProgramData\AI技能\aliyun-dsh-server`;三�**全部建在 09-23 18:55 automation 库被 app �建之�**(记录全丢 ⇒ �登时按技能里残留的**错误字�**输入)。⚠� **21:5x �核更正:原记「第 12 / 13 / 14 棒�有误** —— 第 14 棒(`2d059ec8` · 20:15)实为�写�� `e:\`;**真凶是第 15 棒(`4e08cc77` · 20:45),当时�改** ⇒ 20:45 �裂 1 � |
| 实测分布(09-23 21:5x �核) | `sessions.cwd`:�写 `e:\…` = **160 �** | 大写 `E:\…` = **5 �**(3 � automation 拉起 19:10 / 19:49 / 20:45 + **2 � IDE 手动** 20:54 / 21:47)| 旧路径 `d:\AI技能\aliyun-dsh-server` = **11 �**(09-08~09-12 �移�,末次活动 09-13,已冻结)| `workspaces.path` = �写(**53/53 全�写**) |
| 🔴 教训一:凭记忆规定"�对写法"必错 | 律⑤ 原文「**�写大写盘符** � **�写盘符必错**�**方��了** —— 存�与工作区登记都是�写。⇒ 正解**�是**"与存��字对�"(存�被污染� 3 个值之�,这��无法执行),而是 **跟�宿主自己的登记值 `workspaces.path`** ⇒ 判�由"我们的约定"��"客观事实",⛔ **��翻烧饼** |
| 🔴 教训二:改规则必须枚举**全部�制�**并对账 | �一路径字��时存在于 **技能正文 + 技能 frontmatter `description` + 用户级 `MEMORY.md` + 项目 `MEMORY.md` + 4 个入�文件的「工作区�声明行 + automation 的 prompt 正文 + `USER.md` + 历�日志/交接�**。09-23 那次�改了 3 处,**�掉 `description`(�光度最高 —— �次新会�的技能清�都会读到它)** ⇒ 当天 19:10 起照旧裂 3 �。⇒ **说"已�步改正"必须附一�对账查询**,�则修�质�无法自� |
| 🔴 教训三:已裂的组会**自我强化** | 手动新建会�**继承所在分组的字�** ⇒ `E:\` 组一旦存在就自己长(21:5x 实测该组 5 �中 2 �为手动会�)。⇒ �堵�头�够,**必须清掉已裂组**,�则残留组�续�制自己 |
| 已止�(09-23 21:5x 补全) | ① 第 14 棒(20:15)�写 ✅ ② **第 12 / 13 / 15 棒**(原为大写)一并改回�写 `e:\…`,三�已确认�库 ✅ ③ 技能 `description` 方�已补改 ✅ ④ 两处 `MEMORY.md` 判�已改为「真� = `workspaces.path`�并**冻结** ✅ |
| 待处置 | ① 已裂的 **5 �大写 + 11 � `d:\`** 会�字�归并 ⇒ 需**� app + 改活库**(WAL 三件套)⇒ 属红线门�,⛔ 未擅自动 ② 4 个入�文件第 3 行「工作区�声明行的**大写字�**(登记时的诱导�)统一为�写 ③ `USER.md` 里工作区�写 `D:\AI技能\aliyun-dsh-server`(过时,`d:\` 组��) |
**律④ 的实测事故(2026-09-21,6 个碳线棒次 100% 命中)**
|cwds(登记)| 会�实际 `cwd`| 对得上|
|---|---|---|
| `E:\ProgramData\AI技能\dsh-ai1net-capability` | `E:\ProgramData\WorkBuddy\2026-09-21-20-20-06` | � |
| �上(连续 5 棒) | `…-20-22-44` / `…-20-25-47` / `…-20-30-24` / `…-20-33-35` | � |
| �上(执行棒⑤) | `…-22-11-36` | � |
**�害**:入� / 记忆 / 日志 / md5 全写进错目录,主工作区看起�「什么都没�生�;**�跑一棒多一个**时间戳目录(�是"两份")。
**判�**:会�记录��都有 `cwd` 字段 —— 开机第一件事比对它;�等 ⇒ **�手报告**,⛔ �许就地开工。
**对策**:登记方 prompt 加行「① 先 `cd` 到 `<工作区�对路径>`,校验 cwd 相等�;本棒收尾校验**产物�点**是�在该路径下,越界则报告并�回。
⚠� **别与本类混淆 —— ����的六类�因(排查按此顺�)**:
| 类 | �因 | 特� | 处置 |
|---|---|---|---|
| **甲·盘符�移留旧份** | 项目目录� = 盘符+路径连字符化,路径一�就多一份 | 目录���(`d-AI技能-…` vs `e-ProgramData-AI技能-…`) | �现�清�,旧份�自动消失 |
| **乙·cwd 写法�体**(律⑤) | ① **斜�方�**(`e:\…` vs `E:/…`)② **盘符大�写**(`e:\…` vs `E:\…`)—— 两个维度都**�自实测裂过**(09-22 / 09-23) | 目录�**看���一个**,实为两个 cwd | 新建一律「**�斜� + �写盘符**�;旧份�现�清� |
| **丙·会�标题��** | ��线起了�� automation | 标题完全相��cwd 也相� | 改标题加线�/��(本项目已普�带线�,风险低) |
| **�·cwd �到时戳目录**(律④) | prompt 没 `cd`,宿主按默认目录拉起 | 一堆 `E:\ProgramData\WorkBuddy\<时戳>` | �律④ |
| **戊·��镜�目录**(2026-09-27 加) | **�盘上真的有两个目录**,路径段里�差一个�(`…\ProgramData\…` vs `…\ProgramDSH\…`),且镜�目录里**�有一份��入�文件**�还有 `bundles\`�`docs\` 骨架 | 目录�**看���一个**��差一段;两侧都�能被当「本工作区�;⛔ �是写法�体(乙类)�也**�是**空壳(光看"目录里有东西"判�出�) | 定**唯一��**(判� = 实测 `sessions.cwd` �数最多那� + app 当�工作区 + `.workbuddy\memory\` �长在哪侧)→ 镜�侧入�改**跳转 stub** → 改全部 automation 的 `cwds` 与 `--ws` → 已�错的会��回��分组。**�留一处** |
| **己·入�声明的工作区与�盘�符**(2026-09-27 加) | �家或改��**��了目录�没回填入�头部**:入�第 3�10 行�写�旧路径 —— 实测 `ai1net-decision-laya` 线入�写「工作区 = `E:/ProgramData/AIProject/session-mechanism-laya`�,而**该目录在两个根下都�存在**(真实目录�是 `ai1net-decision-laya`,入�内 33 处引用全是旧�) | 与本表甲�戊**正相�**:那两类是"多了一份",这一类是"**指�的那份根本�在**"。照抄登记 ⇒ 宿主**凭空新建一个幽�分组**(`projects\e-ProgramData-AIProject-session-mechanism-laya`),比��镜�更难�现(镜�至少目录存在�还能� `ls` 撞�) | 判� = 把入�里�处「工作区 = …��� `Test-Path`;**任一�存在 ⇒ 以实测 `sessions.cwd` 为准回填入�头部**,⛔ ��按入�里的路径去**新建**目录(那会把幽��实) |
⚠� **「�维护�≠「�用�**(2026-09-27 实测,比上表任何一类都容易�):定完唯一���,�写一�「旧副本�维护�**�算收�** —— 旧侧那份入��是**完整正文**,两侧还会�自继续被写。实测当晚:`ai1net-dsh-anywhere` 两侧入�已分�到 **24903 B vs 23816 B(差 1087 B / �� 8.5 �时)**�`ai1net-dsh-desktop` 差 **121 B / 20 分钟**,而两�线**都早已��"�用 ProgramData 那份"**。⇒ 收�动作必须�到「**旧侧入�就地改�跳转 stub**�(明示"这�是入�"+��路径+�用原因),�则下一棒读旧侧就会照�过期内容��。
**律①�② 的实测事故·三(2026-09-27 排查,用户原�「�开始出现接续会� 创建��的 会�分组了 ai1net_ui�|污染维度 = ��镜�目录)**
| 环节 | 事实 |
|---|---|
| 现象 | `ai1net_ui` 在 UI 里裂�两个��分组:`projects\e-ProgramData-AIProject-ai1net_ui`(3 会�)与 `projects\e-ProgramDSH-AIProject-ai1net_ui`(1 会�,建于 23:45:19) |
| 污染� | 第 1 棒登记第 2 棒时把 `cwds` 写�镜�路径 `E:\ProgramDSH\AIProject\ai1net_ui`。它这么判是因为:入� `��会�` 那�写�「工作区 `E:\ProgramDSH\AIProject\ai1net_ui`��正文几�处**资产**路径都在 ProgramDSH 下�上一棒给它的抢� `--ws` 也是镜�路径 |
| �蔽�果一:**��互斥** | dsh �按 `--ws` 分命�空间 ⇒ �� `.locks\e-programdata-aiproject-ai1net_ui-2e350e23` vs 镜� `.locks\e-programdsh-aiproject-ai1net_ui-97d0d29d`,**两处�一把��互�排斥**(第 2 棒��期间从��侧查 `status` 报「空闲 ✅�)。本轮两棒没真并�,纯属�气 —— 这�比 UI 观感�险得多 |
| �蔽�果二:**入�分�** | 第 2 棒�写了镜�那份 ⇒ 45052 B vs 40720 B,md5 `c3f0afa2…` ≠ `07ad6380…`;�走一棒就会读到过期的「本轮动作� |
| 处置(已�地) | ① 新版入��步到��侧 ② ��入�头部立「本线工作区(唯一��)�四�约�表 ③ 镜�侧入�改**跳转 stub** ④ 第 3 棒 automation 的 `cwds` + prompt 入�路径 + `--ws` 全改��侧(排期�动)⑤ 会� `cc1c1205` �回��分组(先等它 `status=completed`,� SQL �行 `UPDATE sessions SET cwd=…` + jsonl 移� + 删空目录;`integrity_check=ok`;`group by cwd` → 1 行 3 �) |
| 🔴 教训一 | **判「本工作区�⛔ ��能读入�里的「��会���和资产路径** —— 那些是**历�**与**资产�置**,�是工作区。唯一判� = ① 实测 `sessions.cwd` �数最多那�字� ② app 当�打开的工作区 ③ `.workbuddy\memory\` �长在哪一侧 |
| 🔴 教训二 | **镜�目录�是空壳**(内有 `bundles\`�`docs\` 骨架,看���正�工作区)⇒ 光凭"目录里有东西"定�了归属;**入�里出现两个�对根路径时,先问「�盘上到底有几个��目录�** |
| 自查一� | 我这�线的工作区路径,**在�盘上是��有一个目录**?(����根 = 戊类,必须先定����开工;若已裂 ⇒ 清掉错误分组,旧组�会自愈) |
**跨工作区�脚本的正确姿势**(���律②)—— 本工作区没有脚本时,用**�对路径**调�并指定 `--ws`:
python "E:/ProgramData/AIProject/ai1net-dsh-server/state.py" --ws "E:/ProgramData/AIProject/<自己的工作区>"
⛔ 把 `state.py` �制到�个工作区 = 多一份�维护的代�,`--ws` 是正解(2026-09-21 加;`state.py` �时新增**归属校验**:头部声明的 `工作区` ≠ 本工作区 ⇒ 标「外�线�并排除出 §2 / �令)。
---
### 实测事故·四:全库体检(2026-09-27 23:5x · 用户原�「检查 workbuddy 下所有其他会� 看是�也会出现相�的问题�)
**范围**:`projects\` 全部 7 个分组 / `sessions` 全部 11 � / `automations` 全部 4 � / `.locks` 全部 12 个键 / �工作区入�文件。�跑脚本 = `dsh-auto-handoff-chain/audit-mirror.py`(�读;读 `workbuddy.db` 走 `file:…?mode=ro`)。
**结论**:**当��有 ai1net_ui 裂过�且已修**(分组↔cwd **7:7 一一对应,孤儿 0�缺组 0**,去�键冲� 0)。但**三�线具备�款结构�件**:
| 工作区 | ��镜� | 入��份 | 入�是�分� | �命�空间 | automation `cwds` | 判定 |
|---|---|---|---|---|---|---|
| `ai1net_ui` | 有 | 有 → **已 stub** | 已修(1883 B stub) | 仅旧侧残留键 | 3 �全=��侧 | 🟢 已收� |
| `ai1net-dsh-desktop` | 有 | 有 | 🔴 **分� 19039 B(23:35) vs 18918 B(23:15)** | 🔴 **两套键**(旧 15:00 `…-3fe5ab6f` / 新 23:36 `…-547001a0`) | 无 | 🔴 P1 |
| `ai1net-dsh-anywhere` | 有 | 有 | 🔴 **分� 24903 B(23:37) vs 23816 B(15:00),差 1087 B / 8.5 h** | 🔴 **两套键**(旧 15:00 `…-5ee837d7` / 新 23:38 `…-6bce3721`) | 无 | 🔴 P1 |
| `ai1net-decision-laya` | 有 | 有(md5 一致,在�步) | � | 自建 `scripts/lock.py`(�涉 dsh �) | 无 | 🟠 P1(己类) |
| `aigc-idea-impression` | **无** | 无 | — | — | 1 �=本工作区 ✓ | 🟢 |
**三个新事实(写进判�)**:
1. **`E:\ProgramDSH\AIProject\` 是 `E:\ProgramData\AIProject\` 的整树镜�**(4 个工作区,连 `.workbuddy\memory\automations\` 的 16~24 个棒记录副本都被�制过去)⇒ 这是甲/戊/己三类的**共�温床**:��这棵镜�树还在,任何一�线把 `cwds`�`--ws` 写到 ProgramDSH 侧就立刻�现。**⛔ 看�个目录判�出�,必须整根比对**。
- 🔴 **2026-09-28 现状**:该镜�树**已整树删除** ⇒ 本�**暂�适用**,�留作**�现判�**。⚠� 但�一份 `cwds` 裂�**�了个形��会�生**:工作区 09-28 由 `aliyun-dsh-server` 改�为 `ai1net-dsh-server` ⇒ 凡沿旧字�登记的 `cwds` 都会�到(已�存在的)旧目录。
2. **`dsh-anywhere` 的��侧入�头部第 10 行�写「工作区 = `E:\ProgramDSH\AIProject\ai1net-dsh-anywhere`�,而�一文件 §24 早已记「唯一�� = 本目录�** —— �一份文件内部自相矛盾。⇒ 戊类的"污染�"(第 1 棒�入�头部判错工作区)**在别的线上原样待触�**。
3. **「登记下一棒写错 `cwds`�这�路径全库��生在本线**:��解� `automation_update` 入�,6 �其他会�的 `mode=create/update` 计数**全为 0**(其余为 `list`�`view`)⇒ 没登记过接续棒的线�会踩。**这�是��用的判�:先看 `automations` 表里有没有指�镜�侧的 `cwds`,而�是先看 UI。**
**一�被�伪的�设**(�下次排查):`~/.workbuddy` 与 `E:\ProgramData\.workbuddy` **�是** junction 关系,且�有**一个** `workbuddy.db`(`C:\Users\Administrator\.workbuddy\` 下**无** db)⇒ �存在"�库"问题,分组�有一套。
🔎 **收尾自检一�**:本棒 `cwds` 是� = 我这�线自己的工作区?入�文件是��在我这个工作区存在一份?**本次写入的产物是�都在该工作区路径下(律④)?**
---
### 0.7 🔴🔴 活库(`workbuddy.db`)改动�律(2026-09-23 血的教训 —— ⛔ ��必炸库)
> 🔴 **纠�(2026-09-23 22:0x 实�)**:「**必须� app**��对**文件级�作**(`cp`�`mv`�覆盖 WAL 三件套)�立,⛔ **��套到 SQL �更上**。
> **实�**:**在 app �行中**用 `sqlite3.Connection.backup()` �在线一致性备份(产出�文件自洽副本 1.83 MB)→ `UPDATE sessions SET cwd=…`(**16 行**)→ 改��改��跑一次 `PRAGMA integrity_check` 全 `ok` → **app 全程正常**(执行者本身就跑在 app 里)。
> ⚠� 把"必须� app"套到 SQL �更会形�**死�**:执行清�的 AI **永远跑在 app 内** ⇒ 这�规则一读死,「清�已裂组�就永远���(用户原�点破:「**关了你咋�行 你就是 workbuddy**�)。**正解 = ⛔ �碰三件套,�用 SQL + 官方 `backup()` API�`VACUUM INTO`。**
**事故**:为清�「��会�分组�,`cp` 覆盖了 `E:\ProgramData\.workbuddy\workbuddy.db` ⇒ **WorkBuddy 应用当场读�了库**(`DatabaseError: file is not a database`),且**�续��读**�app 还在往上写。
**机�**(这�是�记的):`workbuddy.db` 是 **WAL 模� + 多进程并�**的活库,�一逻辑库由**三个文件**共�构�:
```
workbuddy.db 主库(已 checkpoint 的基线)
workbuddy.db-wal 预写日志(增�,带 salt 世代)
workbuddy.db-shm 共享内存索引(被 app 进程�有)
```
三者必须**�一世代**�自洽。文件级 `cp` ��其中一部分 ⇒ **salt 世代错�** ⇒ SQLite 判定「�是数�库�。
**�律四�(⛔ ��破)**:
| # | 律 | �由 |
|---|---|---|
| � | **先确认 app 未�行**(`Get-Process WorkBuddy`)⇒ 有进程就**�手**,⛔ �碰文件 | app �有 `-shm` �柄,`cp` 覆盖必然三件套错� |
| � | **⛔ �止文件级 `cp`/`mv`/`rsync` 动活库** | �使 app 已关,�文件 `cp` �有中间�风险;�备份就三件套一起����就三件套一起 |
| � | **改数��走 SQL 连接**(`sqlite3.connect` + `busy_timeout`),⛔ �碰字节 | 连接路径由 SQLite 自己维护�与世代 |
| � | **改�必备份三件套**,改�**立� `PRAGMA integrity_check`** | 备份�� `-wal`/`-shm`,�则备份本身�自洽 |
**判�(出事时怎么定�)**:
- `file is not a database` ≠ 文件�了 ⇒ 先看**三件套 salt 是��世代**:主库 `change counter`(off 24) 与 `version-valid-for`(off 92) 相等 ⇒ **主库自洽**
- 用 `?mode=ro&immutable=1` 打开�**完全绕开 WAL/SHM**:读得出 ⇒ **数�在,�是 WAL 错�**
- ⛔ **`immutable=1` �能读,�得用于写**(会跳过� ⇒ 与 app 打架)
**修法(唯一)**:� app → **删 `-wal` 与 `-shm`** → �� app(SQLite 从自洽主库�建)⇒ 数�零丢失。
**自检一�**:我�动的这个库,**app 现在开��**?备份是**三件套一起**�?改完跑 `integrity_check` 了�?
---
## 1. 形�:规划棒 ↔ 执行棒 交替
```text
规划棒①(出交接�)→ 执行棒①(照��地)→ 规划棒②(出下一�)→ 执行棒② → …
↑ �棒 = 一个全新会� + 一�一次性 automation,�完自己登记下一棒
```
**为什么拆�两�棒(�是�便切段)**
| 棒 | ��什么 | �本�级(实测) |
|---|---|---|
| **规划棒** | **�出交接�**:�改�务器��改代���部署 | 23–56 次调用 / 5.7–9.4 积分 / 3–10 min |
| **执行棒** | **照��地**:按��的 S0–Sn ��执行���验收 | 93–215 次调用 / 23–29 积分 / 21–41 min |
⇒ 这是「**规划与执行分离**�从纪律��**机制**:规划棒物�上碰�到生产,执行棒物�上�必���。
**⛔ 什么时候��用这套**
- 一次性�任务(直接�,别排链�)
- 步骤�并行(用并行会� + **域�**:域����真并行;机制层任务�须独�,� §3.5)
- **任务形�本身就贵**(例:批�改写 N 份文档)—— 那�该**先写脚本一次跑完**;接力**救�了**贵的活,��场地
- �棒��完(会超出上下文预算)⇒ 说明**棒还��切细**,或改用「接续包 v2 + 开机四步�
- 🔴 **链�上存在「需�用户���的决策点** ⇒ �自决的段�照常接力,但**必须在��点��下**,�许自动跨过去(**� §3.3 登记门�**)
---
## 2. 六件套 prompt 骨架(照抄填空)
> **�置**:�棒的 prompt 写在 `automation_update` 的 `prompt` 字段里。
> **�点**:整段 400–1,300 字符。**越长越糟** —— �多抄一个技术细节,就多一个漂移�。
```text
<线�> · <第 N 棒:规划棒 / 执行棒>(本轮��这一件事,�完��)。
第 0 步:跑 `<�对路径>/state.py` 看状�(�读��抢��1 次调用拿到�/git/入�/收�)。
第 1 步(开工门�):先跑 `bash "<�对路径>/preflight-lock.sh" "<线�>-<第N棒>" <目标文件...>` —— **�D】未归类 或�E】机制层�空 ⇒ rc=1 ⇒ 拒开工**(先去归类/改独�)。
第 1b 步:抢� `bash "<�对路径>/handoff-guard.sh" --claim-exec "<线�>-<第N棒>" --domains <域...>`;**抢�到 = 冲�域被� ⇒ �报告并立刻�**(⛔ �得删�,R9)。
⚠� 机制层任务(`scripts`/`config`/`crypto`/`isolation`/`index`/`CODEBUDDY.md`/�本身)**⛔ �加 `--domains`** ⇒ 退化全局独�。
第 2 步:读**唯一执行��** = `<入�文件�对路径>` 的 **§2「🎯 本轮动作��**,按它点�的那份交接�开工。
(规划棒专属)本轮任务:出�执行交接�,�盘 `<路径>`,按 8 段模�:目标 / �读�置 / 范围 / 决策点 / 步骤 S0–Sn / ��验收判� / 回滚 / §8 回报格�。
(规划棒专属)⛔ 开工�先加载技能 `session-mechanism`(��判�以它为准,�凭记忆)。
约�:⛔ � commit / push;⛔ �� <明确点�的排除项>;⛔ ��� <已收官的��>;⛔ �扩大��范围(�外�现的缺陷先报告��动手)。
�本纪律:批�活先写脚本�让脚本跑;��最多 3 �命令;⛔ �� Glob/Grep 全库摸底;一轮内工具调用次数尽�压低。
纪律:技术实现项**自决�上抛**;�有「没有客观优劣�的���列候选,且�个候选必须写「优点 / 缺点��**候选竖排�段**(�横排);判�必须�被第三方�现。
收尾(缺一�算未完�):① 释放� `--release-exec "<会��>"`(⛔ �带会�� ⇒ **拒�释放** · 2026-09-25 修);② **先过登记门�(� §3.3)**——�有「下一棒�自决��登记,**`scheduledAt` = 此刻 + 5~8 分钟(� §3.1.1 �律①,⛔ �许留长等待窗�)**,且**�一时刻�挂一个接续棒**(§3.1.1 �律②:⛔ �预登记队列,�续项写进入� §2 的「�� 本线下一项�由下一棒自己排);用**陈述�**告知「已登记自动接续�约 5~8 分钟�自动开新会��接续点 = X�;③ 把入� §2「🎯 本轮动作�推进到�下一棒;④ 写工作区日志。
```
### 2.1 三�骨架为什么长这样(都有实测出处)
| 骨架 | 治什么 | 实测�� |
|---|---|---|
| **第 2 步 = 指�入�,�抄细节** | **细节漂移**(细节有两个�� ⇒ 必然打架) | 09-16 那版 prompt �述了整段技术细节 ≈1.2 KB,�而**挤掉了"开机四步"那一行** ⇒ 40 次调用 / 9.37 积分(立项�径 ≤10 次 / ≈1 分) |
| **「本轮��这一件事,�完���** | 无人值守时的**自我扩�** | `b08b1c35`:用户�说「先确认待办�,第 28 次调用**已在写代�** |
| **「��最多 3 �命令�** | 防御性过度�� | �一会�第 7–24 次**连续 17 次��**,reasoning 里三连自我加�「���常完整了� |
| **纪律�(自决�上下抛 + 候选写优缺点)** | **把决策方法内�**(新会�读�到旧上下文,方法论�会自己进�) | 09-17 实测:9 棒里 `Skill` 调用 **0 次** ⇒ 判�全�这段内�文字撑� |
### 2.2 ★ 已知缺�:Skill 调用 = 0(本技能给出的修法)
**实测**(09-17 全部 9 棒):`function_call.name == "Skill"` **一次都没有**。判�是 prompt 里的**内�摘�**在起作用,完整方法论从未进上下文。
**修法**(分棒区别对待,别一刀切):
- **规划棒必须加**:`⛔ 开工�先加载会�技能 session-mechanism`(规划棒基数�有 23–56 次调用,+1 次�接�,且它确实������出�)
- **执行棒�以�加**:��已�把判断写死了,�加载方法论是纯开销(执行棒基数已 93–215 次)
---
## 3. 收尾四件套(缺一�算未完�)
> 这四件里**第 ② 件是唯一会"断链"的地方**,也是钩�**��到**的地方(钩��能创建会���能创建自动化)。
> 🔴 第 ② 件的两�硬约�(详� §3.1.1):**�排"下一棒"这一棒**(⛔ �预登记队列)+ **`scheduledAt` = 收� + 5~8 分钟**。
| # | 动作 | 判� |
|---|---|---|
| ① | 释放� `--release-exec "<会��>"`(⛔ �带� ⇒ 拒�释放) | 跑一次信�模�确认已释放 |
| ② | **先过 §3.3 登记门�** → 登记下一棒的一次性 automation(**`scheduledAt` = 此刻 + 5~8 分钟**,� §3.1.1 �律①;**�一时刻�挂一个**,�律②)+ **在给用户的回�里用陈述�告知** | 门��过 ⇒ **�登记,改为告知"链�已暂�待��"**;陈述�三�素:约 5~8 分钟�自动开新会� / **�用你�作** / 接续点 = X |
| ③ | 把入�文件 §2「🎯 本轮动作�**推进到�下一棒** | 入� = 下一棒的**第一信��**;�推进 ⇒ 下一棒照旧�径�,��工 |
| ④ | 写工作区日志(当日 `memory/YYYY-MM-DD.md` 追加自己的�节) | �追加自己的�节,⛔ ��写别人的段� |
### 3.1 收尾陈述�模�(实测原文,照抄)
```text
已登记自动接续:一次性 automation `<id>`,约 5~8 分钟�(08:37)自动开新会�,�用你�作;
接续点 = � ④「443/TCP 兜底�的规划棒(出 `05-交接�/交接�_443兜底_20260917.md`,�出���改�务器)。
收�:� 抢 ✓ → 释放 ✓(08:32)|未 commit / 未 push|入� §0/§2 已刷到「③ 已完� → 下一棒 ④�|产出物已交付。
```
**⛔ �登记�告知 = 缺陷**:新建会�是**用户�感知的状��更**。实测:`408636f2` 登记了自动化�一字未�,用户两�时�自己�现�追问。
#### 3.1.1 🔴 排期两��律:**首个(也是唯一的)接续棒** = 收� + **3~4 分钟**;⛔ **�一时刻�挂一个**(2026-09-18 定稿;🔴 **2026-10-01 用户�径改值:5~8 ⇒ 3~4 分钟**)
> 用户 2026-09-18 原�:「**首个接续任务 5-8分钟**�+「**最好��建立多个接续任务,一个会�结�时在排下一个**�
- **�律①(间隔)**:`scheduledAt` = **收�时刻 + 3~4 分钟**(🔴 2026-10-01 用户�径,原 5~8 作废)。⚠� 这 3~4 分钟是「**从本会�收�,到那"唯一一个"接续棒开跑**�的间隔 —— ⛔ **�是"棒与棒之间的间隔"**,�者根本�存在(由�律②,任何时刻�该有一个待跑接续棒)。
- **�律②(唯一)**:**�一时刻�挂一个接续棒**,下一棒**�能由"正在收官的那一棒"自己排**。⛔ **�止预登记队列 / 堆�**("我先把��两棒都排上" = �规)。
- **�续项�会丢**:把它写进入�文件 §2 的 **「�� 本线下一项(⛔ 本棒�预登记)�** 行(��点 / 根因 / 验收基线),**由当�那一棒收官时照此立棒**。
- **⚠� 「�挂�的唯一正确�法 = 新建,�是改时间**(2026-09-21 实测,� §4 第 ⑦ �):棒因为**抢�到�**等原因空转�你想"过 8 分钟��一次"时,⛔ **��** `mode="update"` 改 `scheduledAt` —— 已跑过的 once 型棒改时间**�会产生新的�行记录**(链��默死亡)。正确�法:`mode="create"` **新建一��内容 automation**,旧棒置 `PAUSED`(���律②的"�挂一个"),并在 prompt 里写明"抢�到就照此法自助�挂"。
**边界(哪一头都�能越)**
| 方� | 判� |
|---|---|
| 下�为何是 5(�是 2) | �开调度器最����与文件�盘竞� |
| 上� 8 何时�越 | ⛔ �有「**�等一个外部窗�**���许拉长(对方�务��完 / �一�棒在跑 / 用户��),且**必须在陈述�里写明在等什么** |
| ⛔ �许的两��由 | 「**给用户留追改窗�**�(追改�在任何一轮直接打断 ⇒ 等价于主动空转)· 「**怕它跑�完**�(**排期按实测基线算,�按猜�确定性算**:规划棒实测�需 **6–13 分钟**,�⑦/⑨/⑪/⑯/⑱/㉔) |
**实测事故 2026-09-18(一棒之内两处都犯过 ⇒ 本节因此�写)**
| # | 我�了什么 | 用户原� | 性质 |
|---|---|---|---|
| ① | ㉘ 规划棒排到 **收� + ~2 h**,�给 ㉙ 留 **1.5 h 余�** | 「为什么时间�定在3:00�→「㉘ 规划棒 = 01:30 **也还有1个多�时呢**� | ���律①:长空转 + **用"猜�确定性"代替实测基线** |
| ② | 用户说「**5-8分钟��**��,我把它读� **"棒与棒之间的间隔"**(㉘→㉙ = 8 分钟),于是**�时挂了 ㉘ + ㉙ 两个接续棒** | 「我说的是**首个**接续任务 5-8分钟,**最好��建立多个接续任务,一个会�结�时在排下一个**� | ���律②:预登记队列。**根因 = 改规则时�在旧��上�了个数字,没有回到本节核对规则的完整定义** |
⇒ **判�**:任何一次"排期调整"都�**回到本节��对照两��律**;⛔ �许��数字就交差 —— 数字与"�径�在哪个对象上"会一起漂移。
#### 3.1.2 🔴 下一棒的 **automation id �能�自工具返回值**(2026-09-17 实测踩�)
- **实测�例**:�⑧ 执行棒收�时,我先把「下一棒 id = `ad8d1c4f-…`�写进了自动化记忆文件,**之�**�调 `automation_update` 建� —— 真实 id 是 **`0c3feee5-…`**(工具生�,无法预知)⇒ 记忆文件里留下一�**指��存在的自动化**的� id,必须回头�改一次。
- **正确顺�**(��颠倒):① 先 `automation_update(mode=list)` 查� ⇒ ② `mode=create` 建� ⇒ ③ **从返回值�真 id** ⇒ ④ �写记忆文件 / 入�文件 / 日志。
- ⛔ **�许"先���补"**:id 是**外部生�的事实**,编造 = 判�级污染(下一�读者会拿它去 `mode=view`,查�到就会误判"链�断了")。
- ⚠� ��适用于:`scheduledAt` 的实际生效值(以返回的 `nextRunAt` 为准)�被工具规范化过的 name。
#### 3.1.3 🔴 跨线交付:**「投� ≠ �动�** —— 工��会自己��动作(2026-09-28 实测�)
**事实**:给**�一�线**(�一工作区)投了对接��还在对方入�加了指针之�,那�线**�会因此开工**。
��就是你本技能的第一律 —— **「自动化 = 开新会�的唯一通��**:没有 `cwds` 指�那个工作区的 automation,**就没有任何机制把对方拉起�**;工��是「文件里的留言�,得等�个会�去读它。
**实测(2026-09-28)**:平�线给 `ai1net-dsh-anywhere` 投了对接�(15:10 �地),并对用户说「让相关会�都执行起��——
但 automation 全表 6 �里**没有一�指�那个工作区**,对方**当天零活动**(根目录 mtime �在 09-27 23:38�无当日日志)。
⇒ 用户��直接问「**为什么�一个会�还没开� app**�,根因就是**投�之�没排棒**。
**判�(投完�必自问一�)**:这张�**由��在什么时候**读?
- 有 automation ⇒ ✅ 已闭环
- 没有 ⇒ **立刻补一� `once` automation**:`cwds` = 对方工作区,prompt 写「读 X �并执行�(⛔ 别指望对方"自己会看到")
⚠� **投��还�核对对方的「开工���是��然�立**:实测那�线入�的「下一步��赖的宿主目录**已被删除** ⇒ 就算把它拉起�,按自己的入�办也会失败。
⇒ **投� + 排棒 + 在棒里写明「局�已��⛔ 别按旧入�办�**,三件一起�算�到。
⚠� **跨线排棒�防"撞车"**:若对方�动的东西正被自己这�线用�(例如今晚�端到端验�的那批文件),**把对方那一棒设�「�读核对 + 出结论�**,⛔ �给写�� —— �则两�线�时改�一批文件。
### 3.2 ★ 登记�必须先看有没有在跑的(防�开)
实测(�③规划棒,09-17 07:56):
> 「执行棒会�**已�起�了**(07:53 触�,现在 07:56),所以我**��新建接续 automation** —— 链�已�接上,多建一��会��开工。�
**判�**:登记�先确认下一棒是�**已�存在**(会�列表 / `automation_runtime_state.running`)。已存在 ⇒ **�登记,�报告**。
### 3.3 🔴 登记门�:���的,等�了�登记(用户 2026-09-17 明令)
用户原�:
> 「**需�我��时,等�了�新建接续会�就行**�
**动作�有两�**:
- 下一棒若�**需�用户��**的事 ⇒ ⛔ **�登记**;本棒正常收�,�在「待你���节,并告知「**链�已暂�,等你��**�
- **��到手�** ⇒ �由当时的会�登记下一棒
**什么算「需����** = 边界外六类 + ��逆�作:
业务目标 / 优先级 · 花钱或承诺资� · 对外承诺与�规 · 需�用户�供凭�或审批 · 无客观优劣的�好 · 影��超出本平� · ��逆�作(删数� / �库 / 清目录)。
⚠� **判�顺�**:先判「是�是����;**未命中**�轮到「候选排�排得出优劣�。顺��了就会自我扩� —— 实测事故� §3.3.1。
**唯一例外**:�件��阻塞项(��决定也能先开工)⇒ �以登记,但�把「�到���写进下一棒 prompt。
> 实测正例(�④规划棒):「�有 S3 实测�明『地�覆盖 + 指定 SNI���行时,这一���为唯一缺��⇒ �阻塞开工 ⇒ 正常登记。
### 3.3.1 实测事故:�⑥ → �⑦「��未定,接续已跑�(2026-09-17 用户报障)
用户原�:
> 「**最新会��到需�我�� 还是自动创建接续会�的情况,导致��还没定,接续会�已�开始执行**�
**�过**:09:52 �⑥**规划棒**把「真机���(�用户出设备 = 边界外)自己�了 ⇒ 登记执行棒 → 10:58 �⑦规划棒按链�自动开跑 → **11:00 用户�给��** → 11:09 �⑦执行棒�自动开起� → 11:11 用户手动喊�。**多烧 ≥2 轮,且�用户自己介入收拾。**
**三�留档(别�犯)**
1. **边界外的事,候选�明显更优也�许自己�** —— 这次就是「A 零�本零等待�看�更优,但选项本身越界。
2. **��项一旦上抛,本棒就�许�登记下一棒** —— 机器定时与人的��节�**没有�步点**,�等就必然错�。
3. **判「�棒是�在跑�看�的时间戳**(域��全局�皆�),⛔ �是 `automation.status` —— 12 �已跑完的一次性任务,`status` 全是 `ACTIVE`。
---
## 4. 七�实测防护(都是真踩过的)
| # | 现象 | �果 | 处置 |
|---|---|---|---|
| ① | **�登记下一棒**(链�断在收工处) | 无人接��,**�等用户�现** | 实测:07:2x 那棒�登记 ⇒ 用户 07:39 主动追问「为什么还�创建新会�接续任务�。⇒ 修法 = 把「收尾四件套缺一�算未完��**写进�棒 prompt** |
| ② | **�开 / ��登记** | �一份活被跑两�,白烧一轮 | � §3.2(登记�先看有没有在跑的) |
| ③ | **once 型 automation 跑完�自动转完��** | 列表里堆积"已过期但 ACTIVE"的一次性任务;调度器补跑窗� **12 �时** ⇒ �论上�能被扫到�**多开一个会�** | 实测 09-17:列表里躺� 4 �过期� ACTIVE 的 once 型任务。处置:**��原样**(�动既有�置)或**设为暂�**;⛔ ��用 shell 去改库 |
| ④ | **自动跨过"需���"的点** | ��未定就跑,**�等用户自己�现**(已有实测事故 §3.3.1) | **���的,等�了�登记**(§3.3 门�) |
| ⑤ | **下一棒 `scheduledAt` 拉太长**(实测 ~25 min,甚至 ~2 h) | 链�白白空转,**用户当场追问** | 实测:�⑦执行棒 12:2x 收��下一棒排 12:50 ⇒ 用户 12:26 追问「**为什么�等20多分钟�执行接续会�**�;09-18 �排过「收� + ~2 h�。⇒ 修法 = §3.1.1 �律①:**= 收�时刻 + 5~8 分钟**,且**按实测基线算**(规划棒 6–13 分钟) |
| ⑥ | **预登记多个接续棒**(队列堆�) | 链�上挂� ≥2 个待跑棒 ⇒ 抢�空转;�续项�么白烧�么被撤,**用户当场纠正** | 实测 09-18:㉗ 棒�时挂了 ㉘+㉙ 两� ⇒ 用户原�「**最好��建立多个接续任务,一个会�结�时在排下一个**�。⇒ 修法 = §3.1.1 �律②:**�一时刻�挂一个**;�续项写进入� §2 的「�� 本线下一项(⛔ 本棒�预登记)�,由当棒收官时立棒 |
| ⑦ | **「�挂�= 改 `scheduledAt` ⇒ 根本�触�**(棒被�挡回�想�排一次时最容易踩) | 链�**�默死亡**:以为"5~8 分钟�会自动�试",实际调度器**从未创建�行**,�等用户追问��现 | 实测 09-21 carbon 棒③:06:24 把 `scheduledAt` 改� 06:34 ⇒ 06:42 �零痕迹;`daemon.log` 里**�存在** `:1789943*` 形�的�行记录,�有原 06:23 那一笔 ⇒ **已跑过的 once 型棒,改时间�会�新入队**。⇒ 修法 = **�挂必须新建 automation**(`mode="create"`),并把旧棒置 `PAUSED`(�「�一时刻�挂一个�);⛔ 别用改时间�排。��方� = �行记录形如 `<automationId>:<epochMs>`,去 `E:/ProgramData/.workbuddy/logs/daemon.log` 里按 `<id>:<期望时间戳� 7 �>` � |
### 3.5 🔴 域�四个已实�的「�绿��(2026-09-22 �地时全踩过)
> 域� = ��带**资�声明**(`DOMAINS`),�算交集 ⇒ **域�����真并行**(�代旧的「全局�放一个�)。
> 机制层(`scripts`/`config`/`crypto`/`isolation`/`index`/`CODEBUDDY.md`/�本身)**全平�共用 ⇒ 必须独�**。
| # | � | 症状 | 修法 |
|---|---|---|---|
| ① | **域键算法 shell / hook 两侧�一致** | 一侧�"首个锚点段"��一侧�"�两段" ⇒ �一路径算出��域 ⇒ **交集永远算空** ⇒ 该拦的全放行 | 锚点表**�字一致**且**先长�短**(`dsh-server-docs` → `aliyun-dsh-server` → `src`/`web`/`test`…);改一侧必须�步�一侧 |
| ② | **� ASCII 会��塌��一目录**(本平�**必现**) | `tr -c 'A-Za-z0-9._-' '_'` 把�个� ASCII 字符压� `_` ⇒ 「域�-A�「域�-B�「域�-C�**全映射���目录** ⇒ 一�被多人共用�域声明被并进�一份 ⇒ **域隔离整体失效** | 会���� ASCII ⇒ 目录�**附 `cksum` 摘�**(唯一�确定�无外部�赖);ASCII �直接留用(�读+兼容) |
| ③ | **�会�二次抢� `rm -rf` �建** | �目录��由会��派生 ⇒ 第二次抢 `src/net` 把第一次的 `src/im` 声明**冲掉** ⇒ 异会��抢进� | 改为**�并**:`grep -qxF` 去��追加进 `DOMAINS` ⇒ 一会�一把��多域累积 |
| ④ | **`trap` �槽�互相覆盖** | bash 的 `trap` 是**�一槽�** —— 先�注册两次,�者**覆盖**�者 ⇒ 必然�清一样(实测� `.gate`) | 收敛�**一个**清�函数�时清所有临时物,全�程**�注册一次**;⚠� 且**�清自己创建的**(`.gate` �能是别人的,无脑删 = 破�别人的互斥) |
**⚠� 验收 hook 的�置�件(⛔ �满足就是在测错的东西)**:`_is_mine()` �求**会��与 `session_id` �时��**。
若�设 `DSH_SESSION_NAME`,且多把�写�**�一个** `CODEBUDDY_SESSION_ID`(�进程批�抢�必然如此)⇒ 会��为空 ⇒ 退到「�看 id�分支 ⇒ **把别人的�认�自己的** ⇒ �绿放行。
⇒ **验收必须带 `DSH_SESSION_NAME=<会��>`**,并覆盖四场景:我改我域(放行)�我改他域(拦)�他改我域(拦+报精确冲�域)�他改他域(放行)。
**⚠� 收尾顺��律**:`--release-exec "<会��>"` **必须放在所有文件改完之�**(⛔ �带会�� ⇒ 拒�释放)。
��放���改文件 ⇒ 被 hook 以「没有�任何��**硬拦**(fail-closed,按设计工作)⇒ �能�新抢��改。
⇒ **改完 → 回归 → �放�**。
---
## 5. 实测�本基线(2026-09-17 链�,连续 8 棒零断链)
| 棒 | 工具调用 | 积分 | 时长 | 用户轮数 |
|---|---|---|---|---|
| �③ 规划棒 | 50 | 6.66 | 10 min | 1 |
| �③ 执行棒 | 215 | 24.65 | 41 min | 4 |
| �④ 规划棒 | 56 | 5.73 | 6 min | 1 |
| �④ 执行棒 | 123 | 24.90 | 23 min | 3 |
| �⑤ 规划棒 | 25 | 7.66 | 3 min | 1 |
| �⑤ 执行棒 | 121 | 28.76 | 21 min | 1 |
| �⑥ 规划棒 | 23 | 9.35 | 7 min | 1 |
| �⑥ 执行棒 | 93(进行中) | 22.99 | — | 9 |
**对比旧形�**(�一�线�09-16「一� prompt 跑完整�线�):
| 会� | 工具调用 | 积分 | 时长 |
|---|---|---|---|
| 规划覆盖网络任务�地步骤 | 207 | 77.99 | 195 min |
| R3 接续(relay 常驻 + via 切�) | 641 | 72.22 | 166 min |
⇒ **规划棒�本�到旧形�的 1/8–1/12**;且**�棒用户轮数 ≈ 1**(�有 automation prompt 本身,**零人工介入**)。
**�数方法**(已固化为脚本,一�命令出全套):
```bash
"E:/ProgramData/.workbuddy/binaries/python/versions/3.13.12/python.exe" \
"E:/ProgramData/.workbuddy/skills/dsh-workflow/references/dsh-auto-handoff-chain/chain_report.py" "<线�关键�>"
```
它一次输出四段:① �会�(工具调用 / 积分 / 积分�次 / **Skill 调用数** / top tools)② �计 ③ **自动化�行链 + 断链检测**(相邻两棒间隔 > 90 min 报 ⚠�)④ **过期但� ACTIVE 的一次性 automation 清�**。
> **实测判读**:09-17 那 8 棒间隔全部 < 90 min(**零断链**);09-16 旧形�连续 6 次 > 90 min(人工介入�无接力)。
底层�径(�自己写脚本时看这三行):
- 会�/自动化元数� → `<�置目录>/workbuddy.db`(`sessions` / `automations` / `automation_runs`)
- �次积分 → 转录 `projects/<工作区目录�>/<sid>.jsonl`,**递归**收集 `rawUsage` 节点求和(⛔ 顶层 `d.get("rawUsage")` 抓�到)
- 工具调用次数 → �一份 jsonl 里数 `type == "function_call"` 的行;文本元素类型是 `input_text` / `output_text`(⛔ �是 `"text"`,写错会�默抽空)
---
## 6. �地清�(新开一�接力链时)
1. **建入�文件** `接续入�_<线�>_<日期>.md`,把状��定��`§2「🎯 本轮动作��` 写进去
2. **让 `state.py` 能读到它**(状�脚本的 `[入�]` 段�展开入� §2 ⇒ 钉在 §2 顶部�有用)
3. **定�**:把整�线切�「规划棒①→执行棒①→规划棒②→…�,并**写进入� §0**
4. **起第一棒**:`automation_update` 建一次性 automation(`+5~8 分钟`,� §3.1.1 �律①),prompt 照 §2 骨架填
5. **�棒收尾走完 §3 四件套**(其中第 ② 件**�置 §3.3 登记门�**)—— 推进 §2 + 登记下一棒;🔴 **�一时刻�挂一个接续棒**:本棒�排"下一棒"一棒,�续项写进入� §2 的「�� 本线下一项�行,⛔ �预登记队列
6. **收�**:链�跑完时,最�一棒�登记下一棒,改为**明确告知用户"链�已完结"**
7. **�到��点**:�在「待你���节(候选竖排 + 优缺点 + 我的倾�),**并明确告知链�已暂�**;等用户����由当时会�登记下一棒
---
## �更历�(原 frontmatter · �字�留)
```text
name: dsh-auto-handoff-chain
description: 长任务「多棒自动接力ã€�编排法 —— 把一个跨越多个上下文窗å�£çš„大任务,拆æˆ�「规划棒 ↔ 执行棒ã€�交替的一次性自动化链æ�¡ï¼Œæ¯�棒å�šå®Œè‡ªåŠ¨å¼€æ–°ä¼šè¯�接下一棒,**全程零人工点击**。当用户说「自动新建会è¯�接续处ç�†ã€�「接力跑下去ã€�「多步骤任务自动推进ã€�「跑完一棒自动接下一棒ã€�「无人值守推进ã€�,或一个任务预计è¦�è·¨ ≥3 个会è¯� / 超过一个上下文窗å�£æ—¶è§¦å�‘。核心 = 六件套 prompt 骨架(状æ€�å�•点 → 唯一执行ä¾�æ�®æŒ‡é’ˆ → 全局é”� → å�•一动作 → æˆ�本纪律 → 收尾四件套)+ **登记门ç¦�(★è¦�æ‹�æ�¿çš„,等æ‹�了å†�登记 —— 用户 2026-09-17 明令,当天已有实测事故 §3.3.1)** + 七æ�¡å®žæµ‹é˜²æŠ¤ï¼ˆæ–­é“¾ / å�Œå¼€ / once ä¸�转完æˆ�æ€� / 跨过æ‹�æ�¿ç‚¹ / **下一棒定太晚** / **预登记多个接续棒** / **é‡�挂改时间ä¸�触å�‘(必须新建)**,排期纪律è§� §3.1.1)⛔ **投å�• ≠ å�¯åŠ¨ï¼ˆÂ§3.1.3,09-28 实测)**:给别æ�¡çº¿æŠ•å·¥å�•+在对方入å�£åŠ æŒ‡é’ˆ**ä¸�产生任何动作**(automation 全表无一æ�¡ `cwds` 指å�‘那个工作区 ⇒ 对方**当天零活动**,用户直接问「为什么å�¦ä¸€ä¸ªä¼šè¯�还没开å�‘ appã€�)⇒ å¿…é¡»**补一æ�¡ `once` automation**,`cwds` = 对方工作区;⚠ï¸� 投å�•å‰�还è¦�核对对方「开工ä¾�æ�®ã€�是å�¦ä»�æˆ�立(实测其ä¾�赖目录已删),并在棒里写明「局é�¢å·²å�˜ã€�â›” 别按旧入å�£åŠžã€�。+ 实测æˆ�本基线 + å¤�跑脚本 `scripts/chain_report.py`。⛔ **排期两æ�¡é“�律(§3.1.1,用户 2026-09-18 明令)**:首个(唯一)接续棒 = æ”¶å�£ + **5~8 分钟**ï¼›**å�Œä¸€æ—¶åˆ»å�ªæŒ‚一个接续棒**,下一棒由当棒收官时å†�排。⛔ 两æ�¡å…³é”®åˆ¤æ�®ï¼š**prompt 里ç»�ä¸�抄任务细节**(细节å�ªæœ‰ä¸€ä¸ªæ¼‚ç§»æº� = å…¥å�£æ–‡ä»¶çš„「本轮动作ã€�å�—);**先判「是ä¸�是è¦�æ‹�æ�¿ã€�,未命中æ‰�轮到「候选排ä¸�排得出优劣ã€�—— 顺åº�颠倒就会自我扩æ�ƒ**。⛔ **工作区归属五律(§0.6,2026-09-21 立①②③④ / 09-22 加⑤)**:入å�£æ–‡ä»¶å�ªå…�许一份(在本工作区)· automation çš„ `cwds` = 本工作区 · å�‚考接续规则用本技能(ä¸�是去读别的工作区的文档)· 🔴 **`cwds` å�ªå†™ã€Œä¸Žæ‰‹åŠ¨å¼€ä¼šè¯�çš„ cwd é€�å­—å�Œå½¢ã€�(判æ�® = 实测 `sessions.cwd`ï¼›**当å‰�正解 = `E:/ProgramData/AIProject/ai1net-dsh-server` 正斜æ� **)**(`E:/…` ✅ï¼�`E:\…` â�Œï¼�`e:\…` â�Œ ⇒ å�Œä¸€å·¥ä½œåŒºåœ¨ UI 里裂æˆ�**两个å�Œå��会è¯�分组**,实测 09-22 æ–œæ� æ–¹å�‘ã€�09-23 盘符大å°�写**两次**;⚠ï¸� 宿主去é‡�é”® = `path.trim().toLowerCase()` ⇒ **å�ªå°�写ã€�ä¸�统一斜æ� **(09-24 代ç �级实è¯�))。⛔ **å�Œå��镜åƒ�目录(§0.6 戊类 · 2026-09-27 实测)**:入å�£æ–‡ä»¶å�Œæ—¶å­˜åœ¨äºŽ**两个真目录**(如 `…\ProgramData\…` 与 `…\ProgramDSH\…`)⇒ â‘  å�Œä¸€å·¥ä½œåŒºè£‚æˆ�**两个å�Œå��会è¯�分组** â‘¡ dsh é”�按 `--ws` 分命å��空间 ⇒ **两处å�„一把é”�ã€�互ä¸�排斥(等于没上é”�)** â‘¢ å…¥å�£åˆ†å�‰ï¼›åˆ¤æ�® = **ç£�盘上到底有几个å�Œå��目录** + 实测 `sessions.cwd` æ�¡æ•°æœ€å¤šé‚£æ�¡ï¼›âš ï¸� 镜åƒ�目录**ä¸�是空壳**(å�¯èƒ½æœ‰ `bundles\`ï¼�`docs\` 骨架),⛔ 别看入å�£é‡Œçš„「æ�¥æº�会è¯�ï¼�资产路径ã€�判工作区。⛔ **己类(2026-09-27 实测)**:入å�£é‡Œå£°æ˜Žçš„**工作区路径在ç£�盘上ä¸�存在**(æ�¬å®¶æˆ–改å��å�Žå�ªæ�¬ç›®å½•ã€�没回填入å�£å¤´éƒ¨ —— 实测 `session-mechanism-laya` vs 真实目录 `ai1net-decision-laya`,入å�£å†… 33 处旧å��)⇒ 照抄登记会**凭空新建一个幽ç�µåˆ†ç»„**;判æ�® = 把入å�£é‡Œæ¯�处「工作区 = …ã€�é€�æ�¡ `Test-Path`,任一ä¸�æˆ�ç«‹å�³ä»¥**实测 `sessions.cwd`** 为准回填(⛔ 别按旧å��去新建目录)。🔴 **「å�œç»´æŠ¤ã€�≠「å�œç”¨ã€�**:定完唯一æ�ƒå¨�å�Žï¼Œæ—§ä¾§é‚£ä»½å…¥å�£**必须就地改æˆ�跳转 stub**,å�ªå†™ä¸€å�¥"旧副本å�œç»´æŠ¤"**ä¸�ç®—æ”¶å�£** —— 实测两æ�¡çº¿å› æ­¤å�„留了一份完整旧正文,当晚已分å
version: 1.7.5
updated_at: 2026-09-28
created_from: 覆盖网络线 19 个会�(2026-09-16 ~ 09-17)的实测�盘 —— 09-17 链�连续 8 棒零断链,规划棒�本�至旧形�的 1/8–1/12
last_change: �2026-09-28 跨线交付�排棒】新增 §3.1.3「**投� ≠ �动**�—— 实测:给�一�线投了对接�+在对方入�加了指针,但 automation 全表**无一�** `cwds` 指�该工作区 ⇒ 对方**当天零活动**(用户直接问「为什么�一个会�还没开� app�)。判� = 投完�必自问「**这张�由��在什么时候读**�;没有 automation 就**立刻补一� `once`**(`cwds` = 对方工作区)。附两�:① 投���核对对方「开工���是���立(实测其�赖的宿主目录**已被删除** ⇒ 拉起�也会失败,须在棒里写明「局�已��⛔ 别按旧入�办�);② 跨线排棒若涉�**自己正在用的文件** ⇒ 设�「**�读核对 + 出结论**�防两�线撞车。此� 09-27:�2026-09-27 全库体检】加 §0.6「己·入�声明的工作区与�盘�符��因类(→ 六类)+「�维护 ≠ �用��律(旧侧入�必须改 stub)+ 实测事故·四(全库 7 工作区扫�,附�跑脚本 `scripts/audit-mirror.py`)。
agent_created: true
```
---
## �更历�(**对侧副本** frontmatter · �字�留 · �自 `dsh-auto-handoff-chain` 的 文档库 版)
> ⚠� 本档正文�自**�一侧**(超集);此处补上对侧副本的版本�,⛔ 以���丢任何事实。
```text
name: dsh-auto-handoff-chain
description: 长任务「多棒自动接力�编排法 —— 把一个跨越多个上下文窗�的大任务,拆�「规划棒 ↔ 执行棒�交替的一次性自动化链�,�棒�完自动开新会�接下一棒,**全程零人工点击**。当用户说「自动新建会�接续处��「接力跑下去�「多步骤任务自动推进�「跑完一棒自动接下一棒�「无人值守推进�,或一个任务预计�跨 ≥3 个会� / 超过一个上下文窗�时触�。核心 = 六件套 prompt 骨架(状��点 → 唯一执行��指针 → 全局� → �一动作 → �本纪律 → 收尾四件套)+ **登记门�(★���的,等�了�登记 —— 用户 2026-09-17 明令,当天已有实测事故 §3.3.1)** + 七�实测防护(断链 / �开 / once �转完�� / 跨过��点 / **下一棒定太晚** / **预登记多个接续棒** / **�挂改时间�触�(必须新建)**,排期纪律� §3.1.1)+ 实测�本基线 + �跑脚本 `scripts/chain_report.py`。⛔ **排期两��律(§3.1.1,用户 2026-09-18 明令)**:首个(唯一)接续棒 = 收� + **5~8 分钟**;**�一时刻�挂一个接续棒**,下一棒由当棒收官时�排。⛔ 两�关键判�:**prompt 里��抄任务细节**(细节�有一个漂移� = 入�文件的「本轮动作��);**先判「是�是����,未命中�轮到「候选排�排得出优劣�—— 顺�颠倒就会自我扩�**。⛔ **工作区归属五律(§0.6,2026-09-21 立①②③④ / 09-22 加⑤)**:入�文件��许一份(在本工作区)· automation 的 `cwds` = 本工作区 · �考接续规则用本技能(�是去读别的工作区的文档)· 🔴 **`cwds` �写「与手动开会�的 cwd �字�形�(判� = 实测 `sessions.cwd`;**当�正解 = `E:/ProgramData/AIProject/aliyun-dsh-server` 正斜�**)**(`E:/…` ✅�`E:\…` ��`e:\…` � ⇒ �一工作区在 UI 里裂�**两个��会�分组**,实测 09-22 斜�方��09-23 盘符大�写**两次**;⚠� 宿主去�键 = `path.trim().toLowerCase()` ⇒ **��写��统一斜�**(09-24 代�级实�))。🔴🔴 **活库改动�律(§0.7,09-23 血教训)**:动 `workbuddy.db` �**必须先确认 app 已关**,⛔ **�止文件级 `cp`/`mv`**(WAL 三件套会 salt 错� ⇒ `file is not a database`),改数�**�走 SQL 连接**�备份与��**都三件套一起**�改完必跑 `integrity_check`。
version: 1.7.2
updated_at: 2026-09-23
created_from: 覆盖网络线 19 个会�(2026-09-16 ~ 09-17)的实测�盘 —— 09-17 链�连续 8 棒零断链,规划棒�本�至旧形�的 1/8–1/12
last_change: �2026-09-22 按�求统一版本�】frontmatter `version` → `1.0.0`(原 v1.5.0);正文与历�中的版本�为当时记录,未改动。
agent_created: true
```