记忆 Layer 与 Scope 的关系
Layer 是面向用户的封闭域(7 值),Scope 是引擎内部的存储分区。两者不是一一映射——一个 Scope 可能装多个 Layer。
为什么不能用 Scope 代替 Layer
consensus(L2 部门共识)和 about_me(L3 关于我)都落在 ScopeGlobal 上,区别仅在于行上有没有 actor:
| Layer | Scope | Actor |
|---|---|---|
| environment | ScopeSystem | 无 |
| consensus | ScopeGlobal | 无 |
| about_me | ScopeGlobal | 有 |
| agent_memory | ScopeAgent | 有 |
| session | ScopeSession | 有 |
| working | ScopeWorking | 有 |
拿 ScopeGlobal 查"关于我",必然把部门共识也一起装进 LIMIT 窗口。
LayerOf 与 LayerClauses 必须同源
LayerOf(entry) → 这一行属于哪层(一行 → 一层)
LayerClauses(layer) → 哪些行属于这层(一层 → SQL 谓词)
两个函数方向相反,但必须从同一份定义生成,否则必然漂移:
LayerOf判一行是 L2,LayerClauses(consensus)却没挑到它 → 计数与列表不一致LayerClauses(about_me)把 L2 的行也选进来 → 别人的部门共识出现在我的"关于我"里
API 中 Layer 与 Scope 互斥
GET /cells/{id}/memory?layer=about_me ✅
GET /cells/{id}/memory?scope=global ✅(运维面)
GET /cells/{id}/memory?layer=about_me&scope=global → 400 ErrMemoryLayerScopeConflict
同时给出时拒绝而非取交集——两者只在调用方糊涂时才分歧,返回交集是在回答没人问过的问题。
消费方规则
| 角色 | 看到什么 | 用什么 |
|---|---|---|
| 产品 UI | 层名 | ?layer= |
| 运维诊断 | scope + namespace | ?scope=&namespace= |
| 引擎内部 | 两者都用 | LayerOf / LayerClauses |
产品侧禁止出现 scope 字样——一旦产品侧自行从 scope 推导 layer,就是 L2/L3 塌陷的标准入口。
七值闭域
func AllMemoryLayers() []MemoryLayer {
return []MemoryLayer{
LayerEnvironment, // L1
LayerConsensus, // L2
LayerAboutMe, // L3
LayerAgentMemory, // L4
LayerSession, // 运行时
LayerWorking, // 运行时
LayerUnknown, // 兜底
}
}
unknown 不可删除——它是引擎的兜底出口,新增 scope 时未覆盖的行会落到这里。删掉它会让消费方以为域是封闭的,然后对着一个真实存在的值崩掉。
相关文档
- 记忆层模型总览 →
memory-layer-overview.md - 记忆层查询谓词 →
memory-layer-clauses.md - 记忆计数与统计 →
memory-count-stats.md