记忆可召回性诊断
wesgine 记忆写入后的可召回性验证机制(INV-MEM-25)。
问题背景
写入记忆后返回 id ≠ 这条记忆会被模型看到。多种原因可能导致写入成功但永不召回:
- 层不对(写进了不会被注入的层)
- Kind 不匹配(没有注入面携带这个 Kind)
- actor 不可见(不属于当前请求的 actor)
- 被标记 stale 或 Conflicted
- 命名空间不对(写进了无人查询的地址)
验证端点
POST /cells/{id}/memory/validate
Body: { entry_id: "..." }
返回结果
{
"accessible": true,
"recallable": true,
"conditions": ["cold_start_requires_cross_session_days > 0"],
"surfaces": {
"eager": true,
"lazy": true,
"cold_start": false
}
}
两个维度
Accessible(可访问)
条目是否可以被当前 actor 看到。
取决于:
ActorVisible(读侧归属判断)- scope + actor 组合
Recallable(可召回)
条目是否会出现在模型的上下文中。
取决于:
- 三个注入面(Eager / Lazy / Cold-start)中是否至少有一个携带此条目
RecallQualityOK(质量门——stale/Conflicted 排除)- Kind 与注入面的匹配
三个注入面的判据
| 注入面 | 携带判据 | 可见性判据 |
|---|---|---|
| Eager | EagerCarriesRow | ActorVisible |
| Lazy | LazyCarriesRow | EntryVisible |
| Cold-start | ColdStartCarriesRow | ActorVisible |
三者 OR:任一面可召回即 Recallable = true。
Store 看不见的门
某些条件不是行的属性,Validate 无法确定性回答:
- KB arm 的语料绑定在 agent config 上
- Cold-start 需要
CrossSessionDays > 0 - Cold-start 行未过期
- Cold-start Key 不是正在开的会话
这些报成条件而非答案:裸答 "可召回" 会在整面关闭的 Cell 上被读成 "这条会注入"。
谓词来源
Accessible / Recallable 必须由真实注入面的谓词回答,不是手写镜像。
此前缺陷:
- 扁平 kind 表(无差别收
KindContext,而唯一携带它的 arm 只读特定 scope/ns 对) - 无条件
EntryVisible套到 eager 面(Alice 的 Constraint 每轮都在,却报 "不可召回") - 完全没有质量子句
测试要求
验证必须差分:
- 存进真 store
- 跑三个 Build(Eager / Lazy / Cold-start)
- 断言
Recallable等于 "文本出现在输出里"
矩阵必须含 KindContext——cold-start 独家携带的 Kind。