Skip to content

上下文预算与记忆库 —— 实施计划

物理仓库:/Users/larry/reading-browser 创建:2026-08-30 · 状态:✅ 全部完成(2026-08-30)—— T0-T4 ✅ · T5 ⏭ 裁定 A(用户拍板,维持不动) 立项自 2026-08-30 的合仓后治理评估。那轮评估管「合仓兑现了什么、还欠什么」, 本份只管其中唯一还在按会话次数持续计费的那一条。

前身:archive/post-merge-repo-optimization-plan.md §0.1「原因 1」把根因诊断到位,但明令推迟: 「建议 T2-1 落地、量到实际收益之后再单独立项 —— 现在就动等于同时改两个变量, 量不出哪个起了作用」。T2-1 已于 2026-08-29 落地并量到 −33%,该前提现已满足

⚠️ 本文件不定义任何红线/arch-check S28 基线守恒)。发现新不变量按 ../../CLAUDE.md §4「红线归属规则」写进稳定归属,这里只留指针。

✅ 已完成并归档(2026-08-30)

T0-T4 全部 ✅ · T5 ⏭ 裁定 A(维持不动)。 一天内做完,as-built 在 CHANGELOG.md

本文件自此是历史记述,不再是进度真相源。 沉淀下来的活的东西在这三处,改动去那里: · 判据 → 根 ../../CLAUDE.md §4「内容归属判据」 · 持续观测 → ../verification/context-budget.md (含 T5 裁定 A 与它的重启条件 —— 要重开那个议题去那里看,不是这里) · 仪表 → ../../scripts/context-budget.sh(由 /docs-audit Step 0 调用)

🔴 两处「正文写的与实测不符」,引用前连同订正一起看T2 的「< 6 KB」与 T3 的「< 4 KB」两个阈值都不成立,均已据实改判 —— 共同原因是立项时没有先量「不能动的那部分」有多大。各自的「结果」段写明了证据。 减重实绩:§9 −34% · §2 −30% · 根 CLAUDE.md 66,569 → 60,814 B(−8.6%)。


0. 问题:棘轮,不是「文档写太多」

CLAUDE.md 每会话恒加载。它的体量曲线(2026-08-30 实测 git 历史,复现命令见 §6):

2026-08-14   91,463 B   ← 第一次治理之前的峰
2026-08-14   57,266 B   ← 切(−37%)
2026-08-28   73,014 B   ← 14 天回涨 +27.5%
2026-08-28   50,557 B   ← 合仓阶段 1 再切(−31%)
2026-08-29   66,569 B   ← 1 天回涨 +31.7%(合仓阶段 4 集中作业)

两轮「切 → 回涨」的形状完全一样,现值已回到第二次切之前的 91%。 这不是「某次写多了」,是一个有稳定动力源的棘轮。

动力源:不存在比恒加载更便宜的落点

记忆系统的设计是「一事一文件 + 按相关性召回」(按需)。这条通道到 2026-08-30 之前 从未启用过~/.claude-cli/projects/-Users-larry-reading-browser/memory/ 是空目录, MEMORY.md 不存在)。于是每一条值得长期记住的事实只有一个落点:恒加载的 CLAUDE.md

对照证据:合仓的 T4-4 与 T4-7 都是去重任务,结果都净增(+5.9 KB / +3.4 KB)。 归并掉的是内容,累加上去的是元记述——「为什么改判 / 实测证据 / 谁曾被它带偏」。 那些恰恰是典型的记忆,不是指令

现状分节(2026-08-30 实测)

体量占比性质
§4 技术红线21,873 B33%四条双端契约红线正文 —— T5 待拍板
§9 双端整合13,535 B20%规则少、历史记述多 —— T2 的对象
§2 项目结构7,086 B11%含相当一部分桌面端专属 —— T3 的对象
§8 开发工作流6,027 B9%git 纪律,双端共享,留
其余 9 节约 18 KB27%各自都不大

