DAY 12 · CLAUDE CODE ROADMAP · 20 DAYS

Memory有记忆的同事

Day 03 你认识了 Memory——今天把它推到生产级。 user / feedback / project / reference 四种类型各管一摊;MEMORY.md 是索引、单个文件是事实、 [[name]] 是链接。读写时机有讲究,过期清理有节奏。 Hook、Skill、Plan、Task 各有职责——Memory 只记录非显然、 会长期有用的事。

DURATION 75–90 min THEORY 30 min HANDS-ON 40 min REVIEW 15 min SECTIONS 5
M ·

思维导图

OVERVIEW
DAY 12 · Memory 记忆系统TYPES · STORAGE · LIFECYCLE · BOUNDARY01 · TYPES4 种类型02 · STORAGE存储结构03 · LIFECYCLE读写时机04 · BOUNDARY与其他系统·user 角色背景·feedback 纠正·project 进行中·reference 外部指针·MEMORY.md 索引·单文件 frontmatter·[[name]] 链接·语义组织·自动写入触发·读取时机·陈旧检测与验证·忽略指令处理·vs CLAUDE.md·vs Skills 命令·vs Plan / Task·不该存什么不是记得越多越好——是记得对才有用/MEMORY4 TYPESWHY · HOWSTALENESS

FIG M — DAY 12 KNOWLEDGE MAP · MEMORY PRODUCTION GUIDE

01 ·

四种记忆类型

TAXONOMY

四种类型不是"标签"——它们对应四种本质不同的信息。 记错类型不只是分类乱,会导致 Claude 在错的时机用错的方式调用记忆。 下面是每种类型的定义、写法标准、典型示例和反例

TYPE · USER

用户身份与背景

关于你是谁、做什么、知道什么的事实。让 Claude 把回答的深度、术语和类比调到适合你的层级。

✓ GOOD
user is a Go engineer with 10y exp, first time touching React — frame frontend concepts via backend analogues
✗ BAD
user 写了一个 React 组件(这是一次性活动,不是身份)
TYPE · PROJECT

进行中的工作、决策与背景

从 git / 代码读不出来的状态信息——发布日期、停滞原因、stakeholder 决策。容易过期,要勤更新。日期一律存绝对值("周四" → 2026-05-21)。

✓ GOOD
2026-03-05 起 mobile release branch 进入冻结期。Why: legal 要求。How: 非紧急 PR 推迟到下个 sprint
✗ BAD
今天修了 login bug(属于 git 历史可查的内容,不该存 memory)
TYPE · REFERENCE

外部系统的指针

"X 信息在哪儿找"。Linear 项目、Grafana dashboard、Notion 页面、Slack 频道。本身不存信息——只存位置

✓ GOOD
pipeline bug 跟踪在 Linear 的 INGEST 项目;oncall 监控面板: grafana.internal/d/api-latency
✗ BAD
INGEST-1234 的详细状态是 in-review(具体内容会过期,只存项目位置即可)

写法铁律:feedback 与 project 必须带 Why + How

feedbackproject最容易腐烂的两类—— 没有上下文的规则未来无法判断是否还成立。统一写成三段式:

## 主体规则或事实
集成测试必须连真实数据库,不用 mock

**Why**: 2026-Q1 mock 测试通过但 prod 迁移挂了,
        造成 4 小时 outage(INC-2398)

**How to apply**: 看到 test 文件含 vi.mock('../db') 立刻警示;
        集成测试用 testcontainers 起真实 pg
未来 Claude 看到例外场景时,能据 Why 判断要不要破例
02 ·

存储结构

FILE LAYOUT

Memory 存在 ~/.claude/projects/<project>/memory/—— 不在项目目录、不进 git。 结构是索引 + 事实文件 + 链接三层。

典型目录结构

# ~/.claude/projects/-Users-minimax-myproject/memory/
memory/
├── MEMORY.md                 # 索引(总览,加载到 context)
├── user_role.md              # type=user
├── user_preferences.md       # type=user
├── feedback_testing.md       # type=feedback
├── feedback_pr_size.md       # type=feedback
├── project_q2_freeze.md      # type=project
├── project_auth_rewrite.md   # type=project
├── reference_oncall.md       # type=reference
└── reference_linear.md       # type=reference

