05 / evidence

先证伪,
再写代码

这一页不介绍功能,只回答一个问题:凭什么信。 下面每一条数字都来自一次真实的对照读数;每一条被推翻的设计,都曾经看起来很有道理。

12 条负结果 6 条硬约束 3,335 个测试
01

被实测推翻的十二条

这是前身项目留下的负结果台账,也是新项目的立项依据。写在这里的每一条,都曾经是「显然正确」的设计。

12 条按三种疑问分:4 条在问「打分够不够」,2 条在问「能不能自动合并」,6 条在问「这个能力是不是真的在跑」。

#原设计实测读数改成了什么
用分数代替判断(4 条)
01 用 confidence 当可信度闸 模型自报值 192/285 挤在 ≥0.9,全库只有 8 个不同取值 等于没查;按分数过滤也筛不出什么
02 用向量做语义判定 五个向量模型都分不开:对的和错的在分布上重叠 判定不用它;召回也先用关键词(见下)
03 相关性 = 实体 + 骨架 + 向量 + 词法四维加权 能挡掉 6/6 条不该要的,但把 3/4 条本该要的也挡了 怎么调都分不开好坏;放弃这套打分
04 交叉印证在 token 层聚簇 6 条错的里,有 3 条被它判成了对 改到「实体」这一层再做印证
能不能自动合并(2 条)
05 确定性 fingerprint 做跨会话统一 覆盖率 8.7%(9/103);再放宽就是错并 改成「重复不写」+ 先粗筛候选,不自动合并
06 所有权冲突是急症,应自动覆盖 被 >1 个来源写过的实体 0 条 只记冲突、不自动覆盖;猜错就把原话盖掉了
这个能力是不是真的在跑(6 条)
07 中文 FTS 按字符切分 10 条真实查询,本该命中 22 次,结果 0 次,还不报错 改成逐词归一 + 影子列;10 条里 9 条查得到
08 蒸馏进度与记忆同事务 事务嵌套后每条写都悄悄失败,进度照常往前走 改成允许重投、写入幂等
09 空间、情感、意图—技能—知识是独立维度 三张空间表在库里根本不存在;located_at 出现 0 次 只存在于纸上,砍掉
10 记忆衰减 / ACT-R 强度整套在跑 每轮能扫的窗口正好被置顶和归档占满,实际处理 0 条 等于装饰,砍掉
11 告警已经能到达用户 attention 表没有任何面向人的读者,只到「已落库」为止 没人看得到,就算没交付
12 系统具备主动召回 MCP 没有推送通道,系统只能等 agent 来问 「主动递来历史」从来没做到
为什么现在不做向量召回

第 02 条讲的是「判定」;这里讲「召回」。三条理由按分量排。

01 / 够用

关键词已经够快,也够准

单看一个词,命中就是索引里真的有它,不是算出来的相似度;多词按「或」召回,宁可多给几条,再让模型筛。

本机 1,045 行索引
单次查询 0.02–1.1 ms
02 / 成本

小机器背不动向量模型

常驻的向量化模型要占内存和 CPU;云端的 embedding 服务我们也还没测过,不把没测过的东西放进主路径。

内存 / CPU 是本地节点的硬约束
03 / 复杂度

多一套索引,就多一套麻烦

多一份索引、同步、失效与重建;现在的场景关键词基本够用。真需要时,做成可选接口加独立表,不动核心。

默认不引入 · 需要时外挂

实测口径:本机中心 memory.db 只读打开,rc_shadow 1,045 行,2026-11-09; SQLite FTS5 MATCH,不含网络与结果组装。多词是「或」不是「且」——召回宁可宽一点,由模型和闸收窄。 另外,没有 LLM 时入库后的关键词检索照常可用;缺的是抽取,不是查。

02

六条不可协商

负结果的反面就是约束。它们不是愿景,而是合并代码前要过的一关。

C1
原文只增不改,
记忆可以整层重建
记忆坏了能从头再抽一遍,原文不动;两边的进度各记各的,互不牵连。这是允许犯错的地基。
C2
读的时候不叫模型,
判断都在后台做
后台判断有配额、能重复跑、结论可撤销;预算按家族共用一份。
C3
每个功能同时交付
用的人,和一个会变红的测试
没人用、也没测试能证明它坏了的功能,等于没做——旧项目就死在这。
C4
静默即缺陷
写零行算错误;不看「成功」开关;假装没数据按最高优先级查;探活必须真的调一次。
C5
不用模型的信号,
只能用来缩小范围
下结论交给模型;排序和拦截分开;人需要确认的量,不随数据变多而变大。
C6
核心不认识任何具体 agent
某个 agent 专用的东西一律放到外部转换器;工具按真正用得上的手来设,不按年头堆。
03

一个测试长什么样,决定它能抓到什么

旧写法只断言 ok == true;新写法断言真正写了几行。 差别不在风格,而在于——前者对「什么都没写」永远为真。

before会假绿
// 返回了 Ok,但一行都没写
let report = cycle_once(&db)?;
assert!(report.ok);

// 事务不可重入 + 读走独立连接池
// ⇒ 每条写静默失败,水位照常推进
// ⇒ 这个测试连绿三个版本
after会变红
// 断言真实行数与水位差
let before = count_rows(&db)?;
cycle_once(&db)?;
let after = count_rows(&db)?;
assert_eq!(after - before, 3);
assert!(watermark(&db)? > before_wm);
判据不许用 ok 字段,
测试断言行数。
04

承诺范围,也是证据的一部分

把「跑过什么」和「还没跑什么」分开写,才不会把设计稿读成线上真实数据。

已经跑过的路径

  • Windows x86_64 的 debug 构建与完整工作区测试
  • 四种来源的转换器都过了入库检查:Claude / MiniMax / Qoder / DSH
  • 合成样本与本地回环的端到端链路
  • aarch64 产物在树莓派(Debian 13 / glibc 2.41)实机起过
  • 中心自用试跑:导入 → 抽取 → 推导 → 召回跑通

不写成事实的部分

  • 无人值守一周的连续读数
  • 真机脱离中心(断网五天)后的长时间运行
  • 多租户共用时的成本曲线
  • 生产规模的召回质量指标
  • 任何「已经生产就绪」的结论
0模块
契约、存储、网络、使用入口各自成箱
0测试
测试函数;判据看真正写了几行、值在不在允许范围内
0表
正式记忆表,第 6 版结构
0工具
13 个共享记忆工具 + 28 个私有工具