diff --git a/.workbuddy/memory/2026-10-14.md b/.workbuddy/memory/2026-10-14.md index 604d8e0..8866bf2 100644 --- a/.workbuddy/memory/2026-10-14.md +++ b/.workbuddy/memory/2026-10-14.md @@ -494,3 +494,59 @@ contentm_agent 旧 27092 → 29400 07:50:58 ✅ 读库正常 漏掉"重起"这一步,改名只落在磁盘上、线上还是旧名(HTTP 标题是**最硬的验收点**)。 - 🔴 **工作区侧留薄转发层的价值这轮兑现了** —— 计划任务指工作区稳定路径, 技能包真身怎么搬、怎么改名,任务都不用动。 + +--- + +## 第四件:提交前复核 ⇒ 抓出「相对路径」又漏 2 处(用户令:「检查确认修改无误 功能正常后 提交仓库」) + +**复核方法(可复用)**:不是重看自己改了什么,而是**用判据反查全包** —— +`git grep -nE '"[A-Za-z]:/|[A-Za-z]:\\\\' HEAD -- 'session-mechanism/**/*.py'`, +再**逐条判读**(注释/docstring 里的举例属禁令例外,真代码常量才算)。 + +**判读结果**:20 处命中里 18 处是注释/docstring 举例(照写正确),**2 处是真漏网**: + +① 🔴 `scripts/hooks/wb-result-hook.py` 的 `CARE_PREFIX` —— **真代码常量** + 原 `= "e:/programdata/aiproject/"`(盘符写进代码)。它是**域外过滤**的判据: + 判错的后果不是"慢",而是**把自家会话判成"域外"⇒ 不读转录**,且**从外面看毫无异常**。 + 修法:新增 `_sm_load_roots()`(`scripts/hooks/` 到包根上跳**三级**), + `CARE_PREFIX` 改从 `DSH_AIROOT` 推导;取不到 ⇒ **空串**, + 由 `classify()` **如实报错 + 打 stderr 留痕**(⛔ 不静默把全部会话判成域外)。 + +② ⚠️ `scripts/selftest.py:6875` 假样本 `"workspace": "E:/selftest"` ⇒ 改 `"__selftest_ws__"` + (与同段已改的两处同族,属"测试假数据也别带盘符"的一致性收口)。 + +**⚠️ 我中途自己踩的坑(记下来)**:第一次改 `CARE_PREFIX` 拼成 `"/" + …`(**多一个前导斜杠**), +于是 `startswith` 一条都匹配不上 ⇒ **场景①全部判成 `outside`**。 +若不复核"逐样本对账"、只看"跑通了 rc=0",这个错误会直接进库。 +⇒ 判据:**改路径拼装后必须逐样本对账输出**(本机 5 个样本 + 1 个空值),⛔ 别以 rc=0 为准。 + +**验证(三层,缺一不可)**: +- 有 `DSH_AIROOT` ⇒ 分类**逐样本与改前硬编码完全一致** + (`home` / `line` 客户端线 / `line` ai1net_ui / `other` contentm_agent / `outside`)。 +- **包不带 `env/`**(拷到别处)⇒ **如实报错 + stderr 留痕**,⛔ 不静默(真·换机场景)。 +- **清空 `DSH_AIROOT`/`WB_RESULT_HOOK_WS`/`COLLABD_PROD_CONFIG` 后用真实 payload 干跑 hook** + ⇒ **rc=0 且正常输出 JSON**(证明 `_sm_load_roots()` 从包内 `env/roots.env` 兜底成功 + —— 这正是加它的目的:**宿主不给 env 也能跑**)。 + +**顺带查清两件"看着像问题、实则是设计"的事**: +- `.gitignore:54` **明确排除** `references/manifest.md` ⇒ 它是本机生成产物(各机 md5 可能不同), + 工具 `install.py --manifest` 可重算(本轮重算 80 份 / 语法失败 0),但**不入库**(⛔ 别指望它进提交)。 +- `references/pitfalls.md:3449` 命中「项目管理界面」⇒ 那是 **P0-89 的历史取证记录**(2026-10-06 发生的事), + 按第 11 条禁令的例外**照写不改**。 +- 工作区那 78 项脏改动**与本轮无关**:49 个 `M` 是**纯行尾符**(`i/lf` ↔ `w/crlf`, + `insertions == deletions` 即内容零变化,前序遗留、`.gitattributes` 不存在); + 其余是 `automations/*/` 运行时产物与别路工作留下的未跟踪目录。 + +**入库**:技能仓提交 `7a08cd3`,推送 `fe22f4c..7a08cd3`(仅 2 文件 / +49 −3)。 +自测全量 rc=0 · **PASS 110 / FAIL 0** · 语法失败 0。 + +**沉淀(可直接复用)**: +- 🔴🔴 **"能用相对路径"这条令,一轮清不干净 —— 必须用 grep 反查全包,并逐条判读**。 + 本轮 20 处命中里混着 18 处"合法举例",**只有靠人判断才能把 2 处真漏网挑出来**; + 纯自动替换会误伤注释(把证据也改掉)。 +- 🔴 **路径拼装改完必须"逐样本对账"** —— 我这轮自己多拼了个前导 `/`, + rc=0、不报错、看着一切正常,**只有逐样本比对才照出来**。 +- 🔴 **`setdefault` 对空串不生效**(`DSH_AIROOT=""` 时不会被 `env/roots.env` 覆盖)—— + 这是**全包统一口径**(十余处同写法)⇒ 属既有设计,⛔ 不单方面改一处(会破坏单一事实源)。 +- 🔴 **宿主不给 env 也要能跑**:hook/常驻这类由宿主起的进程,`env/roots.env` 兜底是**必需项**, + 且可用"清空相关 env 后干跑"直接验证。