[{"data":1,"prerenderedAt":3548},["ShallowReactive",2],{"article-/topics/ai/ai-agent-scheduled-runs-recurring-automation-design":3,"related-ai":449,"content-query-jth4Kvuguk":3218},{"_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":443,"_id":444,"_source":445,"_file":446,"_stem":447,"_extension":448},"/topics/ai/ai-agent-scheduled-runs-recurring-automation-design","ai",false,"","AI agent Scheduled Run 与 Recurring Automation：定时任务、时间窗口和幂等保护怎么做，避免自动化天天出事","AI agent 一旦进入日报、巡检、同步和批处理场景，问题就不再是能不能自动跑，而是能不能稳定地重复跑。本文讲清 scheduled run、time window、catch-up 与幂等边界。","2026-05-13","HTMLPAGE 团队",[13,14,15,16],"AI agent","Scheduled Run","Automation Design","工程实践","/images/articles/ai-agent-scheduled-runs-recurring-automation-design-featured.jpg","calendar planning laptop office",9052851,"https://www.pexels.com/photo/man-working-on-laptop-among-documents-9052851/",16,{"type":23,"children":24,"toc":433},"root",[25,33,38,43,80,87,192,197,203,208,228,233,246,251,257,262,267,280,285,291,296,319,324,330,335,353,358,363,369,374,392,397,402],{"type":26,"tag":27,"props":28,"children":29},"element","p",{},[30],{"type":31,"value":32},"text","很多 AI agent 团队都会在某个阶段被一句话推动去做自动化：既然这件事每天都要做，为什么不让 agent 定时跑？这句话听起来非常合理，所以日报汇总、客户数据同步、内容巡检、工单分流、报表生成，很快都会被塞进 cron 或任务队列里。第一周看起来常常也还不错，任务自动开始、自动完成、自动发消息，效率提升很直观。",{"type":26,"tag":27,"props":34,"children":35},{},[36],{"type":31,"value":37},"问题是，scheduled run 真正难的地方从来不是“按时触发”，而是“重复运行时怎么保持边界稳定”。一旦你把 AI agent 放进 recurring automation，你就会同时碰到这些现实问题：输入数据每天都在变、外部系统会晚到、时区和节假日会错位、前一天失败的任务到底要不要补跑、补跑时会不会把已经发出的副作用再发一次。",{"type":26,"tag":27,"props":39,"children":40},{},[41],{"type":31,"value":42},"所以 recurring automation 不是给现有 run 外面套一个 cron，而是重新定义 run identity、时间窗口、可补偿范围和人工接力规则。没有这层设计，所谓“自动化”很快会从省人力变成天天早上第一件事就是查异常。",{"type":26,"tag":27,"props":44,"children":45},{},[46,48,55,57,63,64,70,72,78],{"type":31,"value":47},"建议结合 ",{"type":26,"tag":49,"props":50,"children":52},"a",{"href":51},"/topics/ai/ai-agent-deadline-timeout-budget-design",[53],{"type":31,"value":54},"AI agent Deadline 与超时预算",{"type":31,"value":56},"、",{"type":26,"tag":49,"props":58,"children":60},{"href":59},"/topics/ai/ai-agent-idempotency-deduplication-practice",[61],{"type":31,"value":62},"AI agent 幂等与去重实践",{"type":31,"value":56},{"type":26,"tag":49,"props":65,"children":67},{"href":66},"/topics/ai/ai-agent-admission-control-quota-gating",[68],{"type":31,"value":69},"AI agent 准入控制与配额闸门",{"type":31,"value":71}," 和 ",{"type":26,"tag":49,"props":73,"children":75},{"href":74},"/topics/ai/ai-agent-harness-crash-recovery-wake-flow",[76],{"type":31,"value":77},"AI agent Harness 崩溃恢复与 Wake 流程",{"type":31,"value":79}," 一起看。",{"type":26,"tag":81,"props":82,"children":84},"h2",{"id":83},"先分清你在做哪类定时",[85],{"type":31,"value":86},"先分清你在做哪类“定时”",{"type":26,"tag":88,"props":89,"children":90},"table",{},[91,115],{"type":26,"tag":92,"props":93,"children":94},"thead",{},[95],{"type":26,"tag":96,"props":97,"children":98},"tr",{},[99,105,110],{"type":26,"tag":100,"props":101,"children":102},"th",{},[103],{"type":31,"value":104},"自动化类型",{"type":26,"tag":100,"props":106,"children":107},{},[108],{"type":31,"value":109},"典型例子",{"type":26,"tag":100,"props":111,"children":112},{},[113],{"type":31,"value":114},"真正要管的变量",{"type":26,"tag":116,"props":117,"children":118},"tbody",{},[119,138,156,174],{"type":26,"tag":96,"props":120,"children":121},{},[122,128,133],{"type":26,"tag":123,"props":124,"children":125},"td",{},[126],{"type":31,"value":127},"固定时点执行",{"type":26,"tag":123,"props":129,"children":130},{},[131],{"type":31,"value":132},"每天 08:00 生成日报",{"type":26,"tag":123,"props":134,"children":135},{},[136],{"type":31,"value":137},"时区、节假日、迟到数据",{"type":26,"tag":96,"props":139,"children":140},{},[141,146,151],{"type":26,"tag":123,"props":142,"children":143},{},[144],{"type":31,"value":145},"时间窗口执行",{"type":26,"tag":123,"props":147,"children":148},{},[149],{"type":31,"value":150},"每小时巡检一次异常站点",{"type":26,"tag":123,"props":152,"children":153},{},[154],{"type":31,"value":155},"窗口重叠、补跑范围、失败回补",{"type":26,"tag":96,"props":157,"children":158},{},[159,164,169],{"type":26,"tag":123,"props":160,"children":161},{},[162],{"type":31,"value":163},"业务截止前执行",{"type":26,"tag":123,"props":165,"children":166},{},[167],{"type":31,"value":168},"每周一 09:00 前给销售准备线索",{"type":26,"tag":123,"props":170,"children":171},{},[172],{"type":31,"value":173},"deadline、优先级和人工接管",{"type":26,"tag":96,"props":175,"children":176},{},[177,182,187],{"type":26,"tag":123,"props":178,"children":179},{},[180],{"type":31,"value":181},"事件堆积后的批处理",{"type":26,"tag":123,"props":183,"children":184},{},[185],{"type":31,"value":186},"夜间统一处理白天积压任务",{"type":26,"tag":123,"props":188,"children":189},{},[190],{"type":31,"value":191},"catch-up、吞吐、幂等和速率限制",{"type":26,"tag":27,"props":193,"children":194},{},[195],{"type":31,"value":196},"如果系统把这些场景都统称为“cron job”，后面几乎一定会在补跑语义上混乱。因为同样是“昨天没跑成”，日报和巡检的补跑价值并不一样。",{"type":26,"tag":81,"props":198,"children":200},{"id":199},"scheduled-run-的-identity-应该包含窗口不该只有时间戳",[201],{"type":31,"value":202},"Scheduled run 的 identity 应该包含窗口，不该只有时间戳",{"type":26,"tag":27,"props":204,"children":205},{},[206],{"type":31,"value":207},"最常见的设计错误，是把 recurring automation 的 runId 建成“某时刻触发了一次任务”。这样看起来简单，但一旦补跑和重试混进来，系统就会分不清：",{"type":26,"tag":209,"props":210,"children":211},"ul",{},[212,218,223],{"type":26,"tag":213,"props":214,"children":215},"li",{},[216],{"type":31,"value":217},"这是 2026-05-13 08:00 的正式日报",{"type":26,"tag":213,"props":219,"children":220},{},[221],{"type":31,"value":222},"还是那次日报的补跑",{"type":26,"tag":213,"props":224,"children":225},{},[226],{"type":31,"value":227},"还是那次补跑里的某个 step 重试",{"type":26,"tag":27,"props":229,"children":230},{},[231],{"type":31,"value":232},"更稳的做法，是让 run identity 显式包含业务窗口。例如：",{"type":26,"tag":234,"props":235,"children":240},"pre",{"className":236,"code":238,"language":239,"meta":7},[237],"language-json","{\n  \"jobKey\": \"daily_sales_brief\",\n  \"window\": \"2026-05-13@Asia/Shanghai\",\n  \"executionType\": \"primary | catchup | retry\",\n  \"idempotencyKey\": \"daily_sales_brief:2026-05-13\"\n}\n","json",[241],{"type":26,"tag":242,"props":243,"children":244},"code",{"__ignoreMap":7},[245],{"type":31,"value":238},{"type":26,"tag":27,"props":247,"children":248},{},[249],{"type":31,"value":250},"一旦窗口被建进 identity，系统才能判断“今天这份日报到底已经有没有成功产出过”，而不是被时间戳和重试次数绕晕。",{"type":26,"tag":81,"props":252,"children":254},{"id":253},"真正麻烦的不是错过触发而是输入在窗口结束后还会变",[255],{"type":31,"value":256},"真正麻烦的不是错过触发，而是输入在窗口结束后还会变",{"type":26,"tag":27,"props":258,"children":259},{},[260],{"type":31,"value":261},"很多 recurring automation 会天然面对迟到数据。比如凌晨 1 点跑跨境订单汇总，可某些支付回执 1 点 20 才到；8 点生成日报，但部分 CRM 字段 8 点 10 才同步完。于是系统必须回答一个现实问题：你要冻结输入，还是接受迟到后补？",{"type":26,"tag":27,"props":263,"children":264},{},[265],{"type":31,"value":266},"这件事没有统一答案，但必须提前定规则：",{"type":26,"tag":209,"props":268,"children":269},{},[270,275],{"type":26,"tag":213,"props":271,"children":272},{},[273],{"type":31,"value":274},"如果目标是高一致性报表，就应该冻结窗口，并把迟到数据归到下一次或补报流程",{"type":26,"tag":213,"props":276,"children":277},{},[278],{"type":31,"value":279},"如果目标是尽快给业务一个近似结果，可以允许 late update，但必须标记“这是修订版”",{"type":26,"tag":27,"props":281,"children":282},{},[283],{"type":31,"value":284},"最糟糕的情况是系统什么都没定义，只是一边默认按点触发，一边又允许无标记补写。最后用户手上看到的每一份“自动生成结果”都不确定是不是最终版本。",{"type":26,"tag":81,"props":286,"children":288},{"id":287},"自动化的稳定不靠永不失败靠-catch-up-边界清楚",[289],{"type":31,"value":290},"自动化的稳定不靠“永不失败”，靠 catch-up 边界清楚",{"type":26,"tag":27,"props":292,"children":293},{},[294],{"type":31,"value":295},"每个 recurring job 都应该回答：",{"type":26,"tag":209,"props":297,"children":298},{},[299,304,309,314],{"type":26,"tag":213,"props":300,"children":301},{},[302],{"type":31,"value":303},"错过一轮后要不要补跑",{"type":26,"tag":213,"props":305,"children":306},{},[307],{"type":31,"value":308},"可以补多少轮",{"type":26,"tag":213,"props":310,"children":311},{},[312],{"type":31,"value":313},"补跑时是否降级，例如只生成内部结果，不自动外发",{"type":26,"tag":213,"props":315,"children":316},{},[317],{"type":31,"value":318},"如果 backlog 已堆积，是否应该先限流而不是全部追上",{"type":26,"tag":27,"props":320,"children":321},{},[322],{"type":31,"value":323},"这些规则如果没有，任务队列很容易在一次外部系统抖动后集体补跑，把模型额度、第三方 API 配额和人工审核队列一起打爆。很多团队把这叫“恢复”，其实是把昨天的故障变成今天的更大故障。",{"type":26,"tag":81,"props":325,"children":327},{"id":326},"一个经常被忽视的事故夏令时和节假日比模型还容易把自动化搞坏",[328],{"type":31,"value":329},"一个经常被忽视的事故：夏令时和节假日比模型还容易把自动化搞坏",{"type":26,"tag":27,"props":331,"children":332},{},[333],{"type":31,"value":334},"某团队给全球销售团队做每周线索摘要，默认每周一早上 8 点发送。功能本身没问题，直到一轮夏令时切换后，欧洲区的摘要在本地时间 9 点才发出，而亚洲区恰好遇到当地法定假期，自动外发的摘要没人处理。更麻烦的是：",{"type":26,"tag":209,"props":336,"children":337},{},[338,343,348],{"type":26,"tag":213,"props":339,"children":340},{},[341],{"type":31,"value":342},"系统按 UTC 定时，没有业务区域窗口概念",{"type":26,"tag":213,"props":344,"children":345},{},[346],{"type":31,"value":347},"节假日没有 pause policy",{"type":26,"tag":213,"props":349,"children":350},{},[351],{"type":31,"value":352},"同一 job 在不同区域共享一个“本周已发送”标记",{"type":26,"tag":27,"props":354,"children":355},{},[356],{"type":31,"value":357},"结果是某些区域延迟，某些区域误判为已完成，还有一些区域把节假日积压任务在第二天早上一起补发。",{"type":26,"tag":27,"props":359,"children":360},{},[361],{"type":31,"value":362},"最后修复不是“把 cron 写复杂点”，而是给 job 加了 business calendar、region-specific window 和 pause / resume contract。这个例子很能说明问题：自动化的真实复杂度往往来自业务日历，而不是模型调用本身。",{"type":26,"tag":81,"props":364,"children":366},{"id":365},"真正值钱的自动化不是无人值守而是可预测",[367],{"type":31,"value":368},"真正值钱的自动化，不是无人值守，而是可预测",{"type":26,"tag":27,"props":370,"children":371},{},[372],{"type":31,"value":373},"很多系统做 recurring automation 的心态像在追求全自动驾驶，希望任务从此不需要人看。但在企业环境里，更现实的目标通常是：",{"type":26,"tag":209,"props":375,"children":376},{},[377,382,387],{"type":26,"tag":213,"props":378,"children":379},{},[380],{"type":31,"value":381},"任务什么时候会跑，大家能预测",{"type":26,"tag":213,"props":383,"children":384},{},[385],{"type":31,"value":386},"任务错过后会怎么补，大家能预测",{"type":26,"tag":213,"props":388,"children":389},{},[390],{"type":31,"value":391},"自动化不该做的副作用，系统会自己刹住",{"type":26,"tag":27,"props":393,"children":394},{},[395],{"type":31,"value":396},"如果你现在要先做一件事，优先把每个 recurring job 的 window、catch-up 和 side-effect policy 写清楚。只要这三件事说不明白，自动化跑得越勤，系统就越像在重复放大自己的边界错误。",{"type":26,"tag":27,"props":398,"children":399},{},[400],{"type":31,"value":401},"延伸阅读：",{"type":26,"tag":209,"props":403,"children":404},{},[405,412,419,426],{"type":26,"tag":213,"props":406,"children":407},{},[408],{"type":26,"tag":49,"props":409,"children":410},{"href":51},[411],{"type":31,"value":54},{"type":26,"tag":213,"props":413,"children":414},{},[415],{"type":26,"tag":49,"props":416,"children":417},{"href":59},[418],{"type":31,"value":62},{"type":26,"tag":213,"props":420,"children":421},{},[422],{"type":26,"tag":49,"props":423,"children":424},{"href":66},[425],{"type":31,"value":69},{"type":26,"tag":213,"props":427,"children":428},{},[429],{"type":26,"tag":49,"props":430,"children":431},{"href":74},[432],{"type":31,"value":77},{"title":7,"searchDepth":434,"depth":434,"links":435},3,[436,438,439,440,441,442],{"id":83,"depth":437,"text":86},2,{"id":199,"depth":437,"text":202},{"id":253,"depth":437,"text":256},{"id":287,"depth":437,"text":290},{"id":326,"depth":437,"text":329},{"id":365,"depth":437,"text":368},"markdown","content:topics:ai:ai-agent-scheduled-runs-recurring-automation-design.md","content","topics/ai/ai-agent-scheduled-runs-recurring-automation-design.md","topics/ai/ai-agent-scheduled-runs-recurring-automation-design","md",[450,1605,2555],{"_path":451,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":452,"description":453,"date":454,"topic":5,"author":11,"tags":455,"image":461,"imageAlt":462,"pexelsPhotoId":463,"pexelsUrl":464,"readingTime":465,"body":466,"_type":443,"_id":1602,"_source":445,"_file":1603,"_stem":1604,"_extension":448},"/topics/ai/cursor-keyboard-shortcuts-cheatsheet","Cursor 快捷键速查表（macOS/Windows）：从“会用”到“能提效”的 10 个工作流","把 Cursor 常用快捷键按任务分组（查代码、改代码、多文件、对话、审查与回滚），给出可直接照抄的工作流与最小回归清单，避免“快捷键背了也没变快”。","2026-03-02",[456,457,458,459,460],"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":467,"toc":1576},[468,473,491,496,525,530,566,570,576,581,614,619,642,645,651,656,874,883,886,892,899,918,926,947,952,958,973,1004,1009,1022,1028,1047,1065,1073,1078,1084,1089,1110,1118,1124,1129,1152,1157,1163,1176,1182,1200,1218,1224,1235,1253,1259,1270,1276,1281,1324,1327,1333,1341,1394,1397,1403,1409,1414,1419,1442,1460,1465,1490,1493,1499,1505,1510,1516,1521,1527,1532,1535,1541],{"type":26,"tag":27,"props":469,"children":470},{},[471],{"type":31,"value":472},"如果你在搜“Cursor 快捷键”，你大概率不是想背一张表，而是想解决这类问题：",{"type":26,"tag":209,"props":474,"children":475},{},[476,481,486],{"type":26,"tag":213,"props":477,"children":478},{},[479],{"type":31,"value":480},"为什么我用了 AI，还是很慢？（对话来回太多、改动不可控）",{"type":26,"tag":213,"props":482,"children":483},{},[484],{"type":31,"value":485},"为什么它“看起来懂了”，却改错文件/改出回归？（上下文与范围没锁住）",{"type":26,"tag":213,"props":487,"children":488},{},[489],{"type":31,"value":490},"多文件改动怎么做得安全？（验收、回滚、最小回归集）",{"type":26,"tag":27,"props":492,"children":493},{},[494],{"type":31,"value":495},"这篇文章给你两份东西：",{"type":26,"tag":497,"props":498,"children":499},"ol",{},[500,513],{"type":26,"tag":213,"props":501,"children":502},{},[503,505,511],{"type":31,"value":504},"一张",{"type":26,"tag":506,"props":507,"children":508},"strong",{},[509],{"type":31,"value":510},"按任务分组",{"type":31,"value":512},"的快捷键表（不是按功能堆在一起）",{"type":26,"tag":213,"props":514,"children":515},{},[516,518,523],{"type":31,"value":517},"一套“从需求到落地”的",{"type":26,"tag":506,"props":519,"children":520},{},[521],{"type":31,"value":522},"最小闭环工作流",{"type":31,"value":524},"（每一步都有快捷键）",{"type":26,"tag":27,"props":526,"children":527},{},[528],{"type":31,"value":529},"想看系统玩法：",{"type":26,"tag":209,"props":531,"children":532},{},[533,544,555],{"type":26,"tag":213,"props":534,"children":535},{},[536,538],{"type":31,"value":537},"入门教程看：",{"type":26,"tag":49,"props":539,"children":541},{"href":540},"/topics/ai/cursor-tutorial",[542],{"type":31,"value":543},"Cursor 使用教程（2026）",{"type":26,"tag":213,"props":545,"children":546},{},[547,549],{"type":31,"value":548},"进阶玩法看：",{"type":26,"tag":49,"props":550,"children":552},{"href":551},"/topics/ai/cursor-editor-guide",[553],{"type":31,"value":554},"Cursor 编辑器深度玩法",{"type":26,"tag":213,"props":556,"children":557},{},[558,560],{"type":31,"value":559},"规则与忽略看：",{"type":26,"tag":49,"props":561,"children":563},{"href":562},"/topics/ai/cursor-rules-cursorrules",[564],{"type":31,"value":565},"Cursor Rules 与 .cursorrules",{"type":26,"tag":567,"props":568,"children":569},"hr",{},[],{"type":26,"tag":81,"props":571,"children":573},{"id":572},"先给结论提效不是按得快而是闭环更短",[574],{"type":31,"value":575},"先给结论：提效不是“按得快”，而是“闭环更短”",{"type":26,"tag":27,"props":577,"children":578},{},[579],{"type":31,"value":580},"你可以把 Cursor 的快捷键理解为 3 条流水线：",{"type":26,"tag":209,"props":582,"children":583},{},[584,594,604],{"type":26,"tag":213,"props":585,"children":586},{},[587,592],{"type":26,"tag":506,"props":588,"children":589},{},[590],{"type":31,"value":591},"改一小段",{"type":31,"value":593},"（内联编辑）：把改动限制在一个函数/一段样式",{"type":26,"tag":213,"props":595,"children":596},{},[597,602],{"type":26,"tag":506,"props":598,"children":599},{},[600],{"type":31,"value":601},"改一组文件",{"type":31,"value":603},"（Composer）：把改动限制在一组明确文件，并要求输出 diff + 验收点",{"type":26,"tag":213,"props":605,"children":606},{},[607,612],{"type":26,"tag":506,"props":608,"children":609},{},[610],{"type":31,"value":611},"聊清楚再动手",{"type":31,"value":613},"（侧边对话）：先对齐目标、范围、验收、回滚",{"type":26,"tag":27,"props":615,"children":616},{},[617],{"type":31,"value":618},"当你觉得“它乱改/改太大”时，往往不是快捷键没记住，而是缺了两件事：",{"type":26,"tag":209,"props":620,"children":621},{},[622,632],{"type":26,"tag":213,"props":623,"children":624},{},[625,627],{"type":31,"value":626},"没有在动手前锁定",{"type":26,"tag":506,"props":628,"children":629},{},[630],{"type":31,"value":631},"范围",{"type":26,"tag":213,"props":633,"children":634},{},[635,637],{"type":31,"value":636},"没有在接受改动前准备",{"type":26,"tag":506,"props":638,"children":639},{},[640],{"type":31,"value":641},"验收/回滚",{"type":26,"tag":567,"props":643,"children":644},{},[],{"type":26,"tag":81,"props":646,"children":648},{"id":647},"快捷键速查表按任务分组",[649],{"type":31,"value":650},"快捷键速查表（按任务分组）",{"type":26,"tag":27,"props":652,"children":653},{},[654],{"type":31,"value":655},"说明：下表按“你正在做什么”组织，而不是按“功能名字”组织。不同版本快捷键可能略有差异，但核心逻辑一致。",{"type":26,"tag":88,"props":657,"children":658},{},[659,685],{"type":26,"tag":92,"props":660,"children":661},{},[662],{"type":26,"tag":96,"props":663,"children":664},{},[665,670,675,680],{"type":26,"tag":100,"props":666,"children":667},{},[668],{"type":31,"value":669},"任务",{"type":26,"tag":100,"props":671,"children":672},{},[673],{"type":31,"value":674},"macOS",{"type":26,"tag":100,"props":676,"children":677},{},[678],{"type":31,"value":679},"Windows",{"type":26,"tag":100,"props":681,"children":682},{},[683],{"type":31,"value":684},"你该在什么时候用",{"type":26,"tag":116,"props":686,"children":687},{},[688,719,750,781,812,843],{"type":26,"tag":96,"props":689,"children":690},{},[691,696,705,714],{"type":26,"tag":123,"props":692,"children":693},{},[694],{"type":31,"value":695},"改一小段（最安全）",{"type":26,"tag":123,"props":697,"children":698},{},[699],{"type":26,"tag":242,"props":700,"children":702},{"className":701},[],[703],{"type":31,"value":704},"Cmd + K",{"type":26,"tag":123,"props":706,"children":707},{},[708],{"type":26,"tag":242,"props":709,"children":711},{"className":710},[],[712],{"type":31,"value":713},"Ctrl + K",{"type":26,"tag":123,"props":715,"children":716},{},[717],{"type":31,"value":718},"只想改一个函数/一段 CSS，不想动别的",{"type":26,"tag":96,"props":720,"children":721},{},[722,727,736,745],{"type":26,"tag":123,"props":723,"children":724},{},[725],{"type":31,"value":726},"打开 AI 对话（先对齐再动手）",{"type":26,"tag":123,"props":728,"children":729},{},[730],{"type":26,"tag":242,"props":731,"children":733},{"className":732},[],[734],{"type":31,"value":735},"Cmd + L",{"type":26,"tag":123,"props":737,"children":738},{},[739],{"type":26,"tag":242,"props":740,"children":742},{"className":741},[],[743],{"type":31,"value":744},"Ctrl + L",{"type":26,"tag":123,"props":746,"children":747},{},[748],{"type":31,"value":749},"需要澄清目标、制定步骤、给验收点",{"type":26,"tag":96,"props":751,"children":752},{},[753,758,767,776],{"type":26,"tag":123,"props":754,"children":755},{},[756],{"type":31,"value":757},"多文件编辑（有组织地改一组文件）",{"type":26,"tag":123,"props":759,"children":760},{},[761],{"type":26,"tag":242,"props":762,"children":764},{"className":763},[],[765],{"type":31,"value":766},"Cmd + I",{"type":26,"tag":123,"props":768,"children":769},{},[770],{"type":26,"tag":242,"props":771,"children":773},{"className":772},[],[774],{"type":31,"value":775},"Ctrl + I",{"type":26,"tag":123,"props":777,"children":778},{},[779],{"type":31,"value":780},"改动涉及多个文件：组件+样式+测试",{"type":26,"tag":96,"props":782,"children":783},{},[784,789,798,807],{"type":26,"tag":123,"props":785,"children":786},{},[787],{"type":31,"value":788},"把选中代码加入对话上下文",{"type":26,"tag":123,"props":790,"children":791},{},[792],{"type":26,"tag":242,"props":793,"children":795},{"className":794},[],[796],{"type":31,"value":797},"Cmd + Shift + L",{"type":26,"tag":123,"props":799,"children":800},{},[801],{"type":26,"tag":242,"props":802,"children":804},{"className":803},[],[805],{"type":31,"value":806},"Ctrl + Shift + L",{"type":26,"tag":123,"props":808,"children":809},{},[810],{"type":31,"value":811},"让 AI 只看你选的片段（降低噪音）",{"type":26,"tag":96,"props":813,"children":814},{},[815,820,829,838],{"type":26,"tag":123,"props":816,"children":817},{},[818],{"type":31,"value":819},"接受当前建议",{"type":26,"tag":123,"props":821,"children":822},{},[823],{"type":26,"tag":242,"props":824,"children":826},{"className":825},[],[827],{"type":31,"value":828},"Cmd + Y",{"type":26,"tag":123,"props":830,"children":831},{},[832],{"type":26,"tag":242,"props":833,"children":835},{"className":834},[],[836],{"type":31,"value":837},"Ctrl + Y",{"type":26,"tag":123,"props":839,"children":840},{},[841],{"type":31,"value":842},"你已经准备好验收/回滚，并确认改动范围",{"type":26,"tag":96,"props":844,"children":845},{},[846,851,860,869],{"type":26,"tag":123,"props":847,"children":848},{},[849],{"type":31,"value":850},"拒绝当前建议",{"type":26,"tag":123,"props":852,"children":853},{},[854],{"type":26,"tag":242,"props":855,"children":857},{"className":856},[],[858],{"type":31,"value":859},"Cmd + N",{"type":26,"tag":123,"props":861,"children":862},{},[863],{"type":26,"tag":242,"props":864,"children":866},{"className":865},[],[867],{"type":31,"value":868},"Ctrl + N",{"type":26,"tag":123,"props":870,"children":871},{},[872],{"type":31,"value":873},"改得太大、改错方向，立刻收手",{"type":26,"tag":875,"props":876,"children":877},"blockquote",{},[878],{"type":26,"tag":27,"props":879,"children":880},{},[881],{"type":31,"value":882},"小技巧：把“改一小段”当默认路径。只有当你能清晰写出“会改哪几类文件、怎么验收”时再进入多文件。",{"type":26,"tag":567,"props":884,"children":885},{},[],{"type":26,"tag":81,"props":887,"children":889},{"id":888},"_10-个可直接照抄的提效工作流每个都能闭环",[890],{"type":31,"value":891},"10 个可直接照抄的提效工作流（每个都能闭环）",{"type":26,"tag":893,"props":894,"children":896},"h3",{"id":895},"工作流-1需求计划小步改新手最稳",[897],{"type":31,"value":898},"工作流 1：需求→计划→小步改（新手最稳）",{"type":26,"tag":497,"props":900,"children":901},{},[902,913],{"type":26,"tag":213,"props":903,"children":904},{},[905,911],{"type":26,"tag":242,"props":906,"children":908},{"className":907},[],[909],{"type":31,"value":910},"Cmd/Ctrl + L",{"type":31,"value":912}," 打开对话",{"type":26,"tag":213,"props":914,"children":915},{},[916],{"type":31,"value":917},"先发这段（可复制）：",{"type":26,"tag":875,"props":919,"children":920},{},[921],{"type":26,"tag":27,"props":922,"children":923},{},[924],{"type":31,"value":925},"目标：……\n范围：只修改以下文件/模块：……\n非目标：……（明确不做）\n验收：……（可测试/可手动检查）\n输出格式：先给计划，再逐步执行；每一步写出 diff 摘要。",{"type":26,"tag":497,"props":927,"children":928},{"start":434},[929,934],{"type":26,"tag":213,"props":930,"children":931},{},[932],{"type":31,"value":933},"让 AI 先给“计划（3~6 步）”，你确认后再执行",{"type":26,"tag":213,"props":935,"children":936},{},[937,939,945],{"type":31,"value":938},"任何一步涉及改代码：优先回到编辑区，选中片段用 ",{"type":26,"tag":242,"props":940,"children":942},{"className":941},[],[943],{"type":31,"value":944},"Cmd/Ctrl + K",{"type":31,"value":946}," 小步改",{"type":26,"tag":27,"props":948,"children":949},{},[950],{"type":31,"value":951},"为什么有效：你把“想法”变成了“可执行约束”，这就是 GEO（面向 AI/模型的可理解结构）。",{"type":26,"tag":893,"props":953,"children":955},{"id":954},"工作流-2只改一个函数高频低风险",[956],{"type":31,"value":957},"工作流 2：只改一个函数（高频、低风险）",{"type":26,"tag":209,"props":959,"children":960},{},[961],{"type":26,"tag":213,"props":962,"children":963},{},[964,966,971],{"type":31,"value":965},"选中函数 → ",{"type":26,"tag":242,"props":967,"children":969},{"className":968},[],[970],{"type":31,"value":944},{"type":31,"value":972}," → 输入指令：",{"type":26,"tag":875,"props":974,"children":975},{},[976,981],{"type":26,"tag":27,"props":977,"children":978},{},[979],{"type":31,"value":980},"把这段改成更可读：",{"type":26,"tag":209,"props":982,"children":983},{},[984,989,994,999],{"type":26,"tag":213,"props":985,"children":986},{},[987],{"type":31,"value":988},"用 async/await",{"type":26,"tag":213,"props":990,"children":991},{},[992],{"type":31,"value":993},"错误处理不要吞掉",{"type":26,"tag":213,"props":995,"children":996},{},[997],{"type":31,"value":998},"添加类型（若可推断）",{"type":26,"tag":213,"props":1000,"children":1001},{},[1002],{"type":31,"value":1003},"不要改函数签名",{"type":26,"tag":27,"props":1005,"children":1006},{},[1007],{"type":31,"value":1008},"验收方式（强制）：",{"type":26,"tag":209,"props":1010,"children":1011},{},[1012,1017],{"type":26,"tag":213,"props":1013,"children":1014},{},[1015],{"type":31,"value":1016},"输出前后函数行为一致（输入/输出）",{"type":26,"tag":213,"props":1018,"children":1019},{},[1020],{"type":31,"value":1021},"失败分支有可观测日志（不要悄悄 return null）",{"type":26,"tag":893,"props":1023,"children":1025},{"id":1024},"工作流-3多文件改动先定文件清单",[1026],{"type":31,"value":1027},"工作流 3：多文件改动（先定“文件清单”）",{"type":26,"tag":497,"props":1029,"children":1030},{},[1031,1042],{"type":26,"tag":213,"props":1032,"children":1033},{},[1034,1040],{"type":26,"tag":242,"props":1035,"children":1037},{"className":1036},[],[1038],{"type":31,"value":1039},"Cmd/Ctrl + I",{"type":31,"value":1041}," 进入多文件",{"type":26,"tag":213,"props":1043,"children":1044},{},[1045],{"type":31,"value":1046},"先让 AI 输出：",{"type":26,"tag":209,"props":1048,"children":1049},{},[1050,1055,1060],{"type":26,"tag":213,"props":1051,"children":1052},{},[1053],{"type":31,"value":1054},"预计会改哪些文件（最多 5 个）",{"type":26,"tag":213,"props":1056,"children":1057},{},[1058],{"type":31,"value":1059},"每个文件改什么",{"type":26,"tag":213,"props":1061,"children":1062},{},[1063],{"type":31,"value":1064},"每一步怎么验收",{"type":26,"tag":497,"props":1066,"children":1067},{"start":434},[1068],{"type":26,"tag":213,"props":1069,"children":1070},{},[1071],{"type":31,"value":1072},"你确认文件清单后再开始生成改动",{"type":26,"tag":27,"props":1074,"children":1075},{},[1076],{"type":31,"value":1077},"关键点：多文件最容易翻车的是“它把你没想到的文件也改了”。所以文件清单是第一道闸门。",{"type":26,"tag":893,"props":1079,"children":1081},{"id":1080},"工作流-4把上下文噪音砍掉防跑偏",[1082],{"type":31,"value":1083},"工作流 4：把“上下文噪音”砍掉（防跑偏）",{"type":26,"tag":27,"props":1085,"children":1086},{},[1087],{"type":31,"value":1088},"当你怀疑它在胡说/乱改时：",{"type":26,"tag":209,"props":1090,"children":1091},{},[1092,1105],{"type":26,"tag":213,"props":1093,"children":1094},{},[1095,1097,1103],{"type":31,"value":1096},"只选择关键代码片段 → ",{"type":26,"tag":242,"props":1098,"children":1100},{"className":1099},[],[1101],{"type":31,"value":1102},"Cmd/Ctrl + Shift + L",{"type":31,"value":1104}," 加入对话",{"type":26,"tag":213,"props":1106,"children":1107},{},[1108],{"type":31,"value":1109},"然后在对话里要求：",{"type":26,"tag":875,"props":1111,"children":1112},{},[1113],{"type":26,"tag":27,"props":1114,"children":1115},{},[1116],{"type":31,"value":1117},"只基于我提供的代码片段回答，不要假设其它文件存在。",{"type":26,"tag":893,"props":1119,"children":1121},{"id":1120},"工作流-5生成变更说明让-code-review-变快",[1122],{"type":31,"value":1123},"工作流 5：生成变更说明（让 code review 变快）",{"type":26,"tag":27,"props":1125,"children":1126},{},[1127],{"type":31,"value":1128},"改完后在对话里让它输出：",{"type":26,"tag":209,"props":1130,"children":1131},{},[1132,1137,1142,1147],{"type":26,"tag":213,"props":1133,"children":1134},{},[1135],{"type":31,"value":1136},"改动摘要（3~7 条）",{"type":26,"tag":213,"props":1138,"children":1139},{},[1140],{"type":31,"value":1141},"风险点（依赖/边界条件）",{"type":26,"tag":213,"props":1143,"children":1144},{},[1145],{"type":31,"value":1146},"回滚方式",{"type":26,"tag":213,"props":1148,"children":1149},{},[1150],{"type":31,"value":1151},"验收步骤",{"type":26,"tag":27,"props":1153,"children":1154},{},[1155],{"type":31,"value":1156},"这套结构能直接贴进 PR 描述。",{"type":26,"tag":893,"props":1158,"children":1160},{"id":1159},"工作流-6写最小回归集不写回归-等事故",[1161],{"type":31,"value":1162},"工作流 6：写“最小回归集”（不写回归 = 等事故）",{"type":26,"tag":27,"props":1164,"children":1165},{},[1166,1168,1174],{"type":31,"value":1167},"每次改动都至少做 10 条最小回归（见下文清单）。你可以把它写在 ",{"type":26,"tag":242,"props":1169,"children":1171},{"className":1170},[],[1172],{"type":31,"value":1173},"README",{"type":31,"value":1175}," 或团队 wiki。",{"type":26,"tag":893,"props":1177,"children":1179},{"id":1178},"工作流-7把接受建议变成最后一步",[1180],{"type":31,"value":1181},"工作流 7：把“接受建议”变成最后一步",{"type":26,"tag":27,"props":1183,"children":1184},{},[1185,1191,1193,1198],{"type":26,"tag":242,"props":1186,"children":1188},{"className":1187},[],[1189],{"type":31,"value":1190},"Cmd/Ctrl + Y",{"type":31,"value":1192}," 应该是",{"type":26,"tag":506,"props":1194,"children":1195},{},[1196],{"type":31,"value":1197},"最后一步",{"type":31,"value":1199},"：",{"type":26,"tag":209,"props":1201,"children":1202},{},[1203,1208,1213],{"type":26,"tag":213,"props":1204,"children":1205},{},[1206],{"type":31,"value":1207},"你已经看过 diff",{"type":26,"tag":213,"props":1209,"children":1210},{},[1211],{"type":31,"value":1212},"你能说清楚“怎么验收”",{"type":26,"tag":213,"props":1214,"children":1215},{},[1216],{"type":31,"value":1217},"你知道“怎么回滚”",{"type":26,"tag":893,"props":1219,"children":1221},{"id":1220},"工作流-8拒绝建议不是失败是风控动作",[1222],{"type":31,"value":1223},"工作流 8：拒绝建议不是失败，是风控动作",{"type":26,"tag":27,"props":1225,"children":1226},{},[1227,1233],{"type":26,"tag":242,"props":1228,"children":1230},{"className":1229},[],[1231],{"type":31,"value":1232},"Cmd/Ctrl + N",{"type":31,"value":1234}," 的使用时机：",{"type":26,"tag":209,"props":1236,"children":1237},{},[1238,1243,1248],{"type":26,"tag":213,"props":1239,"children":1240},{},[1241],{"type":31,"value":1242},"它开始改你没提过的东西（范围漂移）",{"type":26,"tag":213,"props":1244,"children":1245},{},[1246],{"type":31,"value":1247},"它改了 10 个文件但你只想改 1 个",{"type":26,"tag":213,"props":1249,"children":1250},{},[1251],{"type":31,"value":1252},"它为了“更优雅”引入新依赖/新抽象",{"type":26,"tag":893,"props":1254,"children":1256},{"id":1255},"工作流-9重复任务做成模板提示词不是一次性",[1257],{"type":31,"value":1258},"工作流 9：重复任务做成模板（提示词不是一次性）",{"type":26,"tag":27,"props":1260,"children":1261},{},[1262,1264,1268],{"type":31,"value":1263},"把高频任务（比如“写组件+样式+验收”）固化成模板，放进 Rules（见：",{"type":26,"tag":49,"props":1265,"children":1266},{"href":562},[1267],{"type":31,"value":565},{"type":31,"value":1269},"）。",{"type":26,"tag":893,"props":1271,"children":1273},{"id":1272},"工作流-10把快捷键表做成你自己的任务表",[1274],{"type":31,"value":1275},"工作流 10：把“快捷键表”做成你自己的任务表",{"type":26,"tag":27,"props":1277,"children":1278},{},[1279],{"type":31,"value":1280},"你不需要记住所有快捷键，只需要记住：",{"type":26,"tag":209,"props":1282,"children":1283},{},[1284,1294,1304,1314],{"type":26,"tag":213,"props":1285,"children":1286},{},[1287,1289],{"type":31,"value":1288},"小步改：",{"type":26,"tag":242,"props":1290,"children":1292},{"className":1291},[],[1293],{"type":31,"value":944},{"type":26,"tag":213,"props":1295,"children":1296},{},[1297,1299],{"type":31,"value":1298},"先对齐：",{"type":26,"tag":242,"props":1300,"children":1302},{"className":1301},[],[1303],{"type":31,"value":910},{"type":26,"tag":213,"props":1305,"children":1306},{},[1307,1309],{"type":31,"value":1308},"多文件：",{"type":26,"tag":242,"props":1310,"children":1312},{"className":1311},[],[1313],{"type":31,"value":1039},{"type":26,"tag":213,"props":1315,"children":1316},{},[1317,1319],{"type":31,"value":1318},"上下文聚焦：",{"type":26,"tag":242,"props":1320,"children":1322},{"className":1321},[],[1323],{"type":31,"value":1102},{"type":26,"tag":567,"props":1325,"children":1326},{},[],{"type":26,"tag":81,"props":1328,"children":1330},{"id":1329},"必交付物-1最小回归任务清单10-条通用",[1331],{"type":31,"value":1332},"必交付物 1：最小回归任务清单（10 条，通用）",{"type":26,"tag":875,"props":1334,"children":1335},{},[1336],{"type":26,"tag":27,"props":1337,"children":1338},{},[1339],{"type":31,"value":1340},"这份清单的意义：让每次 AI 改动都能“被验证”。否则你只是把不可控变成了更快的不可控。",{"type":26,"tag":497,"props":1342,"children":1343},{},[1344,1349,1354,1359,1364,1369,1374,1379,1384,1389],{"type":26,"tag":213,"props":1345,"children":1346},{},[1347],{"type":31,"value":1348},"关键路径能跑通（手动点击/请求一次）",{"type":26,"tag":213,"props":1350,"children":1351},{},[1352],{"type":31,"value":1353},"错误路径能触发（模拟一次失败输入）",{"type":26,"tag":213,"props":1355,"children":1356},{},[1357],{"type":31,"value":1358},"控制台无新增错误（至少关注 1 次真实操作）",{"type":26,"tag":213,"props":1360,"children":1361},{},[1362],{"type":31,"value":1363},"关键 UI 未错位（移动端/桌面端各看一眼）",{"type":26,"tag":213,"props":1365,"children":1366},{},[1367],{"type":31,"value":1368},"刷新后状态正确（尤其是表单/列表）",{"type":26,"tag":213,"props":1370,"children":1371},{},[1372],{"type":31,"value":1373},"路由跳转没断（从入口到目标页）",{"type":26,"tag":213,"props":1375,"children":1376},{},[1377],{"type":31,"value":1378},"相关接口未改变契约（字段名/类型）",{"type":26,"tag":213,"props":1380,"children":1381},{},[1382],{"type":31,"value":1383},"性能没有明显退化（首屏、交互卡顿）",{"type":26,"tag":213,"props":1385,"children":1386},{},[1387],{"type":31,"value":1388},"回滚方案可执行（知道回滚哪几个文件/commit）",{"type":26,"tag":213,"props":1390,"children":1391},{},[1392],{"type":31,"value":1393},"写下“这次改动解决了什么、风险是什么”（可贴 PR）",{"type":26,"tag":567,"props":1395,"children":1396},{},[],{"type":26,"tag":81,"props":1398,"children":1400},{"id":1399},"必交付物-2失败案例复盘真实会发生",[1401],{"type":31,"value":1402},"必交付物 2：失败案例复盘（真实会发生）",{"type":26,"tag":893,"props":1404,"children":1406},{"id":1405},"现象快捷键用得很熟但交付还是慢",[1407],{"type":31,"value":1408},"现象：快捷键用得很熟，但交付还是慢",{"type":26,"tag":27,"props":1410,"children":1411},{},[1412],{"type":31,"value":1413},"典型原因：你把 Cursor 当成“更聪明的搜索框”，不断对话，直到它给出你想要的答案。",{"type":26,"tag":27,"props":1415,"children":1416},{},[1417],{"type":31,"value":1418},"复现路径：",{"type":26,"tag":209,"props":1420,"children":1421},{},[1422,1427,1432,1437],{"type":26,"tag":213,"props":1423,"children":1424},{},[1425],{"type":31,"value":1426},"你直接说“把页面做得更好看、更高级”",{"type":26,"tag":213,"props":1428,"children":1429},{},[1430],{"type":31,"value":1431},"AI 开始大改样式、抽象组件、甚至引入新依赖",{"type":26,"tag":213,"props":1433,"children":1434},{},[1435],{"type":31,"value":1436},"你为了省事按了“接受建议”",{"type":26,"tag":213,"props":1438,"children":1439},{},[1440],{"type":31,"value":1441},"最后发现：设计没统一、移动端崩、甚至埋了性能问题",{"type":26,"tag":27,"props":1443,"children":1444},{},[1445,1447,1451,1453,1458],{"type":31,"value":1446},"根因：缺少",{"type":26,"tag":506,"props":1448,"children":1449},{},[1450],{"type":31,"value":631},{"type":31,"value":1452},"与",{"type":26,"tag":506,"props":1454,"children":1455},{},[1456],{"type":31,"value":1457},"验收",{"type":31,"value":1459},"。",{"type":26,"tag":27,"props":1461,"children":1462},{},[1463],{"type":31,"value":1464},"修复方式（可照抄）：",{"type":26,"tag":209,"props":1466,"children":1467},{},[1468,1473,1485],{"type":26,"tag":213,"props":1469,"children":1470},{},[1471],{"type":31,"value":1472},"把需求拆成 3 个可验证目标：例如“按钮样式统一”“首屏 CTA 更明显”“移动端间距不挤”",{"type":26,"tag":213,"props":1474,"children":1475},{},[1476,1478,1483],{"type":31,"value":1477},"每个目标只用 ",{"type":26,"tag":242,"props":1479,"children":1481},{"className":1480},[],[1482],{"type":31,"value":944},{"type":31,"value":1484}," 改一个局部",{"type":26,"tag":213,"props":1486,"children":1487},{},[1488],{"type":31,"value":1489},"每次接受建议前跑一遍“最小回归集”",{"type":26,"tag":567,"props":1491,"children":1492},{},[],{"type":26,"tag":81,"props":1494,"children":1496},{"id":1495},"faq高频问题",[1497],{"type":31,"value":1498},"FAQ（高频问题）",{"type":26,"tag":893,"props":1500,"children":1502},{"id":1501},"q1我应该先记快捷键还是先学工作流",[1503],{"type":31,"value":1504},"Q1：我应该先记快捷键还是先学工作流？",{"type":26,"tag":27,"props":1506,"children":1507},{},[1508],{"type":31,"value":1509},"先学工作流。快捷键只是把工作流的步骤变短。",{"type":26,"tag":893,"props":1511,"children":1513},{"id":1512},"q2为什么我一用多文件就容易翻车",[1514],{"type":31,"value":1515},"Q2：为什么我一用多文件就容易翻车？",{"type":26,"tag":27,"props":1517,"children":1518},{},[1519],{"type":31,"value":1520},"因为多文件意味着范围更大、依赖更多、验收更难。先锁定“文件清单 + 每步验收”，再让它动手。",{"type":26,"tag":893,"props":1522,"children":1524},{"id":1523},"q3有没有万能提示词",[1525],{"type":31,"value":1526},"Q3：有没有“万能提示词”？",{"type":26,"tag":27,"props":1528,"children":1529},{},[1530],{"type":31,"value":1531},"没有，但有“万能结构”：目标、范围、非目标、验收、输出格式。",{"type":26,"tag":567,"props":1533,"children":1534},{},[],{"type":26,"tag":81,"props":1536,"children":1538},{"id":1537},"延伸阅读建议按顺序",[1539],{"type":31,"value":1540},"延伸阅读（建议按顺序）",{"type":26,"tag":209,"props":1542,"children":1543},{},[1544,1551,1558,1565],{"type":26,"tag":213,"props":1545,"children":1546},{},[1547],{"type":26,"tag":49,"props":1548,"children":1549},{"href":540},[1550],{"type":31,"value":543},{"type":26,"tag":213,"props":1552,"children":1553},{},[1554],{"type":26,"tag":49,"props":1555,"children":1556},{"href":551},[1557],{"type":31,"value":554},{"type":26,"tag":213,"props":1559,"children":1560},{},[1561],{"type":26,"tag":49,"props":1562,"children":1563},{"href":562},[1564],{"type":31,"value":565},{"type":26,"tag":213,"props":1566,"children":1567},{},[1568,1570],{"type":31,"value":1569},"如果你更关心“网页制作落地”：看这篇 ",{"type":26,"tag":49,"props":1571,"children":1573},{"href":1572},"/topics/practical-tips/htmlpage-quick-landing-page",[1574],{"type":31,"value":1575},"3 分钟用 HTMLPAGE 做落地页",{"title":7,"searchDepth":434,"depth":434,"links":1577},[1578,1579,1580,1592,1593,1596,1601],{"id":572,"depth":437,"text":575},{"id":647,"depth":437,"text":650},{"id":888,"depth":437,"text":891,"children":1581},[1582,1583,1584,1585,1586,1587,1588,1589,1590,1591],{"id":895,"depth":434,"text":898},{"id":954,"depth":434,"text":957},{"id":1024,"depth":434,"text":1027},{"id":1080,"depth":434,"text":1083},{"id":1120,"depth":434,"text":1123},{"id":1159,"depth":434,"text":1162},{"id":1178,"depth":434,"text":1181},{"id":1220,"depth":434,"text":1223},{"id":1255,"depth":434,"text":1258},{"id":1272,"depth":434,"text":1275},{"id":1329,"depth":437,"text":1332},{"id":1399,"depth":437,"text":1402,"children":1594},[1595],{"id":1405,"depth":434,"text":1408},{"id":1495,"depth":437,"text":1498,"children":1597},[1598,1599,1600],{"id":1501,"depth":434,"text":1504},{"id":1512,"depth":434,"text":1515},{"id":1523,"depth":434,"text":1526},{"id":1537,"depth":437,"text":1540},"content:topics:ai:cursor-keyboard-shortcuts-cheatsheet.md","topics/ai/cursor-keyboard-shortcuts-cheatsheet.md","topics/ai/cursor-keyboard-shortcuts-cheatsheet",{"_path":1606,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":1607,"description":1608,"date":1609,"topic":5,"author":11,"tags":1610,"image":1614,"imageAlt":1615,"pexelsPhotoId":1616,"pexelsUrl":1617,"readingTime":1618,"body":1619,"_type":443,"_id":2552,"_source":445,"_file":2553,"_stem":2554,"_extension":448},"/topics/ai/cursor-vs-copilot-vscode-workflow","Cursor vs GitHub Copilot vs VS Code：怎么选、怎么搭配、怎么把风险关在笼子里","用“任务类型×风险×验收成本”的选择矩阵解释 Cursor/Copilot/VS Code 的差异，并给出一套可落地的协作工作流（范围闸门、最小回归集、回滚策略）。","2026-03-01",[456,1611,459,1612,1613],"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":1620,"toc":2530},[1621,1626,1631,1649,1654,1672,1675,1681,1686,1717,1722,1725,1731,1739,1943,1951,1964,1967,1973,1979,1992,1997,2010,2016,2021,2054,2060,2065,2083,2086,2092,2097,2103,2108,2141,2147,2160,2165,2178,2184,2196,2202,2207,2220,2225,2228,2234,2239,2360,2363,2369,2379,2388,2406,2415,2423,2432,2450,2453,2459,2465,2470,2476,2481,2484,2489],{"type":26,"tag":27,"props":1622,"children":1623},{},[1624],{"type":31,"value":1625},"“Cursor 和 Copilot 到底有什么区别？”",{"type":26,"tag":27,"props":1627,"children":1628},{},[1629],{"type":31,"value":1630},"这个问题问得越早越好，因为你一旦把工具选错，后面所有痛苦都不是“提示词不够好”，而是：",{"type":26,"tag":209,"props":1632,"children":1633},{},[1634,1639,1644],{"type":26,"tag":213,"props":1635,"children":1636},{},[1637],{"type":31,"value":1638},"改动不可控（范围漂移、改错文件）",{"type":26,"tag":213,"props":1640,"children":1641},{},[1642],{"type":31,"value":1643},"验收成本爆炸（不知道要测什么）",{"type":26,"tag":213,"props":1645,"children":1646},{},[1647],{"type":31,"value":1648},"团队协作崩盘（没有闸门、没有回滚）",{"type":26,"tag":27,"props":1650,"children":1651},{},[1652],{"type":31,"value":1653},"这篇文章用一张选择矩阵 + 一套可执行工作流，帮你做到两件事：",{"type":26,"tag":497,"props":1655,"children":1656},{},[1657,1662],{"type":26,"tag":213,"props":1658,"children":1659},{},[1660],{"type":31,"value":1661},"知道什么时候用 Cursor、什么时候用 Copilot、什么时候“纯 VS Code 更快”",{"type":26,"tag":213,"props":1663,"children":1664},{},[1665,1667],{"type":31,"value":1666},"就算用 AI，也能把风险关在笼子里：",{"type":26,"tag":506,"props":1668,"children":1669},{},[1670],{"type":31,"value":1671},"可审查、可验证、可回滚",{"type":26,"tag":567,"props":1673,"children":1674},{},[],{"type":26,"tag":81,"props":1676,"children":1678},{"id":1677},"结论先说三者不是互斥而是分工",[1679],{"type":31,"value":1680},"结论先说：三者不是互斥，而是分工",{"type":26,"tag":27,"props":1682,"children":1683},{},[1684],{"type":31,"value":1685},"你可以把它们看成三层能力：",{"type":26,"tag":209,"props":1687,"children":1688},{},[1689,1698,1708],{"type":26,"tag":213,"props":1690,"children":1691},{},[1692,1696],{"type":26,"tag":506,"props":1693,"children":1694},{},[1695],{"type":31,"value":459},{"type":31,"value":1697},"：编辑器与生态（调试、插件、任务、终端、语言服务）",{"type":26,"tag":213,"props":1699,"children":1700},{},[1701,1706],{"type":26,"tag":506,"props":1702,"children":1703},{},[1704],{"type":31,"value":1705},"Copilot",{"type":31,"value":1707},"：代码补全与局部建议（“我正在写这一行/这一段”）",{"type":26,"tag":213,"props":1709,"children":1710},{},[1711,1715],{"type":26,"tag":506,"props":1712,"children":1713},{},[1714],{"type":31,"value":456},{"type":31,"value":1716},"：以项目为单位的 AI 协作（对话、索引、多文件编辑、规则）",{"type":26,"tag":27,"props":1718,"children":1719},{},[1720],{"type":31,"value":1721},"最常见的误区是：把“局部补全能力”当作“能做架构与多文件落地”。",{"type":26,"tag":567,"props":1723,"children":1724},{},[],{"type":26,"tag":81,"props":1726,"children":1728},{"id":1727},"选择矩阵按任务类型选工具不是按偏好",[1729],{"type":31,"value":1730},"选择矩阵：按任务类型选工具（不是按偏好）",{"type":26,"tag":875,"props":1732,"children":1733},{},[1734],{"type":26,"tag":27,"props":1735,"children":1736},{},[1737],{"type":31,"value":1738},"你只要把自己的任务放进表格，就能得到推荐路径。",{"type":26,"tag":88,"props":1740,"children":1741},{},[1742,1774],{"type":26,"tag":92,"props":1743,"children":1744},{},[1745],{"type":26,"tag":96,"props":1746,"children":1747},{},[1748,1753,1759,1764,1769],{"type":26,"tag":100,"props":1749,"children":1750},{},[1751],{"type":31,"value":1752},"任务类型",{"type":26,"tag":100,"props":1754,"children":1756},{"align":1755},"right",[1757],{"type":31,"value":1758},"风险",{"type":26,"tag":100,"props":1760,"children":1761},{"align":1755},[1762],{"type":31,"value":1763},"验收成本",{"type":26,"tag":100,"props":1765,"children":1766},{},[1767],{"type":31,"value":1768},"更推荐",{"type":26,"tag":100,"props":1770,"children":1771},{},[1772],{"type":31,"value":1773},"为什么",{"type":26,"tag":116,"props":1775,"children":1776},{},[1777,1804,1837,1863,1890,1917],{"type":26,"tag":96,"props":1778,"children":1779},{},[1780,1785,1790,1794,1799],{"type":26,"tag":123,"props":1781,"children":1782},{},[1783],{"type":31,"value":1784},"写一段代码/补一个 if",{"type":26,"tag":123,"props":1786,"children":1787},{"align":1755},[1788],{"type":31,"value":1789},"低",{"type":26,"tag":123,"props":1791,"children":1792},{"align":1755},[1793],{"type":31,"value":1789},{"type":26,"tag":123,"props":1795,"children":1796},{},[1797],{"type":31,"value":1798},"Copilot / Cursor 内联编辑",{"type":26,"tag":123,"props":1800,"children":1801},{},[1802],{"type":31,"value":1803},"局部建议足够，成本最低",{"type":26,"tag":96,"props":1805,"children":1806},{},[1807,1812,1817,1821,1832],{"type":26,"tag":123,"props":1808,"children":1809},{},[1810],{"type":31,"value":1811},"重构一个函数",{"type":26,"tag":123,"props":1813,"children":1814},{"align":1755},[1815],{"type":31,"value":1816},"中",{"type":26,"tag":123,"props":1818,"children":1819},{"align":1755},[1820],{"type":31,"value":1816},{"type":26,"tag":123,"props":1822,"children":1823},{},[1824,1826],{"type":31,"value":1825},"Cursor ",{"type":26,"tag":242,"props":1827,"children":1829},{"className":1828},[],[1830],{"type":31,"value":1831},"内联编辑",{"type":26,"tag":123,"props":1833,"children":1834},{},[1835],{"type":31,"value":1836},"需要解释、需要约束输出",{"type":26,"tag":96,"props":1838,"children":1839},{},[1840,1845,1849,1853,1858],{"type":26,"tag":123,"props":1841,"children":1842},{},[1843],{"type":31,"value":1844},"改一个组件 + 样式",{"type":26,"tag":123,"props":1846,"children":1847},{"align":1755},[1848],{"type":31,"value":1816},{"type":26,"tag":123,"props":1850,"children":1851},{"align":1755},[1852],{"type":31,"value":1816},{"type":26,"tag":123,"props":1854,"children":1855},{},[1856],{"type":31,"value":1857},"Cursor（小范围多文件）",{"type":26,"tag":123,"props":1859,"children":1860},{},[1861],{"type":31,"value":1862},"需要同时改模板与样式",{"type":26,"tag":96,"props":1864,"children":1865},{},[1866,1871,1876,1880,1885],{"type":26,"tag":123,"props":1867,"children":1868},{},[1869],{"type":31,"value":1870},"改 3~5 个文件（组件+api+测试）",{"type":26,"tag":123,"props":1872,"children":1873},{"align":1755},[1874],{"type":31,"value":1875},"高",{"type":26,"tag":123,"props":1877,"children":1878},{"align":1755},[1879],{"type":31,"value":1875},{"type":26,"tag":123,"props":1881,"children":1882},{},[1883],{"type":31,"value":1884},"Cursor Composer + 闸门",{"type":26,"tag":123,"props":1886,"children":1887},{},[1888],{"type":31,"value":1889},"需要计划、验收、回滚",{"type":26,"tag":96,"props":1891,"children":1892},{},[1893,1898,1903,1907,1912],{"type":26,"tag":123,"props":1894,"children":1895},{},[1896],{"type":31,"value":1897},"重写一段架构/引入新依赖",{"type":26,"tag":123,"props":1899,"children":1900},{"align":1755},[1901],{"type":31,"value":1902},"很高",{"type":26,"tag":123,"props":1904,"children":1905},{"align":1755},[1906],{"type":31,"value":1902},{"type":26,"tag":123,"props":1908,"children":1909},{},[1910],{"type":31,"value":1911},"先人脑设计 + VS Code 实现",{"type":26,"tag":123,"props":1913,"children":1914},{},[1915],{"type":31,"value":1916},"AI 易发散，最好先设计再执行",{"type":26,"tag":96,"props":1918,"children":1919},{},[1920,1925,1929,1933,1938],{"type":26,"tag":123,"props":1921,"children":1922},{},[1923],{"type":31,"value":1924},"排查线上问题/性能抖动",{"type":26,"tag":123,"props":1926,"children":1927},{"align":1755},[1928],{"type":31,"value":1875},{"type":26,"tag":123,"props":1930,"children":1931},{"align":1755},[1932],{"type":31,"value":1902},{"type":26,"tag":123,"props":1934,"children":1935},{},[1936],{"type":31,"value":1937},"VS Code + 工具链优先，AI 辅助归纳",{"type":26,"tag":123,"props":1939,"children":1940},{},[1941],{"type":31,"value":1942},"需要证据，不要“猜”",{"type":26,"tag":27,"props":1944,"children":1945},{},[1946],{"type":26,"tag":506,"props":1947,"children":1948},{},[1949],{"type":31,"value":1950},"一句话规则：",{"type":26,"tag":209,"props":1952,"children":1953},{},[1954,1959],{"type":26,"tag":213,"props":1955,"children":1956},{},[1957],{"type":31,"value":1958},"当你的改动可以用“10 条最小回归集”覆盖时，用 Cursor。",{"type":26,"tag":213,"props":1960,"children":1961},{},[1962],{"type":31,"value":1963},"当你的改动无法验证时，先别让 AI 动手。",{"type":26,"tag":567,"props":1965,"children":1966},{},[],{"type":26,"tag":81,"props":1968,"children":1970},{"id":1969},"差异拆解到底差在哪里",[1971],{"type":31,"value":1972},"差异拆解：到底差在哪里？",{"type":26,"tag":893,"props":1974,"children":1976},{"id":1975},"_1-上下文来源补全-vs-项目索引",[1977],{"type":31,"value":1978},"1) 上下文来源：补全 vs 项目索引",{"type":26,"tag":209,"props":1980,"children":1981},{},[1982,1987],{"type":26,"tag":213,"props":1983,"children":1984},{},[1985],{"type":31,"value":1986},"Copilot 更擅长：你正在写的这几行、当前文件的局部上下文",{"type":26,"tag":213,"props":1988,"children":1989},{},[1990],{"type":31,"value":1991},"Cursor 更擅长：项目级索引 + 多文件关联理解",{"type":26,"tag":27,"props":1993,"children":1994},{},[1995],{"type":31,"value":1996},"因此：",{"type":26,"tag":209,"props":1998,"children":1999},{},[2000,2005],{"type":26,"tag":213,"props":2001,"children":2002},{},[2003],{"type":31,"value":2004},"写代码片段：Copilot 速度更快",{"type":26,"tag":213,"props":2006,"children":2007},{},[2008],{"type":31,"value":2009},"改一坨工程：Cursor 更有胜算（但更需要闸门）",{"type":26,"tag":893,"props":2011,"children":2013},{"id":2012},"_2-交互方式你能不能控制范围",[2014],{"type":31,"value":2015},"2) 交互方式：你能不能控制范围",{"type":26,"tag":27,"props":2017,"children":2018},{},[2019],{"type":31,"value":2020},"范围控制的三个层级：",{"type":26,"tag":497,"props":2022,"children":2023},{},[2024,2034,2044],{"type":26,"tag":213,"props":2025,"children":2026},{},[2027,2029],{"type":31,"value":2028},"内联编辑（选中一段）→ ",{"type":26,"tag":506,"props":2030,"children":2031},{},[2032],{"type":31,"value":2033},"最强范围控制",{"type":26,"tag":213,"props":2035,"children":2036},{},[2037,2039],{"type":31,"value":2038},"Composer 多文件（先列文件清单）→ ",{"type":26,"tag":506,"props":2040,"children":2041},{},[2042],{"type":31,"value":2043},"可控但要闸门",{"type":26,"tag":213,"props":2045,"children":2046},{},[2047,2049],{"type":31,"value":2048},"大对话（泛目标）→ ",{"type":26,"tag":506,"props":2050,"children":2051},{},[2052],{"type":31,"value":2053},"最容易跑偏",{"type":26,"tag":893,"props":2055,"children":2057},{"id":2056},"_3-输出形态建议-vs-可审查的变更",[2058],{"type":31,"value":2059},"3) 输出形态：建议 vs 可审查的变更",{"type":26,"tag":27,"props":2061,"children":2062},{},[2063],{"type":31,"value":2064},"最好的 AI 输出不是“给我一段代码”，而是：",{"type":26,"tag":209,"props":2066,"children":2067},{},[2068,2073,2078],{"type":26,"tag":213,"props":2069,"children":2070},{},[2071],{"type":31,"value":2072},"改动摘要（做了什么）",{"type":26,"tag":213,"props":2074,"children":2075},{},[2076],{"type":31,"value":2077},"diff 级别的可审查变更",{"type":26,"tag":213,"props":2079,"children":2080},{},[2081],{"type":31,"value":2082},"验收步骤与回滚方案",{"type":26,"tag":567,"props":2084,"children":2085},{},[],{"type":26,"tag":81,"props":2087,"children":2089},{"id":2088},"一套可落地的团队工作流把风险关住",[2090],{"type":31,"value":2091},"一套可落地的团队工作流（把风险关住）",{"type":26,"tag":27,"props":2093,"children":2094},{},[2095],{"type":31,"value":2096},"下面这套流程，你可以直接写进团队规范：",{"type":26,"tag":893,"props":2098,"children":2100},{"id":2099},"step-1先写任务单geo-友好结构",[2101],{"type":31,"value":2102},"Step 1：先写任务单（GEO 友好结构）",{"type":26,"tag":27,"props":2104,"children":2105},{},[2106],{"type":31,"value":2107},"模板：",{"type":26,"tag":209,"props":2109,"children":2110},{},[2111,2116,2121,2126,2131,2136],{"type":26,"tag":213,"props":2112,"children":2113},{},[2114],{"type":31,"value":2115},"目标：……",{"type":26,"tag":213,"props":2117,"children":2118},{},[2119],{"type":31,"value":2120},"背景：……",{"type":26,"tag":213,"props":2122,"children":2123},{},[2124],{"type":31,"value":2125},"范围：只改这些文件/模块：……",{"type":26,"tag":213,"props":2127,"children":2128},{},[2129],{"type":31,"value":2130},"非目标：不做哪些事情：……",{"type":26,"tag":213,"props":2132,"children":2133},{},[2134],{"type":31,"value":2135},"验收：如何判断完成（可测试/可观察）：……",{"type":26,"tag":213,"props":2137,"children":2138},{},[2139],{"type":31,"value":2140},"回滚：如果失败怎么撤回：……",{"type":26,"tag":893,"props":2142,"children":2144},{"id":2143},"step-2用范围闸门限制-ai",[2145],{"type":31,"value":2146},"Step 2：用“范围闸门”限制 AI",{"type":26,"tag":209,"props":2148,"children":2149},{},[2150,2155],{"type":26,"tag":213,"props":2151,"children":2152},{},[2153],{"type":31,"value":2154},"单文件改动：优先 Cursor 内联编辑",{"type":26,"tag":213,"props":2156,"children":2157},{},[2158],{"type":31,"value":2159},"多文件改动：必须先让 AI 输出“文件清单（≤5）+ 每步验收”",{"type":26,"tag":27,"props":2161,"children":2162},{},[2163],{"type":31,"value":2164},"如果 AI 输出的文件清单超过 5 个：",{"type":26,"tag":209,"props":2166,"children":2167},{},[2168,2173],{"type":26,"tag":213,"props":2169,"children":2170},{},[2171],{"type":31,"value":2172},"不是它太强，是任务太大",{"type":26,"tag":213,"props":2174,"children":2175},{},[2176],{"type":31,"value":2177},"你需要拆任务，而不是继续推进",{"type":26,"tag":893,"props":2179,"children":2181},{"id":2180},"step-3最小回归集10-条",[2182],{"type":31,"value":2183},"Step 3：最小回归集（10 条）",{"type":26,"tag":27,"props":2185,"children":2186},{},[2187,2189,2194],{"type":31,"value":2188},"每次接受改动前必须跑（可参考：",{"type":26,"tag":49,"props":2190,"children":2191},{"href":451},[2192],{"type":31,"value":2193},"Cursor 快捷键速查表",{"type":31,"value":2195}," 里的清单）。",{"type":26,"tag":893,"props":2197,"children":2199},{"id":2198},"step-4回滚策略不用等事故才想",[2200],{"type":31,"value":2201},"Step 4：回滚策略（不用等事故才想）",{"type":26,"tag":27,"props":2203,"children":2204},{},[2205],{"type":31,"value":2206},"回滚最常见的两条路：",{"type":26,"tag":209,"props":2208,"children":2209},{},[2210,2215],{"type":26,"tag":213,"props":2211,"children":2212},{},[2213],{"type":31,"value":2214},"git 回滚 commit",{"type":26,"tag":213,"props":2216,"children":2217},{},[2218],{"type":31,"value":2219},"对关键文件保留前版本（至少能快速恢复）",{"type":26,"tag":27,"props":2221,"children":2222},{},[2223],{"type":31,"value":2224},"你需要做到：任何一轮 AI 改动都能在 5 分钟内撤回。",{"type":26,"tag":567,"props":2226,"children":2227},{},[],{"type":26,"tag":81,"props":2229,"children":2231},{"id":2230},"必交付物对比矩阵可复制",[2232],{"type":31,"value":2233},"必交付物：对比矩阵（可复制）",{"type":26,"tag":27,"props":2235,"children":2236},{},[2237],{"type":31,"value":2238},"下面这张表可以直接贴到你的团队 wiki：",{"type":26,"tag":88,"props":2240,"children":2241},{},[2242,2265],{"type":26,"tag":92,"props":2243,"children":2244},{},[2245],{"type":26,"tag":96,"props":2246,"children":2247},{},[2248,2253,2257,2261],{"type":26,"tag":100,"props":2249,"children":2250},{},[2251],{"type":31,"value":2252},"维度",{"type":26,"tag":100,"props":2254,"children":2255},{},[2256],{"type":31,"value":459},{"type":26,"tag":100,"props":2258,"children":2259},{},[2260],{"type":31,"value":1705},{"type":26,"tag":100,"props":2262,"children":2263},{},[2264],{"type":31,"value":456},{"type":26,"tag":116,"props":2266,"children":2267},{},[2268,2291,2314,2337],{"type":26,"tag":96,"props":2269,"children":2270},{},[2271,2276,2281,2286],{"type":26,"tag":123,"props":2272,"children":2273},{},[2274],{"type":31,"value":2275},"强项",{"type":26,"tag":123,"props":2277,"children":2278},{},[2279],{"type":31,"value":2280},"工具链、调试、生态",{"type":26,"tag":123,"props":2282,"children":2283},{},[2284],{"type":31,"value":2285},"补全与局部建议",{"type":26,"tag":123,"props":2287,"children":2288},{},[2289],{"type":31,"value":2290},"项目上下文、多文件落地",{"type":26,"tag":96,"props":2292,"children":2293},{},[2294,2299,2304,2309],{"type":26,"tag":123,"props":2295,"children":2296},{},[2297],{"type":31,"value":2298},"适合任务",{"type":26,"tag":123,"props":2300,"children":2301},{},[2302],{"type":31,"value":2303},"排查、调试、验证",{"type":26,"tag":123,"props":2305,"children":2306},{},[2307],{"type":31,"value":2308},"写一段、补一段",{"type":26,"tag":123,"props":2310,"children":2311},{},[2312],{"type":31,"value":2313},"改一段、改一组文件",{"type":26,"tag":96,"props":2315,"children":2316},{},[2317,2322,2327,2332],{"type":26,"tag":123,"props":2318,"children":2319},{},[2320],{"type":31,"value":2321},"最大风险",{"type":26,"tag":123,"props":2323,"children":2324},{},[2325],{"type":31,"value":2326},"无",{"type":26,"tag":123,"props":2328,"children":2329},{},[2330],{"type":31,"value":2331},"过度依赖建议",{"type":26,"tag":123,"props":2333,"children":2334},{},[2335],{"type":31,"value":2336},"范围漂移、多文件回归",{"type":26,"tag":96,"props":2338,"children":2339},{},[2340,2345,2350,2355],{"type":26,"tag":123,"props":2341,"children":2342},{},[2343],{"type":31,"value":2344},"必须搭配",{"type":26,"tag":123,"props":2346,"children":2347},{},[2348],{"type":31,"value":2349},"规范与检查",{"type":26,"tag":123,"props":2351,"children":2352},{},[2353],{"type":31,"value":2354},"代码评审",{"type":26,"tag":123,"props":2356,"children":2357},{},[2358],{"type":31,"value":2359},"闸门 + 最小回归集",{"type":26,"tag":567,"props":2361,"children":2362},{},[],{"type":26,"tag":81,"props":2364,"children":2366},{"id":2365},"失败案例多文件看似成功实际埋雷",[2367],{"type":31,"value":2368},"失败案例：多文件“看似成功”，实际埋雷",{"type":26,"tag":27,"props":2370,"children":2371},{},[2372,2377],{"type":26,"tag":506,"props":2373,"children":2374},{},[2375],{"type":31,"value":2376},"现象",{"type":31,"value":2378},"：AI 说“我已经把所有地方都改了”，你也接受了，结果上线后 404 或样式错位。",{"type":26,"tag":27,"props":2380,"children":2381},{},[2382,2387],{"type":26,"tag":506,"props":2383,"children":2384},{},[2385],{"type":31,"value":2386},"复现条件",{"type":31,"value":1199},{"type":26,"tag":209,"props":2389,"children":2390},{},[2391,2396,2401],{"type":26,"tag":213,"props":2392,"children":2393},{},[2394],{"type":31,"value":2395},"你给了一个大目标（例如“把所有按钮统一成主题色”）",{"type":26,"tag":213,"props":2397,"children":2398},{},[2399],{"type":31,"value":2400},"它改了组件、样式、甚至主题配置",{"type":26,"tag":213,"props":2402,"children":2403},{},[2404],{"type":31,"value":2405},"你没有按页面模块走一遍，直接合并",{"type":26,"tag":27,"props":2407,"children":2408},{},[2409,2414],{"type":26,"tag":506,"props":2410,"children":2411},{},[2412],{"type":31,"value":2413},"根因",{"type":31,"value":1199},{"type":26,"tag":209,"props":2416,"children":2417},{},[2418],{"type":26,"tag":213,"props":2419,"children":2420},{},[2421],{"type":31,"value":2422},"改动范围大，但验收仍按“小改动”的方式做（只看一处）",{"type":26,"tag":27,"props":2424,"children":2425},{},[2426,2431],{"type":26,"tag":506,"props":2427,"children":2428},{},[2429],{"type":31,"value":2430},"修复",{"type":31,"value":1199},{"type":26,"tag":209,"props":2433,"children":2434},{},[2435,2440,2445],{"type":26,"tag":213,"props":2436,"children":2437},{},[2438],{"type":31,"value":2439},"强制把任务拆成“模块级目标”：Hero、Feature、Pricing、Form",{"type":26,"tag":213,"props":2441,"children":2442},{},[2443],{"type":31,"value":2444},"每个模块改完就验收一次",{"type":26,"tag":213,"props":2446,"children":2447},{},[2448],{"type":31,"value":2449},"验收通过再进入下一个模块",{"type":26,"tag":567,"props":2451,"children":2452},{},[],{"type":26,"tag":81,"props":2454,"children":2456},{"id":2455},"faq",[2457],{"type":31,"value":2458},"FAQ",{"type":26,"tag":893,"props":2460,"children":2462},{"id":2461},"q1我已经用了-cursor为什么还要用-copilot",[2463],{"type":31,"value":2464},"Q1：我已经用了 Cursor，为什么还要用 Copilot？",{"type":26,"tag":27,"props":2466,"children":2467},{},[2468],{"type":31,"value":2469},"因为“补全”这种高频低风险任务，Copilot 的交互成本更低；Cursor 更适合需要解释与约束的改动。",{"type":26,"tag":893,"props":2471,"children":2473},{"id":2472},"q2什么时候应该完全不用-ai",[2474],{"type":31,"value":2475},"Q2：什么时候应该完全不用 AI？",{"type":26,"tag":27,"props":2477,"children":2478},{},[2479],{"type":31,"value":2480},"当你无法定义验收标准时。比如“更高级”“更好看”这种目标，先做信息结构与设计规则，再让 AI 帮你落地局部。",{"type":26,"tag":567,"props":2482,"children":2483},{},[],{"type":26,"tag":81,"props":2485,"children":2487},{"id":2486},"延伸阅读",[2488],{"type":31,"value":2486},{"type":26,"tag":209,"props":2490,"children":2491},{},[2492,2501,2510,2519],{"type":26,"tag":213,"props":2493,"children":2494},{},[2495,2497],{"type":31,"value":2496},"Cursor 入门：",{"type":26,"tag":49,"props":2498,"children":2499},{"href":540},[2500],{"type":31,"value":543},{"type":26,"tag":213,"props":2502,"children":2503},{},[2504,2506],{"type":31,"value":2505},"Cursor 进阶：",{"type":26,"tag":49,"props":2507,"children":2508},{"href":551},[2509],{"type":31,"value":554},{"type":26,"tag":213,"props":2511,"children":2512},{},[2513,2515],{"type":31,"value":2514},"规则配置：",{"type":26,"tag":49,"props":2516,"children":2517},{"href":562},[2518],{"type":31,"value":565},{"type":26,"tag":213,"props":2520,"children":2521},{},[2522,2524],{"type":31,"value":2523},"Copilot 实战：",{"type":26,"tag":49,"props":2525,"children":2527},{"href":2526},"/topics/ai/github-copilot-tips",[2528],{"type":31,"value":2529},"GitHub Copilot 实用技巧",{"title":7,"searchDepth":434,"depth":434,"links":2531},[2532,2533,2534,2539,2545,2546,2547,2551],{"id":1677,"depth":437,"text":1680},{"id":1727,"depth":437,"text":1730},{"id":1969,"depth":437,"text":1972,"children":2535},[2536,2537,2538],{"id":1975,"depth":434,"text":1978},{"id":2012,"depth":434,"text":2015},{"id":2056,"depth":434,"text":2059},{"id":2088,"depth":437,"text":2091,"children":2540},[2541,2542,2543,2544],{"id":2099,"depth":434,"text":2102},{"id":2143,"depth":434,"text":2146},{"id":2180,"depth":434,"text":2183},{"id":2198,"depth":434,"text":2201},{"id":2230,"depth":437,"text":2233},{"id":2365,"depth":437,"text":2368},{"id":2455,"depth":437,"text":2458,"children":2548},[2549,2550],{"id":2461,"depth":434,"text":2464},{"id":2472,"depth":434,"text":2475},{"id":2486,"depth":437,"text":2486},"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":2556,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":2557,"description":2558,"date":2559,"topic":5,"author":11,"tags":2560,"image":2565,"featured":2566,"readingTime":1618,"body":2567,"_type":443,"_id":3215,"_source":445,"_file":3216,"_stem":3217,"_extension":448},"/topics/ai/ai-debugging-troubleshooting-guide","AI 辅助调试与问题排查：让 AI 成为你的调试搭档","深入探讨如何利用 AI 工具提升调试效率，包括错误信息分析、日志解读、性能问题定位、复杂 bug 排查等实战场景，构建 AI 驱动的调试工作流。","2026-01-18",[2561,2562,2563,460,2564],"AI 调试","问题排查","Debug","错误处理","/images/topics/ai/ai-debugging-guide.jpg",true,{"type":23,"children":2568,"toc":3186},[2569,2575,2581,2586,2591,2596,2602,2608,2613,2621,2649,2657,2680,2686,2696,2705,2713,2721,2754,2762,2792,2805,2813,2818,2826,2834,2845,2851,2859,2870,2878,2887,2893,2899,2904,2913,2919,2924,2933,2939,2945,2954,2960,2969,2975,2986,2992,2998,3007,3013,3022,3028,3034,3042,3048,3057,3065,3073,3076,3082,3087,3106,3118,3121,3127,3132,3141,3146,3149,3155,3160,3178],{"type":26,"tag":81,"props":2570,"children":2572},{"id":2571},"ai-辅助调试与问题排查",[2573],{"type":31,"value":2574},"AI 辅助调试与问题排查",{"type":26,"tag":81,"props":2576,"children":2578},{"id":2577},"引言调试的痛与-ai-的解药",[2579],{"type":31,"value":2580},"引言：调试的痛与 AI 的解药",{"type":26,"tag":27,"props":2582,"children":2583},{},[2584],{"type":31,"value":2585},"调试是每个程序员的日常，也是最消耗时间和精力的工作之一。我们都有过这样的经历：盯着一个莫名其妙的错误信息，翻遍 Stack Overflow，尝试各种方案，几个小时后才发现是一个愚蠢的拼写错误。",{"type":26,"tag":27,"props":2587,"children":2588},{},[2589],{"type":31,"value":2590},"AI 工具的出现，正在改变调试的方式。不是替代你的思考，而是加速你的分析过程——帮你快速理解错误、缩小排查范围、验证假设。",{"type":26,"tag":27,"props":2592,"children":2593},{},[2594],{"type":31,"value":2595},"这篇文章分享我在实际项目中使用 AI 辅助调试的经验和方法论。",{"type":26,"tag":81,"props":2597,"children":2599},{"id":2598},"第一部分建立-ai-调试的思维模型",[2600],{"type":31,"value":2601},"第一部分：建立 AI 调试的思维模型",{"type":26,"tag":893,"props":2603,"children":2605},{"id":2604},"_11-ai-在调试中的角色",[2606],{"type":31,"value":2607},"1.1 AI 在调试中的角色",{"type":26,"tag":27,"props":2609,"children":2610},{},[2611],{"type":31,"value":2612},"把 AI 想象成一个经验丰富但不了解你项目的高级工程师。它：",{"type":26,"tag":27,"props":2614,"children":2615},{},[2616],{"type":26,"tag":506,"props":2617,"children":2618},{},[2619],{"type":31,"value":2620},"擅长的事情：",{"type":26,"tag":209,"props":2622,"children":2623},{},[2624,2629,2634,2639,2644],{"type":26,"tag":213,"props":2625,"children":2626},{},[2627],{"type":31,"value":2628},"解读错误信息的含义",{"type":26,"tag":213,"props":2630,"children":2631},{},[2632],{"type":31,"value":2633},"提供可能的原因列表",{"type":26,"tag":213,"props":2635,"children":2636},{},[2637],{"type":31,"value":2638},"给出排查方向建议",{"type":26,"tag":213,"props":2640,"children":2641},{},[2642],{"type":31,"value":2643},"解释复杂的技术概念",{"type":26,"tag":213,"props":2645,"children":2646},{},[2647],{"type":31,"value":2648},"生成调试代码片段",{"type":26,"tag":27,"props":2650,"children":2651},{},[2652],{"type":26,"tag":506,"props":2653,"children":2654},{},[2655],{"type":31,"value":2656},"不擅长的事情：",{"type":26,"tag":209,"props":2658,"children":2659},{},[2660,2665,2670,2675],{"type":26,"tag":213,"props":2661,"children":2662},{},[2663],{"type":31,"value":2664},"了解你的业务逻辑",{"type":26,"tag":213,"props":2666,"children":2667},{},[2668],{"type":31,"value":2669},"知道你的代码历史",{"type":26,"tag":213,"props":2671,"children":2672},{},[2673],{"type":31,"value":2674},"理解项目特定的约定",{"type":26,"tag":213,"props":2676,"children":2677},{},[2678],{"type":31,"value":2679},"做出架构级判断",{"type":26,"tag":893,"props":2681,"children":2683},{"id":2682},"_12-有效提问的结构",[2684],{"type":31,"value":2685},"1.2 有效提问的结构",{"type":26,"tag":234,"props":2687,"children":2691},{"code":2688,"language":443,"meta":7,"className":2689},"## 高效的调试提问模板\n\n**问题描述**\n[简洁描述遇到的问题]\n\n**错误信息**\n",[2690],"language-markdown",[2692],{"type":26,"tag":242,"props":2693,"children":2694},{"__ignoreMap":7},[2695],{"type":31,"value":2688},{"type":26,"tag":27,"props":2697,"children":2698},{},[2699],{"type":26,"tag":2700,"props":2701,"children":2702},"span",{},[2703],{"type":31,"value":2704},"完整的错误信息，不要截断",{"type":26,"tag":234,"props":2706,"children":2708},{"code":2707},"\n**相关代码**\n```javascript\n[精简但完整的相关代码]\n",[2709],{"type":26,"tag":242,"props":2710,"children":2711},{"__ignoreMap":7},[2712],{"type":31,"value":2707},{"type":26,"tag":27,"props":2714,"children":2715},{},[2716],{"type":26,"tag":506,"props":2717,"children":2718},{},[2719],{"type":31,"value":2720},"环境信息",{"type":26,"tag":209,"props":2722,"children":2723},{},[2724,2734,2744],{"type":26,"tag":213,"props":2725,"children":2726},{},[2727,2729],{"type":31,"value":2728},"运行环境：",{"type":26,"tag":2700,"props":2730,"children":2731},{},[2732],{"type":31,"value":2733},"Node 版本/浏览器版本",{"type":26,"tag":213,"props":2735,"children":2736},{},[2737,2739],{"type":31,"value":2738},"框架版本：",{"type":26,"tag":2700,"props":2740,"children":2741},{},[2742],{"type":31,"value":2743},"相关框架版本",{"type":26,"tag":213,"props":2745,"children":2746},{},[2747,2749],{"type":31,"value":2748},"操作系统：",{"type":26,"tag":2700,"props":2750,"children":2751},{},[2752],{"type":31,"value":2753},"如果相关",{"type":26,"tag":27,"props":2755,"children":2756},{},[2757],{"type":26,"tag":506,"props":2758,"children":2759},{},[2760],{"type":31,"value":2761},"已尝试的方案",{"type":26,"tag":209,"props":2763,"children":2764},{},[2765,2779],{"type":26,"tag":213,"props":2766,"children":2767},{},[2768,2773,2774],{"type":26,"tag":2700,"props":2769,"children":2770},{},[2771],{"type":31,"value":2772},"方案1",{"type":31,"value":1199},{"type":26,"tag":2700,"props":2775,"children":2776},{},[2777],{"type":31,"value":2778},"结果",{"type":26,"tag":213,"props":2780,"children":2781},{},[2782,2787,2788],{"type":26,"tag":2700,"props":2783,"children":2784},{},[2785],{"type":31,"value":2786},"方案2",{"type":31,"value":1199},{"type":26,"tag":2700,"props":2789,"children":2790},{},[2791],{"type":31,"value":2778},{"type":26,"tag":27,"props":2793,"children":2794},{},[2795,2800],{"type":26,"tag":506,"props":2796,"children":2797},{},[2798],{"type":31,"value":2799},"期望的结果",{"type":26,"tag":2700,"props":2801,"children":2802},{},[2803],{"type":31,"value":2804},"描述期望的行为",{"type":26,"tag":234,"props":2806,"children":2808},{"code":2807},"\n### 1.3 分级调试策略\n\n",[2809],{"type":26,"tag":242,"props":2810,"children":2811},{"__ignoreMap":7},[2812],{"type":31,"value":2807},{"type":26,"tag":27,"props":2814,"children":2815},{},[2816],{"type":31,"value":2817},"┌───────────────────────────────────────────────────────────┐\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":234,"props":2819,"children":2821},{"code":2820},"\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",[2822],{"type":26,"tag":242,"props":2823,"children":2824},{"__ignoreMap":7},[2825],{"type":31,"value":2820},{"type":26,"tag":27,"props":2827,"children":2828},{},[2829],{"type":26,"tag":506,"props":2830,"children":2831},{},[2832],{"type":31,"value":2833},"场景 2：Vue 响应式警告",{"type":26,"tag":234,"props":2835,"children":2840},{"code":2836,"language":2837,"meta":7,"className":2838},"// 警告信息：\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",[2839],"language-typescript",[2841],{"type":26,"tag":242,"props":2842,"children":2843},{"__ignoreMap":7},[2844],{"type":31,"value":2836},{"type":26,"tag":893,"props":2846,"children":2848},{"id":2847},"_22-后端错误分析",[2849],{"type":31,"value":2850},"2.2 后端错误分析",{"type":26,"tag":27,"props":2852,"children":2853},{},[2854],{"type":26,"tag":506,"props":2855,"children":2856},{},[2857],{"type":31,"value":2858},"场景 1：Node.js 内存问题",{"type":26,"tag":234,"props":2860,"children":2865},{"code":2861,"language":2862,"meta":7,"className":2863},"// 错误信息：\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",[2864],"language-javascript",[2866],{"type":26,"tag":242,"props":2867,"children":2868},{"__ignoreMap":7},[2869],{"type":31,"value":2861},{"type":26,"tag":27,"props":2871,"children":2872},{},[2873],{"type":26,"tag":506,"props":2874,"children":2875},{},[2876],{"type":31,"value":2877},"场景 2：数据库连接问题",{"type":26,"tag":234,"props":2879,"children":2882},{"code":2880,"language":2837,"meta":7,"className":2881},"// 错误信息：\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",[2839],[2883],{"type":26,"tag":242,"props":2884,"children":2885},{"__ignoreMap":7},[2886],{"type":31,"value":2880},{"type":26,"tag":81,"props":2888,"children":2890},{"id":2889},"第三部分日志分析与问题定位",[2891],{"type":31,"value":2892},"第三部分：日志分析与问题定位",{"type":26,"tag":893,"props":2894,"children":2896},{"id":2895},"_31-结构化日志分析",[2897],{"type":31,"value":2898},"3.1 结构化日志分析",{"type":26,"tag":27,"props":2900,"children":2901},{},[2902],{"type":31,"value":2903},"当面对大量日志时，让 AI 帮你快速定位问题：",{"type":26,"tag":234,"props":2905,"children":2908},{"code":2906,"language":2862,"meta":7,"className":2907},"// 提问示例：\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",[2864],[2909],{"type":26,"tag":242,"props":2910,"children":2911},{"__ignoreMap":7},[2912],{"type":31,"value":2906},{"type":26,"tag":893,"props":2914,"children":2916},{"id":2915},"_32-创建调试日志",[2917],{"type":31,"value":2918},"3.2 创建调试日志",{"type":26,"tag":27,"props":2920,"children":2921},{},[2922],{"type":31,"value":2923},"让 AI 帮你生成调试用的日志代码：",{"type":26,"tag":234,"props":2925,"children":2928},{"code":2926,"language":2837,"meta":7,"className":2927},"// 请求：\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",[2839],[2929],{"type":26,"tag":242,"props":2930,"children":2931},{"__ignoreMap":7},[2932],{"type":31,"value":2926},{"type":26,"tag":81,"props":2934,"children":2936},{"id":2935},"第四部分性能问题排查",[2937],{"type":31,"value":2938},"第四部分：性能问题排查",{"type":26,"tag":893,"props":2940,"children":2942},{"id":2941},"_41-前端性能分析",[2943],{"type":31,"value":2944},"4.1 前端性能分析",{"type":26,"tag":234,"props":2946,"children":2949},{"code":2947,"language":2837,"meta":7,"className":2948},"// 场景：页面加载慢，需要分析原因\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",[2839],[2950],{"type":26,"tag":242,"props":2951,"children":2952},{"__ignoreMap":7},[2953],{"type":31,"value":2947},{"type":26,"tag":893,"props":2955,"children":2957},{"id":2956},"_42-内存泄漏排查",[2958],{"type":31,"value":2959},"4.2 内存泄漏排查",{"type":26,"tag":234,"props":2961,"children":2964},{"code":2962,"language":2837,"meta":7,"className":2963},"// 场景：应用运行一段时间后变卡\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",[2839],[2965],{"type":26,"tag":242,"props":2966,"children":2967},{"__ignoreMap":7},[2968],{"type":31,"value":2962},{"type":26,"tag":893,"props":2970,"children":2972},{"id":2971},"_43-数据库查询优化",[2973],{"type":31,"value":2974},"4.3 数据库查询优化",{"type":26,"tag":234,"props":2976,"children":2981},{"code":2977,"language":2978,"meta":7,"className":2979},"-- 场景：查询很慢，让 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",[2980],"language-sql",[2982],{"type":26,"tag":242,"props":2983,"children":2984},{"__ignoreMap":7},[2985],{"type":31,"value":2977},{"type":26,"tag":81,"props":2987,"children":2989},{"id":2988},"第五部分复杂-bug-排查",[2990],{"type":31,"value":2991},"第五部分：复杂 Bug 排查",{"type":26,"tag":893,"props":2993,"children":2995},{"id":2994},"_51-竞态条件",[2996],{"type":31,"value":2997},"5.1 竞态条件",{"type":26,"tag":234,"props":2999,"children":3002},{"code":3000,"language":2837,"meta":7,"className":3001},"// 场景：偶发的数据不一致问题\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",[2839],[3003],{"type":26,"tag":242,"props":3004,"children":3005},{"__ignoreMap":7},[3006],{"type":31,"value":3000},{"type":26,"tag":893,"props":3008,"children":3010},{"id":3009},"_52-分布式系统问题",[3011],{"type":31,"value":3012},"5.2 分布式系统问题",{"type":26,"tag":234,"props":3014,"children":3017},{"code":3015,"language":2837,"meta":7,"className":3016},"// 场景：微服务间的数据不一致\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",[2839],[3018],{"type":26,"tag":242,"props":3019,"children":3020},{"__ignoreMap":7},[3021],{"type":31,"value":3015},{"type":26,"tag":81,"props":3023,"children":3025},{"id":3024},"第六部分ai-调试工作流",[3026],{"type":31,"value":3027},"第六部分：AI 调试工作流",{"type":26,"tag":893,"props":3029,"children":3031},{"id":3030},"_61-我的调试流程",[3032],{"type":31,"value":3033},"6.1 我的调试流程",{"type":26,"tag":234,"props":3035,"children":3037},{"code":3036},"┌────────────────────────────────────────────────────────────┐\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",[3038],{"type":26,"tag":242,"props":3039,"children":3040},{"__ignoreMap":7},[3041],{"type":31,"value":3036},{"type":26,"tag":893,"props":3043,"children":3045},{"id":3044},"_62-调试对话模板",[3046],{"type":31,"value":3047},"6.2 调试对话模板",{"type":26,"tag":234,"props":3049,"children":3052},{"code":3050,"language":443,"meta":7,"className":3051},"## 第一轮：问题描述\n\n我遇到了一个问题：[简述问题]\n\n错误信息：\n",[2690],[3053],{"type":26,"tag":242,"props":3054,"children":3055},{"__ignoreMap":7},[3056],{"type":31,"value":3050},{"type":26,"tag":27,"props":3058,"children":3059},{},[3060],{"type":26,"tag":2700,"props":3061,"children":3062},{},[3063],{"type":31,"value":3064},"粘贴完整错误",{"type":26,"tag":234,"props":3066,"children":3068},{"code":3067},"\n相关代码：\n```javascript\n[粘贴代码]\n",[3069],{"type":26,"tag":242,"props":3070,"children":3071},{"__ignoreMap":7},[3072],{"type":31,"value":3067},{"type":26,"tag":567,"props":3074,"children":3075},{},[],{"type":26,"tag":81,"props":3077,"children":3079},{"id":3078},"第二轮补充信息",[3080],{"type":31,"value":3081},"第二轮：补充信息",{"type":26,"tag":27,"props":3083,"children":3084},{},[3085],{"type":31,"value":3086},"根据你的建议，我添加了日志，发现：",{"type":26,"tag":209,"props":3088,"children":3089},{},[3090,3098],{"type":26,"tag":213,"props":3091,"children":3092},{},[3093],{"type":26,"tag":2700,"props":3094,"children":3095},{},[3096],{"type":31,"value":3097},"发现 1",{"type":26,"tag":213,"props":3099,"children":3100},{},[3101],{"type":26,"tag":2700,"props":3102,"children":3103},{},[3104],{"type":31,"value":3105},"发现 2",{"type":26,"tag":27,"props":3107,"children":3108},{},[3109,3111,3116],{"type":31,"value":3110},"这是否说明问题出在 ",{"type":26,"tag":2700,"props":3112,"children":3113},{},[3114],{"type":31,"value":3115},"你的猜测",{"type":31,"value":3117},"？",{"type":26,"tag":567,"props":3119,"children":3120},{},[],{"type":26,"tag":81,"props":3122,"children":3124},{"id":3123},"第三轮确认修复",[3125],{"type":31,"value":3126},"第三轮：确认修复",{"type":26,"tag":27,"props":3128,"children":3129},{},[3130],{"type":31,"value":3131},"我按照你的建议修改了代码：",{"type":26,"tag":234,"props":3133,"children":3136},{"code":3134,"language":2862,"meta":7,"className":3135},"[粘贴修改后的代码]\n",[2864],[3137],{"type":26,"tag":242,"props":3138,"children":3139},{"__ignoreMap":7},[3140],{"type":31,"value":3134},{"type":26,"tag":27,"props":3142,"children":3143},{},[3144],{"type":31,"value":3145},"请确认这个修复是否正确，以及是否有其他潜在问题。",{"type":26,"tag":567,"props":3147,"children":3148},{},[],{"type":26,"tag":81,"props":3150,"children":3152},{"id":3151},"第四轮预防",[3153],{"type":31,"value":3154},"第四轮：预防",{"type":26,"tag":27,"props":3156,"children":3157},{},[3158],{"type":31,"value":3159},"这个问题已解决。请建议：",{"type":26,"tag":497,"props":3161,"children":3162},{},[3163,3168,3173],{"type":26,"tag":213,"props":3164,"children":3165},{},[3166],{"type":31,"value":3167},"如何防止类似问题再次发生？",{"type":26,"tag":213,"props":3169,"children":3170},{},[3171],{"type":31,"value":3172},"应该添加什么测试用例？",{"type":26,"tag":213,"props":3174,"children":3175},{},[3176],{"type":31,"value":3177},"有什么最佳实践可以参考？",{"type":26,"tag":234,"props":3179,"children":3181},{"code":3180},"\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",[3182],{"type":26,"tag":242,"props":3183,"children":3184},{"__ignoreMap":7},[3185],{"type":31,"value":3180},{"title":7,"searchDepth":434,"depth":434,"links":3187},[3188,3189,3190,3195,3199,3204,3208,3212,3213,3214],{"id":2571,"depth":437,"text":2574},{"id":2577,"depth":437,"text":2580},{"id":2598,"depth":437,"text":2601,"children":3191},[3192,3193,3194],{"id":2604,"depth":434,"text":2607},{"id":2682,"depth":434,"text":2685},{"id":2847,"depth":434,"text":2850},{"id":2889,"depth":437,"text":2892,"children":3196},[3197,3198],{"id":2895,"depth":434,"text":2898},{"id":2915,"depth":434,"text":2918},{"id":2935,"depth":437,"text":2938,"children":3200},[3201,3202,3203],{"id":2941,"depth":434,"text":2944},{"id":2956,"depth":434,"text":2959},{"id":2971,"depth":434,"text":2974},{"id":2988,"depth":437,"text":2991,"children":3205},[3206,3207],{"id":2994,"depth":434,"text":2997},{"id":3009,"depth":434,"text":3012},{"id":3024,"depth":437,"text":3027,"children":3209},[3210,3211],{"id":3030,"depth":434,"text":3033},{"id":3044,"depth":434,"text":3047},{"id":3078,"depth":437,"text":3081},{"id":3123,"depth":437,"text":3126},{"id":3151,"depth":437,"text":3154},"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":3219,"image":17,"imageQuery":18,"pexelsPhotoId":19,"pexelsUrl":20,"featured":6,"readingTime":21,"body":3220,"_type":443,"_id":444,"_source":445,"_file":446,"_stem":447,"_extension":448},[13,14,15,16],{"type":23,"children":3221,"toc":3540},[3222,3226,3230,3234,3258,3262,3346,3350,3354,3358,3373,3377,3385,3389,3393,3397,3401,3412,3416,3420,3424,3443,3447,3451,3455,3470,3474,3478,3482,3486,3501,3505,3509],{"type":26,"tag":27,"props":3223,"children":3224},{},[3225],{"type":31,"value":32},{"type":26,"tag":27,"props":3227,"children":3228},{},[3229],{"type":31,"value":37},{"type":26,"tag":27,"props":3231,"children":3232},{},[3233],{"type":31,"value":42},{"type":26,"tag":27,"props":3235,"children":3236},{},[3237,3238,3242,3243,3247,3248,3252,3253,3257],{"type":31,"value":47},{"type":26,"tag":49,"props":3239,"children":3240},{"href":51},[3241],{"type":31,"value":54},{"type":31,"value":56},{"type":26,"tag":49,"props":3244,"children":3245},{"href":59},[3246],{"type":31,"value":62},{"type":31,"value":56},{"type":26,"tag":49,"props":3249,"children":3250},{"href":66},[3251],{"type":31,"value":69},{"type":31,"value":71},{"type":26,"tag":49,"props":3254,"children":3255},{"href":74},[3256],{"type":31,"value":77},{"type":31,"value":79},{"type":26,"tag":81,"props":3259,"children":3260},{"id":83},[3261],{"type":31,"value":86},{"type":26,"tag":88,"props":3263,"children":3264},{},[3265,3283],{"type":26,"tag":92,"props":3266,"children":3267},{},[3268],{"type":26,"tag":96,"props":3269,"children":3270},{},[3271,3275,3279],{"type":26,"tag":100,"props":3272,"children":3273},{},[3274],{"type":31,"value":104},{"type":26,"tag":100,"props":3276,"children":3277},{},[3278],{"type":31,"value":109},{"type":26,"tag":100,"props":3280,"children":3281},{},[3282],{"type":31,"value":114},{"type":26,"tag":116,"props":3284,"children":3285},{},[3286,3301,3316,3331],{"type":26,"tag":96,"props":3287,"children":3288},{},[3289,3293,3297],{"type":26,"tag":123,"props":3290,"children":3291},{},[3292],{"type":31,"value":127},{"type":26,"tag":123,"props":3294,"children":3295},{},[3296],{"type":31,"value":132},{"type":26,"tag":123,"props":3298,"children":3299},{},[3300],{"type":31,"value":137},{"type":26,"tag":96,"props":3302,"children":3303},{},[3304,3308,3312],{"type":26,"tag":123,"props":3305,"children":3306},{},[3307],{"type":31,"value":145},{"type":26,"tag":123,"props":3309,"children":3310},{},[3311],{"type":31,"value":150},{"type":26,"tag":123,"props":3313,"children":3314},{},[3315],{"type":31,"value":155},{"type":26,"tag":96,"props":3317,"children":3318},{},[3319,3323,3327],{"type":26,"tag":123,"props":3320,"children":3321},{},[3322],{"type":31,"value":163},{"type":26,"tag":123,"props":3324,"children":3325},{},[3326],{"type":31,"value":168},{"type":26,"tag":123,"props":3328,"children":3329},{},[3330],{"type":31,"value":173},{"type":26,"tag":96,"props":3332,"children":3333},{},[3334,3338,3342],{"type":26,"tag":123,"props":3335,"children":3336},{},[3337],{"type":31,"value":181},{"type":26,"tag":123,"props":3339,"children":3340},{},[3341],{"type":31,"value":186},{"type":26,"tag":123,"props":3343,"children":3344},{},[3345],{"type":31,"value":191},{"type":26,"tag":27,"props":3347,"children":3348},{},[3349],{"type":31,"value":196},{"type":26,"tag":81,"props":3351,"children":3352},{"id":199},[3353],{"type":31,"value":202},{"type":26,"tag":27,"props":3355,"children":3356},{},[3357],{"type":31,"value":207},{"type":26,"tag":209,"props":3359,"children":3360},{},[3361,3365,3369],{"type":26,"tag":213,"props":3362,"children":3363},{},[3364],{"type":31,"value":217},{"type":26,"tag":213,"props":3366,"children":3367},{},[3368],{"type":31,"value":222},{"type":26,"tag":213,"props":3370,"children":3371},{},[3372],{"type":31,"value":227},{"type":26,"tag":27,"props":3374,"children":3375},{},[3376],{"type":31,"value":232},{"type":26,"tag":234,"props":3378,"children":3380},{"className":3379,"code":238,"language":239,"meta":7},[237],[3381],{"type":26,"tag":242,"props":3382,"children":3383},{"__ignoreMap":7},[3384],{"type":31,"value":238},{"type":26,"tag":27,"props":3386,"children":3387},{},[3388],{"type":31,"value":250},{"type":26,"tag":81,"props":3390,"children":3391},{"id":253},[3392],{"type":31,"value":256},{"type":26,"tag":27,"props":3394,"children":3395},{},[3396],{"type":31,"value":261},{"type":26,"tag":27,"props":3398,"children":3399},{},[3400],{"type":31,"value":266},{"type":26,"tag":209,"props":3402,"children":3403},{},[3404,3408],{"type":26,"tag":213,"props":3405,"children":3406},{},[3407],{"type":31,"value":274},{"type":26,"tag":213,"props":3409,"children":3410},{},[3411],{"type":31,"value":279},{"type":26,"tag":27,"props":3413,"children":3414},{},[3415],{"type":31,"value":284},{"type":26,"tag":81,"props":3417,"children":3418},{"id":287},[3419],{"type":31,"value":290},{"type":26,"tag":27,"props":3421,"children":3422},{},[3423],{"type":31,"value":295},{"type":26,"tag":209,"props":3425,"children":3426},{},[3427,3431,3435,3439],{"type":26,"tag":213,"props":3428,"children":3429},{},[3430],{"type":31,"value":303},{"type":26,"tag":213,"props":3432,"children":3433},{},[3434],{"type":31,"value":308},{"type":26,"tag":213,"props":3436,"children":3437},{},[3438],{"type":31,"value":313},{"type":26,"tag":213,"props":3440,"children":3441},{},[3442],{"type":31,"value":318},{"type":26,"tag":27,"props":3444,"children":3445},{},[3446],{"type":31,"value":323},{"type":26,"tag":81,"props":3448,"children":3449},{"id":326},[3450],{"type":31,"value":329},{"type":26,"tag":27,"props":3452,"children":3453},{},[3454],{"type":31,"value":334},{"type":26,"tag":209,"props":3456,"children":3457},{},[3458,3462,3466],{"type":26,"tag":213,"props":3459,"children":3460},{},[3461],{"type":31,"value":342},{"type":26,"tag":213,"props":3463,"children":3464},{},[3465],{"type":31,"value":347},{"type":26,"tag":213,"props":3467,"children":3468},{},[3469],{"type":31,"value":352},{"type":26,"tag":27,"props":3471,"children":3472},{},[3473],{"type":31,"value":357},{"type":26,"tag":27,"props":3475,"children":3476},{},[3477],{"type":31,"value":362},{"type":26,"tag":81,"props":3479,"children":3480},{"id":365},[3481],{"type":31,"value":368},{"type":26,"tag":27,"props":3483,"children":3484},{},[3485],{"type":31,"value":373},{"type":26,"tag":209,"props":3487,"children":3488},{},[3489,3493,3497],{"type":26,"tag":213,"props":3490,"children":3491},{},[3492],{"type":31,"value":381},{"type":26,"tag":213,"props":3494,"children":3495},{},[3496],{"type":31,"value":386},{"type":26,"tag":213,"props":3498,"children":3499},{},[3500],{"type":31,"value":391},{"type":26,"tag":27,"props":3502,"children":3503},{},[3504],{"type":31,"value":396},{"type":26,"tag":27,"props":3506,"children":3507},{},[3508],{"type":31,"value":401},{"type":26,"tag":209,"props":3510,"children":3511},{},[3512,3519,3526,3533],{"type":26,"tag":213,"props":3513,"children":3514},{},[3515],{"type":26,"tag":49,"props":3516,"children":3517},{"href":51},[3518],{"type":31,"value":54},{"type":26,"tag":213,"props":3520,"children":3521},{},[3522],{"type":26,"tag":49,"props":3523,"children":3524},{"href":59},[3525],{"type":31,"value":62},{"type":26,"tag":213,"props":3527,"children":3528},{},[3529],{"type":26,"tag":49,"props":3530,"children":3531},{"href":66},[3532],{"type":31,"value":69},{"type":26,"tag":213,"props":3534,"children":3535},{},[3536],{"type":26,"tag":49,"props":3537,"children":3538},{"href":74},[3539],{"type":31,"value":77},{"title":7,"searchDepth":434,"depth":434,"links":3541},[3542,3543,3544,3545,3546,3547],{"id":83,"depth":437,"text":86},{"id":199,"depth":437,"text":202},{"id":253,"depth":437,"text":256},{"id":287,"depth":437,"text":290},{"id":326,"depth":437,"text":329},{"id":365,"depth":437,"text":368},1778637710142]