Repository navigation
v0.15.0 — 写入兜底与失败可见化 + 自动降级改为只计量(含 0.13.0 / 0.14.0)
这一条 Release 覆盖 0.13.0 / 0.14.0 / 0.15.0 三版。 中间两版没有单独的 Release:0.13.0 未发布到 npm(版本号直接跳到 0.14.0);0.14.0 发布过,但若给它补 tag,那个 tag 指向的代码状态会含之后的复核修复,与 npm 上的包体不一致——tag 与包体不一致比缺 tag 更糟,所以不补。完整逐版说明见 CHANGELOG。
0.15.0 — 扫描器在装版环境跑不起来
check:memory(0.14.0 新增的存量体检门)用「插件自己的 blockSchema」做判据,但脚本从 dist/engine.js import 它——而那个模块在运行时 import 了 @deepseek-ai/cordis、dsh-storage-domain、dsh-storage-json,三个都是宿主提供的 peer,装版实体里没有:
Cannot find package '@deepseek-ai/cordis' imported from .../dist/engine.js
开发仓有 devDependencies,所以本地一直能跑;这个缺口是发布后在装版实体上实测才发现的。(顺带修正:脚本原来的提示写的是「先跑 npm run build」——问题不在构建,而在 peer 解析。)
修法:blockSchema 与 describeIssues 抽到 src/schema.ts——一个零 peer 依赖的模块(只依赖 zod 这个真 dependencies,以及只用 node 内置模块的 anchors.ts)。判据仍然只有一份。
验证:在真实装版环境(有 zod、没有那三个 peer)里实测——干净存量退出 0;注入坏记录退出 1 且给出 anchor.kind: Invalid option: expected one of "env"|"tool-list"|"self-version"|"path-exists"。
0.14.0 — 写入兜底与失败可见化
起因是一次真实故障:一条记忆写了 anchor.kind: "path-exists",写入当场成功,用户重启内核后该工作区 154 条 project 记忆全部不可见——数据一条没丢,丢的是可读性。故障链条是「写入放行 → 加载才炸 → 失败还被吞」,三层里任何一层立住都不会发生。
治本:ANCHOR_KINDS 成为全仓库唯一一份 anchor kind 集合,其余全部由它派生——存储 zod 此前只有 3 个 kind,正是那次故障的根因。加 path-exists 时改了两处、漏了第三处;三份副本各自维护,漏改是结构性必然。收敛前实测散在 8 处。编译期穷尽检查已验证(注入假 kind → TS2322: not assignable to type 'never')。
门一(写入端校验):新增 putBlock,11 处 table.put 全部收敛。写前跑 blockSchema.safeParse,不合格抛错并带 zod issue。
门二(打开失败可见化):projectTableFor 记录失败原因,成功的打开清掉对应项;memory_sweep 新增 coverage 字段声明数据完整性(included / absent / unreadable)。宁可显式写「未纳入」,也不要让人对着一个看起来正常但偏小的数字做判断。
门三(存量体检):新增 scripts/check-memory-files.mjs 与 npm run check:memory。只读,退出码 0/1/2。判据从 dist/schema.js import 插件自己的 schema——同源是刻意的,另写一套会漂移成「扫描器说没事、打开时炸」。
一处实测发现:存储层封装后的错误给到 domain 名 + 记录 id + 表名,但说不出字段级原因——所以门二与门三互补而非冗余:门二答「有没有坏」,门三答「坏在哪」。
0.13.0 — 自动降级改为只计量(行为变更)
demoteStale 不再撤销常驻注入,改为返回「本会被撤下」的候选清单。
理由是那个阈值(AUTO_DEMOTE_DAYS = 30)没有分布依据——它是 2026-09-15 从面板的折叠阈值 COLD_DAYS 借来的。而两者代价不对等:展示阈值折错了点一下就能展开;行为阈值一撤,0.12.0 取消自动升之后基本不会自己回来。同一个数字,两种不对等的代价。而同批的 N=2(AUTO_INJECT_HITS)已被证伪并删除,T=30 却从未被同样审过。
判据取自第三方记忆插件的写入准入阶段一:「在没有真实分布时,拍任何数字都是误杀面」——所以先只计量,等分布。
- 判据抽成纯函数
isAutoDemoteCandidate,体检与降级共用一份 - 体检报告新增
autoDemoteCandidates(含idleDays),让那个数字变得可观察
顺带
- README 与自述(
memory:self)核对:翻出五处在描述两条已被取消的自动规则,以及自述说「11 个工具」而实际注册 12 个(memory_move自 0.11.0 起就没进过清单,README 更早,只列了 7 个)。工具清单改为注册时登记(ToolRegistry只有register/get,没有列举 API),新增用例遍历它——不手抄名字。 - 测试 166 → 174。