单个 memory 文件结构

# feedback_testing.md
---
name: feedback-testing
description: 集成测试必须连真实数据库,不允许 mock —— 决策点关键
metadata:
  type: feedback
---

集成测试必须连真实数据库,不用 mock。

**Why**: 2026-Q1 mock 测试通过但 prod 迁移挂了,造成 4 小时 outage(INC-2398)。
        Mock 与真实 schema 漂移过大,无法及时发现。

**How to apply**: 看到 vi.mock('../db') / jest.mock('@/db')
        立刻警示;集成测试统一用 testcontainers 起真实 pg。

相关:[[project-migration-strategy]]、[[reference-incident-db]]

MEMORY.md 索引规则

# MEMORY.md 是索引,不是内容容器
# 永远只放一行一条 — 单行 <150 字符
# 不带 frontmatter

## User
- [Role](user_role.md) — Go 10y / 新手 React / 偏好后端类比
- [Preferences](user_preferences.md) — 终端用 ghostty / 编辑器用 vscode

## Feedback
- [Testing](feedback_testing.md) — 集成测试不用 mock(INC-2398)
- [PR Size](feedback_pr_size.md) — 重构 PR 偏好单个 bundled 而非多个小 PR

## Project
- [Q2 Freeze](project_q2_freeze.md) — 2026-03-05 起 mobile release 冻结
- [Auth Rewrite](project_auth_rewrite.md) — 合规驱动 / 不是技术债

## Reference
- [Oncall](reference_oncall.md) — grafana.internal/d/api-latency
- [Linear](reference_linear.md) — pipeline bug 在 INGEST 项目
MEMORY.md 200 行后会被截断 — 一定要简洁

[[name]] 链接机制

FEEDBACKfeedback-testing不 mock 数据库PROJECTmigration-strategy迁移分阶段REFERENCEincident-dbINC-2398 详情未写入testcontainers-tipsTODO: 占位链接[[migration-strategy]][[incident-db]][[testcontainers-tips]] · TODO

FIG 02 · [[NAME]] LINKS — 实链 + TODO 占位链 串成知识网

RULE · 01

链接用 slug,不用路径

[[feedback-testing]] 而不是 [[feedback_testing.md]]。slug 来自 frontmatter 的 name: 字段。

RULE · 02

TODO 链接允许

链到一个还没写的 memory 是合法的——它标记了"未来值得记录的话题"。比格式错误更有价值。

RULE · 03

按主题组织,不按时间

不要 2026-05-19-notes.md 这类时间命名——按主题语义命名(testingdeployment)才便于检索。

RULE · 04

frontmatter 与内容同步

修改了 memory 主体时,记得更新 description——它决定未来 Claude 怎么判断这条记忆是否相关。

03 ·

读写时机与生命周期

LIFECYCLE

记忆系统的难度不在怎么写——而在何时写、何时读、何时不用。 下面是一套实战可用的判断标准。

何时该自动写入

WRITE · IF

✓ 用户主动告知身份/偏好

"我是 Go 工程师"、"我喜欢简洁回答"——这是 user 类型的金矿。

WRITE · IF

✓ 用户纠正了 Claude

"不要那么做"、"用 X 不要 Y"——立即记成 feedback,附 Why。

WRITE · IF

✓ 用户认可了非显然的选择

"对,这样写是对的"——这是 confirmation,和纠正一样重要。

WRITE · IF

✓ 学到外部资源位置

"看 Linear 的 INGEST"、"Grafana board 在 X"——存 reference。

何时不该写入

SKIP · 01

✗ 代码模式、架构、文件路径

这些读代码更准——存了 memory 反而会因代码改了而过期。

SKIP · 02

✗ git 历史可查的信息

谁改了什么、什么时候——git log 永远是真理源。

SKIP · 03

✗ 当前对话的临时上下文

"我正在调试 X"是当下状态,不是长期记忆——用 Plan/Task 即可。

SKIP · 04

✗ CLAUDE.md 里已经有的内容

项目规范已在 CLAUDE.md——再存 memory 是冗余,反而难维护。

读取与陈旧检测

