记忆 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 的属性,会话是一等列。