全文元记述标记密度:⚠️ 21 处 · 实测 15 处 · 此前 8 处 · 6 处 · 🔴 5 处 · 改判/订正 3 处。这些内容有价值,问题不在质量,在加载时机。


0.1 前提已就位(T0,2026-08-30 完成)

记忆库已启用,首批 4 份种子记忆 + MEMORY.md 索引:

记忆类型为什么它不该住在 CLAUDE.md
user-larry-solo-devuser是「谁在用」,不是「怎么做」,每会话读一遍是纯浪费
feedback-verify-numbers-not-plan-textfeedback只在接手一份 plan 时才需要,不是每会话
feedback-prefer-bash-over-file-toolsfeedback同上;且它自带一条反直觉推论(走 Bash ⇒ 子目录 CLAUDE.md 不注入)
project-lampio-phase-2026-08-30project阶段指针,正是 §10「当前状态」那一节反复腐烂的东西

⚠️ 记忆库不是垃圾桶。 它有变成第三本账的真实风险——判据必须先立(T1),否则 T2/T3 只是把内容从一个会腐烂的地方搬到另一个。


1. 进度台账

完成一个任务:把 ⬜ 改成 ✅,填日期与 commit 短 SHA。放弃 / 改判的写 ⏭ 并注明原因。 顺序:T1 必须最先做(它是 T2/T3 的判据)。T2/T3 之间无依赖。T5 阻塞在拍板。

ID任务会话状态日期 / commit
T0启用记忆库(4 份种子 + MEMORY.mdRB2026-08-30
T1立「四层归属判据」 —— 一条内容该进哪一层RB2026-08-30
T2§9「双端整合」按判据减重(13.5 KB)RB2026-08-30 · 13,574→8,996 B(−34%)
T3§2「项目结构」的桌面端专属部分下沉 src-tauri/RB2026-08-30 · 7,086→4,958 B(−30%)
T4防棘轮的可观测手段(不是硬闸)RB2026-08-30
T5§4 四条双端契约红线的处置RB裁定 A(维持不动)2026-08-30 · 用户拍板

2. 冷启动开工指引

没有上下文的新会话:读 §1 台账找第一个 ⬜ → 读 §3 对应任务正文 → 动手。

三条硬约束

  • A. T1 之前不许动 T2/T3。 没有判据的搬运只是换个地方腐烂。
  • B. 每个任务做完先跑验收,再回写 §1 台账,再提交。 顺序反了会留下 「做没做完看不出来」的状态 —— 那正是 README.md 点名的病。
  • C. 本计划碰的是枢纽文件CLAUDE.md 家族)。动手前自查 git status / git worktree list;探到并行痕迹就开独立 worktree。

禁止事项

禁止为什么
在本文件里定义任何红线(含锁标记)/arch-check S28 基线守恒;红线按 §4「红线归属规则」进稳定归属
把内容删掉而不是搬走本计划是搬家。T2-1(合仓)已经确立过这条:那 57 KB 内容质量是好的
未拍板就动 §4见 §4
照 plan 末尾的「文档更新清单」回填 CLAUDE.md §2/§5那两处已于 2026-08-14 撤销,回填 = 把烂账种回去

3. 任务正文

T1 · 立「四层归属判据」

问题:现在只有「红线归属规则」(管红线该写在哪个文件),没有规则管 「一条内容该进哪一层」。四层是:恒加载 CLAUDE.md / 按需子目录 CLAUDE.md / 记忆库 / 普通文档。

已有的半条判据(合仓 P0-1 实测得出,可复用):

把内容放在「需要它的会话集合最窄」的那个深度。 推论两条: ① 某子树里多数会话都需要的东西,留在该子树根部才对,下沉反而让它被读两遍; ② 下沉后留在原位的索引行是净增成本,所以索引要压到最小。

要补的那一半 = 记忆库这一层的判据。倾向的形状(开工时定稿):

