记忆写入管线

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、迁移)都经过它。

这意味着上述每一步检查对所有来源一视同仁。


错误优先级

管线中的检查按严重性排序:

  1. 身份缺失(actor)— 最基础,无法归属
  2. 类型缺失(kind)— 无法分类
  3. 安全威胁(threat scan)— 凭据泄漏
  4. 质量门控(quality)— 引擎状态污染
  5. 审批门控(write gate)— 业务策略

前面的检查失败后,后续不执行。


QuotaSink 计数

RecordMemoryDelta(+1) 只在全部步骤通过且后端写入成功后执行。

任何一步失败都不计数——防止配额与实际条目数漂移。


SaveBatch

批量写入逐条走 saveCore。

单条失败不影响其余条目。