session-mechanism:按 21 条总表自审 05/06,修掉 7 处自身违规

用 06 自己的判据过了一遍 06 与 05,查出并修掉:
- ㉑ 一页纸:06 原文 134 行 > 120 ⇒ 压到 113 行(合并重复段、删重复触发词)
- ⑥ 单一真源:05 的 ⑤~⑨ 与 06 的 A②③④⑤/B⑨ 逐字重复 ⇒ 05 改采读数,判据指回 06
- ⑥ 单一真源:总表 A/B/D 的判据列与正文 12 项重复 ⇒ 改成锚点(判据正本在正文)
- ⑧ 命名一致:正文「工程/结构/表述层」vs 总表「A/B/C/D 层」⇒ 统一成 A/B/D,并写明 C 层来路
- ⑨ 不自相矛盾:入口段与「一句话调用」各列一份触发词 ⇒ 合并到入口一处
- ⑦ 注入面同源:SKILL.md 写「技能太长」、06 写「技能太长了」⇒ 统一
- ④ 路径形态:05 引 06 缺 references/ 前缀;06 引 selftest.py 缺 scripts/ 前缀;跨根路径改正斜杠

新增自测 t_skill_entry_triggers_same_source(10 项):SKILL.md §0 ⑧⑨ 的触发词与
05/06 文首集合相等,且 01-文档索引.md 里列的词 ⊆ 真源。
已做变异对照(SKILL.md 改一个字/索引里塞一个真源没有的词 ⇒ 报红;复原 ⇒ 绿)。
This commit is contained in:
admin committed 2026-10-15 23:33:44 +08:00
1 parent d8be643ec7
commit 5c5272569f
4 files changed
+155 -84

No files matched your search

+86
View File
@@ -7795,5 +7795,91 @@ def t_reply_core_same_source():
return rows
@case("🔴 技能入口触发词:SKILL.md §0 与 05/06 文首必须同源(⛔ 差一个字=用户按原话喊不到)")
def t_skill_entry_triggers_same_source():
"""🔴 2026-10-15 立(本轮自审 `06` 时实测踩到)。
判据来源:`references/06-技能优化规程.md` 的 **B⑦ 注入面与真源同源**。
`SKILL.md` §0 的第 ⑧/⑨ 项是**匹配面**(用户按原话喊,靠这里的词命中),
`05 / 06` 文首的「什么时候用」是**真源**。
实测:`SKILL.md` 写「技能太长」、`06` 写「技能太长了」—— 差一个字,两边都不报错,
用户按「技能太长」喊时命中与否全靠运气。
⇒ 判据落在**两个集合相等**(⛔ 不是"包含"):少一个词或多一个词都报红。
"""
import re as _re
def _trigs(text):
"""抓 `「**词**」` 与 `「词」` **两种形态** ——
🔴 `01-文档索引.md` 的索引行是**不加粗**的,只认加粗会抓成空集 ⇒ 判据恒绿(2026-10-15 实测踩到)。"""
out = set(_re.findall(r"「\*\*(.+?)\*\*」", text))
out |= set(_re.findall(r"「([^「」*]+?)」", text))
return {s.strip() for s in out if s.strip()}
def _entry_block(md, start_mark):
"""从 `start_mark` 起,取到 `**一句话判据**` 或 `📌` 之前的正文。"""
i = md.find(start_mark)
if i < 0:
return ""
j = len(md)
for stop in ("**一句话判据**", "📌"):
k = md.find(stop, i)
if 0 <= k < j:
j = k
return md[i:j]
try:
skill = (HERE.parent / "SKILL.md").read_text(encoding="utf-8", errors="replace")
p05 = (HERE.parent / "references" / "05-技能库盘点规程.md").read_text(
encoding="utf-8", errors="replace")
p06 = (HERE.parent / "references" / "06-技能优化规程.md").read_text(
encoding="utf-8", errors="replace")
except Exception as exc:
return [("读到 SKILL.md/05/06:%r" % exc, False)]
rows = []
for tag, skill_mark, doc, doc_name in (
("⑧", "**⑧ 我要盘点技能库**", p05, "05-技能库盘点规程.md"),
("⑨", "**⑨ 我要优化技能本身**", p06, "06-技能优化规程.md"),
):
i = skill.find(skill_mark)
# 🔴 只取**触发词那一段**(`(用户说…任一句即触发)`),⛔ 不取整块 ——
# ⑧/⑨ 的条目正文里还会出现别的「**…**」(如"这份读数能说明什么"),
# 取整块会把它们当成触发词,报出一个假红(2026-10-15 实测)。
k = skill.find("(用户说", i)
m = skill.find("任一句即触发", k)
block = skill[k:m] if i >= 0 and 0 <= k < m else ""
a, b = _trigs(block), _trigs(_entry_block(doc, "**什么时候用**"))
rows.append(("§0 第 %s 项读得到触发词(%d 个)" % (tag, len(a)), len(a) >= 4))
rows.append(("%s 文首读得到触发词(%d 个)" % (doc_name, len(b)), len(b) >= 4))
only_a, only_b = sorted(a - b), sorted(b - a)
rows.append(("§0 第 %s 项 与 %s **触发词集合相等**%s"
% (tag, doc_name,
"" if not (only_a or only_b) else
"(⛔ 只在 §0:%s;⛔ 只在 %s:%s)" % (only_a, doc_name, only_b)),
not only_a and not only_b))
# 同一批词还有**第三处**:`references/01-文档索引.md` 的索引行。
# 🔴 它是"代表词"视图 ⇒ 判据是**包含**(索引里列的每个词都得在真源里),⛔ 不是相等。
# (⛔ 索引里冒出一个真源没有的词 ⇒ 用户照着索引喊也喊不到。)
try:
idx = (HERE.parent / "references" / "01-文档索引.md").read_text(
encoding="utf-8", errors="replace")
except Exception as exc:
return rows + [("读到 references/01-文档索引.md:%r" % exc, False)]
for doc_name, doc in (("05-技能库盘点规程.md", p05), ("06-技能优化规程.md", p06)):
line = next((ln for ln in idx.splitlines() if doc_name in ln), "")
rows.append(("索引里有 %s 那一行" % doc_name, bool(line.strip())))
if not line.strip():
continue
a, b = _trigs(line), _trigs(_entry_block(doc, "**什么时候用**"))
extra = sorted(a - b)
rows.append(("索引里列的触发词都在 %s 真源里%s"
% (doc_name, "" if not extra else "(⛔ 真源没有:%s)" % extra),
not extra))
return rows
if __name__ == "__main__":
sys.exit(main())