STEP · 01检索相关 memory用 description 匹配STEP · 02验证陈旧性代码还在吗?STEP · 03应用 Why+How判断是否例外STEP · 04行动 / 更新 / 删除陈旧则修正STALE → REWRITE OR DELETE每次读取都是一次验证机会 — 信现在,不是信过去

FIG 03 · READ FLOW — RETRIEVE · VERIFY · APPLY · UPDATE

陈旧处理三档

FRESH

仍然有效

memory 描述的事实在代码 / 仓库 / 外部系统中仍能验证——直接用。

PARTIAL

部分过期

主要规则仍成立,但细节漂移了——用 Edit 修正后继续用,保留 Why。

DEAD

完全失效

事实已不存在(项目结束、人员调动、文件删除)——直接删除文件并清理 MEMORY.md 引用。

"忽略 memory" 指令处理

# 用户说: "这次先不用 memory" / "暂时忽略你记住的内容"

行为约定:
- ✗ 不要应用任何 memory 中的事实
- ✗ 不要在回答中引用或对比 memory
- ✓ 当前对话视为"零记忆"状态
- ✓ 仍可以读 memory 文件作为研究,但不作为约束

为什么需要:
- 用户在做 prototype / spike,不希望被既有约束限制
- 调试时怀疑 memory 是错误信息源
- 想体验"清洁状态"下 Claude 的表现
04 ·

与其他系统的边界

SYSTEM BOUNDARY

Memory 不孤立——它和 CLAUDE.md、Skills、Plan、Task 都涉及"持久化"。 划清边界是 Memory 用对的前提:选错系统比不存还糟。

五个持久化系统的对比

系统保存什么生命期共享范围
CLAUDE.md团队级项目规范、技术约定项目存活期团队(git 提交)
Memory个人偏好、对 Claude 的反馈、项目背景跨会话长期仅自己(不进 git)
Skills可复用的命令 / 工作流长期个人或团队(按位置)
Plan当前任务的实施方案单次任务会话内
Task / TodoWrite当前会话内的步骤拆解会话内会话内

决策树:信息该存哪儿?

START这条信息要保留下来吗?活过这次会话吗?TASK / PLAN会话内步骤团队都需要遵守吗?CLAUDE.MDgit 共享规范是可执行的工作流吗?SKILL封装成 /command→ MEMORY

FIG 04 · DECISION TREE — WHERE DOES THIS BELONG?

边界判断三句话

RULE · A

团队规范 → CLAUDE.md

所有人都该遵守的约定。Git 共享、Code Review 把关。

RULE · B

个人偏好 / 反馈 → Memory

只关于你与 Claude 的协作方式。不影响别人。

RULE · C

可执行流程 → Skill

哪怕只你一个人用——封装成 /命令 比每次写指令省事。

05 ·

操作与维护

OPERATIONS

Memory 不维护就会腐烂——MEMORY.md 越长、重复越多、过期条目越多, 读它的 Claude 行为就越混乱。 下面是维护 Memory 的日常操作与定期保养。

核心命令

命令作用使用频率
/memory查看 MEMORY.md 索引 + 所有 memory 文件清单每次开始新任务前
/memory edit <name>用编辑器打开指定 memory 文件需要修正陈旧条目时
/memory rm <name>删除指定 memory 文件 + 清理 MEMORY.md 引用项目结束 / 决策推翻时
记住:...自然语言要求 Claude 保存某事对话中随时
忘掉关于 X 的内容自然语言要求 Claude 删除相关条目对话中随时
这次先忽略 memory本轮对话不应用任何已存记忆spike / prototype 模式

定期保养清单

WEEKLY · 5 MIN

查看 MEMORY.md 行数

wc -l MEMORY.md——超过 100 行就要考虑合并 / 删除冗余条目。索引太长 Claude 会读不全。

WEEKLY · 5 MIN

清理 project 类

project 类型最容易腐烂——deadline 过了、决策推翻了、人员变了。每周 grep type: project 走一遍。

MONTHLY · 10 MIN

验证 reference 链接

外部 URL 会失效、Linear 项目会改名——每月点一遍 reference 类的链接,挂掉的就修。

QUARTERLY · 20 MIN

对照 CLAUDE.md 去重

