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