记忆写入管线
wesgine 记忆写入流程:安全扫描、质量门控、写入审批、去重与嵌入。
写入入口
API
POST /memory (body.layer)
SDK
cell.Memory().Save(ctx, entry)
cell.Memory().SaveToLayer(ctx, MemoryWrite{...})
saveCore 管线
所有写入路径最终经过 saveCore,执行以下步骤:
RequireActor → 威胁扫描 → 质量门控 → 写入审批 →
DedupKey 兜底 → 嵌入 → 后端写入 → 配额记录
威胁扫描(INV-MEM-24)
FirstThreatError() 扫描 entry.Content。
检测模式(5 条正则)
| 模式 | 说明 |
|---|---|
| 硬编码密钥 | hardcoded_secret |
| 连接字符串密码 | connection_string_password |
| AWS AccessKey | aws_access_key |
| Bearer Token | bearer_token |
| 私钥 | private_key(PEM 头) |
加上 invisible unicode 检测。
匹配 → 返回 ErrThreatPatternDetected,拒绝写入。
Always-on,无 opt-out。
与 KB 扫描的区别
Memory 用 ScanThreats()(5 条 + invisible unicode),KB 用 ScanKBChunk()(仅 private_key)。
质量门控(INV-MEM-31)
ContentQualityError() 拦截引擎状态前缀:
PLAN_STATE:TASK_STATE:SUBAGENT_RESULT:
ScopeWorking 豁免。
返回 ErrContentQualityRejected(硬拒绝)。
写入审批(INV-MEM-27)
CellSpec.MemoryWritePolicy 控制审批门控:
| 策略 | 行为 |
|---|---|
silent | 直接写入 |
logged | 写入 + 记录日志 |
gated | 需要审批才写入 |
WriteGate.Evaluate 在安全扫描通过后、嵌入前执行。
DedupKey 兜底
saveCore 在落盘前强制 ContentDedupKey 兜底。
空 Key 路径全部被关闭——GatewaySave / RunEndHook / Learner / 迁移等无 Key 路径都经过此单点。
RequireActor(INV-MEM-38)
saveCore 单点执行 Actor 必填校验。
- 不在调用方调
- 不在 HTTP handler 调
- 在
saveCore内统一调
曾只被两个进程内调用方显式调用,三条 HTTP 写入路径全在外面。
Kind 必填(INV-MEM-54)
空 kind → ErrKindRequired。
Kind 是三张表的键,与 Trust 零值、accessed_at 零值同族。
SessionID 校验
Episodic kind 缺 SessionID → ErrSessionRequired。
201 比 400 坏——调用方拿到成功返回就不再找了。
按层写入(INV-MEM-53)
SaveToLayer(MemoryWrite) → LayerTarget(layer) 一张表答三件事:
| 问题 | 答案 |
|---|---|
| 落哪个 scope | 由层决定 |
| 要不要 actor | 由层决定 |
| namespace 谁给 | 由层决定 |
四类 400
| 错误 | 含义 |
|---|---|
ErrUnknownLayer | 层名不存在 |
ErrLayerNotWritable | environment/session/working 不许写 |
ErrLayerShared | consensus 带 actor |
ErrLayerNamespaceRequired | agent_memory 空 namespace |
Trust 兜底(P2-5)
Go 零值 Trust=0 = TrustSystem = T0 最高信任。
saveCore 对 Trust==TrustSystem && Kind!=KindEnvironment 按 defaultTrustForKind 兜底。
相关文档
- Memory 层模型 →
memory-layer-model.md - GC 与 Digest →
memory-gc-digest.md - Actor 边界 →
actor-boundary.md