记忆 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,并列时不确定的顺序移动的是页边界,同一查询的返回行集随谁先入列而变。