记忆 GC 豁免规则
wesgine 记忆系统中某些 Kind 的条目免于垃圾回收淘汰,但仍计入配额。
豁免列表
以下三种 Kind 的条目不会被 GC 的 retentionScore 淘汰:
| Kind | 说明 | 豁免原因 |
|---|---|---|
KindConstraint | 行为约束 | 用户设定的硬性指令,删除会改变 Agent 行为 |
KindInstruction | 操作指令 | 用户给出的持久指令,GC 不应自行决定是否保留 |
KindEnvironment | 宿主环境 | 系统感知产出,随 boot 刷新,不走 GC |
仍然计入配额
GC 豁免不等于配额豁免:
CellQuotas.MemoryMaxEntries = 5000
即使 500 条 Constraint + 200 条 Instruction 免于 GC,它们仍占用 700 个配额槽位。当总条目达到 5000 时,GC 只能从剩余的非豁免条目中淘汰。
与 TTL 的关系
GC 豁免的条目同样不受 TTL 过期删除:
KindConstraint、KindInstruction、KindEnvironment的 TTL 设为 0(永不过期)- 即使
DefaultMemoryConfig().TTL为其他 Kind 设置了过期时间,豁免 Kind 不受影响
与自动注入的关系
豁免条目中 KindConstraint 和 KindInstruction 始终通过 Eager 系统提示词索引自动注入。RecallQualityOK 门控对 IsGCExempt() 返回 true 的条目是惰性的——这些条目永远不会被 Conflicted 或 stale 标记阻挡。
但 KindCollective(部门共识)不是 GC 豁免的——一条已被判为被取代的部门共识,如果恰好是 ScopeGlobal 且无 actor,在 Eager 面的表现与 Lazy 面不同(INV-MEM-50)。
设计原理
豁免列表极短且封闭,原因是:
- 每多一个豁免 Kind,GC 在高配额压力下的可用空间就少一块
- 豁免过多会让
retentionScore淘汰集中在少数 Kind 上,造成偏斜 - 环境记忆有独立的刷新机制(
RefreshEnvironment),不需要 GC 介入
相关文档
- 记忆 GC 详情 →
memory-gc-details.md - 记忆 GC 与配额联动 →
memory-gc-quota.md - 记忆 TTL 批处理 →
memory-gc-ttl.md - 记忆召回质量门 →
memory-recall-quality.md