[{"data":1,"prerenderedAt":5389},["ShallowReactive",2],{"article-/topics/ai/ai-agent-tool-schema-evolution-compatibility":3,"related-ai":1453,"content-query-yPY9lGYAs6":4217},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"topic":5,"author":11,"tags":12,"image":17,"imageQuery":18,"pexelsPhotoId":19,"pexelsUrl":20,"featured":6,"readingTime":21,"body":22,"_type":1447,"_id":1448,"_source":1449,"_file":1450,"_stem":1451,"_extension":1452},"/topics/ai/ai-agent-tool-schema-evolution-compatibility","ai",false,"","AI agent 工具 Schema 演进与兼容策略：升级参数、版本和解析逻辑时怎么不打断旧 Run","AI agent 工具不会一直不变。本文讲清 Schema 演进、兼容读取、双写双读、版本协商和回滚策略，避免旧 Run 被新工具升级打断。","2026-05-07","HTMLPAGE 团队",[13,14,15,16],"AI agent","Schema 演进","工具兼容","工程实践","/images/articles/ai-agent-tool-schema-evolution-compatibility-featured.jpg","software architecture interface diagram laptop",34803991,"https://www.pexels.com/photo/close-up-of-computer-screen-with-code-and-glasses-34803991/",21,{"type":23,"children":24,"toc":1429},"root",[25,33,38,75,82,162,167,173,178,279,284,290,295,300,313,318,333,346,352,357,451,456,474,479,484,507,512,518,523,532,537,546,551,562,567,572,581,586,592,597,602,611,616,634,639,645,650,655,664,677,683,688,693,857,862,867,876,881,887,892,905,910,939,945,950,1050,1055,1060,1069,1074,1080,1101,1106,1111,1129,1135,1140,1163,1168,1173,1271,1276,1282,1381,1386,1391,1396],{"type":26,"tag":27,"props":28,"children":29},"element","p",{},[30],{"type":31,"value":32},"text","AI agent 工具一旦进入真实业务，就不会停留在第一版 schema。字段会增加，命名会调整，枚举会拆分，某些参数会从可选变成必填。问题不在于升级本身，而在于升级经常发生在系统仍然有旧 Run、旧 prompt、旧回放样本、旧评测集的情况下。",{"type":26,"tag":27,"props":34,"children":35},{},[36],{"type":31,"value":37},"很多团队第一次踩坑，都不是因为升级失败，而是因为升级“部分成功”：新请求能跑，旧回放开始报错，某些长任务在中途继续执行时突然读不懂新结构。看起来像偶发 bug，本质却是 schema 演进策略缺位。",{"type":26,"tag":27,"props":39,"children":40},{},[41,43,50,52,58,59,65,67,73],{"type":31,"value":42},"建议先结合 ",{"type":26,"tag":44,"props":45,"children":47},"a",{"href":46},"/topics/ai/ai-agent-tool-registry-governance",[48],{"type":31,"value":49},"AI Agent 工具注册表治理",{"type":31,"value":51},"、",{"type":26,"tag":44,"props":53,"children":55},{"href":54},"/topics/ai/ai-agent-tool-result-normalization-guide",[56],{"type":31,"value":57},"AI agent 工具结果标准化",{"type":31,"value":51},{"type":26,"tag":44,"props":60,"children":62},{"href":61},"/topics/ai/ai-agent-feature-flag-release-strategy",[63],{"type":31,"value":64},"AI agent 灰度发布与功能开关",{"type":31,"value":66}," 和 ",{"type":26,"tag":44,"props":68,"children":70},{"href":69},"/topics/ai/ai-agent-session-replay-debugging",[71],{"type":31,"value":72},"AI Agent Session Replay 调试指南",{"type":31,"value":74}," 一起看。",{"type":26,"tag":76,"props":77,"children":79},"h2",{"id":78},"先给结论schema-演进要同时照顾-4-类消费者",[80],{"type":31,"value":81},"先给结论：schema 演进要同时照顾 4 类消费者",{"type":26,"tag":83,"props":84,"children":85},"table",{},[86,105],{"type":26,"tag":87,"props":88,"children":89},"thead",{},[90],{"type":26,"tag":91,"props":92,"children":93},"tr",{},[94,100],{"type":26,"tag":95,"props":96,"children":97},"th",{},[98],{"type":31,"value":99},"消费者",{"type":26,"tag":95,"props":101,"children":102},{},[103],{"type":31,"value":104},"为什么会受影响",{"type":26,"tag":106,"props":107,"children":108},"tbody",{},[109,123,136,149],{"type":26,"tag":91,"props":110,"children":111},{},[112,118],{"type":26,"tag":113,"props":114,"children":115},"td",{},[116],{"type":31,"value":117},"新请求",{"type":26,"tag":113,"props":119,"children":120},{},[121],{"type":31,"value":122},"需要理解新字段和新规则",{"type":26,"tag":91,"props":124,"children":125},{},[126,131],{"type":26,"tag":113,"props":127,"children":128},{},[129],{"type":31,"value":130},"旧 Run 恢复",{"type":26,"tag":113,"props":132,"children":133},{},[134],{"type":31,"value":135},"可能还带着旧参数继续执行",{"type":26,"tag":91,"props":137,"children":138},{},[139,144],{"type":26,"tag":113,"props":140,"children":141},{},[142],{"type":31,"value":143},"回放与评测",{"type":26,"tag":113,"props":145,"children":146},{},[147],{"type":31,"value":148},"历史样本需要按旧版本复现",{"type":26,"tag":91,"props":150,"children":151},{},[152,157],{"type":26,"tag":113,"props":153,"children":154},{},[155],{"type":31,"value":156},"观测与审计",{"type":26,"tag":113,"props":158,"children":159},{},[160],{"type":31,"value":161},"日志、告警、报表要读懂新旧结构",{"type":26,"tag":27,"props":163,"children":164},{},[165],{"type":31,"value":166},"如果你只关心“线上新请求能否跑通”，schema 升级一定会在别处留下坑。",{"type":26,"tag":76,"props":168,"children":170},{"id":169},"一先分清三种-schema-变化",[171],{"type":31,"value":172},"一、先分清三种 schema 变化",{"type":26,"tag":27,"props":174,"children":175},{},[176],{"type":31,"value":177},"不是每种变更都同样危险。至少分三类：",{"type":26,"tag":83,"props":179,"children":180},{},[181,207],{"type":26,"tag":87,"props":182,"children":183},{},[184],{"type":26,"tag":91,"props":185,"children":186},{},[187,192,197,202],{"type":26,"tag":95,"props":188,"children":189},{},[190],{"type":31,"value":191},"变化类型",{"type":26,"tag":95,"props":193,"children":194},{},[195],{"type":31,"value":196},"示例",{"type":26,"tag":95,"props":198,"children":199},{},[200],{"type":31,"value":201},"风险等级",{"type":26,"tag":95,"props":203,"children":204},{},[205],{"type":31,"value":206},"推荐策略",{"type":26,"tag":106,"props":208,"children":209},{},[210,233,256],{"type":26,"tag":91,"props":211,"children":212},{},[213,218,223,228],{"type":26,"tag":113,"props":214,"children":215},{},[216],{"type":31,"value":217},"向后兼容",{"type":26,"tag":113,"props":219,"children":220},{},[221],{"type":31,"value":222},"新增可选字段",{"type":26,"tag":113,"props":224,"children":225},{},[226],{"type":31,"value":227},"低",{"type":26,"tag":113,"props":229,"children":230},{},[231],{"type":31,"value":232},"直接发布，但保留默认值",{"type":26,"tag":91,"props":234,"children":235},{},[236,241,246,251],{"type":26,"tag":113,"props":237,"children":238},{},[239],{"type":31,"value":240},"条件兼容",{"type":26,"tag":113,"props":242,"children":243},{},[244],{"type":31,"value":245},"字段改名、枚举扩展",{"type":26,"tag":113,"props":247,"children":248},{},[249],{"type":31,"value":250},"中",{"type":26,"tag":113,"props":252,"children":253},{},[254],{"type":31,"value":255},"双写双读，灰度迁移",{"type":26,"tag":91,"props":257,"children":258},{},[259,264,269,274],{"type":26,"tag":113,"props":260,"children":261},{},[262],{"type":31,"value":263},"破坏性变更",{"type":26,"tag":113,"props":265,"children":266},{},[267],{"type":31,"value":268},"必填新增、结构重组",{"type":26,"tag":113,"props":270,"children":271},{},[272],{"type":31,"value":273},"高",{"type":26,"tag":113,"props":275,"children":276},{},[277],{"type":31,"value":278},"新旧版本并存，逐步切换",{"type":26,"tag":27,"props":280,"children":281},{},[282],{"type":31,"value":283},"最危险的是把破坏性变更伪装成“只是字段改了一下”。",{"type":26,"tag":76,"props":285,"children":287},{"id":286},"二工具-schema-不要只存一份当前版本",[288],{"type":31,"value":289},"二、工具 schema 不要只存一份“当前版本”",{"type":26,"tag":27,"props":291,"children":292},{},[293],{"type":31,"value":294},"很多系统的工具定义只有当前 schema。这样做的后果是：历史 Run 无法知道自己当时到底用的是哪版结构。",{"type":26,"tag":27,"props":296,"children":297},{},[298],{"type":31,"value":299},"更稳的做法是把版本作为一等公民：",{"type":26,"tag":301,"props":302,"children":307},"pre",{"className":303,"code":305,"language":306,"meta":7},[304],"language-json","{\n  \"toolName\": \"createDraft\",\n  \"schemaVersion\": \"v2\",\n  \"status\": \"active\",\n  \"compatibility\": {\n    \"reads\": [\"v1\", \"v2\"],\n    \"writes\": [\"v2\"]\n  }\n}\n","json",[308],{"type":26,"tag":309,"props":310,"children":311},"code",{"__ignoreMap":7},[312],{"type":31,"value":305},{"type":26,"tag":27,"props":314,"children":315},{},[316],{"type":31,"value":317},"这里有两个关键点：",{"type":26,"tag":319,"props":320,"children":321},"ul",{},[322,328],{"type":26,"tag":323,"props":324,"children":325},"li",{},[326],{"type":31,"value":327},"工具当前写什么版本",{"type":26,"tag":323,"props":329,"children":330},{},[331],{"type":31,"value":332},"工具还能读什么版本",{"type":26,"tag":27,"props":334,"children":335},{},[336,338,344],{"type":31,"value":337},"如果只记录 ",{"type":26,"tag":309,"props":339,"children":341},{"className":340},[],[342],{"type":31,"value":343},"current=v2",{"type":31,"value":345},"，恢复旧任务时系统仍然不知道该如何解释旧 payload。",{"type":26,"tag":76,"props":347,"children":349},{"id":348},"三双写双读是过渡期的主策略",[350],{"type":31,"value":351},"三、双写双读是过渡期的主策略",{"type":26,"tag":27,"props":353,"children":354},{},[355],{"type":31,"value":356},"当 schema 从 v1 升级到 v2，最稳的过渡不是强切，而是一个短暂的双写双读窗口：",{"type":26,"tag":83,"props":358,"children":359},{},[360,381],{"type":26,"tag":87,"props":361,"children":362},{},[363],{"type":26,"tag":91,"props":364,"children":365},{},[366,371,376],{"type":26,"tag":95,"props":367,"children":368},{},[369],{"type":31,"value":370},"阶段",{"type":26,"tag":95,"props":372,"children":373},{},[374],{"type":31,"value":375},"读",{"type":26,"tag":95,"props":377,"children":378},{},[379],{"type":31,"value":380},"写",{"type":26,"tag":106,"props":382,"children":383},{},[384,401,418,435],{"type":26,"tag":91,"props":385,"children":386},{},[387,392,397],{"type":26,"tag":113,"props":388,"children":389},{},[390],{"type":31,"value":391},"阶段 1",{"type":26,"tag":113,"props":393,"children":394},{},[395],{"type":31,"value":396},"v1",{"type":26,"tag":113,"props":398,"children":399},{},[400],{"type":31,"value":396},{"type":26,"tag":91,"props":402,"children":403},{},[404,409,414],{"type":26,"tag":113,"props":405,"children":406},{},[407],{"type":31,"value":408},"阶段 2",{"type":26,"tag":113,"props":410,"children":411},{},[412],{"type":31,"value":413},"v1 + v2",{"type":26,"tag":113,"props":415,"children":416},{},[417],{"type":31,"value":413},{"type":26,"tag":91,"props":419,"children":420},{},[421,426,430],{"type":26,"tag":113,"props":422,"children":423},{},[424],{"type":31,"value":425},"阶段 3",{"type":26,"tag":113,"props":427,"children":428},{},[429],{"type":31,"value":413},{"type":26,"tag":113,"props":431,"children":432},{},[433],{"type":31,"value":434},"v2",{"type":26,"tag":91,"props":436,"children":437},{},[438,443,447],{"type":26,"tag":113,"props":439,"children":440},{},[441],{"type":31,"value":442},"阶段 4",{"type":26,"tag":113,"props":444,"children":445},{},[446],{"type":31,"value":434},{"type":26,"tag":113,"props":448,"children":449},{},[450],{"type":31,"value":434},{"type":26,"tag":27,"props":452,"children":453},{},[454],{"type":31,"value":455},"这意味着：",{"type":26,"tag":319,"props":457,"children":458},{},[459,464,469],{"type":26,"tag":323,"props":460,"children":461},{},[462],{"type":31,"value":463},"parser 能同时解释 v1 和 v2",{"type":26,"tag":323,"props":465,"children":466},{},[467],{"type":31,"value":468},"新产生的 artifact 可以暂时同时保存旧结构和新结构",{"type":26,"tag":323,"props":470,"children":471},{},[472],{"type":31,"value":473},"回放和恢复不会立刻断掉",{"type":26,"tag":27,"props":475,"children":476},{},[477],{"type":31,"value":478},"双写双读看起来麻烦，但比半夜修历史 Run 要便宜得多。",{"type":26,"tag":27,"props":480,"children":481},{},[482],{"type":31,"value":483},"还有一个经常被忽略的现实问题：双写窗口如果没有明确结束条件，就会无限期存在，最后把系统拖成“什么都兼容、什么都不敢删”的状态。因此每次进入双写双读前，就要先定义退出门槛，例如：",{"type":26,"tag":319,"props":485,"children":486},{},[487,492,497,502],{"type":26,"tag":323,"props":488,"children":489},{},[490],{"type":31,"value":491},"新版本写入占比连续 7 天超过 95%",{"type":26,"tag":323,"props":493,"children":494},{},[495],{"type":31,"value":496},"历史回放样本全部通过 v2 adapter",{"type":26,"tag":323,"props":498,"children":499},{},[500],{"type":31,"value":501},"checkpoint 恢复在新旧版本下都通过演练",{"type":26,"tag":323,"props":503,"children":504},{},[505],{"type":31,"value":506},"审计报表已经切换到新字段口径",{"type":26,"tag":27,"props":508,"children":509},{},[510],{"type":31,"value":511},"只有退出条件提前写清，双写双读才是迁移手段，而不是永久负债。",{"type":26,"tag":76,"props":513,"children":515},{"id":514},"四改名和重组时最好显式提供-compatibility-adapter",[516],{"type":31,"value":517},"四、改名和重组时，最好显式提供 compatibility adapter",{"type":26,"tag":27,"props":519,"children":520},{},[521],{"type":31,"value":522},"比如原来的参数是：",{"type":26,"tag":301,"props":524,"children":527},{"className":525,"code":526,"language":306,"meta":7},[304],"{ \"invoiceId\": \"inv_123\" }\n",[528],{"type":26,"tag":309,"props":529,"children":530},{"__ignoreMap":7},[531],{"type":31,"value":526},{"type":26,"tag":27,"props":533,"children":534},{},[535],{"type":31,"value":536},"新版本改成：",{"type":26,"tag":301,"props":538,"children":541},{"className":539,"code":540,"language":306,"meta":7},[304],"{\n  \"invoice\": {\n    \"id\": \"inv_123\",\n    \"country\": \"CN\"\n  }\n}\n",[542],{"type":26,"tag":309,"props":543,"children":544},{"__ignoreMap":7},[545],{"type":31,"value":540},{"type":26,"tag":27,"props":547,"children":548},{},[549],{"type":31,"value":550},"不要指望模型自己猜旧字段如何映射到新结构，而应该在工具层提供 adapter：",{"type":26,"tag":301,"props":552,"children":557},{"className":553,"code":555,"language":556,"meta":7},[554],"language-ts","function normalizeCreateInvoiceInput(input: unknown): CreateInvoiceV2Input {\n  if (isV2(input)) return input\n\n  if (isV1(input)) {\n    return {\n      invoice: {\n        id: input.invoiceId,\n        country: 'CN'\n      }\n    }\n  }\n\n  throw new Error('unsupported schema version')\n}\n","ts",[558],{"type":26,"tag":309,"props":559,"children":560},{"__ignoreMap":7},[561],{"type":31,"value":555},{"type":26,"tag":27,"props":563,"children":564},{},[565],{"type":31,"value":566},"兼容逻辑应该放在工具边界，而不是 prompt 里。prompt 只能影响新生成的参数，不能修复历史数据。",{"type":26,"tag":27,"props":568,"children":569},{},[570],{"type":31,"value":571},"如果工具输入不只来自模型，还来自工作流引擎、批量回放脚本、人工修复控制台，那么 adapter 最好输出一份统一的“解析结果”，而不是仅仅返回业务对象：",{"type":26,"tag":301,"props":573,"children":576},{"className":574,"code":575,"language":556,"meta":7},[554],"interface ParsedToolInput\u003CT> {\n  schemaVersion: 'v1' | 'v2'\n  normalized: T\n  migrated: boolean\n  warnings: string[]\n}\n\nfunction parseCreateInvoiceInput(input: unknown): ParsedToolInput\u003CCreateInvoiceV2Input> {\n  if (isV2(input)) {\n    return {\n      schemaVersion: 'v2',\n      normalized: input,\n      migrated: false,\n      warnings: []\n    }\n  }\n\n  if (isV1(input)) {\n    return {\n      schemaVersion: 'v1',\n      normalized: {\n        invoice: {\n          id: input.invoiceId,\n          country: 'CN'\n        }\n      },\n      migrated: true,\n      warnings: ['country defaulted to CN for legacy payload']\n    }\n  }\n\n  throw new Error('unsupported schema version')\n}\n",[577],{"type":26,"tag":309,"props":578,"children":579},{"__ignoreMap":7},[580],{"type":31,"value":575},{"type":26,"tag":27,"props":582,"children":583},{},[584],{"type":31,"value":585},"这样做的价值是：后续日志、审计和告警可以清楚知道本次执行到底是原生 v2，还是从旧结构迁移过来的“兼容成功”。",{"type":26,"tag":76,"props":587,"children":589},{"id":588},"五版本协商最好显式化不要靠隐式猜测",[590],{"type":31,"value":591},"五、版本协商最好显式化，不要靠隐式猜测",{"type":26,"tag":27,"props":593,"children":594},{},[595],{"type":31,"value":596},"不少系统把“schemaVersion”藏在文档或者注释里，实际运行时靠 parser 猜。短期能跑，长期会让行为越来越不可解释。",{"type":26,"tag":27,"props":598,"children":599},{},[600],{"type":31,"value":601},"更稳的方式是把版本协商写成明确协议：",{"type":26,"tag":301,"props":603,"children":606},{"className":604,"code":605,"language":306,"meta":7},[304],"{\n  \"toolName\": \"createDraft\",\n  \"requestedSchemaVersion\": \"v2\",\n  \"acceptedSchemaVersions\": [\"v1\", \"v2\"],\n  \"selectedSchemaVersion\": \"v1\",\n  \"adapterVersion\": \"2026-05-07\",\n  \"selectionReason\": \"checkpoint_resume_from_legacy_run\"\n}\n",[607],{"type":26,"tag":309,"props":608,"children":609},{"__ignoreMap":7},[610],{"type":31,"value":605},{"type":26,"tag":27,"props":612,"children":613},{},[614],{"type":31,"value":615},"这个结构至少解决 3 个问题：",{"type":26,"tag":319,"props":617,"children":618},{},[619,624,629],{"type":26,"tag":323,"props":620,"children":621},{},[622],{"type":31,"value":623},"新请求为什么没有直接走最新版",{"type":26,"tag":323,"props":625,"children":626},{},[627],{"type":31,"value":628},"恢复任务当前到底按哪版协议执行",{"type":26,"tag":323,"props":630,"children":631},{},[632],{"type":31,"value":633},"故障复盘时该看哪套 adapter 和测试基线",{"type":26,"tag":27,"props":635,"children":636},{},[637],{"type":31,"value":638},"很多团队的问题不是没有版本，而是版本只存在于代码里，不存在于运行事实里。",{"type":26,"tag":76,"props":640,"children":642},{"id":641},"六长任务恢复时schema-版本必须跟着-checkpoint-走",[643],{"type":31,"value":644},"六、长任务恢复时，schema 版本必须跟着 checkpoint 走",{"type":26,"tag":27,"props":646,"children":647},{},[648],{"type":31,"value":649},"一个常见误区是：任务恢复时重新读取“当前最新 schema”。这会让长任务在中途切换协议。",{"type":26,"tag":27,"props":651,"children":652},{},[653],{"type":31,"value":654},"恢复信息至少要保存：",{"type":26,"tag":301,"props":656,"children":659},{"className":657,"code":658,"language":306,"meta":7},[304],"{\n  \"runId\": \"run_123\",\n  \"toolName\": \"createDraft\",\n  \"schemaVersion\": \"v1\",\n  \"checkpointId\": \"cp_03\",\n  \"inputSnapshot\": { \"invoiceId\": \"inv_123\" }\n}\n",[660],{"type":26,"tag":309,"props":661,"children":662},{"__ignoreMap":7},[663],{"type":31,"value":658},{"type":26,"tag":27,"props":665,"children":666},{},[667,669,675],{"type":31,"value":668},"恢复时先按当时的 ",{"type":26,"tag":309,"props":670,"children":672},{"className":671},[],[673],{"type":31,"value":674},"schemaVersion",{"type":31,"value":676}," 解释 payload，再决定是否需要迁移。不要让“继续执行”变成“顺便升级协议”。",{"type":26,"tag":76,"props":678,"children":680},{"id":679},"七兼容矩阵要成为发布门禁不只是文档附件",[681],{"type":31,"value":682},"七、兼容矩阵要成为发布门禁，不只是文档附件",{"type":26,"tag":27,"props":684,"children":685},{},[686],{"type":31,"value":687},"最容易被低估的是测试范围。schema 演进不是单测改过就算结束，真正需要验证的是“谁写、谁读、何时恢复、如何回放”的交叉组合。",{"type":26,"tag":27,"props":689,"children":690},{},[691],{"type":31,"value":692},"一个最小兼容矩阵通常至少包括下面这些维度：",{"type":26,"tag":83,"props":694,"children":695},{},[696,722],{"type":26,"tag":87,"props":697,"children":698},{},[699],{"type":26,"tag":91,"props":700,"children":701},{},[702,707,712,717],{"type":26,"tag":95,"props":703,"children":704},{},[705],{"type":31,"value":706},"写入方",{"type":26,"tag":95,"props":708,"children":709},{},[710],{"type":31,"value":711},"读取方",{"type":26,"tag":95,"props":713,"children":714},{},[715],{"type":31,"value":716},"运行场景",{"type":26,"tag":95,"props":718,"children":719},{},[720],{"type":31,"value":721},"预期结果",{"type":26,"tag":106,"props":723,"children":724},{},[725,747,769,790,811,834],{"type":26,"tag":91,"props":726,"children":727},{},[728,732,737,742],{"type":26,"tag":113,"props":729,"children":730},{},[731],{"type":31,"value":396},{"type":26,"tag":113,"props":733,"children":734},{},[735],{"type":31,"value":736},"v1 parser",{"type":26,"tag":113,"props":738,"children":739},{},[740],{"type":31,"value":741},"老任务正常执行",{"type":26,"tag":113,"props":743,"children":744},{},[745],{"type":31,"value":746},"通过",{"type":26,"tag":91,"props":748,"children":749},{},[750,754,759,764],{"type":26,"tag":113,"props":751,"children":752},{},[753],{"type":31,"value":396},{"type":26,"tag":113,"props":755,"children":756},{},[757],{"type":31,"value":758},"v2 parser + adapter",{"type":26,"tag":113,"props":760,"children":761},{},[762],{"type":31,"value":763},"历史 Run 恢复",{"type":26,"tag":113,"props":765,"children":766},{},[767],{"type":31,"value":768},"通过并产出迁移告警",{"type":26,"tag":91,"props":770,"children":771},{},[772,776,780,785],{"type":26,"tag":113,"props":773,"children":774},{},[775],{"type":31,"value":434},{"type":26,"tag":113,"props":777,"children":778},{},[779],{"type":31,"value":736},{"type":26,"tag":113,"props":781,"children":782},{},[783],{"type":31,"value":784},"回滚后读取新数据",{"type":26,"tag":113,"props":786,"children":787},{},[788],{"type":31,"value":789},"明确失败或受控降级",{"type":26,"tag":91,"props":791,"children":792},{},[793,797,802,807],{"type":26,"tag":113,"props":794,"children":795},{},[796],{"type":31,"value":434},{"type":26,"tag":113,"props":798,"children":799},{},[800],{"type":31,"value":801},"v2 parser",{"type":26,"tag":113,"props":803,"children":804},{},[805],{"type":31,"value":806},"新请求实时执行",{"type":26,"tag":113,"props":808,"children":809},{},[810],{"type":31,"value":746},{"type":26,"tag":91,"props":812,"children":813},{},[814,819,824,829],{"type":26,"tag":113,"props":815,"children":816},{},[817],{"type":31,"value":818},"v1 checkpoint",{"type":26,"tag":113,"props":820,"children":821},{},[822],{"type":31,"value":823},"v2 runtime",{"type":26,"tag":113,"props":825,"children":826},{},[827],{"type":31,"value":828},"断点恢复",{"type":26,"tag":113,"props":830,"children":831},{},[832],{"type":31,"value":833},"不丢上下文，不重复副作用",{"type":26,"tag":91,"props":835,"children":836},{},[837,842,847,852],{"type":26,"tag":113,"props":838,"children":839},{},[840],{"type":31,"value":841},"v2 artifact",{"type":26,"tag":113,"props":843,"children":844},{},[845],{"type":31,"value":846},"replay loader",{"type":26,"tag":113,"props":848,"children":849},{},[850],{"type":31,"value":851},"历史回放",{"type":26,"tag":113,"props":853,"children":854},{},[855],{"type":31,"value":856},"通过并保持结果可解释",{"type":26,"tag":27,"props":858,"children":859},{},[860],{"type":31,"value":861},"如果发布单里没有这张表，团队就很容易只测“新写新读”，完全漏掉恢复与回放。",{"type":26,"tag":27,"props":863,"children":864},{},[865],{"type":31,"value":866},"更进一步，兼容矩阵最好直接落到 CI 或回归脚本，而不是贴在文档里就算完成：",{"type":26,"tag":301,"props":868,"children":871},{"className":869,"code":870,"language":556,"meta":7},[554],"const compatibilityCases = [\n  { writer: 'v1', reader: 'v2', scenario: 'resume' },\n  { writer: 'v2', reader: 'v2', scenario: 'replay' },\n  { writer: 'v2', reader: 'v1', scenario: 'rollback-read' }\n]\n\nfor (const testCase of compatibilityCases) {\n  expect(runCompatibilityCase(testCase)).toMatchObject({ ok: true })\n}\n",[872],{"type":26,"tag":309,"props":873,"children":874},{"__ignoreMap":7},[875],{"type":31,"value":870},{"type":26,"tag":27,"props":877,"children":878},{},[879],{"type":31,"value":880},"这里的重点不是测试代码写成什么样，而是兼容性要从“人为记得测”变成“系统强制测”。",{"type":26,"tag":76,"props":882,"children":884},{"id":883},"八回滚不是只切-flag还要考虑历史数据可读性",[885],{"type":31,"value":886},"八、回滚不是只切 flag，还要考虑历史数据可读性",{"type":26,"tag":27,"props":888,"children":889},{},[890],{"type":31,"value":891},"如果你发布 v2 后发现有问题，回滚时最容易漏掉两件事：",{"type":26,"tag":319,"props":893,"children":894},{},[895,900],{"type":26,"tag":323,"props":896,"children":897},{},[898],{"type":31,"value":899},"已经写出的 v2 数据，旧版本是否还能读取",{"type":26,"tag":323,"props":901,"children":902},{},[903],{"type":31,"value":904},"旧 prompt 是否会继续生成 v1 风格参数",{"type":26,"tag":27,"props":906,"children":907},{},[908],{"type":31,"value":909},"一个更完整的回滚清单是：",{"type":26,"tag":911,"props":912,"children":913},"ol",{},[914,919,924,929,934],{"type":26,"tag":323,"props":915,"children":916},{},[917],{"type":31,"value":918},"关闭新 schema 的写入。",{"type":26,"tag":323,"props":920,"children":921},{},[922],{"type":31,"value":923},"保留对新写入数据的兼容读取。",{"type":26,"tag":323,"props":925,"children":926},{},[927],{"type":31,"value":928},"暂停相关回放任务，避免读写混乱。",{"type":26,"tag":323,"props":930,"children":931},{},[932],{"type":31,"value":933},"标记受影响的 Run 和 artifact。",{"type":26,"tag":323,"props":935,"children":936},{},[937],{"type":31,"value":938},"把失败样本加入回归集。",{"type":26,"tag":76,"props":940,"children":942},{"id":941},"九上线后要盯兼容指标而不是只盯成功率",[943],{"type":31,"value":944},"九、上线后要盯兼容指标，而不是只盯成功率",{"type":26,"tag":27,"props":946,"children":947},{},[948],{"type":31,"value":949},"很多 schema 变更上线后表面成功率没掉，但兼容成本正在悄悄抬高。真正值得盯的不是单一错误率，而是这些迁移相关指标：",{"type":26,"tag":83,"props":951,"children":952},{},[953,969],{"type":26,"tag":87,"props":954,"children":955},{},[956],{"type":26,"tag":91,"props":957,"children":958},{},[959,964],{"type":26,"tag":95,"props":960,"children":961},{},[962],{"type":31,"value":963},"指标",{"type":26,"tag":95,"props":965,"children":966},{},[967],{"type":31,"value":968},"为什么要看",{"type":26,"tag":106,"props":970,"children":971},{},[972,985,998,1011,1024,1037],{"type":26,"tag":91,"props":973,"children":974},{},[975,980],{"type":26,"tag":113,"props":976,"children":977},{},[978],{"type":31,"value":979},"旧版本 payload 占比",{"type":26,"tag":113,"props":981,"children":982},{},[983],{"type":31,"value":984},"判断双写窗口是否可以收口",{"type":26,"tag":91,"props":986,"children":987},{},[988,993],{"type":26,"tag":113,"props":989,"children":990},{},[991],{"type":31,"value":992},"adapter 命中率",{"type":26,"tag":113,"props":994,"children":995},{},[996],{"type":31,"value":997},"判断历史数据依赖面是否仍然很大",{"type":26,"tag":91,"props":999,"children":1000},{},[1001,1006],{"type":26,"tag":113,"props":1002,"children":1003},{},[1004],{"type":31,"value":1005},"adapter 失败率",{"type":26,"tag":113,"props":1007,"children":1008},{},[1009],{"type":31,"value":1010},"发现未覆盖的旧结构",{"type":26,"tag":91,"props":1012,"children":1013},{},[1014,1019],{"type":26,"tag":113,"props":1015,"children":1016},{},[1017],{"type":31,"value":1018},"checkpoint 恢复成功率",{"type":26,"tag":113,"props":1020,"children":1021},{},[1022],{"type":31,"value":1023},"判断长任务是否被版本切换打断",{"type":26,"tag":91,"props":1025,"children":1026},{},[1027,1032],{"type":26,"tag":113,"props":1028,"children":1029},{},[1030],{"type":31,"value":1031},"replay 兼容通过率",{"type":26,"tag":113,"props":1033,"children":1034},{},[1035],{"type":31,"value":1036},"判断审计和复盘链路是否可用",{"type":26,"tag":91,"props":1038,"children":1039},{},[1040,1045],{"type":26,"tag":113,"props":1041,"children":1042},{},[1043],{"type":31,"value":1044},"迁移告警量",{"type":26,"tag":113,"props":1046,"children":1047},{},[1048],{"type":31,"value":1049},"判断是否出现默认值兜底过多",{"type":26,"tag":27,"props":1051,"children":1052},{},[1053],{"type":31,"value":1054},"如果只看“接口 200 比例”，你会错过很多已经在恢复链路里发生的结构性问题。",{"type":26,"tag":27,"props":1056,"children":1057},{},[1058],{"type":31,"value":1059},"建议给每次兼容解析打上统一日志：",{"type":26,"tag":301,"props":1061,"children":1064},{"className":1062,"code":1063,"language":306,"meta":7},[304],"{\n  \"event\": \"tool_schema_parse\",\n  \"toolName\": \"createDraft\",\n  \"selectedSchemaVersion\": \"v1\",\n  \"adapterVersion\": \"2026-05-07\",\n  \"migrated\": true,\n  \"warningCount\": 1,\n  \"runId\": \"run_123\"\n}\n",[1065],{"type":26,"tag":309,"props":1066,"children":1067},{"__ignoreMap":7},[1068],{"type":31,"value":1063},{"type":26,"tag":27,"props":1070,"children":1071},{},[1072],{"type":31,"value":1073},"这类日志不是为了“多记一点”，而是为了在双写窗口结束前，知道系统到底还有多少历史包袱没有处理完。",{"type":26,"tag":76,"props":1075,"children":1077},{"id":1076},"十失败案例字段改名后回放全挂但线上新请求正常",[1078],{"type":31,"value":1079},"十、失败案例：字段改名后，回放全挂但线上新请求正常",{"type":26,"tag":27,"props":1081,"children":1082},{},[1083,1085,1091,1093,1099],{"type":31,"value":1084},"一个审核 Agent 原来写 ",{"type":26,"tag":309,"props":1086,"children":1088},{"className":1087},[],[1089],{"type":31,"value":1090},"reviewerId",{"type":31,"value":1092},"，后来统一成 ",{"type":26,"tag":309,"props":1094,"children":1096},{"className":1095},[],[1097],{"type":31,"value":1098},"reviewer_id",{"type":31,"value":1100},"。线上新请求没问题，因为 prompt 和新 parser 一起更新了。但历史 replay 还保留旧事件，回放平台直接报解析失败。",{"type":26,"tag":27,"props":1102,"children":1103},{},[1104],{"type":31,"value":1105},"更糟的是，团队一开始没意识到这算生产问题，因为“真实流量没报错”。直到事故复盘需要回放上周 Run，才发现关键样本全读不出来。",{"type":26,"tag":27,"props":1107,"children":1108},{},[1109],{"type":31,"value":1110},"修复方式不是把回放平台临时兼容一下，而是：",{"type":26,"tag":319,"props":1112,"children":1113},{},[1114,1119,1124],{"type":26,"tag":323,"props":1115,"children":1116},{},[1117],{"type":31,"value":1118},"给工具 registry 加 schemaVersion",{"type":26,"tag":323,"props":1120,"children":1121},{},[1122],{"type":31,"value":1123},"replay loader 支持旧事件 adapter",{"type":26,"tag":323,"props":1125,"children":1126},{},[1127],{"type":31,"value":1128},"任何字段改名都必须附带 compatibility test",{"type":26,"tag":76,"props":1130,"children":1132},{"id":1131},"十一把迁移节奏写进发布单避免团队各自理解",[1133],{"type":31,"value":1134},"十一、把迁移节奏写进发布单，避免团队各自理解",{"type":26,"tag":27,"props":1136,"children":1137},{},[1138],{"type":31,"value":1139},"一个成熟的 schema 演进流程，通常不是一次发布，而是至少 4 步：",{"type":26,"tag":911,"props":1141,"children":1142},{},[1143,1148,1153,1158],{"type":26,"tag":323,"props":1144,"children":1145},{},[1146],{"type":31,"value":1147},"先发布新 parser 和 adapter，只增加读取能力。",{"type":26,"tag":323,"props":1149,"children":1150},{},[1151],{"type":31,"value":1152},"再灰度新写入，让少量新请求产出 v2 数据。",{"type":26,"tag":323,"props":1154,"children":1155},{},[1156],{"type":31,"value":1157},"观察恢复、回放、报表、审计是否稳定。",{"type":26,"tag":323,"props":1159,"children":1160},{},[1161],{"type":31,"value":1162},"最后关闭 v1 写入，确认收口窗口和删除计划。",{"type":26,"tag":27,"props":1164,"children":1165},{},[1166],{"type":31,"value":1167},"这 4 步如果没有明确负责人，现实里往往会演变成：开发以为已经切完，数据团队还在读旧字段，运维以为双写是临时，最后没人敢删。",{"type":26,"tag":27,"props":1169,"children":1170},{},[1171],{"type":31,"value":1172},"因此发布单里最好明确写出：",{"type":26,"tag":83,"props":1174,"children":1175},{},[1176,1197],{"type":26,"tag":87,"props":1177,"children":1178},{},[1179],{"type":26,"tag":91,"props":1180,"children":1181},{},[1182,1187,1192],{"type":26,"tag":95,"props":1183,"children":1184},{},[1185],{"type":31,"value":1186},"项目",{"type":26,"tag":95,"props":1188,"children":1189},{},[1190],{"type":31,"value":1191},"负责人",{"type":26,"tag":95,"props":1193,"children":1194},{},[1195],{"type":31,"value":1196},"退出条件",{"type":26,"tag":106,"props":1198,"children":1199},{},[1200,1218,1236,1254],{"type":26,"tag":91,"props":1201,"children":1202},{},[1203,1208,1213],{"type":26,"tag":113,"props":1204,"children":1205},{},[1206],{"type":31,"value":1207},"parser 双读",{"type":26,"tag":113,"props":1209,"children":1210},{},[1211],{"type":31,"value":1212},"平台工程",{"type":26,"tag":113,"props":1214,"children":1215},{},[1216],{"type":31,"value":1217},"历史回放通过率 100%",{"type":26,"tag":91,"props":1219,"children":1220},{},[1221,1226,1231],{"type":26,"tag":113,"props":1222,"children":1223},{},[1224],{"type":31,"value":1225},"v2 灰度写入",{"type":26,"tag":113,"props":1227,"children":1228},{},[1229],{"type":31,"value":1230},"业务开发",{"type":26,"tag":113,"props":1232,"children":1233},{},[1234],{"type":31,"value":1235},"新写入占比 > 95%",{"type":26,"tag":91,"props":1237,"children":1238},{},[1239,1244,1249],{"type":26,"tag":113,"props":1240,"children":1241},{},[1242],{"type":31,"value":1243},"审计口径切换",{"type":26,"tag":113,"props":1245,"children":1246},{},[1247],{"type":31,"value":1248},"数据/风控",{"type":26,"tag":113,"props":1250,"children":1251},{},[1252],{"type":31,"value":1253},"报表字段完成对齐",{"type":26,"tag":91,"props":1255,"children":1256},{},[1257,1262,1266],{"type":26,"tag":113,"props":1258,"children":1259},{},[1260],{"type":31,"value":1261},"删除 v1 写入",{"type":26,"tag":113,"props":1263,"children":1264},{},[1265],{"type":31,"value":1212},{"type":26,"tag":113,"props":1267,"children":1268},{},[1269],{"type":31,"value":1270},"连续一周无兼容告警",{"type":26,"tag":27,"props":1272,"children":1273},{},[1274],{"type":31,"value":1275},"当 schema 演进开始被当成跨团队发布节奏管理，它才真的从“代码改动”升级成“协议治理”。",{"type":26,"tag":76,"props":1277,"children":1279},{"id":1278},"十二schema-演进-checklist",[1280],{"type":31,"value":1281},"十二、Schema 演进 Checklist",{"type":26,"tag":319,"props":1283,"children":1286},{"className":1284},[1285],"contains-task-list",[1287,1300,1309,1318,1327,1336,1345,1354,1363,1372],{"type":26,"tag":323,"props":1288,"children":1291},{"className":1289},[1290],"task-list-item",[1292,1298],{"type":26,"tag":1293,"props":1294,"children":1297},"input",{"disabled":1295,"type":1296},true,"checkbox",[],{"type":31,"value":1299}," 是否明确区分向后兼容、条件兼容和破坏性变更",{"type":26,"tag":323,"props":1301,"children":1303},{"className":1302},[1290],[1304,1307],{"type":26,"tag":1293,"props":1305,"children":1306},{"disabled":1295,"type":1296},[],{"type":31,"value":1308}," 工具 registry 是否记录 schemaVersion",{"type":26,"tag":323,"props":1310,"children":1312},{"className":1311},[1290],[1313,1316],{"type":26,"tag":1293,"props":1314,"children":1315},{"disabled":1295,"type":1296},[],{"type":31,"value":1317}," 运行时是否显式记录 selectedSchemaVersion 和 adapterVersion",{"type":26,"tag":323,"props":1319,"children":1321},{"className":1320},[1290],[1322,1325],{"type":26,"tag":1293,"props":1323,"children":1324},{"disabled":1295,"type":1296},[],{"type":31,"value":1326}," parser 是否支持双读或 adapter",{"type":26,"tag":323,"props":1328,"children":1330},{"className":1329},[1290],[1331,1334],{"type":26,"tag":1293,"props":1332,"children":1333},{"disabled":1295,"type":1296},[],{"type":31,"value":1335}," 是否有写入方 x 读取方 x 场景的兼容矩阵测试",{"type":26,"tag":323,"props":1337,"children":1339},{"className":1338},[1290],[1340,1343],{"type":26,"tag":1293,"props":1341,"children":1342},{"disabled":1295,"type":1296},[],{"type":31,"value":1344}," 长任务 checkpoint 是否保存版本信息",{"type":26,"tag":323,"props":1346,"children":1348},{"className":1347},[1290],[1349,1352],{"type":26,"tag":1293,"props":1350,"children":1351},{"disabled":1295,"type":1296},[],{"type":31,"value":1353}," 回滚后是否还能读新旧数据",{"type":26,"tag":323,"props":1355,"children":1357},{"className":1356},[1290],[1358,1361],{"type":26,"tag":1293,"props":1359,"children":1360},{"disabled":1295,"type":1296},[],{"type":31,"value":1362}," 是否监控旧版本占比、adapter 命中率和恢复成功率",{"type":26,"tag":323,"props":1364,"children":1366},{"className":1365},[1290],[1367,1370],{"type":26,"tag":1293,"props":1368,"children":1369},{"disabled":1295,"type":1296},[],{"type":31,"value":1371}," 回放和评测样本是否跑过兼容测试",{"type":26,"tag":323,"props":1373,"children":1375},{"className":1374},[1290],[1376,1379],{"type":26,"tag":1293,"props":1377,"children":1378},{"disabled":1295,"type":1296},[],{"type":31,"value":1380}," 变更是否附带灰度和关闭条件",{"type":26,"tag":76,"props":1382,"children":1384},{"id":1383},"结语",[1385],{"type":31,"value":1383},{"type":26,"tag":27,"props":1387,"children":1388},{},[1389],{"type":31,"value":1390},"AI agent 的工具 schema 演进，不是“改个 JSON”这么简单。真正要治理的是版本、恢复、回放、审计和回滚。只有把 schema 升级当成系统协议演进，而不是单次代码改动，工具体系才不会越长越脆。",{"type":26,"tag":27,"props":1392,"children":1393},{},[1394],{"type":31,"value":1395},"延伸阅读：",{"type":26,"tag":319,"props":1397,"children":1398},{},[1399,1406,1413,1422],{"type":26,"tag":323,"props":1400,"children":1401},{},[1402],{"type":26,"tag":44,"props":1403,"children":1404},{"href":46},[1405],{"type":31,"value":49},{"type":26,"tag":323,"props":1407,"children":1408},{},[1409],{"type":26,"tag":44,"props":1410,"children":1411},{"href":54},[1412],{"type":31,"value":57},{"type":26,"tag":323,"props":1414,"children":1415},{},[1416],{"type":26,"tag":44,"props":1417,"children":1419},{"href":1418},"/topics/ai/ai-agent-checkpoint-resume-recovery",[1420],{"type":31,"value":1421},"AI agent Checkpoint 与断点恢复",{"type":26,"tag":323,"props":1423,"children":1424},{},[1425],{"type":26,"tag":44,"props":1426,"children":1427},{"href":61},[1428],{"type":31,"value":64},{"title":7,"searchDepth":1430,"depth":1430,"links":1431},3,[1432,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446],{"id":78,"depth":1433,"text":81},2,{"id":169,"depth":1433,"text":172},{"id":286,"depth":1433,"text":289},{"id":348,"depth":1433,"text":351},{"id":514,"depth":1433,"text":517},{"id":588,"depth":1433,"text":591},{"id":641,"depth":1433,"text":644},{"id":679,"depth":1433,"text":682},{"id":883,"depth":1433,"text":886},{"id":941,"depth":1433,"text":944},{"id":1076,"depth":1433,"text":1079},{"id":1131,"depth":1433,"text":1134},{"id":1278,"depth":1433,"text":1281},{"id":1383,"depth":1433,"text":1383},"markdown","content:topics:ai:ai-agent-tool-schema-evolution-compatibility.md","content","topics/ai/ai-agent-tool-schema-evolution-compatibility.md","topics/ai/ai-agent-tool-schema-evolution-compatibility","md",[1454,2608,3555],{"_path":1455,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":1456,"description":1457,"date":1458,"topic":5,"author":11,"tags":1459,"image":1465,"imageAlt":1466,"pexelsPhotoId":1467,"pexelsUrl":1468,"readingTime":1469,"body":1470,"_type":1447,"_id":2605,"_source":1449,"_file":2606,"_stem":2607,"_extension":1452},"/topics/ai/cursor-keyboard-shortcuts-cheatsheet","Cursor 快捷键速查表（macOS/Windows）：从“会用”到“能提效”的 10 个工作流","把 Cursor 常用快捷键按任务分组（查代码、改代码、多文件、对话、审查与回滚），给出可直接照抄的工作流与最小回归清单，避免“快捷键背了也没变快”。","2026-03-02",[1460,1461,1462,1463,1464],"Cursor","快捷键","AI IDE","VS Code","开发效率","/images/topics/ai/cursor-keyboard-shortcuts-cheatsheet.jpg","彩色机械键盘与鼠标的工作台面",34563105,"https://www.pexels.com/photo/colorful-mechanical-keyboard-and-mouse-setup-34563105/",12,{"type":23,"children":1471,"toc":2579},[1472,1477,1495,1500,1528,1533,1569,1573,1579,1584,1617,1622,1645,1648,1654,1659,1877,1886,1889,1895,1902,1921,1929,1950,1955,1961,1976,2007,2012,2025,2031,2050,2068,2076,2081,2087,2092,2113,2121,2127,2132,2155,2160,2166,2179,2185,2203,2221,2227,2238,2256,2262,2273,2279,2284,2327,2330,2336,2344,2397,2400,2406,2412,2417,2422,2445,2463,2468,2493,2496,2502,2508,2513,2519,2524,2530,2535,2538,2544],{"type":26,"tag":27,"props":1473,"children":1474},{},[1475],{"type":31,"value":1476},"如果你在搜“Cursor 快捷键”，你大概率不是想背一张表，而是想解决这类问题：",{"type":26,"tag":319,"props":1478,"children":1479},{},[1480,1485,1490],{"type":26,"tag":323,"props":1481,"children":1482},{},[1483],{"type":31,"value":1484},"为什么我用了 AI，还是很慢？（对话来回太多、改动不可控）",{"type":26,"tag":323,"props":1486,"children":1487},{},[1488],{"type":31,"value":1489},"为什么它“看起来懂了”，却改错文件/改出回归？（上下文与范围没锁住）",{"type":26,"tag":323,"props":1491,"children":1492},{},[1493],{"type":31,"value":1494},"多文件改动怎么做得安全？（验收、回滚、最小回归集）",{"type":26,"tag":27,"props":1496,"children":1497},{},[1498],{"type":31,"value":1499},"这篇文章给你两份东西：",{"type":26,"tag":911,"props":1501,"children":1502},{},[1503,1516],{"type":26,"tag":323,"props":1504,"children":1505},{},[1506,1508,1514],{"type":31,"value":1507},"一张",{"type":26,"tag":1509,"props":1510,"children":1511},"strong",{},[1512],{"type":31,"value":1513},"按任务分组",{"type":31,"value":1515},"的快捷键表（不是按功能堆在一起）",{"type":26,"tag":323,"props":1517,"children":1518},{},[1519,1521,1526],{"type":31,"value":1520},"一套“从需求到落地”的",{"type":26,"tag":1509,"props":1522,"children":1523},{},[1524],{"type":31,"value":1525},"最小闭环工作流",{"type":31,"value":1527},"（每一步都有快捷键）",{"type":26,"tag":27,"props":1529,"children":1530},{},[1531],{"type":31,"value":1532},"想看系统玩法：",{"type":26,"tag":319,"props":1534,"children":1535},{},[1536,1547,1558],{"type":26,"tag":323,"props":1537,"children":1538},{},[1539,1541],{"type":31,"value":1540},"入门教程看：",{"type":26,"tag":44,"props":1542,"children":1544},{"href":1543},"/topics/ai/cursor-tutorial",[1545],{"type":31,"value":1546},"Cursor 使用教程（2026）",{"type":26,"tag":323,"props":1548,"children":1549},{},[1550,1552],{"type":31,"value":1551},"进阶玩法看：",{"type":26,"tag":44,"props":1553,"children":1555},{"href":1554},"/topics/ai/cursor-editor-guide",[1556],{"type":31,"value":1557},"Cursor 编辑器深度玩法",{"type":26,"tag":323,"props":1559,"children":1560},{},[1561,1563],{"type":31,"value":1562},"规则与忽略看：",{"type":26,"tag":44,"props":1564,"children":1566},{"href":1565},"/topics/ai/cursor-rules-cursorrules",[1567],{"type":31,"value":1568},"Cursor Rules 与 .cursorrules",{"type":26,"tag":1570,"props":1571,"children":1572},"hr",{},[],{"type":26,"tag":76,"props":1574,"children":1576},{"id":1575},"先给结论提效不是按得快而是闭环更短",[1577],{"type":31,"value":1578},"先给结论：提效不是“按得快”，而是“闭环更短”",{"type":26,"tag":27,"props":1580,"children":1581},{},[1582],{"type":31,"value":1583},"你可以把 Cursor 的快捷键理解为 3 条流水线：",{"type":26,"tag":319,"props":1585,"children":1586},{},[1587,1597,1607],{"type":26,"tag":323,"props":1588,"children":1589},{},[1590,1595],{"type":26,"tag":1509,"props":1591,"children":1592},{},[1593],{"type":31,"value":1594},"改一小段",{"type":31,"value":1596},"（内联编辑）：把改动限制在一个函数/一段样式",{"type":26,"tag":323,"props":1598,"children":1599},{},[1600,1605],{"type":26,"tag":1509,"props":1601,"children":1602},{},[1603],{"type":31,"value":1604},"改一组文件",{"type":31,"value":1606},"（Composer）：把改动限制在一组明确文件，并要求输出 diff + 验收点",{"type":26,"tag":323,"props":1608,"children":1609},{},[1610,1615],{"type":26,"tag":1509,"props":1611,"children":1612},{},[1613],{"type":31,"value":1614},"聊清楚再动手",{"type":31,"value":1616},"（侧边对话）：先对齐目标、范围、验收、回滚",{"type":26,"tag":27,"props":1618,"children":1619},{},[1620],{"type":31,"value":1621},"当你觉得“它乱改/改太大”时，往往不是快捷键没记住，而是缺了两件事：",{"type":26,"tag":319,"props":1623,"children":1624},{},[1625,1635],{"type":26,"tag":323,"props":1626,"children":1627},{},[1628,1630],{"type":31,"value":1629},"没有在动手前锁定",{"type":26,"tag":1509,"props":1631,"children":1632},{},[1633],{"type":31,"value":1634},"范围",{"type":26,"tag":323,"props":1636,"children":1637},{},[1638,1640],{"type":31,"value":1639},"没有在接受改动前准备",{"type":26,"tag":1509,"props":1641,"children":1642},{},[1643],{"type":31,"value":1644},"验收/回滚",{"type":26,"tag":1570,"props":1646,"children":1647},{},[],{"type":26,"tag":76,"props":1649,"children":1651},{"id":1650},"快捷键速查表按任务分组",[1652],{"type":31,"value":1653},"快捷键速查表（按任务分组）",{"type":26,"tag":27,"props":1655,"children":1656},{},[1657],{"type":31,"value":1658},"说明：下表按“你正在做什么”组织，而不是按“功能名字”组织。不同版本快捷键可能略有差异，但核心逻辑一致。",{"type":26,"tag":83,"props":1660,"children":1661},{},[1662,1688],{"type":26,"tag":87,"props":1663,"children":1664},{},[1665],{"type":26,"tag":91,"props":1666,"children":1667},{},[1668,1673,1678,1683],{"type":26,"tag":95,"props":1669,"children":1670},{},[1671],{"type":31,"value":1672},"任务",{"type":26,"tag":95,"props":1674,"children":1675},{},[1676],{"type":31,"value":1677},"macOS",{"type":26,"tag":95,"props":1679,"children":1680},{},[1681],{"type":31,"value":1682},"Windows",{"type":26,"tag":95,"props":1684,"children":1685},{},[1686],{"type":31,"value":1687},"你该在什么时候用",{"type":26,"tag":106,"props":1689,"children":1690},{},[1691,1722,1753,1784,1815,1846],{"type":26,"tag":91,"props":1692,"children":1693},{},[1694,1699,1708,1717],{"type":26,"tag":113,"props":1695,"children":1696},{},[1697],{"type":31,"value":1698},"改一小段（最安全）",{"type":26,"tag":113,"props":1700,"children":1701},{},[1702],{"type":26,"tag":309,"props":1703,"children":1705},{"className":1704},[],[1706],{"type":31,"value":1707},"Cmd + K",{"type":26,"tag":113,"props":1709,"children":1710},{},[1711],{"type":26,"tag":309,"props":1712,"children":1714},{"className":1713},[],[1715],{"type":31,"value":1716},"Ctrl + K",{"type":26,"tag":113,"props":1718,"children":1719},{},[1720],{"type":31,"value":1721},"只想改一个函数/一段 CSS，不想动别的",{"type":26,"tag":91,"props":1723,"children":1724},{},[1725,1730,1739,1748],{"type":26,"tag":113,"props":1726,"children":1727},{},[1728],{"type":31,"value":1729},"打开 AI 对话（先对齐再动手）",{"type":26,"tag":113,"props":1731,"children":1732},{},[1733],{"type":26,"tag":309,"props":1734,"children":1736},{"className":1735},[],[1737],{"type":31,"value":1738},"Cmd + L",{"type":26,"tag":113,"props":1740,"children":1741},{},[1742],{"type":26,"tag":309,"props":1743,"children":1745},{"className":1744},[],[1746],{"type":31,"value":1747},"Ctrl + L",{"type":26,"tag":113,"props":1749,"children":1750},{},[1751],{"type":31,"value":1752},"需要澄清目标、制定步骤、给验收点",{"type":26,"tag":91,"props":1754,"children":1755},{},[1756,1761,1770,1779],{"type":26,"tag":113,"props":1757,"children":1758},{},[1759],{"type":31,"value":1760},"多文件编辑（有组织地改一组文件）",{"type":26,"tag":113,"props":1762,"children":1763},{},[1764],{"type":26,"tag":309,"props":1765,"children":1767},{"className":1766},[],[1768],{"type":31,"value":1769},"Cmd + I",{"type":26,"tag":113,"props":1771,"children":1772},{},[1773],{"type":26,"tag":309,"props":1774,"children":1776},{"className":1775},[],[1777],{"type":31,"value":1778},"Ctrl + I",{"type":26,"tag":113,"props":1780,"children":1781},{},[1782],{"type":31,"value":1783},"改动涉及多个文件：组件+样式+测试",{"type":26,"tag":91,"props":1785,"children":1786},{},[1787,1792,1801,1810],{"type":26,"tag":113,"props":1788,"children":1789},{},[1790],{"type":31,"value":1791},"把选中代码加入对话上下文",{"type":26,"tag":113,"props":1793,"children":1794},{},[1795],{"type":26,"tag":309,"props":1796,"children":1798},{"className":1797},[],[1799],{"type":31,"value":1800},"Cmd + Shift + L",{"type":26,"tag":113,"props":1802,"children":1803},{},[1804],{"type":26,"tag":309,"props":1805,"children":1807},{"className":1806},[],[1808],{"type":31,"value":1809},"Ctrl + Shift + L",{"type":26,"tag":113,"props":1811,"children":1812},{},[1813],{"type":31,"value":1814},"让 AI 只看你选的片段（降低噪音）",{"type":26,"tag":91,"props":1816,"children":1817},{},[1818,1823,1832,1841],{"type":26,"tag":113,"props":1819,"children":1820},{},[1821],{"type":31,"value":1822},"接受当前建议",{"type":26,"tag":113,"props":1824,"children":1825},{},[1826],{"type":26,"tag":309,"props":1827,"children":1829},{"className":1828},[],[1830],{"type":31,"value":1831},"Cmd + Y",{"type":26,"tag":113,"props":1833,"children":1834},{},[1835],{"type":26,"tag":309,"props":1836,"children":1838},{"className":1837},[],[1839],{"type":31,"value":1840},"Ctrl + Y",{"type":26,"tag":113,"props":1842,"children":1843},{},[1844],{"type":31,"value":1845},"你已经准备好验收/回滚，并确认改动范围",{"type":26,"tag":91,"props":1847,"children":1848},{},[1849,1854,1863,1872],{"type":26,"tag":113,"props":1850,"children":1851},{},[1852],{"type":31,"value":1853},"拒绝当前建议",{"type":26,"tag":113,"props":1855,"children":1856},{},[1857],{"type":26,"tag":309,"props":1858,"children":1860},{"className":1859},[],[1861],{"type":31,"value":1862},"Cmd + N",{"type":26,"tag":113,"props":1864,"children":1865},{},[1866],{"type":26,"tag":309,"props":1867,"children":1869},{"className":1868},[],[1870],{"type":31,"value":1871},"Ctrl + N",{"type":26,"tag":113,"props":1873,"children":1874},{},[1875],{"type":31,"value":1876},"改得太大、改错方向，立刻收手",{"type":26,"tag":1878,"props":1879,"children":1880},"blockquote",{},[1881],{"type":26,"tag":27,"props":1882,"children":1883},{},[1884],{"type":31,"value":1885},"小技巧：把“改一小段”当默认路径。只有当你能清晰写出“会改哪几类文件、怎么验收”时再进入多文件。",{"type":26,"tag":1570,"props":1887,"children":1888},{},[],{"type":26,"tag":76,"props":1890,"children":1892},{"id":1891},"_10-个可直接照抄的提效工作流每个都能闭环",[1893],{"type":31,"value":1894},"10 个可直接照抄的提效工作流（每个都能闭环）",{"type":26,"tag":1896,"props":1897,"children":1899},"h3",{"id":1898},"工作流-1需求计划小步改新手最稳",[1900],{"type":31,"value":1901},"工作流 1：需求→计划→小步改（新手最稳）",{"type":26,"tag":911,"props":1903,"children":1904},{},[1905,1916],{"type":26,"tag":323,"props":1906,"children":1907},{},[1908,1914],{"type":26,"tag":309,"props":1909,"children":1911},{"className":1910},[],[1912],{"type":31,"value":1913},"Cmd/Ctrl + L",{"type":31,"value":1915}," 打开对话",{"type":26,"tag":323,"props":1917,"children":1918},{},[1919],{"type":31,"value":1920},"先发这段（可复制）：",{"type":26,"tag":1878,"props":1922,"children":1923},{},[1924],{"type":26,"tag":27,"props":1925,"children":1926},{},[1927],{"type":31,"value":1928},"目标：……\n范围：只修改以下文件/模块：……\n非目标：……（明确不做）\n验收：……（可测试/可手动检查）\n输出格式：先给计划，再逐步执行；每一步写出 diff 摘要。",{"type":26,"tag":911,"props":1930,"children":1931},{"start":1430},[1932,1937],{"type":26,"tag":323,"props":1933,"children":1934},{},[1935],{"type":31,"value":1936},"让 AI 先给“计划（3~6 步）”，你确认后再执行",{"type":26,"tag":323,"props":1938,"children":1939},{},[1940,1942,1948],{"type":31,"value":1941},"任何一步涉及改代码：优先回到编辑区，选中片段用 ",{"type":26,"tag":309,"props":1943,"children":1945},{"className":1944},[],[1946],{"type":31,"value":1947},"Cmd/Ctrl + K",{"type":31,"value":1949}," 小步改",{"type":26,"tag":27,"props":1951,"children":1952},{},[1953],{"type":31,"value":1954},"为什么有效：你把“想法”变成了“可执行约束”，这就是 GEO（面向 AI/模型的可理解结构）。",{"type":26,"tag":1896,"props":1956,"children":1958},{"id":1957},"工作流-2只改一个函数高频低风险",[1959],{"type":31,"value":1960},"工作流 2：只改一个函数（高频、低风险）",{"type":26,"tag":319,"props":1962,"children":1963},{},[1964],{"type":26,"tag":323,"props":1965,"children":1966},{},[1967,1969,1974],{"type":31,"value":1968},"选中函数 → ",{"type":26,"tag":309,"props":1970,"children":1972},{"className":1971},[],[1973],{"type":31,"value":1947},{"type":31,"value":1975}," → 输入指令：",{"type":26,"tag":1878,"props":1977,"children":1978},{},[1979,1984],{"type":26,"tag":27,"props":1980,"children":1981},{},[1982],{"type":31,"value":1983},"把这段改成更可读：",{"type":26,"tag":319,"props":1985,"children":1986},{},[1987,1992,1997,2002],{"type":26,"tag":323,"props":1988,"children":1989},{},[1990],{"type":31,"value":1991},"用 async/await",{"type":26,"tag":323,"props":1993,"children":1994},{},[1995],{"type":31,"value":1996},"错误处理不要吞掉",{"type":26,"tag":323,"props":1998,"children":1999},{},[2000],{"type":31,"value":2001},"添加类型（若可推断）",{"type":26,"tag":323,"props":2003,"children":2004},{},[2005],{"type":31,"value":2006},"不要改函数签名",{"type":26,"tag":27,"props":2008,"children":2009},{},[2010],{"type":31,"value":2011},"验收方式（强制）：",{"type":26,"tag":319,"props":2013,"children":2014},{},[2015,2020],{"type":26,"tag":323,"props":2016,"children":2017},{},[2018],{"type":31,"value":2019},"输出前后函数行为一致（输入/输出）",{"type":26,"tag":323,"props":2021,"children":2022},{},[2023],{"type":31,"value":2024},"失败分支有可观测日志（不要悄悄 return null）",{"type":26,"tag":1896,"props":2026,"children":2028},{"id":2027},"工作流-3多文件改动先定文件清单",[2029],{"type":31,"value":2030},"工作流 3：多文件改动（先定“文件清单”）",{"type":26,"tag":911,"props":2032,"children":2033},{},[2034,2045],{"type":26,"tag":323,"props":2035,"children":2036},{},[2037,2043],{"type":26,"tag":309,"props":2038,"children":2040},{"className":2039},[],[2041],{"type":31,"value":2042},"Cmd/Ctrl + I",{"type":31,"value":2044}," 进入多文件",{"type":26,"tag":323,"props":2046,"children":2047},{},[2048],{"type":31,"value":2049},"先让 AI 输出：",{"type":26,"tag":319,"props":2051,"children":2052},{},[2053,2058,2063],{"type":26,"tag":323,"props":2054,"children":2055},{},[2056],{"type":31,"value":2057},"预计会改哪些文件（最多 5 个）",{"type":26,"tag":323,"props":2059,"children":2060},{},[2061],{"type":31,"value":2062},"每个文件改什么",{"type":26,"tag":323,"props":2064,"children":2065},{},[2066],{"type":31,"value":2067},"每一步怎么验收",{"type":26,"tag":911,"props":2069,"children":2070},{"start":1430},[2071],{"type":26,"tag":323,"props":2072,"children":2073},{},[2074],{"type":31,"value":2075},"你确认文件清单后再开始生成改动",{"type":26,"tag":27,"props":2077,"children":2078},{},[2079],{"type":31,"value":2080},"关键点：多文件最容易翻车的是“它把你没想到的文件也改了”。所以文件清单是第一道闸门。",{"type":26,"tag":1896,"props":2082,"children":2084},{"id":2083},"工作流-4把上下文噪音砍掉防跑偏",[2085],{"type":31,"value":2086},"工作流 4：把“上下文噪音”砍掉（防跑偏）",{"type":26,"tag":27,"props":2088,"children":2089},{},[2090],{"type":31,"value":2091},"当你怀疑它在胡说/乱改时：",{"type":26,"tag":319,"props":2093,"children":2094},{},[2095,2108],{"type":26,"tag":323,"props":2096,"children":2097},{},[2098,2100,2106],{"type":31,"value":2099},"只选择关键代码片段 → ",{"type":26,"tag":309,"props":2101,"children":2103},{"className":2102},[],[2104],{"type":31,"value":2105},"Cmd/Ctrl + Shift + L",{"type":31,"value":2107}," 加入对话",{"type":26,"tag":323,"props":2109,"children":2110},{},[2111],{"type":31,"value":2112},"然后在对话里要求：",{"type":26,"tag":1878,"props":2114,"children":2115},{},[2116],{"type":26,"tag":27,"props":2117,"children":2118},{},[2119],{"type":31,"value":2120},"只基于我提供的代码片段回答，不要假设其它文件存在。",{"type":26,"tag":1896,"props":2122,"children":2124},{"id":2123},"工作流-5生成变更说明让-code-review-变快",[2125],{"type":31,"value":2126},"工作流 5：生成变更说明（让 code review 变快）",{"type":26,"tag":27,"props":2128,"children":2129},{},[2130],{"type":31,"value":2131},"改完后在对话里让它输出：",{"type":26,"tag":319,"props":2133,"children":2134},{},[2135,2140,2145,2150],{"type":26,"tag":323,"props":2136,"children":2137},{},[2138],{"type":31,"value":2139},"改动摘要（3~7 条）",{"type":26,"tag":323,"props":2141,"children":2142},{},[2143],{"type":31,"value":2144},"风险点（依赖/边界条件）",{"type":26,"tag":323,"props":2146,"children":2147},{},[2148],{"type":31,"value":2149},"回滚方式",{"type":26,"tag":323,"props":2151,"children":2152},{},[2153],{"type":31,"value":2154},"验收步骤",{"type":26,"tag":27,"props":2156,"children":2157},{},[2158],{"type":31,"value":2159},"这套结构能直接贴进 PR 描述。",{"type":26,"tag":1896,"props":2161,"children":2163},{"id":2162},"工作流-6写最小回归集不写回归-等事故",[2164],{"type":31,"value":2165},"工作流 6：写“最小回归集”（不写回归 = 等事故）",{"type":26,"tag":27,"props":2167,"children":2168},{},[2169,2171,2177],{"type":31,"value":2170},"每次改动都至少做 10 条最小回归（见下文清单）。你可以把它写在 ",{"type":26,"tag":309,"props":2172,"children":2174},{"className":2173},[],[2175],{"type":31,"value":2176},"README",{"type":31,"value":2178}," 或团队 wiki。",{"type":26,"tag":1896,"props":2180,"children":2182},{"id":2181},"工作流-7把接受建议变成最后一步",[2183],{"type":31,"value":2184},"工作流 7：把“接受建议”变成最后一步",{"type":26,"tag":27,"props":2186,"children":2187},{},[2188,2194,2196,2201],{"type":26,"tag":309,"props":2189,"children":2191},{"className":2190},[],[2192],{"type":31,"value":2193},"Cmd/Ctrl + Y",{"type":31,"value":2195}," 应该是",{"type":26,"tag":1509,"props":2197,"children":2198},{},[2199],{"type":31,"value":2200},"最后一步",{"type":31,"value":2202},"：",{"type":26,"tag":319,"props":2204,"children":2205},{},[2206,2211,2216],{"type":26,"tag":323,"props":2207,"children":2208},{},[2209],{"type":31,"value":2210},"你已经看过 diff",{"type":26,"tag":323,"props":2212,"children":2213},{},[2214],{"type":31,"value":2215},"你能说清楚“怎么验收”",{"type":26,"tag":323,"props":2217,"children":2218},{},[2219],{"type":31,"value":2220},"你知道“怎么回滚”",{"type":26,"tag":1896,"props":2222,"children":2224},{"id":2223},"工作流-8拒绝建议不是失败是风控动作",[2225],{"type":31,"value":2226},"工作流 8：拒绝建议不是失败，是风控动作",{"type":26,"tag":27,"props":2228,"children":2229},{},[2230,2236],{"type":26,"tag":309,"props":2231,"children":2233},{"className":2232},[],[2234],{"type":31,"value":2235},"Cmd/Ctrl + N",{"type":31,"value":2237}," 的使用时机：",{"type":26,"tag":319,"props":2239,"children":2240},{},[2241,2246,2251],{"type":26,"tag":323,"props":2242,"children":2243},{},[2244],{"type":31,"value":2245},"它开始改你没提过的东西（范围漂移）",{"type":26,"tag":323,"props":2247,"children":2248},{},[2249],{"type":31,"value":2250},"它改了 10 个文件但你只想改 1 个",{"type":26,"tag":323,"props":2252,"children":2253},{},[2254],{"type":31,"value":2255},"它为了“更优雅”引入新依赖/新抽象",{"type":26,"tag":1896,"props":2257,"children":2259},{"id":2258},"工作流-9重复任务做成模板提示词不是一次性",[2260],{"type":31,"value":2261},"工作流 9：重复任务做成模板（提示词不是一次性）",{"type":26,"tag":27,"props":2263,"children":2264},{},[2265,2267,2271],{"type":31,"value":2266},"把高频任务（比如“写组件+样式+验收”）固化成模板，放进 Rules（见：",{"type":26,"tag":44,"props":2268,"children":2269},{"href":1565},[2270],{"type":31,"value":1568},{"type":31,"value":2272},"）。",{"type":26,"tag":1896,"props":2274,"children":2276},{"id":2275},"工作流-10把快捷键表做成你自己的任务表",[2277],{"type":31,"value":2278},"工作流 10：把“快捷键表”做成你自己的任务表",{"type":26,"tag":27,"props":2280,"children":2281},{},[2282],{"type":31,"value":2283},"你不需要记住所有快捷键，只需要记住：",{"type":26,"tag":319,"props":2285,"children":2286},{},[2287,2297,2307,2317],{"type":26,"tag":323,"props":2288,"children":2289},{},[2290,2292],{"type":31,"value":2291},"小步改：",{"type":26,"tag":309,"props":2293,"children":2295},{"className":2294},[],[2296],{"type":31,"value":1947},{"type":26,"tag":323,"props":2298,"children":2299},{},[2300,2302],{"type":31,"value":2301},"先对齐：",{"type":26,"tag":309,"props":2303,"children":2305},{"className":2304},[],[2306],{"type":31,"value":1913},{"type":26,"tag":323,"props":2308,"children":2309},{},[2310,2312],{"type":31,"value":2311},"多文件：",{"type":26,"tag":309,"props":2313,"children":2315},{"className":2314},[],[2316],{"type":31,"value":2042},{"type":26,"tag":323,"props":2318,"children":2319},{},[2320,2322],{"type":31,"value":2321},"上下文聚焦：",{"type":26,"tag":309,"props":2323,"children":2325},{"className":2324},[],[2326],{"type":31,"value":2105},{"type":26,"tag":1570,"props":2328,"children":2329},{},[],{"type":26,"tag":76,"props":2331,"children":2333},{"id":2332},"必交付物-1最小回归任务清单10-条通用",[2334],{"type":31,"value":2335},"必交付物 1：最小回归任务清单（10 条，通用）",{"type":26,"tag":1878,"props":2337,"children":2338},{},[2339],{"type":26,"tag":27,"props":2340,"children":2341},{},[2342],{"type":31,"value":2343},"这份清单的意义：让每次 AI 改动都能“被验证”。否则你只是把不可控变成了更快的不可控。",{"type":26,"tag":911,"props":2345,"children":2346},{},[2347,2352,2357,2362,2367,2372,2377,2382,2387,2392],{"type":26,"tag":323,"props":2348,"children":2349},{},[2350],{"type":31,"value":2351},"关键路径能跑通（手动点击/请求一次）",{"type":26,"tag":323,"props":2353,"children":2354},{},[2355],{"type":31,"value":2356},"错误路径能触发（模拟一次失败输入）",{"type":26,"tag":323,"props":2358,"children":2359},{},[2360],{"type":31,"value":2361},"控制台无新增错误（至少关注 1 次真实操作）",{"type":26,"tag":323,"props":2363,"children":2364},{},[2365],{"type":31,"value":2366},"关键 UI 未错位（移动端/桌面端各看一眼）",{"type":26,"tag":323,"props":2368,"children":2369},{},[2370],{"type":31,"value":2371},"刷新后状态正确（尤其是表单/列表）",{"type":26,"tag":323,"props":2373,"children":2374},{},[2375],{"type":31,"value":2376},"路由跳转没断（从入口到目标页）",{"type":26,"tag":323,"props":2378,"children":2379},{},[2380],{"type":31,"value":2381},"相关接口未改变契约（字段名/类型）",{"type":26,"tag":323,"props":2383,"children":2384},{},[2385],{"type":31,"value":2386},"性能没有明显退化（首屏、交互卡顿）",{"type":26,"tag":323,"props":2388,"children":2389},{},[2390],{"type":31,"value":2391},"回滚方案可执行（知道回滚哪几个文件/commit）",{"type":26,"tag":323,"props":2393,"children":2394},{},[2395],{"type":31,"value":2396},"写下“这次改动解决了什么、风险是什么”（可贴 PR）",{"type":26,"tag":1570,"props":2398,"children":2399},{},[],{"type":26,"tag":76,"props":2401,"children":2403},{"id":2402},"必交付物-2失败案例复盘真实会发生",[2404],{"type":31,"value":2405},"必交付物 2：失败案例复盘（真实会发生）",{"type":26,"tag":1896,"props":2407,"children":2409},{"id":2408},"现象快捷键用得很熟但交付还是慢",[2410],{"type":31,"value":2411},"现象：快捷键用得很熟，但交付还是慢",{"type":26,"tag":27,"props":2413,"children":2414},{},[2415],{"type":31,"value":2416},"典型原因：你把 Cursor 当成“更聪明的搜索框”，不断对话，直到它给出你想要的答案。",{"type":26,"tag":27,"props":2418,"children":2419},{},[2420],{"type":31,"value":2421},"复现路径：",{"type":26,"tag":319,"props":2423,"children":2424},{},[2425,2430,2435,2440],{"type":26,"tag":323,"props":2426,"children":2427},{},[2428],{"type":31,"value":2429},"你直接说“把页面做得更好看、更高级”",{"type":26,"tag":323,"props":2431,"children":2432},{},[2433],{"type":31,"value":2434},"AI 开始大改样式、抽象组件、甚至引入新依赖",{"type":26,"tag":323,"props":2436,"children":2437},{},[2438],{"type":31,"value":2439},"你为了省事按了“接受建议”",{"type":26,"tag":323,"props":2441,"children":2442},{},[2443],{"type":31,"value":2444},"最后发现：设计没统一、移动端崩、甚至埋了性能问题",{"type":26,"tag":27,"props":2446,"children":2447},{},[2448,2450,2454,2456,2461],{"type":31,"value":2449},"根因：缺少",{"type":26,"tag":1509,"props":2451,"children":2452},{},[2453],{"type":31,"value":1634},{"type":31,"value":2455},"与",{"type":26,"tag":1509,"props":2457,"children":2458},{},[2459],{"type":31,"value":2460},"验收",{"type":31,"value":2462},"。",{"type":26,"tag":27,"props":2464,"children":2465},{},[2466],{"type":31,"value":2467},"修复方式（可照抄）：",{"type":26,"tag":319,"props":2469,"children":2470},{},[2471,2476,2488],{"type":26,"tag":323,"props":2472,"children":2473},{},[2474],{"type":31,"value":2475},"把需求拆成 3 个可验证目标：例如“按钮样式统一”“首屏 CTA 更明显”“移动端间距不挤”",{"type":26,"tag":323,"props":2477,"children":2478},{},[2479,2481,2486],{"type":31,"value":2480},"每个目标只用 ",{"type":26,"tag":309,"props":2482,"children":2484},{"className":2483},[],[2485],{"type":31,"value":1947},{"type":31,"value":2487}," 改一个局部",{"type":26,"tag":323,"props":2489,"children":2490},{},[2491],{"type":31,"value":2492},"每次接受建议前跑一遍“最小回归集”",{"type":26,"tag":1570,"props":2494,"children":2495},{},[],{"type":26,"tag":76,"props":2497,"children":2499},{"id":2498},"faq高频问题",[2500],{"type":31,"value":2501},"FAQ（高频问题）",{"type":26,"tag":1896,"props":2503,"children":2505},{"id":2504},"q1我应该先记快捷键还是先学工作流",[2506],{"type":31,"value":2507},"Q1：我应该先记快捷键还是先学工作流？",{"type":26,"tag":27,"props":2509,"children":2510},{},[2511],{"type":31,"value":2512},"先学工作流。快捷键只是把工作流的步骤变短。",{"type":26,"tag":1896,"props":2514,"children":2516},{"id":2515},"q2为什么我一用多文件就容易翻车",[2517],{"type":31,"value":2518},"Q2：为什么我一用多文件就容易翻车？",{"type":26,"tag":27,"props":2520,"children":2521},{},[2522],{"type":31,"value":2523},"因为多文件意味着范围更大、依赖更多、验收更难。先锁定“文件清单 + 每步验收”，再让它动手。",{"type":26,"tag":1896,"props":2525,"children":2527},{"id":2526},"q3有没有万能提示词",[2528],{"type":31,"value":2529},"Q3：有没有“万能提示词”？",{"type":26,"tag":27,"props":2531,"children":2532},{},[2533],{"type":31,"value":2534},"没有，但有“万能结构”：目标、范围、非目标、验收、输出格式。",{"type":26,"tag":1570,"props":2536,"children":2537},{},[],{"type":26,"tag":76,"props":2539,"children":2541},{"id":2540},"延伸阅读建议按顺序",[2542],{"type":31,"value":2543},"延伸阅读（建议按顺序）",{"type":26,"tag":319,"props":2545,"children":2546},{},[2547,2554,2561,2568],{"type":26,"tag":323,"props":2548,"children":2549},{},[2550],{"type":26,"tag":44,"props":2551,"children":2552},{"href":1543},[2553],{"type":31,"value":1546},{"type":26,"tag":323,"props":2555,"children":2556},{},[2557],{"type":26,"tag":44,"props":2558,"children":2559},{"href":1554},[2560],{"type":31,"value":1557},{"type":26,"tag":323,"props":2562,"children":2563},{},[2564],{"type":26,"tag":44,"props":2565,"children":2566},{"href":1565},[2567],{"type":31,"value":1568},{"type":26,"tag":323,"props":2569,"children":2570},{},[2571,2573],{"type":31,"value":2572},"如果你更关心“网页制作落地”：看这篇 ",{"type":26,"tag":44,"props":2574,"children":2576},{"href":2575},"/topics/practical-tips/htmlpage-quick-landing-page",[2577],{"type":31,"value":2578},"3 分钟用 HTMLPAGE 做落地页",{"title":7,"searchDepth":1430,"depth":1430,"links":2580},[2581,2582,2583,2595,2596,2599,2604],{"id":1575,"depth":1433,"text":1578},{"id":1650,"depth":1433,"text":1653},{"id":1891,"depth":1433,"text":1894,"children":2584},[2585,2586,2587,2588,2589,2590,2591,2592,2593,2594],{"id":1898,"depth":1430,"text":1901},{"id":1957,"depth":1430,"text":1960},{"id":2027,"depth":1430,"text":2030},{"id":2083,"depth":1430,"text":2086},{"id":2123,"depth":1430,"text":2126},{"id":2162,"depth":1430,"text":2165},{"id":2181,"depth":1430,"text":2184},{"id":2223,"depth":1430,"text":2226},{"id":2258,"depth":1430,"text":2261},{"id":2275,"depth":1430,"text":2278},{"id":2332,"depth":1433,"text":2335},{"id":2402,"depth":1433,"text":2405,"children":2597},[2598],{"id":2408,"depth":1430,"text":2411},{"id":2498,"depth":1433,"text":2501,"children":2600},[2601,2602,2603],{"id":2504,"depth":1430,"text":2507},{"id":2515,"depth":1430,"text":2518},{"id":2526,"depth":1430,"text":2529},{"id":2540,"depth":1433,"text":2543},"content:topics:ai:cursor-keyboard-shortcuts-cheatsheet.md","topics/ai/cursor-keyboard-shortcuts-cheatsheet.md","topics/ai/cursor-keyboard-shortcuts-cheatsheet",{"_path":2609,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":2610,"description":2611,"date":2612,"topic":5,"author":11,"tags":2613,"image":2617,"imageAlt":2618,"pexelsPhotoId":2619,"pexelsUrl":2620,"readingTime":2621,"body":2622,"_type":1447,"_id":3552,"_source":1449,"_file":3553,"_stem":3554,"_extension":1452},"/topics/ai/cursor-vs-copilot-vscode-workflow","Cursor vs GitHub Copilot vs VS Code：怎么选、怎么搭配、怎么把风险关在笼子里","用“任务类型×风险×验收成本”的选择矩阵解释 Cursor/Copilot/VS Code 的差异，并给出一套可落地的协作工作流（范围闸门、最小回归集、回滚策略）。","2026-03-01",[1460,2614,1463,2615,2616],"GitHub Copilot","AI 编程","工作流","/images/topics/ai/cursor-vs-copilot-vscode-workflow.jpg","团队在电脑前进行协作讨论",1181371,"https://www.pexels.com/photo/man-wearing-blue-dress-shirt-1181371/",15,{"type":23,"children":2623,"toc":3530},[2624,2629,2634,2652,2657,2675,2678,2684,2689,2720,2725,2728,2734,2742,2943,2951,2964,2967,2973,2979,2992,2997,3010,3016,3021,3054,3060,3065,3083,3086,3092,3097,3103,3108,3141,3147,3160,3165,3178,3184,3196,3202,3207,3220,3225,3228,3234,3239,3360,3363,3369,3379,3388,3406,3415,3423,3432,3450,3453,3459,3465,3470,3476,3481,3484,3489],{"type":26,"tag":27,"props":2625,"children":2626},{},[2627],{"type":31,"value":2628},"“Cursor 和 Copilot 到底有什么区别？”",{"type":26,"tag":27,"props":2630,"children":2631},{},[2632],{"type":31,"value":2633},"这个问题问得越早越好，因为你一旦把工具选错，后面所有痛苦都不是“提示词不够好”，而是：",{"type":26,"tag":319,"props":2635,"children":2636},{},[2637,2642,2647],{"type":26,"tag":323,"props":2638,"children":2639},{},[2640],{"type":31,"value":2641},"改动不可控（范围漂移、改错文件）",{"type":26,"tag":323,"props":2643,"children":2644},{},[2645],{"type":31,"value":2646},"验收成本爆炸（不知道要测什么）",{"type":26,"tag":323,"props":2648,"children":2649},{},[2650],{"type":31,"value":2651},"团队协作崩盘（没有闸门、没有回滚）",{"type":26,"tag":27,"props":2653,"children":2654},{},[2655],{"type":31,"value":2656},"这篇文章用一张选择矩阵 + 一套可执行工作流，帮你做到两件事：",{"type":26,"tag":911,"props":2658,"children":2659},{},[2660,2665],{"type":26,"tag":323,"props":2661,"children":2662},{},[2663],{"type":31,"value":2664},"知道什么时候用 Cursor、什么时候用 Copilot、什么时候“纯 VS Code 更快”",{"type":26,"tag":323,"props":2666,"children":2667},{},[2668,2670],{"type":31,"value":2669},"就算用 AI，也能把风险关在笼子里：",{"type":26,"tag":1509,"props":2671,"children":2672},{},[2673],{"type":31,"value":2674},"可审查、可验证、可回滚",{"type":26,"tag":1570,"props":2676,"children":2677},{},[],{"type":26,"tag":76,"props":2679,"children":2681},{"id":2680},"结论先说三者不是互斥而是分工",[2682],{"type":31,"value":2683},"结论先说：三者不是互斥，而是分工",{"type":26,"tag":27,"props":2685,"children":2686},{},[2687],{"type":31,"value":2688},"你可以把它们看成三层能力：",{"type":26,"tag":319,"props":2690,"children":2691},{},[2692,2701,2711],{"type":26,"tag":323,"props":2693,"children":2694},{},[2695,2699],{"type":26,"tag":1509,"props":2696,"children":2697},{},[2698],{"type":31,"value":1463},{"type":31,"value":2700},"：编辑器与生态（调试、插件、任务、终端、语言服务）",{"type":26,"tag":323,"props":2702,"children":2703},{},[2704,2709],{"type":26,"tag":1509,"props":2705,"children":2706},{},[2707],{"type":31,"value":2708},"Copilot",{"type":31,"value":2710},"：代码补全与局部建议（“我正在写这一行/这一段”）",{"type":26,"tag":323,"props":2712,"children":2713},{},[2714,2718],{"type":26,"tag":1509,"props":2715,"children":2716},{},[2717],{"type":31,"value":1460},{"type":31,"value":2719},"：以项目为单位的 AI 协作（对话、索引、多文件编辑、规则）",{"type":26,"tag":27,"props":2721,"children":2722},{},[2723],{"type":31,"value":2724},"最常见的误区是：把“局部补全能力”当作“能做架构与多文件落地”。",{"type":26,"tag":1570,"props":2726,"children":2727},{},[],{"type":26,"tag":76,"props":2729,"children":2731},{"id":2730},"选择矩阵按任务类型选工具不是按偏好",[2732],{"type":31,"value":2733},"选择矩阵：按任务类型选工具（不是按偏好）",{"type":26,"tag":1878,"props":2735,"children":2736},{},[2737],{"type":26,"tag":27,"props":2738,"children":2739},{},[2740],{"type":31,"value":2741},"你只要把自己的任务放进表格，就能得到推荐路径。",{"type":26,"tag":83,"props":2743,"children":2744},{},[2745,2777],{"type":26,"tag":87,"props":2746,"children":2747},{},[2748],{"type":26,"tag":91,"props":2749,"children":2750},{},[2751,2756,2762,2767,2772],{"type":26,"tag":95,"props":2752,"children":2753},{},[2754],{"type":31,"value":2755},"任务类型",{"type":26,"tag":95,"props":2757,"children":2759},{"align":2758},"right",[2760],{"type":31,"value":2761},"风险",{"type":26,"tag":95,"props":2763,"children":2764},{"align":2758},[2765],{"type":31,"value":2766},"验收成本",{"type":26,"tag":95,"props":2768,"children":2769},{},[2770],{"type":31,"value":2771},"更推荐",{"type":26,"tag":95,"props":2773,"children":2774},{},[2775],{"type":31,"value":2776},"为什么",{"type":26,"tag":106,"props":2778,"children":2779},{},[2780,2806,2838,2864,2890,2917],{"type":26,"tag":91,"props":2781,"children":2782},{},[2783,2788,2792,2796,2801],{"type":26,"tag":113,"props":2784,"children":2785},{},[2786],{"type":31,"value":2787},"写一段代码/补一个 if",{"type":26,"tag":113,"props":2789,"children":2790},{"align":2758},[2791],{"type":31,"value":227},{"type":26,"tag":113,"props":2793,"children":2794},{"align":2758},[2795],{"type":31,"value":227},{"type":26,"tag":113,"props":2797,"children":2798},{},[2799],{"type":31,"value":2800},"Copilot / Cursor 内联编辑",{"type":26,"tag":113,"props":2802,"children":2803},{},[2804],{"type":31,"value":2805},"局部建议足够，成本最低",{"type":26,"tag":91,"props":2807,"children":2808},{},[2809,2814,2818,2822,2833],{"type":26,"tag":113,"props":2810,"children":2811},{},[2812],{"type":31,"value":2813},"重构一个函数",{"type":26,"tag":113,"props":2815,"children":2816},{"align":2758},[2817],{"type":31,"value":250},{"type":26,"tag":113,"props":2819,"children":2820},{"align":2758},[2821],{"type":31,"value":250},{"type":26,"tag":113,"props":2823,"children":2824},{},[2825,2827],{"type":31,"value":2826},"Cursor ",{"type":26,"tag":309,"props":2828,"children":2830},{"className":2829},[],[2831],{"type":31,"value":2832},"内联编辑",{"type":26,"tag":113,"props":2834,"children":2835},{},[2836],{"type":31,"value":2837},"需要解释、需要约束输出",{"type":26,"tag":91,"props":2839,"children":2840},{},[2841,2846,2850,2854,2859],{"type":26,"tag":113,"props":2842,"children":2843},{},[2844],{"type":31,"value":2845},"改一个组件 + 样式",{"type":26,"tag":113,"props":2847,"children":2848},{"align":2758},[2849],{"type":31,"value":250},{"type":26,"tag":113,"props":2851,"children":2852},{"align":2758},[2853],{"type":31,"value":250},{"type":26,"tag":113,"props":2855,"children":2856},{},[2857],{"type":31,"value":2858},"Cursor（小范围多文件）",{"type":26,"tag":113,"props":2860,"children":2861},{},[2862],{"type":31,"value":2863},"需要同时改模板与样式",{"type":26,"tag":91,"props":2865,"children":2866},{},[2867,2872,2876,2880,2885],{"type":26,"tag":113,"props":2868,"children":2869},{},[2870],{"type":31,"value":2871},"改 3~5 个文件（组件+api+测试）",{"type":26,"tag":113,"props":2873,"children":2874},{"align":2758},[2875],{"type":31,"value":273},{"type":26,"tag":113,"props":2877,"children":2878},{"align":2758},[2879],{"type":31,"value":273},{"type":26,"tag":113,"props":2881,"children":2882},{},[2883],{"type":31,"value":2884},"Cursor Composer + 闸门",{"type":26,"tag":113,"props":2886,"children":2887},{},[2888],{"type":31,"value":2889},"需要计划、验收、回滚",{"type":26,"tag":91,"props":2891,"children":2892},{},[2893,2898,2903,2907,2912],{"type":26,"tag":113,"props":2894,"children":2895},{},[2896],{"type":31,"value":2897},"重写一段架构/引入新依赖",{"type":26,"tag":113,"props":2899,"children":2900},{"align":2758},[2901],{"type":31,"value":2902},"很高",{"type":26,"tag":113,"props":2904,"children":2905},{"align":2758},[2906],{"type":31,"value":2902},{"type":26,"tag":113,"props":2908,"children":2909},{},[2910],{"type":31,"value":2911},"先人脑设计 + VS Code 实现",{"type":26,"tag":113,"props":2913,"children":2914},{},[2915],{"type":31,"value":2916},"AI 易发散，最好先设计再执行",{"type":26,"tag":91,"props":2918,"children":2919},{},[2920,2925,2929,2933,2938],{"type":26,"tag":113,"props":2921,"children":2922},{},[2923],{"type":31,"value":2924},"排查线上问题/性能抖动",{"type":26,"tag":113,"props":2926,"children":2927},{"align":2758},[2928],{"type":31,"value":273},{"type":26,"tag":113,"props":2930,"children":2931},{"align":2758},[2932],{"type":31,"value":2902},{"type":26,"tag":113,"props":2934,"children":2935},{},[2936],{"type":31,"value":2937},"VS Code + 工具链优先，AI 辅助归纳",{"type":26,"tag":113,"props":2939,"children":2940},{},[2941],{"type":31,"value":2942},"需要证据，不要“猜”",{"type":26,"tag":27,"props":2944,"children":2945},{},[2946],{"type":26,"tag":1509,"props":2947,"children":2948},{},[2949],{"type":31,"value":2950},"一句话规则：",{"type":26,"tag":319,"props":2952,"children":2953},{},[2954,2959],{"type":26,"tag":323,"props":2955,"children":2956},{},[2957],{"type":31,"value":2958},"当你的改动可以用“10 条最小回归集”覆盖时，用 Cursor。",{"type":26,"tag":323,"props":2960,"children":2961},{},[2962],{"type":31,"value":2963},"当你的改动无法验证时，先别让 AI 动手。",{"type":26,"tag":1570,"props":2965,"children":2966},{},[],{"type":26,"tag":76,"props":2968,"children":2970},{"id":2969},"差异拆解到底差在哪里",[2971],{"type":31,"value":2972},"差异拆解：到底差在哪里？",{"type":26,"tag":1896,"props":2974,"children":2976},{"id":2975},"_1-上下文来源补全-vs-项目索引",[2977],{"type":31,"value":2978},"1) 上下文来源：补全 vs 项目索引",{"type":26,"tag":319,"props":2980,"children":2981},{},[2982,2987],{"type":26,"tag":323,"props":2983,"children":2984},{},[2985],{"type":31,"value":2986},"Copilot 更擅长：你正在写的这几行、当前文件的局部上下文",{"type":26,"tag":323,"props":2988,"children":2989},{},[2990],{"type":31,"value":2991},"Cursor 更擅长：项目级索引 + 多文件关联理解",{"type":26,"tag":27,"props":2993,"children":2994},{},[2995],{"type":31,"value":2996},"因此：",{"type":26,"tag":319,"props":2998,"children":2999},{},[3000,3005],{"type":26,"tag":323,"props":3001,"children":3002},{},[3003],{"type":31,"value":3004},"写代码片段：Copilot 速度更快",{"type":26,"tag":323,"props":3006,"children":3007},{},[3008],{"type":31,"value":3009},"改一坨工程：Cursor 更有胜算（但更需要闸门）",{"type":26,"tag":1896,"props":3011,"children":3013},{"id":3012},"_2-交互方式你能不能控制范围",[3014],{"type":31,"value":3015},"2) 交互方式：你能不能控制范围",{"type":26,"tag":27,"props":3017,"children":3018},{},[3019],{"type":31,"value":3020},"范围控制的三个层级：",{"type":26,"tag":911,"props":3022,"children":3023},{},[3024,3034,3044],{"type":26,"tag":323,"props":3025,"children":3026},{},[3027,3029],{"type":31,"value":3028},"内联编辑（选中一段）→ ",{"type":26,"tag":1509,"props":3030,"children":3031},{},[3032],{"type":31,"value":3033},"最强范围控制",{"type":26,"tag":323,"props":3035,"children":3036},{},[3037,3039],{"type":31,"value":3038},"Composer 多文件（先列文件清单）→ ",{"type":26,"tag":1509,"props":3040,"children":3041},{},[3042],{"type":31,"value":3043},"可控但要闸门",{"type":26,"tag":323,"props":3045,"children":3046},{},[3047,3049],{"type":31,"value":3048},"大对话（泛目标）→ ",{"type":26,"tag":1509,"props":3050,"children":3051},{},[3052],{"type":31,"value":3053},"最容易跑偏",{"type":26,"tag":1896,"props":3055,"children":3057},{"id":3056},"_3-输出形态建议-vs-可审查的变更",[3058],{"type":31,"value":3059},"3) 输出形态：建议 vs 可审查的变更",{"type":26,"tag":27,"props":3061,"children":3062},{},[3063],{"type":31,"value":3064},"最好的 AI 输出不是“给我一段代码”，而是：",{"type":26,"tag":319,"props":3066,"children":3067},{},[3068,3073,3078],{"type":26,"tag":323,"props":3069,"children":3070},{},[3071],{"type":31,"value":3072},"改动摘要（做了什么）",{"type":26,"tag":323,"props":3074,"children":3075},{},[3076],{"type":31,"value":3077},"diff 级别的可审查变更",{"type":26,"tag":323,"props":3079,"children":3080},{},[3081],{"type":31,"value":3082},"验收步骤与回滚方案",{"type":26,"tag":1570,"props":3084,"children":3085},{},[],{"type":26,"tag":76,"props":3087,"children":3089},{"id":3088},"一套可落地的团队工作流把风险关住",[3090],{"type":31,"value":3091},"一套可落地的团队工作流（把风险关住）",{"type":26,"tag":27,"props":3093,"children":3094},{},[3095],{"type":31,"value":3096},"下面这套流程，你可以直接写进团队规范：",{"type":26,"tag":1896,"props":3098,"children":3100},{"id":3099},"step-1先写任务单geo-友好结构",[3101],{"type":31,"value":3102},"Step 1：先写任务单（GEO 友好结构）",{"type":26,"tag":27,"props":3104,"children":3105},{},[3106],{"type":31,"value":3107},"模板：",{"type":26,"tag":319,"props":3109,"children":3110},{},[3111,3116,3121,3126,3131,3136],{"type":26,"tag":323,"props":3112,"children":3113},{},[3114],{"type":31,"value":3115},"目标：……",{"type":26,"tag":323,"props":3117,"children":3118},{},[3119],{"type":31,"value":3120},"背景：……",{"type":26,"tag":323,"props":3122,"children":3123},{},[3124],{"type":31,"value":3125},"范围：只改这些文件/模块：……",{"type":26,"tag":323,"props":3127,"children":3128},{},[3129],{"type":31,"value":3130},"非目标：不做哪些事情：……",{"type":26,"tag":323,"props":3132,"children":3133},{},[3134],{"type":31,"value":3135},"验收：如何判断完成（可测试/可观察）：……",{"type":26,"tag":323,"props":3137,"children":3138},{},[3139],{"type":31,"value":3140},"回滚：如果失败怎么撤回：……",{"type":26,"tag":1896,"props":3142,"children":3144},{"id":3143},"step-2用范围闸门限制-ai",[3145],{"type":31,"value":3146},"Step 2：用“范围闸门”限制 AI",{"type":26,"tag":319,"props":3148,"children":3149},{},[3150,3155],{"type":26,"tag":323,"props":3151,"children":3152},{},[3153],{"type":31,"value":3154},"单文件改动：优先 Cursor 内联编辑",{"type":26,"tag":323,"props":3156,"children":3157},{},[3158],{"type":31,"value":3159},"多文件改动：必须先让 AI 输出“文件清单（≤5）+ 每步验收”",{"type":26,"tag":27,"props":3161,"children":3162},{},[3163],{"type":31,"value":3164},"如果 AI 输出的文件清单超过 5 个：",{"type":26,"tag":319,"props":3166,"children":3167},{},[3168,3173],{"type":26,"tag":323,"props":3169,"children":3170},{},[3171],{"type":31,"value":3172},"不是它太强，是任务太大",{"type":26,"tag":323,"props":3174,"children":3175},{},[3176],{"type":31,"value":3177},"你需要拆任务，而不是继续推进",{"type":26,"tag":1896,"props":3179,"children":3181},{"id":3180},"step-3最小回归集10-条",[3182],{"type":31,"value":3183},"Step 3：最小回归集（10 条）",{"type":26,"tag":27,"props":3185,"children":3186},{},[3187,3189,3194],{"type":31,"value":3188},"每次接受改动前必须跑（可参考：",{"type":26,"tag":44,"props":3190,"children":3191},{"href":1455},[3192],{"type":31,"value":3193},"Cursor 快捷键速查表",{"type":31,"value":3195}," 里的清单）。",{"type":26,"tag":1896,"props":3197,"children":3199},{"id":3198},"step-4回滚策略不用等事故才想",[3200],{"type":31,"value":3201},"Step 4：回滚策略（不用等事故才想）",{"type":26,"tag":27,"props":3203,"children":3204},{},[3205],{"type":31,"value":3206},"回滚最常见的两条路：",{"type":26,"tag":319,"props":3208,"children":3209},{},[3210,3215],{"type":26,"tag":323,"props":3211,"children":3212},{},[3213],{"type":31,"value":3214},"git 回滚 commit",{"type":26,"tag":323,"props":3216,"children":3217},{},[3218],{"type":31,"value":3219},"对关键文件保留前版本（至少能快速恢复）",{"type":26,"tag":27,"props":3221,"children":3222},{},[3223],{"type":31,"value":3224},"你需要做到：任何一轮 AI 改动都能在 5 分钟内撤回。",{"type":26,"tag":1570,"props":3226,"children":3227},{},[],{"type":26,"tag":76,"props":3229,"children":3231},{"id":3230},"必交付物对比矩阵可复制",[3232],{"type":31,"value":3233},"必交付物：对比矩阵（可复制）",{"type":26,"tag":27,"props":3235,"children":3236},{},[3237],{"type":31,"value":3238},"下面这张表可以直接贴到你的团队 wiki：",{"type":26,"tag":83,"props":3240,"children":3241},{},[3242,3265],{"type":26,"tag":87,"props":3243,"children":3244},{},[3245],{"type":26,"tag":91,"props":3246,"children":3247},{},[3248,3253,3257,3261],{"type":26,"tag":95,"props":3249,"children":3250},{},[3251],{"type":31,"value":3252},"维度",{"type":26,"tag":95,"props":3254,"children":3255},{},[3256],{"type":31,"value":1463},{"type":26,"tag":95,"props":3258,"children":3259},{},[3260],{"type":31,"value":2708},{"type":26,"tag":95,"props":3262,"children":3263},{},[3264],{"type":31,"value":1460},{"type":26,"tag":106,"props":3266,"children":3267},{},[3268,3291,3314,3337],{"type":26,"tag":91,"props":3269,"children":3270},{},[3271,3276,3281,3286],{"type":26,"tag":113,"props":3272,"children":3273},{},[3274],{"type":31,"value":3275},"强项",{"type":26,"tag":113,"props":3277,"children":3278},{},[3279],{"type":31,"value":3280},"工具链、调试、生态",{"type":26,"tag":113,"props":3282,"children":3283},{},[3284],{"type":31,"value":3285},"补全与局部建议",{"type":26,"tag":113,"props":3287,"children":3288},{},[3289],{"type":31,"value":3290},"项目上下文、多文件落地",{"type":26,"tag":91,"props":3292,"children":3293},{},[3294,3299,3304,3309],{"type":26,"tag":113,"props":3295,"children":3296},{},[3297],{"type":31,"value":3298},"适合任务",{"type":26,"tag":113,"props":3300,"children":3301},{},[3302],{"type":31,"value":3303},"排查、调试、验证",{"type":26,"tag":113,"props":3305,"children":3306},{},[3307],{"type":31,"value":3308},"写一段、补一段",{"type":26,"tag":113,"props":3310,"children":3311},{},[3312],{"type":31,"value":3313},"改一段、改一组文件",{"type":26,"tag":91,"props":3315,"children":3316},{},[3317,3322,3327,3332],{"type":26,"tag":113,"props":3318,"children":3319},{},[3320],{"type":31,"value":3321},"最大风险",{"type":26,"tag":113,"props":3323,"children":3324},{},[3325],{"type":31,"value":3326},"无",{"type":26,"tag":113,"props":3328,"children":3329},{},[3330],{"type":31,"value":3331},"过度依赖建议",{"type":26,"tag":113,"props":3333,"children":3334},{},[3335],{"type":31,"value":3336},"范围漂移、多文件回归",{"type":26,"tag":91,"props":3338,"children":3339},{},[3340,3345,3350,3355],{"type":26,"tag":113,"props":3341,"children":3342},{},[3343],{"type":31,"value":3344},"必须搭配",{"type":26,"tag":113,"props":3346,"children":3347},{},[3348],{"type":31,"value":3349},"规范与检查",{"type":26,"tag":113,"props":3351,"children":3352},{},[3353],{"type":31,"value":3354},"代码评审",{"type":26,"tag":113,"props":3356,"children":3357},{},[3358],{"type":31,"value":3359},"闸门 + 最小回归集",{"type":26,"tag":1570,"props":3361,"children":3362},{},[],{"type":26,"tag":76,"props":3364,"children":3366},{"id":3365},"失败案例多文件看似成功实际埋雷",[3367],{"type":31,"value":3368},"失败案例：多文件“看似成功”，实际埋雷",{"type":26,"tag":27,"props":3370,"children":3371},{},[3372,3377],{"type":26,"tag":1509,"props":3373,"children":3374},{},[3375],{"type":31,"value":3376},"现象",{"type":31,"value":3378},"：AI 说“我已经把所有地方都改了”，你也接受了，结果上线后 404 或样式错位。",{"type":26,"tag":27,"props":3380,"children":3381},{},[3382,3387],{"type":26,"tag":1509,"props":3383,"children":3384},{},[3385],{"type":31,"value":3386},"复现条件",{"type":31,"value":2202},{"type":26,"tag":319,"props":3389,"children":3390},{},[3391,3396,3401],{"type":26,"tag":323,"props":3392,"children":3393},{},[3394],{"type":31,"value":3395},"你给了一个大目标（例如“把所有按钮统一成主题色”）",{"type":26,"tag":323,"props":3397,"children":3398},{},[3399],{"type":31,"value":3400},"它改了组件、样式、甚至主题配置",{"type":26,"tag":323,"props":3402,"children":3403},{},[3404],{"type":31,"value":3405},"你没有按页面模块走一遍，直接合并",{"type":26,"tag":27,"props":3407,"children":3408},{},[3409,3414],{"type":26,"tag":1509,"props":3410,"children":3411},{},[3412],{"type":31,"value":3413},"根因",{"type":31,"value":2202},{"type":26,"tag":319,"props":3416,"children":3417},{},[3418],{"type":26,"tag":323,"props":3419,"children":3420},{},[3421],{"type":31,"value":3422},"改动范围大，但验收仍按“小改动”的方式做（只看一处）",{"type":26,"tag":27,"props":3424,"children":3425},{},[3426,3431],{"type":26,"tag":1509,"props":3427,"children":3428},{},[3429],{"type":31,"value":3430},"修复",{"type":31,"value":2202},{"type":26,"tag":319,"props":3433,"children":3434},{},[3435,3440,3445],{"type":26,"tag":323,"props":3436,"children":3437},{},[3438],{"type":31,"value":3439},"强制把任务拆成“模块级目标”：Hero、Feature、Pricing、Form",{"type":26,"tag":323,"props":3441,"children":3442},{},[3443],{"type":31,"value":3444},"每个模块改完就验收一次",{"type":26,"tag":323,"props":3446,"children":3447},{},[3448],{"type":31,"value":3449},"验收通过再进入下一个模块",{"type":26,"tag":1570,"props":3451,"children":3452},{},[],{"type":26,"tag":76,"props":3454,"children":3456},{"id":3455},"faq",[3457],{"type":31,"value":3458},"FAQ",{"type":26,"tag":1896,"props":3460,"children":3462},{"id":3461},"q1我已经用了-cursor为什么还要用-copilot",[3463],{"type":31,"value":3464},"Q1：我已经用了 Cursor，为什么还要用 Copilot？",{"type":26,"tag":27,"props":3466,"children":3467},{},[3468],{"type":31,"value":3469},"因为“补全”这种高频低风险任务，Copilot 的交互成本更低；Cursor 更适合需要解释与约束的改动。",{"type":26,"tag":1896,"props":3471,"children":3473},{"id":3472},"q2什么时候应该完全不用-ai",[3474],{"type":31,"value":3475},"Q2：什么时候应该完全不用 AI？",{"type":26,"tag":27,"props":3477,"children":3478},{},[3479],{"type":31,"value":3480},"当你无法定义验收标准时。比如“更高级”“更好看”这种目标，先做信息结构与设计规则，再让 AI 帮你落地局部。",{"type":26,"tag":1570,"props":3482,"children":3483},{},[],{"type":26,"tag":76,"props":3485,"children":3487},{"id":3486},"延伸阅读",[3488],{"type":31,"value":3486},{"type":26,"tag":319,"props":3490,"children":3491},{},[3492,3501,3510,3519],{"type":26,"tag":323,"props":3493,"children":3494},{},[3495,3497],{"type":31,"value":3496},"Cursor 入门：",{"type":26,"tag":44,"props":3498,"children":3499},{"href":1543},[3500],{"type":31,"value":1546},{"type":26,"tag":323,"props":3502,"children":3503},{},[3504,3506],{"type":31,"value":3505},"Cursor 进阶：",{"type":26,"tag":44,"props":3507,"children":3508},{"href":1554},[3509],{"type":31,"value":1557},{"type":26,"tag":323,"props":3511,"children":3512},{},[3513,3515],{"type":31,"value":3514},"规则配置：",{"type":26,"tag":44,"props":3516,"children":3517},{"href":1565},[3518],{"type":31,"value":1568},{"type":26,"tag":323,"props":3520,"children":3521},{},[3522,3524],{"type":31,"value":3523},"Copilot 实战：",{"type":26,"tag":44,"props":3525,"children":3527},{"href":3526},"/topics/ai/github-copilot-tips",[3528],{"type":31,"value":3529},"GitHub Copilot 实用技巧",{"title":7,"searchDepth":1430,"depth":1430,"links":3531},[3532,3533,3534,3539,3545,3546,3547,3551],{"id":2680,"depth":1433,"text":2683},{"id":2730,"depth":1433,"text":2733},{"id":2969,"depth":1433,"text":2972,"children":3535},[3536,3537,3538],{"id":2975,"depth":1430,"text":2978},{"id":3012,"depth":1430,"text":3015},{"id":3056,"depth":1430,"text":3059},{"id":3088,"depth":1433,"text":3091,"children":3540},[3541,3542,3543,3544],{"id":3099,"depth":1430,"text":3102},{"id":3143,"depth":1430,"text":3146},{"id":3180,"depth":1430,"text":3183},{"id":3198,"depth":1430,"text":3201},{"id":3230,"depth":1433,"text":3233},{"id":3365,"depth":1433,"text":3368},{"id":3455,"depth":1433,"text":3458,"children":3548},[3549,3550],{"id":3461,"depth":1430,"text":3464},{"id":3472,"depth":1430,"text":3475},{"id":3486,"depth":1433,"text":3486},"content:topics:ai:cursor-vs-copilot-vscode-workflow.md","topics/ai/cursor-vs-copilot-vscode-workflow.md","topics/ai/cursor-vs-copilot-vscode-workflow",{"_path":3556,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":3557,"description":3558,"date":3559,"topic":5,"author":11,"tags":3560,"image":3565,"featured":1295,"readingTime":2621,"body":3566,"_type":1447,"_id":4214,"_source":1449,"_file":4215,"_stem":4216,"_extension":1452},"/topics/ai/ai-debugging-troubleshooting-guide","AI 辅助调试与问题排查：让 AI 成为你的调试搭档","深入探讨如何利用 AI 工具提升调试效率，包括错误信息分析、日志解读、性能问题定位、复杂 bug 排查等实战场景，构建 AI 驱动的调试工作流。","2026-01-18",[3561,3562,3563,1464,3564],"AI 调试","问题排查","Debug","错误处理","/images/topics/ai/ai-debugging-guide.jpg",{"type":23,"children":3567,"toc":4185},[3568,3574,3580,3585,3590,3595,3601,3607,3612,3620,3648,3656,3679,3685,3695,3704,3712,3720,3753,3761,3791,3804,3812,3817,3825,3833,3844,3850,3858,3869,3877,3886,3892,3898,3903,3912,3918,3923,3932,3938,3944,3953,3959,3968,3974,3985,3991,3997,4006,4012,4021,4027,4033,4041,4047,4056,4064,4072,4075,4081,4086,4105,4117,4120,4126,4131,4140,4145,4148,4154,4159,4177],{"type":26,"tag":76,"props":3569,"children":3571},{"id":3570},"ai-辅助调试与问题排查",[3572],{"type":31,"value":3573},"AI 辅助调试与问题排查",{"type":26,"tag":76,"props":3575,"children":3577},{"id":3576},"引言调试的痛与-ai-的解药",[3578],{"type":31,"value":3579},"引言：调试的痛与 AI 的解药",{"type":26,"tag":27,"props":3581,"children":3582},{},[3583],{"type":31,"value":3584},"调试是每个程序员的日常，也是最消耗时间和精力的工作之一。我们都有过这样的经历：盯着一个莫名其妙的错误信息，翻遍 Stack Overflow，尝试各种方案，几个小时后才发现是一个愚蠢的拼写错误。",{"type":26,"tag":27,"props":3586,"children":3587},{},[3588],{"type":31,"value":3589},"AI 工具的出现，正在改变调试的方式。不是替代你的思考，而是加速你的分析过程——帮你快速理解错误、缩小排查范围、验证假设。",{"type":26,"tag":27,"props":3591,"children":3592},{},[3593],{"type":31,"value":3594},"这篇文章分享我在实际项目中使用 AI 辅助调试的经验和方法论。",{"type":26,"tag":76,"props":3596,"children":3598},{"id":3597},"第一部分建立-ai-调试的思维模型",[3599],{"type":31,"value":3600},"第一部分：建立 AI 调试的思维模型",{"type":26,"tag":1896,"props":3602,"children":3604},{"id":3603},"_11-ai-在调试中的角色",[3605],{"type":31,"value":3606},"1.1 AI 在调试中的角色",{"type":26,"tag":27,"props":3608,"children":3609},{},[3610],{"type":31,"value":3611},"把 AI 想象成一个经验丰富但不了解你项目的高级工程师。它：",{"type":26,"tag":27,"props":3613,"children":3614},{},[3615],{"type":26,"tag":1509,"props":3616,"children":3617},{},[3618],{"type":31,"value":3619},"擅长的事情：",{"type":26,"tag":319,"props":3621,"children":3622},{},[3623,3628,3633,3638,3643],{"type":26,"tag":323,"props":3624,"children":3625},{},[3626],{"type":31,"value":3627},"解读错误信息的含义",{"type":26,"tag":323,"props":3629,"children":3630},{},[3631],{"type":31,"value":3632},"提供可能的原因列表",{"type":26,"tag":323,"props":3634,"children":3635},{},[3636],{"type":31,"value":3637},"给出排查方向建议",{"type":26,"tag":323,"props":3639,"children":3640},{},[3641],{"type":31,"value":3642},"解释复杂的技术概念",{"type":26,"tag":323,"props":3644,"children":3645},{},[3646],{"type":31,"value":3647},"生成调试代码片段",{"type":26,"tag":27,"props":3649,"children":3650},{},[3651],{"type":26,"tag":1509,"props":3652,"children":3653},{},[3654],{"type":31,"value":3655},"不擅长的事情：",{"type":26,"tag":319,"props":3657,"children":3658},{},[3659,3664,3669,3674],{"type":26,"tag":323,"props":3660,"children":3661},{},[3662],{"type":31,"value":3663},"了解你的业务逻辑",{"type":26,"tag":323,"props":3665,"children":3666},{},[3667],{"type":31,"value":3668},"知道你的代码历史",{"type":26,"tag":323,"props":3670,"children":3671},{},[3672],{"type":31,"value":3673},"理解项目特定的约定",{"type":26,"tag":323,"props":3675,"children":3676},{},[3677],{"type":31,"value":3678},"做出架构级判断",{"type":26,"tag":1896,"props":3680,"children":3682},{"id":3681},"_12-有效提问的结构",[3683],{"type":31,"value":3684},"1.2 有效提问的结构",{"type":26,"tag":301,"props":3686,"children":3690},{"code":3687,"language":1447,"meta":7,"className":3688},"## 高效的调试提问模板\n\n**问题描述**\n[简洁描述遇到的问题]\n\n**错误信息**\n",[3689],"language-markdown",[3691],{"type":26,"tag":309,"props":3692,"children":3693},{"__ignoreMap":7},[3694],{"type":31,"value":3687},{"type":26,"tag":27,"props":3696,"children":3697},{},[3698],{"type":26,"tag":3699,"props":3700,"children":3701},"span",{},[3702],{"type":31,"value":3703},"完整的错误信息，不要截断",{"type":26,"tag":301,"props":3705,"children":3707},{"code":3706},"\n**相关代码**\n```javascript\n[精简但完整的相关代码]\n",[3708],{"type":26,"tag":309,"props":3709,"children":3710},{"__ignoreMap":7},[3711],{"type":31,"value":3706},{"type":26,"tag":27,"props":3713,"children":3714},{},[3715],{"type":26,"tag":1509,"props":3716,"children":3717},{},[3718],{"type":31,"value":3719},"环境信息",{"type":26,"tag":319,"props":3721,"children":3722},{},[3723,3733,3743],{"type":26,"tag":323,"props":3724,"children":3725},{},[3726,3728],{"type":31,"value":3727},"运行环境：",{"type":26,"tag":3699,"props":3729,"children":3730},{},[3731],{"type":31,"value":3732},"Node 版本/浏览器版本",{"type":26,"tag":323,"props":3734,"children":3735},{},[3736,3738],{"type":31,"value":3737},"框架版本：",{"type":26,"tag":3699,"props":3739,"children":3740},{},[3741],{"type":31,"value":3742},"相关框架版本",{"type":26,"tag":323,"props":3744,"children":3745},{},[3746,3748],{"type":31,"value":3747},"操作系统：",{"type":26,"tag":3699,"props":3749,"children":3750},{},[3751],{"type":31,"value":3752},"如果相关",{"type":26,"tag":27,"props":3754,"children":3755},{},[3756],{"type":26,"tag":1509,"props":3757,"children":3758},{},[3759],{"type":31,"value":3760},"已尝试的方案",{"type":26,"tag":319,"props":3762,"children":3763},{},[3764,3778],{"type":26,"tag":323,"props":3765,"children":3766},{},[3767,3772,3773],{"type":26,"tag":3699,"props":3768,"children":3769},{},[3770],{"type":31,"value":3771},"方案1",{"type":31,"value":2202},{"type":26,"tag":3699,"props":3774,"children":3775},{},[3776],{"type":31,"value":3777},"结果",{"type":26,"tag":323,"props":3779,"children":3780},{},[3781,3786,3787],{"type":26,"tag":3699,"props":3782,"children":3783},{},[3784],{"type":31,"value":3785},"方案2",{"type":31,"value":2202},{"type":26,"tag":3699,"props":3788,"children":3789},{},[3790],{"type":31,"value":3777},{"type":26,"tag":27,"props":3792,"children":3793},{},[3794,3799],{"type":26,"tag":1509,"props":3795,"children":3796},{},[3797],{"type":31,"value":3798},"期望的结果",{"type":26,"tag":3699,"props":3800,"children":3801},{},[3802],{"type":31,"value":3803},"描述期望的行为",{"type":26,"tag":301,"props":3805,"children":3807},{"code":3806},"\n### 1.3 分级调试策略\n\n",[3808],{"type":26,"tag":309,"props":3809,"children":3810},{"__ignoreMap":7},[3811],{"type":31,"value":3806},{"type":26,"tag":27,"props":3813,"children":3814},{},[3815],{"type":31,"value":3816},"┌───────────────────────────────────────────────────────────┐\n│                    AI 辅助调试决策树                        │\n├───────────────────────────────────────────────────────────┤\n│                                                           │\n│  Level 1：简单错误（5分钟内解决）                           │\n│  ├── 语法错误、拼写错误                                    │\n│  ├── 方法：直接复制错误信息给 AI                           │\n│  └── 工具：Copilot Chat / ChatGPT                        │\n│                                                           │\n│  Level 2：中等复杂度（30分钟内解决）                        │\n│  ├── 类型错误、逻辑错误、API 使用错误                      │\n│  ├── 方法：提供错误信息 + 相关代码 + 上下文                 │\n│  └── 工具：Cursor Chat / Claude                          │\n│                                                           │\n│  Level 3：复杂问题（需要深入分析）                          │\n│  ├── 竞态条件、内存泄漏、性能问题                          │\n│  ├── 方法：详细描述场景 + 提供多个文件 + 讨论               │\n│  └── 工具：Cursor Composer / 专门的 AI 会话                │\n│                                                           │\n│  Level 4：架构级问题                                       │\n│  ├── 设计缺陷、技术债务                                    │\n│  ├── 方法：AI 辅助分析 + 人工判断                          │\n│  └── 工具：与团队讨论 + AI 作为顾问                        │\n│                                                           │\n└───────────────────────────────────────────────────────────┘",{"type":26,"tag":301,"props":3818,"children":3820},{"code":3819},"\n## 第二部分：错误信息分析\n\n### 2.1 前端错误分析\n\n**场景 1：React 错误边界触发**\n\n```typescript\n// 错误信息：\n// Error: Hydration failed because the initial UI does not match \n// what was rendered on the server.\n\n// 提问方式：\n/**\n * 我在 Next.js 14 App Router 项目中遇到这个错误：\n * \n * Error: Hydration failed because the initial UI does not match \n * what was rendered on the server.\n * \n * 相关代码：\n */\nfunction UserStatus() {\n  const [isLoggedIn, setIsLoggedIn] = useState(false);\n  \n  useEffect(() => {\n    setIsLoggedIn(localStorage.getItem('token') !== null);\n  }, []);\n  \n  return \u003Cdiv>{isLoggedIn ? '已登录' : '未登录'}\u003C/div>;\n}\n\n// AI 会分析出：\n// 1. 服务端渲染时 localStorage 不可用，默认 false\n// 2. 客户端 hydration 时可能是 true\n// 3. 导致服务端和客户端渲染结果不一致\n\n// AI 建议的解决方案：\nfunction UserStatus() {\n  const [isLoggedIn, setIsLoggedIn] = useState\u003Cboolean | null>(null);\n  \n  useEffect(() => {\n    setIsLoggedIn(localStorage.getItem('token') !== null);\n  }, []);\n  \n  // 初始状态显示加载中，避免 hydration 不匹配\n  if (isLoggedIn === null) {\n    return \u003Cdiv>加载中...\u003C/div>;\n  }\n  \n  return \u003Cdiv>{isLoggedIn ? '已登录' : '未登录'}\u003C/div>;\n}\n",[3821],{"type":26,"tag":309,"props":3822,"children":3823},{"__ignoreMap":7},[3824],{"type":31,"value":3819},{"type":26,"tag":27,"props":3826,"children":3827},{},[3828],{"type":26,"tag":1509,"props":3829,"children":3830},{},[3831],{"type":31,"value":3832},"场景 2：Vue 响应式警告",{"type":26,"tag":301,"props":3834,"children":3839},{"code":3835,"language":3836,"meta":7,"className":3837},"// 警告信息：\n// [Vue warn]: Property \"xxx\" was accessed during render but is not \n// defined on instance.\n\n// 提问方式：\n/**\n * Vue 3 项目中出现这个警告：\n * [Vue warn]: Property \"userInfo\" was accessed during render \n * but is not defined on instance.\n * \n * 组件代码：\n */\n\u003Ctemplate>\n  \u003Cdiv>{{ userInfo.name }}\u003C/div>\n\u003C/template>\n\n\u003Cscript setup>\nconst { data: userInfo } = await useFetch('/api/user');\n\u003C/script>\n\n// AI 分析：\n// 1. useFetch 是异步的，初始渲染时 userInfo 可能是 undefined\n// 2. 直接访问 userInfo.name 会报错\n\n// AI 建议：\n\u003Ctemplate>\n  \u003Cdiv v-if=\"userInfo\">{{ userInfo.name }}\u003C/div>\n  \u003Cdiv v-else>加载中...\u003C/div>\n\u003C/template>\n\n\u003Cscript setup>\nconst { data: userInfo, pending } = await useFetch('/api/user');\n\u003C/script>\n","typescript",[3838],"language-typescript",[3840],{"type":26,"tag":309,"props":3841,"children":3842},{"__ignoreMap":7},[3843],{"type":31,"value":3835},{"type":26,"tag":1896,"props":3845,"children":3847},{"id":3846},"_22-后端错误分析",[3848],{"type":31,"value":3849},"2.2 后端错误分析",{"type":26,"tag":27,"props":3851,"children":3852},{},[3853],{"type":26,"tag":1509,"props":3854,"children":3855},{},[3856],{"type":31,"value":3857},"场景 1：Node.js 内存问题",{"type":26,"tag":301,"props":3859,"children":3864},{"code":3860,"language":3861,"meta":7,"className":3862},"// 错误信息：\n// FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - \n// JavaScript heap out of memory\n\n// 提问方式（包含上下文）：\n/**\n * Node.js 服务运行几小时后崩溃，错误信息：\n * FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - \n * JavaScript heap out of memory\n * \n * 服务功能：处理 CSV 文件上传，每次约 100MB\n * \n * 处理代码：\n */\nasync function processCSV(filePath) {\n  const content = fs.readFileSync(filePath, 'utf-8');\n  const rows = content.split('\\n');\n  const results = [];\n  \n  for (const row of rows) {\n    const processed = await processRow(row);\n    results.push(processed);\n  }\n  \n  return results;\n}\n\n// AI 分析会指出：\n// 1. 一次性读取整个文件到内存\n// 2. 所有处理结果累积在 results 数组\n// 3. 建议使用流式处理\n\n// AI 提供的优化方案：\nconst { createReadStream } = require('fs');\nconst { createInterface } = require('readline');\n\nasync function processCSVStream(filePath, onRow) {\n  const fileStream = createReadStream(filePath);\n  const rl = createInterface({\n    input: fileStream,\n    crlfDelay: Infinity\n  });\n  \n  let count = 0;\n  for await (const line of rl) {\n    await onRow(line);\n    count++;\n    \n    // 每处理 1000 行，给 GC 机会运行\n    if (count % 1000 === 0) {\n      await new Promise(r => setImmediate(r));\n    }\n  }\n}\n","javascript",[3863],"language-javascript",[3865],{"type":26,"tag":309,"props":3866,"children":3867},{"__ignoreMap":7},[3868],{"type":31,"value":3860},{"type":26,"tag":27,"props":3870,"children":3871},{},[3872],{"type":26,"tag":1509,"props":3873,"children":3874},{},[3875],{"type":31,"value":3876},"场景 2：数据库连接问题",{"type":26,"tag":301,"props":3878,"children":3881},{"code":3879,"language":3836,"meta":7,"className":3880},"// 错误信息：\n// Error: Connection pool exhausted - \n// max connections (10) already in use\n\n// 提问方式：\n/**\n * PostgreSQL 连接池耗尽错误，高并发时出现：\n * Error: Connection pool exhausted\n * \n * 当前配置：\n * - max connections: 10\n * - 并发请求: 约 100/秒\n * \n * 数据库调用代码：\n */\nasync function getUserData(userId: string) {\n  const client = await pool.connect();\n  try {\n    const user = await client.query('SELECT * FROM users WHERE id = $1', [userId]);\n    const orders = await client.query('SELECT * FROM orders WHERE user_id = $1', [userId]);\n    const payments = await client.query('SELECT * FROM payments WHERE user_id = $1', [userId]);\n    return { user: user.rows[0], orders: orders.rows, payments: payments.rows };\n  } finally {\n    client.release();\n  }\n}\n\n// AI 会分析出多个可能原因并给出综合方案\n",[3838],[3882],{"type":26,"tag":309,"props":3883,"children":3884},{"__ignoreMap":7},[3885],{"type":31,"value":3879},{"type":26,"tag":76,"props":3887,"children":3889},{"id":3888},"第三部分日志分析与问题定位",[3890],{"type":31,"value":3891},"第三部分：日志分析与问题定位",{"type":26,"tag":1896,"props":3893,"children":3895},{"id":3894},"_31-结构化日志分析",[3896],{"type":31,"value":3897},"3.1 结构化日志分析",{"type":26,"tag":27,"props":3899,"children":3900},{},[3901],{"type":31,"value":3902},"当面对大量日志时，让 AI 帮你快速定位问题：",{"type":26,"tag":301,"props":3904,"children":3907},{"code":3905,"language":3861,"meta":7,"className":3906},"// 提问示例：\n/**\n * 分析以下日志，找出导致请求失败的原因：\n * \n * 日志片段：\n */\nconst logs = `\n2024-01-15 10:23:45.123 INFO  [req-abc123] 收到请求 POST /api/order\n2024-01-15 10:23:45.125 DEBUG [req-abc123] 用户认证通过 userId=u001\n2024-01-15 10:23:45.130 DEBUG [req-abc123] 开始库存检查 productId=p001\n2024-01-15 10:23:45.145 DEBUG [req-abc123] 库存检查通过 available=50\n2024-01-15 10:23:45.150 DEBUG [req-abc123] 开始创建订单\n2024-01-15 10:23:45.200 DEBUG [req-abc123] 数据库连接获取成功\n2024-01-15 10:23:45.250 ERROR [req-abc123] 订单创建失败 error=\"deadlock detected\"\n2024-01-15 10:23:45.251 WARN  [req-abc123] 事务回滚\n2024-01-15 10:23:45.255 INFO  [req-abc123] 响应 500 耗时 132ms\n`;\n\n// AI 分析结果会包括：\n// 1. 问题定位：数据库死锁\n// 2. 可能原因：并发订单创建导致锁竞争\n// 3. 排查建议：检查事务隔离级别、锁顺序\n",[3863],[3908],{"type":26,"tag":309,"props":3909,"children":3910},{"__ignoreMap":7},[3911],{"type":31,"value":3905},{"type":26,"tag":1896,"props":3913,"children":3915},{"id":3914},"_32-创建调试日志",[3916],{"type":31,"value":3917},"3.2 创建调试日志",{"type":26,"tag":27,"props":3919,"children":3920},{},[3921],{"type":31,"value":3922},"让 AI 帮你生成调试用的日志代码：",{"type":26,"tag":301,"props":3924,"children":3927},{"code":3925,"language":3836,"meta":7,"className":3926},"// 请求：\n// \"为这个函数添加详细的调试日志，包括入参、关键步骤、耗时和结果\"\n\n// 原代码：\nasync function processOrder(order: Order): Promise\u003COrderResult> {\n  const inventory = await checkInventory(order.items);\n  const payment = await processPayment(order.userId, order.total);\n  const result = await createOrder(order, payment.transactionId);\n  return result;\n}\n\n// AI 生成的带日志版本：\nasync function processOrder(order: Order): Promise\u003COrderResult> {\n  const requestId = generateRequestId();\n  const startTime = performance.now();\n  \n  logger.info({\n    requestId,\n    event: 'order_processing_start',\n    orderId: order.id,\n    userId: order.userId,\n    itemCount: order.items.length,\n    total: order.total\n  });\n  \n  try {\n    // 库存检查\n    const inventoryStart = performance.now();\n    const inventory = await checkInventory(order.items);\n    logger.debug({\n      requestId,\n      event: 'inventory_check_complete',\n      duration: performance.now() - inventoryStart,\n      available: inventory.allAvailable\n    });\n    \n    // 支付处理\n    const paymentStart = performance.now();\n    const payment = await processPayment(order.userId, order.total);\n    logger.debug({\n      requestId,\n      event: 'payment_complete',\n      duration: performance.now() - paymentStart,\n      transactionId: payment.transactionId\n    });\n    \n    // 创建订单\n    const createStart = performance.now();\n    const result = await createOrder(order, payment.transactionId);\n    logger.debug({\n      requestId,\n      event: 'order_created',\n      duration: performance.now() - createStart,\n      resultOrderId: result.orderId\n    });\n    \n    logger.info({\n      requestId,\n      event: 'order_processing_complete',\n      duration: performance.now() - startTime,\n      success: true\n    });\n    \n    return result;\n  } catch (error) {\n    logger.error({\n      requestId,\n      event: 'order_processing_failed',\n      duration: performance.now() - startTime,\n      error: error.message,\n      stack: error.stack\n    });\n    throw error;\n  }\n}\n",[3838],[3928],{"type":26,"tag":309,"props":3929,"children":3930},{"__ignoreMap":7},[3931],{"type":31,"value":3925},{"type":26,"tag":76,"props":3933,"children":3935},{"id":3934},"第四部分性能问题排查",[3936],{"type":31,"value":3937},"第四部分：性能问题排查",{"type":26,"tag":1896,"props":3939,"children":3941},{"id":3940},"_41-前端性能分析",[3942],{"type":31,"value":3943},"4.1 前端性能分析",{"type":26,"tag":301,"props":3945,"children":3948},{"code":3946,"language":3836,"meta":7,"className":3947},"// 场景：页面加载慢，需要分析原因\n\n// 提问方式：\n/**\n * 页面首屏加载需要 5 秒，以下是 Performance API 数据，\n * 请分析性能瓶颈：\n */\nconst performanceData = {\n  // Navigation Timing\n  dns: 50,           // DNS 查询\n  tcp: 100,          // TCP 连接\n  ttfb: 800,         // 首字节时间\n  download: 200,     // 文档下载\n  domParsing: 300,   // DOM 解析\n  domContentLoaded: 1500,\n  load: 5000,\n  \n  // Resource Timing (主要资源)\n  resources: [\n    { name: 'main.js', size: '2.5MB', duration: 1200 },\n    { name: 'vendor.js', size: '1.8MB', duration: 900 },\n    { name: 'styles.css', size: '500KB', duration: 300 },\n    { name: 'hero-image.jpg', size: '3MB', duration: 1500 },\n  ],\n  \n  // Long Tasks\n  longTasks: [\n    { startTime: 1600, duration: 800, name: 'script-evaluation' },\n    { startTime: 2500, duration: 400, name: 'layout' }\n  ]\n};\n\n// AI 会分析出：\n// 1. JS bundle 过大（4.3MB），需要代码分割\n// 2. 图片未优化（3MB 的 hero 图片）\n// 3. 存在长任务阻塞主线程\n// 并给出具体优化建议\n",[3838],[3949],{"type":26,"tag":309,"props":3950,"children":3951},{"__ignoreMap":7},[3952],{"type":31,"value":3946},{"type":26,"tag":1896,"props":3954,"children":3956},{"id":3955},"_42-内存泄漏排查",[3957],{"type":31,"value":3958},"4.2 内存泄漏排查",{"type":26,"tag":301,"props":3960,"children":3963},{"code":3961,"language":3836,"meta":7,"className":3962},"// 场景：应用运行一段时间后变卡\n\n// 提问方式：\n/**\n * React 应用运行一段时间后内存持续增长，以下是 Heap Snapshot 对比：\n * \n * 初始状态：50MB\n * 运行 1 小时后：150MB\n * 运行 2 小时后：280MB\n * \n * Retained objects 增长最快的：\n * - (closure) - 增长 50MB\n * - HTMLDivElement - 增长 30MB\n * - Array - 增长 20MB\n * \n * 可疑代码：\n */\nfunction DataDashboard() {\n  const [data, setData] = useState([]);\n  const chartRef = useRef(null);\n  \n  useEffect(() => {\n    // 每秒刷新数据\n    const interval = setInterval(async () => {\n      const newData = await fetchLatestData();\n      setData(prev => [...prev, ...newData]);  // 数据不断累积\n    }, 1000);\n    \n    // 初始化图表\n    const chart = new Chart(chartRef.current, {\n      // 配置...\n    });\n    \n    // 没有 cleanup！\n  }, []);\n  \n  return \u003Ccanvas ref={chartRef} />;\n}\n\n// AI 会指出：\n// 1. interval 没有清理\n// 2. Chart 实例没有销毁\n// 3. data 无限增长\n// 并提供修复代码\n",[3838],[3964],{"type":26,"tag":309,"props":3965,"children":3966},{"__ignoreMap":7},[3967],{"type":31,"value":3961},{"type":26,"tag":1896,"props":3969,"children":3971},{"id":3970},"_43-数据库查询优化",[3972],{"type":31,"value":3973},"4.3 数据库查询优化",{"type":26,"tag":301,"props":3975,"children":3980},{"code":3976,"language":3977,"meta":7,"className":3978},"-- 场景：查询很慢，让 AI 分析执行计划\n\n-- 提问方式：\n-- 以下查询在数据量大时很慢（orders 表 1000 万行），\n-- 执行计划如下，请分析并优化：\n\nEXPLAIN ANALYZE\nSELECT o.*, u.name, u.email\nFROM orders o\nJOIN users u ON o.user_id = u.id\nWHERE o.status = 'pending'\n  AND o.created_at > '2024-01-01'\nORDER BY o.created_at DESC\nLIMIT 20;\n\n-- 执行计划：\n/*\nSort  (cost=156847.23..157847.23 rows=400000 width=250)\n  Sort Key: o.created_at DESC\n  ->  Hash Join  (cost=1500.00..89847.23 rows=400000 width=250)\n        Hash Cond: (o.user_id = u.id)\n        ->  Seq Scan on orders o  (cost=0.00..85000.00 rows=400000)\n              Filter: ((status = 'pending') AND (created_at > '2024-01-01'))\n        ->  Hash  (cost=1000.00..1000.00 rows=50000 width=100)\n              ->  Seq Scan on users u  (cost=0.00..1000.00 rows=50000)\nPlanning Time: 0.5 ms\nExecution Time: 3500 ms\n*/\n\n-- AI 会分析出问题并建议：\n-- 1. orders 表全表扫描 - 需要复合索引\n-- 2. 建议创建索引：\nCREATE INDEX idx_orders_status_created ON orders(status, created_at DESC);\n\n-- 3. 如果 status 选择性不高，考虑部分索引：\nCREATE INDEX idx_orders_pending ON orders(created_at DESC) \nWHERE status = 'pending';\n","sql",[3979],"language-sql",[3981],{"type":26,"tag":309,"props":3982,"children":3983},{"__ignoreMap":7},[3984],{"type":31,"value":3976},{"type":26,"tag":76,"props":3986,"children":3988},{"id":3987},"第五部分复杂-bug-排查",[3989],{"type":31,"value":3990},"第五部分：复杂 Bug 排查",{"type":26,"tag":1896,"props":3992,"children":3994},{"id":3993},"_51-竞态条件",[3995],{"type":31,"value":3996},"5.1 竞态条件",{"type":26,"tag":301,"props":3998,"children":4001},{"code":3999,"language":3836,"meta":7,"className":4000},"// 场景：偶发的数据不一致问题\n\n// 提问方式：\n/**\n * 用户反馈偶尔看到错误的账户余额，但刷新后正常。\n * 怀疑是竞态条件，以下是相关代码：\n */\nasync function updateBalance(userId: string, amount: number) {\n  // 读取当前余额\n  const user = await db.users.findOne({ id: userId });\n  const newBalance = user.balance + amount;\n  \n  // 更新余额\n  await db.users.update({ id: userId }, { balance: newBalance });\n  \n  // 记录交易\n  await db.transactions.create({\n    userId,\n    amount,\n    balanceAfter: newBalance,\n    createdAt: new Date()\n  });\n  \n  return newBalance;\n}\n\n// 并发调用场景：\n// 用户同时发起两笔交易：+100 和 -50\n// 期望结果：原余额 1000 → 1050\n// 实际可能：原余额 1000 → 1100 或 950\n\n// AI 会分析竞态条件并提供解决方案：\nasync function updateBalanceAtomic(userId: string, amount: number) {\n  // 方案 1：使用数据库原子操作\n  const result = await db.users.findOneAndUpdate(\n    { id: userId },\n    { $inc: { balance: amount } },\n    { returnDocument: 'after' }\n  );\n  \n  await db.transactions.create({\n    userId,\n    amount,\n    balanceAfter: result.balance,\n    createdAt: new Date()\n  });\n  \n  return result.balance;\n}\n\n// 方案 2：使用乐观锁\nasync function updateBalanceOptimistic(userId: string, amount: number) {\n  const maxRetries = 3;\n  \n  for (let i = 0; i \u003C maxRetries; i++) {\n    const user = await db.users.findOne({ id: userId });\n    const newBalance = user.balance + amount;\n    \n    const updated = await db.users.updateOne(\n      { id: userId, version: user.version },\n      { balance: newBalance, version: user.version + 1 }\n    );\n    \n    if (updated.modifiedCount === 1) {\n      await db.transactions.create({...});\n      return newBalance;\n    }\n    \n    // 版本冲突，重试\n    await sleep(10 * (i + 1));\n  }\n  \n  throw new Error('Update failed after retries');\n}\n",[3838],[4002],{"type":26,"tag":309,"props":4003,"children":4004},{"__ignoreMap":7},[4005],{"type":31,"value":3999},{"type":26,"tag":1896,"props":4007,"children":4009},{"id":4008},"_52-分布式系统问题",[4010],{"type":31,"value":4011},"5.2 分布式系统问题",{"type":26,"tag":301,"props":4013,"children":4016},{"code":4014,"language":3836,"meta":7,"className":4015},"// 场景：微服务间的数据不一致\n\n// 提问方式：\n/**\n * 订单服务和库存服务偶尔出现数据不一致：\n * - 订单显示已创建\n * - 库存未扣减\n * \n * 当前流程：\n */\n// Order Service\nasync function createOrder(orderData) {\n  // 1. 调用库存服务扣减库存\n  await inventoryService.deduct(orderData.items);\n  \n  // 2. 创建订单\n  const order = await orderRepository.create(orderData);\n  \n  // 3. 发送订单创建事件\n  await eventBus.publish('order.created', order);\n  \n  return order;\n}\n\n// 问题分析：如果步骤 2 或 3 失败，库存已经扣减但订单未创建\n\n// AI 会建议使用 Saga 模式或事务发件箱模式\n",[3838],[4017],{"type":26,"tag":309,"props":4018,"children":4019},{"__ignoreMap":7},[4020],{"type":31,"value":4014},{"type":26,"tag":76,"props":4022,"children":4024},{"id":4023},"第六部分ai-调试工作流",[4025],{"type":31,"value":4026},"第六部分：AI 调试工作流",{"type":26,"tag":1896,"props":4028,"children":4030},{"id":4029},"_61-我的调试流程",[4031],{"type":31,"value":4032},"6.1 我的调试流程",{"type":26,"tag":301,"props":4034,"children":4036},{"code":4035},"┌────────────────────────────────────────────────────────────┐\n│                    AI 辅助调试工作流                         │\n├────────────────────────────────────────────────────────────┤\n│                                                            │\n│  Step 1: 问题收集                                          │\n│  ├── 复制完整错误信息                                       │\n│  ├── 截图相关日志                                          │\n│  └── 记录复现步骤                                          │\n│                                                            │\n│  Step 2: 快速分析                                          │\n│  ├── 将错误信息发给 AI                                      │\n│  ├── 获取可能原因列表                                       │\n│  └── 评估哪些最可能                                         │\n│                                                            │\n│  Step 3: 深入调查                                          │\n│  ├── 根据 AI 建议添加日志/断点                              │\n│  ├── 收集更多信息                                          │\n│  └── 再次询问 AI（带新信息）                                │\n│                                                            │\n│  Step 4: 验证修复                                          │\n│  ├── AI 生成修复代码                                        │\n│  ├── 人工审查确认                                          │\n│  └── 测试验证                                               │\n│                                                            │\n│  Step 5: 预防措施                                          │\n│  ├── AI 建议类似问题的预防方法                              │\n│  ├── 添加相关测试用例                                       │\n│  └── 更新文档/知识库                                        │\n│                                                            │\n└────────────────────────────────────────────────────────────┘\n",[4037],{"type":26,"tag":309,"props":4038,"children":4039},{"__ignoreMap":7},[4040],{"type":31,"value":4035},{"type":26,"tag":1896,"props":4042,"children":4044},{"id":4043},"_62-调试对话模板",[4045],{"type":31,"value":4046},"6.2 调试对话模板",{"type":26,"tag":301,"props":4048,"children":4051},{"code":4049,"language":1447,"meta":7,"className":4050},"## 第一轮：问题描述\n\n我遇到了一个问题：[简述问题]\n\n错误信息：\n",[3689],[4052],{"type":26,"tag":309,"props":4053,"children":4054},{"__ignoreMap":7},[4055],{"type":31,"value":4049},{"type":26,"tag":27,"props":4057,"children":4058},{},[4059],{"type":26,"tag":3699,"props":4060,"children":4061},{},[4062],{"type":31,"value":4063},"粘贴完整错误",{"type":26,"tag":301,"props":4065,"children":4067},{"code":4066},"\n相关代码：\n```javascript\n[粘贴代码]\n",[4068],{"type":26,"tag":309,"props":4069,"children":4070},{"__ignoreMap":7},[4071],{"type":31,"value":4066},{"type":26,"tag":1570,"props":4073,"children":4074},{},[],{"type":26,"tag":76,"props":4076,"children":4078},{"id":4077},"第二轮补充信息",[4079],{"type":31,"value":4080},"第二轮：补充信息",{"type":26,"tag":27,"props":4082,"children":4083},{},[4084],{"type":31,"value":4085},"根据你的建议，我添加了日志，发现：",{"type":26,"tag":319,"props":4087,"children":4088},{},[4089,4097],{"type":26,"tag":323,"props":4090,"children":4091},{},[4092],{"type":26,"tag":3699,"props":4093,"children":4094},{},[4095],{"type":31,"value":4096},"发现 1",{"type":26,"tag":323,"props":4098,"children":4099},{},[4100],{"type":26,"tag":3699,"props":4101,"children":4102},{},[4103],{"type":31,"value":4104},"发现 2",{"type":26,"tag":27,"props":4106,"children":4107},{},[4108,4110,4115],{"type":31,"value":4109},"这是否说明问题出在 ",{"type":26,"tag":3699,"props":4111,"children":4112},{},[4113],{"type":31,"value":4114},"你的猜测",{"type":31,"value":4116},"？",{"type":26,"tag":1570,"props":4118,"children":4119},{},[],{"type":26,"tag":76,"props":4121,"children":4123},{"id":4122},"第三轮确认修复",[4124],{"type":31,"value":4125},"第三轮：确认修复",{"type":26,"tag":27,"props":4127,"children":4128},{},[4129],{"type":31,"value":4130},"我按照你的建议修改了代码：",{"type":26,"tag":301,"props":4132,"children":4135},{"code":4133,"language":3861,"meta":7,"className":4134},"[粘贴修改后的代码]\n",[3863],[4136],{"type":26,"tag":309,"props":4137,"children":4138},{"__ignoreMap":7},[4139],{"type":31,"value":4133},{"type":26,"tag":27,"props":4141,"children":4142},{},[4143],{"type":31,"value":4144},"请确认这个修复是否正确，以及是否有其他潜在问题。",{"type":26,"tag":1570,"props":4146,"children":4147},{},[],{"type":26,"tag":76,"props":4149,"children":4151},{"id":4150},"第四轮预防",[4152],{"type":31,"value":4153},"第四轮：预防",{"type":26,"tag":27,"props":4155,"children":4156},{},[4157],{"type":31,"value":4158},"这个问题已解决。请建议：",{"type":26,"tag":911,"props":4160,"children":4161},{},[4162,4167,4172],{"type":26,"tag":323,"props":4163,"children":4164},{},[4165],{"type":31,"value":4166},"如何防止类似问题再次发生？",{"type":26,"tag":323,"props":4168,"children":4169},{},[4170],{"type":31,"value":4171},"应该添加什么测试用例？",{"type":26,"tag":323,"props":4173,"children":4174},{},[4175],{"type":31,"value":4176},"有什么最佳实践可以参考？",{"type":26,"tag":301,"props":4178,"children":4180},{"code":4179},"\n## 结语：AI 是放大器，不是替代品\n\nAI 调试工具能够显著加速问题排查过程，但它不能替代你的思考。最有价值的能力组合是：\n\n- **你的领域知识** + **AI 的广博见识**\n- **你对项目的理解** + **AI 的分析能力**\n- **你的判断力** + **AI 的执行速度**\n\n调试的本质是假设-验证的循环。AI 帮你更快地生成假设、更高效地验证假设，但做出最终判断的还是你。\n\n学会与 AI 高效协作调试，不是依赖 AI 给你答案，而是让 AI 帮你更快地找到自己的答案。\n\n---\n\n## 参考资源\n\n- [Chrome DevTools 官方文档](https://developer.chrome.com/docs/devtools)\n- [Node.js 调试指南](https://nodejs.org/en/docs/guides/debugging-getting-started)\n- [React DevTools 使用指南](https://react.dev/learn/react-developer-tools)\n",[4181],{"type":26,"tag":309,"props":4182,"children":4183},{"__ignoreMap":7},[4184],{"type":31,"value":4179},{"title":7,"searchDepth":1430,"depth":1430,"links":4186},[4187,4188,4189,4194,4198,4203,4207,4211,4212,4213],{"id":3570,"depth":1433,"text":3573},{"id":3576,"depth":1433,"text":3579},{"id":3597,"depth":1433,"text":3600,"children":4190},[4191,4192,4193],{"id":3603,"depth":1430,"text":3606},{"id":3681,"depth":1430,"text":3684},{"id":3846,"depth":1430,"text":3849},{"id":3888,"depth":1433,"text":3891,"children":4195},[4196,4197],{"id":3894,"depth":1430,"text":3897},{"id":3914,"depth":1430,"text":3917},{"id":3934,"depth":1433,"text":3937,"children":4199},[4200,4201,4202],{"id":3940,"depth":1430,"text":3943},{"id":3955,"depth":1430,"text":3958},{"id":3970,"depth":1430,"text":3973},{"id":3987,"depth":1433,"text":3990,"children":4204},[4205,4206],{"id":3993,"depth":1430,"text":3996},{"id":4008,"depth":1430,"text":4011},{"id":4023,"depth":1433,"text":4026,"children":4208},[4209,4210],{"id":4029,"depth":1430,"text":4032},{"id":4043,"depth":1430,"text":4046},{"id":4077,"depth":1433,"text":4080},{"id":4122,"depth":1433,"text":4125},{"id":4150,"depth":1433,"text":4153},"content:topics:ai:ai-debugging-troubleshooting-guide.md","topics/ai/ai-debugging-troubleshooting-guide.md","topics/ai/ai-debugging-troubleshooting-guide",{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"topic":5,"author":11,"tags":4218,"image":17,"imageQuery":18,"pexelsPhotoId":19,"pexelsUrl":20,"featured":6,"readingTime":21,"body":4219,"_type":1447,"_id":1448,"_source":1449,"_file":1450,"_stem":1451,"_extension":1452},[13,14,15,16],{"type":23,"children":4220,"toc":5373},[4221,4225,4229,4253,4257,4321,4325,4329,4333,4418,4422,4426,4430,4434,4442,4446,4457,4467,4471,4475,4559,4563,4578,4582,4586,4605,4609,4613,4617,4625,4629,4637,4641,4649,4653,4657,4665,4669,4673,4677,4681,4689,4693,4708,4712,4716,4720,4724,4732,4742,4746,4750,4754,4896,4900,4904,4912,4916,4920,4924,4935,4939,4962,4966,4970,5056,5060,5064,5072,5076,5080,5096,5100,5104,5119,5123,5127,5146,5150,5154,5238,5242,5246,5330,5334,5338,5342],{"type":26,"tag":27,"props":4222,"children":4223},{},[4224],{"type":31,"value":32},{"type":26,"tag":27,"props":4226,"children":4227},{},[4228],{"type":31,"value":37},{"type":26,"tag":27,"props":4230,"children":4231},{},[4232,4233,4237,4238,4242,4243,4247,4248,4252],{"type":31,"value":42},{"type":26,"tag":44,"props":4234,"children":4235},{"href":46},[4236],{"type":31,"value":49},{"type":31,"value":51},{"type":26,"tag":44,"props":4239,"children":4240},{"href":54},[4241],{"type":31,"value":57},{"type":31,"value":51},{"type":26,"tag":44,"props":4244,"children":4245},{"href":61},[4246],{"type":31,"value":64},{"type":31,"value":66},{"type":26,"tag":44,"props":4249,"children":4250},{"href":69},[4251],{"type":31,"value":72},{"type":31,"value":74},{"type":26,"tag":76,"props":4254,"children":4255},{"id":78},[4256],{"type":31,"value":81},{"type":26,"tag":83,"props":4258,"children":4259},{},[4260,4274],{"type":26,"tag":87,"props":4261,"children":4262},{},[4263],{"type":26,"tag":91,"props":4264,"children":4265},{},[4266,4270],{"type":26,"tag":95,"props":4267,"children":4268},{},[4269],{"type":31,"value":99},{"type":26,"tag":95,"props":4271,"children":4272},{},[4273],{"type":31,"value":104},{"type":26,"tag":106,"props":4275,"children":4276},{},[4277,4288,4299,4310],{"type":26,"tag":91,"props":4278,"children":4279},{},[4280,4284],{"type":26,"tag":113,"props":4281,"children":4282},{},[4283],{"type":31,"value":117},{"type":26,"tag":113,"props":4285,"children":4286},{},[4287],{"type":31,"value":122},{"type":26,"tag":91,"props":4289,"children":4290},{},[4291,4295],{"type":26,"tag":113,"props":4292,"children":4293},{},[4294],{"type":31,"value":130},{"type":26,"tag":113,"props":4296,"children":4297},{},[4298],{"type":31,"value":135},{"type":26,"tag":91,"props":4300,"children":4301},{},[4302,4306],{"type":26,"tag":113,"props":4303,"children":4304},{},[4305],{"type":31,"value":143},{"type":26,"tag":113,"props":4307,"children":4308},{},[4309],{"type":31,"value":148},{"type":26,"tag":91,"props":4311,"children":4312},{},[4313,4317],{"type":26,"tag":113,"props":4314,"children":4315},{},[4316],{"type":31,"value":156},{"type":26,"tag":113,"props":4318,"children":4319},{},[4320],{"type":31,"value":161},{"type":26,"tag":27,"props":4322,"children":4323},{},[4324],{"type":31,"value":166},{"type":26,"tag":76,"props":4326,"children":4327},{"id":169},[4328],{"type":31,"value":172},{"type":26,"tag":27,"props":4330,"children":4331},{},[4332],{"type":31,"value":177},{"type":26,"tag":83,"props":4334,"children":4335},{},[4336,4358],{"type":26,"tag":87,"props":4337,"children":4338},{},[4339],{"type":26,"tag":91,"props":4340,"children":4341},{},[4342,4346,4350,4354],{"type":26,"tag":95,"props":4343,"children":4344},{},[4345],{"type":31,"value":191},{"type":26,"tag":95,"props":4347,"children":4348},{},[4349],{"type":31,"value":196},{"type":26,"tag":95,"props":4351,"children":4352},{},[4353],{"type":31,"value":201},{"type":26,"tag":95,"props":4355,"children":4356},{},[4357],{"type":31,"value":206},{"type":26,"tag":106,"props":4359,"children":4360},{},[4361,4380,4399],{"type":26,"tag":91,"props":4362,"children":4363},{},[4364,4368,4372,4376],{"type":26,"tag":113,"props":4365,"children":4366},{},[4367],{"type":31,"value":217},{"type":26,"tag":113,"props":4369,"children":4370},{},[4371],{"type":31,"value":222},{"type":26,"tag":113,"props":4373,"children":4374},{},[4375],{"type":31,"value":227},{"type":26,"tag":113,"props":4377,"children":4378},{},[4379],{"type":31,"value":232},{"type":26,"tag":91,"props":4381,"children":4382},{},[4383,4387,4391,4395],{"type":26,"tag":113,"props":4384,"children":4385},{},[4386],{"type":31,"value":240},{"type":26,"tag":113,"props":4388,"children":4389},{},[4390],{"type":31,"value":245},{"type":26,"tag":113,"props":4392,"children":4393},{},[4394],{"type":31,"value":250},{"type":26,"tag":113,"props":4396,"children":4397},{},[4398],{"type":31,"value":255},{"type":26,"tag":91,"props":4400,"children":4401},{},[4402,4406,4410,4414],{"type":26,"tag":113,"props":4403,"children":4404},{},[4405],{"type":31,"value":263},{"type":26,"tag":113,"props":4407,"children":4408},{},[4409],{"type":31,"value":268},{"type":26,"tag":113,"props":4411,"children":4412},{},[4413],{"type":31,"value":273},{"type":26,"tag":113,"props":4415,"children":4416},{},[4417],{"type":31,"value":278},{"type":26,"tag":27,"props":4419,"children":4420},{},[4421],{"type":31,"value":283},{"type":26,"tag":76,"props":4423,"children":4424},{"id":286},[4425],{"type":31,"value":289},{"type":26,"tag":27,"props":4427,"children":4428},{},[4429],{"type":31,"value":294},{"type":26,"tag":27,"props":4431,"children":4432},{},[4433],{"type":31,"value":299},{"type":26,"tag":301,"props":4435,"children":4437},{"className":4436,"code":305,"language":306,"meta":7},[304],[4438],{"type":26,"tag":309,"props":4439,"children":4440},{"__ignoreMap":7},[4441],{"type":31,"value":305},{"type":26,"tag":27,"props":4443,"children":4444},{},[4445],{"type":31,"value":317},{"type":26,"tag":319,"props":4447,"children":4448},{},[4449,4453],{"type":26,"tag":323,"props":4450,"children":4451},{},[4452],{"type":31,"value":327},{"type":26,"tag":323,"props":4454,"children":4455},{},[4456],{"type":31,"value":332},{"type":26,"tag":27,"props":4458,"children":4459},{},[4460,4461,4466],{"type":31,"value":337},{"type":26,"tag":309,"props":4462,"children":4464},{"className":4463},[],[4465],{"type":31,"value":343},{"type":31,"value":345},{"type":26,"tag":76,"props":4468,"children":4469},{"id":348},[4470],{"type":31,"value":351},{"type":26,"tag":27,"props":4472,"children":4473},{},[4474],{"type":31,"value":356},{"type":26,"tag":83,"props":4476,"children":4477},{},[4478,4496],{"type":26,"tag":87,"props":4479,"children":4480},{},[4481],{"type":26,"tag":91,"props":4482,"children":4483},{},[4484,4488,4492],{"type":26,"tag":95,"props":4485,"children":4486},{},[4487],{"type":31,"value":370},{"type":26,"tag":95,"props":4489,"children":4490},{},[4491],{"type":31,"value":375},{"type":26,"tag":95,"props":4493,"children":4494},{},[4495],{"type":31,"value":380},{"type":26,"tag":106,"props":4497,"children":4498},{},[4499,4514,4529,4544],{"type":26,"tag":91,"props":4500,"children":4501},{},[4502,4506,4510],{"type":26,"tag":113,"props":4503,"children":4504},{},[4505],{"type":31,"value":391},{"type":26,"tag":113,"props":4507,"children":4508},{},[4509],{"type":31,"value":396},{"type":26,"tag":113,"props":4511,"children":4512},{},[4513],{"type":31,"value":396},{"type":26,"tag":91,"props":4515,"children":4516},{},[4517,4521,4525],{"type":26,"tag":113,"props":4518,"children":4519},{},[4520],{"type":31,"value":408},{"type":26,"tag":113,"props":4522,"children":4523},{},[4524],{"type":31,"value":413},{"type":26,"tag":113,"props":4526,"children":4527},{},[4528],{"type":31,"value":413},{"type":26,"tag":91,"props":4530,"children":4531},{},[4532,4536,4540],{"type":26,"tag":113,"props":4533,"children":4534},{},[4535],{"type":31,"value":425},{"type":26,"tag":113,"props":4537,"children":4538},{},[4539],{"type":31,"value":413},{"type":26,"tag":113,"props":4541,"children":4542},{},[4543],{"type":31,"value":434},{"type":26,"tag":91,"props":4545,"children":4546},{},[4547,4551,4555],{"type":26,"tag":113,"props":4548,"children":4549},{},[4550],{"type":31,"value":442},{"type":26,"tag":113,"props":4552,"children":4553},{},[4554],{"type":31,"value":434},{"type":26,"tag":113,"props":4556,"children":4557},{},[4558],{"type":31,"value":434},{"type":26,"tag":27,"props":4560,"children":4561},{},[4562],{"type":31,"value":455},{"type":26,"tag":319,"props":4564,"children":4565},{},[4566,4570,4574],{"type":26,"tag":323,"props":4567,"children":4568},{},[4569],{"type":31,"value":463},{"type":26,"tag":323,"props":4571,"children":4572},{},[4573],{"type":31,"value":468},{"type":26,"tag":323,"props":4575,"children":4576},{},[4577],{"type":31,"value":473},{"type":26,"tag":27,"props":4579,"children":4580},{},[4581],{"type":31,"value":478},{"type":26,"tag":27,"props":4583,"children":4584},{},[4585],{"type":31,"value":483},{"type":26,"tag":319,"props":4587,"children":4588},{},[4589,4593,4597,4601],{"type":26,"tag":323,"props":4590,"children":4591},{},[4592],{"type":31,"value":491},{"type":26,"tag":323,"props":4594,"children":4595},{},[4596],{"type":31,"value":496},{"type":26,"tag":323,"props":4598,"children":4599},{},[4600],{"type":31,"value":501},{"type":26,"tag":323,"props":4602,"children":4603},{},[4604],{"type":31,"value":506},{"type":26,"tag":27,"props":4606,"children":4607},{},[4608],{"type":31,"value":511},{"type":26,"tag":76,"props":4610,"children":4611},{"id":514},[4612],{"type":31,"value":517},{"type":26,"tag":27,"props":4614,"children":4615},{},[4616],{"type":31,"value":522},{"type":26,"tag":301,"props":4618,"children":4620},{"className":4619,"code":526,"language":306,"meta":7},[304],[4621],{"type":26,"tag":309,"props":4622,"children":4623},{"__ignoreMap":7},[4624],{"type":31,"value":526},{"type":26,"tag":27,"props":4626,"children":4627},{},[4628],{"type":31,"value":536},{"type":26,"tag":301,"props":4630,"children":4632},{"className":4631,"code":540,"language":306,"meta":7},[304],[4633],{"type":26,"tag":309,"props":4634,"children":4635},{"__ignoreMap":7},[4636],{"type":31,"value":540},{"type":26,"tag":27,"props":4638,"children":4639},{},[4640],{"type":31,"value":550},{"type":26,"tag":301,"props":4642,"children":4644},{"className":4643,"code":555,"language":556,"meta":7},[554],[4645],{"type":26,"tag":309,"props":4646,"children":4647},{"__ignoreMap":7},[4648],{"type":31,"value":555},{"type":26,"tag":27,"props":4650,"children":4651},{},[4652],{"type":31,"value":566},{"type":26,"tag":27,"props":4654,"children":4655},{},[4656],{"type":31,"value":571},{"type":26,"tag":301,"props":4658,"children":4660},{"className":4659,"code":575,"language":556,"meta":7},[554],[4661],{"type":26,"tag":309,"props":4662,"children":4663},{"__ignoreMap":7},[4664],{"type":31,"value":575},{"type":26,"tag":27,"props":4666,"children":4667},{},[4668],{"type":31,"value":585},{"type":26,"tag":76,"props":4670,"children":4671},{"id":588},[4672],{"type":31,"value":591},{"type":26,"tag":27,"props":4674,"children":4675},{},[4676],{"type":31,"value":596},{"type":26,"tag":27,"props":4678,"children":4679},{},[4680],{"type":31,"value":601},{"type":26,"tag":301,"props":4682,"children":4684},{"className":4683,"code":605,"language":306,"meta":7},[304],[4685],{"type":26,"tag":309,"props":4686,"children":4687},{"__ignoreMap":7},[4688],{"type":31,"value":605},{"type":26,"tag":27,"props":4690,"children":4691},{},[4692],{"type":31,"value":615},{"type":26,"tag":319,"props":4694,"children":4695},{},[4696,4700,4704],{"type":26,"tag":323,"props":4697,"children":4698},{},[4699],{"type":31,"value":623},{"type":26,"tag":323,"props":4701,"children":4702},{},[4703],{"type":31,"value":628},{"type":26,"tag":323,"props":4705,"children":4706},{},[4707],{"type":31,"value":633},{"type":26,"tag":27,"props":4709,"children":4710},{},[4711],{"type":31,"value":638},{"type":26,"tag":76,"props":4713,"children":4714},{"id":641},[4715],{"type":31,"value":644},{"type":26,"tag":27,"props":4717,"children":4718},{},[4719],{"type":31,"value":649},{"type":26,"tag":27,"props":4721,"children":4722},{},[4723],{"type":31,"value":654},{"type":26,"tag":301,"props":4725,"children":4727},{"className":4726,"code":658,"language":306,"meta":7},[304],[4728],{"type":26,"tag":309,"props":4729,"children":4730},{"__ignoreMap":7},[4731],{"type":31,"value":658},{"type":26,"tag":27,"props":4733,"children":4734},{},[4735,4736,4741],{"type":31,"value":668},{"type":26,"tag":309,"props":4737,"children":4739},{"className":4738},[],[4740],{"type":31,"value":674},{"type":31,"value":676},{"type":26,"tag":76,"props":4743,"children":4744},{"id":679},[4745],{"type":31,"value":682},{"type":26,"tag":27,"props":4747,"children":4748},{},[4749],{"type":31,"value":687},{"type":26,"tag":27,"props":4751,"children":4752},{},[4753],{"type":31,"value":692},{"type":26,"tag":83,"props":4755,"children":4756},{},[4757,4779],{"type":26,"tag":87,"props":4758,"children":4759},{},[4760],{"type":26,"tag":91,"props":4761,"children":4762},{},[4763,4767,4771,4775],{"type":26,"tag":95,"props":4764,"children":4765},{},[4766],{"type":31,"value":706},{"type":26,"tag":95,"props":4768,"children":4769},{},[4770],{"type":31,"value":711},{"type":26,"tag":95,"props":4772,"children":4773},{},[4774],{"type":31,"value":716},{"type":26,"tag":95,"props":4776,"children":4777},{},[4778],{"type":31,"value":721},{"type":26,"tag":106,"props":4780,"children":4781},{},[4782,4801,4820,4839,4858,4877],{"type":26,"tag":91,"props":4783,"children":4784},{},[4785,4789,4793,4797],{"type":26,"tag":113,"props":4786,"children":4787},{},[4788],{"type":31,"value":396},{"type":26,"tag":113,"props":4790,"children":4791},{},[4792],{"type":31,"value":736},{"type":26,"tag":113,"props":4794,"children":4795},{},[4796],{"type":31,"value":741},{"type":26,"tag":113,"props":4798,"children":4799},{},[4800],{"type":31,"value":746},{"type":26,"tag":91,"props":4802,"children":4803},{},[4804,4808,4812,4816],{"type":26,"tag":113,"props":4805,"children":4806},{},[4807],{"type":31,"value":396},{"type":26,"tag":113,"props":4809,"children":4810},{},[4811],{"type":31,"value":758},{"type":26,"tag":113,"props":4813,"children":4814},{},[4815],{"type":31,"value":763},{"type":26,"tag":113,"props":4817,"children":4818},{},[4819],{"type":31,"value":768},{"type":26,"tag":91,"props":4821,"children":4822},{},[4823,4827,4831,4835],{"type":26,"tag":113,"props":4824,"children":4825},{},[4826],{"type":31,"value":434},{"type":26,"tag":113,"props":4828,"children":4829},{},[4830],{"type":31,"value":736},{"type":26,"tag":113,"props":4832,"children":4833},{},[4834],{"type":31,"value":784},{"type":26,"tag":113,"props":4836,"children":4837},{},[4838],{"type":31,"value":789},{"type":26,"tag":91,"props":4840,"children":4841},{},[4842,4846,4850,4854],{"type":26,"tag":113,"props":4843,"children":4844},{},[4845],{"type":31,"value":434},{"type":26,"tag":113,"props":4847,"children":4848},{},[4849],{"type":31,"value":801},{"type":26,"tag":113,"props":4851,"children":4852},{},[4853],{"type":31,"value":806},{"type":26,"tag":113,"props":4855,"children":4856},{},[4857],{"type":31,"value":746},{"type":26,"tag":91,"props":4859,"children":4860},{},[4861,4865,4869,4873],{"type":26,"tag":113,"props":4862,"children":4863},{},[4864],{"type":31,"value":818},{"type":26,"tag":113,"props":4866,"children":4867},{},[4868],{"type":31,"value":823},{"type":26,"tag":113,"props":4870,"children":4871},{},[4872],{"type":31,"value":828},{"type":26,"tag":113,"props":4874,"children":4875},{},[4876],{"type":31,"value":833},{"type":26,"tag":91,"props":4878,"children":4879},{},[4880,4884,4888,4892],{"type":26,"tag":113,"props":4881,"children":4882},{},[4883],{"type":31,"value":841},{"type":26,"tag":113,"props":4885,"children":4886},{},[4887],{"type":31,"value":846},{"type":26,"tag":113,"props":4889,"children":4890},{},[4891],{"type":31,"value":851},{"type":26,"tag":113,"props":4893,"children":4894},{},[4895],{"type":31,"value":856},{"type":26,"tag":27,"props":4897,"children":4898},{},[4899],{"type":31,"value":861},{"type":26,"tag":27,"props":4901,"children":4902},{},[4903],{"type":31,"value":866},{"type":26,"tag":301,"props":4905,"children":4907},{"className":4906,"code":870,"language":556,"meta":7},[554],[4908],{"type":26,"tag":309,"props":4909,"children":4910},{"__ignoreMap":7},[4911],{"type":31,"value":870},{"type":26,"tag":27,"props":4913,"children":4914},{},[4915],{"type":31,"value":880},{"type":26,"tag":76,"props":4917,"children":4918},{"id":883},[4919],{"type":31,"value":886},{"type":26,"tag":27,"props":4921,"children":4922},{},[4923],{"type":31,"value":891},{"type":26,"tag":319,"props":4925,"children":4926},{},[4927,4931],{"type":26,"tag":323,"props":4928,"children":4929},{},[4930],{"type":31,"value":899},{"type":26,"tag":323,"props":4932,"children":4933},{},[4934],{"type":31,"value":904},{"type":26,"tag":27,"props":4936,"children":4937},{},[4938],{"type":31,"value":909},{"type":26,"tag":911,"props":4940,"children":4941},{},[4942,4946,4950,4954,4958],{"type":26,"tag":323,"props":4943,"children":4944},{},[4945],{"type":31,"value":918},{"type":26,"tag":323,"props":4947,"children":4948},{},[4949],{"type":31,"value":923},{"type":26,"tag":323,"props":4951,"children":4952},{},[4953],{"type":31,"value":928},{"type":26,"tag":323,"props":4955,"children":4956},{},[4957],{"type":31,"value":933},{"type":26,"tag":323,"props":4959,"children":4960},{},[4961],{"type":31,"value":938},{"type":26,"tag":76,"props":4963,"children":4964},{"id":941},[4965],{"type":31,"value":944},{"type":26,"tag":27,"props":4967,"children":4968},{},[4969],{"type":31,"value":949},{"type":26,"tag":83,"props":4971,"children":4972},{},[4973,4987],{"type":26,"tag":87,"props":4974,"children":4975},{},[4976],{"type":26,"tag":91,"props":4977,"children":4978},{},[4979,4983],{"type":26,"tag":95,"props":4980,"children":4981},{},[4982],{"type":31,"value":963},{"type":26,"tag":95,"props":4984,"children":4985},{},[4986],{"type":31,"value":968},{"type":26,"tag":106,"props":4988,"children":4989},{},[4990,5001,5012,5023,5034,5045],{"type":26,"tag":91,"props":4991,"children":4992},{},[4993,4997],{"type":26,"tag":113,"props":4994,"children":4995},{},[4996],{"type":31,"value":979},{"type":26,"tag":113,"props":4998,"children":4999},{},[5000],{"type":31,"value":984},{"type":26,"tag":91,"props":5002,"children":5003},{},[5004,5008],{"type":26,"tag":113,"props":5005,"children":5006},{},[5007],{"type":31,"value":992},{"type":26,"tag":113,"props":5009,"children":5010},{},[5011],{"type":31,"value":997},{"type":26,"tag":91,"props":5013,"children":5014},{},[5015,5019],{"type":26,"tag":113,"props":5016,"children":5017},{},[5018],{"type":31,"value":1005},{"type":26,"tag":113,"props":5020,"children":5021},{},[5022],{"type":31,"value":1010},{"type":26,"tag":91,"props":5024,"children":5025},{},[5026,5030],{"type":26,"tag":113,"props":5027,"children":5028},{},[5029],{"type":31,"value":1018},{"type":26,"tag":113,"props":5031,"children":5032},{},[5033],{"type":31,"value":1023},{"type":26,"tag":91,"props":5035,"children":5036},{},[5037,5041],{"type":26,"tag":113,"props":5038,"children":5039},{},[5040],{"type":31,"value":1031},{"type":26,"tag":113,"props":5042,"children":5043},{},[5044],{"type":31,"value":1036},{"type":26,"tag":91,"props":5046,"children":5047},{},[5048,5052],{"type":26,"tag":113,"props":5049,"children":5050},{},[5051],{"type":31,"value":1044},{"type":26,"tag":113,"props":5053,"children":5054},{},[5055],{"type":31,"value":1049},{"type":26,"tag":27,"props":5057,"children":5058},{},[5059],{"type":31,"value":1054},{"type":26,"tag":27,"props":5061,"children":5062},{},[5063],{"type":31,"value":1059},{"type":26,"tag":301,"props":5065,"children":5067},{"className":5066,"code":1063,"language":306,"meta":7},[304],[5068],{"type":26,"tag":309,"props":5069,"children":5070},{"__ignoreMap":7},[5071],{"type":31,"value":1063},{"type":26,"tag":27,"props":5073,"children":5074},{},[5075],{"type":31,"value":1073},{"type":26,"tag":76,"props":5077,"children":5078},{"id":1076},[5079],{"type":31,"value":1079},{"type":26,"tag":27,"props":5081,"children":5082},{},[5083,5084,5089,5090,5095],{"type":31,"value":1084},{"type":26,"tag":309,"props":5085,"children":5087},{"className":5086},[],[5088],{"type":31,"value":1090},{"type":31,"value":1092},{"type":26,"tag":309,"props":5091,"children":5093},{"className":5092},[],[5094],{"type":31,"value":1098},{"type":31,"value":1100},{"type":26,"tag":27,"props":5097,"children":5098},{},[5099],{"type":31,"value":1105},{"type":26,"tag":27,"props":5101,"children":5102},{},[5103],{"type":31,"value":1110},{"type":26,"tag":319,"props":5105,"children":5106},{},[5107,5111,5115],{"type":26,"tag":323,"props":5108,"children":5109},{},[5110],{"type":31,"value":1118},{"type":26,"tag":323,"props":5112,"children":5113},{},[5114],{"type":31,"value":1123},{"type":26,"tag":323,"props":5116,"children":5117},{},[5118],{"type":31,"value":1128},{"type":26,"tag":76,"props":5120,"children":5121},{"id":1131},[5122],{"type":31,"value":1134},{"type":26,"tag":27,"props":5124,"children":5125},{},[5126],{"type":31,"value":1139},{"type":26,"tag":911,"props":5128,"children":5129},{},[5130,5134,5138,5142],{"type":26,"tag":323,"props":5131,"children":5132},{},[5133],{"type":31,"value":1147},{"type":26,"tag":323,"props":5135,"children":5136},{},[5137],{"type":31,"value":1152},{"type":26,"tag":323,"props":5139,"children":5140},{},[5141],{"type":31,"value":1157},{"type":26,"tag":323,"props":5143,"children":5144},{},[5145],{"type":31,"value":1162},{"type":26,"tag":27,"props":5147,"children":5148},{},[5149],{"type":31,"value":1167},{"type":26,"tag":27,"props":5151,"children":5152},{},[5153],{"type":31,"value":1172},{"type":26,"tag":83,"props":5155,"children":5156},{},[5157,5175],{"type":26,"tag":87,"props":5158,"children":5159},{},[5160],{"type":26,"tag":91,"props":5161,"children":5162},{},[5163,5167,5171],{"type":26,"tag":95,"props":5164,"children":5165},{},[5166],{"type":31,"value":1186},{"type":26,"tag":95,"props":5168,"children":5169},{},[5170],{"type":31,"value":1191},{"type":26,"tag":95,"props":5172,"children":5173},{},[5174],{"type":31,"value":1196},{"type":26,"tag":106,"props":5176,"children":5177},{},[5178,5193,5208,5223],{"type":26,"tag":91,"props":5179,"children":5180},{},[5181,5185,5189],{"type":26,"tag":113,"props":5182,"children":5183},{},[5184],{"type":31,"value":1207},{"type":26,"tag":113,"props":5186,"children":5187},{},[5188],{"type":31,"value":1212},{"type":26,"tag":113,"props":5190,"children":5191},{},[5192],{"type":31,"value":1217},{"type":26,"tag":91,"props":5194,"children":5195},{},[5196,5200,5204],{"type":26,"tag":113,"props":5197,"children":5198},{},[5199],{"type":31,"value":1225},{"type":26,"tag":113,"props":5201,"children":5202},{},[5203],{"type":31,"value":1230},{"type":26,"tag":113,"props":5205,"children":5206},{},[5207],{"type":31,"value":1235},{"type":26,"tag":91,"props":5209,"children":5210},{},[5211,5215,5219],{"type":26,"tag":113,"props":5212,"children":5213},{},[5214],{"type":31,"value":1243},{"type":26,"tag":113,"props":5216,"children":5217},{},[5218],{"type":31,"value":1248},{"type":26,"tag":113,"props":5220,"children":5221},{},[5222],{"type":31,"value":1253},{"type":26,"tag":91,"props":5224,"children":5225},{},[5226,5230,5234],{"type":26,"tag":113,"props":5227,"children":5228},{},[5229],{"type":31,"value":1261},{"type":26,"tag":113,"props":5231,"children":5232},{},[5233],{"type":31,"value":1212},{"type":26,"tag":113,"props":5235,"children":5236},{},[5237],{"type":31,"value":1270},{"type":26,"tag":27,"props":5239,"children":5240},{},[5241],{"type":31,"value":1275},{"type":26,"tag":76,"props":5243,"children":5244},{"id":1278},[5245],{"type":31,"value":1281},{"type":26,"tag":319,"props":5247,"children":5249},{"className":5248},[1285],[5250,5258,5266,5274,5282,5290,5298,5306,5314,5322],{"type":26,"tag":323,"props":5251,"children":5253},{"className":5252},[1290],[5254,5257],{"type":26,"tag":1293,"props":5255,"children":5256},{"disabled":1295,"type":1296},[],{"type":31,"value":1299},{"type":26,"tag":323,"props":5259,"children":5261},{"className":5260},[1290],[5262,5265],{"type":26,"tag":1293,"props":5263,"children":5264},{"disabled":1295,"type":1296},[],{"type":31,"value":1308},{"type":26,"tag":323,"props":5267,"children":5269},{"className":5268},[1290],[5270,5273],{"type":26,"tag":1293,"props":5271,"children":5272},{"disabled":1295,"type":1296},[],{"type":31,"value":1317},{"type":26,"tag":323,"props":5275,"children":5277},{"className":5276},[1290],[5278,5281],{"type":26,"tag":1293,"props":5279,"children":5280},{"disabled":1295,"type":1296},[],{"type":31,"value":1326},{"type":26,"tag":323,"props":5283,"children":5285},{"className":5284},[1290],[5286,5289],{"type":26,"tag":1293,"props":5287,"children":5288},{"disabled":1295,"type":1296},[],{"type":31,"value":1335},{"type":26,"tag":323,"props":5291,"children":5293},{"className":5292},[1290],[5294,5297],{"type":26,"tag":1293,"props":5295,"children":5296},{"disabled":1295,"type":1296},[],{"type":31,"value":1344},{"type":26,"tag":323,"props":5299,"children":5301},{"className":5300},[1290],[5302,5305],{"type":26,"tag":1293,"props":5303,"children":5304},{"disabled":1295,"type":1296},[],{"type":31,"value":1353},{"type":26,"tag":323,"props":5307,"children":5309},{"className":5308},[1290],[5310,5313],{"type":26,"tag":1293,"props":5311,"children":5312},{"disabled":1295,"type":1296},[],{"type":31,"value":1362},{"type":26,"tag":323,"props":5315,"children":5317},{"className":5316},[1290],[5318,5321],{"type":26,"tag":1293,"props":5319,"children":5320},{"disabled":1295,"type":1296},[],{"type":31,"value":1371},{"type":26,"tag":323,"props":5323,"children":5325},{"className":5324},[1290],[5326,5329],{"type":26,"tag":1293,"props":5327,"children":5328},{"disabled":1295,"type":1296},[],{"type":31,"value":1380},{"type":26,"tag":76,"props":5331,"children":5332},{"id":1383},[5333],{"type":31,"value":1383},{"type":26,"tag":27,"props":5335,"children":5336},{},[5337],{"type":31,"value":1390},{"type":26,"tag":27,"props":5339,"children":5340},{},[5341],{"type":31,"value":1395},{"type":26,"tag":319,"props":5343,"children":5344},{},[5345,5352,5359,5366],{"type":26,"tag":323,"props":5346,"children":5347},{},[5348],{"type":26,"tag":44,"props":5349,"children":5350},{"href":46},[5351],{"type":31,"value":49},{"type":26,"tag":323,"props":5353,"children":5354},{},[5355],{"type":26,"tag":44,"props":5356,"children":5357},{"href":54},[5358],{"type":31,"value":57},{"type":26,"tag":323,"props":5360,"children":5361},{},[5362],{"type":26,"tag":44,"props":5363,"children":5364},{"href":1418},[5365],{"type":31,"value":1421},{"type":26,"tag":323,"props":5367,"children":5368},{},[5369],{"type":26,"tag":44,"props":5370,"children":5371},{"href":61},[5372],{"type":31,"value":64},{"title":7,"searchDepth":1430,"depth":1430,"links":5374},[5375,5376,5377,5378,5379,5380,5381,5382,5383,5384,5385,5386,5387,5388],{"id":78,"depth":1433,"text":81},{"id":169,"depth":1433,"text":172},{"id":286,"depth":1433,"text":289},{"id":348,"depth":1433,"text":351},{"id":514,"depth":1433,"text":517},{"id":588,"depth":1433,"text":591},{"id":641,"depth":1433,"text":644},{"id":679,"depth":1433,"text":682},{"id":883,"depth":1433,"text":886},{"id":941,"depth":1433,"text":944},{"id":1076,"depth":1433,"text":1079},{"id":1131,"depth":1433,"text":1134},{"id":1278,"depth":1433,"text":1281},{"id":1383,"depth":1433,"text":1383},1778331340943]