术语更名第一步:执行会话/任务会话 ⇒ 项目会话(口径块 + 触发词表)+ 落地 9 份"说人话"新稿

一、用户令(逐字)
1. `1、A 方案`
2. `把会话技能中 执行会话(协作会话)改为 项目会话 # 用法改为输入 使用项目会话完成目标:XXXXX`

二、A 方案:只落"说人话"新稿 —— ⚠️ 实测**只能落 9 份**,7 份必须合并
· 16 份新稿(`contentm_agent` 那条目标产出)逐份比对现文件:**9 份差异只在措辞**(0~2 行)⇒ ✅ 已落地,
  逐份 md5 与稿子一致;**原件已备份**到 `待清理/技能包-说人话落地前备份-20261008/`。
· 🔴 **7 份现文件含稿子里没有的内容**(最多的少 106 行!)—— 且 `stage-delivery/SKILL.md`、
  `execution-runbook.md`、`SKILL.md` 是**今天 15:28/15:29 刚被别的会话改过** ⇒ 直接覆盖会**丢掉今天的新内容**。
  ⇒ 按「改技能包前先看别人在途改动、⛔ 别硬覆盖」的规定**没动这 7 份**,留待合并(见回复待拍板项)。

三、术语更名(先落低风险那一半,让新用法今天可用)
· `SKILL.md` 第一屏加**术语更名口径块**:**项目会话(现行)= 任务会话(旧称)= 执行会话/协作会话(更旧称)**,
  新文字一律用「项目会话」;⛔ 三个词的旧正文**按本块读**(同 10-02 那次的做法)。
· 三类会话表里那一行改为「**项目会话**(旧称任务会话/执行会话)」。
· 第 0 步触发句加 **`使用项目会话完成目标:XXXXX`**(用户口径的现行写法)。
· `skill-load-guard.py` 的词表**加**项目会话族(`使用项目会话`/`项目会话完成`/`项目会话`/`创建项目会话`/`派项目会话`),
  ⛔ **旧词一个不删**(用户与新会话都可能用旧词,收窄词表=把已授权的触发句漏掉,本项目栽过)。
  复核:`使用项目会话完成目标:XXXXX` 命中 `['使用项目会话','项目会话完成']` ✓;`用执行会话完成 X` 仍命中 ✓。
· 🔴 **机器前缀 `[执行]` 暂不变** —— 它是角色解析与看板的键(`parse_session_name`/`board.py::_role_of_title`/
  在跑的排期名),属影响面变更,**等用户拍板**。
· ⚠️ **全量更名尚未做完**:实测 **416 处 / 22 个文件**(`collabd.py` 71 / `selftest.py` 63 / `SKILL.md` 50 /
  `board.html` 46 / `pitfalls.md` 36 / `board.py` 33 …)⇒ 按机制自己的三类规矩(注释文档 / `@case` 标题 / 看板文案)逐步收尾。

四、验收
selftest.py rc=0 PASS 106 / FAIL 0;manifest 76 份、语法失败 0。
This commit is contained in:
admin committed 2026-10-08 22:10:12 +08:00
1 parent a7bf194ee7
commit 1ca0a637a6
4198 files changed
+807267 -1791

No files matched your search