这条内容……落点
每会话都要遵守的规则,违反会出事恒加载 CLAUDE.md(只留规则本体 + 一行理由)
只在碰某棵子树时才要遵守的规则该子树的 CLAUDE.md
为什么当初这么定 / 谁被它带偏过 / 实测证据记忆库(按需召回)或归档件
反复重跑的判据docs/verification/ + scripts/*-verify.sh
一次性方案docs/plans/,做完归档

判据的自检问句(写进去时逐条过):

「一个不知道这段历史的会话,会不会因此把事情做错?」 会 → 规则,留恒加载。不会、只是会重复讨论一遍 → 记忆。

动作:判据写进 ../../CLAUDE.md §4「红线归属规则」下方 (那里已经是「归属」的稳定归属),只加表、不加论证,论证留本文件。

验收pnpm run check:claude-paths 绿 · node scripts/check-doc-links.mjs 绿 · 根 CLAUDE.md 净增 < 1 KB(判据本身不能变成新的棘轮燃料)。

✅ T1 结果(2026-08-30)

判据落在 ../../CLAUDE.md §4「红线归属规则」正下方,新起一节 「🔒 内容归属判据(这条内容该住在哪一层)」:一句总原则 + 5 行落点表 + 一句自检问句。 净增 1,013 B(阈值 1,024,达成)。

🔑 写的过程本身验证了这条判据的必要性:初稿 1,179 B、二稿 1,042 B,两次都超。 超出来的全是论证性文字(「为什么加载时机比重要性更该当判据」「原位索引是净增成本」)—— 按判据本身,那些是记忆不是指令,已留在本文件而非搬进恒加载区。 ⇒ 这条判据第一次被应用的对象就是它自己。

📌 被移出恒加载区的那条推论(P0-1 实测的推论 ②,留档在此): 下沉后留在原位的索引行是净增成本(对下沉进去的那些会话而言),所以索引要压到最小。 T2/T3 搬内容时按它办 —— 但别把这句话再写回 CLAUDE.md

⚠️ T2/T3 的实际判据以 CLAUDE.md 那张表为准,不是本节。本节只解释它为什么长这样。


T2 · §9「双端整合」减重

对象:13,535 B。里面真正的规则只有三条(会话隔离按工具链判 · schema 同步协议 · 变更通知流程),其余大部分是历史记述:

  • 2026-07 全端重命名事件的完整经过(含「两份计划的状态行为何错了七周」)
  • SM-2 一致性那段:某个文件路径写错、把一个会话带偏、订正没回流、又躺了一个月
  • 「路径写法(合仓后)」整节 —— 讲一条已经删掉的规则该怎么换算
  • admin / landing 两个子项目的合仓/拆分缘起

做法:按 T1 的判据分流。规则留;历史记述搬进记忆库(按主题一事一文件)或指回 已有的归档件(多数事件本来就有 plan 在 archive/,正文只需要一行指针)。

验收:§9 体量 < 6 KB · 三条规则一字不少(逐条 diff 核对)· check-doc-links / check:claude-paths 绿 · 反向自检:随机挑 3 条被搬走的记述, 确认「不知道它的会话不会做错事」。

✅ T2 结果(2026-08-30)

13,574 → 8,996 B(−34%);根 CLAUDE.md 67,582 → 63,004 B。

🔴 「< 6 KB」这个阈值不成立,据实改判为「规则本体量到多少就是多少」。 理由是量出来的,不是让步:§9 里不能动的部分本身就是 5,723 B —— 三条受保护规则(会话隔离 2,037 + Schema 同步协议 1,475 + 变更通知流程 762 = 4,274) 外加 SM-2 一致性规则 1,449。剩给「子项目边界 / RB+RVH 关系 / 路径写法 / 进度追踪」 四节的空间只有 421 B,而那四节现在是 3,4xx B 且全是规则性内容 (skill 边界与验证命令 / 统一命名规范 / 路径约定 / 指针表)。 ⇒ 要达标只能删规则,那正是「为了让闸门变绿而破坏它守的东西」。 立项时定 6 KB 是凭感觉、没有先量规则本体 —— 本仓自己的教训(数字要现场重测) 这次应在了计划作者身上。后续 T3 的阈值同样按此复核,别照抄。

三条规则逐条 diffSchema 同步协议 逐字节相同;另两条各删 6 行 / 3 行, 全部是历史记述、无一句规则:会话隔离那 6 行是 ci-rvh.yml 首绿 run id + 6 个死因 + FLUTTER_VERSION + dart format 门;变更通知那 3 行是「T4-1 归并了 32 个文件」。 (中途曾误删两个属于规则具体化的括号——T4-3 / T4-5/// 指针——diff 一比就看见了,已还原。)

搬走的内容各自去了哪(按 T1 判据「已有 plan 的指回 archive,否则进记忆库」):

搬走的落点
admin 合仓 / landing 拆分的完整论证指回 archive/admin-merge-plan.md · archive/landing-split-plan.md
2026-07 全端重命名事件的旧→新对照指回 archive/table-rename-three-end-plan.md
ci-rvh.yml 版本与格式门的来龙去脉已在 .github/workflows/ci-rvh.yml 文件头注释里,比原文详细
cross-end 归并 32 个文件指回 docs/cross-end/README.md
SM-2 路径写错带偏一个会话、订正没回流又躺一个月记忆库 control-file-claims-need-mechanical-guards(无归档件承载)

反向自检 3/3 通过(挑风险最高的三条机械核实,不是抽样): ① FLUTTER_VERSION 与格式门 → ci-rvh.yml 头注释第 12-24 行完整解释,要改 CI 版本的人必然打开那个文件; ② 重命名对照 → table-rename-three-end-plan.md 第 36-38 行有完整三端对照表; ③ cross-end 归并 → 规则(唯一一份 / 15 组重号 / 编号接 README)原样留在 §9。


T3 · §2「项目结构」下沉

对象:7,086 B。其中「目录布局」与「仓库地图」是双端共享的(留), 但相当一部分是桌面端专属的展开(src/ 只有两个 page、content-script 是 esbuild 产物 等)。

做法:桌面端专属部分下沉 ../../src-tauri/CLAUDE.md / ../../src/CLAUDE.md,根侧留仓库地图 + 一行指针。

⚠️ 别把仓库地图也下沉 —— 它是根 CLAUDE.md 作为「仓库总图」这个角色的本体, 而且 admin/ landing/ rvh/ 三个会话都要看。

验收:§2 体量 < 4 KB · 五颗卫星与契约中枢的拓扑仍在根侧 · 两道路径闸门绿。

✅ T3 结果(2026-08-30)

7,086 → 4,958 B(−30%);根 CLAUDE.md 63,004 → 60,814 B。

⚠️ 初稿把这两个数写成 4,929 / 60,785 —— 那是回写台账之前量的,写完那句「删掉数字」 本身又改了几十字节。回写台账要在最后一次编辑之后再量一次,否则连这条计划自己都在漂。

做了三件事,最大的一件不在原方案里

  1. 两条桌面端专属的坑真搬进子树(不是删掉 —— 两处目标文件里原本都没有这句): src/pages/ 只有两个页面 → ../../src/CLAUDE.md §4(+245 B); content-script.js 是 esbuild 产物改它无效 → ../../src-tauri/CLAUDE.md §5(+290 B)。
  2. 🔑 两张树合成一张(原方案没看出来):目录布局仓库地图 在说同一批目录 —— 前者给「每个目录干什么」,后者给「谁耦合谁」,admin / landing / supabase / rb-debug-mcp 四项两边各写一遍。合并后 docs/ tools/ scripts/ CHANGELOG.md 挂进同一棵树的「非子项目」枝。 这一项占了本次减重的一半以上。
  3. 去掉与 §9 新表的重复共享 / 私有表里的 Skill 与文档两行、仓库地图 rvh 段里的 skill 排除 / CI / 工具链 —— T2 刚在 §9 建了「子项目边界」表,不去重就是我自己当天造的第二本账。

🔴 「< 4 KB」同样不成立,据实改判(与 T2 同因):合并后的仓库地图本身 4,217 B, 它就是根 CLAUDE.md 之所以要扮演「仓库总图」的本体 —— 再砍只能砍掉拓扑。 两次阈值都定低了,共同原因是立项时没有先量「不能动的那部分」有多大。 ⇒ 📌 给 T4 与后来的减重任务:先量规则本体,再定阈值;反过来做必然要么破坏内容、要么事后改判。

顺带修一处数字漂移:「已下沉的三小节」表里写「各 4 / 6 行」,而本次给两张表各加了一行 —— 按本仓铁律删掉数字而不是更新它(散文里的数字必然静默漂移)。


T4 · 防棘轮的可观测手段(不是硬闸)

不要做体量硬闸:会在「正常增长 → 下一次治理」之间恒红,而 「一道恒红的闸门与恒绿的一样坏」是本仓 2026-08-18 实测过的(CI 连红 6 天)。

倾向做法(开工时定稿)/docs-audit 的 Step 0 已经会打印 CLAUDE.md 分节体量。 补一条趋势记录:每轮审计把「日期 / 总字节 / 最大三节」追加进一张表, 让棘轮在下一轮审计时可见,而不是等到某人觉得「好像又变大了」。 放哪待定 —— 候选是 docs/verification/ 新开一个专题,或 /docs-audit 自己的产出约定。

验收:跑一次 /docs-audit,趋势表里有 2026-08-30 这一行(基线 66,569 B)。

✅ T4 结果(2026-08-30)

做成了「仪表 + 专题清单」两件,而不是一道闸门。

  • 机械层 ../../scripts/context-budget.sh —— exit 0。 打印 CLAUDE.md 家族体量 · 恒加载合计(根文件 + 12 个根 skill 的 frontmatter, 后者是恒注入的,只看根文件会漏掉一半)· 根文件分节 Top6 · 记忆库条目数 · 与台账上一行的差值与百分比
  • 判断层 ../verification/context-budget.md —— 5 条问句(C1-C5,每条带假绿风险)+ 反向验证配方 + 已知未修(含 T5 裁定 A 及其重启条件)+ 趋势台账。
  • 接线:/docs-audit Step 0 由手搓 awk 改为调用脚本,并明写「跑完记一行进台账」; scripts/README.md 新增第四类「仪表」(此前只有守门 / 专题验证 / 刻意手工三类), 并写明🔴 别把它当闸门接进 CI

反向验证 3/3 实测:① 往根文件追加 2 KB → 对比段显示 +2065 B / 3.3%,删掉回 0; ② 记忆目录改名 → 打印 🔴 记忆目录不存在;③ 台账第二列改成非数字 → 不崩、exit 0, 且回退到上一条可解析行(fail-soft,比设计时预期的更好)。

🔑 写脚本时自己踩到一个假数:初版用 cat .claude/skills/*/SKILL.md | awk 取 frontmatter, 拼接后那个 awk 只截到第一份,12 个 skill 算出 298 B(实际 5,129 B)。 一眼假才发现 —— 换成逐份求和。聚合前先 cat 再切分是通用陷阱,不限于本脚本。

