记忆 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"] == sidSQL WHERE session_id = ?
在 LIMIT 之后在 LIMIT 之内
两行数据看不出差别任何规模都正确

存量处理

按 DEV-1 清库:ddlMemoriesV12 清理无法回填的存量。

session_id 从来不是列——无从回填。

每行本来就不可召回——删掉的是"我有记忆"与"我的记忆能用"看起来一样的那幅画面。


相关不变量


相关文档