[{"data":1,"prerenderedAt":3456},["ShallowReactive",2],{"navigation":3,"\u002Fmindset\u002Fcontext-management":189,"\u002Fmindset\u002Fcontext-management-surround":3451},[4,35,57,75,101,123,149,171],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":34},"第 1 章：认识 Claude Code","i-lucide-rocket","\u002Fintro","1.intro",[10,14,18,22,26,30],{"title":11,"path":12,"stem":13},"什么是 Claude Code","\u002Fintro\u002Fwhat-is-claude-code","1.intro\u002F1.what-is-claude-code",{"title":15,"path":16,"stem":17},"Claude Code 与 Copilot、Cursor、Windsurf 的本质区别","\u002Fintro\u002Fvs-competitors","1.intro\u002F2.vs-competitors",{"title":19,"path":20,"stem":21},"AI 编程助手生态全景与选型指南","\u002Fintro\u002Fecosystem-guide","1.intro\u002F3.ecosystem-guide",{"title":23,"path":24,"stem":25},"LLM 的概率本质","\u002Fintro\u002Fllm-probability","1.intro\u002F4.llm-probability",{"title":27,"path":28,"stem":29},"从聊天机器人到 Agent","\u002Fintro\u002Ffrom-chatbot-to-agent","1.intro\u002F5.from-chatbot-to-agent",{"title":31,"path":32,"stem":33},"Claude Code 的 Agentic Loop 全拆解","\u002Fintro\u002Fagentic-loop","1.intro\u002F6.agentic-loop",false,{"title":36,"icon":37,"path":38,"stem":39,"children":40,"page":34},"第 2 章：安装与配置","i-lucide-settings","\u002Fsetup","2.setup",[41,45,49,53],{"title":42,"path":43,"stem":44},"系统要求与安装方式","\u002Fsetup\u002Fsystem-requirements","2.setup\u002F1.system-requirements",{"title":46,"path":47,"stem":48},"认证、登录与多账户管理","\u002Fsetup\u002Fauthentication","2.setup\u002F2.authentication",{"title":50,"path":51,"stem":52},"选择你的界面","\u002Fsetup\u002Fchoose-interface","2.setup\u002F3.choose-interface",{"title":54,"path":55,"stem":56},"Coding Plan","\u002Fsetup\u002Fcoding-plan","2.setup\u002F4.coding-plan",{"title":58,"icon":59,"path":60,"stem":61,"children":62,"page":34},"第 3 章：快速上手","i-lucide-hand","\u002Fquickstart","3.quickstart",[63,67,71],{"title":64,"path":65,"stem":66},"启动、交互模式与基本命令","\u002Fquickstart\u002Fstartup","3.quickstart\u002F1.startup",{"title":68,"path":69,"stem":70},"让 Claude 理解你的项目","\u002Fquickstart\u002Fcodebase-understanding","3.quickstart\u002F2.codebase-understanding",{"title":72,"path":73,"stem":74},"第一次代码变更","\u002Fquickstart\u002Ffirst-change","3.quickstart\u002F3.first-change",{"title":76,"icon":77,"path":78,"stem":79,"children":80,"page":34},"第 4 章：核心功能","i-lucide-laptop","\u002Fcore-features","4.core-features",[81,85,89,93,97],{"title":82,"path":83,"stem":84},"代码库全景扫描与模块关系分析","\u002Fcore-features\u002Fcodebase-scan","4.core-features\u002F1.codebase-scan",{"title":86,"path":87,"stem":88},"代码编辑与生成","\u002Fcore-features\u002Fedit-generate","4.core-features\u002F2.edit-generate",{"title":90,"path":91,"stem":92},"测试与调试","\u002Fcore-features\u002Ftest-debug","4.core-features\u002F3.test-debug",{"title":94,"path":95,"stem":96},"Git 工作流","\u002Fcore-features\u002Fgit-workflow","4.core-features\u002F4.git-workflow",{"title":98,"path":99,"stem":100},"工具链执行","\u002Fcore-features\u002Ftoolchain","4.core-features\u002F5.toolchain",{"title":102,"icon":103,"path":104,"stem":105,"children":106,"page":34},"第 5 章：进阶配置","i-lucide-wrench","\u002Fadvanced","5.advanced",[107,111,115,119],{"title":108,"path":109,"stem":110},"CLAUDE.md","\u002Fadvanced\u002Fclaude-md","5.advanced\u002F1.claude-md",{"title":112,"path":113,"stem":114},"Skills","\u002Fadvanced\u002Fskills","5.advanced\u002F2.skills",{"title":116,"path":117,"stem":118},"MCP","\u002Fadvanced\u002Fmcp","5.advanced\u002F3.mcp",{"title":120,"path":121,"stem":122},"Hooks 与 Plan 模式","\u002Fadvanced\u002Fhooks-plan","5.advanced\u002F4.hooks-plan",{"title":124,"icon":125,"path":126,"stem":127,"children":128,"page":34},"第 6 章：实战开发","i-lucide-hammer","\u002Fpractice","6.practice",[129,133,137,141,145],{"title":130,"path":131,"stem":132},"需求分析与架构设计","\u002Fpractice\u002Frequirements-architecture","6.practice\u002F1.requirements-architecture",{"title":134,"path":135,"stem":136},"项目脚手架搭建与技术选型","\u002Fpractice\u002Fscaffolding","6.practice\u002F2.scaffolding",{"title":138,"path":139,"stem":140},"核心功能实现","\u002Fpractice\u002Fcore-features","6.practice\u002F3.core-features",{"title":142,"path":143,"stem":144},"测试覆盖、代码审查与质量调优","\u002Fpractice\u002Ftesting-quality","6.practice\u002F4.testing-quality",{"title":146,"path":147,"stem":148},"部署上线与成果分享","\u002Fpractice\u002Fdeployment","6.practice\u002F5.deployment",{"title":150,"icon":151,"path":152,"stem":153,"children":154,"page":34},"第 7 章：心法层","i-lucide-brain","\u002Fmindset","7.mindset",[155,159,163,167],{"title":156,"path":157,"stem":158},"提示词设计原则","\u002Fmindset\u002Fprompt-design","7.mindset\u002F1.prompt-design",{"title":160,"path":161,"stem":162},"上下文管理策略","\u002Fmindset\u002Fcontext-management","7.mindset\u002F2.context-management",{"title":164,"path":165,"stem":166},"安全与权限控制","\u002Fmindset\u002Fsecurity","7.mindset\u002F3.security",{"title":168,"path":169,"stem":170},"Boris Cherny 的 9 条实战心法与团队推广经验","\u002Fmindset\u002Fboris-cherny-tips","7.mindset\u002F4.boris-cherny-tips",{"title":172,"icon":173,"path":174,"stem":175,"children":176,"page":34},"附录","i-lucide-paperclip","\u002Fappendix","8.appendix",[177,181,185],{"title":178,"path":179,"stem":180},"常用命令速查表","\u002Fappendix\u002Fa.command-cheatsheet","8.appendix\u002Fa.command-cheatsheet",{"title":182,"path":183,"stem":184},"AI 核心术语汇编","\u002Fappendix\u002Fb.ai-terminology","8.appendix\u002Fb.ai-terminology",{"title":186,"path":187,"stem":188},"资源链接与延伸阅读","\u002Fappendix\u002Fc.resources","8.appendix\u002Fc.resources",{"id":190,"title":160,"body":191,"description":3444,"extension":3445,"links":3446,"meta":3447,"navigation":686,"path":161,"seo":3449,"stem":162,"__hash__":3450},"docs\u002F7.mindset\u002F2.context-management.md",{"type":192,"value":193,"toc":3402},"minimark",[194,207,214,225,232,235,240,245,248,270,273,284,290,358,361,365,368,388,392,399,410,413,431,436,447,453,464,467,469,473,477,480,485,499,504,515,520,535,541,568,575,579,582,606,611,622,627,638,642,649,654,750,767,780,884,887,891,894,920,925,992,995,999,1009,1016,1027,1032,1046,1048,1052,1056,1062,1065,1068,1078,1081,1101,1111,1115,1118,1138,1141,1148,1154,1157,1163,1196,1199,1203,1206,1209,1241,1248,1252,1255,1369,1374,1380,1383,1389,1439,1446,1450,1453,1456,1467,1470,1475,1501,1506,1523,1526,1528,1532,1536,1540,1546,1549,1554,1578,1583,1748,1755,1759,1764,1768,1788,1794,1824,1830,1834,1839,1845,1850,1854,1865,1869,1893,1899,2032,2043,2047,2054,2060,2066,2076,2248,2255,2257,2261,2265,2268,2273,2288,2293,2301,2311,2317,2324,2328,2331,2336,2342,2347,2353,2356,2360,2371,2634,2637,2641,2644,2658,2663,2674,2679,2703,2709,2748,2755,2757,2761,2765,2768,2773,2917,2920,2930,2933,2937,2940,2946,2949,2955,2962,2966,2969,2975,2978,2984,3004,3015,3019,3022,3082,3085,3091,3174,3181,3187,3213,3216,3218,3221,3227,3237,3243,3271,3278,3281,3284,3292,3295,3298,3398],[195,196,197,198,202,203,206],"p",{},"7.1 节解决了\"提示词怎么写\"，本节解决\"提示词送进 AI 之后的世界\"。再精妙的提示词也会被一个物理上限约束——",[199,200,201],"strong",{},"LLM 的上下文窗口（Context Window）","。Claude 系列的上下文窗口虽已扩展到 200K Token 量级，但这并不意味着\"反正窗口够大、随便塞\"。窗口越大，模型越容易出现\"中间忽略\"现象（Lost in the Middle）；调用成本越高，延迟越长；而真实工作流里，",[199,204,205],{},"长会话累积的\"垃圾上下文\"还会损耗模型的判断力","。",[195,208,209,210,213],{},"本节的核心论点是：",[199,211,212],{},"上下文管理不是工程师的可选技能，而是与 AI 协作时代的核心生产力杠杆","——管理得好的工程师在同一会话中能完成 5 倍的工作量、保持 3 倍的输出质量；管理得差的工程师在第三次对话就开始遭遇\"Claude 越来越不专注\"的诡异现象。本节会把上下文管理拆成\"窗口边界 → 内置机制 → 主动策略 → 反模式 → 缓存协同 → 角色协作\"六部分，给出一份可以立即落地的实战指南。",[195,215,216,217,220,221,224],{},"需要先打破一个常见误解：",[199,218,219],{},"上下文窗口大不等于\"塞越多越好\"","。Anthropic、OpenAI、Google 多家公司近两年都做过类似的\"长上下文 benchmark\"，结论一致——",[199,222,223],{},"模型的有效注意力区间通常远小于物理上限","。换句话说，一个 200K Token 的窗口可能只有约 80K Token 的\"高质量利用区\"，剩余的 120K Token 即使被填满，对模型决策的贡献也很有限，甚至会引入\"中间忽略\"等副作用。",[195,226,227,228,231],{},"理解这一点后，\"上下文管理\"就不再是单纯的\"省钱\"问题，而是",[199,229,230],{},"把有限的注意力配额配置在最有价值信息上","的资源调度问题——和操作系统调度 CPU、数据库调度查询执行计划是同类的工程问题。本节后续所有策略都建立在这条认知基础之上：你不是在\"塞数据\"，你是在\"为 AI 安排注意力\"。",[233,234],"hr",{},[236,237,239],"h2",{"id":238},"一为什么上下文管理是-ai-协作的核心约束","一、为什么上下文管理是 AI 协作的核心约束",[241,242,244],"h3",{"id":243},"_11-大模型上下文窗口的物理边界","1.1 大模型上下文窗口的物理边界",[195,246,247],{},"Claude 模型家族的上下文窗口规格大致如下（以 2026 年初 Anthropic 官方文档为准）：",[249,250,251,258,264],"ul",{},[252,253,254,257],"li",{},[199,255,256],{},"Claude Sonnet 4.6 \u002F Opus 4.7","：标准 200K Token，部分企业账户支持 1M Token 的扩展窗口。",[252,259,260,263],{},[199,261,262],{},"Claude Haiku 4.5","：200K Token。",[252,265,266,269],{},[199,267,268],{},"历史版本","：Claude 3.5 Sonnet 也是 200K，Claude 2 系列是 100K。",[195,271,272],{},"200K Token 听起来很大——大约相当于 15 万英文单词，或者 30 万中文字符。换算到代码，差不多是一个中型项目（30-50 个文件、平均 200 行\u002F文件）的全量代码。理论上\"塞下整个项目\"似乎可行。",[195,274,275,276,279,280,283],{},"但",[199,277,278],{},"理论容量 ≠ 有效容量","。Anthropic 官方给出的最佳实践建议——",[199,281,282],{},"核心信息应放在前 20% 与后 20% 的区间内","，因为模型的\"注意力分布\"在长上下文下并非均匀。这意味着 200K 窗口的\"高质量利用区\"可能只有 80K Token 左右。",[195,285,286,289],{},[199,287,288],{},"Token 与字符的换算速查","：",[291,292,293,306],"table",{},[294,295,296],"thead",{},[297,298,299,303],"tr",{},[300,301,302],"th",{},"内容类型",[300,304,305],{},"1K Token 约等于",[307,308,309,318,326,334,342,350],"tbody",{},[297,310,311,315],{},[312,313,314],"td",{},"英文文本",[312,316,317],{},"约 750 词 \u002F 4000-5000 字符",[297,319,320,323],{},[312,321,322],{},"中文文本",[312,324,325],{},"约 500-700 字符（中文字符的 Token 密度更高）",[297,327,328,331],{},[312,329,330],{},"代码（TypeScript）",[312,332,333],{},"约 30-50 行（含空白与注释）",[297,335,336,339],{},[312,337,338],{},"代码（Python）",[312,340,341],{},"约 40-60 行",[297,343,344,347],{},[312,345,346],{},"JSON \u002F YAML",[312,348,349],{},"约 1000-2000 字符（取决于嵌套层级）",[297,351,352,355],{},[312,353,354],{},"日志（结构化）",[312,356,357],{},"约 30-80 条",[195,359,360],{},"工程师在估算\"我这次对话会消耗多少 Token\"时，可以基于这张表做心算。例如让 Claude 读一个 300 行的 TypeScript 文件，约消耗 6-10K Token；让它处理 1000 条日志，约消耗 12-30K Token。养成\"贴文件前先估 Token\"的习惯，能避免大部分窗口溢出问题。",[241,362,364],{"id":363},"_12-上下文成本曲线长上下文的延迟价格与质量损失","1.2 上下文成本曲线——长上下文的延迟、价格与质量损失",[195,366,367],{},"长上下文带来三重成本：",[249,369,370,376,382],{},[252,371,372,375],{},[199,373,374],{},"延迟成本","：上下文越长，模型计算注意力的耗时越长。本人在多个项目观察到，10K Token 的对话首 token 延迟约 1-2 秒，100K Token 上下文后延迟可能升至 5-8 秒，200K 接近极限时延迟可能超过 10 秒。",[252,377,378,381],{},[199,379,380],{},"价格成本","：API 计费按输入 Token 量收费。一段在 50K Token 上下文中重复发送 20 次的对话，比 10K Token 上下文中重复发送的同等对话贵 5 倍。",[252,383,384,387],{},[199,385,386],{},"质量成本","：长上下文中模型的\"注意力稀释\"效应——它需要在更多内容中找到相关信息，错过细节的概率上升。这在涉及精确技术细节的任务（例如调试、代码审查）中尤为明显。",[241,389,391],{"id":390},"_13-llm-的中间忽略现象lost-in-the-middle","1.3 LLM 的\"中间忽略\"现象（Lost in the Middle）",[195,393,394,395,398],{},"学术界的一项著名研究（Liu et al., 2023, \"Lost in the Middle: How Language Models Use Long Contexts\"）发现：",[199,396,397],{},"LLM 在处理长上下文时，对开头和结尾信息的关注显著高于中间","。具体表现：",[249,400,401,404,407],{},[252,402,403],{},"当关键信息位于上下文的开头时，模型回答的准确率最高（约 75%）。",[252,405,406],{},"当关键信息位于上下文的中间时，准确率最低（约 50%）。",[252,408,409],{},"当关键信息位于上下文的末尾时，准确率次高（约 65%）。",[195,411,412],{},"这个 U 型曲线在多个模型（GPT-4、Claude、Llama）中都被观察到。它的实战意义：",[249,414,415,420,426],{},[252,416,417,206],{},[199,418,419],{},"重要信息要么放最前，要么放最后",[252,421,422,425],{},[199,423,424],{},"避免\"夹心饼\"格式","——把核心需求埋在 200 行历史对话中间。",[252,427,428,206],{},[199,429,430],{},"每次新会话开始时，主动重申核心目标与约束",[195,432,433,289],{},[199,434,435],{},"\"位置效应\"在长会话中的具体表现",[249,437,438,441,444],{},[252,439,440],{},"工程师在第 1 轮迭代设定的\"必须用 TypeScript strict 模式\"，在第 50 轮迭代时可能被忽略——这条规则已经位于上下文的\"中间深处\"。",[252,442,443],{},"解决方案是把\"持久性强约束\"放进 CLAUDE.md，CLAUDE.md 在每轮迭代都重新注入到上下文最前端。",[252,445,446],{},"临时性约束（\"这一轮迭代不要改 src\u002Forder\u002F\"）则放在最近一轮 prompt 的最前或最后。",[195,448,449,452],{},[199,450,451],{},"用 prompt 结构对抗位置效应","：在每次重要 prompt 中显式重申关键约束，例如：",[454,455,460],"pre",{"className":456,"code":458,"language":459},[457],"language-text","**核心约束（请优先遵守）**：\n- 不要修改 src\u002Fauth\u002F，本轮只关心 src\u002Fuser\u002F\n- 测试覆盖率必须 ≥ 90%\n- 错误必须继承 BaseError\n\n[详细任务描述]\n\n**重要回顾（结尾再次强调）**：\n- 严禁 try\u002Fcatch 内静默吞错\n- 任何 schema 变更需要 plan 模式审批\n","text",[461,462,458],"code",{"__ignoreMap":463},"",[195,465,466],{},"把核心约束分别放在开头与结尾，能利用模型的\"首尾注意力偏好\"形成\"双重保险\"。这种\"sandwiching\"策略是长上下文工作中行之有效的实战技巧。",[233,468],{},[236,470,472],{"id":471},"二claude-code-的内置上下文机制","二、Claude Code 的内置上下文机制",[241,474,476],{"id":475},"_21-自动压缩compact触发时机与原理","2.1 自动压缩（Compact）触发时机与原理",[195,478,479],{},"Claude Code 内置了\"自动压缩\"机制——当上下文接近窗口上限时，系统会自动压缩历史对话，把详细对话替换为摘要，腾出空间给新对话。",[195,481,482,289],{},[199,483,484],{},"触发条件",[249,486,487,490,493],{},[252,488,489],{},"上下文累积到约 80% 窗口容量时进入预警。",[252,491,492],{},"累积到约 95% 时强制压缩。",[252,494,495,496,206],{},"工程师可以主动触发：",[461,497,498],{},"\u002Fcompact",[195,500,501,289],{},[199,502,503],{},"压缩策略",[249,505,506,509,512],{},[252,507,508],{},"保留最近 N 轮完整对话（让 Claude 仍能记住\"你刚刚要求做什么\"）。",[252,510,511],{},"早期对话压缩为关键决策摘要（\"你定义了 User 类型有 4 个字段、要求所有错误继承 BaseError\"）。",[252,513,514],{},"工具调用结果按需保留（最近的保留、远期的丢弃）。",[195,516,517,289],{},[199,518,519],{},"注意事项",[249,521,522,525,532],{},[252,523,524],{},"压缩本身会消耗 Token（需要让模型生成摘要）。",[252,526,527,528,531],{},"压缩后的摘要可能丢失某些细节——重要决策应在压缩前主动写到 ",[461,529,530],{},".claude\u002Fstate.md"," 或 CLAUDE.md。",[252,533,534],{},"频繁压缩说明\"会话开太久了\"——考虑结束本次会话、开新会话。",[195,536,537,540],{},[199,538,539],{},"压缩前 vs 压缩后的质量对比","：本人在多个项目里观察到，会话经过一次自动压缩后，Claude 的输出质量在以下方面会明显下降——",[249,542,543,549,558],{},[252,544,545,548],{},[199,546,547],{},"代码风格一致性","：压缩前 Claude 严格遵守项目命名规范（例如 camelCase vs snake_case），压缩后偶尔混用。这是因为风格细节往往藏在早期\"已被压缩\"的具体例子中。",[252,550,551,554,555,206],{},[199,552,553],{},"错误处理一致性","：压缩前 Claude 记得\"所有错误继承 BaseError\"，压缩后可能直接 ",[461,556,557],{},"throw new Error()",[252,559,560,563,564,567],{},[199,561,562],{},"测试结构一致性","：压缩前 Claude 知道\"测试夹具放在 ",[461,565,566],{},"__fixtures__\u002F"," 目录\"，压缩后可能放到错误路径。",[195,569,570,571,574],{},"应对方案是",[199,572,573],{},"把\"高频共识\"主动搬进 CLAUDE.md","——CLAUDE.md 在每次会话开始注入，不会被压缩。压缩损失的是\"会话内积累\"，CLAUDE.md 沉淀的是\"团队共识\"。两者的角色不能混淆。",[241,576,578],{"id":577},"_22-claudemd-的注入机制","2.2 CLAUDE.md 的注入机制",[195,580,581],{},"CLAUDE.md 是 Claude Code 在会话开始时自动注入的\"项目记忆\"。注入规则：",[249,583,584,590,600],{},[252,585,586,589],{},[199,587,588],{},"仓库级 CLAUDE.md","（项目根目录）：每次会话开头注入。",[252,591,592,595,596,599],{},[199,593,594],{},"用户级 CLAUDE.md","（",[461,597,598],{},"~\u002F.claude\u002FCLAUDE.md","）：跨项目注入，先于仓库级。",[252,601,602,605],{},[199,603,604],{},"嵌套 CLAUDE.md","（子目录中）：当 Claude 操作该子目录时按需注入。",[195,607,608,289],{},[199,609,610],{},"Token 预算",[249,612,613,616,619],{},[252,614,615],{},"CLAUDE.md 占据的 Token 直接吃掉上下文窗口。",[252,617,618],{},"一份 500 行的 CLAUDE.md 大约是 5K-10K Token——占 200K 窗口的 5%。",[252,620,621],{},"一份 2000 行的 CLAUDE.md 可能吃掉 20-30K Token——已是 10%-15%。",[195,623,624,289],{},[199,625,626],{},"最佳实践",[249,628,629,632,635],{},[252,630,631],{},"CLAUDE.md 控制在 200-500 行之间。",[252,633,634],{},"把\"具体规则\"放进来，把\"教学性内容\"放到外部 wiki。",[252,636,637],{},"每月做一次\"CLAUDE.md 减法\"——删除已被 Hook \u002F settings.json 自动化的规则。",[241,639,641],{"id":640},"_23-工具调用结果的截断与清理","2.3 工具调用结果的截断与清理",[195,643,644,645,648],{},"Claude Code 会把每次工具调用的结果（Bash 输出、文件内容、grep 匹配）放进上下文。这些结果的大小不可预测——一次 ",[461,646,647],{},"cat large-file.log"," 可能瞬间塞入 100K Token。",[195,650,651,289],{},[199,652,653],{},"应对策略",[454,655,659],{"className":656,"code":657,"language":658,"meta":463,"style":463},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# 反模式：直接读大文件\ncat \u002Fvar\u002Flog\u002Fapp.log\n\n# 正确：截取相关片段\ngrep \"ERROR\" \u002Fvar\u002Flog\u002Fapp.log | tail -50\n\n# 或先聚合再读\nawk '\u002FERROR\u002F {count++} END {print count}' \u002Fvar\u002Flog\u002Fapp.log\n","bash",[461,660,661,670,681,688,694,722,727,733],{"__ignoreMap":463},[662,663,666],"span",{"class":664,"line":665},"line",1,[662,667,669],{"class":668},"sHwdD","# 反模式：直接读大文件\n",[662,671,673,677],{"class":664,"line":672},2,[662,674,676],{"class":675},"sBMFI","cat",[662,678,680],{"class":679},"sfazB"," \u002Fvar\u002Flog\u002Fapp.log\n",[662,682,684],{"class":664,"line":683},3,[662,685,687],{"emptyLinePlaceholder":686},true,"\n",[662,689,691],{"class":664,"line":690},4,[662,692,693],{"class":668},"# 正确：截取相关片段\n",[662,695,697,700,704,707,710,713,716,719],{"class":664,"line":696},5,[662,698,699],{"class":675},"grep",[662,701,703],{"class":702},"sMK4o"," \"",[662,705,706],{"class":679},"ERROR",[662,708,709],{"class":702},"\"",[662,711,712],{"class":679}," \u002Fvar\u002Flog\u002Fapp.log",[662,714,715],{"class":702}," |",[662,717,718],{"class":675}," tail",[662,720,721],{"class":679}," -50\n",[662,723,725],{"class":664,"line":724},6,[662,726,687],{"emptyLinePlaceholder":686},[662,728,730],{"class":664,"line":729},7,[662,731,732],{"class":668},"# 或先聚合再读\n",[662,734,736,739,742,745,748],{"class":664,"line":735},8,[662,737,738],{"class":675},"awk",[662,740,741],{"class":702}," '",[662,743,744],{"class":679},"\u002FERROR\u002F {count++} END {print count}",[662,746,747],{"class":702},"'",[662,749,680],{"class":679},[195,751,752,753,756,757,756,760,756,763,766],{},"让 Claude 在读文件前先做\"预聚合\"——",[461,754,755],{},"wc -l","、",[461,758,759],{},"head -20",[461,761,762],{},"tail -50",[461,764,765],{},"grep -c","——避免一次性吞下全文。Claude 接收到聚合数据后再决定是否需要详细内容。",[195,768,769,772,773,776,777,289],{},[199,770,771],{},"工具结果的\"自适应裁剪\"","：Claude Code 内部对超大工具输出会自动截断（通常截断到一定 Token 上限）。但",[199,774,775],{},"截断本身可能损失关键信息","——例如截断了恰好包含错误信号的那一行。最稳妥的做法是工程师",[199,778,779],{},"在执行命令前就把输出限定在合理范围",[291,781,782,795],{},[294,783,784],{},[297,785,786,789,792],{},[300,787,788],{},"命令模式",[300,790,791],{},"反模式",[300,793,794],{},"推荐做法",[307,796,797,816,831,850,869],{},[297,798,799,802,807],{},[312,800,801],{},"看日志",[312,803,804],{},[461,805,806],{},"cat app.log",[312,808,809,812,813],{},[461,810,811],{},"tail -100 app.log"," 或 ",[461,814,815],{},"grep ERROR app.log | tail -50",[297,817,818,821,826],{},[312,819,820],{},"看依赖",[312,822,823],{},[461,824,825],{},"cat package-lock.json",[312,827,828],{},[461,829,830],{},"jq '.packages | keys | length' package-lock.json",[297,832,833,836,841],{},[312,834,835],{},"看代码库",[312,837,838],{},[461,839,840],{},"find . -name '*.ts'",[312,842,843,812,846,849],{},[461,844,845],{},"find . -name '*.ts' | head -50",[461,847,848],{},"find . -name '*.ts' | wc -l"," 先聚合",[297,851,852,855,860],{},[312,853,854],{},"看 git diff",[312,856,857],{},[461,858,859],{},"git diff",[312,861,862,865,866],{},[461,863,864],{},"git diff --stat"," 先看摘要、再针对性 ",[461,867,868],{},"git diff \u003Cfile>",[297,870,871,874,879],{},[312,872,873],{},"看进程",[312,875,876],{},[461,877,878],{},"ps aux",[312,880,881],{},[461,882,883],{},"ps aux | grep node",[195,885,886],{},"工程师把这些\"裁剪习惯\"内化为肌肉记忆后，工具调用的 Token 消耗能降到合理水平。",[241,888,890],{"id":889},"_24-会话内-plan-文件tasksmemory-的角色","2.4 会话内 Plan 文件、Tasks、Memory 的角色",[195,892,893],{},"Claude Code 提供了几种\"会话级持久化\"工具，它们各自在上下文管理中扮演不同角色：",[249,895,896,905,911],{},[252,897,898,595,901,904],{},[199,899,900],{},"Plan 文件",[461,902,903],{},".claude\u002Fplans\u002F\u003Cplan-name>.md","）：长期任务的执行计划，可跨会话引用。",[252,906,907,910],{},[199,908,909],{},"Tasks","（TaskCreate \u002F TaskUpdate）：当前会话内的任务追踪，会话结束后清空。",[252,912,913,595,916,919],{},[199,914,915],{},"Memory",[461,917,918],{},"MEMORY.md","）：跨会话长期记忆，在新会话开始时自动加载。",[195,921,922,289],{},[199,923,924],{},"用法对照",[291,926,927,940],{},[294,928,929],{},[297,930,931,934,937],{},[300,932,933],{},"信息类型",[300,935,936],{},"推荐工具",[300,938,939],{},"跨会话存活？",[307,941,942,952,962,971,980],{},[297,943,944,947,949],{},[312,945,946],{},"当前要做的子任务",[312,948,909],{},[312,950,951],{},"否",[297,953,954,957,959],{},[312,955,956],{},"多轮迭代的功能蓝图",[312,958,900],{},[312,960,961],{},"是",[297,963,964,967,969],{},[312,965,966],{},"团队约定",[312,968,108],{},[312,970,961],{},[297,972,973,976,978],{},[312,974,975],{},"用户偏好",[312,977,915],{},[312,979,961],{},[297,981,982,985,989],{},[312,983,984],{},"临时上下文（本次重构涉及哪些文件）",[312,986,987],{},[461,988,530],{},[312,990,991],{},"是（手动维护）",[195,993,994],{},"合理使用这些工具能避免\"把所有信息都塞在对话中\"的窗口浪费。",[241,996,998],{"id":997},"_25-clear-与开新会话边界判断","2.5 \u002Fclear 与开新会话——边界判断",[195,1000,1001,1004,1005,1008],{},[461,1002,1003],{},"\u002Fclear"," 清空当前对话历史但保留会话进程。",[199,1006,1007],{},"开新会话","则完全重启——会重新注入 CLAUDE.md、重新计算 Memory。",[195,1010,1011,289],{},[199,1012,1013,1014],{},"何时用 ",[461,1015,1003],{},[249,1017,1018,1021,1024],{},[252,1019,1020],{},"当前任务彻底完成、要切换到完全无关的下一个任务。",[252,1022,1023],{},"上下文中累积了大量调试日志、希望\"清场\"开始下一段干净对话。",[252,1025,1026],{},"已经触发了一次自动压缩、希望避免再次压缩损失细节。",[195,1028,1029,289],{},[199,1030,1031],{},"何时开新会话",[249,1033,1034,1037,1040,1043],{},[252,1035,1036],{},"工作目录改变（要去另一个项目）。",[252,1038,1039],{},"上一会话的\"风格\"已经偏离（例如本来在写代码，后来一直在闲聊）。",[252,1041,1042],{},"CLAUDE.md \u002F Skills 有更新——需要新会话才能加载新版本。",[252,1044,1045],{},"跨日工作的自然分隔点（每天上午\u002F下午）。",[233,1047],{},[236,1049,1051],{"id":1050},"三主动的上下文管理策略","三、主动的上下文管理策略",[241,1053,1055],{"id":1054},"_31-任务级别拆分","3.1 任务级别拆分",[195,1057,1058,1059,206],{},"把\"功能\"拆成\"故事\"再拆成\"任务\"，每个任务对应一次完整的会话。这与 6.3 节\"多轮迭代\"的策略一致——",[199,1060,1061],{},"会话边界与迭代单元应当对齐",[195,1063,1064],{},"错误示范：一次会话里写完整个用户管理模块（数据模型、CRUD、校验、测试、权限），然后调试 Bug，然后写文档。会话长度可能突破 100K Token，质量与速度都会下降。",[195,1066,1067],{},"正确示范：一次会话只做一件事——例如\"为 User 类型加 phoneNumber 字段并补单元测试\"。完成后开新会话做下一件。",[195,1069,1070,1073,1074,1077],{},[199,1071,1072],{},"任务拆分的\"15 分钟原则\"","：本人多年实战总结的一条经验——",[199,1075,1076],{},"单次会话应当能在 15-90 分钟内完成主要任务","。低于 15 分钟说明任务过小（开会话的固定成本不划算），高于 90 分钟说明任务过大（上下文开始累积、注意力开始稀释）。15-90 分钟是会话效率的\"甜蜜区\"。",[195,1079,1080],{},"如果某个功能预计需要 3 小时才能完成，应该把它拆成 3 段：",[249,1082,1083,1089,1095],{},[252,1084,1085,1088],{},[199,1086,1087],{},"段 1（30-45 分钟）","：数据模型 + 核心 CRUD",[252,1090,1091,1094],{},[199,1092,1093],{},"段 2（30-45 分钟）","：业务规则 + 校验 + 错误处理",[252,1096,1097,1100],{},[199,1098,1099],{},"段 3（30-45 分钟）","：单元测试 + 集成测试 + 文档",[195,1102,1103,1104,1106,1107,1110],{},"每段独立一个会话，段与段之间通过 ",[461,1105,530],{}," 传递关键决策。",[199,1108,1109],{},"这种拆分不是因为 Claude 做不了 3 小时的工作，而是因为人类工程师在 90 分钟后审查质量会下降","——任务拆分本质上服务的是人类，而不是 AI。",[241,1112,1114],{"id":1113},"_32-上下文预算意识","3.2 上下文预算意识",[195,1116,1117],{},"每次会话开始时给自己一个\"上下文预算\"。例如：",[249,1119,1120,1126,1132],{},[252,1121,1122,1125],{},[199,1123,1124],{},"小任务","（5K Token 预算）：单文件修改、补一个测试、修复一个简单 bug。",[252,1127,1128,1131],{},[199,1129,1130],{},"中任务","（20K Token 预算）：跨文件重构、新增一个 endpoint、补完整个测试套件。",[252,1133,1134,1137],{},[199,1135,1136],{},"大任务","（50K Token 预算）：实现一个完整功能、做一次大型重构。",[195,1139,1140],{},"任何超过 50K 的预算就应该警觉——很可能是任务边界没拆好。",[195,1142,1143,1144,1147],{},"预算意识的另一个表现是",[199,1145,1146],{},"主动把\"无关历史\"清掉","。例如调试到一半发现走错了方向，与其继续在错误路径上叠加更多对话，不如：",[454,1149,1152],{"className":1150,"code":1151,"language":459},[457],"当前调试方向走偏了，让我重新开始。请忽略之前关于 X 的所有讨论，\n回到 commit abc123 的状态。我重新描述需求：[简短重述]。\n",[461,1153,1151],{"__ignoreMap":463},[195,1155,1156],{},"这种\"软重置\"虽然没真清空 Token，但 Claude 会把注意力聚焦到新描述上，远好于继续在错误路径上累加。",[195,1158,1159,1162],{},[199,1160,1161],{},"预算意识的\"四道闸门\"","：实战中可以设立四道渐进式的提示，确保自己不会在不知不觉中超预算——",[1164,1165,1166,1172,1181,1187],"ol",{},[252,1167,1168,1171],{},[199,1169,1170],{},"第一道闸门：50% 预算消耗","——警觉但继续。问自己\"我的核心任务完成了一半吗？\"。如果远未完成，说明任务边界估错了，需要主动收窄。",[252,1173,1174,1177,1178,1180],{},[199,1175,1176],{},"第二道闸门：70% 预算消耗","——主动归档进度。把当前已完成部分的关键决策写入 ",[461,1179,530],{},"，避免后续压缩损失。",[252,1182,1183,1186],{},[199,1184,1185],{},"第三道闸门：85% 预算消耗","——准备开新会话。让 Claude 输出\"下一会话的接力清单\"——具体到下一个动作是什么、需要什么前置条件。",[252,1188,1189,1192,1193,206],{},[199,1190,1191],{},"第四道闸门：95% 预算消耗","——立即结束。即使任务未完成，也应该结束当前会话、开新会话继续。",[199,1194,1195],{},"继续硬撑会让接下来的对话质量急剧下降",[195,1197,1198],{},"四道闸门的作用是让\"上下文预算\"从抽象目标变成可操作的检查点。每一道闸门都对应一个具体动作——警觉、归档、接力、结束——而不是模糊的\"小心点\"。",[241,1200,1202],{"id":1201},"_33-用-skills-把高频信息固化","3.3 用 Skills 把高频信息固化",[195,1204,1205],{},"Skills 是 Token 效率的优化器。一个反复使用的 prompt 模板（\"写 CRUD repository、含校验、含测试\"）每次对话都重复输入，会无意义地消耗 Token。",[195,1207,1208],{},"封装为 Skill 后：",[454,1210,1212],{"className":656,"code":1211,"language":658,"meta":463,"style":463},"# 调用 Skill 只需一行\n\u002Fcrud-repository Order\n\n# 而不是每次重写完整 prompt\n\"请为 Order 实体生成 CRUD repository，含 Zod 校验、含 Vitest 测试...\"\n",[461,1213,1214,1219,1227,1231,1236],{"__ignoreMap":463},[662,1215,1216],{"class":664,"line":665},[662,1217,1218],{"class":668},"# 调用 Skill 只需一行\n",[662,1220,1221,1224],{"class":664,"line":672},[662,1222,1223],{"class":675},"\u002Fcrud-repository",[662,1225,1226],{"class":679}," Order\n",[662,1228,1229],{"class":664,"line":683},[662,1230,687],{"emptyLinePlaceholder":686},[662,1232,1233],{"class":664,"line":690},[662,1234,1235],{"class":668},"# 而不是每次重写完整 prompt\n",[662,1237,1238],{"class":664,"line":696},[662,1239,1240],{"class":675},"\"请为 Order 实体生成 CRUD repository，含 Zod 校验、含 Vitest 测试...\"\n",[195,1242,1243,1244,1247],{},"Skill 的描述内容只会在 Claude 决定使用该 Skill 时才被加载到上下文，平时不占据 Token。",[199,1245,1246],{},"这条机制让 Skills 既扩展了能力又节省了上下文","——是 Claude Code 设计中最巧妙的取舍之一。",[241,1249,1251],{"id":1250},"_34-用-claudestatemd-跨会话传递关键决策","3.4 用 .claude\u002Fstate.md 跨会话传递关键决策",[195,1253,1254],{},"复杂项目跨会话工作时，主动维护一份\"状态摘要\"：",[454,1256,1260],{"className":1257,"code":1258,"language":1259,"meta":463,"style":463},"language-markdown shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# .claude\u002Fstate.md\n\n## 当前工作焦点（更新于 2026-04-26）\n- 正在做：用户管理模块的 6 轮迭代中的第 4 轮（补单元测试）\n- 已完成：第 1-3 轮（类型、CRUD、校验）\n- 下一步：第 5 轮业务规则、第 6 轮性能优化\n\n## 关键决策（不要 Claude 重新讨论）\n- User.email 必须唯一（基于业务方决定）\n- 错误处理：所有自定义错误继承自 BaseError\n- 测试框架：Vitest（不要切换到 Jest）\n\n## 当前 Pending 项\n- 待办：增加 actorRole 参数后，需要批量更新调用方（约 12 处）\n- 风险：第 4 轮单元测试覆盖率目标 90%，目前 73%\n","markdown",[461,1261,1262,1270,1274,1282,1291,1298,1305,1309,1316,1324,1332,1340,1345,1353,1361],{"__ignoreMap":463},[662,1263,1264,1267],{"class":664,"line":665},[662,1265,1266],{"class":702},"# ",[662,1268,1269],{"class":675},".claude\u002Fstate.md\n",[662,1271,1272],{"class":664,"line":672},[662,1273,687],{"emptyLinePlaceholder":686},[662,1275,1276,1279],{"class":664,"line":683},[662,1277,1278],{"class":702},"## ",[662,1280,1281],{"class":675},"当前工作焦点（更新于 2026-04-26）\n",[662,1283,1284,1287],{"class":664,"line":690},[662,1285,1286],{"class":702},"-",[662,1288,1290],{"class":1289},"sTEyZ"," 正在做：用户管理模块的 6 轮迭代中的第 4 轮（补单元测试）\n",[662,1292,1293,1295],{"class":664,"line":696},[662,1294,1286],{"class":702},[662,1296,1297],{"class":1289}," 已完成：第 1-3 轮（类型、CRUD、校验）\n",[662,1299,1300,1302],{"class":664,"line":724},[662,1301,1286],{"class":702},[662,1303,1304],{"class":1289}," 下一步：第 5 轮业务规则、第 6 轮性能优化\n",[662,1306,1307],{"class":664,"line":729},[662,1308,687],{"emptyLinePlaceholder":686},[662,1310,1311,1313],{"class":664,"line":735},[662,1312,1278],{"class":702},[662,1314,1315],{"class":675},"关键决策（不要 Claude 重新讨论）\n",[662,1317,1319,1321],{"class":664,"line":1318},9,[662,1320,1286],{"class":702},[662,1322,1323],{"class":1289}," User.email 必须唯一（基于业务方决定）\n",[662,1325,1327,1329],{"class":664,"line":1326},10,[662,1328,1286],{"class":702},[662,1330,1331],{"class":1289}," 错误处理：所有自定义错误继承自 BaseError\n",[662,1333,1335,1337],{"class":664,"line":1334},11,[662,1336,1286],{"class":702},[662,1338,1339],{"class":1289}," 测试框架：Vitest（不要切换到 Jest）\n",[662,1341,1343],{"class":664,"line":1342},12,[662,1344,687],{"emptyLinePlaceholder":686},[662,1346,1348,1350],{"class":664,"line":1347},13,[662,1349,1278],{"class":702},[662,1351,1352],{"class":675},"当前 Pending 项\n",[662,1354,1356,1358],{"class":664,"line":1355},14,[662,1357,1286],{"class":702},[662,1359,1360],{"class":1289}," 待办：增加 actorRole 参数后，需要批量更新调用方（约 12 处）\n",[662,1362,1364,1366],{"class":664,"line":1363},15,[662,1365,1286],{"class":702},[662,1367,1368],{"class":1289}," 风险：第 4 轮单元测试覆盖率目标 90%，目前 73%\n",[195,1370,1371,1372,289],{},"新会话开始时让 Claude 读 ",[461,1373,530],{},[454,1375,1378],{"className":1376,"code":1377,"language":459},[457],"请先读 .claude\u002Fstate.md 了解当前项目状态，然后开始第 4 轮迭代的剩余工作。\n",[461,1379,1377],{"__ignoreMap":463},[195,1381,1382],{},"这种\"工作状态外部化\"让 Claude 不再需要从零理解上下文，会话效率显著提升。",[195,1384,1385,1388],{},[199,1386,1387],{},"state.md 与 CLAUDE.md 的角色分工","：两者经常被混淆，但功能完全不同——",[291,1390,1391,1407],{},[294,1392,1393],{},[297,1394,1395,1398,1401,1404],{},[300,1396,1397],{},"文件",[300,1399,1400],{},"角色",[300,1402,1403],{},"更新频率",[300,1405,1406],{},"适合内容",[307,1408,1409,1424],{},[297,1410,1411,1415,1418,1421],{},[312,1412,1413],{},[461,1414,108],{},[312,1416,1417],{},"项目长期共识",[312,1419,1420],{},"月级别",[312,1422,1423],{},"团队铁律、命名规范、永久约束",[297,1425,1426,1430,1433,1436],{},[312,1427,1428],{},[461,1429,530],{},[312,1431,1432],{},"临时工作焦点",[312,1434,1435],{},"会话级别",[312,1437,1438],{},"当前 sprint 焦点、待办、风险",[195,1440,1441,1442,1445],{},"如果把会话级的临时信息写入 CLAUDE.md，会污染项目长期记忆；反之，把项目长期共识只写在 state.md，新人会找不到。",[199,1443,1444],{},"两者各司其职、互不替代","。一个健康的项目会同时维护两份文件，CLAUDE.md 半年才大改一次、state.md 每天都在更新。",[241,1447,1449],{"id":1448},"_35-子代理subagent把局部探索隔离在独立上下文","3.5 子代理（Subagent）：把局部探索隔离在独立上下文",[195,1451,1452],{},"Claude Code 提供 Agent 工具——派出一个独立的子代理处理某个子任务，子代理拥有自己的上下文窗口，结果汇总后才返回主对话。",[195,1454,1455],{},"适合场景：",[249,1457,1458,1461,1464],{},[252,1459,1460],{},"探索性任务（\"帮我搜遍整个代码库找到所有调用 X 的地方\"）",[252,1462,1463],{},"局部研究（\"读一下 docs\u002F 目录下所有文档总结某个主题\"）",[252,1465,1466],{},"高 Token 消耗任务（\"分析这个 5 万行的日志找出错误模式\"）",[195,1468,1469],{},"通过子代理隔离，主对话保持精炼——Claude 只看到\"子代理的结论\"而不是\"子代理的工作过程\"。",[195,1471,1472,289],{},[199,1473,1474],{},"子代理设计的\"四原则\"",[1164,1476,1477,1483,1489,1495],{},[252,1478,1479,1482],{},[199,1480,1481],{},"任务边界明确","：子代理的任务应当能用一句话描述，并且有明确的产出物（一份报告、一个文件、一组 ID）。模糊任务（\"帮我研究一下这个项目\"）容易让子代理产出冗长无重点的结论。",[252,1484,1485,1488],{},[199,1486,1487],{},"输入足够丰富","：子代理不会自动继承主对话的上下文，需要在派遣时把所有必要信息写入 prompt。这反而是好事——它强迫工程师明确\"这个任务到底需要什么背景\"。",[252,1490,1491,1494],{},[199,1492,1493],{},"输出结构化","：要求子代理返回 JSON \u002F Markdown 表格 \u002F 严格列表。结构化输出便于主对话直接消化，避免再让主对话花 Token \"解读\"子代理的散文式回答。",[252,1496,1497,1500],{},[199,1498,1499],{},"失败可观测","：子代理偶尔会因 socket 错误、超时、误解而失败。主对话应当能识别这种失败并提供 fallback——例如\"如果子代理 N 分钟内未返回，主对话亲自接手\"。",[195,1502,1503,289],{},[199,1504,1505],{},"子代理与主对话的 Token 经济学",[249,1507,1508,1514],{},[252,1509,1510,1513],{},[199,1511,1512],{},"不用子代理","：5 万行日志 × 估算 50K Token 直接进主对话，加上分析对话 = 约 80K Token。后续对话窗口紧张。",[252,1515,1516,1519,1520,206],{},[199,1517,1518],{},"用子代理","：子代理在它自己的 200K 窗口里处理 50K Token、返回 1K Token 的摘要给主对话。主对话只消耗 1K Token。",[199,1521,1522],{},"节省 79K Token",[195,1524,1525],{},"这条经济学在多个场景下都成立——大型代码库探索、跨多个文件的模式查找、长文档的总结提取——都应当优先派子代理处理。",[233,1527],{},[236,1529,1531],{"id":1530},"四典型上下文反模式与挽救","四、典型上下文反模式与挽救",[241,1533,1535],{"id":1534},"_41-一口气贴大段日志数据导致瞬间溢出","4.1 一口气贴大段日志\u002F数据导致瞬间溢出",[195,1537,1538,289],{},[199,1539,791],{},[454,1541,1544],{"className":1542,"code":1543,"language":459},[457],"[把 5 万行日志直接粘贴进 prompt]\n请帮我分析为什么有错误。\n",[461,1545,1543],{"__ignoreMap":463},[195,1547,1548],{},"后果：单次输入瞬间吃掉 50K+ Token，剩余窗口所剩无几，后续对话很快触发自动压缩。",[195,1550,1551,289],{},[199,1552,1553],{},"挽救",[249,1555,1556,1566,1572],{},[252,1557,1558,1561,1562,1565],{},[199,1559,1560],{},"预聚合","：先 ",[461,1563,1564],{},"grep ERROR | tail -100"," 再贴。",[252,1567,1568,1571],{},[199,1569,1570],{},"派子代理","：让 subagent 处理大日志、返回摘要。",[252,1573,1574,1577],{},[199,1575,1576],{},"分批分析","：把日志拆成 5 个 1 万行的批次，每批独立对话分析。",[195,1579,1580,289],{},[199,1581,1582],{},"实战示例：日志分析的\"三步漏斗\"",[454,1584,1586],{"className":656,"code":1585,"language":658,"meta":463,"style":463},"# 步骤 1：宏观聚合\ngrep -cE 'ERROR|WARN|FATAL' \u002Fvar\u002Flog\u002Fapp.log\n# 输出：ERROR: 1247 \u002F WARN: 5621 \u002F FATAL: 3\n\n# 步骤 2：按类型分组\ngrep -E 'ERROR|FATAL' \u002Fvar\u002Flog\u002Fapp.log \\\n  | awk -F': ' '{print $3}' \\\n  | sort | uniq -c | sort -rn | head -10\n# 输出：342 Connection timeout\n#       128 Database lock\n#       89  OAuth token expired\n#       ...\n\n# 步骤 3：拿最多的 ERROR 的 5 个具体样本\ngrep \"Connection timeout\" \u002Fvar\u002Flog\u002Fapp.log | head -5\n",[461,1587,1588,1593,1609,1614,1618,1623,1642,1669,1699,1704,1709,1714,1719,1723,1728],{"__ignoreMap":463},[662,1589,1590],{"class":664,"line":665},[662,1591,1592],{"class":668},"# 步骤 1：宏观聚合\n",[662,1594,1595,1597,1600,1602,1605,1607],{"class":664,"line":672},[662,1596,699],{"class":675},[662,1598,1599],{"class":679}," -cE",[662,1601,741],{"class":702},[662,1603,1604],{"class":679},"ERROR|WARN|FATAL",[662,1606,747],{"class":702},[662,1608,680],{"class":679},[662,1610,1611],{"class":664,"line":683},[662,1612,1613],{"class":668},"# 输出：ERROR: 1247 \u002F WARN: 5621 \u002F FATAL: 3\n",[662,1615,1616],{"class":664,"line":690},[662,1617,687],{"emptyLinePlaceholder":686},[662,1619,1620],{"class":664,"line":696},[662,1621,1622],{"class":668},"# 步骤 2：按类型分组\n",[662,1624,1625,1627,1630,1632,1635,1637,1639],{"class":664,"line":724},[662,1626,699],{"class":675},[662,1628,1629],{"class":679}," -E",[662,1631,741],{"class":702},[662,1633,1634],{"class":679},"ERROR|FATAL",[662,1636,747],{"class":702},[662,1638,712],{"class":679},[662,1640,1641],{"class":1289}," \\\n",[662,1643,1644,1647,1650,1653,1655,1658,1660,1662,1665,1667],{"class":664,"line":729},[662,1645,1646],{"class":702},"  |",[662,1648,1649],{"class":675}," awk",[662,1651,1652],{"class":679}," -F",[662,1654,747],{"class":702},[662,1656,1657],{"class":679},": ",[662,1659,747],{"class":702},[662,1661,741],{"class":702},[662,1663,1664],{"class":679},"{print $3}",[662,1666,747],{"class":702},[662,1668,1641],{"class":1289},[662,1670,1671,1673,1676,1678,1681,1684,1686,1688,1691,1693,1696],{"class":664,"line":735},[662,1672,1646],{"class":702},[662,1674,1675],{"class":675}," sort",[662,1677,715],{"class":702},[662,1679,1680],{"class":675}," uniq",[662,1682,1683],{"class":679}," -c",[662,1685,715],{"class":702},[662,1687,1675],{"class":675},[662,1689,1690],{"class":679}," -rn",[662,1692,715],{"class":702},[662,1694,1695],{"class":675}," head",[662,1697,1698],{"class":679}," -10\n",[662,1700,1701],{"class":664,"line":1318},[662,1702,1703],{"class":668},"# 输出：342 Connection timeout\n",[662,1705,1706],{"class":664,"line":1326},[662,1707,1708],{"class":668},"#       128 Database lock\n",[662,1710,1711],{"class":664,"line":1334},[662,1712,1713],{"class":668},"#       89  OAuth token expired\n",[662,1715,1716],{"class":664,"line":1342},[662,1717,1718],{"class":668},"#       ...\n",[662,1720,1721],{"class":664,"line":1347},[662,1722,687],{"emptyLinePlaceholder":686},[662,1724,1725],{"class":664,"line":1355},[662,1726,1727],{"class":668},"# 步骤 3：拿最多的 ERROR 的 5 个具体样本\n",[662,1729,1730,1732,1734,1737,1739,1741,1743,1745],{"class":664,"line":1363},[662,1731,699],{"class":675},[662,1733,703],{"class":702},[662,1735,1736],{"class":679},"Connection timeout",[662,1738,709],{"class":702},[662,1740,712],{"class":679},[662,1742,715],{"class":702},[662,1744,1695],{"class":675},[662,1746,1747],{"class":679}," -5\n",[195,1749,1750,1751,1754],{},"把这三步的输出（合计可能不到 2K Token）贴给 Claude 让它分析。",[199,1752,1753],{},"日志分析的有效信号往往集中在 1% 不到的内容里","——其余 99% 是噪音，强迫塞给 Claude 反而稀释它的注意力。",[241,1756,1758],{"id":1757},"_42-长会话累积claude-已经搞混了","4.2 长会话累积——Claude 已经搞混了",[195,1760,1761,1763],{},[199,1762,791],{},"：在同一会话里来回修改 src\u002Fuser.ts、src\u002Forder.ts、src\u002Fbilling.ts，几小时后 Claude 输出的代码开始混淆——把订单的字段写到了用户上。",[195,1765,1766,289],{},[199,1767,1553],{},[249,1769,1770,1776,1782],{},[252,1771,1772,1775],{},[199,1773,1774],{},"会话切换","：每次主题切换主动开新会话。",[252,1777,1778,1781],{},[199,1779,1780],{},"强制状态摘要","：让 Claude 每 10 轮迭代输出\"我现在在做哪个文件、哪个功能、上一步是什么\"。",[252,1783,1784,1787],{},[199,1785,1786],{},"善用 \u002Fcompact","：主动触发压缩，把早期\"已完成的部分\"摘要化，腾出空间给当前任务。",[195,1789,1790,1793],{},[199,1791,1792],{},"\"主题混淆\"的早期识别信号","：当你看到以下任一信号，应该立即考虑切换会话——",[249,1795,1796,1803,1810,1817],{},[252,1797,1798,1799,1802],{},"Claude 在新代码中",[199,1800,1801],{},"引用了上一个文件的字段名","（典型的\"上下文串味\"）。",[252,1804,1805,1806,1809],{},"Claude ",[199,1807,1808],{},"重复定义已存在的类型\u002F函数","（说明它\"忘了\"早先的定义）。",[252,1811,1812,1813,1816],{},"Claude 在工具调用前",[199,1814,1815],{},"反复确认基本事实","（\"Order 有 status 字段对吗？\"——本应早已建立的共识）。",[252,1818,1819,1820,1823],{},"Claude 输出的代码风格",[199,1821,1822],{},"突然偏离项目惯例","（CLAUDE.md 的位置效应失效）。",[195,1825,1826,1827,206],{},"这四个信号都意味着\"上下文不再可靠\"，硬撑下去只会浪费 Token + 降低质量。最佳响应是结束当前会话、写一份状态摘要、开新会话从干净状态继续。",[199,1828,1829],{},"别舍不得\"已经投入的对话历史\"——更宝贵的是当下的判断力",[241,1831,1833],{"id":1832},"_43-plan-模式失效","4.3 Plan 模式失效",[195,1835,1836,1838],{},[199,1837,791],{},"：在长会话末期切到 Plan 模式，发现 Claude 输出的 Plan 粗糙、漏了关键步骤。",[195,1840,1841,1844],{},[199,1842,1843],{},"根因","：上下文已经被早期对话填满，Plan 模式可用的\"思考空间\"被挤压。",[195,1846,1847,1849],{},[199,1848,1553],{},"：开新会话再启用 Plan 模式。新会话里 Claude 拥有完整的注意力配额。",[241,1851,1853],{"id":1852},"_44-工具调用结果占据过多-token","4.4 工具调用结果占据过多 Token",[195,1855,1856,1858,1859,812,1861,1864],{},[199,1857,791],{},"：让 Claude 跑一个返回 20K Token 的命令（例如 ",[461,1860,825],{},[461,1862,1863],{},"npm outdated --json","），结果直接吞掉一大块上下文。",[195,1866,1867,289],{},[199,1868,1553],{},[249,1870,1871,1884,1890],{},[252,1872,1873,1874,1877,1878,1877,1881,1883],{},"大命令前主动加 ",[461,1875,1876],{},"head -50"," \u002F ",[461,1879,1880],{},"tail -100",[461,1882,699],{}," 过滤。",[252,1885,1886,1887,1889],{},"用 ",[461,1888,755],{}," 等聚合代替全文输出。",[252,1891,1892],{},"让 Claude 写脚本输出\"摘要文件\"，再读摘要而非读全文。",[195,1894,1895,1898],{},[199,1896,1897],{},"\"摘要文件\"模式的实战示例","：当需要让 Claude 分析一个超大文件（例如 50MB 的 package-lock.json），最稳妥的流程是——",[454,1900,1902],{"className":656,"code":1901,"language":658,"meta":463,"style":463},"# 步骤 1：让 Claude 写一个摘要脚本\ncat \u003C\u003C'EOF' > .claude\u002Fscripts\u002Fsummarize-lock.sh\n#!\u002Fbin\u002Fbash\necho \"## package-lock.json 摘要\"\necho\necho \"### 总包数\"\njq '.packages | keys | length' package-lock.json\necho\necho \"### 直接依赖（30 个）\"\njq -r '.packages.\"\" | .dependencies | keys[]' package-lock.json | head -30\necho\necho \"### 重复依赖（潜在 dedupe 机会）\"\njq -r '.packages | keys[]' package-lock.json | awk -F'\u002Fnode_modules\u002F' '{print $NF}' | sort | uniq -c | sort -rn | head -10\nEOF\nchmod +x .claude\u002Fscripts\u002Fsummarize-lock.sh\n\n# 步骤 2：跑摘要脚本，输出到中间文件\n.claude\u002Fscripts\u002Fsummarize-lock.sh > .claude\u002Fsummaries\u002Flock-summary.md\n\n# 步骤 3：让 Claude 读摘要文件而非原文\n# Read .claude\u002Fsummaries\u002Flock-summary.md\n",[461,1903,1904,1909,1925,1930,1935,1940,1945,1950,1954,1959,1964,1968,1973,1978,1983,1993,1998,2004,2015,2020,2026],{"__ignoreMap":463},[662,1905,1906],{"class":664,"line":665},[662,1907,1908],{"class":668},"# 步骤 1：让 Claude 写一个摘要脚本\n",[662,1910,1911,1913,1916,1919,1922],{"class":664,"line":672},[662,1912,676],{"class":675},[662,1914,1915],{"class":702}," \u003C\u003C",[662,1917,1918],{"class":702},"'EOF'",[662,1920,1921],{"class":702}," >",[662,1923,1924],{"class":679}," .claude\u002Fscripts\u002Fsummarize-lock.sh\n",[662,1926,1927],{"class":664,"line":683},[662,1928,1929],{"class":679},"#!\u002Fbin\u002Fbash\n",[662,1931,1932],{"class":664,"line":690},[662,1933,1934],{"class":679},"echo \"## package-lock.json 摘要\"\n",[662,1936,1937],{"class":664,"line":696},[662,1938,1939],{"class":679},"echo\n",[662,1941,1942],{"class":664,"line":724},[662,1943,1944],{"class":679},"echo \"### 总包数\"\n",[662,1946,1947],{"class":664,"line":729},[662,1948,1949],{"class":679},"jq '.packages | keys | length' package-lock.json\n",[662,1951,1952],{"class":664,"line":735},[662,1953,1939],{"class":679},[662,1955,1956],{"class":664,"line":1318},[662,1957,1958],{"class":679},"echo \"### 直接依赖（30 个）\"\n",[662,1960,1961],{"class":664,"line":1326},[662,1962,1963],{"class":679},"jq -r '.packages.\"\" | .dependencies | keys[]' package-lock.json | head -30\n",[662,1965,1966],{"class":664,"line":1334},[662,1967,1939],{"class":679},[662,1969,1970],{"class":664,"line":1342},[662,1971,1972],{"class":679},"echo \"### 重复依赖（潜在 dedupe 机会）\"\n",[662,1974,1975],{"class":664,"line":1347},[662,1976,1977],{"class":679},"jq -r '.packages | keys[]' package-lock.json | awk -F'\u002Fnode_modules\u002F' '{print $NF}' | sort | uniq -c | sort -rn | head -10\n",[662,1979,1980],{"class":664,"line":1355},[662,1981,1982],{"class":702},"EOF\n",[662,1984,1985,1988,1991],{"class":664,"line":1363},[662,1986,1987],{"class":675},"chmod",[662,1989,1990],{"class":679}," +x",[662,1992,1924],{"class":679},[662,1994,1996],{"class":664,"line":1995},16,[662,1997,687],{"emptyLinePlaceholder":686},[662,1999,2001],{"class":664,"line":2000},17,[662,2002,2003],{"class":668},"# 步骤 2：跑摘要脚本，输出到中间文件\n",[662,2005,2007,2010,2012],{"class":664,"line":2006},18,[662,2008,2009],{"class":675},".claude\u002Fscripts\u002Fsummarize-lock.sh",[662,2011,1921],{"class":702},[662,2013,2014],{"class":679}," .claude\u002Fsummaries\u002Flock-summary.md\n",[662,2016,2018],{"class":664,"line":2017},19,[662,2019,687],{"emptyLinePlaceholder":686},[662,2021,2023],{"class":664,"line":2022},20,[662,2024,2025],{"class":668},"# 步骤 3：让 Claude 读摘要文件而非原文\n",[662,2027,2029],{"class":664,"line":2028},21,[662,2030,2031],{"class":668},"# Read .claude\u002Fsummaries\u002Flock-summary.md\n",[195,2033,2034,2035,2038,2039,2042],{},"整个流程把 50MB 的原始文件压缩成 2-5KB 的摘要，再让 Claude 基于摘要做分析。如果摘要里发现某个具体包需要深入查看，再针对性地 ",[461,2036,2037],{},"jq '.packages.\"xxx\"' package-lock.json"," 拿单个包的详情。",[199,2040,2041],{},"\"先聚合、再放大\"的两阶段策略适用于几乎所有大数据分析场景","——日志、配置、报告、数据集——都可以套用这个模板。",[241,2044,2046],{"id":2045},"_45-用上下文摘要-新会话挽救濒临溢出的会话","4.5 用\"上下文摘要 + 新会话\"挽救濒临溢出的会话",[195,2048,2049,2050,2053],{},"当会话已经接近上下文上限、自动压缩频繁触发时，",[199,2051,2052],{},"主动结束会话","比\"继续硬撑\"更好：",[454,2055,2058],{"className":2056,"code":2057,"language":459},[457],"我们的会话已经接近上下文上限。请输出本次会话的\"状态摘要\"：\n1. 已完成的工作（带文件路径与 commit hash）\n2. 仍未完成的任务清单\n3. 关键决策与约束\n4. 下一会话需要继续的具体动作\n\n输出后我会开新会话，让新会话基于这份摘要继续。\n",[461,2059,2057],{"__ignoreMap":463},[195,2061,2062,2063,2065],{},"把摘要写入 ",[461,2064,530],{},"，下次会话开始时读取。这条流程把\"无意义的压缩损耗\"换成了\"有意义的状态外部化\"。",[195,2067,2068,2071,2072,2075],{},[199,2069,2070],{},"摘要输出的\"金字塔结构\"","：好的摘要应当遵循金字塔原则——",[199,2073,2074],{},"最重要的信息放最前","，让下一会话即使只读前 100 字也能知道大概。建议格式：",[454,2077,2079],{"className":1257,"code":2078,"language":1259,"meta":463,"style":463},"## 会话状态摘要 — 2026-04-26 14:30\n\n### TL;DR（一句话）\n正在做 user-management 的第 4 轮迭代（单元测试），已完成 7 个用例，剩余 3 个待补。\n\n### 关键决策（3-5 条，下一会话不要重新讨论）\n1. User.email 必须唯一（业务方决定 2026-04-25）\n2. 错误处理：所有自定义错误继承 BaseError\n3. 测试框架用 Vitest，不要切换到 Jest\n\n### 已完成（带 commit hash）\n- ✅ 类型定义（commit a1b2c3d）\n- ✅ 内存版 CRUD（commit e4f5g6h）\n- ✅ 输入校验（commit i7j8k9l）\n- ✅ 7 个测试用例（uncommitted）\n\n### 待办（按优先级）\n1. 补 deleteUser 异常路径测试\n2. 补 updateUser 部分字段测试  \n3. 整体跑覆盖率 → 目标 ≥ 90%\n4. commit 单元测试 + push PR\n\n### 已知风险\n- 性能测试还没做，不知道在 1k 用户量下表现\n- updateUser 的并发测试还没设计\n",[461,2080,2081,2088,2092,2100,2105,2109,2116,2124,2132,2140,2144,2151,2158,2165,2172,2179,2183,2190,2197,2204,2211,2219,2224,2232,2240],{"__ignoreMap":463},[662,2082,2083,2085],{"class":664,"line":665},[662,2084,1278],{"class":702},[662,2086,2087],{"class":675},"会话状态摘要 — 2026-04-26 14:30\n",[662,2089,2090],{"class":664,"line":672},[662,2091,687],{"emptyLinePlaceholder":686},[662,2093,2094,2097],{"class":664,"line":683},[662,2095,2096],{"class":702},"### ",[662,2098,2099],{"class":675},"TL;DR（一句话）\n",[662,2101,2102],{"class":664,"line":690},[662,2103,2104],{"class":1289},"正在做 user-management 的第 4 轮迭代（单元测试），已完成 7 个用例，剩余 3 个待补。\n",[662,2106,2107],{"class":664,"line":696},[662,2108,687],{"emptyLinePlaceholder":686},[662,2110,2111,2113],{"class":664,"line":724},[662,2112,2096],{"class":702},[662,2114,2115],{"class":675},"关键决策（3-5 条，下一会话不要重新讨论）\n",[662,2117,2118,2121],{"class":664,"line":729},[662,2119,2120],{"class":702},"1.",[662,2122,2123],{"class":1289}," User.email 必须唯一（业务方决定 2026-04-25）\n",[662,2125,2126,2129],{"class":664,"line":735},[662,2127,2128],{"class":702},"2.",[662,2130,2131],{"class":1289}," 错误处理：所有自定义错误继承 BaseError\n",[662,2133,2134,2137],{"class":664,"line":1318},[662,2135,2136],{"class":702},"3.",[662,2138,2139],{"class":1289}," 测试框架用 Vitest，不要切换到 Jest\n",[662,2141,2142],{"class":664,"line":1326},[662,2143,687],{"emptyLinePlaceholder":686},[662,2145,2146,2148],{"class":664,"line":1334},[662,2147,2096],{"class":702},[662,2149,2150],{"class":675},"已完成（带 commit hash）\n",[662,2152,2153,2155],{"class":664,"line":1342},[662,2154,1286],{"class":702},[662,2156,2157],{"class":1289}," ✅ 类型定义（commit a1b2c3d）\n",[662,2159,2160,2162],{"class":664,"line":1347},[662,2161,1286],{"class":702},[662,2163,2164],{"class":1289}," ✅ 内存版 CRUD（commit e4f5g6h）\n",[662,2166,2167,2169],{"class":664,"line":1355},[662,2168,1286],{"class":702},[662,2170,2171],{"class":1289}," ✅ 输入校验（commit i7j8k9l）\n",[662,2173,2174,2176],{"class":664,"line":1363},[662,2175,1286],{"class":702},[662,2177,2178],{"class":1289}," ✅ 7 个测试用例（uncommitted）\n",[662,2180,2181],{"class":664,"line":1995},[662,2182,687],{"emptyLinePlaceholder":686},[662,2184,2185,2187],{"class":664,"line":2000},[662,2186,2096],{"class":702},[662,2188,2189],{"class":675},"待办（按优先级）\n",[662,2191,2192,2194],{"class":664,"line":2006},[662,2193,2120],{"class":702},[662,2195,2196],{"class":1289}," 补 deleteUser 异常路径测试\n",[662,2198,2199,2201],{"class":664,"line":2017},[662,2200,2128],{"class":702},[662,2202,2203],{"class":1289}," 补 updateUser 部分字段测试  \n",[662,2205,2206,2208],{"class":664,"line":2022},[662,2207,2136],{"class":702},[662,2209,2210],{"class":1289}," 整体跑覆盖率 → 目标 ≥ 90%\n",[662,2212,2213,2216],{"class":664,"line":2028},[662,2214,2215],{"class":702},"4.",[662,2217,2218],{"class":1289}," commit 单元测试 + push PR\n",[662,2220,2222],{"class":664,"line":2221},22,[662,2223,687],{"emptyLinePlaceholder":686},[662,2225,2227,2229],{"class":664,"line":2226},23,[662,2228,2096],{"class":702},[662,2230,2231],{"class":675},"已知风险\n",[662,2233,2235,2237],{"class":664,"line":2234},24,[662,2236,1286],{"class":702},[662,2238,2239],{"class":1289}," 性能测试还没做，不知道在 1k 用户量下表现\n",[662,2241,2243,2245],{"class":664,"line":2242},25,[662,2244,1286],{"class":702},[662,2246,2247],{"class":1289}," updateUser 的并发测试还没设计\n",[195,2249,2250,2251,2254],{},"这种结构化摘要在下一会话读入后，Claude 能在 30 秒内重建完整工作上下文。",[199,2252,2253],{},"摘要的写作时间投入（约 2 分钟）远小于在新会话中\"从零重建\"的时间（5-10 分钟）","——是上下文管理中投资回报率最高的一项习惯。",[233,2256],{},[236,2258,2260],{"id":2259},"五上下文与-prompt-cache-的协同","五、上下文与 prompt cache 的协同",[241,2262,2264],{"id":2263},"_51-prompt-cache-的工作原理","5.1 Prompt Cache 的工作原理",[195,2266,2267],{},"Anthropic 的 Prompt Cache 机制允许\"缓存\"上下文中的稳定部分（如 system prompt、CLAUDE.md），下次请求时如果前缀匹配，直接复用缓存而不需要重新计算。",[195,2269,2270,289],{},[199,2271,2272],{},"命中条件",[249,2274,2275,2282,2285],{},[252,2276,2277,2278,2281],{},"缓存的内容必须",[199,2279,2280],{},"精确匹配","（一个字符的差异都会导致 miss）。",[252,2283,2284],{},"缓存有 TTL（默认 5 分钟，可延长至 1 小时）。",[252,2286,2287],{},"缓存有最小 Token 阈值（小于阈值的内容不会被缓存）。",[195,2289,2290,289],{},[199,2291,2292],{},"收益",[249,2294,2295,2298],{},[252,2296,2297],{},"命中后，被缓存部分的 Token 价格降至 1\u002F10 左右。",[252,2299,2300],{},"命中后，模型计算注意力的延迟显著降低。",[195,2302,2303,2306,2307,2310],{},[199,2304,2305],{},"Cache 命中链路的\"前缀原则\"","：Cache 是",[199,2308,2309],{},"前缀匹配","的——只要\"上下文的前 X Token 完全一致\"就能命中前 X Token 的 cache，X 之后即使变化也不影响前面的命中。这意味着应当把\"会变的部分\"放在 prompt 末尾、把\"不变的部分\"放在 prompt 开头：",[454,2312,2315],{"className":2313,"code":2314,"language":459},[457],"[系统提示，永不变 — 5K Token]   ← 全程命中\n[CLAUDE.md，每次会话注入 — 8K Token]   ← 全程命中\n[本会话历史对话 — 累积变化]   ← 部分命中（早期对话稳定后命中）\n[当前用户输入 — 每次都新]   ← 不命中\n",[461,2316,2314],{"__ignoreMap":463},[195,2318,2319,2320,2323],{},"理解这条机制后，工程师可以",[199,2321,2322],{},"主动设计 prompt 结构以最大化 cache 收益","——哪些放最前、哪些放中间、哪些放最后，都不再是随手安排，而是基于\"命中率最大化\"的工程决策。",[241,2325,2327],{"id":2326},"_52-把-claudemd-系统提示词放进-cache-的最佳实践","5.2 把 CLAUDE.md \u002F 系统提示词放进 cache 的最佳实践",[195,2329,2330],{},"CLAUDE.md 是天然的 cache 候选——它在会话期间几乎不变。把它放在上下文最前面，能让 cache 在每次对话中都被命中。",[195,2332,2333,289],{},[199,2334,2335],{},"反例",[454,2337,2340],{"className":2338,"code":2339,"language":459},[457],"[历史对话 ... 30K Token]\n[当前 prompt]\n[CLAUDE.md ... 5K Token]   ← 放在末尾，cache 命中率低\n",[461,2341,2339],{"__ignoreMap":463},[195,2343,2344,289],{},[199,2345,2346],{},"正例",[454,2348,2351],{"className":2349,"code":2350,"language":459},[457],"[CLAUDE.md ... 5K Token]   ← 放在最前\n[历史对话 ... 30K Token]\n[当前 prompt]\n",[461,2352,2350],{"__ignoreMap":463},[195,2354,2355],{},"Claude Code 默认会做这个排序，但工程师在调用 API 时也应当遵循同样原则。",[241,2357,2359],{"id":2358},"_53-cache-命中率监控与成本对比","5.3 cache 命中率监控与成本对比",[195,2361,2362,2363,2366,2367,2370],{},"通过 Anthropic API 的 response 中的 ",[461,2364,2365],{},"cache_read_input_tokens"," 与 ",[461,2368,2369],{},"cache_creation_input_tokens"," 字段可以监控 cache 表现：",[454,2372,2376],{"className":2373,"code":2374,"language":2375,"meta":463,"style":463},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F 简化版监控逻辑\nconst response = await client.messages.create({...});\nconst cached = response.usage.cache_read_input_tokens || 0;\nconst created = response.usage.cache_creation_input_tokens || 0;\nconst total = response.usage.input_tokens;\nconst hitRate = total > 0 ? cached \u002F total : 0;\n\nconsole.log(`Cache hit rate: ${(hitRate * 100).toFixed(1)}%`);\nconsole.log(`Saved approx: ${cached * 0.9} Token-equivalents`);\n","typescript",[461,2377,2378,2383,2426,2457,2483,2505,2538,2542,2598],{"__ignoreMap":463},[662,2379,2380],{"class":664,"line":665},[662,2381,2382],{"class":668},"\u002F\u002F 简化版监控逻辑\n",[662,2384,2385,2389,2392,2395,2399,2402,2405,2408,2410,2414,2417,2420,2423],{"class":664,"line":672},[662,2386,2388],{"class":2387},"spNyl","const",[662,2390,2391],{"class":1289}," response ",[662,2393,2394],{"class":702},"=",[662,2396,2398],{"class":2397},"s7zQu"," await",[662,2400,2401],{"class":1289}," client",[662,2403,2404],{"class":702},".",[662,2406,2407],{"class":1289},"messages",[662,2409,2404],{"class":702},[662,2411,2413],{"class":2412},"s2Zo4","create",[662,2415,2416],{"class":1289},"(",[662,2418,2419],{"class":702},"{...}",[662,2421,2422],{"class":1289},")",[662,2424,2425],{"class":702},";\n",[662,2427,2428,2430,2433,2435,2438,2440,2443,2445,2448,2451,2455],{"class":664,"line":683},[662,2429,2388],{"class":2387},[662,2431,2432],{"class":1289}," cached ",[662,2434,2394],{"class":702},[662,2436,2437],{"class":1289}," response",[662,2439,2404],{"class":702},[662,2441,2442],{"class":1289},"usage",[662,2444,2404],{"class":702},[662,2446,2447],{"class":1289},"cache_read_input_tokens ",[662,2449,2450],{"class":702},"||",[662,2452,2454],{"class":2453},"sbssI"," 0",[662,2456,2425],{"class":702},[662,2458,2459,2461,2464,2466,2468,2470,2472,2474,2477,2479,2481],{"class":664,"line":690},[662,2460,2388],{"class":2387},[662,2462,2463],{"class":1289}," created ",[662,2465,2394],{"class":702},[662,2467,2437],{"class":1289},[662,2469,2404],{"class":702},[662,2471,2442],{"class":1289},[662,2473,2404],{"class":702},[662,2475,2476],{"class":1289},"cache_creation_input_tokens ",[662,2478,2450],{"class":702},[662,2480,2454],{"class":2453},[662,2482,2425],{"class":702},[662,2484,2485,2487,2490,2492,2494,2496,2498,2500,2503],{"class":664,"line":696},[662,2486,2388],{"class":2387},[662,2488,2489],{"class":1289}," total ",[662,2491,2394],{"class":702},[662,2493,2437],{"class":1289},[662,2495,2404],{"class":702},[662,2497,2442],{"class":1289},[662,2499,2404],{"class":702},[662,2501,2502],{"class":1289},"input_tokens",[662,2504,2425],{"class":702},[662,2506,2507,2509,2512,2514,2516,2519,2521,2524,2526,2529,2531,2534,2536],{"class":664,"line":724},[662,2508,2388],{"class":2387},[662,2510,2511],{"class":1289}," hitRate ",[662,2513,2394],{"class":702},[662,2515,2489],{"class":1289},[662,2517,2518],{"class":702},">",[662,2520,2454],{"class":2453},[662,2522,2523],{"class":702}," ?",[662,2525,2432],{"class":1289},[662,2527,2528],{"class":702},"\u002F",[662,2530,2489],{"class":1289},[662,2532,2533],{"class":702},":",[662,2535,2454],{"class":2453},[662,2537,2425],{"class":702},[662,2539,2540],{"class":664,"line":729},[662,2541,687],{"emptyLinePlaceholder":686},[662,2543,2544,2547,2549,2552,2554,2557,2560,2563,2566,2569,2572,2574,2576,2579,2581,2584,2586,2589,2592,2594,2596],{"class":664,"line":735},[662,2545,2546],{"class":1289},"console",[662,2548,2404],{"class":702},[662,2550,2551],{"class":2412},"log",[662,2553,2416],{"class":1289},[662,2555,2556],{"class":702},"`",[662,2558,2559],{"class":679},"Cache hit rate: ",[662,2561,2562],{"class":702},"${",[662,2564,2565],{"class":1289},"(hitRate ",[662,2567,2568],{"class":702},"*",[662,2570,2571],{"class":2453}," 100",[662,2573,2422],{"class":1289},[662,2575,2404],{"class":702},[662,2577,2578],{"class":2412},"toFixed",[662,2580,2416],{"class":1289},[662,2582,2583],{"class":2453},"1",[662,2585,2422],{"class":1289},[662,2587,2588],{"class":702},"}",[662,2590,2591],{"class":679},"%",[662,2593,2556],{"class":702},[662,2595,2422],{"class":1289},[662,2597,2425],{"class":702},[662,2599,2600,2602,2604,2606,2608,2610,2613,2615,2618,2620,2623,2625,2628,2630,2632],{"class":664,"line":1318},[662,2601,2546],{"class":1289},[662,2603,2404],{"class":702},[662,2605,2551],{"class":2412},[662,2607,2416],{"class":1289},[662,2609,2556],{"class":702},[662,2611,2612],{"class":679},"Saved approx: ",[662,2614,2562],{"class":702},[662,2616,2617],{"class":1289},"cached ",[662,2619,2568],{"class":702},[662,2621,2622],{"class":2453}," 0.9",[662,2624,2588],{"class":702},[662,2626,2627],{"class":679}," Token-equivalents",[662,2629,2556],{"class":702},[662,2631,2422],{"class":1289},[662,2633,2425],{"class":702},[195,2635,2636],{},"健康团队的 cache 命中率应当在 50%-80% 之间。低于 30% 说明 cache 被频繁失效（CLAUDE.md 改动过频繁，或会话频繁切换）。",[241,2638,2640],{"id":2639},"_54-cache-失效时机避免无谓重新计费","5.4 cache 失效时机：避免无谓重新计费",[195,2642,2643],{},"cache 失效场景：",[249,2645,2646,2649,2652,2655],{},[252,2647,2648],{},"CLAUDE.md 内容变更（即使只改了一个空格）。",[252,2650,2651],{},"上下文中早期某条消息被压缩或删除。",[252,2653,2654],{},"会话间隔超过 TTL（默认 5 分钟）。",[252,2656,2657],{},"不同账户之间不共享 cache。",[195,2659,2660,289],{},[199,2661,2662],{},"避免无谓失效的实践",[249,2664,2665,2668,2671],{},[252,2666,2667],{},"不要\"调试性\"频繁修改 CLAUDE.md——把临时调试规则放在临时文件里。",[252,2669,2670],{},"长会话保持连续工作，避免长时间挂起再回来。",[252,2672,2673],{},"多人协作时，每个工程师的 cache 互相独立，不要期待\"队友的 cache 我也能复用\"。",[195,2675,2676,289],{},[199,2677,2678],{},"Cache 命中率优化的\"三招\"",[1164,2680,2681,2687,2697],{},[252,2682,2683,2686],{},[199,2684,2685],{},"CLAUDE.md 分层","：把\"几乎不变\"的内容（团队铁律、命名规范）放在最前面；\"偶尔会调整\"的内容（当前 sprint 的临时关注点）放在末尾。即使末尾内容变化，前面的部分依然能命中 cache。",[252,2688,2689,2692,2693,2696],{},[199,2690,2691],{},"模板化系统提示","：在 API 直接调用场景中，把系统提示设计成 ",[461,2694,2695],{},"[固定模板] + [变量部分]","，固定模板放最前。变量在末尾，即使变量天天变，固定模板依然命中。",[252,2698,2699,2702],{},[199,2700,2701],{},"批量任务的 cache 链路","：如果有 100 个相似任务要处理（例如批量翻译、批量代码审查），让所有任务共享同一份系统提示与 CLAUDE.md。第一个任务付全价创建 cache，后续 99 个任务命中 cache 享受 1\u002F10 价格。100 个任务的总成本约等于 11 个任务的成本——这是 Cache 在批处理场景下的最大杠杆。",[195,2704,2705,2708],{},[199,2706,2707],{},"Cache 成本测算示例","：假设系统提示 + CLAUDE.md 合计 10K Token，单次任务追加 1K Token 用户输入：",[291,2710,2711,2724],{},[294,2712,2713],{},[297,2714,2715,2718,2721],{},[300,2716,2717],{},"场景",[300,2719,2720],{},"单次输入成本",[300,2722,2723],{},"100 次累积成本",[307,2725,2726,2737],{},[297,2727,2728,2731,2734],{},[312,2729,2730],{},"无 cache",[312,2732,2733],{},"11K Token × 100 = 1100K Token",[312,2735,2736],{},"1100K Token 全价",[297,2738,2739,2742,2745],{},[312,2740,2741],{},"有 cache（命中率 99%）",[312,2743,2744],{},"第 1 次 11K Token，后 99 次约 1K Token + 10K cached",[312,2746,2747],{},"11K + 99 × 1K + 99 × 10K × 0.1 = 209K Token-equivalent",[195,2749,2750,2751,2754],{},"数据计算公式中 cached 部分按 1\u002F10 计费。100 次任务的实际成本从 1100K 降至约 209K Token——",[199,2752,2753],{},"节省约 80%","。这条收益在批处理、CI\u002FCD 自动化、Agent 调用场景中尤为显著。",[233,2756],{},[236,2758,2760],{"id":2759},"六pm-与工程师的上下文管理风格","六、PM 与工程师的上下文管理风格",[241,2762,2764],{"id":2763},"_61-pm-视角用结构化文档代替散乱描述","6.1 PM 视角：用结构化文档代替散乱描述",[195,2766,2767],{},"PM 经常要把需求传达给 Claude（例如让 Claude 翻译为技术任务）。常见反模式是把多个相关需求杂糅在一段散文中——Claude 提取信息时可能漏掉关键约束。",[195,2769,2770,2772],{},[199,2771,2346],{},"：把需求拆成结构化文档：",[454,2774,2776],{"className":1257,"code":2775,"language":1259,"meta":463,"style":463},"## 功能：批量导入用户\n\n### 输入\n- CSV 文件，最大 10 MB\n- 字段：姓名、邮箱、手机号\n\n### 业务规则\n- 邮箱必须唯一\n- 手机号可重复\n- 姓名长度 2-50 字符\n\n### 性能要求\n- 1 万条记录 30 秒内完成\n- 失败记录不阻塞成功记录\n\n### 错误处理\n- 单条记录失败：跳过、记录日志\n- 系统错误：整体回滚\n\n### 验收标准\n- 导入成功率 ≥ 99%\n- 失败原因可追溯\n",[461,2777,2778,2785,2789,2796,2803,2810,2814,2821,2828,2835,2842,2846,2853,2860,2867,2871,2878,2885,2892,2896,2903,2910],{"__ignoreMap":463},[662,2779,2780,2782],{"class":664,"line":665},[662,2781,1278],{"class":702},[662,2783,2784],{"class":675},"功能：批量导入用户\n",[662,2786,2787],{"class":664,"line":672},[662,2788,687],{"emptyLinePlaceholder":686},[662,2790,2791,2793],{"class":664,"line":683},[662,2792,2096],{"class":702},[662,2794,2795],{"class":675},"输入\n",[662,2797,2798,2800],{"class":664,"line":690},[662,2799,1286],{"class":702},[662,2801,2802],{"class":1289}," CSV 文件，最大 10 MB\n",[662,2804,2805,2807],{"class":664,"line":696},[662,2806,1286],{"class":702},[662,2808,2809],{"class":1289}," 字段：姓名、邮箱、手机号\n",[662,2811,2812],{"class":664,"line":724},[662,2813,687],{"emptyLinePlaceholder":686},[662,2815,2816,2818],{"class":664,"line":729},[662,2817,2096],{"class":702},[662,2819,2820],{"class":675},"业务规则\n",[662,2822,2823,2825],{"class":664,"line":735},[662,2824,1286],{"class":702},[662,2826,2827],{"class":1289}," 邮箱必须唯一\n",[662,2829,2830,2832],{"class":664,"line":1318},[662,2831,1286],{"class":702},[662,2833,2834],{"class":1289}," 手机号可重复\n",[662,2836,2837,2839],{"class":664,"line":1326},[662,2838,1286],{"class":702},[662,2840,2841],{"class":1289}," 姓名长度 2-50 字符\n",[662,2843,2844],{"class":664,"line":1334},[662,2845,687],{"emptyLinePlaceholder":686},[662,2847,2848,2850],{"class":664,"line":1342},[662,2849,2096],{"class":702},[662,2851,2852],{"class":675},"性能要求\n",[662,2854,2855,2857],{"class":664,"line":1347},[662,2856,1286],{"class":702},[662,2858,2859],{"class":1289}," 1 万条记录 30 秒内完成\n",[662,2861,2862,2864],{"class":664,"line":1355},[662,2863,1286],{"class":702},[662,2865,2866],{"class":1289}," 失败记录不阻塞成功记录\n",[662,2868,2869],{"class":664,"line":1363},[662,2870,687],{"emptyLinePlaceholder":686},[662,2872,2873,2875],{"class":664,"line":1995},[662,2874,2096],{"class":702},[662,2876,2877],{"class":675},"错误处理\n",[662,2879,2880,2882],{"class":664,"line":2000},[662,2881,1286],{"class":702},[662,2883,2884],{"class":1289}," 单条记录失败：跳过、记录日志\n",[662,2886,2887,2889],{"class":664,"line":2006},[662,2888,1286],{"class":702},[662,2890,2891],{"class":1289}," 系统错误：整体回滚\n",[662,2893,2894],{"class":664,"line":2017},[662,2895,687],{"emptyLinePlaceholder":686},[662,2897,2898,2900],{"class":664,"line":2022},[662,2899,2096],{"class":702},[662,2901,2902],{"class":675},"验收标准\n",[662,2904,2905,2907],{"class":664,"line":2028},[662,2906,1286],{"class":702},[662,2908,2909],{"class":1289}," 导入成功率 ≥ 99%\n",[662,2911,2912,2914],{"class":664,"line":2221},[662,2913,1286],{"class":702},[662,2915,2916],{"class":1289}," 失败原因可追溯\n",[195,2918,2919],{},"让 Claude 基于结构化文档生成代码，远好于散文式描述。",[195,2921,2922,2925,2926,2929],{},[199,2923,2924],{},"结构化文档的\"信息密度优势\"","：把同一份需求用散文表达，可能需要 800-1500 字符；用结构化清单表达，往往只需 300-500 字符。",[199,2927,2928],{},"信息密度高 2-3 倍意味着 Claude 在更少 Token 内获得同等清晰度","——这是 Token 经济学最直接的体现。",[195,2931,2932],{},"PM 团队可以围绕这条规则建立\"标准需求模板\"——所有传给 Claude 的需求都按统一模板组织，包括但不限于：功能说明、输入输出契约、业务规则、性能\u002F容量约束、错误处理路径、验收标准、不在范围（\"什么不做\"）。模板化的另一个好处是 Claude 解读速度快——它在数千次类似格式的训练数据中学过这种结构，能精准提取每一栏的信息，不会因为表述风格不同而产生歧义。",[241,2934,2936],{"id":2935},"_62-工程师视角用文件路径代替粘贴代码","6.2 工程师视角：用文件路径代替粘贴代码",[195,2938,2939],{},"错误示范：",[454,2941,2944],{"className":2942,"code":2943,"language":459},[457],"[贴 5000 行 src\u002Fuser.ts 全文]\n请重构 createUser 函数，让它支持异步初始化。\n",[461,2945,2943],{"__ignoreMap":463},[195,2947,2948],{},"正确示范：",[454,2950,2953],{"className":2951,"code":2952,"language":459},[457],"请重构 src\u002Fuser\u002Ffactory.ts 的 createUser 函数，让它支持异步初始化。\n背景：当前 createUser 是同步的，但我们需要在创建用户时异步调用 sendWelcomeEmail。\n请先读 factory.ts 了解当前实现，再提议方案。\n",[461,2954,2952],{"__ignoreMap":463},[195,2956,2957,2958,2961],{},"让 Claude 自己 Read 文件——它会读取",[199,2959,2960],{},"最新版本","，而你贴的版本可能已经过时。",[241,2963,2965],{"id":2964},"_63-跨角色协作让-claude-在角色间转译时保留关键上下文","6.3 跨角色协作：让 Claude 在角色间转译时保留关键上下文",[195,2967,2968],{},"PM 与工程师协作时，让 Claude 充当\"转译层\"：",[454,2970,2973],{"className":2971,"code":2972,"language":459},[457],"PM 写了以下需求：[贴 PM 的需求文档]\n\n请把它翻译为：\n1. 工程任务清单（带预估工时）\n2. 依赖识别（前后依赖关系）\n3. 风险点（PM 没明说但工程师需要警惕的部分）\n\n转译过程中，请保留 PM 的所有约束（不要简化掉）。\n",[461,2974,2972],{"__ignoreMap":463},[195,2976,2977],{},"转译输出后让 PM review——确保 Claude 没有遗漏任何业务约束。",[195,2979,2980,2983],{},[199,2981,2982],{},"转译过程中常见的\"信息损耗模式\"","：让 Claude 做角色转译看似省事，但实际操作中容易出现以下三类损耗——",[1164,2985,2986,2992,2998],{},[252,2987,2988,2991],{},[199,2989,2990],{},"业务约束被省略","：PM 说\"批量导入失败时不阻塞成功记录\"，Claude 转译为\"批量导入有错误处理\"——这种\"概括式简化\"丢掉了关键的语义。对策：在 prompt 中强调\"逐条保留 PM 的所有约束，禁止概括\"。",[252,2993,2994,2997],{},[199,2995,2996],{},"非功能需求被忽视","：PM 关心可观测性（\"我们要能在仪表板上看到导入成功率\"），但 Claude 容易把它当成\"附加功能\"而非\"核心需求\"。对策：在转译模板中显式列出\"非功能需求清单\"——性能、可观测性、可维护性、可扩展性。",[252,2999,3000,3003],{},[199,3001,3002],{},"隐性假设被丢失","：PM 说\"用户名长度 50 字符\"，但 PM 心里假设的是\"中文 50 字符 = UTF-8 150 字节\"。Claude 转译时可能直接写成\"VARCHAR(50)\"——数据库层就出了问题。对策：在转译完成后做一次\"假设核对\"——让 Claude 列出它的隐性假设，让 PM 逐一确认。",[195,3005,3006,3007,3010,3011,3014],{},"转译不是\"压缩\"。好的转译会把 PM 的散文式需求",[199,3008,3009],{},"结构化","，但不会",[199,3012,3013],{},"简化","。结构化与简化是两码事——前者让信息更易被工程师消化，后者会丢失业务关键性。这条区分需要 PM 与工程师在使用 Claude 转译时反复练习才能内化。",[241,3016,3018],{"id":3017},"_64-团队级上下文卫生约定","6.4 团队级\"上下文卫生\"约定",[195,3020,3021],{},"把上下文管理写进团队约定：",[454,3023,3025],{"className":1257,"code":3024,"language":1259,"meta":463,"style":463},"## 团队上下文卫生公约（v1.0）\n\n1. 单次会话不超过 60-90 分钟，超过则结束、写状态摘要、开新会话\n2. 不在 prompt 中粘贴大段日志\u002F数据——预聚合再贴\n3. CLAUDE.md 控制在 500 行以内，每月做减法\n4. 大文件的修改用\"读+精确编辑\"而非\"粘贴重写\"\n5. 切换主题时主动开新会话，而非延续旧会话\n6. 高频任务封装为 Skills，减少重复 prompt\n",[461,3026,3027,3034,3038,3045,3052,3059,3066,3074],{"__ignoreMap":463},[662,3028,3029,3031],{"class":664,"line":665},[662,3030,1278],{"class":702},[662,3032,3033],{"class":675},"团队上下文卫生公约（v1.0）\n",[662,3035,3036],{"class":664,"line":672},[662,3037,687],{"emptyLinePlaceholder":686},[662,3039,3040,3042],{"class":664,"line":683},[662,3041,2120],{"class":702},[662,3043,3044],{"class":1289}," 单次会话不超过 60-90 分钟，超过则结束、写状态摘要、开新会话\n",[662,3046,3047,3049],{"class":664,"line":690},[662,3048,2128],{"class":702},[662,3050,3051],{"class":1289}," 不在 prompt 中粘贴大段日志\u002F数据——预聚合再贴\n",[662,3053,3054,3056],{"class":664,"line":696},[662,3055,2136],{"class":702},[662,3057,3058],{"class":1289}," CLAUDE.md 控制在 500 行以内，每月做减法\n",[662,3060,3061,3063],{"class":664,"line":724},[662,3062,2215],{"class":702},[662,3064,3065],{"class":1289}," 大文件的修改用\"读+精确编辑\"而非\"粘贴重写\"\n",[662,3067,3068,3071],{"class":664,"line":729},[662,3069,3070],{"class":702},"5.",[662,3072,3073],{"class":1289}," 切换主题时主动开新会话，而非延续旧会话\n",[662,3075,3076,3079],{"class":664,"line":735},[662,3077,3078],{"class":702},"6.",[662,3080,3081],{"class":1289}," 高频任务封装为 Skills，减少重复 prompt\n",[195,3083,3084],{},"新人入职第一周读这份公约。半年后所有人都默会这套节奏，整个团队的\"AI 协作 Token 效率\"会显著高于不做约定的团队。",[195,3086,3087,3090],{},[199,3088,3089],{},"公约执行的\"自检清单\"","：把公约的每条规则转化为可观测的指标，每月在团队周会上 review——",[291,3092,3093,3106],{},[294,3094,3095],{},[297,3096,3097,3100,3103],{},[300,3098,3099],{},"公约规则",[300,3101,3102],{},"自检指标",[300,3104,3105],{},"健康基线",[307,3107,3108,3119,3130,3141,3152,3163],{},[297,3109,3110,3113,3116],{},[312,3111,3112],{},"1. 会话长度 ≤ 90 分钟",[312,3114,3115],{},"单次会话平均时长",[312,3117,3118],{},"\u003C 60 分钟",[297,3120,3121,3124,3127],{},[312,3122,3123],{},"2. 不贴大段数据",[312,3125,3126],{},"单次 prompt 平均长度",[312,3128,3129],{},"\u003C 5K Token",[297,3131,3132,3135,3138],{},[312,3133,3134],{},"3. CLAUDE.md ≤ 500 行",[312,3136,3137],{},"CLAUDE.md 行数",[312,3139,3140],{},"200-400 行",[297,3142,3143,3146,3149],{},[312,3144,3145],{},"4. 精确编辑",[312,3147,3148],{},"Edit\u002FWrite 调用比",[312,3150,3151],{},"Edit > 70%",[297,3153,3154,3157,3160],{},[312,3155,3156],{},"5. 切主题开新会话",[312,3158,3159],{},"单次会话主题数",[312,3161,3162],{},"\u003C 2 个",[297,3164,3165,3168,3171],{},[312,3166,3167],{},"6. Skills 复用",[312,3169,3170],{},"每月 Skill 调用次数",[312,3172,3173],{},"> 团队人数 × 10",[195,3175,3176,3177,3180],{},"每月输出一份\"团队上下文健康报告\"，把指标可视化、把异常公开化。",[199,3178,3179],{},"透明的指标比模糊的口号更能塑造行为","——当工程师知道\"我的会话平均长度本月超过 90 分钟\"时，下个月他会自觉缩短会话；当 CLAUDE.md 行数膨胀时，团队会主动安排清理。",[195,3182,3183,3186],{},[199,3184,3185],{},"公约的\"零成本启动法\"","：很多团队在引入公约时陷入\"完美主义陷阱\"——花一个月起草、再花一个月讨论、最后无疾而终。建议改用\"零成本启动法\"：",[1164,3188,3189,3195,3201,3207],{},[252,3190,3191,3194],{},[199,3192,3193],{},"第 1 周","：把 1-2 条最关键的规则贴在团队 wiki，不需要全员讨论。",[252,3196,3197,3200],{},[199,3198,3199],{},"第 2-4 周","：观察实际效果，每周一次 5 分钟例会反馈。",[252,3202,3203,3206],{},[199,3204,3205],{},"第 2 个月","：基于真实使用经验补充更多规则、淘汰不适用的规则。",[252,3208,3209,3212],{},[199,3210,3211],{},"第 3 个月","：公约稳定，全员签字、贴上 wiki 第一页。",[195,3214,3215],{},"这种\"小步快跑\"的引入方式比\"一次性完美起草\"成功率高得多——因为公约的真正价值是\"被真的执行\"，而不是\"被设计得完美\"。",[233,3217],{},[236,3219,3220],{"id":3220},"总结",[195,3222,3223,3224,206],{},"上下文不是\"反正窗口大就够用\"的资源，而是工程师必须主动管理的核心约束。本节给出的\"窗口边界 → 内置机制 → 主动策略 → 反模式 → 缓存协同 → 角色协作\"六部分，目标只有一个——",[199,3225,3226],{},"让团队在 Claude Code 协作中保持稳定的高质量输出，避免落入\"上下文塞满 → 注意力稀释 → 输出退化\"的恶性循环",[195,3228,3229,3232,3233,3236],{},[199,3230,3231],{},"最朴素的一条心法","：上下文管理不是技巧问题，而是",[199,3234,3235],{},"自律问题","。一个习惯于\"长会话乱塞\"的工程师，无论给多大的窗口都会撑爆；一个习惯于\"小任务、清边界、勤摘要\"的工程师，即使在 32K 窗口的旧模型上也能高效协作。本节给出的所有工具与策略，都只是把这条自律变得更容易实践。",[195,3238,3239,3242],{},[199,3240,3241],{},"学习曲线的真实样貌","：本人在多个团队推广这套方法论时观察到，工程师对上下文管理的接受度有一条相对一致的曲线——",[249,3244,3245,3250,3255,3260,3265],{},[252,3246,3247,3249],{},[199,3248,3193],{},"：抵触。\"我以前直接贴日志一直这样工作，没出过事，何必学这套规则？\"",[252,3251,3252,3254],{},[199,3253,3199],{},"：被动遵守。规则贴在 wiki 上、PM 偶尔提醒，工程师勉强跟做但不情愿。",[252,3256,3257,3259],{},[199,3258,3205],{},"：开始体验收益。会话效率明显提升，自己开始主动应用部分技巧。",[252,3261,3262,3264],{},[199,3263,3211],{},"：主动倡议。开始在团队会上推荐\"我发现这条很有用\"，从被动接受者变成主动布道者。",[252,3266,3267,3270],{},[199,3268,3269],{},"第 6 个月","：内化为习惯。完全不需要 wiki 提醒，所有动作都符合上下文卫生规范。",[195,3272,3273,3274,3277],{},"这条曲线对每个人都成立，差异只在于\"第 2 个月开始体验收益\"是否真的发生——而这取决于团队是否在前 4 周给了他足够的\"练习场\"。",[199,3275,3276],{},"学习上下文管理的最佳方式不是读文档，而是在压力相对小的真实任务中反复尝试","。建议团队 leader 在新人入职第 1 周就让他们用 Claude Code 完成 2-3 个小任务，期间故意设置一些\"会触发上下文问题\"的场景（例如让他读大文件、写长会话），让新人亲身感受问题，再引导他们应用解决方案。这样形成的肌肉记忆远比死记硬背规则更牢固。",[195,3279,3280],{},"下一节 7.4 是\"心法层\"的最后一节——Boris Cherny 的 9 条实战心法。这 9 条心法是 Anthropic Claude Code 团队多年沉淀的精华，涵盖从提示词到上下文、从权限到协作的全方位智慧。把 7.1、7.2、7.3 与 7.4 四节合起来，就构成了\"AI 协作时代的工程师心法体系\"。",[195,3282,3283],{},"留给读者的两个习题：",[1164,3285,3286,3289],{},[252,3287,3288],{},"在你当前项目里，给自己设定一个\"上下文预算\"——下一次会话前明确写出\"这次会话最多 20K Token\"。完成后回看，看实际用了多少。",[252,3290,3291],{},"给团队写一份\"上下文卫生公约\"，至少包含 5 条规则。在团队会议上讨论后正式签字、贴进 wiki。",[195,3293,3294],{},"这两个习题做完，你会发现\"上下文管理\"从抽象概念变成了团队的肌肉记忆。",[236,3296,3297],{"id":3297},"延伸阅读",[249,3299,3300,3310,3318,3326,3334,3342,3350,3358,3366,3374,3382,3390],{},[252,3301,3302,3309],{},[3303,3304,3308],"a",{"href":3305,"rel":3306},"https:\u002F\u002Fdocs.anthropic.com\u002Fclaude\u002Fdocs\u002Fclaude-code",[3307],"nofollow","Anthropic Claude Code 官方文档"," — 上下文窗口、自动压缩、Skills 全览",[252,3311,3312,3317],{},[3303,3313,3316],{"href":3314,"rel":3315},"https:\u002F\u002Fdocs.anthropic.com\u002Fclaude\u002Fdocs\u002Fprompt-caching",[3307],"Anthropic Prompt Caching 官方文档"," — Prompt Cache 工作原理与最佳实践",[252,3319,3320,3325],{},[3303,3321,3324],{"href":3322,"rel":3323},"https:\u002F\u002Farxiv.org\u002Fabs\u002F2307.03172",[3307],"Lost in the Middle: How Language Models Use Long Contexts (Liu et al., 2023)"," — 长上下文中模型注意力分布的经典研究",[252,3327,3328,3333],{},[3303,3329,3332],{"href":3330,"rel":3331},"https:\u002F\u002Fwww.anthropic.com\u002Fnews\u002Fcontextual-retrieval",[3307],"Anthropic: Contextual Retrieval"," — RAG 与上下文检索的最佳实践",[252,3335,3336,3341],{},[3303,3337,3340],{"href":3338,"rel":3339},"https:\u002F\u002Fpython.langchain.com\u002Fdocs\u002Fconcepts\u002Fcontext_engineering",[3307],"LangChain 官方文档：上下文管理"," — LangChain 在上下文工程中的实践",[252,3343,3344,3349],{},[3303,3345,3348],{"href":3346,"rel":3347},"https:\u002F\u002Fopenai.com\u002Fresearch\u002Fgpt-4",[3307],"OpenAI: GPT-4 长上下文白皮书"," — GPT-4 在长上下文下的能力评估",[252,3351,3352,3357],{},[3303,3353,3356],{"href":3354,"rel":3355},"https:\u002F\u002Fwww.pinecone.io\u002Flearn\u002F",[3307],"Pinecone: Vector DB 与长上下文"," — 向量数据库辅助上下文管理",[252,3359,3360,3365],{},[3303,3361,3364],{"href":3362,"rel":3363},"https:\u002F\u002Fwww.cs.uchicago.edu\u002F~skr\u002F",[3307],"Sanjay Krishnan: Token-efficient AI applications"," — 学术界关于 Token 效率的研究",[252,3367,3368,3373],{},[3303,3369,3372],{"href":3370,"rel":3371},"https:\u002F\u002Fwww.anthropic.com\u002Ftrust",[3307],"Anthropic Trust & Safety"," — Claude 系列的隐私与上下文保留政策",[252,3375,3376,3381],{},[3303,3377,3380],{"href":3378,"rel":3379},"https:\u002F\u002Fwww.youtube.com\u002Fresults?search_query=boris+cherny+claude+code",[3307],"Boris Cherny: Claude Code 工程心法（YouTube 公开演讲）"," — Anthropic 内部实践分享",[252,3383,3384,3389],{},[3303,3385,3388],{"href":3386,"rel":3387},"https:\u002F\u002Fgithub.com\u002Fhesreallyhim\u002Fawesome-claude-code",[3307],"Awesome Claude Code"," — 社区维护的 Claude Code 资源集",[252,3391,3392,3397],{},[3303,3393,3396],{"href":3394,"rel":3395},"https:\u002F\u002Fhuggingface.co\u002Fblog\u002Flong-context",[3307],"Hugging Face: Long Context Benchmarks"," — 长上下文模型的开源 benchmark",[3399,3400,3401],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":463,"searchDepth":665,"depth":672,"links":3403},[3404,3409,3416,3423,3430,3436,3442,3443],{"id":238,"depth":672,"text":239,"children":3405},[3406,3407,3408],{"id":243,"depth":683,"text":244},{"id":363,"depth":683,"text":364},{"id":390,"depth":683,"text":391},{"id":471,"depth":672,"text":472,"children":3410},[3411,3412,3413,3414,3415],{"id":475,"depth":683,"text":476},{"id":577,"depth":683,"text":578},{"id":640,"depth":683,"text":641},{"id":889,"depth":683,"text":890},{"id":997,"depth":683,"text":998},{"id":1050,"depth":672,"text":1051,"children":3417},[3418,3419,3420,3421,3422],{"id":1054,"depth":683,"text":1055},{"id":1113,"depth":683,"text":1114},{"id":1201,"depth":683,"text":1202},{"id":1250,"depth":683,"text":1251},{"id":1448,"depth":683,"text":1449},{"id":1530,"depth":672,"text":1531,"children":3424},[3425,3426,3427,3428,3429],{"id":1534,"depth":683,"text":1535},{"id":1757,"depth":683,"text":1758},{"id":1832,"depth":683,"text":1833},{"id":1852,"depth":683,"text":1853},{"id":2045,"depth":683,"text":2046},{"id":2259,"depth":672,"text":2260,"children":3431},[3432,3433,3434,3435],{"id":2263,"depth":683,"text":2264},{"id":2326,"depth":683,"text":2327},{"id":2358,"depth":683,"text":2359},{"id":2639,"depth":683,"text":2640},{"id":2759,"depth":672,"text":2760,"children":3437},[3438,3439,3440,3441],{"id":2763,"depth":683,"text":2764},{"id":2935,"depth":683,"text":2936},{"id":2964,"depth":683,"text":2965},{"id":3017,"depth":683,"text":3018},{"id":3220,"depth":672,"text":3220},{"id":3297,"depth":672,"text":3297},"避免窗口溢出的实战技巧","md",null,{"date":3448},"2026-04-26",{"title":160,"description":3444},"jTaEV8Bel5EyxCUE5NNk4Hb4RXT_srV118FOzoLh86s",[3452,3454],{"title":156,"path":157,"stem":158,"description":3453,"children":-1},"让 Claude 准确理解你的意图",{"title":164,"path":165,"stem":166,"description":3455,"children":-1},"AI 执行、人类审查、人类决策",1777395311006]