📌 台账首行不是今天:回填了 2026-08-14 / 08-28 / 08-29 三行历史峰值(标注「回填,非当轮实测」), 否则第一次对比没有基准,而那三个数正是立项的全部证据。


4. 🔴 T5 待拍板:§4 那 21.9 KB 要不要重新评估

现状裁定是「不下沉」,两次独立作出:

  • 合仓 T4-4:下沉等于把双端契约「藏进只有改 Rust 时才可见的地方」,而改 Dart 的会话再也看不到。
  • 合仓后优化 §4「不做什么」:同一条,并补了一句「T2-1 做完已能拿到约 80% 的收益,风险低得多」。

为什么现在值得重问一次:那条裁定成立的前提是「除了恒加载,没有别的按需通道」。 T0 之后这个前提变了 —— 记忆库是一条跨目录、按相关性召回的通道, 不像子目录 CLAUDE.md 那样绑死在「碰了哪个目录」上。

三个选项(拍板前不许动手):

做法代价
A 维持不动§4 四条正文继续留恒加载21.9 KB × 每一次会话。最安全,且 T2+T3 已能拿回约 20 KB
B 规则留、证据走规则本体(两端同文那几句)留根;「为什么 / 实测证据 / 27 秒门槛怎么反算的」进记忆库需要先验证记忆召回在「改 sync 代码」这个场景下真的会命中 —— 没验之前不能选
C 整体下沉正文进 src-tauri/ + rvh/lib/features/sync/,根留索引两次裁定都否过。除非有新证据,不建议

