背景
PR #445(编排记忆批,已合入 main @ fb6dddc)review 发现:evidence quote 脱敏修复未覆盖真实落盘通道,密钥仍可经 memory frontmatter 泄漏给 agent 回吐链路。
问题
sanitizeEvidenceQuote(apps/sidecar/src/services/memory-v2/command-service.ts:77/150/619-621)只过滤 candidate.evidence.quote,但该字段全仓无任何消费点、从不落盘——实为无效修复。
真正的落盘通道是 evidence_refs[].quote,原样透传:
markdown-store.ts:197:evidence_refs: input.evidenceRefs ?? evidenceRefsFromCandidate(candidate) → YAML.stringify 进 frontmatter
markdown-store.ts:884:直接返回 candidate.evidenceRefs 原文
- 三条来源均未过滤:
- background-extractor(整条源消息 ≤12k 截断的 quote)
- ingestion.ts:172(文件 chunk 2000 字符)
- dream-organizer(workspace quote)
- 落盘后经 memory.read 工具(tools.ts:141)回吐 agent
密钥正则扩展本身没问题(command-service.ts:608-614),问题只在作用对象错了。
建议修法
对构造后的 evidenceRefs 逐 ref 执行 containsSecret(ref.quote)→占位替换:
- 方案 A:command-service.ts:79/152/87 三个构造点统一过滤
- 方案 B(更收口):
markdown-store.ts:197 writeEntry 序列化前统一过滤
- 同时给
sanitizeEvidenceQuote 补消费点或直接删除
关联
背景
PR #445(编排记忆批,已合入 main @ fb6dddc)review 发现:evidence quote 脱敏修复未覆盖真实落盘通道,密钥仍可经 memory frontmatter 泄漏给 agent 回吐链路。
问题
sanitizeEvidenceQuote(apps/sidecar/src/services/memory-v2/command-service.ts:77/150/619-621)只过滤candidate.evidence.quote,但该字段全仓无任何消费点、从不落盘——实为无效修复。真正的落盘通道是
evidence_refs[].quote,原样透传:markdown-store.ts:197:evidence_refs: input.evidenceRefs ?? evidenceRefsFromCandidate(candidate)→ YAML.stringify 进 frontmattermarkdown-store.ts:884:直接返回candidate.evidenceRefs原文密钥正则扩展本身没问题(command-service.ts:608-614),问题只在作用对象错了。
建议修法
对构造后的 evidenceRefs 逐 ref 执行
containsSecret(ref.quote)→占位替换:markdown-store.ts:197writeEntry 序列化前统一过滤sanitizeEvidenceQuote补消费点或直接删除关联