记忆写入管线
wesgine 的 saveCore 写入管线——从接收到落盘的完整流程。
管线执行顺序
入参 MemoryEntry
│
├─ 1. RequireActor(INV-MEM-38)
│ 空 actor → ErrActorRequired
│
├─ 2. ErrKindRequired
│ 空 kind → 拒绝
│
├─ 3. FirstThreatError(INV-MEM-24)
│ 凭据泄漏 5 条正则 + invisible unicode
│ 匹配 → ErrThreatPatternDetected
│
├─ 4. ContentQualityError(INV-MEM-31)
│ 拦截引擎状态前缀(PLAN_STATE: 等)
│ ScopeWorking 豁免
│
├─ 5. WriteGate.Evaluate(INV-MEM-27)
│ silent / logged / gated 三策略
│
├─ 6. ContentDedupKey 兜底
│ 无显式 Key 时从 Content 派生
│
├─ 7. Trust 零值兜底
│ Trust==0 且 Kind!=Environment → defaultTrustForKind
│
├─ 8. accessed_at 归一
│ accessed_at < created_at → 抬平到 created_at
│
├─ 9. Embedding 生成
│ 异步向量化
│
└─ 10. 后端写入
SQLite / InMemory
单点设计
saveCore 是唯一写入路径。
所有写入方(HTTP、Memory tool、CognitiveSettlement、Learner、迁移)都经过它。
这意味着上述每一步检查对所有来源一视同仁。
错误优先级
管线中的检查按严重性排序:
- 身份缺失(actor)— 最基础,无法归属
- 类型缺失(kind)— 无法分类
- 安全威胁(threat scan)— 凭据泄漏
- 质量门控(quality)— 引擎状态污染
- 审批门控(write gate)— 业务策略
前面的检查失败后,后续不执行。
QuotaSink 计数
RecordMemoryDelta(+1) 只在全部步骤通过且后端写入成功后执行。
任何一步失败都不计数——防止配额与实际条目数漂移。
SaveBatch
批量写入逐条走 saveCore。
单条失败不影响其余条目。