记忆 accessed_at 归一
wesgine 记忆系统的 accessed_at 下界归一设计——消除零值语义陷阱。
问题
accessed_at 列 NOT NULL DEFAULT 0。
「从未被召回」曾表示成比行本身早 55 年的时间戳(Unix epoch 1970)。
零值不是中性状态
零值是该字段最坏的取值——它影响:
| 消费者 | 影响 |
|---|---|
GC retentionScore | 衰减到 ~0 |
| hybrid ranker | 排名压到底 |
| Digest | 读作 stale |
ORDER BY accessed_at DESC | 排到末尾 |
而「最坏」恰好落在最新写入的行上。
治法:归一一处,读者不补偿(INV-MEM-51)
写入归一
saveCore 落盘前抬平:
if entry.AccessedAt.IsZero() {
entry.AccessedAt = entry.CreatedAt
}
存量修复
ddlMemoriesV10 幂等修存量:
UPDATE wes_memories
SET accessed_at = created_at
WHERE accessed_at = 0
之前的问题
六个读者各自带一份 if AccessedAt.IsZero() { use CreatedAt } 补偿。
第七个读者(context_index.go 的 ORDER BY)没带——同一行在五处读作创建时间、在一处读作 epoch。
不报错,只是一条记忆在某一个面上永久排最后。
第二排序键
ORDER BY accessed_at DESC, created_at DESC
created_at 不是整洁性 tiebreaker:List 在排序后切 Offset/Limit,并列时不确定的顺序移动的是页边界,同一查询的返回行集随谁先入列而变。