- 变更规模:新增 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/ 知识文件,按口径入库)
18 KiB
dsh-* 技能合并方案与体检报告(2026-09-28)
触发:用户原话「
E:\ProgramData\.workbuddy\skills这里面 dsh 开头的技能太多了,把相同领域作用的技能合并,方便维护和调用」。 方法依据(本项目自有的,⛔ 不自创):技能dsh-knowledge-upkeep§9「技能集可用性体检」(判据 = description 区分度)+ §10「技能重组:主干 + 详情档」(🔴 是"拆"不是"并成巨文件";四硬约束:内容守恒 / 判据实体常驻 / 每档自包含 / 三处同步)。 🔴 §9.4 铁律:良性撞(分工互补)⛔ 不要为了"看起来干净"去削 —— 只消「偏错一方」的恶性撞。
一、🔴 阻断项:技能「三处」当前就是不一致的(本报告最重要的一节)
三处定义(~/.workbuddy 记忆·仓库推送与授权 第 15 行):
① 本机 E:\ProgramData\.workbuddy\skills\<n>\ → ② 文档库 D:\github\dsh_shenxian\dsh-server-docs\08-skills\<n>\ → ③ 服务器 /opt/dsh/docs/08-skills/<n>\
三方 md5 实测(2026-09-28 23:4x):
| 技能 | 本机 | 文档库 | 服务器 | 判定 |
|---|---|---|---|---|
| dsh-architecture-lifecycle | 302a | 302a | 302a | ✅ 一致 |
| dsh-decision-method | 4e18 | 4e18 | 4e18 | ✅ 一致 |
| dsh-feature-first | 95f3 | 95f3 | 95f3 | ✅ 一致 |
| dsh-instance-diagnose | 4078 | 4078 | 4078 | ✅ 一致 |
| dsh-opensource-release | e52b | e52b | e52b | ✅ 一致 |
| dsh-plugin-diagnose | 18d6 | 18d6 | 18d6 | ✅ 一致 |
| dsh-auto-handoff-chain | b89c | ea37 | a204 | 🔴 三个版本各不相同 |
| dsh-change-workflow | a408 | e70d | e70d | 🔴 本机 ≠ 另两处 |
| dsh-desktop-dev-shell | 9490 | 8829 | 8829 | 🔴 本机 ≠ 另两处 |
| dsh-env-bootstrap | 8743 | 3eb1 | 3eb1 | 🔴 本机 ≠ 另两处 |
| dsh-knowledge-upkeep | 72f6 | b403 | b403 | 🔴 本机 ≠ 另两处 |
| dsh-distributed-state-readback | 0eec | — | — | 🔴 只在本地,另两处从来没有过 |
读数结论:
- 文档库 与 服务器逐条相同(=最后一次同步的结果);本机是另一套。
- 6 / 12 不一致;其中
dsh-auto-handoff-chain三处各一个版本(三方分叉)。 dsh-distributed-state-readback(6.4 KB)从未同步过 —— 是个漏网的。- ⚠️ 大小关系不是单向的:
desktop-dev-shell/env-bootstrap/auto-handoff-chain本机更大;change-workflow/knowledge-upkeep本机更小(很可能是拆分后的主干版本)⇒ 不能简单按"谁新"或"谁大"定权威,必须逐个比对内容。
🔴 为什么这是阻断项:合并会把当前这份不一致固化进新结构,而且有丢内容的实际风险(例:dsh-change-workflow 文档库版比本机大 3.5 KB,合并时若只取本机版,那部分内容会消失且无人察觉)。
⇒ 合并之前必须先做「三处对账」(逐技能确定权威版本并同步),至少要把这 6 个查清。
二、领域聚类(clinical:按 description + 章节骨架,不按感觉)
| 组 | 建议名 | 并入 | 依据 | 合计 |
|---|---|---|---|---|
| 1 | dsh-diagnose |
instance-diagnose + plugin-diagnose + distributed-state-readback | 三者都在回答「X 坏了 / 状态是假的,怎么定位」;且 instance-diagnose 与 plugin-diagnose 正文已互相声明边界(「⚠️ 与 X 的边界」)⇒ 属同一领域的分层,分层判据本就在它们的"先定层"一节里 |
42 KB |
| 2 | dsh-knowledge |
knowledge-upkeep + architecture-lifecycle | 同一问题:项目的知识/文档怎么组织与纠偏。architecture-lifecycle 的 description 结尾自己写着「配套:dsh-knowledge-upkeep」⇒ 已是同一域的两半 |
48 KB |
| 3 | dsh-decision |
decision-method + feature-first | 同一问题:要不要上抛给用户 / 怎么定方案。两者都在管「AI 自主 vs 上抛」的边界(且与非 dsh 的 agent-operating-rules §1 有交集 ⇒ 合并后须与之划界) |
61 KB |
| 4 | dsh-workflow |
change-workflow + auto-handoff-chain | 相邻但不是同一层:一个是"一次功能改造的六阶段",一个是"跨会话接力的编排机制"。⚠️ 按 §9.4 这两个更像良性撞(互补) ⇒ 合并收益存疑,列在此供你定 | 98 KB |
| 5 | dsh-local-env |
desktop-dev-shell + env-bootstrap | 都是「本机环境」:前者=把 dsh 跑起来+取证;后者=换电脑/改路径的引导与自检 | 54 KB |
| 6 | dsh-opensource-release |
保留(不并) | 独立领域(开源导出/版本迭代)+ 体量最大(112 KB)+ 有 R-O1–R-O17 硬规则实体;§10 明确「判据常驻 > 行数目标」 | 112 KB |
⚠️ 分组 1 与 5 的交叉:desktop-dev-shell 一半是"跑起来"(→ 5)、一半是"取证踩坑"(→ 1 的诊断)。⇒ 若你要最干净,它归 5、其"取证"节在 1 里只留指针。
合并后规模(12 → 6):dsh-diagnose · dsh-knowledge · dsh-decision · dsh-workflow · dsh-local-env · dsh-opensource-release。
保留不并的:dsh-opensource-release(独立域)。
三、目标形态(照 §10,⛔ 不是"并成一个巨文件")
<新技能>/
SKILL.md ← 主干:判据 + 分诊/流程骨架 + 命令骨架(目标 ≤350 行,判据实体⛔不下沉)
references/
00-<主题>.md ← 原技能的详情(长表 / 事故记录 / 实测读数 / 历史细节)
01-<主题>.md
每档头写:归属 / 本档覆盖 / 主文件指针 / 原行段。
主干末节加一张「详情档 × 覆盖的原章节 × 原行段」表(治跨档引用断头,§10 实测一次抓到 5 处)。
🔴 关键收益(正好对上用户的两个诉求):
- 好调用:12 个入口 → 6 个,
description区分度提高,挑错概率下降; - 好维护:一域一份,改一处;且每次加载的上下文更小(主干短、详情按需读)。
四、执行步骤(照 §10 的四步,纯机械搬运)
- 抢锁(
handoff-confirm --claim-exec)—— 机制层改动,⛔ 不带域锁并行。 - 备份 = 回滚点:
tmp/_skill-merge-20260928/backup/(先把三处全部现状各存一份,含那 6 个不一致版本 ⇒ 谁都不丢)。 - 先对账:6 个不一致的逐技能比对内容 ⇒ 定权威版本 ⇒ 同步三处(这一步单独验收,与合并解耦)。
- 再合并:用声明式规格脚本(复用/仿
07-scripts/split_skill.py)纯搬运:主文件只写指针与判据,详情整段搬进references/;脚本自校验「内容守恒 / 逐行包含 0 丢失 / 节可寻址 / frontmatter 唯一」。 - 三方同步 + 逐文件 md5 对账(本机 → 文档库 → 服务器 600 root:root)+
README.md/INDEX.md登记跟改(⚠️ §10 两处易漏:服务器上也有根登记副本、登记行按行首单元格匹配)。 - 收尾:原 12 个目录移入备份(⛔ 不是直接删)⇒ 观察期后再清。
验收(缺一不可):① 内容守恒(新主干+references 行数 = 原行数;逐行包含 0 丢失)② 三处 md5 一致 ③ 原每一个标题在新结构里可寻址 ④ frontmatter 唯一、version 递增 ⑤ description 探针:用历史原话做验证集,期望技能必须在命中集(§9 第 3 层)。
五、待你拍板(两件)
- 合并粒度:按上面的 6 个?还是保守一点(只并最明确的 3 组:1/2/3 ⇒ 12 → 9)?还是激进(4 也并 ⇒ 12 → 6 已含)?
- ⚠️ 我倾向 6 个,但**组 4(workflow)**我存疑:它更像 §9.4 说的良性撞,合了可能反而糊掉「一次改造」与「跨会话接力」的区别。
- 三处不一致(阻断项)怎么办:
- (A) 先对账再合并(推荐:6 个逐技能定权威 → 同步三处 → 再合并)—— 多一步,但合并基线干净;
- (B) 先合并、对账另派一棒—— 快,但合并会把不一致固化,且有丢内容风险(已举
change-workflow差 3.5 KB 的例子); - (C) 本轮只出方案,不动手—— 等你有空时再执行。
本报告本身是只读盘点的产物:⛔ 未改任何技能、⛔ 未同步、⛔ 未抢锁、⛔ 未删任何目录。
六、执行记录(2026-09-28 23:3x–23:4x · 第 1 组已完成并三方验收)
⚠️ 用户未答上述两问 ⇒ 按投递方推荐执行:先对账式取证 → 做最干净的一组 → 三方同步验收。 ⛔ 未动有分叉的两组(workflow / local-env)—— 它们必须先由人定权威版本口径。
已完成:组 1「诊断」→ 新技能 dsh-diagnose
| 项 | 结果 |
|---|---|
| 新技能 | dsh-diagnose:主干 SKILL.md(105 行,含三层分诊表 + 各层第一原则 + 详情档索引)+ references/ 3 档(00 服务器实例故障 / 01 业务插件故障 / 02 跨机状态回流) |
| 并入来源 | dsh-instance-diagnose + dsh-plugin-diagnose + dsh-distributed-state-readback(三个原名已退役) |
| 🔴 内容守恒 | 逐行包含 0 丢失(256 / 177 / 203 行正文全部搬入,机械校验) |
| 结构验收 | 起始 frontmatter 唯一 ✅ · 字段无重复 ✅ · 详情档头含「归属/覆盖/原行段/搬运方式」✅ |
| 旧目录处置 | 移入备份(⛔ 非删除):本机/文档库/服务器三处各有归档副本 |
| 三方 md5 | dsh-diagnose/SKILL.md = b8a7ec0e…(本机 = 文档库 = 服务器)✅ | 3 档 references 亦三方一致 |
| 技能计数 | 12 → 10(本机 / 文档库 / 服务器 均为 10)✅ |
| 登记跟改 | 文档库 README.md(4345164b…)+ INDEX.md(709e40c9…)两处清单均改,并同步服务器 ✅ |
| 备份/回滚点 | tmp/_skill-merge-20260928/:backup/local(12 个)· backup/docs(11 个)· archived/(本机 3 个)· archived-docs/(文档库 2 个)|服务器 /opt/dsh/backups/docs-skills-20260928-2350(984K)+ /opt/dsh/backups/removed-skills-20260928/ |
本轮顺带修掉的两处自身判据错误(值得记):
- 🔴 用
grep -c $'\r'判行尾得到 110 是假读数 —— 字节级数\r实为 0(两文件都是纯 LF)⇒ 我的替换脚本按 CRLF 切分,命中 0;幸好有断言拦下、未误改。⇒ 印证项目既有铁律:行尾一律数字节,⛔ 不用 grep 计数。 - 删除整行会让 LF 数减 1 —— 我却断言「LF 必须不变」⇒ 误报失败。正确不变量 = CR 数不变 + 行数 = 原数 − 删除数。
⛔ 本轮未做(有意,需你先定口径):
- 组 4「workflow」(
change-workflow+auto-handoff-chain)—— 🔴change-workflow是双向分叉(文档库有 R1–R11,本机只有 R1–R8 ⇒ 差 3 条红线);按「本机权威」同步会静默丢红线。 - 组 2「knowledge」/ 组 5「local-env」 —— 分别含
knowledge-upkeep(本机=子集)与env-bootstrap(双向分叉)。 - 组 3「decision」(
decision-method+feature-first)—— 两技能三方一致、无分叉 ⇒ 可直接做,本轮因篇幅未做。
下一步(可直接执行):按组 3 → 组 2 → 组 4/5(先定权威口径)顺序推进;每组都走「搬运 → 守恒校验 → 三方 md5 → 登记跟改」四步(本轮已跑通并有可复跑脚本 tmp/_merge_g1.py 可仿)。
七、执行记录(续):组 2–5 全部做完,本机 dsh-* 12 → 6(2026-09-28 23:4x–24:1x)
用户指令:「按照你的建议优化 全部执行完毕」⇒ 按 组 3 → 组 2 → 组 4/5 的顺序把剩余四组全部落地。 🔴 分叉技能一律「取超集/更新版」并写明取哪边,⛔ 不按"本机权威"盲推(那会静默丢红线)。
| 组 | 新技能 | 并入来源(均已退役) | 主干 | references |
|---|---|---|---|---|
| 1 | dsh-diagnose |
dsh-instance-diagnose + dsh-plugin-diagnose + dsh-distributed-state-readback |
104 行 | 3 档 |
| 2 | dsh-knowledge |
dsh-knowledge-upkeep + dsh-architecture-lifecycle |
76 行 | 4 档 |
| 3 | dsh-decision |
dsh-decision-method + dsh-feature-first |
72 行 | 5 档 |
| 4 | dsh-workflow |
dsh-change-workflow + dsh-auto-handoff-chain |
80 行 | 13 档 |
| 5 | dsh-local-env |
dsh-env-bootstrap + dsh-desktop-dev-shell |
75 行 | 4 档 |
| — | dsh-opensource-release |
保留原样(本域只有它一个,无同域可并) | 534 行 | 5 档 |
分叉处置(组 4 / 组 5 —— 这是本轮最关键的一步)
| 技能 | 两侧差异 | 取哪边 |
|---|---|---|
dsh-change-workflow |
文档库版是超集且更新:红线 R1–R11 + R8 已是 2026-09-21 修订措辞;本机版只有 R1–R8 且 R8 是旧措辞 | 取文档库版(若按本机版推 ⇒ 静默丢 R9–R11 三条红线) |
dsh-auto-handoff-chain |
本机版是超集(多 §3.1.3「投单 ≠ 启动」等约 60 行) | 取本机版 |
dsh-env-bootstrap |
双向分叉(标题编号与内容段落各有出入) | 取并集,重排编号 |
dsh-knowledge-upkeep |
文档库版独有「🔵 作用域 + 宿主落点对照」块 | 取并集(该块是跨宿主可用的关键) |
四步验收(全部通过)
| 验收项 | 结果 |
|---|---|
| ① 内容守恒(逐行可寻址) | 旧技能每一非空行均可在新结构寻址;终审残余 44 行逐条定性无真丢(见下) |
| ② 三方 md5(全树 40 文件) | ✅ 本机 = 文档库 = 服务器,逐文件一致(_skill_3way3.py 可复跑) |
| ③ 登记跟改 | README.md + INDEX.md:6 个新技能登记在位 | 11 个旧技能登记行为 0 | 两文件均纯 LF |
| ④ 结构体检 | 起始 frontmatter 唯一 ✅ | 字段无重复 ✅ | 全库零重复段 ✅(_dupscan.py) |
🔴 本轮抓出并修掉一个真缺陷(组 1 遗留,必须记)
- 现象:
dsh-diagnose三个详情档的「变更历史(原 frontmatter · 逐字保留)」块被重复插入 3 次;而文档库侧这三档完全没同步到该补丁(0 个块)⇒ 三方 md5 三态分裂(本机=服务器 ≠ 文档库)。 - 根因:组 1 用的
tmp/_merge_g1.py里那段 append 不幂等,被重跑过;且当时的「三方一致」复核只比了对SKILL.md一级,没比references/全树 ⇒ 没暴露。 - 修法:
_fix_dupblk.py只保留第一块(正文一字不动;校验 正文未动 ✅ / 重复段逐字同块1 ✅ / 非重复行丢失 0 ✅ / CR 0→0 ✅),再补推文档库与服务器。 - 沉淀的教训:⛔ 三方对账必须比全树,不能只比
SKILL.md—— 本次三个文件因此躲过了上一轮的验收。
终审残余 44 行的逐条定性(结论:无判据事实丢失)
| 类别 | 例 | 判定 |
|---|---|---|
| 编号/措辞变体 | ## 3. 设计红线 → ## 4.;「同名重复三类成因」→「六类」 |
变体,内容在 ✅ |
| 路径字面更新 | aliyun-dsh-server → ai1net-dsh-server;~/.workbuddy/08-skills/ → $DSH_HOME\skills\ |
更新,非丢失 ✅ |
| 被修订版取代 | 本机版 R8 旧措辞 → 09-21 修订版;「三层沉淀」补充落点表 | 取代 ✅ |
| 审计自身归一化假象 | chain_report.py 绝对路径(归一化剥掉中间目录后看着像变了) |
实为正确新路径且文件存在 ✅ |
🔎 红线专项复核:用户立过的 R8「生产变更知会」完好(红线清单第 7 条 + 详情档
02-红线详解-R5-R7-R8.md全文),本轮未丢任何一条红线。
⚠️ 发现但未改动的一处(非本次引入,需你知悉)
dsh-knowledge/references/00-知识库维护与纠偏.md与dsh-workflow/references/00-平台改造六阶段.md里各有一块 🔵 作用域 + 宿主落点对照(DSH ← WorkBuddy),写的是「2026-09-26 从 WorkBuddy 用户级技能迁入,已提升为 DSH 全局技能」,并提示读者把正文里的.workbuddy/...路径换成$DSH_HOME/...。- 取证结论:该块合并前就存在于文档库版(
backup/docs/*/SKILL.md里能查到),本次是按内容守恒原样保留,⛔ 不是合并造成的。 - 为什么值得注意:桌面宿主当前是 WorkBuddy(技能实际落在
E:\ProgramData\.workbuddy\skills\),该块的方向与现状相反;照它执行会把正确路径改成$DSH_HOME/...。 - 我没动它的理由:这是宿主口径(技能以哪端为主场)的判断,且按项目既有机制「过时结论⛔ 不改正文,只加状态块指向定稿」—— 属该机制范畴。你说一声我就加一块带日期的时效声明(增量、可回退)。
收尾
- 🔴 执行锁:已核 无全局执行锁(本次收尾前
handoff-guard.sh报「✓ 无全局锁」;为改文档库曾重新--claim-exec,收尾即--release-exec)。 - 回滚点:
tmp/_skill-merge-20260928/backup/{local,docs}(合并前全部副本)·archived//archived-docs/(旧技能)· 本次去重的原始三档在tmp/_skill-merge-20260928/dupfix-backup/。 - 可复跑脚本(留着,非一次性):
tmp/_skill_3way3.py(三方全树对账)·tmp/_audit_detail.py(守恒终审明细)·tmp/_dupscan.py(重复段体检)。