{ "note": "对外讲过的硬话,一条一行,附凭证。status=measured 必须有仓库里能跑的检查或产物;not-run / readme-only 一律不许带凭证——把「没跑」写进机器可读字段,而不是在 README 里含糊过去(做法来自 dsh-akn-plugin 的 aen-mvp-0.1.json:41)。规则由 tests/claims.test.ts 强制,喂进去的合成数据就是它的正反对照。", "statuses": { "measured": "仓库里有能复跑的检查或产物", "not-run": "打算做/该做,但还没做,也没有数字", "readme-only": "对外讲过,但仓库里没有可复跑的凭证(如实登记;这不是合格状态)", "design": "设计决定,凭证是写这份设计的文档" }, "claims": [ { "id": "digest.hint-line-bytes", "claim": "那行经验提示每轮固定出现,占 204 字节", "status": "measured", "evidence": ["tests/docs.test.ts"], "note": "字节数被测试逐字钉住;改文案要同时改测试,否则这一套变红。" }, { "id": "digest.line-ceiling", "claim": "常驻摘要最多 10 条:常驻规矩 3 条 + 核心层 2 条 + 查询层 5 条", "status": "measured", "evidence": ["tests/docs.test.ts", "tests/standing.test.ts"], "note": "README 里写的是同一个算式 3+2+5=10,测试比对的是配置里的真实上限(三段的条数上限相加)。" }, { "id": "identity.scoped-name", "claim": "包名带 scope 且未发布到 npm:按包名安装不会落到同名的第三方插件上", "status": "measured", "evidence": ["package.json", "tests/built.mjs"], "note": "npm 上确有同名包属于别人(github.com/lzpgood123/dsh-experience-memory),而桌面版按**包名**解析依赖——按名字装就会装到那一家(缺数据库二进制、崩、进安全模式,2026-09-23 真实发生)。scope 抢不走,且 private:true 不发 npm,所以按名字装只会明确报「没有这个包」。tests/built.mjs 钉住 name 带 scope、private 为 true、且 bundle patch 里的 specifier 与 manifest 一致。" }, { "id": "standing.carried-every-turn", "claim": "标了 standing 的规矩每轮都进上下文,不看这一轮在聊什么;同一条记录不标就不进", "status": "measured", "evidence": ["tests/standing.test.ts", "src/digest.ts"], "note": "同一个库、同一个与规矩毫无共同词的查询,只差一个布尔值:标了出现、没标整份摘要为空(正反对照)。跳过的只有查询闸门——证据等级与 resident 分数线照旧,inferred 标了也进不去。" }, { "id": "standing.model-follows-it", "claim": "真模型回合里,标了常驻的规矩会被照做:6/6,而空库/不标常驻/无关常驻三臂合计 0/18(Fisher 双侧 p = 0.000007)", "status": "measured", "evidence": ["tools/standing-ab/README.md", "tools/standing-ab/results.jsonl", "tools/standing-ab/stats.mjs"], "note": "24 个隔离真回合(deepseek-official/deepseek-flash),任务与规矩毫无共同词,判定只看产物文件第一行。只测了一条规矩、一个任务;会话日志读不到注入内容,所以『送达』是行为对照推出来的,不是直接读出来的。" }, { "id": "runtime.zero-third-party-deps", "claim": "运行时零第三方依赖,只用 Node 内置能力", "status": "measured", "evidence": ["package.json", "tests/claims.test.ts"], "note": "本清单的测试直接读 package.json:声明了 dependencies 就报错。" }, { "id": "anchors.write-gate", "claim": "写入时把命中过宽的锚点丢掉并写明理由,而不是拒绝整条记录", "status": "measured", "evidence": ["tests/anchors.test.ts"], "note": "含阳性对照(超限锚点被丢)与阴性对照(空表/关闸时保留)。" }, { "id": "anchors.store-audit", "claim": "写入闸门管不到的存量锚点,由只读审计报出来并给出修法", "status": "measured", "evidence": ["tools/anchors.mjs", "tests/anchors.test.ts"], "note": "2026-09-25 实测:真实库 0 条;拿真实库副本塞一条 tool:pwsh 后报 1 条(命中 5936、占全部调用 37.3%)。" }, { "id": "delivery.one-per-call", "claim": "一次工具调用最多送 1 条记录", "status": "measured", "evidence": ["tests/delivery.test.ts"], "note": "同一调用有多条候选时只出一条,这条是投递层的硬约束。" }, { "id": "delivery.multi-hint-not-worth-changing", "claim": "短回合(≤20 次调用)里 12 次有提示、0 次有 2 条以上 ⇒ 不为了「多条」改投递层", "status": "measured", "evidence": ["tools/replay.mjs", "tools/hint-density.json"], "note": "产物里 shortTurnsWithHints=12、shortMultiHintTurns=0;这是「先别改」这个决定的依据,不是「改得好」。" }, { "id": "t2.wipeguard", "claim": "「别把文件清空」场景:有相关记录 3/3,空库 0/3,无关记录 0/9", "status": "measured", "evidence": ["tools/t2-results.jsonl", "tools/t2-scenarios.json"], "note": "每格 3 次运行;判定只看产物,不看模型自述。" }, { "id": "t2.handoff-merge", "claim": "三条经验合一 vs 三条分开:平局(3/3 vs 2/3)⇒ 没有采纳自动合并", "status": "measured", "evidence": ["tools/t2-results-t4.jsonl", "docs/g4-handoff-report.md"], "note": "G4 的门槛要求「合一明显更好」才算过,实测没过——所以「合并」这条功能到现在没建。" }, { "id": "t2.psencoding-ceiling", "claim": "PowerShell 中文编码场景是天花板:空库也能过,因此测不出记录的效果", "status": "measured", "evidence": ["tools/t2-results-g5.jsonl", "docs/g5-psencoding-report.md"], "note": "天花板不是「记录有效」,是「这个场景没区分度」——按这可测性规则筛掉。" }, { "id": "hygiene.no-bare-empty-catch", "claim": "src 里没有「捕获了异常却什么都不做、也不写理由」的空 catch", "status": "measured", "evidence": ["tests/hygiene.test.ts"], "note": "按花括号深度扫全部 src/*.ts;该测试自带反例,证明它真能报出来。" }, { "id": "g5.measured-records-bar", "claim": "G5 预注册的门槛:攒够 30 条「效果测得出」的记录", "status": "not-run", "evidence": [], "how": "先用空库臂筛掉天花板场景(空库也能过的不算),再逐条跑对照", "note": "当前只有 2 条;已筛过的两个族(psencoding 5 条、multiskill 2 条)全是天花板。这是「说了要做、还没做到」的如实登记。" }, { "id": "adoption.remembers-never-called", "claim": "五个真实会话、约 5,900 次工具调用里,memory_remember 一次都没被调用过", "status": "readme-only", "evidence": [], "how": "python tools/session-calls.py --out tools/calls.jsonl,再统计 memory_remember 的出现次数", "note": "当时的统计没有落成仓库里的产物——README、CHANGELOG 与源码注释都引用了它,但凭证不在库里。现在能重跑同类统计(当前语料 15,896 次调用),那是**另一批**会话,不能当成这句话的凭证。" }, { "id": "gaps.auto-candidate", "claim": "反复发生、且库里毫无相关记录的失败,会在出错的回合里自动写成待确认候选(每回合最多 2 条)", "status": "measured", "evidence": ["src/failure.ts", "tests/failure.test.ts"], "note": "闭环:count ≥3 且 gapReport 找不到任何相关记录才写;正文是 harness 自己的报错原文加次数,不是判断。真实库干跑(2026-09-25):14 个形态反复 ≥3 次,其中 8 个没有任何相关记录,最高频那个 140 次。" }, { "id": "gaps.auto-candidate-effect", "claim": "自动写成候选之后,模型会去确认它们、这类错会变少", "status": "not-run", "evidence": [], "how": "重启插件后,看候选池里 recurring-failure 来源的候选有没有被 memory_remember 复述转正;再用 node tools/prevention-ledger.mjs 比较该形态在候选出现前后的发生次数", "note": "机制建了、单元测试过了、真实库干跑确认会产出候选——但**它到底有没有用,一次都没测过**。这正是「不主动去测就不知道」的那一环,如实登记。" }, { "id": "g5.testability-rule", "claim": "一条记录「测得出效果」的前提是:模型的默认做法是错的", "status": "design", "evidence": ["docs/GROWTH.md"], "note": "由实测归纳:凡是「只要小心就能做对」的场景,空库臂也是满分,记录的效果就无从体现。这是筛场景的规则,不是对外承诺的数字。" } ] }