记忆:补记「技能根绝对路径清零」

用户令:「SKILL.md:189 判据源写 E:/ProgramData/.workbuddy/skills/
严格禁止技能中写这里绝对路径(除非跨根目录因引用),跨环境全部报错」

判据:技能根(本包自己 + 同根技能)一律不写绝对路径;
跨根引用(工作区根 / 文档库根 / 本机安装位 / 宿主数据目录)才落到具体位置。

技能仓提交 2f65609(10 文件 · 19 增 18 删),已推送。
另 15 处在 dsh-knowledge / dsh-workflow,两包被 .gitignore 全挡且无自己的 .git ⇒ 改动不入仓。

本轮最大教训:Grep 工具(ripgrep)跳过被 ignore 的文件,第一遍扫描结论是错的;
改用 grep -r 才照出漏网的 15 处。核实"清干净没有"一律用 grep -r。
This commit is contained in:
admin committed 2026-10-14 21:11:33 +08:00
1 parent a83c0c0029
commit c1707b7c97
1 file changed
+52
+52
View File
@@ -591,3 +591,55 @@ contentm_agent 旧 27092 → 29400 07:50:58 ✅ 读库正常
判据=**`git check-ignore` 有没有命中** —— 命中的是运行时产物,没命中的是**该由人决定去留**的。
- 🔴 **删前必查"它是不是活区"** —— 本轮 `supervise-inbox/`(每分钟在写)与 `supervise-bg.log`(追加中)
都长得像"一堆老文件",实则是机制正在用的。判据=看 mtime 有没有近期变动。
---
## 第六件:技能根绝对路径清零(用户令)
**用户原话**:「SKILL.md:189 判据源写 E:/ProgramData/.workbuddy/skills/ 严格禁止技能中写这里绝对路径(除非跨根目录因引用),跨环境全部报错」
**定位过程(⚠️ 记下,因为绕了弯)**:用户只给了「SKILL.md:189」,
但**本包(session-mechanism)的 189 行不是这个内容**(是「机制新建会话用哪个模型」)。
⇒ 逐个技能包扫「各 SKILL.md 的第 189 行」,在 **`product-planning/SKILL.md:189`** 命中:
「**判据来源**(单一可信源…):`humanizer`…、`humanizer-zh`…。**两份技能都在 `E:/ProgramData/.workbuddy/skills/`**」
—— 「判据源」正是用户说的那三个字。**教训:用户给的行号 + 关键词同时指认时,先按关键词全仓找,别只认行号。**
**判据(用户给的两分法,全仓统一)**:
- **技能根**(本包自己 + 同根技能)⇒ **一律不写绝对路径**,写 `<技能根>/<技能名>/`;
- **跨根引用**(工作区根 / 文档库根 / 本机软件安装位 / 宿主数据目录)⇒ 才落到具体位置,优先读环境变量。
**🔴 这条推翻了昨天的口径**:session-mechanism `SKILL.md` 原写「⚠️ 文档/注释里的绝对路径**不在此列**(举例、历史取证照写 —— 那是证据)」
⇒ 用户新令把例外**收窄到只剩「跨根引用」**,文档/注释/留痕里的**技能根**路径同样不许写。已改写该条。
**改了什么(进仓 10 文件 · 19 增 18 删 · 提交 `2f65609`,推送 `7a08cd3..2f65609`)**:
- `product-planning`:`SKILL.md`(判据来源 / video-capture 位置 / 本技能位置 + **新增「路径写相对或占位」规则**)、
`references/_留痕/SKILL-总入口-20261007改说人话前.md`、`stage-delivery/assets/video-capture/SKILL.md`、
`scripts/check_naming.py`(注释)
- `session-mechanism`:`SKILL.md`(反例改占位 + 例外条款改写)、`references/deploy.md`(安装目录)、
`scripts/session-rules-check.py`(docstring)、`boards/会话看板/board-launch.py.tpl`(模板占位符)
- `video-capture/ATTRIBUTION.md`、仓根 `改包纪律.md`(3 条 `cd` 命令)
**另外改了但⛔ 不入仓的(15 处)**:`dsh-knowledge`(5+1+1)、`dsh-workflow`(5+1+2)
—— 🔴 **这两个包被 `.gitignore:9` 的 `/*` 全挡,且没有自己的 `.git`** ⇒ 改动只落在本机,不进任何仓。
**🔴🔴 本轮最大的坑(必记)**:**`Grep` 工具(ripgrep)默认跳过被 `.gitignore` 排除的文件** ——
我第一遍用它扫「技能根路径」,报「No matches / 已清零」,**结论是错的**;
改用 `grep -rn … --exclude-dir=.venv` 重扫,才照出 `dsh-knowledge` / `dsh-workflow` 里那 15 处。
⇒ **判据:核实"某形态在技能包里清干净没有",一律用 `grep -r`,⛔ 别用会尊重 ignore 的搜索器**
(被 ignore 的文件恰恰是"不在仓里、最容易失控"的那批)。
**验收**:
- `product-planning` 命名闸门:**通过 2060 / 失败 0**
- `session-mechanism` 全量自测:**PASS 110 / FAIL 0**(确认没有判据锚定我改写的那句例外条款)
- 全仓 `grep -r` 反查:清零。剩余两处均属正当例外 ——
`session-mechanism/install.log`(运行时产物,`.gitignore:32` 已 ignore)、
`browser-harness/.venv/**/direct_url.json`(pip editable 安装元数据,改了会破坏 pip 认知)。
- ⚠️ 编辑器把 3 个文件写成了 CRLF ⇒ 已转回 LF(**3 个文件各 260~440 处 CRLF,说明它们原本就是整文件 CRLF**,
但 diff 未受污染 —— `.gitattributes` 的 `text eol=lf` 在比较时做了规范化,diff 仍只有我改的那几行)。
**沉淀(可复用)**:
- 🔴 **"不写死路径"这条令,落地要分两个根**:**自己的根**(可推导 ⇒ 禁止写)与**别人的根**(推不出来 ⇒ 允许外置引用)。
判据一句话:**这个根能不能从「我自己的位置」推出来**。
- 🔴 **清一类坏形态,必须先"全量反查"再动手** —— 且反查工具的**过滤行为**本身就是变量(见上面 ripgrep 那条)。
- 🔴 **改完规则文件要跑全量自测**:本轮改写了 SKILL.md 的例外条款,若某判据锚定那句就会恒红
(同族坑今天已栽过两次)—— 实测未被锚定,全量 PASS 110。