季度回顾:把已经写进 CLAUDE.md 的规范从 Memory 里删掉。规则的家应该是 CLAUDE.md,memory 只补充未规范化的偏好。

反模式预警

❌ ANTI · 01

把 memory 当日记

"今天做了 X / Y / Z"——memory 不是 changelog,这种内容只会越积越多。日志该写 git commit。

❌ ANTI · 02

同一信息存多份

memory 里有"用 Vitest"、CLAUDE.md 里也有"用 Vitest"——双份维护负担。规则只该有一个家。

❌ ANTI · 03

memory 当作 prompt 模板

把可复用流程写进 memory——它会在每次对话被读取,占 context。这种用法应该是 Skill。

❌ ANTI · 04

纠正不写 Why

只存"不要 X"——未来 Claude 看到边缘场景不知道能不能破例。永远附 Why + How to apply。

06 ·

Labs

4 HANDS-ON

四个递进的动手实验——从写一条标准 memory 到完成季度保养。 预计 40 分钟,全部在你日常使用的项目里完成。

LAB · 01 · 8 MIN

写一条标准 feedback memory

选一个你最近纠正过 Claude 的场景——告诉 Claude "记住" 并写成标准三段式(主规则 + Why + How to apply)。用 /memory 检查文件内容,确认 frontmatter 与 MEMORY.md 索引都正确。

目标:掌握 feedback 类型的写法标准
LAB · 02 · 10 MIN

构建 user 与 reference 各一条

明确告诉 Claude 你的角色(user)和一个外部信息位置(reference,如 Linear/Notion/Grafana 链接)。再让 Claude 在下一次回答时主动用到这两条 memory——观察 description 写法对触发概率的影响。

目标:体会 description 决定记忆"被用到"的几率
LAB · 03 · 12 MIN

陈旧检测与重写

故意在 memory 里写一条"已过期"信息(比如"v2.0 计划 2025-12-31 发布"——日期已过)。开新会话让 Claude 引用这条 memory,观察它如何验证陈旧 + 自动修正 / 删除。

目标:理解读取时的验证 + 重写流程
LAB · 04 · 10 MIN

季度保养实战

对当前项目的 memory 做一次完整保养:(1) wc -l MEMORY.md 看长度;(2) 找出 3 条最老的 memory 验证陈旧性;(3) 把 1-2 条规则从 memory 迁到 CLAUDE.md;(4) 删掉所有空 TODO 链接。

目标:把"维护节奏"变成肌肉记忆
Q ·

常见问题

6 FAQS
Q · 01 Memory 和 CLAUDE.md 的边界到底怎么划? +
A ·

一句话区分:团队都该遵守的规范进 CLAUDE.md;只跟你这一个人/这个项目阶段相关的进 Memory。

典型案例:项目"所有 API 用 zod 校验"——团队公约,进 CLAUDE.md。"你不喜欢 Claude 主动加 try/catch"——个人偏好,进 Memory。"2026-Q2 mobile release 冻结期"——项目阶段性事实,进 Memory 的 project 类。

判断不出来时,问一句"团队新人 clone 仓库后是否需要立刻知道这件事"——需要就 CLAUDE.md,不需要就 Memory。

Q · 02 为什么 Memory 不进 git?团队不该共享纠正反馈吗? +
A ·

Memory 是"我和 Claude"的私人笔记——里面有大量"我习惯这样"、"我不喜欢那样"的个人偏好。强行共享会出现两个问题:(1) 不同人的偏好打架,Claude 不知道听谁的;(2) 这些偏好对别人没用、还占别人的 context。

团队级共享的规范有更合适的家:CLAUDE.md 共享规则;Skills 共享流程;Hooks 共享强制策略。Memory 留给真正属于个人的部分。

Q · 03 MEMORY.md 越长 Claude 加载越慢吗? +
A ·

不是慢的问题——是读不全。MEMORY.md 在每次会话启动时被加载进 system context,超过约 200 行后后面的会被截断。截断的部分等于 Claude 永远不知道它存在。

所以铁律是:每条索引单行 <150 字符,内容放在被链接的文件里、用 description 字段提示要不要打开。索引就是索引,不要把内容塞进去。

Q · 04 Claude 自动写的 memory 经常不准——怎么办? +
A ·

