🏠 home › concepts › auto-memory
tags
[Claude Code, 知识管理, 记忆, Agent, 工程]
created
2026-04-17
updated
2026-04-17
sources
[raw/notes/claude-code-memory-system-s09-2026.md, raw/notes/claude-code-memory-session-evidence-2026.md]

定义

Claude Code 跨会话记忆系统的存储边界设计。核心原则:只有跨会话仍成立、且当前代码里推不出来的信息,才值得进入 memory。auto-dream(定期整合清理)互补——Auto Memory 管"该不该存",Auto Dream 管"存了之后如何不腐烂"。

核心论点

memory 不是"更长一点的上下文窗口",更不是"什么都记下来"。如果什么都存,会出现两个问题:

  1. memory 变成垃圾堆,越存越乱
  2. agent 开始依赖过时记忆,而不是读取当前真实状态

反向定义比正向定义更重要:先立"什么不该存"的边界,memory 才能从"帮助系统长期变聪明"避免变成"帮助系统长期产生幻觉"。

四类记忆类型

类型 内容 典型例子
user 用户长期偏好 喜欢什么代码风格、回答详略、工具链偏好
feedback 用户明确纠正或验证过的判断 "不要这样改"、"这个判断之前错过"、被认可的非显然做法
project 不易从代码推出的项目约定/背景 设计决定来自合规要求、某目录暂时不能动的真实原因
reference 外部资源指针 问题单看板、监控面板 URL、资料库位置

不该存进 memory 的东西

不要存 原因 应去哪里
文件结构、函数签名、目录布局 重新读代码即可 代码本身
当前任务进度 时效极短 task / plan
临时分支名、当前 PR 号 很快过时 git / 项目管理工具
修 bug 的具体代码细节 代码和提交记录是权威 git log / blame
密钥、密码、凭证 安全风险 密码管理器 / 环境变量

关键判断:即使用户主动说"帮我记住 PR 列表/当前分支",也不应直接存——应追问"这里面真正值得长期留下的、非显然的信息是什么"。

数据结构

单条 memory 文件

每条 memory 一个独立 markdown 文件,frontmatter + 正文:

---
name: prefer_tabs
description: User prefers tabs for indentation
type: user
---
The user explicitly prefers tabs over spaces when editing source files.

索引 MEMORY.md

# Memory Index

- prefer_tabs: User prefers tabs for indentation [user]
- avoid_mock_heavy_tests: User dislikes mock-heavy tests [feedback]

索引只记"有哪些 memory 可用",不重复正文内容。这与 llm-wiki-pattern 的"索引页 + 详情页"结构同源。

memory / task / plan / CLAUDE.md 的边界

四种持久化机制各司其职:

机制 时效 内容
task 当前会话 工作分解、依赖、进度
plan 当前会话 这一轮怎么做的过程性安排
memory 跨会话 长期偏好、纠错、不易推出的项目背景
CLAUDE.md 长期项目级 稳定的系统/项目级规则

简单判断法: - 只对这次任务有用 → task / plan - 以后很多会话可能都还会用 → memory - 长期系统级或项目级固定说明 → CLAUDE.md

高完成度版的 6 条边界

教学最小版讲清"该存什么/不该存什么"即可。但落到真实工作平台,还需要 6 条边界:

1. 作用域分层:private vs team

价值:不把个人偏好误写成团队规范,不把团队规范锁在某个人的私有记忆里。

2. 同时保存正反馈,不只存纠错

feedback 不只来自负反馈,也来自被验证的正反馈("这种不明显的做法用户已经认可")。只存纠错的系统会越来越保守,却不一定越来越聪明。

3. 用户要求存的,也未必该存

PR 列表、分支名、今天改的文件、当前子任务——即使用户说"帮我记住",也应追问真正长期有价值的非显然信息是什么。

4. memory 会漂移,回答前先核对当前状态

memory 记的是"曾经成立过的事实",不是永久真理。用 memory 当方向提示,不当替代当前观察。 冲突时优先相信你刚观察到的真实状态。

5. 用户说"忽略 memory"时按空处理

不是"嘴上忽略心里继续用",而是这一轮真的按 memory 为空来工作。

6. 推荐具体路径/函数/外部资源前要再验证

memory 适合记"哪个目录是入口"这类方向;但在真的说"去改 src/auth.py"之前,要核对一次。命名、路径、系统入口、外部链接都会变。

原则:memory 先告诉我去哪里验证;验证完,再给用户结论。

与相关概念的关系

运行时实证(来自真实 session.json)

教学版描述的边界在 Claude Code runtime 里有具体落地:

存储路径

~/.claude/projects/<encoded-cwd>/memory/(cwd 路径用 - 替换 /)。项目级隔离:切换 cwd 就切换记忆库,同一台机器上不同项目互不污染。

实际 frontmatter 比教学版多一个字段

---
name: Sentino 创业公司
description: ...
type: user
originSessionId: 8cf290da-6662-4a95-9023-21b44c501f3b
---

originSessionId 让每条 memory 可追溯创建来源——这是 auto-dream 整合时去重/合并的潜在依据。

第 4 条边界"memory 会漂移"是 runtime 强制提醒

读取 3 天前的 memory 时,tool_result 自动注入:

<system-reminder>
This memory is 3 days old. Memories are point-in-time observations,
not live state — claims about code behavior or file:line citations
may be outdated. Verify against current code before asserting as fact.
</system-reminder>

不是建议,是有运行时机制注入的强制提醒。这一条边界在产品里被钉得最死。

写入新 memory 前的工作流

  1. Read 相关已有 memory(先判断有没有可更新的)
  2. 不存在 → Write 新文件(frontmatter + Why + How to apply)
  3. Read MEMORY.md
  4. Edit MEMORY.md 在合适位置插入索引(不是 append 末尾)

实证了"不写重复 memory,先检查能否更新已有"原则的实际执行路径。

memory 文件走普通文件系统机制

每次 Write/Edit memory,都被 file-history-snapshot 跟踪,与源代码文件共享同一套版本/回滚。这印证 harness-engineering "记忆选 Markdown 而非向量数据库"的架构理由——透明可编辑、原生 Git、与文件系统总线天然集成。

当前未实现/未观察到

一句话记住

memory 保存的是"以后还可能有价值、但当前代码里不容易直接重新看出来"的信息。

相关概念