From 24a644f57b4bee0b8a4a06bee85a1fbc192526de Mon Sep 17 00:00:00 2001 From: maogeigei Date: Fri, 16 Oct 2026 00:00:44 +0800 Subject: [PATCH] =?UTF-8?q?session-mechanism=EF=BC=9A=E5=A4=9A=E8=A7=92?= =?UTF-8?q?=E5=BA=A6=E8=87=AA=E6=A3=80=E5=90=8E=E7=9A=84=205=20=E5=A4=84?= =?UTF-8?q?=E4=BF=AE=E8=A1=A5=20=EF=BC=8B=20=E6=96=B0=E5=A2=9E=E3=80=8C21?= =?UTF-8?q?=20=E6=9D=A1=E6=9D=A1=E7=9B=AE=E5=90=8D=E4=B8=89=E6=96=B9?= =?UTF-8?q?=E5=90=8C=E6=BA=90=E3=80=8D=E8=87=AA=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 按用户令「优化完成后 在详细多角度 检查确认无误」,对 05/06/SKILL.md/索引 做了一轮多角度核对。 查出的真问题(都已修): - 05 残留旧编号「06 的 B⑨/B⑥」⇒ 06 的编号已统一成 #N,改为 #9/#6 - 06 总表 #15 写「上游→下游不断裂」,而正文与 SKILL.md 都写「上下游不断裂」⇒ 统一 - 05 用了旧称「宿主库」(该文件 10-15 新写,按术语规范应当用正式名)⇒ 改「WorkBuddy 本体的库」 - 06 的 A 段声明「不复述判据」,但 #3 条又把 env/roots.env 的细节抄了一遍 ⇒ 删复述 - SKILL.md §0 ⑨ 的 A 段没编号、C 层写简写(「职责不越界」vs 正文「步骤间职责不越界」)⇒ 补 #1~#5、统一 C 层全名 新增自测 t_skill06_entries_same_source(5 项):SKILL.md §0 ⑨ 与 06 正文/总表 21 条逐条同名(数字 + 名字)。 该判据第一版自己就有两个毛病,靠变异对照照出来:① 抓取正则在「(」处不停 ⇒ 名字带括号内容;② 06 正文 A 段是 列表项、SKILL.md 却没编号 ⇒ 两边都只抓到 16 条。修完口径后三态齐全(基线绿/写简写则红并精确报出 #13/复原绿)。 验收:全量自测 PASS 113 / FAIL 0;体检 fail 0 / warn 1 / ok 15;manifest 82 份;install.py --verify 全绿; 05 = 95 行、06 = 120 行(均在一页纸内)。 --- session-mechanism/SKILL.md | 4 +- .../references/05-技能库盘点规程.md | 4 +- .../references/06-技能优化规程.md | 4 +- session-mechanism/scripts/selftest.py | 42 +++++++++++++++++++ 4 files changed, 48 insertions(+), 6 deletions(-) diff --git a/session-mechanism/SKILL.md b/session-mechanism/SKILL.md index b6242e0..fe7e570 100644 --- a/session-mechanism/SKILL.md +++ b/session-mechanism/SKILL.md @@ -476,10 +476,10 @@ python .workbuddy/collab/collabd.py --set-life 进行中 --by "主会话" **⑨ 我要优化技能本身**(用户说「**优化技能**」「**技能怎么改更好**」「**梳理技能**」「**梳理一下技能的要求和描述**」「**技能太长**」「**这条规则写在哪**」「**这个技能能不能拷到别的机器用**」——任一句即触发)⇒ 读 **`references/06-技能优化规程.md`**(2026-10-15 立)。  **一句话判据**:**写技能时,假设读者是"另一台机器上的另一个会话"** —— 拿它回放一遍,毛病自己浮出来。  **三层,按 B → C → D 这个顺序做**(层名与文末总表对齐;**环境配置 A 层另属一份规范,只给指针**): - · **A 技能环境配置**(换机器能不能活)—— 配置外置 / 不写死本机 / 本机生成契约不入库 / 路径形态统一 / 入仓按白名单。 + · **A 技能环境配置**(换机器能不能活)—— #1 配置外置 / #2 不写死本机 / #3 本机生成契约不入库 / #4 路径形态统一 / #5 入仓按白名单。   🔴 判据正本=`SKILL.md §0` 的「包内目录怎么分」+「路径一律用相对」+ 十一条禁令第 11 条 + 仓根 `.gitignore`;06 里**不复述**。  · **B 结构层**(结构清晰·重点突出·无冲突·边界清晰)—— #6 单一真源 #7 注入面与真源同源(🔴 每轮注入的面**改文字必须量长度**)#8 命名一致 #9 正文不自相矛盾。 - · **C 流程层**(流程顺畅·功能正常)—— #10 步骤顺序 #11 编号连续 #12 无跳步 #13 职责不越界 #14 字段归属 #15 上下游不断裂 #16 引用路径 #17 字段不缺失 #18 产物链完整(**P0**)。 + · **C 流程层**(流程顺畅·功能正常)—— #10 步骤顺序正确 #11 编号连续 #12 无跳步 #13 步骤间职责不越界 #14 字段归属正确 #15 上下游不断裂 #16 引用路径正确 #17 字段不缺失 #18 产物链完整(**P0**)。  · **D 表述层**(简洁·高效·实用·无歧义)—— #19 肯定表述(正本 ⇒ `references/rules.md §9`)#20 说人话 #21 一页纸。  🔴 **优先级**:B 结构 > C 流程 > D 表述 —— 前两层出毛病**机制失效或断链**,表述只是**效果差**。  🔴 **目标(用户 2026-10-15 原话)**:让技能描述**结构清晰·重点突出·简洁·高效·实用·无歧义·流程顺畅·功能正常·规则边界清晰·无冲突**。 diff --git a/session-mechanism/references/05-技能库盘点规程.md b/session-mechanism/references/05-技能库盘点规程.md index 6c33f82..5ce8a02 100644 --- a/session-mechanism/references/05-技能库盘点规程.md +++ b/session-mechanism/references/05-技能库盘点规程.md @@ -25,7 +25,7 @@ ⛔ 别只列"看起来像技能"的 —— 散件正是"乱"的来源。 **② 判"在用 / 没用"** -判据=**实际被加载过几次**,数据来自会话转录(宿主库**没有**技能使用记录表)。 +判据=**实际被加载过几次**,数据来自会话转录(**WorkBuddy 本体的库**里**没有**技能使用记录表)。 - 扫 `<配置根>/projects/**/*.jsonl`;指纹用**逐个技能名精确匹配**(注意转义形态)。 - 🔴 **先跑自证样本**(见上);再出读数。 - 分档给出:在用 / 从未加载且装得早 / 从未加载但装得晚(证据不足)。 @@ -66,7 +66,7 @@ **⑨ 正文有没有自相矛盾** 读数:同一概念在各篇出现的位置与写法,成对列出。 -🔴 判据 ⇒ 06 的 **B⑨**;同一件事散在多处的,收敛口径见 06 的 **B⑥**。 +🔴 判据 ⇒ 06 的 **#9**;同一件事散在多处的,收敛口径见 06 的 **#6**。 **⑩ 有没有多份副本** 同一技能存在 ≥2 份 ⇒ 定"唯一形态",其余归档(留取回路径,⛔ 不直删)。 diff --git a/session-mechanism/references/06-技能优化规程.md b/session-mechanism/references/06-技能优化规程.md index 87b399b..802cc1a 100644 --- a/session-mechanism/references/06-技能优化规程.md +++ b/session-mechanism/references/06-技能优化规程.md @@ -28,7 +28,7 @@ - **1 配置外置** ⇒ `SKILL.md §0`「包内目录怎么分」(用户 2026-10-11 令:「脚本是脚本 配置是配置」) - **2 不写死本机** ⇒ `SKILL.md §0`「路径一律用相对」+ 十一条禁令第 11 条(2026-10-14 用户令) -- **3 本机生成契约不入库** ⇒ 同「包内目录怎么分」(`env/roots.env` 本机生成、不入库;入仓的只有 `*.example`) +- **3 本机生成契约不入库** ⇒ 同「包内目录怎么分」 - **4 路径形态统一** ⇒ `SKILL.md §0`「例外只有一类:跨根引用」 - **5 入仓按白名单** ⇒ 仓根 `.gitignore` 的注释块(用户 2026-10-09 令) @@ -111,7 +111,7 @@ | 12 | C 流程 | 无跳步 | 见 §C #12 | 产物链 5→6→7 跳了一步 | | 13 | C 流程 | 步骤间职责不越界 | 见 §C #13 | 后一棒把前一棒的场次表+情绪卡全塞进去 | | 14 | C 流程 | 字段归属正确 | 见 §C #14 | 情绪设计卡标成后一棒,实际是前一棒 | -| 15 | C 流程 | 上游→下游不断裂 | 见 §C #15 | 「目标体感」字段后两棒都没引用 | +| 15 | C 流程 | 上下游不断裂 | 见 §C #15 | 「目标体感」字段后两棒都没引用 | | 16 | C 流程 | 引用路径正确 | 见 §C #16 | 素材库误走直接路径,应走知识库间接引用 | | 17 | C 流程 | 字段不缺失 | 见 §C #17 | 某步输入缺「框架方案」 | | 18 | C 流程 | 产物链完整 | 见 §C #18(**P0**) | 只在对话里输出、没落盘 | diff --git a/session-mechanism/scripts/selftest.py b/session-mechanism/scripts/selftest.py index 07598e9..e302a30 100644 --- a/session-mechanism/scripts/selftest.py +++ b/session-mechanism/scripts/selftest.py @@ -7920,5 +7920,47 @@ def t_term_table_single_source(): return rows +@case("🔴 06 的 21 条条目名:SKILL.md §0 ⑨ 与 06 正文/总表三方逐条同名(⛔ 写成简写=对不上)") +def t_skill06_entries_same_source(): + """🔴 2026-10-15 立(当日实测踩到)。 + + `SKILL.md §0 ⑨` 是**匹配面**(点开技能就读到),`06` 正文与总表是**真源**。 + 实测:§0 把 C 层写成简写「职责不越界」,而正文是「步骤间职责不越界」—— + 两边都不报错,读者按简写去正文里搜就搜不到。 + ⇒ 判据落在**21 条逐条同名**上(数字 + 名字都要对上)。 + """ + import re as _re + SK = (HERE.parent / "SKILL.md").read_text(encoding="utf-8", errors="replace") + P6 = (HERE.parent / "references" / "06-技能优化规程.md").read_text( + encoding="utf-8", errors="replace") + + i = SK.find("**⑨ 我要优化技能本身**") + j = SK.find("\n\n", i) if i >= 0 else -1 + blk = SK[i:j] if i >= 0 and j > i else "" + a = {int(n): nm for n, nm in _re.findall(r"#(\d{1,2}) ([^(\s]+)", blk)} + b = {int(n): nm for n, nm in _re.findall(r"^(?:- )?\*\*(\d{1,2}) ([^(\s]+)\*\*", P6, _re.M)} + c = {int(n): nm for n, nm in _re.findall( + r"^\| (\d{1,2}) \| [A-D] [^|]*\| ([^|\s]+) \|", P6, _re.M)} + + # 🔴 句末标点不算差异(§0 是句子、正文是标题、「配置外置 /」后面跟分隔符)—— + # 2026-10-15 实测:不清洗时 #5 会因「入仓按白名单。」多一个句号而报红,那是**假红**。 + def _clean(d): + return {k: _re.sub(r"[。.,,、;;//]+$", "", v) for k, v in d.items()} + + a, b, c = _clean(a), _clean(b), _clean(c) + + rows = [("§0 ⑨ 读到条目名 %d 条(应 21)" % len(a), len(a) == 21), + ("06 正文读到条目名 %d 条(应 21)" % len(b), len(b) == 21), + ("06 总表读到条目名 %d 条(应 21)" % len(c), len(c) == 21)] + for tag, other in (("06 正文", b), ("06 总表", c)): + bad = sorted(k for k in set(a) | set(other) if a.get(k) != other.get(k)) + detail = "" + if bad: + k0 = bad[0] + detail = "(⛔ 首处不一致 #%d:§0=%r/%s=%r)" % (k0, a.get(k0), tag, other.get(k0)) + rows.append(("§0 ⑨ 与 %s **21 条逐条同名**%s" % (tag, detail), not bad)) + return rows + + if __name__ == "__main__": sys.exit(main()) \ No newline at end of file