三个层面解决:(1) 在 CLAUDE.md 里加一条 meta 规则——"写 memory 必须用三段式(规则+Why+How)",触发严格写法;(2) 每次说"记住"时明确指定类型——"记成 feedback,Why 是 X";(3) 定期做 Lab 04 的季度保养,把 Claude 写错的及时修正。

另一个杀手锏:用具体场景纠正反而比抽象指令有效。比如发现 Claude 把"今天修了 login bug"存成 memory——立刻指出"这种属于 git 历史,不该进 memory",一次纠正能管很久。

Q · 05 不同项目能共享 user 类 memory 吗? +
A ·

Memory 默认按项目隔离——一个项目 dir 对应一个 memory 目录。但 user 类(你的角色、终极偏好)确实跨项目通用。

两种处理方式:(1) 放到 ~/.claude/CLAUDE.md 全局指令文件——这是 Claude Code 唯一支持"跨项目偏好"的官方位置;(2) 软链 user_*.md——在多个项目 memory 目录里 ln -s ~/.claude/global/user_role.md user_role.md。方式 1 简单可靠,方式 2 灵活但易碎。优先用方式 1。

Q · 06 Memory 会让 Claude 产生"AI 偏见"吗? +
A ·

会——特别是只存纠正、不存确认时。Claude 看到一堆"不要 X / 不要 Y / 不要 Z"会变得越来越保守,什么都不敢做。

解决方案:纠正与确认成对存——每次发现 Claude 做对了"非显然的选择"(一次性 bundled PR 而不是拆 5 个、一次性大重构而不是小修小补),也明确告诉它"对,这种场景就该这么做",存成 feedback。这条 memory 会成为未来 Claude 的"defensible action"——它有底气重复正确选择,而不是事事请示。

R ·

复习题

5 QUESTIONS
  1. 请说出 user / feedback / project / reference 四种类型各自保存什么——并各举一个 good 与 bad 示例。
  2. feedbackproject 类必须包含 WhyHow to apply——为什么不能只写主规则?
  3. MEMORY.md 是什么?为什么不能把 memory 内容直接写进 MEMORY.md?
  4. 给定一条信息,如何判断它该进 CLAUDE.md / Memory / Skill / Plan / Task 中的哪个?请描述判断流程。
  5. Memory 的"陈旧检测"分三档——FRESH / PARTIAL / DEAD,请说出各自的处理动作。
✓ ·

自检清单

8 ITEMS
  • 能说出 user / feedback / project / reference 四种类型的定义与典型示例
  • 写 feedback / project 类时能自然带上 WhyHow to apply 两段
  • 理解 MEMORY.md 作为索引、单文件作为事实、[[name]] 作为链接的三层结构
  • 能列出"何时该写 / 何时不该写"各 4 条标准
  • 掌握读取 → 验证 → 应用 → 更新四步生命周期,知道如何处理陈旧记忆
  • 能用决策树正确把信息分配到 CLAUDE.md / Memory / Skill / Plan / Task
  • 会用 /memory / /memory edit / /memory rm 维护记忆
  • 建立了"weekly / monthly / quarterly"三档保养节奏
☞ ·

延伸阅读

3 LINKS
DOCS

Claude Code — Memory Reference

官方 Memory 完整文档:四种类型定义、frontmatter 字段、MEMORY.md 索引规则、读写时机最佳实践。

GUIDE

CLAUDE.md 写作指南

Day 03 对应的延伸阅读:CLAUDE.md 三层叠加、与 Memory 的边界、init 命令生成模板。

PATTERN

Long-term context patterns

社区总结的长期记忆模式集合:feedback 三段式、project 时序管理、reference URL 失效检测。

☛ ·

Day 13 预告

NEXT
COMING NEXT

MCP 服务器 — 让 Claude 操作外部世界

今天让 Claude 记住——明天教它动手。 MCP(Model Context Protocol)打通 Claude 与外部系统:直接查 Postgres、读 GitHub PR、发 Slack 消息、看 Grafana 监控。 .claude/.mcp.json 一句配置,所有公司内的工具都成为 Claude 的"延伸"。

"Memory is the diary that we all carry about with us."

DAY 12 · CLAUDE CODE 20-DAY ROADMAP · OSCAR WILDE