记忆 Kind 与耐久性
wesgine 记忆系统的 Kind 分类与耐久性模型(INV-MEM-54)。
设计原则
耐久性是 Kind 的属性,不是 Formation(溯源)的属性。
为什么不用 Formation
Formation(M1~M7)描述记忆的来源:
- M1 声明式(用户手写)
- M2 规则提取(已废弃)
- M7 行为信号
但来源 ≠ 寿命:
别用 tabs出自一次纠正事件(episodic 溯源)→ 但永久有效- plan 是用户亲手写的(declarative 溯源)→ 但在产出它的任务外毫无意义
用溯源代理耐久性是一次猜测,猜错的形状不可见——行保存成功、返回 id、出现在记忆中心、永不被召回。
Kind 闭域
| Kind | 含义 | 耐久性 |
|---|---|---|
constraint | 约束/规则 | 持久 |
instruction | 指令 | 持久 |
fact | 事实 | 持久 |
preference | 偏好 | 持久 |
correction | 纠正 | 持久 |
convention | 惯例 | 持久 |
collective | 集体共识 | 持久 |
context | 会话上下文 | 临时(跨会话摘要) |
lesson | 教训 | 持久 |
已删除的 Kind
:把「运行结果快照」与「可迁移教训」装在一个名字下,逼两者共用一个耐久性experience/canvas:声明之外零命中todo
耐久性判定
单点 kindDurability
DurabilityOf(kind) → Durable | Ephemeral | error
IsDurable(kind) → bool (召回路径,error 塌成 fail-closed)
键在 Kind 而非新字段——新字段就是「每条写入路径都要记得填」。
Durable vs Ephemeral
- Durable(持久):跨会话可见,所有 eager/lazy 注入面都携带
- Ephemeral(临时):仅在创建它的会话内可见(
KindContext的跨会话摘要除外)
Session 提列(INV-MEM-54)
session_id 从 Metadata JSON 提升为独立列:
- SQL 判定替代 Go 端后置过滤
- 消除页外过滤(反模式 343)
isolated连续性下每条别人会话的私有行不再占用窗口
零值拒写
- 空
kind→ErrKindRequired - episodic 缺
SessionID→ErrSessionRequired - 201 比 400 坏:调用方就此不再找了
存量处理
按 DEV-1 清库(ddlMemoriesV12):
session_id从来不是列、kind在 59 行上缺失,无从回填- 每行本来就不可召回
- 删掉的是「我有记忆」与「我的记忆能用」看起来一样的那幅画面
与其他系统的关系
| 系统 | 使用 Kind 的方式 |
|---|---|
| GC | IsGCExempt(kind) 豁免 Constraint/Instruction/Environment |
| Digest | 按 Kind 分区做冲突检测和去重 |
| 召回 | RecallQualityOK 检查 Conflicted/stale |
| 注入 | 9 个 arm 各有 *CarriesRow 按 Kind 判定 |
| 写入 | saveCore 拒收无 kind 的行 |