倾向 A,除非 B 的召回可靠性被实测证明。 建议顺序:先做 T1-T4, 量到实际收益后再回来看 §4 还剩多大比例 —— 很可能那时候它已经不是最大的一块了。


✅ 裁定:A(维持不动)—— 2026-08-30 用户拍板

§4 那四条双端契约红线的正文继续留在恒加载区,本计划不动它。 T1-T4 照做;做完之后不自动重开 —— 要重开需要新证据(例如 B 的召回可靠性被实测证明, 或 T1-T4 做完后 §4 的占比反而升高到不可接受)。

⚠️ 给后来会话:这条不是「还没想好」,是已决。别把它当遗留议题重新论证一遍 —— 本仓在「统一红线编号」上已经吃过一次「裁定完又被重开」的亏(合仓 T4-4 与合仓后优化 §4「不做什么」为同一件事各裁一次)。要动它,先在这里写下新证据是什么。


5. 不做什么

不做理由
合并三份 CHANGELOG45 万字节,代价大收益低。口径已在 2026-08-30 改成「每端各一份」
统一 RB / RVH 红线编号合仓 T4-4 已裁定不统一(350 处引用 + 无机械守卫),靠双向指针消歧。别重开
改「RB 本体散在根目录」的结构收益不确定、风险高。合仓后优化 §0.4 已登记为观察
CLAUDE.md 加体量硬闸见 T4 —— 会恒红
把记忆库当第二个 backlog / CHANGELOG记忆是「值得长期记住但不必每次读」的事实,不是待办也不是流水账