+116 -15
View File
@@ -3,7 +3,7 @@
"""四段流水线**命名一致性**自检(纯静态文本比对,不需要渲染、不需要外部依赖)。
只查一件事:**四段的段名 / 子步名,在总入口、各段 SKILL.md、各段 references 之间有没有漂。**
⛔ 本脚本**不查视觉、几何、配色** —— 那些判据归 `open-design/craft/`,本脚本一概不碰。
⛔ 本脚本**不查视觉、几何、配色** —— 那些判据归③段 §供给·工艺数值判据,本脚本一概不碰。
为什么需要它(不是"为了严谨",是实测过的两次真实事故):
- 2026-10-02:段名从「需求调研/功能规划/界面与交付」改成「产品需求/产品功能/界面交互」,
@@ -46,7 +46,7 @@ STAGES = [
"slug": "stage-delivery",
"cn": "界面交互",
"h1": "# ③ 界面交互",
"subs": ["3a 视觉规范", "3b 原型", "3c GPT会诊", "3d 审查打磨"],
"subs": ["3a 视觉规范", "3b 原型", "3c GPT参考版", "3d 审查打磨"],
},
{
"slug": "stage-proto-doc",
@@ -94,6 +94,70 @@ WHITELIST = {
# ("原主干 X 已不存在"这类),一旦出现在「必读表/调用指令」位置就是悬空引用。
REMOVED_ASSETS = ["ui-page-design"]
# ⛔ 已废止的目录形态。它们若出现在正文的「产出 / 只读 / 必读」位置 ⇒ 真残留(FAIL)。
# 2026-10-08 实测:`usage-scenario.md` 的产出行、`stage-proto-doc/SKILL.md` 的输入表、
# 总入口的「只读」清单,三处还指着已废的 `strategy/` 与 `ux/`,而当时没有任何门禁会报。
# 豁免:行内出现下面任一废止标记时视为正当留痕(说明"原来叫什么、现在改成什么")。
DEAD_PATHS = {
r"strategy/30-|strategy/31-|docs/pm/[^`\s]*/strategy/":
"已废的 ①段 strategy/ 目录(现全部落 research/1a~1e)",
r"ux/state-machine|ux/diagrams|docs/pm/[^`\s]*/ux/":
"已废的 ②段 ux/ 目录(状态流转已移进 prd/2a 的功能条目)",
}
DEAD_PATH_EXEMPT = ("旧", "已废", "已改名", "曾", "历史上", "移进", "移到", "改为",
"废止", "原 ", "原标题", "历史:")
# ⛔ 单一可信源登记表(2026-10-08 立)。每条 = 一个「会变的事实」的唯一定义处。
# 判据:除定义处外,其余任何 md(不含 `归档/`、`_留痕/`、`assets/`、`_superseded*`)
# 里出现该模式 ⇒ FAIL。`authority: None` 表示全包禁写(该措辞本身就不该再出现)。
# 为什么需要它:复述才是漂移的根因 —— 实测一个设定被复述约 40 处,
# 改一次动三份文件 17 处仍漏 13 处口径(2026-10-08 用户:「是不是 本身就是问题」)。
# ⚠️ 加新条目前先确认「这个事实真的会变」;不会变的(如历史沿革、用户原话留痕)别往里塞。
AUTHORITY = [
{"fact": "②③边界(②段管什么 / ③段管什么)",
"authority": "references/stage-requirements/SKILL.md",
"pattern": r"归②段([^)]*)\s*\|\s*归(?:③段|本段)(",
"why": "两侧对照表只许在②段 SKILL.md 的 §②—③ 交接口 定义一次"},
{"fact": "停线规则(哪几种情况停)",
"authority": None,
"pattern": r"只有[三四]种情况停",
"why": "⛔ 全包禁写 —— 口径只在本包 SKILL.md 的「执行规则」,各段一律引用"},
{"fact": "可选档骨架名单(营销页向那 8 个)",
"authority": "references/stage-delivery/references/layouts-tooling.md",
"pattern": r"hero\s*/\s*features|hero/features",
"why": "骨架名单与「为什么工具型不能套」只许在 layouts-tooling.md 开头写一次"},
{"fact": "说人话门槛数值",
"authority": "SKILL.md",
"pattern": r"45\s*/\s*50",
"why": "门槛只许在本包 SKILL.md 的「执行规则」内容准则条 定义一次"},
{"fact": "对比度门槛数值",
"authority": "references/stage-delivery/references/execution-runbook.md",
"pattern": r"4\.5:1",
"why": "数值只许登记在 runbook 的数值判据段"},
{"fact": "设计契约字段的展开清单",
"authority": "references/stage-delivery/references/execution-runbook.md",
"pattern": r"重复项的信息量(",
"why": "十二字段的逐条展开只许在 runbook §2.1"},
{"fact": "②—③ 定案用户原话",
"authority": "references/stage-requirements/SKILL.md",
"pattern": r"一会一个样子",
"why": "用户原话只许在②段 §②—③ 交接口 出现一次(可追溯性由那一处承担)"},
{"fact": "1b 两体例的定案用户原话",
"authority": "references/stage-discovery/references/competitor-analysis.md",
"pattern": r"有独立分析也有汇总分析",
"why": "只许在 1b 方法论里写一次,其余引 §0.4"},
{"fact": "grill-me 的 A / B 节火力点",
"authority": "references/stage-discovery/references/grill-me.md",
"pattern": r"做成什么样、哪些情况不成立、状态怎么流转",
"why": "火力点定义只许在 grill-me.md"},
{"fact": "选定套的组件文件名(默认档与可选档不同名)",
"authority": "references/stage-delivery/references/execution-runbook.md",
"pattern": r"\+\s*`?components\.html`?",
"why": "⛔ 照可选档(153 套)的命名去找默认档的文件会扑空 —— 默认档那套没有 components.html。"
"2026-10-08 实测:D1 步骤照这个名字找 ⇒ 版式结构与组件族整层漏掉 ⇒ 「用了它的样式、没有它的排版」。"
"只许在 runbook §2.2「D1 读什么」里作为反面留痕出现"},
]
# ⛔ 2026-10-02 用户定案**永久删除**的产出与方法论(防被加回来)
# 判据:命中位置若落在「已删除的产出」留痕块 / 废止说明里 → 正常,只报 HINT。
DEAD_OUTPUTS = {
@@ -218,17 +282,36 @@ def check_root(root, label):
f"[{label}] runbook 必读表数据行未引用已移除资产 `{asset}`",
";".join(bad) if bad else "")
# 4) 提示级:旧名出现在哪(供人工判上下文,不计入 FAIL)
for dp, dn, fn in os.walk(root):
dn[:] = [d for d in dn if d != "__pycache__"]
for f in fn:
if not f.endswith(".md"):
continue
p = os.path.join(dp, f)
t = read(p)
if not t:
continue
# 4b)永久删除项:命中若落在「已删除的产出」留痕/ 废止说明里 → 只报 HINT
# 5) 单一可信源:会变的事实只许在定义处出现,别处出现即复述(复述必然漂)
for spec in AUTHORITY:
auth = (os.path.normpath(os.path.join(root, spec["authority"]))
if spec["authority"] else None)
bad = []
for dp, dn, fn in os.walk(root):
dn[:] = [d for d in dn
if d not in ("__pycache__", "_留痕", "归档", "assets")]
for f in fn:
if not f.endswith(".md") or f.startswith("_superseded"):
continue
p = os.path.join(dp, f)
if auth and os.path.normpath(p) == auth:
continue
tt = read(p)
if not tt:
continue
for i, l in enumerate(tt.split("\n"), 1):
if re.search(spec["pattern"], l) and not any(
w in l for w in ("已于", "历史", "废止", "留痕")):
bad.append(f"{os.path.relpath(p, root).replace(chr(92), '/')}#{i}")
add("FAIL" if bad else "PASS",
f"[{label}] 单一可信源:{spec['fact']}",
(f"⛔ 复述出现在 {';'.join(bad[:6])} —— {spec['why']}" if bad else ""))
# 4) 提示级:旧名 / 已删项出现在哪(供人工判上下文,不计入 FAIL)
# ⚠️ 2026-10-08 修 bug:原实现先跑了一个空循环(只把文件名读进 `t`、什么都不做),
# 紧接着的 DEPRECATED 判断又误用了那个上一轮残留的 `t`(该用本轮读到的 `tt`)
# ⇒ 旧名提示恒不触发,`strategy/30-产品策略.md` 这类真残留被静默放过(假绿)。
# 现合并成一个循环,一律用本轮读到的 `tt`。
for dp, dn, fn in os.walk(root):
dn[:] = [d for d in dn if d != "__pycache__"]
for f in fn:
@@ -245,11 +328,29 @@ def check_root(root, label):
f"{why}|行 {lines[:5]} —— 确认是否落在废止说明/留痕里(正当)")
for old in DEPRECATED:
if old in t:
lines = [i for i, l in enumerate(t.split("\n"), 1) if old in l]
if old in tt:
lines = [i for i, l in enumerate(tt.split("\n"), 1) if old in l]
add("HINT", f"[{label}] {os.path.relpath(p, root)} 出现旧名 `{old}`",
f"行 {lines[:6]} —— 确认是否落在「废止理由块」内(正当)还是真残留")
# 4c) 旧产物路径残留:已废目录形态出现在正文里就是真残留(告示/留痕里的除外)
# ⛔ 不要指望 DEPRECATED 的 HINT —— 它只提示不拦;路径错会让下游整段读空文件。
for dp, dn, fn in os.walk(root):
dn[:] = [d for d in dn if d not in ("__pycache__", "_留痕")]
for f in fn:
if not f.endswith(".md"):
continue
p = os.path.join(dp, f)
tt = read(p)
if not tt:
continue
for pat, why in DEAD_PATHS.items():
hits = [(i, l.strip()[:80]) for i, l in enumerate(tt.split("\n"), 1)
if re.search(pat, l) and not any(w in l for w in DEAD_PATH_EXEMPT)]
add("FAIL" if hits else "PASS",
f"[{label}] {os.path.relpath(p, root)} 无悬空旧路径 `{why}`",
";".join(f"行{i}: {l}" for i, l in hits[:4]) if hits else "")
def check_whitelist(ws, label):
"""①②段产出白名单:`docs/pm/<项目>/<dir>/` 里出现白名单外的 .md ⇒ FAIL。