记忆 session_id 提列
wesgine 记忆系统将 session_id 从 Metadata JSON 提升为独立列的设计(INV-MEM-54)。
问题背景
session_id 原先存储在 Metadata JSON blob 中。
SQL 无法直接判定——只能取回后在 Go 里过滤。
页外过滤的灾难
SELECT * FROM wes_memories
WHERE scope = 'agent' AND namespace = 'busy-agent'
LIMIT 500
500 行里可能 499 行属于别的会话。
本会话的行被挤出窗口底部——返回空,不报错。
提列方案
ddlMemoriesV11 添加 session_id 独立列:
ALTER TABLE wes_memories ADD COLUMN session_id TEXT DEFAULT ''
查询变为:
WHERE scope = 'agent' AND namespace = ? AND session_id = ?
LIMIT 500
过滤在 LIMIT 之内。
与 actor 提列的关系
INV-MEM-48 把 actor 从 Metadata["actor"] 提成独立列。
INV-MEM-54 把 session_id 做同样的事。
两者是同一类修复——把归属从 JSON blob 移到可索引列。
零值拒写
episodic 类型的记忆缺 SessionID 时返回 ErrSessionRequired。
不给默认值——201 比 400 坏(调用方就此不再找了)。
会话门的位置
提列后,会话过滤从 Go 下沉到 SQL:
| 之前 | 之后 |
|---|---|
Go if metadata["session_id"] == sid | SQL WHERE session_id = ? |
| 在 LIMIT 之后 | 在 LIMIT 之内 |
| 两行数据看不出差别 | 任何规模都正确 |
存量处理
按 DEV-1 清库:ddlMemoriesV12 清理无法回填的存量。
session_id 从来不是列——无从回填。
每行本来就不可召回——删掉的是"我有记忆"与"我的记忆能用"看起来一样的那幅画面。
相关不变量
- INV-MEM-54:耐久性是 Kind 的属性,会话是一等列
- INV-MEM-48:actor 提列
相关文档
- 记忆写入管线 →
memory-save-pipeline.md - 记忆 Kind 与耐久性 →
memory-kind-durability.md - 记忆层模型 →
memory-layer-overview.md