
MemPalace WAL预写日志设计解析无副作用审计与敏感字段自动脱敏【免费下载链接】mempalaceThe best-benchmarked open-source AI memory system. And its free.项目地址: https://gitcode.com/GitHub_Trending/me/mempalaceMemPalace 是一款开源 AI 记忆系统其 WALWrite-Ahead Log预写日志模块用不到 100 行 Python 代码就实现了「无副作用写入审计 敏感字段自动脱敏」两大核心能力每次向记忆宫殿写入、删除或更新数据前先追加一条 JSON 审计记录而其中的日记正文、检索词等敏感内容会被自动替换为[REDACTED]标记既保留了审计价值又不泄露隐私。为什么 MemPalace 需要一条 WALMemPalace 的记忆体是一个向量数据库ChromaDB 等后端支持抽屉drawer增删改、知识图谱KG三元组维护、日记写入等多种写操作。写操作有两个天然痛点事后无法追溯向量库删除/更新后谁在什么时候动了哪条记忆无从查起审计本身可能泄密若把完整参数记进日志日记原文、查询词等敏感内容会原样落盘。MemPalace 的答案是一条极简的 WAL先记日志再执行写操作且日志写入失败绝不阻塞主流程。实现位置mempalace/wal.py全部 97 行测试见 tests/test_wal.py。WAL 日志长什么样每条审计记录是一行 JSONJSONL 格式包含四个字段字段含义示例timestampISO 时间戳2026-08-29T04:34:12operation操作类型add_drawerparams脱敏后的参数{drawer_id: ..., entry: [REDACTED 320 chars]}result执行结果null或结果字典日志文件固定写入~/.mempalace/wal/write_log.jsonl见 wal.py L23。一行一条记录天然支持grep、tail -f、流式解析排查问题时逐行读即可。设计要点一无副作用导入这是 wal.py 模块文档字符串L1-L11重点解释的动机WAL 独立成模块。最初_wal_log与 MCP 服务代码同处一文件但 mcp_server.py 在导入时执行 stdio 保护os.dup2(2, 1)、sys.stdout sys.stderr防止 C 库 banner 污染 MCP 的 JSON 流。这个重定向对 MCP 进程是必需的对mempalace sync命令行、daemon 守护进程却是有害的导入副作用——它会把运维输出错误地导向 stderr。把 WAL 拆到独立模块后CLI sync 路径cli.py L1076和 daemon service 层service.py L341-L348只需from .wal import _wal_log全程不触碰 mcp_server。有测试兜底tests/test_wal.py 在全新子进程中导入mempalace.wal断言sys.modules里不出现mempalace.mcp_server——专门防止未来重构悄悄引入这个回归。启示模块边界即副作用边界。把被多方引用的底层工具独立出来是避免隐藏导入副作用的最廉价手段。设计要点二延迟建目录守护 kill-switch 契约_ensure_wal()wal.py L32-L54刻意不在 import 时创建目录而是第一次真正写入时才建。原因很微妙删除整个~/.mempalace目录是 MemPalace 文档化的kill-switch用户以此关闭自动保存/挖掘钩子判定逻辑见 hooks_cli.py L58 的_palace_root_exists()如果仅仅 import 一下 wal.py 就把目录重建出来会静默重新武装用户刚关掉的钩子历史问题 #1676因此目录创建被推迟到「真正要写日志」这一刻——此时记忆层本来就会重建宫殿审计记录也不会因门控而丢失。目录/文件权限也做了加固且每个目录只尝试一次结果缓存在_WAL_INITIALIZED_DIRL57-L71对象权限目的~/.mempalace/wal/目录0o700仅属主可读写write_log.jsonl文件0o600os.O_CREAT原子创建仅属主可读写避免竞态下创建为宽权限即便权限设置失败受限文件系统也只是吞掉异常并缓存路径——不重试、不报错由 test_wal_ensure_is_idempotent_and_cached 验证第二次调用完全不触碰文件系统。设计要点三敏感字段自动脱敏脱敏规则集中在一个冻结集合里wal.py L27-L29_WAL_REDACT_KEYS { content, content_preview, document, entry, entry_preview, query, text }对应 7 类可能携带隐私的字段——记忆正文、日记条目、知识图谱文档、用户查询词等。脱敏逻辑wal.py L77-L82分两种形态值类型脱敏结果保留的信息字符串[REDACTED 320 chars]长度便于判断写入规模不泄露内容非字符串[REDACTED]仅存在性其余字段原样保留——drawer_id、wing、room、subject/predicate/object等元数据正是审计所需。两条测试用例分别锁定了这两种分支test_wal_log_redacts_and_writes 与 test_wal_log_redacts_non_string_values。为什么不用全局正则打码按 key 白名单脱敏是确定性的审计者能精确知道哪些字段被隐藏而不会误伤drawer_id这类本身含用户信息的标识符之外的内容也不会漏掉意外新增的敏感 key 之外的元数据。设计要点四审计失败绝不阻塞主流程_wal_log的整个写入过程被try/except Exception包裹失败时仅logger.error(fWAL write failed: {e})wal.py L89-L97。磁盘写满、文件系统只读、权限不足……任何 I/O 故障都不会让正在执行的add_drawer等工具调用崩溃。测试 test_wal_log_never_raises_when_write_fails 通过 monkeypatch 让os.open抛出OSError(no space left on device)断言_wal_log静默吞掉并留下 error 日志。这是一个明确的优先级取舍审计是增强主业务是底线。WAL 的价值是尽力记录而不是记录不成则拒绝服务。WAL 覆盖了哪些写操作在 mcp_server.py 中共有 9 处_wal_log调用点覆盖了记忆宫殿的全部写路径操作类型场景审计的关键字段add_drawer新增记忆抽屉wing / room / 内容长度 / 200 字预览脱敏delete_drawer按 ID 删除抽屉drawer_id / 被删向量 ids / 元数据快照update_drawer迁移房间或改正文新旧 wing / room / 是否改正文delete_by_source按源文件批量删除source_file / 匹配数 / 样本kg_add新增知识图谱三元组subject / predicate / object / 有效期kg_invalidate使三元组失效三元组 / 失效日期kg_supersede三元组被新版本取代新旧 object / 时间diary_write写入代理日记agent_name / topic / entry_preview脱敏sync 批量删除CLI / daemon 的mempalace sync修剪经wal_log回调传入sync.py L296-L304注意两个细节先记日志后执行——_wal_log(...)始终出现在实际col.delete()/ 图谱调用之前符合 WALwrite-ahead语义即使进程在写库中途崩溃日志里也能看到打算做什么。sync 路径用回调注入——sync_palace 接收wal_log: Optional[Callable]参数由 cli.py L1076-L1124前台 CLI和 service.py L341-L348daemon 后台任务各自注入同一个_wal_log。依赖注入让同步核心保持无状态同时前台/后台两条路径共享同一套审计格式。给自研项目的三条可复用经验审计模块独立 子进程测试防回归如果你的审计工具被 CLI、服务、插件多方引用把它拆成零依赖模块并像 tests/test_wal.py L5-L24 那样在子进程里断言导入不拖进重型模块。延迟初始化守护用户契约用户态目录如~/.mempalace可能是显式的关闭开关任何 import-time 的mkdir都可能悄悄绕过它把副作用推迟到第一次真实写入。按 key 白名单脱敏 保留长度[REDACTED N chars]比[***]更有审计价值——运维能区分空写入和长文档而无需暴露内容本身。延伸阅读核心实现mempalace/wal.py97 行含完整设计注释行为测试tests/test_wal.py6 个用例覆盖脱敏、缓存、故障吞并、无副作用导入调用方mempalace/mcp_server.py9 处写操作审计点、mempalace/cli.py、mempalace/service.py、mempalace/sync.py【免费下载链接】mempalaceThe best-benchmarked open-source AI memory system. And its free.项目地址: https://gitcode.com/GitHub_Trending/me/mempalace创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考