6. 附录 · 数字复现命令

本文所有数字都是 2026-08-30 的快照。别照抄当事实。

bash
cd /Users/larry/reading-browser

# ① CLAUDE.md 家族体量(token ≈ 字节 / 3.5,CJK 启发式,±20%)
for f in CLAUDE.md src/CLAUDE.md src-tauri/CLAUDE.md rvh/CLAUDE.md \
         rvh/lib/features/sync/CLAUDE.md admin/CLAUDE.md landing/CLAUDE.md; do
  printf "%-38s %8s B  ≈%5.1fk tok\n" "$f" "$(wc -c < $f)" "$(echo "scale=2; $(wc -c < $f)/3500" | bc)"
done

# ② 根 CLAUDE.md 按节体量
awk '/^## /{if(n){printf "  %-42s %6d B  %4d 行\n",n,b,l} n=$0;b=0;l=0;next}{b+=length($0)+1;l++}
     END{if(n)printf "  %-42s %6d B  %4d 行\n",n,b,l}' CLAUDE.md

# ③ 棘轮曲线(根 CLAUDE.md 每次改动后的体量,旧→新)
for sha in $(git log --format=%h -45 -- CLAUDE.md); do
  echo "$(git log -1 --format=%ad --date=short $sha) $sha $(git cat-file -p $sha:CLAUDE.md | wc -c)"
done | tail -r

# ④ 元记述标记密度
for pat in 🔴 ⚠️ 改判 实测 订正 此前; do
  printf "  %-6s %3s 次\n" "$pat" "$(grep -o "$pat" CLAUDE.md | wc -l)"
done

# ⑤ 记忆库现状
ls -A ~/.claude-cli/projects/-Users-larry-reading-browser/memory/