diff --git a/.workbuddy/memory/2026-10-14.md b/.workbuddy/memory/2026-10-14.md index 02bbfbe..d6dee6c 100644 --- a/.workbuddy/memory/2026-10-14.md +++ b/.workbuddy/memory/2026-10-14.md @@ -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。