记忆 session_id 提列
wesgine 的 session_id 从 metadata JSON 提升为独立列——消除页外过滤。
问题
session_id 曾存储在 Metadata 的 JSON 键中。
SQL 判不了 JSON 内的字段,于是会话门在 Limit: 500 取回之后在 Go 里跑。
页外过滤的症状
fixture 上正确——少量数据时看不出差别。
繁忙的 agent 命名空间中,别人会话的私有行占满窗口,本会话的行整个被挤出 500。
召回返回空。
解决方案
ddlMemoriesV11 将 session_id 提升为 wes_memories 表的独立列。
会话门从"取回后过滤"变为"SQL WHERE 子句":
WHERE session_id = ? AND ...
LIMIT ?
过滤发生在 LIMIT 之内——解决了页外过滤问题。
与 INV-MEM-48 的关系
actor 先于 session_id 做了同样的提列。
两者是同一批变更的两半:actor 提列(INV-MEM-48)消除了归属判据的歧义,session_id 提列消除了会话过滤的效率问题。
Episodic Kind 的 SessionID 要求
KindEpisodic 类型的记忆必须携带 SessionID。
缺少 SessionID 的 episodic 记忆 → ErrSessionRequired。
写入成功但永不被召回,比 400 错误更坏。
INV-MEM-54
耐久性是 Kind 的属性,会话是一等列。