记忆 Layer 与 Scope 的关系

Layer 是面向用户的封闭域(7 值),Scope 是引擎内部的存储分区。两者不是一一映射——一个 Scope 可能装多个 Layer。


为什么不能用 Scope 代替 Layer

consensus(L2 部门共识)和 about_me(L3 关于我)都落在 ScopeGlobal 上,区别仅在于行上有没有 actor:

LayerScopeActor
environmentScopeSystem无
consensusScopeGlobal无
about_meScopeGlobal有
agent_memoryScopeAgent有
sessionScopeSession有
workingScopeWorking有

拿 ScopeGlobal 查"关于我",必然把部门共识也一起装进 LIMIT 窗口。


LayerOf 与 LayerClauses 必须同源

LayerOf(entry) → 这一行属于哪层(一行 → 一层)
LayerClauses(layer) → 哪些行属于这层(一层 → SQL 谓词)

两个函数方向相反,但必须从同一份定义生成,否则必然漂移:


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 时未覆盖的行会落到这里。删掉它会让消费方以为域是封闭的,然后对着一个真实存在的值崩掉。


相关文档