[{"data":1,"prerenderedAt":4412},["ShallowReactive",2],{"article-/topics/ai/ai-agent-run-ledger-audit-model":3,"related-ai":917,"content-query-kg9aowL9RC":3685},{"_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":911,"_id":912,"_source":913,"_file":914,"_stem":915,"_extension":916},"/topics/ai/ai-agent-run-ledger-audit-model","ai",false,"","AI agent Run Ledger 审计模型：一次任务要记录哪些事实，才能支持追责、计费和复盘","AI agent 的审计不能只靠日志。本文讲清 Run Ledger 应记录的事实、计费字段、状态变化、决策依据和审计链设计。","2026-05-07","HTMLPAGE 团队",[13,14,15,16],"AI agent","Run Ledger","审计模型","工程实践","/images/articles/ai-agent-run-ledger-audit-model-featured.jpg","audit finance analytics laptop office",13156204,"https://www.pexels.com/photo/pen-calculator-and-magnifying-glass-on-documents-13156204/",20,{"type":23,"children":24,"toc":896},"root",[25,33,38,75,82,172,177,183,270,275,280,286,291,311,316,329,334,340,345,358,363,368,415,420,426,431,454,459,472,478,483,493,498,503,512,517,523,528,589,594,600,605,692,697,703,708,731,736,742,850,855,860,865],{"type":26,"tag":27,"props":28,"children":29},"element","p",{},[30],{"type":31,"value":32},"text","很多团队以为有 trace、有日志，就已经能审计 AI agent 了。实际做过事故复盘、费用核对或权限追责后会发现，这还不够。日志擅长记录过程事件，trace 擅长串起调用链，但真正用于“对账”和“追责”的，通常需要一套更稳定的事实账本。",{"type":26,"tag":27,"props":34,"children":35},{},[36],{"type":31,"value":37},"Run Ledger 的意义，不是把所有细节都重复记一遍，而是沉淀那些必须可验证、可引用、可对账的事实。",{"type":26,"tag":27,"props":39,"children":40},{},[41,43,50,52,58,59,65,67,73],{"type":31,"value":42},"建议先配合 ",{"type":26,"tag":44,"props":45,"children":47},"a",{"href":46},"/topics/ai/ai-agent-observability-tracing-playbook",[48],{"type":31,"value":49},"AI Agent 可观测性设计",{"type":31,"value":51},"、",{"type":26,"tag":44,"props":53,"children":55},{"href":54},"/topics/ai/ai-agent-product-metrics-success-dashboard",[56],{"type":31,"value":57},"AI agent 产品成功指标",{"type":31,"value":51},{"type":26,"tag":44,"props":60,"children":62},{"href":61},"/topics/ai/ai-agent-policy-engine-rule-layering",[63],{"type":31,"value":64},"AI agent Policy Engine 规则分层",{"type":31,"value":66}," 和 ",{"type":26,"tag":44,"props":68,"children":70},{"href":69},"/topics/ai/ai-agent-cost-control-budgeting",[71],{"type":31,"value":72},"AI Agent 成本控制与预算治理",{"type":31,"value":74}," 一起看。",{"type":26,"tag":76,"props":77,"children":79},"h2",{"id":78},"先给结论ledger-记录事实不记录猜测",[80],{"type":31,"value":81},"先给结论：Ledger 记录事实，不记录猜测",{"type":26,"tag":83,"props":84,"children":85},"table",{},[86,105],{"type":26,"tag":87,"props":88,"children":89},"thead",{},[90],{"type":26,"tag":91,"props":92,"children":93},"tr",{},[94,100],{"type":26,"tag":95,"props":96,"children":97},"th",{},[98],{"type":31,"value":99},"记录类型",{"type":26,"tag":95,"props":101,"children":102},{},[103],{"type":31,"value":104},"应不应该进 ledger",{"type":26,"tag":106,"props":107,"children":108},"tbody",{},[109,123,135,147,160],{"type":26,"tag":91,"props":110,"children":111},{},[112,118],{"type":26,"tag":113,"props":114,"children":115},"td",{},[116],{"type":31,"value":117},"谁发起了任务",{"type":26,"tag":113,"props":119,"children":120},{},[121],{"type":31,"value":122},"应该",{"type":26,"tag":91,"props":124,"children":125},{},[126,131],{"type":26,"tag":113,"props":127,"children":128},{},[129],{"type":31,"value":130},"哪个版本的 prompt / model / tool 被使用",{"type":26,"tag":113,"props":132,"children":133},{},[134],{"type":31,"value":122},{"type":26,"tag":91,"props":136,"children":137},{},[138,143],{"type":26,"tag":113,"props":139,"children":140},{},[141],{"type":31,"value":142},"哪个步骤真的产生了外部副作用",{"type":26,"tag":113,"props":144,"children":145},{},[146],{"type":31,"value":122},{"type":26,"tag":91,"props":148,"children":149},{},[150,155],{"type":26,"tag":113,"props":151,"children":152},{},[153],{"type":31,"value":154},"模型当时“可能在想什么”",{"type":26,"tag":113,"props":156,"children":157},{},[158],{"type":31,"value":159},"不应该",{"type":26,"tag":91,"props":161,"children":162},{},[163,168],{"type":26,"tag":113,"props":164,"children":165},{},[166],{"type":31,"value":167},"某个建议看起来是否合理",{"type":26,"tag":113,"props":169,"children":170},{},[171],{"type":31,"value":159},{"type":26,"tag":27,"props":173,"children":174},{},[175],{"type":31,"value":176},"Ledger 的价值在于可核对。不能核对的东西，更适合进日志或 artifact。",{"type":26,"tag":76,"props":178,"children":180},{"id":179},"一一次-run-至少要记-5-组事实",[181],{"type":31,"value":182},"一、一次 Run 至少要记 5 组事实",{"type":26,"tag":83,"props":184,"children":185},{},[186,202],{"type":26,"tag":87,"props":187,"children":188},{},[189],{"type":26,"tag":91,"props":190,"children":191},{},[192,197],{"type":26,"tag":95,"props":193,"children":194},{},[195],{"type":31,"value":196},"事实组",{"type":26,"tag":95,"props":198,"children":199},{},[200],{"type":31,"value":201},"记录什么",{"type":26,"tag":106,"props":203,"children":204},{},[205,218,231,244,257],{"type":26,"tag":91,"props":206,"children":207},{},[208,213],{"type":26,"tag":113,"props":209,"children":210},{},[211],{"type":31,"value":212},"发起事实",{"type":26,"tag":113,"props":214,"children":215},{},[216],{"type":31,"value":217},"user、tenant、taskType、runId",{"type":26,"tag":91,"props":219,"children":220},{},[221,226],{"type":26,"tag":113,"props":222,"children":223},{},[224],{"type":31,"value":225},"配置事实",{"type":26,"tag":113,"props":227,"children":228},{},[229],{"type":31,"value":230},"promptVersion、modelRoute、toolSetVersion",{"type":26,"tag":91,"props":232,"children":233},{},[234,239],{"type":26,"tag":113,"props":235,"children":236},{},[237],{"type":31,"value":238},"执行事实",{"type":26,"tag":113,"props":240,"children":241},{},[242],{"type":31,"value":243},"状态迁移、工具调用、policy decision",{"type":26,"tag":91,"props":245,"children":246},{},[247,252],{"type":26,"tag":113,"props":248,"children":249},{},[250],{"type":31,"value":251},"副作用事实",{"type":26,"tag":113,"props":253,"children":254},{},[255],{"type":31,"value":256},"写入、外发、扣费、审批结果",{"type":26,"tag":91,"props":258,"children":259},{},[260,265],{"type":26,"tag":113,"props":261,"children":262},{},[263],{"type":31,"value":264},"结算事实",{"type":26,"tag":113,"props":266,"children":267},{},[268],{"type":31,"value":269},"token、工具费用、重试成本、最终结果",{"type":26,"tag":27,"props":271,"children":272},{},[273],{"type":31,"value":274},"如果缺任意一组，后面就会在“这次到底发生了什么”上扯不清。",{"type":26,"tag":27,"props":276,"children":277},{},[278],{"type":31,"value":279},"如果系统已经有 artifact、policy engine、checkpoint 和 billing 服务，这 5 组事实最好都能落到统一的 run identity 之下，而不是分散在各个子系统各自命名的 id 里。否则跨系统对账时，第一步就会卡在“这些记录到底是不是同一次 Run”。",{"type":26,"tag":76,"props":281,"children":283},{"id":282},"二ledger-记录的是业务主事实不是所有-debug-细节",[284],{"type":31,"value":285},"二、Ledger 记录的是业务主事实，不是所有 debug 细节",{"type":26,"tag":27,"props":287,"children":288},{},[289],{"type":31,"value":290},"一个好用的 ledger 应该很稳定。不要把临时 debug 字段全部灌进去，否则：",{"type":26,"tag":292,"props":293,"children":294},"ul",{},[295,301,306],{"type":26,"tag":296,"props":297,"children":298},"li",{},[299],{"type":31,"value":300},"结构会频繁变动",{"type":26,"tag":296,"props":302,"children":303},{},[304],{"type":31,"value":305},"报表和审计会越来越脆",{"type":26,"tag":296,"props":307,"children":308},{},[309],{"type":31,"value":310},"历史 run 的兼容成本会变高",{"type":26,"tag":27,"props":312,"children":313},{},[314],{"type":31,"value":315},"更合适的做法是：",{"type":26,"tag":292,"props":317,"children":318},{},[319,324],{"type":26,"tag":296,"props":320,"children":321},{},[322],{"type":31,"value":323},"debug 细节放 trace/logs",{"type":26,"tag":296,"props":325,"children":326},{},[327],{"type":31,"value":328},"可追责事实放 ledger",{"type":26,"tag":27,"props":330,"children":331},{},[332],{"type":31,"value":333},"一个实用判断是：这条记录未来是否可能被财务、风控、客服、审计、平台工程同时引用？如果会，它更像 ledger；如果只在排查某次故障时短期有用，它更像 trace。",{"type":26,"tag":76,"props":335,"children":337},{"id":336},"三ledger-里的字段要能支持计费和审计双用途",[338],{"type":31,"value":339},"三、Ledger 里的字段要能支持计费和审计双用途",{"type":26,"tag":27,"props":341,"children":342},{},[343],{"type":31,"value":344},"例如：",{"type":26,"tag":346,"props":347,"children":352},"pre",{"className":348,"code":350,"language":351,"meta":7},[349],"language-json","{\n  \"runId\": \"run_123\",\n  \"tenantId\": \"team_001\",\n  \"taskType\": \"content_review\",\n  \"promptVersion\": \"review-agent-v5\",\n  \"model\": \"gpt-x-large\",\n  \"toolCalls\": 4,\n  \"tokenInput\": 5200,\n  \"tokenOutput\": 1300,\n  \"sideEffects\": [\n    {\n      \"type\": \"status_update\",\n      \"targetId\": \"doc_789\",\n      \"result\": \"success\"\n    }\n  ],\n  \"billing\": {\n    \"modelCost\": 0.18,\n    \"toolCost\": 0.03,\n    \"retryCost\": 0.01\n  },\n  \"finalOutcome\": \"completed\"\n}\n","json",[353],{"type":26,"tag":354,"props":355,"children":356},"code",{"__ignoreMap":7},[357],{"type":31,"value":350},{"type":26,"tag":27,"props":359,"children":360},{},[361],{"type":31,"value":362},"这样的结构既能做费用归集，也能解释“为什么这个 run 计费更多”。",{"type":26,"tag":27,"props":364,"children":365},{},[366],{"type":31,"value":367},"再进一步，ledger 里的关键事实最好带上引用关系，例如：",{"type":26,"tag":292,"props":369,"children":370},{},[371,382,393,404],{"type":26,"tag":296,"props":372,"children":373},{},[374,380],{"type":26,"tag":354,"props":375,"children":377},{"className":376},[],[378],{"type":31,"value":379},"traceId",{"type":31,"value":381},"：对接可观测链路",{"type":26,"tag":296,"props":383,"children":384},{},[385,391],{"type":26,"tag":354,"props":386,"children":388},{"className":387},[],[389],{"type":31,"value":390},"artifactIds",{"type":31,"value":392},"：对接证据和草稿",{"type":26,"tag":296,"props":394,"children":395},{},[396,402],{"type":26,"tag":354,"props":397,"children":399},{"className":398},[],[400],{"type":31,"value":401},"policyDecisionIds",{"type":31,"value":403},"：对接规则决策",{"type":26,"tag":296,"props":405,"children":406},{},[407,413],{"type":26,"tag":354,"props":408,"children":410},{"className":409},[],[411],{"type":31,"value":412},"checkpointIds",{"type":31,"value":414},"：对接恢复节点",{"type":26,"tag":27,"props":416,"children":417},{},[418],{"type":31,"value":419},"这样 ledger 不会变成一套孤立账本，而是整个运行系统的“可核对索引”。",{"type":26,"tag":76,"props":421,"children":423},{"id":422},"四policy-和审批结果也值得进-ledger",[424],{"type":31,"value":425},"四、Policy 和审批结果也值得进 Ledger",{"type":26,"tag":27,"props":427,"children":428},{},[429],{"type":31,"value":430},"一旦任务涉及高风险动作，仅记录最终外发或写入是不够的。还要记录：",{"type":26,"tag":292,"props":432,"children":433},{},[434,439,444,449],{"type":26,"tag":296,"props":435,"children":436},{},[437],{"type":31,"value":438},"哪条 policy 触发了拦截或放行",{"type":26,"tag":296,"props":440,"children":441},{},[442],{"type":31,"value":443},"是否有人工审批",{"type":26,"tag":296,"props":445,"children":446},{},[447],{"type":31,"value":448},"审批结论是什么",{"type":26,"tag":296,"props":450,"children":451},{},[452],{"type":31,"value":453},"是否用了 exception / 豁免规则",{"type":26,"tag":27,"props":455,"children":456},{},[457],{"type":31,"value":458},"否则出现争议时，系统只能证明“事情发生了”，却不能证明“为什么允许发生”。",{"type":26,"tag":27,"props":460,"children":461},{},[462,464,470],{"type":31,"value":463},"对高风险动作来说，建议把“谁批准了、批准时看到什么、批准后放行了什么”分成独立事实写入 ledger，而不是只写一个 ",{"type":26,"tag":354,"props":465,"children":467},{"className":466},[],[468],{"type":31,"value":469},"approved=true",{"type":31,"value":471},"。审批一旦成为责任节点，细节就必须可核对。",{"type":26,"tag":76,"props":473,"children":475},{"id":474},"五ledger-最适合-append-only而不是频繁覆盖更新",[476],{"type":31,"value":477},"五、Ledger 最适合 append-only，而不是频繁覆盖更新",{"type":26,"tag":27,"props":479,"children":480},{},[481],{"type":31,"value":482},"审计账本最怕被反复重写。一个更稳的思路是 append-only 事件：",{"type":26,"tag":346,"props":484,"children":488},{"className":485,"code":487,"language":31,"meta":7},[486],"language-text","RUN_CREATED\nPOLICY_EVALUATED\nTOOL_EXECUTED\nSIDE_EFFECT_RECORDED\nBILLING_FINALIZED\nRUN_CLOSED\n",[489],{"type":26,"tag":354,"props":490,"children":491},{"__ignoreMap":7},[492],{"type":31,"value":487},{"type":26,"tag":27,"props":494,"children":495},{},[496],{"type":31,"value":497},"最终报表可以从这些事实归并出来，但原始事实不要轻易覆盖。否则你会失去“当时系统到底记录了什么”的证据链。",{"type":26,"tag":27,"props":499,"children":500},{},[501],{"type":31,"value":502},"很多团队还会再补一层 correction event，而不是直接改旧记录。例如：",{"type":26,"tag":346,"props":504,"children":507},{"className":505,"code":506,"language":31,"meta":7},[486],"BILLING_FINALIZED\nBILLING_CORRECTED\nSIDE_EFFECT_RECONCILED\n",[508],{"type":26,"tag":354,"props":509,"children":510},{"__ignoreMap":7},[511],{"type":31,"value":506},{"type":26,"tag":27,"props":513,"children":514},{},[515],{"type":31,"value":516},"这样历史事实仍然保留，只是后续通过更正事件来修正口径。对账系统通常更喜欢这种做法，因为它更容易还原时间线。",{"type":26,"tag":76,"props":518,"children":520},{"id":519},"六ledger-最好支持分阶段对账而不是等月底一次算总账",[521],{"type":31,"value":522},"六、Ledger 最好支持分阶段对账，而不是等月底一次算总账",{"type":26,"tag":27,"props":524,"children":525},{},[526],{"type":31,"value":527},"如果 run ledger 只在 Run 完成后一次性汇总，任何中途失败、补执行、人工接管都很容易被漏算。更稳的方式是分阶段对账：",{"type":26,"tag":83,"props":529,"children":530},{},[531,547],{"type":26,"tag":87,"props":532,"children":533},{},[534],{"type":26,"tag":91,"props":535,"children":536},{},[537,542],{"type":26,"tag":95,"props":538,"children":539},{},[540],{"type":31,"value":541},"阶段",{"type":26,"tag":95,"props":543,"children":544},{},[545],{"type":31,"value":546},"对账内容",{"type":26,"tag":106,"props":548,"children":549},{},[550,563,576],{"type":26,"tag":91,"props":551,"children":552},{},[553,558],{"type":26,"tag":113,"props":554,"children":555},{},[556],{"type":31,"value":557},"运行中",{"type":26,"tag":113,"props":559,"children":560},{},[561],{"type":31,"value":562},"token、工具调用、checkpoint 次数",{"type":26,"tag":91,"props":564,"children":565},{},[566,571],{"type":26,"tag":113,"props":567,"children":568},{},[569],{"type":31,"value":570},"副作用发生后",{"type":26,"tag":113,"props":572,"children":573},{},[574],{"type":31,"value":575},"外发、写入、审批结果",{"type":26,"tag":91,"props":577,"children":578},{},[579,584],{"type":26,"tag":113,"props":580,"children":581},{},[582],{"type":31,"value":583},"Run 关闭后",{"type":26,"tag":113,"props":585,"children":586},{},[587],{"type":31,"value":588},"总成本、最终结果、异常更正",{"type":26,"tag":27,"props":590,"children":591},{},[592],{"type":31,"value":593},"分阶段对账的价值是：问题会更早暴露，而不是月底才发现总账不对。",{"type":26,"tag":76,"props":595,"children":597},{"id":596},"七上线后要看-ledger-完整性指标",[598],{"type":31,"value":599},"七、上线后要看 ledger 完整性指标",{"type":26,"tag":27,"props":601,"children":602},{},[603],{"type":31,"value":604},"建议持续观察：",{"type":26,"tag":83,"props":606,"children":607},{},[608,624],{"type":26,"tag":87,"props":609,"children":610},{},[611],{"type":26,"tag":91,"props":612,"children":613},{},[614,619],{"type":26,"tag":95,"props":615,"children":616},{},[617],{"type":31,"value":618},"指标",{"type":26,"tag":95,"props":620,"children":621},{},[622],{"type":31,"value":623},"用途",{"type":26,"tag":106,"props":625,"children":626},{},[627,640,653,666,679],{"type":26,"tag":91,"props":628,"children":629},{},[630,635],{"type":26,"tag":113,"props":631,"children":632},{},[633],{"type":31,"value":634},"trace 与 ledger 关联完整率",{"type":26,"tag":113,"props":636,"children":637},{},[638],{"type":31,"value":639},"判断索引链路是否完整",{"type":26,"tag":91,"props":641,"children":642},{},[643,648],{"type":26,"tag":113,"props":644,"children":645},{},[646],{"type":31,"value":647},"side effect 无 ledger 记录数",{"type":26,"tag":113,"props":649,"children":650},{},[651],{"type":31,"value":652},"判断关键事实是否漏记",{"type":26,"tag":91,"props":654,"children":655},{},[656,661],{"type":26,"tag":113,"props":657,"children":658},{},[659],{"type":31,"value":660},"billing correction 占比",{"type":26,"tag":113,"props":662,"children":663},{},[664],{"type":31,"value":665},"判断计费初始记录是否稳定",{"type":26,"tag":91,"props":667,"children":668},{},[669,674],{"type":26,"tag":113,"props":670,"children":671},{},[672],{"type":31,"value":673},"审批事实缺失率",{"type":26,"tag":113,"props":675,"children":676},{},[677],{"type":31,"value":678},"判断高风险动作是否留痕充分",{"type":26,"tag":91,"props":680,"children":681},{},[682,687],{"type":26,"tag":113,"props":683,"children":684},{},[685],{"type":31,"value":686},"append-only 更正比例",{"type":26,"tag":113,"props":688,"children":689},{},[690],{"type":31,"value":691},"判断账本是否被过度修补",{"type":26,"tag":27,"props":693,"children":694},{},[695],{"type":31,"value":696},"如果 side effect 已发生，但 ledger 没记到，这不是报表问题，而是审计断链问题。",{"type":26,"tag":76,"props":698,"children":700},{"id":699},"八失败案例日志能看过程但月底账单对不上-run",[701],{"type":31,"value":702},"八、失败案例：日志能看过程，但月底账单对不上 Run",{"type":26,"tag":27,"props":704,"children":705},{},[706],{"type":31,"value":707},"一个团队的 agent 日志非常详细，trace 也完整，但月底做费用分析时，无法把账单和具体 run 对上。原因是：",{"type":26,"tag":292,"props":709,"children":710},{},[711,716,721,726],{"type":26,"tag":296,"props":712,"children":713},{},[714],{"type":31,"value":715},"token 使用量分散在日志里",{"type":26,"tag":296,"props":717,"children":718},{},[719],{"type":31,"value":720},"工具调用费用没有汇总",{"type":26,"tag":296,"props":722,"children":723},{},[724],{"type":31,"value":725},"重试导致的额外成本没有单独计入",{"type":26,"tag":296,"props":727,"children":728},{},[729],{"type":31,"value":730},"某些人工审批后的补执行也没和原 run 关联",{"type":26,"tag":27,"props":732,"children":733},{},[734],{"type":31,"value":735},"修复后，他们增加了 run ledger，把 billing、policy、side effects 和 final outcome 统一写入 append-only 账本。之后费用复盘终于能落到具体任务，而不只是看平台总账单。",{"type":26,"tag":76,"props":737,"children":739},{"id":738},"九run-ledger-checklist",[740],{"type":31,"value":741},"九、Run Ledger Checklist",{"type":26,"tag":292,"props":743,"children":746},{"className":744},[745],"contains-task-list",[747,760,769,778,787,796,805,814,823,832,841],{"type":26,"tag":296,"props":748,"children":751},{"className":749},[750],"task-list-item",[752,758],{"type":26,"tag":753,"props":754,"children":757},"input",{"disabled":755,"type":756},true,"checkbox",[],{"type":31,"value":759}," 是否区分发起、配置、执行、副作用、结算五组事实",{"type":26,"tag":296,"props":761,"children":763},{"className":762},[750],[764,767],{"type":26,"tag":753,"props":765,"children":766},{"disabled":755,"type":756},[],{"type":31,"value":768}," ledger 是否只记录可核对事实",{"type":26,"tag":296,"props":770,"children":772},{"className":771},[750],[773,776],{"type":26,"tag":753,"props":774,"children":775},{"disabled":755,"type":756},[],{"type":31,"value":777}," 全系统是否围绕统一 run identity 对账",{"type":26,"tag":296,"props":779,"children":781},{"className":780},[750],[782,785],{"type":26,"tag":753,"props":783,"children":784},{"disabled":755,"type":756},[],{"type":31,"value":786}," token、工具费、重试费是否能落到 run 级别",{"type":26,"tag":296,"props":788,"children":790},{"className":789},[750],[791,794],{"type":26,"tag":753,"props":792,"children":793},{"disabled":755,"type":756},[],{"type":31,"value":795}," policy 与审批结果是否可追溯",{"type":26,"tag":296,"props":797,"children":799},{"className":798},[750],[800,803],{"type":26,"tag":753,"props":801,"children":802},{"disabled":755,"type":756},[],{"type":31,"value":804}," ledger 记录是否能关联 traceId、artifactIds、checkpointIds",{"type":26,"tag":296,"props":806,"children":808},{"className":807},[750],[809,812],{"type":26,"tag":753,"props":810,"children":811},{"disabled":755,"type":756},[],{"type":31,"value":813}," 是否采用 append-only 事实记录",{"type":26,"tag":296,"props":815,"children":817},{"className":816},[750],[818,821],{"type":26,"tag":753,"props":819,"children":820},{"disabled":755,"type":756},[],{"type":31,"value":822}," 是否通过 correction event 而不是直接改旧事实",{"type":26,"tag":296,"props":824,"children":826},{"className":825},[750],[827,830],{"type":26,"tag":753,"props":828,"children":829},{"disabled":755,"type":756},[],{"type":31,"value":831}," 是否能把 ledger 与 trace / artifact 关联起来",{"type":26,"tag":296,"props":833,"children":835},{"className":834},[750],[836,839],{"type":26,"tag":753,"props":837,"children":838},{"disabled":755,"type":756},[],{"type":31,"value":840}," 是否支持运行中、完成后两阶段以上对账",{"type":26,"tag":296,"props":842,"children":844},{"className":843},[750],[845,848],{"type":26,"tag":753,"props":846,"children":847},{"disabled":755,"type":756},[],{"type":31,"value":849}," 历史 ledger schema 是否有兼容策略",{"type":26,"tag":76,"props":851,"children":853},{"id":852},"结语",[854],{"type":31,"value":852},{"type":26,"tag":27,"props":856,"children":857},{},[858],{"type":31,"value":859},"AI agent 的 Run Ledger，不是为了多做一套日志，而是为了让“发生了什么、为什么这么发生、花了多少钱、谁批准了它”都能在事后被核对。系统一旦进入真实业务，这套账本就会变得比你想的更重要。",{"type":26,"tag":27,"props":861,"children":862},{},[863],{"type":31,"value":864},"延伸阅读：",{"type":26,"tag":292,"props":866,"children":867},{},[868,875,882,889],{"type":26,"tag":296,"props":869,"children":870},{},[871],{"type":26,"tag":44,"props":872,"children":873},{"href":46},[874],{"type":31,"value":49},{"type":26,"tag":296,"props":876,"children":877},{},[878],{"type":26,"tag":44,"props":879,"children":880},{"href":61},[881],{"type":31,"value":64},{"type":26,"tag":296,"props":883,"children":884},{},[885],{"type":26,"tag":44,"props":886,"children":887},{"href":54},[888],{"type":31,"value":57},{"type":26,"tag":296,"props":890,"children":891},{},[892],{"type":26,"tag":44,"props":893,"children":894},{"href":69},[895],{"type":31,"value":72},{"title":7,"searchDepth":897,"depth":897,"links":898},3,[899,901,902,903,904,905,906,907,908,909,910],{"id":78,"depth":900,"text":81},2,{"id":179,"depth":900,"text":182},{"id":282,"depth":900,"text":285},{"id":336,"depth":900,"text":339},{"id":422,"depth":900,"text":425},{"id":474,"depth":900,"text":477},{"id":519,"depth":900,"text":522},{"id":596,"depth":900,"text":599},{"id":699,"depth":900,"text":702},{"id":738,"depth":900,"text":741},{"id":852,"depth":900,"text":852},"markdown","content:topics:ai:ai-agent-run-ledger-audit-model.md","content","topics/ai/ai-agent-run-ledger-audit-model.md","topics/ai/ai-agent-run-ledger-audit-model","md",[918,2073,3023],{"_path":919,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":920,"description":921,"date":922,"topic":5,"author":11,"tags":923,"image":929,"imageAlt":930,"pexelsPhotoId":931,"pexelsUrl":932,"readingTime":933,"body":934,"_type":911,"_id":2070,"_source":913,"_file":2071,"_stem":2072,"_extension":916},"/topics/ai/cursor-keyboard-shortcuts-cheatsheet","Cursor 快捷键速查表（macOS/Windows）：从“会用”到“能提效”的 10 个工作流","把 Cursor 常用快捷键按任务分组（查代码、改代码、多文件、对话、审查与回滚），给出可直接照抄的工作流与最小回归清单，避免“快捷键背了也没变快”。","2026-03-02",[924,925,926,927,928],"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":935,"toc":2044},[936,941,959,964,993,998,1034,1038,1044,1049,1082,1087,1110,1113,1119,1124,1342,1351,1354,1360,1367,1386,1394,1415,1420,1426,1441,1472,1477,1490,1496,1515,1533,1541,1546,1552,1557,1578,1586,1592,1597,1620,1625,1631,1644,1650,1668,1686,1692,1703,1721,1727,1738,1744,1749,1792,1795,1801,1809,1862,1865,1871,1877,1882,1887,1910,1928,1933,1958,1961,1967,1973,1978,1984,1989,1995,2000,2003,2009],{"type":26,"tag":27,"props":937,"children":938},{},[939],{"type":31,"value":940},"如果你在搜“Cursor 快捷键”，你大概率不是想背一张表，而是想解决这类问题：",{"type":26,"tag":292,"props":942,"children":943},{},[944,949,954],{"type":26,"tag":296,"props":945,"children":946},{},[947],{"type":31,"value":948},"为什么我用了 AI，还是很慢？（对话来回太多、改动不可控）",{"type":26,"tag":296,"props":950,"children":951},{},[952],{"type":31,"value":953},"为什么它“看起来懂了”，却改错文件/改出回归？（上下文与范围没锁住）",{"type":26,"tag":296,"props":955,"children":956},{},[957],{"type":31,"value":958},"多文件改动怎么做得安全？（验收、回滚、最小回归集）",{"type":26,"tag":27,"props":960,"children":961},{},[962],{"type":31,"value":963},"这篇文章给你两份东西：",{"type":26,"tag":965,"props":966,"children":967},"ol",{},[968,981],{"type":26,"tag":296,"props":969,"children":970},{},[971,973,979],{"type":31,"value":972},"一张",{"type":26,"tag":974,"props":975,"children":976},"strong",{},[977],{"type":31,"value":978},"按任务分组",{"type":31,"value":980},"的快捷键表（不是按功能堆在一起）",{"type":26,"tag":296,"props":982,"children":983},{},[984,986,991],{"type":31,"value":985},"一套“从需求到落地”的",{"type":26,"tag":974,"props":987,"children":988},{},[989],{"type":31,"value":990},"最小闭环工作流",{"type":31,"value":992},"（每一步都有快捷键）",{"type":26,"tag":27,"props":994,"children":995},{},[996],{"type":31,"value":997},"想看系统玩法：",{"type":26,"tag":292,"props":999,"children":1000},{},[1001,1012,1023],{"type":26,"tag":296,"props":1002,"children":1003},{},[1004,1006],{"type":31,"value":1005},"入门教程看：",{"type":26,"tag":44,"props":1007,"children":1009},{"href":1008},"/topics/ai/cursor-tutorial",[1010],{"type":31,"value":1011},"Cursor 使用教程（2026）",{"type":26,"tag":296,"props":1013,"children":1014},{},[1015,1017],{"type":31,"value":1016},"进阶玩法看：",{"type":26,"tag":44,"props":1018,"children":1020},{"href":1019},"/topics/ai/cursor-editor-guide",[1021],{"type":31,"value":1022},"Cursor 编辑器深度玩法",{"type":26,"tag":296,"props":1024,"children":1025},{},[1026,1028],{"type":31,"value":1027},"规则与忽略看：",{"type":26,"tag":44,"props":1029,"children":1031},{"href":1030},"/topics/ai/cursor-rules-cursorrules",[1032],{"type":31,"value":1033},"Cursor Rules 与 .cursorrules",{"type":26,"tag":1035,"props":1036,"children":1037},"hr",{},[],{"type":26,"tag":76,"props":1039,"children":1041},{"id":1040},"先给结论提效不是按得快而是闭环更短",[1042],{"type":31,"value":1043},"先给结论：提效不是“按得快”，而是“闭环更短”",{"type":26,"tag":27,"props":1045,"children":1046},{},[1047],{"type":31,"value":1048},"你可以把 Cursor 的快捷键理解为 3 条流水线：",{"type":26,"tag":292,"props":1050,"children":1051},{},[1052,1062,1072],{"type":26,"tag":296,"props":1053,"children":1054},{},[1055,1060],{"type":26,"tag":974,"props":1056,"children":1057},{},[1058],{"type":31,"value":1059},"改一小段",{"type":31,"value":1061},"（内联编辑）：把改动限制在一个函数/一段样式",{"type":26,"tag":296,"props":1063,"children":1064},{},[1065,1070],{"type":26,"tag":974,"props":1066,"children":1067},{},[1068],{"type":31,"value":1069},"改一组文件",{"type":31,"value":1071},"（Composer）：把改动限制在一组明确文件，并要求输出 diff + 验收点",{"type":26,"tag":296,"props":1073,"children":1074},{},[1075,1080],{"type":26,"tag":974,"props":1076,"children":1077},{},[1078],{"type":31,"value":1079},"聊清楚再动手",{"type":31,"value":1081},"（侧边对话）：先对齐目标、范围、验收、回滚",{"type":26,"tag":27,"props":1083,"children":1084},{},[1085],{"type":31,"value":1086},"当你觉得“它乱改/改太大”时，往往不是快捷键没记住，而是缺了两件事：",{"type":26,"tag":292,"props":1088,"children":1089},{},[1090,1100],{"type":26,"tag":296,"props":1091,"children":1092},{},[1093,1095],{"type":31,"value":1094},"没有在动手前锁定",{"type":26,"tag":974,"props":1096,"children":1097},{},[1098],{"type":31,"value":1099},"范围",{"type":26,"tag":296,"props":1101,"children":1102},{},[1103,1105],{"type":31,"value":1104},"没有在接受改动前准备",{"type":26,"tag":974,"props":1106,"children":1107},{},[1108],{"type":31,"value":1109},"验收/回滚",{"type":26,"tag":1035,"props":1111,"children":1112},{},[],{"type":26,"tag":76,"props":1114,"children":1116},{"id":1115},"快捷键速查表按任务分组",[1117],{"type":31,"value":1118},"快捷键速查表（按任务分组）",{"type":26,"tag":27,"props":1120,"children":1121},{},[1122],{"type":31,"value":1123},"说明：下表按“你正在做什么”组织，而不是按“功能名字”组织。不同版本快捷键可能略有差异，但核心逻辑一致。",{"type":26,"tag":83,"props":1125,"children":1126},{},[1127,1153],{"type":26,"tag":87,"props":1128,"children":1129},{},[1130],{"type":26,"tag":91,"props":1131,"children":1132},{},[1133,1138,1143,1148],{"type":26,"tag":95,"props":1134,"children":1135},{},[1136],{"type":31,"value":1137},"任务",{"type":26,"tag":95,"props":1139,"children":1140},{},[1141],{"type":31,"value":1142},"macOS",{"type":26,"tag":95,"props":1144,"children":1145},{},[1146],{"type":31,"value":1147},"Windows",{"type":26,"tag":95,"props":1149,"children":1150},{},[1151],{"type":31,"value":1152},"你该在什么时候用",{"type":26,"tag":106,"props":1154,"children":1155},{},[1156,1187,1218,1249,1280,1311],{"type":26,"tag":91,"props":1157,"children":1158},{},[1159,1164,1173,1182],{"type":26,"tag":113,"props":1160,"children":1161},{},[1162],{"type":31,"value":1163},"改一小段（最安全）",{"type":26,"tag":113,"props":1165,"children":1166},{},[1167],{"type":26,"tag":354,"props":1168,"children":1170},{"className":1169},[],[1171],{"type":31,"value":1172},"Cmd + K",{"type":26,"tag":113,"props":1174,"children":1175},{},[1176],{"type":26,"tag":354,"props":1177,"children":1179},{"className":1178},[],[1180],{"type":31,"value":1181},"Ctrl + K",{"type":26,"tag":113,"props":1183,"children":1184},{},[1185],{"type":31,"value":1186},"只想改一个函数/一段 CSS，不想动别的",{"type":26,"tag":91,"props":1188,"children":1189},{},[1190,1195,1204,1213],{"type":26,"tag":113,"props":1191,"children":1192},{},[1193],{"type":31,"value":1194},"打开 AI 对话（先对齐再动手）",{"type":26,"tag":113,"props":1196,"children":1197},{},[1198],{"type":26,"tag":354,"props":1199,"children":1201},{"className":1200},[],[1202],{"type":31,"value":1203},"Cmd + L",{"type":26,"tag":113,"props":1205,"children":1206},{},[1207],{"type":26,"tag":354,"props":1208,"children":1210},{"className":1209},[],[1211],{"type":31,"value":1212},"Ctrl + L",{"type":26,"tag":113,"props":1214,"children":1215},{},[1216],{"type":31,"value":1217},"需要澄清目标、制定步骤、给验收点",{"type":26,"tag":91,"props":1219,"children":1220},{},[1221,1226,1235,1244],{"type":26,"tag":113,"props":1222,"children":1223},{},[1224],{"type":31,"value":1225},"多文件编辑（有组织地改一组文件）",{"type":26,"tag":113,"props":1227,"children":1228},{},[1229],{"type":26,"tag":354,"props":1230,"children":1232},{"className":1231},[],[1233],{"type":31,"value":1234},"Cmd + I",{"type":26,"tag":113,"props":1236,"children":1237},{},[1238],{"type":26,"tag":354,"props":1239,"children":1241},{"className":1240},[],[1242],{"type":31,"value":1243},"Ctrl + I",{"type":26,"tag":113,"props":1245,"children":1246},{},[1247],{"type":31,"value":1248},"改动涉及多个文件：组件+样式+测试",{"type":26,"tag":91,"props":1250,"children":1251},{},[1252,1257,1266,1275],{"type":26,"tag":113,"props":1253,"children":1254},{},[1255],{"type":31,"value":1256},"把选中代码加入对话上下文",{"type":26,"tag":113,"props":1258,"children":1259},{},[1260],{"type":26,"tag":354,"props":1261,"children":1263},{"className":1262},[],[1264],{"type":31,"value":1265},"Cmd + Shift + L",{"type":26,"tag":113,"props":1267,"children":1268},{},[1269],{"type":26,"tag":354,"props":1270,"children":1272},{"className":1271},[],[1273],{"type":31,"value":1274},"Ctrl + Shift + L",{"type":26,"tag":113,"props":1276,"children":1277},{},[1278],{"type":31,"value":1279},"让 AI 只看你选的片段（降低噪音）",{"type":26,"tag":91,"props":1281,"children":1282},{},[1283,1288,1297,1306],{"type":26,"tag":113,"props":1284,"children":1285},{},[1286],{"type":31,"value":1287},"接受当前建议",{"type":26,"tag":113,"props":1289,"children":1290},{},[1291],{"type":26,"tag":354,"props":1292,"children":1294},{"className":1293},[],[1295],{"type":31,"value":1296},"Cmd + Y",{"type":26,"tag":113,"props":1298,"children":1299},{},[1300],{"type":26,"tag":354,"props":1301,"children":1303},{"className":1302},[],[1304],{"type":31,"value":1305},"Ctrl + Y",{"type":26,"tag":113,"props":1307,"children":1308},{},[1309],{"type":31,"value":1310},"你已经准备好验收/回滚，并确认改动范围",{"type":26,"tag":91,"props":1312,"children":1313},{},[1314,1319,1328,1337],{"type":26,"tag":113,"props":1315,"children":1316},{},[1317],{"type":31,"value":1318},"拒绝当前建议",{"type":26,"tag":113,"props":1320,"children":1321},{},[1322],{"type":26,"tag":354,"props":1323,"children":1325},{"className":1324},[],[1326],{"type":31,"value":1327},"Cmd + N",{"type":26,"tag":113,"props":1329,"children":1330},{},[1331],{"type":26,"tag":354,"props":1332,"children":1334},{"className":1333},[],[1335],{"type":31,"value":1336},"Ctrl + N",{"type":26,"tag":113,"props":1338,"children":1339},{},[1340],{"type":31,"value":1341},"改得太大、改错方向，立刻收手",{"type":26,"tag":1343,"props":1344,"children":1345},"blockquote",{},[1346],{"type":26,"tag":27,"props":1347,"children":1348},{},[1349],{"type":31,"value":1350},"小技巧：把“改一小段”当默认路径。只有当你能清晰写出“会改哪几类文件、怎么验收”时再进入多文件。",{"type":26,"tag":1035,"props":1352,"children":1353},{},[],{"type":26,"tag":76,"props":1355,"children":1357},{"id":1356},"_10-个可直接照抄的提效工作流每个都能闭环",[1358],{"type":31,"value":1359},"10 个可直接照抄的提效工作流（每个都能闭环）",{"type":26,"tag":1361,"props":1362,"children":1364},"h3",{"id":1363},"工作流-1需求计划小步改新手最稳",[1365],{"type":31,"value":1366},"工作流 1：需求→计划→小步改（新手最稳）",{"type":26,"tag":965,"props":1368,"children":1369},{},[1370,1381],{"type":26,"tag":296,"props":1371,"children":1372},{},[1373,1379],{"type":26,"tag":354,"props":1374,"children":1376},{"className":1375},[],[1377],{"type":31,"value":1378},"Cmd/Ctrl + L",{"type":31,"value":1380}," 打开对话",{"type":26,"tag":296,"props":1382,"children":1383},{},[1384],{"type":31,"value":1385},"先发这段（可复制）：",{"type":26,"tag":1343,"props":1387,"children":1388},{},[1389],{"type":26,"tag":27,"props":1390,"children":1391},{},[1392],{"type":31,"value":1393},"目标：……\n范围：只修改以下文件/模块：……\n非目标：……（明确不做）\n验收：……（可测试/可手动检查）\n输出格式：先给计划，再逐步执行；每一步写出 diff 摘要。",{"type":26,"tag":965,"props":1395,"children":1396},{"start":897},[1397,1402],{"type":26,"tag":296,"props":1398,"children":1399},{},[1400],{"type":31,"value":1401},"让 AI 先给“计划（3~6 步）”，你确认后再执行",{"type":26,"tag":296,"props":1403,"children":1404},{},[1405,1407,1413],{"type":31,"value":1406},"任何一步涉及改代码：优先回到编辑区，选中片段用 ",{"type":26,"tag":354,"props":1408,"children":1410},{"className":1409},[],[1411],{"type":31,"value":1412},"Cmd/Ctrl + K",{"type":31,"value":1414}," 小步改",{"type":26,"tag":27,"props":1416,"children":1417},{},[1418],{"type":31,"value":1419},"为什么有效：你把“想法”变成了“可执行约束”，这就是 GEO（面向 AI/模型的可理解结构）。",{"type":26,"tag":1361,"props":1421,"children":1423},{"id":1422},"工作流-2只改一个函数高频低风险",[1424],{"type":31,"value":1425},"工作流 2：只改一个函数（高频、低风险）",{"type":26,"tag":292,"props":1427,"children":1428},{},[1429],{"type":26,"tag":296,"props":1430,"children":1431},{},[1432,1434,1439],{"type":31,"value":1433},"选中函数 → ",{"type":26,"tag":354,"props":1435,"children":1437},{"className":1436},[],[1438],{"type":31,"value":1412},{"type":31,"value":1440}," → 输入指令：",{"type":26,"tag":1343,"props":1442,"children":1443},{},[1444,1449],{"type":26,"tag":27,"props":1445,"children":1446},{},[1447],{"type":31,"value":1448},"把这段改成更可读：",{"type":26,"tag":292,"props":1450,"children":1451},{},[1452,1457,1462,1467],{"type":26,"tag":296,"props":1453,"children":1454},{},[1455],{"type":31,"value":1456},"用 async/await",{"type":26,"tag":296,"props":1458,"children":1459},{},[1460],{"type":31,"value":1461},"错误处理不要吞掉",{"type":26,"tag":296,"props":1463,"children":1464},{},[1465],{"type":31,"value":1466},"添加类型（若可推断）",{"type":26,"tag":296,"props":1468,"children":1469},{},[1470],{"type":31,"value":1471},"不要改函数签名",{"type":26,"tag":27,"props":1473,"children":1474},{},[1475],{"type":31,"value":1476},"验收方式（强制）：",{"type":26,"tag":292,"props":1478,"children":1479},{},[1480,1485],{"type":26,"tag":296,"props":1481,"children":1482},{},[1483],{"type":31,"value":1484},"输出前后函数行为一致（输入/输出）",{"type":26,"tag":296,"props":1486,"children":1487},{},[1488],{"type":31,"value":1489},"失败分支有可观测日志（不要悄悄 return null）",{"type":26,"tag":1361,"props":1491,"children":1493},{"id":1492},"工作流-3多文件改动先定文件清单",[1494],{"type":31,"value":1495},"工作流 3：多文件改动（先定“文件清单”）",{"type":26,"tag":965,"props":1497,"children":1498},{},[1499,1510],{"type":26,"tag":296,"props":1500,"children":1501},{},[1502,1508],{"type":26,"tag":354,"props":1503,"children":1505},{"className":1504},[],[1506],{"type":31,"value":1507},"Cmd/Ctrl + I",{"type":31,"value":1509}," 进入多文件",{"type":26,"tag":296,"props":1511,"children":1512},{},[1513],{"type":31,"value":1514},"先让 AI 输出：",{"type":26,"tag":292,"props":1516,"children":1517},{},[1518,1523,1528],{"type":26,"tag":296,"props":1519,"children":1520},{},[1521],{"type":31,"value":1522},"预计会改哪些文件（最多 5 个）",{"type":26,"tag":296,"props":1524,"children":1525},{},[1526],{"type":31,"value":1527},"每个文件改什么",{"type":26,"tag":296,"props":1529,"children":1530},{},[1531],{"type":31,"value":1532},"每一步怎么验收",{"type":26,"tag":965,"props":1534,"children":1535},{"start":897},[1536],{"type":26,"tag":296,"props":1537,"children":1538},{},[1539],{"type":31,"value":1540},"你确认文件清单后再开始生成改动",{"type":26,"tag":27,"props":1542,"children":1543},{},[1544],{"type":31,"value":1545},"关键点：多文件最容易翻车的是“它把你没想到的文件也改了”。所以文件清单是第一道闸门。",{"type":26,"tag":1361,"props":1547,"children":1549},{"id":1548},"工作流-4把上下文噪音砍掉防跑偏",[1550],{"type":31,"value":1551},"工作流 4：把“上下文噪音”砍掉（防跑偏）",{"type":26,"tag":27,"props":1553,"children":1554},{},[1555],{"type":31,"value":1556},"当你怀疑它在胡说/乱改时：",{"type":26,"tag":292,"props":1558,"children":1559},{},[1560,1573],{"type":26,"tag":296,"props":1561,"children":1562},{},[1563,1565,1571],{"type":31,"value":1564},"只选择关键代码片段 → ",{"type":26,"tag":354,"props":1566,"children":1568},{"className":1567},[],[1569],{"type":31,"value":1570},"Cmd/Ctrl + Shift + L",{"type":31,"value":1572}," 加入对话",{"type":26,"tag":296,"props":1574,"children":1575},{},[1576],{"type":31,"value":1577},"然后在对话里要求：",{"type":26,"tag":1343,"props":1579,"children":1580},{},[1581],{"type":26,"tag":27,"props":1582,"children":1583},{},[1584],{"type":31,"value":1585},"只基于我提供的代码片段回答，不要假设其它文件存在。",{"type":26,"tag":1361,"props":1587,"children":1589},{"id":1588},"工作流-5生成变更说明让-code-review-变快",[1590],{"type":31,"value":1591},"工作流 5：生成变更说明（让 code review 变快）",{"type":26,"tag":27,"props":1593,"children":1594},{},[1595],{"type":31,"value":1596},"改完后在对话里让它输出：",{"type":26,"tag":292,"props":1598,"children":1599},{},[1600,1605,1610,1615],{"type":26,"tag":296,"props":1601,"children":1602},{},[1603],{"type":31,"value":1604},"改动摘要（3~7 条）",{"type":26,"tag":296,"props":1606,"children":1607},{},[1608],{"type":31,"value":1609},"风险点（依赖/边界条件）",{"type":26,"tag":296,"props":1611,"children":1612},{},[1613],{"type":31,"value":1614},"回滚方式",{"type":26,"tag":296,"props":1616,"children":1617},{},[1618],{"type":31,"value":1619},"验收步骤",{"type":26,"tag":27,"props":1621,"children":1622},{},[1623],{"type":31,"value":1624},"这套结构能直接贴进 PR 描述。",{"type":26,"tag":1361,"props":1626,"children":1628},{"id":1627},"工作流-6写最小回归集不写回归-等事故",[1629],{"type":31,"value":1630},"工作流 6：写“最小回归集”（不写回归 = 等事故）",{"type":26,"tag":27,"props":1632,"children":1633},{},[1634,1636,1642],{"type":31,"value":1635},"每次改动都至少做 10 条最小回归（见下文清单）。你可以把它写在 ",{"type":26,"tag":354,"props":1637,"children":1639},{"className":1638},[],[1640],{"type":31,"value":1641},"README",{"type":31,"value":1643}," 或团队 wiki。",{"type":26,"tag":1361,"props":1645,"children":1647},{"id":1646},"工作流-7把接受建议变成最后一步",[1648],{"type":31,"value":1649},"工作流 7：把“接受建议”变成最后一步",{"type":26,"tag":27,"props":1651,"children":1652},{},[1653,1659,1661,1666],{"type":26,"tag":354,"props":1654,"children":1656},{"className":1655},[],[1657],{"type":31,"value":1658},"Cmd/Ctrl + Y",{"type":31,"value":1660}," 应该是",{"type":26,"tag":974,"props":1662,"children":1663},{},[1664],{"type":31,"value":1665},"最后一步",{"type":31,"value":1667},"：",{"type":26,"tag":292,"props":1669,"children":1670},{},[1671,1676,1681],{"type":26,"tag":296,"props":1672,"children":1673},{},[1674],{"type":31,"value":1675},"你已经看过 diff",{"type":26,"tag":296,"props":1677,"children":1678},{},[1679],{"type":31,"value":1680},"你能说清楚“怎么验收”",{"type":26,"tag":296,"props":1682,"children":1683},{},[1684],{"type":31,"value":1685},"你知道“怎么回滚”",{"type":26,"tag":1361,"props":1687,"children":1689},{"id":1688},"工作流-8拒绝建议不是失败是风控动作",[1690],{"type":31,"value":1691},"工作流 8：拒绝建议不是失败，是风控动作",{"type":26,"tag":27,"props":1693,"children":1694},{},[1695,1701],{"type":26,"tag":354,"props":1696,"children":1698},{"className":1697},[],[1699],{"type":31,"value":1700},"Cmd/Ctrl + N",{"type":31,"value":1702}," 的使用时机：",{"type":26,"tag":292,"props":1704,"children":1705},{},[1706,1711,1716],{"type":26,"tag":296,"props":1707,"children":1708},{},[1709],{"type":31,"value":1710},"它开始改你没提过的东西（范围漂移）",{"type":26,"tag":296,"props":1712,"children":1713},{},[1714],{"type":31,"value":1715},"它改了 10 个文件但你只想改 1 个",{"type":26,"tag":296,"props":1717,"children":1718},{},[1719],{"type":31,"value":1720},"它为了“更优雅”引入新依赖/新抽象",{"type":26,"tag":1361,"props":1722,"children":1724},{"id":1723},"工作流-9重复任务做成模板提示词不是一次性",[1725],{"type":31,"value":1726},"工作流 9：重复任务做成模板（提示词不是一次性）",{"type":26,"tag":27,"props":1728,"children":1729},{},[1730,1732,1736],{"type":31,"value":1731},"把高频任务（比如“写组件+样式+验收”）固化成模板，放进 Rules（见：",{"type":26,"tag":44,"props":1733,"children":1734},{"href":1030},[1735],{"type":31,"value":1033},{"type":31,"value":1737},"）。",{"type":26,"tag":1361,"props":1739,"children":1741},{"id":1740},"工作流-10把快捷键表做成你自己的任务表",[1742],{"type":31,"value":1743},"工作流 10：把“快捷键表”做成你自己的任务表",{"type":26,"tag":27,"props":1745,"children":1746},{},[1747],{"type":31,"value":1748},"你不需要记住所有快捷键，只需要记住：",{"type":26,"tag":292,"props":1750,"children":1751},{},[1752,1762,1772,1782],{"type":26,"tag":296,"props":1753,"children":1754},{},[1755,1757],{"type":31,"value":1756},"小步改：",{"type":26,"tag":354,"props":1758,"children":1760},{"className":1759},[],[1761],{"type":31,"value":1412},{"type":26,"tag":296,"props":1763,"children":1764},{},[1765,1767],{"type":31,"value":1766},"先对齐：",{"type":26,"tag":354,"props":1768,"children":1770},{"className":1769},[],[1771],{"type":31,"value":1378},{"type":26,"tag":296,"props":1773,"children":1774},{},[1775,1777],{"type":31,"value":1776},"多文件：",{"type":26,"tag":354,"props":1778,"children":1780},{"className":1779},[],[1781],{"type":31,"value":1507},{"type":26,"tag":296,"props":1783,"children":1784},{},[1785,1787],{"type":31,"value":1786},"上下文聚焦：",{"type":26,"tag":354,"props":1788,"children":1790},{"className":1789},[],[1791],{"type":31,"value":1570},{"type":26,"tag":1035,"props":1793,"children":1794},{},[],{"type":26,"tag":76,"props":1796,"children":1798},{"id":1797},"必交付物-1最小回归任务清单10-条通用",[1799],{"type":31,"value":1800},"必交付物 1：最小回归任务清单（10 条，通用）",{"type":26,"tag":1343,"props":1802,"children":1803},{},[1804],{"type":26,"tag":27,"props":1805,"children":1806},{},[1807],{"type":31,"value":1808},"这份清单的意义：让每次 AI 改动都能“被验证”。否则你只是把不可控变成了更快的不可控。",{"type":26,"tag":965,"props":1810,"children":1811},{},[1812,1817,1822,1827,1832,1837,1842,1847,1852,1857],{"type":26,"tag":296,"props":1813,"children":1814},{},[1815],{"type":31,"value":1816},"关键路径能跑通（手动点击/请求一次）",{"type":26,"tag":296,"props":1818,"children":1819},{},[1820],{"type":31,"value":1821},"错误路径能触发（模拟一次失败输入）",{"type":26,"tag":296,"props":1823,"children":1824},{},[1825],{"type":31,"value":1826},"控制台无新增错误（至少关注 1 次真实操作）",{"type":26,"tag":296,"props":1828,"children":1829},{},[1830],{"type":31,"value":1831},"关键 UI 未错位（移动端/桌面端各看一眼）",{"type":26,"tag":296,"props":1833,"children":1834},{},[1835],{"type":31,"value":1836},"刷新后状态正确（尤其是表单/列表）",{"type":26,"tag":296,"props":1838,"children":1839},{},[1840],{"type":31,"value":1841},"路由跳转没断（从入口到目标页）",{"type":26,"tag":296,"props":1843,"children":1844},{},[1845],{"type":31,"value":1846},"相关接口未改变契约（字段名/类型）",{"type":26,"tag":296,"props":1848,"children":1849},{},[1850],{"type":31,"value":1851},"性能没有明显退化（首屏、交互卡顿）",{"type":26,"tag":296,"props":1853,"children":1854},{},[1855],{"type":31,"value":1856},"回滚方案可执行（知道回滚哪几个文件/commit）",{"type":26,"tag":296,"props":1858,"children":1859},{},[1860],{"type":31,"value":1861},"写下“这次改动解决了什么、风险是什么”（可贴 PR）",{"type":26,"tag":1035,"props":1863,"children":1864},{},[],{"type":26,"tag":76,"props":1866,"children":1868},{"id":1867},"必交付物-2失败案例复盘真实会发生",[1869],{"type":31,"value":1870},"必交付物 2：失败案例复盘（真实会发生）",{"type":26,"tag":1361,"props":1872,"children":1874},{"id":1873},"现象快捷键用得很熟但交付还是慢",[1875],{"type":31,"value":1876},"现象：快捷键用得很熟，但交付还是慢",{"type":26,"tag":27,"props":1878,"children":1879},{},[1880],{"type":31,"value":1881},"典型原因：你把 Cursor 当成“更聪明的搜索框”，不断对话，直到它给出你想要的答案。",{"type":26,"tag":27,"props":1883,"children":1884},{},[1885],{"type":31,"value":1886},"复现路径：",{"type":26,"tag":292,"props":1888,"children":1889},{},[1890,1895,1900,1905],{"type":26,"tag":296,"props":1891,"children":1892},{},[1893],{"type":31,"value":1894},"你直接说“把页面做得更好看、更高级”",{"type":26,"tag":296,"props":1896,"children":1897},{},[1898],{"type":31,"value":1899},"AI 开始大改样式、抽象组件、甚至引入新依赖",{"type":26,"tag":296,"props":1901,"children":1902},{},[1903],{"type":31,"value":1904},"你为了省事按了“接受建议”",{"type":26,"tag":296,"props":1906,"children":1907},{},[1908],{"type":31,"value":1909},"最后发现：设计没统一、移动端崩、甚至埋了性能问题",{"type":26,"tag":27,"props":1911,"children":1912},{},[1913,1915,1919,1921,1926],{"type":31,"value":1914},"根因：缺少",{"type":26,"tag":974,"props":1916,"children":1917},{},[1918],{"type":31,"value":1099},{"type":31,"value":1920},"与",{"type":26,"tag":974,"props":1922,"children":1923},{},[1924],{"type":31,"value":1925},"验收",{"type":31,"value":1927},"。",{"type":26,"tag":27,"props":1929,"children":1930},{},[1931],{"type":31,"value":1932},"修复方式（可照抄）：",{"type":26,"tag":292,"props":1934,"children":1935},{},[1936,1941,1953],{"type":26,"tag":296,"props":1937,"children":1938},{},[1939],{"type":31,"value":1940},"把需求拆成 3 个可验证目标：例如“按钮样式统一”“首屏 CTA 更明显”“移动端间距不挤”",{"type":26,"tag":296,"props":1942,"children":1943},{},[1944,1946,1951],{"type":31,"value":1945},"每个目标只用 ",{"type":26,"tag":354,"props":1947,"children":1949},{"className":1948},[],[1950],{"type":31,"value":1412},{"type":31,"value":1952}," 改一个局部",{"type":26,"tag":296,"props":1954,"children":1955},{},[1956],{"type":31,"value":1957},"每次接受建议前跑一遍“最小回归集”",{"type":26,"tag":1035,"props":1959,"children":1960},{},[],{"type":26,"tag":76,"props":1962,"children":1964},{"id":1963},"faq高频问题",[1965],{"type":31,"value":1966},"FAQ（高频问题）",{"type":26,"tag":1361,"props":1968,"children":1970},{"id":1969},"q1我应该先记快捷键还是先学工作流",[1971],{"type":31,"value":1972},"Q1：我应该先记快捷键还是先学工作流？",{"type":26,"tag":27,"props":1974,"children":1975},{},[1976],{"type":31,"value":1977},"先学工作流。快捷键只是把工作流的步骤变短。",{"type":26,"tag":1361,"props":1979,"children":1981},{"id":1980},"q2为什么我一用多文件就容易翻车",[1982],{"type":31,"value":1983},"Q2：为什么我一用多文件就容易翻车？",{"type":26,"tag":27,"props":1985,"children":1986},{},[1987],{"type":31,"value":1988},"因为多文件意味着范围更大、依赖更多、验收更难。先锁定“文件清单 + 每步验收”，再让它动手。",{"type":26,"tag":1361,"props":1990,"children":1992},{"id":1991},"q3有没有万能提示词",[1993],{"type":31,"value":1994},"Q3：有没有“万能提示词”？",{"type":26,"tag":27,"props":1996,"children":1997},{},[1998],{"type":31,"value":1999},"没有，但有“万能结构”：目标、范围、非目标、验收、输出格式。",{"type":26,"tag":1035,"props":2001,"children":2002},{},[],{"type":26,"tag":76,"props":2004,"children":2006},{"id":2005},"延伸阅读建议按顺序",[2007],{"type":31,"value":2008},"延伸阅读（建议按顺序）",{"type":26,"tag":292,"props":2010,"children":2011},{},[2012,2019,2026,2033],{"type":26,"tag":296,"props":2013,"children":2014},{},[2015],{"type":26,"tag":44,"props":2016,"children":2017},{"href":1008},[2018],{"type":31,"value":1011},{"type":26,"tag":296,"props":2020,"children":2021},{},[2022],{"type":26,"tag":44,"props":2023,"children":2024},{"href":1019},[2025],{"type":31,"value":1022},{"type":26,"tag":296,"props":2027,"children":2028},{},[2029],{"type":26,"tag":44,"props":2030,"children":2031},{"href":1030},[2032],{"type":31,"value":1033},{"type":26,"tag":296,"props":2034,"children":2035},{},[2036,2038],{"type":31,"value":2037},"如果你更关心“网页制作落地”：看这篇 ",{"type":26,"tag":44,"props":2039,"children":2041},{"href":2040},"/topics/practical-tips/htmlpage-quick-landing-page",[2042],{"type":31,"value":2043},"3 分钟用 HTMLPAGE 做落地页",{"title":7,"searchDepth":897,"depth":897,"links":2045},[2046,2047,2048,2060,2061,2064,2069],{"id":1040,"depth":900,"text":1043},{"id":1115,"depth":900,"text":1118},{"id":1356,"depth":900,"text":1359,"children":2049},[2050,2051,2052,2053,2054,2055,2056,2057,2058,2059],{"id":1363,"depth":897,"text":1366},{"id":1422,"depth":897,"text":1425},{"id":1492,"depth":897,"text":1495},{"id":1548,"depth":897,"text":1551},{"id":1588,"depth":897,"text":1591},{"id":1627,"depth":897,"text":1630},{"id":1646,"depth":897,"text":1649},{"id":1688,"depth":897,"text":1691},{"id":1723,"depth":897,"text":1726},{"id":1740,"depth":897,"text":1743},{"id":1797,"depth":900,"text":1800},{"id":1867,"depth":900,"text":1870,"children":2062},[2063],{"id":1873,"depth":897,"text":1876},{"id":1963,"depth":900,"text":1966,"children":2065},[2066,2067,2068],{"id":1969,"depth":897,"text":1972},{"id":1980,"depth":897,"text":1983},{"id":1991,"depth":897,"text":1994},{"id":2005,"depth":900,"text":2008},"content:topics:ai:cursor-keyboard-shortcuts-cheatsheet.md","topics/ai/cursor-keyboard-shortcuts-cheatsheet.md","topics/ai/cursor-keyboard-shortcuts-cheatsheet",{"_path":2074,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":2075,"description":2076,"date":2077,"topic":5,"author":11,"tags":2078,"image":2082,"imageAlt":2083,"pexelsPhotoId":2084,"pexelsUrl":2085,"readingTime":2086,"body":2087,"_type":911,"_id":3020,"_source":913,"_file":3021,"_stem":3022,"_extension":916},"/topics/ai/cursor-vs-copilot-vscode-workflow","Cursor vs GitHub Copilot vs VS Code：怎么选、怎么搭配、怎么把风险关在笼子里","用“任务类型×风险×验收成本”的选择矩阵解释 Cursor/Copilot/VS Code 的差异，并给出一套可落地的协作工作流（范围闸门、最小回归集、回滚策略）。","2026-03-01",[924,2079,927,2080,2081],"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":2088,"toc":2998},[2089,2094,2099,2117,2122,2140,2143,2149,2154,2185,2190,2193,2199,2207,2411,2419,2432,2435,2441,2447,2460,2465,2478,2484,2489,2522,2528,2533,2551,2554,2560,2565,2571,2576,2609,2615,2628,2633,2646,2652,2664,2670,2675,2688,2693,2696,2702,2707,2828,2831,2837,2847,2856,2874,2883,2891,2900,2918,2921,2927,2933,2938,2944,2949,2952,2957],{"type":26,"tag":27,"props":2090,"children":2091},{},[2092],{"type":31,"value":2093},"“Cursor 和 Copilot 到底有什么区别？”",{"type":26,"tag":27,"props":2095,"children":2096},{},[2097],{"type":31,"value":2098},"这个问题问得越早越好，因为你一旦把工具选错，后面所有痛苦都不是“提示词不够好”，而是：",{"type":26,"tag":292,"props":2100,"children":2101},{},[2102,2107,2112],{"type":26,"tag":296,"props":2103,"children":2104},{},[2105],{"type":31,"value":2106},"改动不可控（范围漂移、改错文件）",{"type":26,"tag":296,"props":2108,"children":2109},{},[2110],{"type":31,"value":2111},"验收成本爆炸（不知道要测什么）",{"type":26,"tag":296,"props":2113,"children":2114},{},[2115],{"type":31,"value":2116},"团队协作崩盘（没有闸门、没有回滚）",{"type":26,"tag":27,"props":2118,"children":2119},{},[2120],{"type":31,"value":2121},"这篇文章用一张选择矩阵 + 一套可执行工作流，帮你做到两件事：",{"type":26,"tag":965,"props":2123,"children":2124},{},[2125,2130],{"type":26,"tag":296,"props":2126,"children":2127},{},[2128],{"type":31,"value":2129},"知道什么时候用 Cursor、什么时候用 Copilot、什么时候“纯 VS Code 更快”",{"type":26,"tag":296,"props":2131,"children":2132},{},[2133,2135],{"type":31,"value":2134},"就算用 AI，也能把风险关在笼子里：",{"type":26,"tag":974,"props":2136,"children":2137},{},[2138],{"type":31,"value":2139},"可审查、可验证、可回滚",{"type":26,"tag":1035,"props":2141,"children":2142},{},[],{"type":26,"tag":76,"props":2144,"children":2146},{"id":2145},"结论先说三者不是互斥而是分工",[2147],{"type":31,"value":2148},"结论先说：三者不是互斥，而是分工",{"type":26,"tag":27,"props":2150,"children":2151},{},[2152],{"type":31,"value":2153},"你可以把它们看成三层能力：",{"type":26,"tag":292,"props":2155,"children":2156},{},[2157,2166,2176],{"type":26,"tag":296,"props":2158,"children":2159},{},[2160,2164],{"type":26,"tag":974,"props":2161,"children":2162},{},[2163],{"type":31,"value":927},{"type":31,"value":2165},"：编辑器与生态（调试、插件、任务、终端、语言服务）",{"type":26,"tag":296,"props":2167,"children":2168},{},[2169,2174],{"type":26,"tag":974,"props":2170,"children":2171},{},[2172],{"type":31,"value":2173},"Copilot",{"type":31,"value":2175},"：代码补全与局部建议（“我正在写这一行/这一段”）",{"type":26,"tag":296,"props":2177,"children":2178},{},[2179,2183],{"type":26,"tag":974,"props":2180,"children":2181},{},[2182],{"type":31,"value":924},{"type":31,"value":2184},"：以项目为单位的 AI 协作（对话、索引、多文件编辑、规则）",{"type":26,"tag":27,"props":2186,"children":2187},{},[2188],{"type":31,"value":2189},"最常见的误区是：把“局部补全能力”当作“能做架构与多文件落地”。",{"type":26,"tag":1035,"props":2191,"children":2192},{},[],{"type":26,"tag":76,"props":2194,"children":2196},{"id":2195},"选择矩阵按任务类型选工具不是按偏好",[2197],{"type":31,"value":2198},"选择矩阵：按任务类型选工具（不是按偏好）",{"type":26,"tag":1343,"props":2200,"children":2201},{},[2202],{"type":26,"tag":27,"props":2203,"children":2204},{},[2205],{"type":31,"value":2206},"你只要把自己的任务放进表格，就能得到推荐路径。",{"type":26,"tag":83,"props":2208,"children":2209},{},[2210,2242],{"type":26,"tag":87,"props":2211,"children":2212},{},[2213],{"type":26,"tag":91,"props":2214,"children":2215},{},[2216,2221,2227,2232,2237],{"type":26,"tag":95,"props":2217,"children":2218},{},[2219],{"type":31,"value":2220},"任务类型",{"type":26,"tag":95,"props":2222,"children":2224},{"align":2223},"right",[2225],{"type":31,"value":2226},"风险",{"type":26,"tag":95,"props":2228,"children":2229},{"align":2223},[2230],{"type":31,"value":2231},"验收成本",{"type":26,"tag":95,"props":2233,"children":2234},{},[2235],{"type":31,"value":2236},"更推荐",{"type":26,"tag":95,"props":2238,"children":2239},{},[2240],{"type":31,"value":2241},"为什么",{"type":26,"tag":106,"props":2243,"children":2244},{},[2245,2272,2305,2331,2358,2385],{"type":26,"tag":91,"props":2246,"children":2247},{},[2248,2253,2258,2262,2267],{"type":26,"tag":113,"props":2249,"children":2250},{},[2251],{"type":31,"value":2252},"写一段代码/补一个 if",{"type":26,"tag":113,"props":2254,"children":2255},{"align":2223},[2256],{"type":31,"value":2257},"低",{"type":26,"tag":113,"props":2259,"children":2260},{"align":2223},[2261],{"type":31,"value":2257},{"type":26,"tag":113,"props":2263,"children":2264},{},[2265],{"type":31,"value":2266},"Copilot / Cursor 内联编辑",{"type":26,"tag":113,"props":2268,"children":2269},{},[2270],{"type":31,"value":2271},"局部建议足够，成本最低",{"type":26,"tag":91,"props":2273,"children":2274},{},[2275,2280,2285,2289,2300],{"type":26,"tag":113,"props":2276,"children":2277},{},[2278],{"type":31,"value":2279},"重构一个函数",{"type":26,"tag":113,"props":2281,"children":2282},{"align":2223},[2283],{"type":31,"value":2284},"中",{"type":26,"tag":113,"props":2286,"children":2287},{"align":2223},[2288],{"type":31,"value":2284},{"type":26,"tag":113,"props":2290,"children":2291},{},[2292,2294],{"type":31,"value":2293},"Cursor ",{"type":26,"tag":354,"props":2295,"children":2297},{"className":2296},[],[2298],{"type":31,"value":2299},"内联编辑",{"type":26,"tag":113,"props":2301,"children":2302},{},[2303],{"type":31,"value":2304},"需要解释、需要约束输出",{"type":26,"tag":91,"props":2306,"children":2307},{},[2308,2313,2317,2321,2326],{"type":26,"tag":113,"props":2309,"children":2310},{},[2311],{"type":31,"value":2312},"改一个组件 + 样式",{"type":26,"tag":113,"props":2314,"children":2315},{"align":2223},[2316],{"type":31,"value":2284},{"type":26,"tag":113,"props":2318,"children":2319},{"align":2223},[2320],{"type":31,"value":2284},{"type":26,"tag":113,"props":2322,"children":2323},{},[2324],{"type":31,"value":2325},"Cursor（小范围多文件）",{"type":26,"tag":113,"props":2327,"children":2328},{},[2329],{"type":31,"value":2330},"需要同时改模板与样式",{"type":26,"tag":91,"props":2332,"children":2333},{},[2334,2339,2344,2348,2353],{"type":26,"tag":113,"props":2335,"children":2336},{},[2337],{"type":31,"value":2338},"改 3~5 个文件（组件+api+测试）",{"type":26,"tag":113,"props":2340,"children":2341},{"align":2223},[2342],{"type":31,"value":2343},"高",{"type":26,"tag":113,"props":2345,"children":2346},{"align":2223},[2347],{"type":31,"value":2343},{"type":26,"tag":113,"props":2349,"children":2350},{},[2351],{"type":31,"value":2352},"Cursor Composer + 闸门",{"type":26,"tag":113,"props":2354,"children":2355},{},[2356],{"type":31,"value":2357},"需要计划、验收、回滚",{"type":26,"tag":91,"props":2359,"children":2360},{},[2361,2366,2371,2375,2380],{"type":26,"tag":113,"props":2362,"children":2363},{},[2364],{"type":31,"value":2365},"重写一段架构/引入新依赖",{"type":26,"tag":113,"props":2367,"children":2368},{"align":2223},[2369],{"type":31,"value":2370},"很高",{"type":26,"tag":113,"props":2372,"children":2373},{"align":2223},[2374],{"type":31,"value":2370},{"type":26,"tag":113,"props":2376,"children":2377},{},[2378],{"type":31,"value":2379},"先人脑设计 + VS Code 实现",{"type":26,"tag":113,"props":2381,"children":2382},{},[2383],{"type":31,"value":2384},"AI 易发散，最好先设计再执行",{"type":26,"tag":91,"props":2386,"children":2387},{},[2388,2393,2397,2401,2406],{"type":26,"tag":113,"props":2389,"children":2390},{},[2391],{"type":31,"value":2392},"排查线上问题/性能抖动",{"type":26,"tag":113,"props":2394,"children":2395},{"align":2223},[2396],{"type":31,"value":2343},{"type":26,"tag":113,"props":2398,"children":2399},{"align":2223},[2400],{"type":31,"value":2370},{"type":26,"tag":113,"props":2402,"children":2403},{},[2404],{"type":31,"value":2405},"VS Code + 工具链优先，AI 辅助归纳",{"type":26,"tag":113,"props":2407,"children":2408},{},[2409],{"type":31,"value":2410},"需要证据，不要“猜”",{"type":26,"tag":27,"props":2412,"children":2413},{},[2414],{"type":26,"tag":974,"props":2415,"children":2416},{},[2417],{"type":31,"value":2418},"一句话规则：",{"type":26,"tag":292,"props":2420,"children":2421},{},[2422,2427],{"type":26,"tag":296,"props":2423,"children":2424},{},[2425],{"type":31,"value":2426},"当你的改动可以用“10 条最小回归集”覆盖时，用 Cursor。",{"type":26,"tag":296,"props":2428,"children":2429},{},[2430],{"type":31,"value":2431},"当你的改动无法验证时，先别让 AI 动手。",{"type":26,"tag":1035,"props":2433,"children":2434},{},[],{"type":26,"tag":76,"props":2436,"children":2438},{"id":2437},"差异拆解到底差在哪里",[2439],{"type":31,"value":2440},"差异拆解：到底差在哪里？",{"type":26,"tag":1361,"props":2442,"children":2444},{"id":2443},"_1-上下文来源补全-vs-项目索引",[2445],{"type":31,"value":2446},"1) 上下文来源：补全 vs 项目索引",{"type":26,"tag":292,"props":2448,"children":2449},{},[2450,2455],{"type":26,"tag":296,"props":2451,"children":2452},{},[2453],{"type":31,"value":2454},"Copilot 更擅长：你正在写的这几行、当前文件的局部上下文",{"type":26,"tag":296,"props":2456,"children":2457},{},[2458],{"type":31,"value":2459},"Cursor 更擅长：项目级索引 + 多文件关联理解",{"type":26,"tag":27,"props":2461,"children":2462},{},[2463],{"type":31,"value":2464},"因此：",{"type":26,"tag":292,"props":2466,"children":2467},{},[2468,2473],{"type":26,"tag":296,"props":2469,"children":2470},{},[2471],{"type":31,"value":2472},"写代码片段：Copilot 速度更快",{"type":26,"tag":296,"props":2474,"children":2475},{},[2476],{"type":31,"value":2477},"改一坨工程：Cursor 更有胜算（但更需要闸门）",{"type":26,"tag":1361,"props":2479,"children":2481},{"id":2480},"_2-交互方式你能不能控制范围",[2482],{"type":31,"value":2483},"2) 交互方式：你能不能控制范围",{"type":26,"tag":27,"props":2485,"children":2486},{},[2487],{"type":31,"value":2488},"范围控制的三个层级：",{"type":26,"tag":965,"props":2490,"children":2491},{},[2492,2502,2512],{"type":26,"tag":296,"props":2493,"children":2494},{},[2495,2497],{"type":31,"value":2496},"内联编辑（选中一段）→ ",{"type":26,"tag":974,"props":2498,"children":2499},{},[2500],{"type":31,"value":2501},"最强范围控制",{"type":26,"tag":296,"props":2503,"children":2504},{},[2505,2507],{"type":31,"value":2506},"Composer 多文件（先列文件清单）→ ",{"type":26,"tag":974,"props":2508,"children":2509},{},[2510],{"type":31,"value":2511},"可控但要闸门",{"type":26,"tag":296,"props":2513,"children":2514},{},[2515,2517],{"type":31,"value":2516},"大对话（泛目标）→ ",{"type":26,"tag":974,"props":2518,"children":2519},{},[2520],{"type":31,"value":2521},"最容易跑偏",{"type":26,"tag":1361,"props":2523,"children":2525},{"id":2524},"_3-输出形态建议-vs-可审查的变更",[2526],{"type":31,"value":2527},"3) 输出形态：建议 vs 可审查的变更",{"type":26,"tag":27,"props":2529,"children":2530},{},[2531],{"type":31,"value":2532},"最好的 AI 输出不是“给我一段代码”，而是：",{"type":26,"tag":292,"props":2534,"children":2535},{},[2536,2541,2546],{"type":26,"tag":296,"props":2537,"children":2538},{},[2539],{"type":31,"value":2540},"改动摘要（做了什么）",{"type":26,"tag":296,"props":2542,"children":2543},{},[2544],{"type":31,"value":2545},"diff 级别的可审查变更",{"type":26,"tag":296,"props":2547,"children":2548},{},[2549],{"type":31,"value":2550},"验收步骤与回滚方案",{"type":26,"tag":1035,"props":2552,"children":2553},{},[],{"type":26,"tag":76,"props":2555,"children":2557},{"id":2556},"一套可落地的团队工作流把风险关住",[2558],{"type":31,"value":2559},"一套可落地的团队工作流（把风险关住）",{"type":26,"tag":27,"props":2561,"children":2562},{},[2563],{"type":31,"value":2564},"下面这套流程，你可以直接写进团队规范：",{"type":26,"tag":1361,"props":2566,"children":2568},{"id":2567},"step-1先写任务单geo-友好结构",[2569],{"type":31,"value":2570},"Step 1：先写任务单（GEO 友好结构）",{"type":26,"tag":27,"props":2572,"children":2573},{},[2574],{"type":31,"value":2575},"模板：",{"type":26,"tag":292,"props":2577,"children":2578},{},[2579,2584,2589,2594,2599,2604],{"type":26,"tag":296,"props":2580,"children":2581},{},[2582],{"type":31,"value":2583},"目标：……",{"type":26,"tag":296,"props":2585,"children":2586},{},[2587],{"type":31,"value":2588},"背景：……",{"type":26,"tag":296,"props":2590,"children":2591},{},[2592],{"type":31,"value":2593},"范围：只改这些文件/模块：……",{"type":26,"tag":296,"props":2595,"children":2596},{},[2597],{"type":31,"value":2598},"非目标：不做哪些事情：……",{"type":26,"tag":296,"props":2600,"children":2601},{},[2602],{"type":31,"value":2603},"验收：如何判断完成（可测试/可观察）：……",{"type":26,"tag":296,"props":2605,"children":2606},{},[2607],{"type":31,"value":2608},"回滚：如果失败怎么撤回：……",{"type":26,"tag":1361,"props":2610,"children":2612},{"id":2611},"step-2用范围闸门限制-ai",[2613],{"type":31,"value":2614},"Step 2：用“范围闸门”限制 AI",{"type":26,"tag":292,"props":2616,"children":2617},{},[2618,2623],{"type":26,"tag":296,"props":2619,"children":2620},{},[2621],{"type":31,"value":2622},"单文件改动：优先 Cursor 内联编辑",{"type":26,"tag":296,"props":2624,"children":2625},{},[2626],{"type":31,"value":2627},"多文件改动：必须先让 AI 输出“文件清单（≤5）+ 每步验收”",{"type":26,"tag":27,"props":2629,"children":2630},{},[2631],{"type":31,"value":2632},"如果 AI 输出的文件清单超过 5 个：",{"type":26,"tag":292,"props":2634,"children":2635},{},[2636,2641],{"type":26,"tag":296,"props":2637,"children":2638},{},[2639],{"type":31,"value":2640},"不是它太强，是任务太大",{"type":26,"tag":296,"props":2642,"children":2643},{},[2644],{"type":31,"value":2645},"你需要拆任务，而不是继续推进",{"type":26,"tag":1361,"props":2647,"children":2649},{"id":2648},"step-3最小回归集10-条",[2650],{"type":31,"value":2651},"Step 3：最小回归集（10 条）",{"type":26,"tag":27,"props":2653,"children":2654},{},[2655,2657,2662],{"type":31,"value":2656},"每次接受改动前必须跑（可参考：",{"type":26,"tag":44,"props":2658,"children":2659},{"href":919},[2660],{"type":31,"value":2661},"Cursor 快捷键速查表",{"type":31,"value":2663}," 里的清单）。",{"type":26,"tag":1361,"props":2665,"children":2667},{"id":2666},"step-4回滚策略不用等事故才想",[2668],{"type":31,"value":2669},"Step 4：回滚策略（不用等事故才想）",{"type":26,"tag":27,"props":2671,"children":2672},{},[2673],{"type":31,"value":2674},"回滚最常见的两条路：",{"type":26,"tag":292,"props":2676,"children":2677},{},[2678,2683],{"type":26,"tag":296,"props":2679,"children":2680},{},[2681],{"type":31,"value":2682},"git 回滚 commit",{"type":26,"tag":296,"props":2684,"children":2685},{},[2686],{"type":31,"value":2687},"对关键文件保留前版本（至少能快速恢复）",{"type":26,"tag":27,"props":2689,"children":2690},{},[2691],{"type":31,"value":2692},"你需要做到：任何一轮 AI 改动都能在 5 分钟内撤回。",{"type":26,"tag":1035,"props":2694,"children":2695},{},[],{"type":26,"tag":76,"props":2697,"children":2699},{"id":2698},"必交付物对比矩阵可复制",[2700],{"type":31,"value":2701},"必交付物：对比矩阵（可复制）",{"type":26,"tag":27,"props":2703,"children":2704},{},[2705],{"type":31,"value":2706},"下面这张表可以直接贴到你的团队 wiki：",{"type":26,"tag":83,"props":2708,"children":2709},{},[2710,2733],{"type":26,"tag":87,"props":2711,"children":2712},{},[2713],{"type":26,"tag":91,"props":2714,"children":2715},{},[2716,2721,2725,2729],{"type":26,"tag":95,"props":2717,"children":2718},{},[2719],{"type":31,"value":2720},"维度",{"type":26,"tag":95,"props":2722,"children":2723},{},[2724],{"type":31,"value":927},{"type":26,"tag":95,"props":2726,"children":2727},{},[2728],{"type":31,"value":2173},{"type":26,"tag":95,"props":2730,"children":2731},{},[2732],{"type":31,"value":924},{"type":26,"tag":106,"props":2734,"children":2735},{},[2736,2759,2782,2805],{"type":26,"tag":91,"props":2737,"children":2738},{},[2739,2744,2749,2754],{"type":26,"tag":113,"props":2740,"children":2741},{},[2742],{"type":31,"value":2743},"强项",{"type":26,"tag":113,"props":2745,"children":2746},{},[2747],{"type":31,"value":2748},"工具链、调试、生态",{"type":26,"tag":113,"props":2750,"children":2751},{},[2752],{"type":31,"value":2753},"补全与局部建议",{"type":26,"tag":113,"props":2755,"children":2756},{},[2757],{"type":31,"value":2758},"项目上下文、多文件落地",{"type":26,"tag":91,"props":2760,"children":2761},{},[2762,2767,2772,2777],{"type":26,"tag":113,"props":2763,"children":2764},{},[2765],{"type":31,"value":2766},"适合任务",{"type":26,"tag":113,"props":2768,"children":2769},{},[2770],{"type":31,"value":2771},"排查、调试、验证",{"type":26,"tag":113,"props":2773,"children":2774},{},[2775],{"type":31,"value":2776},"写一段、补一段",{"type":26,"tag":113,"props":2778,"children":2779},{},[2780],{"type":31,"value":2781},"改一段、改一组文件",{"type":26,"tag":91,"props":2783,"children":2784},{},[2785,2790,2795,2800],{"type":26,"tag":113,"props":2786,"children":2787},{},[2788],{"type":31,"value":2789},"最大风险",{"type":26,"tag":113,"props":2791,"children":2792},{},[2793],{"type":31,"value":2794},"无",{"type":26,"tag":113,"props":2796,"children":2797},{},[2798],{"type":31,"value":2799},"过度依赖建议",{"type":26,"tag":113,"props":2801,"children":2802},{},[2803],{"type":31,"value":2804},"范围漂移、多文件回归",{"type":26,"tag":91,"props":2806,"children":2807},{},[2808,2813,2818,2823],{"type":26,"tag":113,"props":2809,"children":2810},{},[2811],{"type":31,"value":2812},"必须搭配",{"type":26,"tag":113,"props":2814,"children":2815},{},[2816],{"type":31,"value":2817},"规范与检查",{"type":26,"tag":113,"props":2819,"children":2820},{},[2821],{"type":31,"value":2822},"代码评审",{"type":26,"tag":113,"props":2824,"children":2825},{},[2826],{"type":31,"value":2827},"闸门 + 最小回归集",{"type":26,"tag":1035,"props":2829,"children":2830},{},[],{"type":26,"tag":76,"props":2832,"children":2834},{"id":2833},"失败案例多文件看似成功实际埋雷",[2835],{"type":31,"value":2836},"失败案例：多文件“看似成功”，实际埋雷",{"type":26,"tag":27,"props":2838,"children":2839},{},[2840,2845],{"type":26,"tag":974,"props":2841,"children":2842},{},[2843],{"type":31,"value":2844},"现象",{"type":31,"value":2846},"：AI 说“我已经把所有地方都改了”，你也接受了，结果上线后 404 或样式错位。",{"type":26,"tag":27,"props":2848,"children":2849},{},[2850,2855],{"type":26,"tag":974,"props":2851,"children":2852},{},[2853],{"type":31,"value":2854},"复现条件",{"type":31,"value":1667},{"type":26,"tag":292,"props":2857,"children":2858},{},[2859,2864,2869],{"type":26,"tag":296,"props":2860,"children":2861},{},[2862],{"type":31,"value":2863},"你给了一个大目标（例如“把所有按钮统一成主题色”）",{"type":26,"tag":296,"props":2865,"children":2866},{},[2867],{"type":31,"value":2868},"它改了组件、样式、甚至主题配置",{"type":26,"tag":296,"props":2870,"children":2871},{},[2872],{"type":31,"value":2873},"你没有按页面模块走一遍，直接合并",{"type":26,"tag":27,"props":2875,"children":2876},{},[2877,2882],{"type":26,"tag":974,"props":2878,"children":2879},{},[2880],{"type":31,"value":2881},"根因",{"type":31,"value":1667},{"type":26,"tag":292,"props":2884,"children":2885},{},[2886],{"type":26,"tag":296,"props":2887,"children":2888},{},[2889],{"type":31,"value":2890},"改动范围大，但验收仍按“小改动”的方式做（只看一处）",{"type":26,"tag":27,"props":2892,"children":2893},{},[2894,2899],{"type":26,"tag":974,"props":2895,"children":2896},{},[2897],{"type":31,"value":2898},"修复",{"type":31,"value":1667},{"type":26,"tag":292,"props":2901,"children":2902},{},[2903,2908,2913],{"type":26,"tag":296,"props":2904,"children":2905},{},[2906],{"type":31,"value":2907},"强制把任务拆成“模块级目标”：Hero、Feature、Pricing、Form",{"type":26,"tag":296,"props":2909,"children":2910},{},[2911],{"type":31,"value":2912},"每个模块改完就验收一次",{"type":26,"tag":296,"props":2914,"children":2915},{},[2916],{"type":31,"value":2917},"验收通过再进入下一个模块",{"type":26,"tag":1035,"props":2919,"children":2920},{},[],{"type":26,"tag":76,"props":2922,"children":2924},{"id":2923},"faq",[2925],{"type":31,"value":2926},"FAQ",{"type":26,"tag":1361,"props":2928,"children":2930},{"id":2929},"q1我已经用了-cursor为什么还要用-copilot",[2931],{"type":31,"value":2932},"Q1：我已经用了 Cursor，为什么还要用 Copilot？",{"type":26,"tag":27,"props":2934,"children":2935},{},[2936],{"type":31,"value":2937},"因为“补全”这种高频低风险任务，Copilot 的交互成本更低；Cursor 更适合需要解释与约束的改动。",{"type":26,"tag":1361,"props":2939,"children":2941},{"id":2940},"q2什么时候应该完全不用-ai",[2942],{"type":31,"value":2943},"Q2：什么时候应该完全不用 AI？",{"type":26,"tag":27,"props":2945,"children":2946},{},[2947],{"type":31,"value":2948},"当你无法定义验收标准时。比如“更高级”“更好看”这种目标，先做信息结构与设计规则，再让 AI 帮你落地局部。",{"type":26,"tag":1035,"props":2950,"children":2951},{},[],{"type":26,"tag":76,"props":2953,"children":2955},{"id":2954},"延伸阅读",[2956],{"type":31,"value":2954},{"type":26,"tag":292,"props":2958,"children":2959},{},[2960,2969,2978,2987],{"type":26,"tag":296,"props":2961,"children":2962},{},[2963,2965],{"type":31,"value":2964},"Cursor 入门：",{"type":26,"tag":44,"props":2966,"children":2967},{"href":1008},[2968],{"type":31,"value":1011},{"type":26,"tag":296,"props":2970,"children":2971},{},[2972,2974],{"type":31,"value":2973},"Cursor 进阶：",{"type":26,"tag":44,"props":2975,"children":2976},{"href":1019},[2977],{"type":31,"value":1022},{"type":26,"tag":296,"props":2979,"children":2980},{},[2981,2983],{"type":31,"value":2982},"规则配置：",{"type":26,"tag":44,"props":2984,"children":2985},{"href":1030},[2986],{"type":31,"value":1033},{"type":26,"tag":296,"props":2988,"children":2989},{},[2990,2992],{"type":31,"value":2991},"Copilot 实战：",{"type":26,"tag":44,"props":2993,"children":2995},{"href":2994},"/topics/ai/github-copilot-tips",[2996],{"type":31,"value":2997},"GitHub Copilot 实用技巧",{"title":7,"searchDepth":897,"depth":897,"links":2999},[3000,3001,3002,3007,3013,3014,3015,3019],{"id":2145,"depth":900,"text":2148},{"id":2195,"depth":900,"text":2198},{"id":2437,"depth":900,"text":2440,"children":3003},[3004,3005,3006],{"id":2443,"depth":897,"text":2446},{"id":2480,"depth":897,"text":2483},{"id":2524,"depth":897,"text":2527},{"id":2556,"depth":900,"text":2559,"children":3008},[3009,3010,3011,3012],{"id":2567,"depth":897,"text":2570},{"id":2611,"depth":897,"text":2614},{"id":2648,"depth":897,"text":2651},{"id":2666,"depth":897,"text":2669},{"id":2698,"depth":900,"text":2701},{"id":2833,"depth":900,"text":2836},{"id":2923,"depth":900,"text":2926,"children":3016},[3017,3018],{"id":2929,"depth":897,"text":2932},{"id":2940,"depth":897,"text":2943},{"id":2954,"depth":900,"text":2954},"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":3024,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":3025,"description":3026,"date":3027,"topic":5,"author":11,"tags":3028,"image":3033,"featured":755,"readingTime":2086,"body":3034,"_type":911,"_id":3682,"_source":913,"_file":3683,"_stem":3684,"_extension":916},"/topics/ai/ai-debugging-troubleshooting-guide","AI 辅助调试与问题排查：让 AI 成为你的调试搭档","深入探讨如何利用 AI 工具提升调试效率，包括错误信息分析、日志解读、性能问题定位、复杂 bug 排查等实战场景，构建 AI 驱动的调试工作流。","2026-01-18",[3029,3030,3031,928,3032],"AI 调试","问题排查","Debug","错误处理","/images/topics/ai/ai-debugging-guide.jpg",{"type":23,"children":3035,"toc":3653},[3036,3042,3048,3053,3058,3063,3069,3075,3080,3088,3116,3124,3147,3153,3163,3172,3180,3188,3221,3229,3259,3272,3280,3285,3293,3301,3312,3318,3326,3337,3345,3354,3360,3366,3371,3380,3386,3391,3400,3406,3412,3421,3427,3436,3442,3453,3459,3465,3474,3480,3489,3495,3501,3509,3515,3524,3532,3540,3543,3549,3554,3573,3585,3588,3594,3599,3608,3613,3616,3622,3627,3645],{"type":26,"tag":76,"props":3037,"children":3039},{"id":3038},"ai-辅助调试与问题排查",[3040],{"type":31,"value":3041},"AI 辅助调试与问题排查",{"type":26,"tag":76,"props":3043,"children":3045},{"id":3044},"引言调试的痛与-ai-的解药",[3046],{"type":31,"value":3047},"引言：调试的痛与 AI 的解药",{"type":26,"tag":27,"props":3049,"children":3050},{},[3051],{"type":31,"value":3052},"调试是每个程序员的日常，也是最消耗时间和精力的工作之一。我们都有过这样的经历：盯着一个莫名其妙的错误信息，翻遍 Stack Overflow，尝试各种方案，几个小时后才发现是一个愚蠢的拼写错误。",{"type":26,"tag":27,"props":3054,"children":3055},{},[3056],{"type":31,"value":3057},"AI 工具的出现，正在改变调试的方式。不是替代你的思考，而是加速你的分析过程——帮你快速理解错误、缩小排查范围、验证假设。",{"type":26,"tag":27,"props":3059,"children":3060},{},[3061],{"type":31,"value":3062},"这篇文章分享我在实际项目中使用 AI 辅助调试的经验和方法论。",{"type":26,"tag":76,"props":3064,"children":3066},{"id":3065},"第一部分建立-ai-调试的思维模型",[3067],{"type":31,"value":3068},"第一部分：建立 AI 调试的思维模型",{"type":26,"tag":1361,"props":3070,"children":3072},{"id":3071},"_11-ai-在调试中的角色",[3073],{"type":31,"value":3074},"1.1 AI 在调试中的角色",{"type":26,"tag":27,"props":3076,"children":3077},{},[3078],{"type":31,"value":3079},"把 AI 想象成一个经验丰富但不了解你项目的高级工程师。它：",{"type":26,"tag":27,"props":3081,"children":3082},{},[3083],{"type":26,"tag":974,"props":3084,"children":3085},{},[3086],{"type":31,"value":3087},"擅长的事情：",{"type":26,"tag":292,"props":3089,"children":3090},{},[3091,3096,3101,3106,3111],{"type":26,"tag":296,"props":3092,"children":3093},{},[3094],{"type":31,"value":3095},"解读错误信息的含义",{"type":26,"tag":296,"props":3097,"children":3098},{},[3099],{"type":31,"value":3100},"提供可能的原因列表",{"type":26,"tag":296,"props":3102,"children":3103},{},[3104],{"type":31,"value":3105},"给出排查方向建议",{"type":26,"tag":296,"props":3107,"children":3108},{},[3109],{"type":31,"value":3110},"解释复杂的技术概念",{"type":26,"tag":296,"props":3112,"children":3113},{},[3114],{"type":31,"value":3115},"生成调试代码片段",{"type":26,"tag":27,"props":3117,"children":3118},{},[3119],{"type":26,"tag":974,"props":3120,"children":3121},{},[3122],{"type":31,"value":3123},"不擅长的事情：",{"type":26,"tag":292,"props":3125,"children":3126},{},[3127,3132,3137,3142],{"type":26,"tag":296,"props":3128,"children":3129},{},[3130],{"type":31,"value":3131},"了解你的业务逻辑",{"type":26,"tag":296,"props":3133,"children":3134},{},[3135],{"type":31,"value":3136},"知道你的代码历史",{"type":26,"tag":296,"props":3138,"children":3139},{},[3140],{"type":31,"value":3141},"理解项目特定的约定",{"type":26,"tag":296,"props":3143,"children":3144},{},[3145],{"type":31,"value":3146},"做出架构级判断",{"type":26,"tag":1361,"props":3148,"children":3150},{"id":3149},"_12-有效提问的结构",[3151],{"type":31,"value":3152},"1.2 有效提问的结构",{"type":26,"tag":346,"props":3154,"children":3158},{"code":3155,"language":911,"meta":7,"className":3156},"## 高效的调试提问模板\n\n**问题描述**\n[简洁描述遇到的问题]\n\n**错误信息**\n",[3157],"language-markdown",[3159],{"type":26,"tag":354,"props":3160,"children":3161},{"__ignoreMap":7},[3162],{"type":31,"value":3155},{"type":26,"tag":27,"props":3164,"children":3165},{},[3166],{"type":26,"tag":3167,"props":3168,"children":3169},"span",{},[3170],{"type":31,"value":3171},"完整的错误信息，不要截断",{"type":26,"tag":346,"props":3173,"children":3175},{"code":3174},"\n**相关代码**\n```javascript\n[精简但完整的相关代码]\n",[3176],{"type":26,"tag":354,"props":3177,"children":3178},{"__ignoreMap":7},[3179],{"type":31,"value":3174},{"type":26,"tag":27,"props":3181,"children":3182},{},[3183],{"type":26,"tag":974,"props":3184,"children":3185},{},[3186],{"type":31,"value":3187},"环境信息",{"type":26,"tag":292,"props":3189,"children":3190},{},[3191,3201,3211],{"type":26,"tag":296,"props":3192,"children":3193},{},[3194,3196],{"type":31,"value":3195},"运行环境：",{"type":26,"tag":3167,"props":3197,"children":3198},{},[3199],{"type":31,"value":3200},"Node 版本/浏览器版本",{"type":26,"tag":296,"props":3202,"children":3203},{},[3204,3206],{"type":31,"value":3205},"框架版本：",{"type":26,"tag":3167,"props":3207,"children":3208},{},[3209],{"type":31,"value":3210},"相关框架版本",{"type":26,"tag":296,"props":3212,"children":3213},{},[3214,3216],{"type":31,"value":3215},"操作系统：",{"type":26,"tag":3167,"props":3217,"children":3218},{},[3219],{"type":31,"value":3220},"如果相关",{"type":26,"tag":27,"props":3222,"children":3223},{},[3224],{"type":26,"tag":974,"props":3225,"children":3226},{},[3227],{"type":31,"value":3228},"已尝试的方案",{"type":26,"tag":292,"props":3230,"children":3231},{},[3232,3246],{"type":26,"tag":296,"props":3233,"children":3234},{},[3235,3240,3241],{"type":26,"tag":3167,"props":3236,"children":3237},{},[3238],{"type":31,"value":3239},"方案1",{"type":31,"value":1667},{"type":26,"tag":3167,"props":3242,"children":3243},{},[3244],{"type":31,"value":3245},"结果",{"type":26,"tag":296,"props":3247,"children":3248},{},[3249,3254,3255],{"type":26,"tag":3167,"props":3250,"children":3251},{},[3252],{"type":31,"value":3253},"方案2",{"type":31,"value":1667},{"type":26,"tag":3167,"props":3256,"children":3257},{},[3258],{"type":31,"value":3245},{"type":26,"tag":27,"props":3260,"children":3261},{},[3262,3267],{"type":26,"tag":974,"props":3263,"children":3264},{},[3265],{"type":31,"value":3266},"期望的结果",{"type":26,"tag":3167,"props":3268,"children":3269},{},[3270],{"type":31,"value":3271},"描述期望的行为",{"type":26,"tag":346,"props":3273,"children":3275},{"code":3274},"\n### 1.3 分级调试策略\n\n",[3276],{"type":26,"tag":354,"props":3277,"children":3278},{"__ignoreMap":7},[3279],{"type":31,"value":3274},{"type":26,"tag":27,"props":3281,"children":3282},{},[3283],{"type":31,"value":3284},"┌───────────────────────────────────────────────────────────┐\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":346,"props":3286,"children":3288},{"code":3287},"\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",[3289],{"type":26,"tag":354,"props":3290,"children":3291},{"__ignoreMap":7},[3292],{"type":31,"value":3287},{"type":26,"tag":27,"props":3294,"children":3295},{},[3296],{"type":26,"tag":974,"props":3297,"children":3298},{},[3299],{"type":31,"value":3300},"场景 2：Vue 响应式警告",{"type":26,"tag":346,"props":3302,"children":3307},{"code":3303,"language":3304,"meta":7,"className":3305},"// 警告信息：\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",[3306],"language-typescript",[3308],{"type":26,"tag":354,"props":3309,"children":3310},{"__ignoreMap":7},[3311],{"type":31,"value":3303},{"type":26,"tag":1361,"props":3313,"children":3315},{"id":3314},"_22-后端错误分析",[3316],{"type":31,"value":3317},"2.2 后端错误分析",{"type":26,"tag":27,"props":3319,"children":3320},{},[3321],{"type":26,"tag":974,"props":3322,"children":3323},{},[3324],{"type":31,"value":3325},"场景 1：Node.js 内存问题",{"type":26,"tag":346,"props":3327,"children":3332},{"code":3328,"language":3329,"meta":7,"className":3330},"// 错误信息：\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",[3331],"language-javascript",[3333],{"type":26,"tag":354,"props":3334,"children":3335},{"__ignoreMap":7},[3336],{"type":31,"value":3328},{"type":26,"tag":27,"props":3338,"children":3339},{},[3340],{"type":26,"tag":974,"props":3341,"children":3342},{},[3343],{"type":31,"value":3344},"场景 2：数据库连接问题",{"type":26,"tag":346,"props":3346,"children":3349},{"code":3347,"language":3304,"meta":7,"className":3348},"// 错误信息：\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",[3306],[3350],{"type":26,"tag":354,"props":3351,"children":3352},{"__ignoreMap":7},[3353],{"type":31,"value":3347},{"type":26,"tag":76,"props":3355,"children":3357},{"id":3356},"第三部分日志分析与问题定位",[3358],{"type":31,"value":3359},"第三部分：日志分析与问题定位",{"type":26,"tag":1361,"props":3361,"children":3363},{"id":3362},"_31-结构化日志分析",[3364],{"type":31,"value":3365},"3.1 结构化日志分析",{"type":26,"tag":27,"props":3367,"children":3368},{},[3369],{"type":31,"value":3370},"当面对大量日志时，让 AI 帮你快速定位问题：",{"type":26,"tag":346,"props":3372,"children":3375},{"code":3373,"language":3329,"meta":7,"className":3374},"// 提问示例：\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",[3331],[3376],{"type":26,"tag":354,"props":3377,"children":3378},{"__ignoreMap":7},[3379],{"type":31,"value":3373},{"type":26,"tag":1361,"props":3381,"children":3383},{"id":3382},"_32-创建调试日志",[3384],{"type":31,"value":3385},"3.2 创建调试日志",{"type":26,"tag":27,"props":3387,"children":3388},{},[3389],{"type":31,"value":3390},"让 AI 帮你生成调试用的日志代码：",{"type":26,"tag":346,"props":3392,"children":3395},{"code":3393,"language":3304,"meta":7,"className":3394},"// 请求：\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",[3306],[3396],{"type":26,"tag":354,"props":3397,"children":3398},{"__ignoreMap":7},[3399],{"type":31,"value":3393},{"type":26,"tag":76,"props":3401,"children":3403},{"id":3402},"第四部分性能问题排查",[3404],{"type":31,"value":3405},"第四部分：性能问题排查",{"type":26,"tag":1361,"props":3407,"children":3409},{"id":3408},"_41-前端性能分析",[3410],{"type":31,"value":3411},"4.1 前端性能分析",{"type":26,"tag":346,"props":3413,"children":3416},{"code":3414,"language":3304,"meta":7,"className":3415},"// 场景：页面加载慢，需要分析原因\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",[3306],[3417],{"type":26,"tag":354,"props":3418,"children":3419},{"__ignoreMap":7},[3420],{"type":31,"value":3414},{"type":26,"tag":1361,"props":3422,"children":3424},{"id":3423},"_42-内存泄漏排查",[3425],{"type":31,"value":3426},"4.2 内存泄漏排查",{"type":26,"tag":346,"props":3428,"children":3431},{"code":3429,"language":3304,"meta":7,"className":3430},"// 场景：应用运行一段时间后变卡\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",[3306],[3432],{"type":26,"tag":354,"props":3433,"children":3434},{"__ignoreMap":7},[3435],{"type":31,"value":3429},{"type":26,"tag":1361,"props":3437,"children":3439},{"id":3438},"_43-数据库查询优化",[3440],{"type":31,"value":3441},"4.3 数据库查询优化",{"type":26,"tag":346,"props":3443,"children":3448},{"code":3444,"language":3445,"meta":7,"className":3446},"-- 场景：查询很慢，让 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",[3447],"language-sql",[3449],{"type":26,"tag":354,"props":3450,"children":3451},{"__ignoreMap":7},[3452],{"type":31,"value":3444},{"type":26,"tag":76,"props":3454,"children":3456},{"id":3455},"第五部分复杂-bug-排查",[3457],{"type":31,"value":3458},"第五部分：复杂 Bug 排查",{"type":26,"tag":1361,"props":3460,"children":3462},{"id":3461},"_51-竞态条件",[3463],{"type":31,"value":3464},"5.1 竞态条件",{"type":26,"tag":346,"props":3466,"children":3469},{"code":3467,"language":3304,"meta":7,"className":3468},"// 场景：偶发的数据不一致问题\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",[3306],[3470],{"type":26,"tag":354,"props":3471,"children":3472},{"__ignoreMap":7},[3473],{"type":31,"value":3467},{"type":26,"tag":1361,"props":3475,"children":3477},{"id":3476},"_52-分布式系统问题",[3478],{"type":31,"value":3479},"5.2 分布式系统问题",{"type":26,"tag":346,"props":3481,"children":3484},{"code":3482,"language":3304,"meta":7,"className":3483},"// 场景：微服务间的数据不一致\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",[3306],[3485],{"type":26,"tag":354,"props":3486,"children":3487},{"__ignoreMap":7},[3488],{"type":31,"value":3482},{"type":26,"tag":76,"props":3490,"children":3492},{"id":3491},"第六部分ai-调试工作流",[3493],{"type":31,"value":3494},"第六部分：AI 调试工作流",{"type":26,"tag":1361,"props":3496,"children":3498},{"id":3497},"_61-我的调试流程",[3499],{"type":31,"value":3500},"6.1 我的调试流程",{"type":26,"tag":346,"props":3502,"children":3504},{"code":3503},"┌────────────────────────────────────────────────────────────┐\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",[3505],{"type":26,"tag":354,"props":3506,"children":3507},{"__ignoreMap":7},[3508],{"type":31,"value":3503},{"type":26,"tag":1361,"props":3510,"children":3512},{"id":3511},"_62-调试对话模板",[3513],{"type":31,"value":3514},"6.2 调试对话模板",{"type":26,"tag":346,"props":3516,"children":3519},{"code":3517,"language":911,"meta":7,"className":3518},"## 第一轮：问题描述\n\n我遇到了一个问题：[简述问题]\n\n错误信息：\n",[3157],[3520],{"type":26,"tag":354,"props":3521,"children":3522},{"__ignoreMap":7},[3523],{"type":31,"value":3517},{"type":26,"tag":27,"props":3525,"children":3526},{},[3527],{"type":26,"tag":3167,"props":3528,"children":3529},{},[3530],{"type":31,"value":3531},"粘贴完整错误",{"type":26,"tag":346,"props":3533,"children":3535},{"code":3534},"\n相关代码：\n```javascript\n[粘贴代码]\n",[3536],{"type":26,"tag":354,"props":3537,"children":3538},{"__ignoreMap":7},[3539],{"type":31,"value":3534},{"type":26,"tag":1035,"props":3541,"children":3542},{},[],{"type":26,"tag":76,"props":3544,"children":3546},{"id":3545},"第二轮补充信息",[3547],{"type":31,"value":3548},"第二轮：补充信息",{"type":26,"tag":27,"props":3550,"children":3551},{},[3552],{"type":31,"value":3553},"根据你的建议，我添加了日志，发现：",{"type":26,"tag":292,"props":3555,"children":3556},{},[3557,3565],{"type":26,"tag":296,"props":3558,"children":3559},{},[3560],{"type":26,"tag":3167,"props":3561,"children":3562},{},[3563],{"type":31,"value":3564},"发现 1",{"type":26,"tag":296,"props":3566,"children":3567},{},[3568],{"type":26,"tag":3167,"props":3569,"children":3570},{},[3571],{"type":31,"value":3572},"发现 2",{"type":26,"tag":27,"props":3574,"children":3575},{},[3576,3578,3583],{"type":31,"value":3577},"这是否说明问题出在 ",{"type":26,"tag":3167,"props":3579,"children":3580},{},[3581],{"type":31,"value":3582},"你的猜测",{"type":31,"value":3584},"？",{"type":26,"tag":1035,"props":3586,"children":3587},{},[],{"type":26,"tag":76,"props":3589,"children":3591},{"id":3590},"第三轮确认修复",[3592],{"type":31,"value":3593},"第三轮：确认修复",{"type":26,"tag":27,"props":3595,"children":3596},{},[3597],{"type":31,"value":3598},"我按照你的建议修改了代码：",{"type":26,"tag":346,"props":3600,"children":3603},{"code":3601,"language":3329,"meta":7,"className":3602},"[粘贴修改后的代码]\n",[3331],[3604],{"type":26,"tag":354,"props":3605,"children":3606},{"__ignoreMap":7},[3607],{"type":31,"value":3601},{"type":26,"tag":27,"props":3609,"children":3610},{},[3611],{"type":31,"value":3612},"请确认这个修复是否正确，以及是否有其他潜在问题。",{"type":26,"tag":1035,"props":3614,"children":3615},{},[],{"type":26,"tag":76,"props":3617,"children":3619},{"id":3618},"第四轮预防",[3620],{"type":31,"value":3621},"第四轮：预防",{"type":26,"tag":27,"props":3623,"children":3624},{},[3625],{"type":31,"value":3626},"这个问题已解决。请建议：",{"type":26,"tag":965,"props":3628,"children":3629},{},[3630,3635,3640],{"type":26,"tag":296,"props":3631,"children":3632},{},[3633],{"type":31,"value":3634},"如何防止类似问题再次发生？",{"type":26,"tag":296,"props":3636,"children":3637},{},[3638],{"type":31,"value":3639},"应该添加什么测试用例？",{"type":26,"tag":296,"props":3641,"children":3642},{},[3643],{"type":31,"value":3644},"有什么最佳实践可以参考？",{"type":26,"tag":346,"props":3646,"children":3648},{"code":3647},"\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",[3649],{"type":26,"tag":354,"props":3650,"children":3651},{"__ignoreMap":7},[3652],{"type":31,"value":3647},{"title":7,"searchDepth":897,"depth":897,"links":3654},[3655,3656,3657,3662,3666,3671,3675,3679,3680,3681],{"id":3038,"depth":900,"text":3041},{"id":3044,"depth":900,"text":3047},{"id":3065,"depth":900,"text":3068,"children":3658},[3659,3660,3661],{"id":3071,"depth":897,"text":3074},{"id":3149,"depth":897,"text":3152},{"id":3314,"depth":897,"text":3317},{"id":3356,"depth":900,"text":3359,"children":3663},[3664,3665],{"id":3362,"depth":897,"text":3365},{"id":3382,"depth":897,"text":3385},{"id":3402,"depth":900,"text":3405,"children":3667},[3668,3669,3670],{"id":3408,"depth":897,"text":3411},{"id":3423,"depth":897,"text":3426},{"id":3438,"depth":897,"text":3441},{"id":3455,"depth":900,"text":3458,"children":3672},[3673,3674],{"id":3461,"depth":897,"text":3464},{"id":3476,"depth":897,"text":3479},{"id":3491,"depth":900,"text":3494,"children":3676},[3677,3678],{"id":3497,"depth":897,"text":3500},{"id":3511,"depth":897,"text":3514},{"id":3545,"depth":900,"text":3548},{"id":3590,"depth":900,"text":3593},{"id":3618,"depth":900,"text":3621},"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":3686,"image":17,"imageQuery":18,"pexelsPhotoId":19,"pexelsUrl":20,"featured":6,"readingTime":21,"body":3687,"_type":911,"_id":912,"_source":913,"_file":914,"_stem":915,"_extension":916},[13,14,15,16],{"type":23,"children":3688,"toc":4399},[3689,3693,3697,3721,3725,3800,3804,3808,3883,3887,3891,3895,3899,3914,3918,3929,3933,3937,3941,3949,3953,3957,3996,4000,4004,4008,4027,4031,4041,4045,4049,4057,4061,4065,4073,4077,4081,4085,4138,4142,4146,4150,4225,4229,4233,4237,4256,4260,4264,4356,4360,4364,4368],{"type":26,"tag":27,"props":3690,"children":3691},{},[3692],{"type":31,"value":32},{"type":26,"tag":27,"props":3694,"children":3695},{},[3696],{"type":31,"value":37},{"type":26,"tag":27,"props":3698,"children":3699},{},[3700,3701,3705,3706,3710,3711,3715,3716,3720],{"type":31,"value":42},{"type":26,"tag":44,"props":3702,"children":3703},{"href":46},[3704],{"type":31,"value":49},{"type":31,"value":51},{"type":26,"tag":44,"props":3707,"children":3708},{"href":54},[3709],{"type":31,"value":57},{"type":31,"value":51},{"type":26,"tag":44,"props":3712,"children":3713},{"href":61},[3714],{"type":31,"value":64},{"type":31,"value":66},{"type":26,"tag":44,"props":3717,"children":3718},{"href":69},[3719],{"type":31,"value":72},{"type":31,"value":74},{"type":26,"tag":76,"props":3722,"children":3723},{"id":78},[3724],{"type":31,"value":81},{"type":26,"tag":83,"props":3726,"children":3727},{},[3728,3742],{"type":26,"tag":87,"props":3729,"children":3730},{},[3731],{"type":26,"tag":91,"props":3732,"children":3733},{},[3734,3738],{"type":26,"tag":95,"props":3735,"children":3736},{},[3737],{"type":31,"value":99},{"type":26,"tag":95,"props":3739,"children":3740},{},[3741],{"type":31,"value":104},{"type":26,"tag":106,"props":3743,"children":3744},{},[3745,3756,3767,3778,3789],{"type":26,"tag":91,"props":3746,"children":3747},{},[3748,3752],{"type":26,"tag":113,"props":3749,"children":3750},{},[3751],{"type":31,"value":117},{"type":26,"tag":113,"props":3753,"children":3754},{},[3755],{"type":31,"value":122},{"type":26,"tag":91,"props":3757,"children":3758},{},[3759,3763],{"type":26,"tag":113,"props":3760,"children":3761},{},[3762],{"type":31,"value":130},{"type":26,"tag":113,"props":3764,"children":3765},{},[3766],{"type":31,"value":122},{"type":26,"tag":91,"props":3768,"children":3769},{},[3770,3774],{"type":26,"tag":113,"props":3771,"children":3772},{},[3773],{"type":31,"value":142},{"type":26,"tag":113,"props":3775,"children":3776},{},[3777],{"type":31,"value":122},{"type":26,"tag":91,"props":3779,"children":3780},{},[3781,3785],{"type":26,"tag":113,"props":3782,"children":3783},{},[3784],{"type":31,"value":154},{"type":26,"tag":113,"props":3786,"children":3787},{},[3788],{"type":31,"value":159},{"type":26,"tag":91,"props":3790,"children":3791},{},[3792,3796],{"type":26,"tag":113,"props":3793,"children":3794},{},[3795],{"type":31,"value":167},{"type":26,"tag":113,"props":3797,"children":3798},{},[3799],{"type":31,"value":159},{"type":26,"tag":27,"props":3801,"children":3802},{},[3803],{"type":31,"value":176},{"type":26,"tag":76,"props":3805,"children":3806},{"id":179},[3807],{"type":31,"value":182},{"type":26,"tag":83,"props":3809,"children":3810},{},[3811,3825],{"type":26,"tag":87,"props":3812,"children":3813},{},[3814],{"type":26,"tag":91,"props":3815,"children":3816},{},[3817,3821],{"type":26,"tag":95,"props":3818,"children":3819},{},[3820],{"type":31,"value":196},{"type":26,"tag":95,"props":3822,"children":3823},{},[3824],{"type":31,"value":201},{"type":26,"tag":106,"props":3826,"children":3827},{},[3828,3839,3850,3861,3872],{"type":26,"tag":91,"props":3829,"children":3830},{},[3831,3835],{"type":26,"tag":113,"props":3832,"children":3833},{},[3834],{"type":31,"value":212},{"type":26,"tag":113,"props":3836,"children":3837},{},[3838],{"type":31,"value":217},{"type":26,"tag":91,"props":3840,"children":3841},{},[3842,3846],{"type":26,"tag":113,"props":3843,"children":3844},{},[3845],{"type":31,"value":225},{"type":26,"tag":113,"props":3847,"children":3848},{},[3849],{"type":31,"value":230},{"type":26,"tag":91,"props":3851,"children":3852},{},[3853,3857],{"type":26,"tag":113,"props":3854,"children":3855},{},[3856],{"type":31,"value":238},{"type":26,"tag":113,"props":3858,"children":3859},{},[3860],{"type":31,"value":243},{"type":26,"tag":91,"props":3862,"children":3863},{},[3864,3868],{"type":26,"tag":113,"props":3865,"children":3866},{},[3867],{"type":31,"value":251},{"type":26,"tag":113,"props":3869,"children":3870},{},[3871],{"type":31,"value":256},{"type":26,"tag":91,"props":3873,"children":3874},{},[3875,3879],{"type":26,"tag":113,"props":3876,"children":3877},{},[3878],{"type":31,"value":264},{"type":26,"tag":113,"props":3880,"children":3881},{},[3882],{"type":31,"value":269},{"type":26,"tag":27,"props":3884,"children":3885},{},[3886],{"type":31,"value":274},{"type":26,"tag":27,"props":3888,"children":3889},{},[3890],{"type":31,"value":279},{"type":26,"tag":76,"props":3892,"children":3893},{"id":282},[3894],{"type":31,"value":285},{"type":26,"tag":27,"props":3896,"children":3897},{},[3898],{"type":31,"value":290},{"type":26,"tag":292,"props":3900,"children":3901},{},[3902,3906,3910],{"type":26,"tag":296,"props":3903,"children":3904},{},[3905],{"type":31,"value":300},{"type":26,"tag":296,"props":3907,"children":3908},{},[3909],{"type":31,"value":305},{"type":26,"tag":296,"props":3911,"children":3912},{},[3913],{"type":31,"value":310},{"type":26,"tag":27,"props":3915,"children":3916},{},[3917],{"type":31,"value":315},{"type":26,"tag":292,"props":3919,"children":3920},{},[3921,3925],{"type":26,"tag":296,"props":3922,"children":3923},{},[3924],{"type":31,"value":323},{"type":26,"tag":296,"props":3926,"children":3927},{},[3928],{"type":31,"value":328},{"type":26,"tag":27,"props":3930,"children":3931},{},[3932],{"type":31,"value":333},{"type":26,"tag":76,"props":3934,"children":3935},{"id":336},[3936],{"type":31,"value":339},{"type":26,"tag":27,"props":3938,"children":3939},{},[3940],{"type":31,"value":344},{"type":26,"tag":346,"props":3942,"children":3944},{"className":3943,"code":350,"language":351,"meta":7},[349],[3945],{"type":26,"tag":354,"props":3946,"children":3947},{"__ignoreMap":7},[3948],{"type":31,"value":350},{"type":26,"tag":27,"props":3950,"children":3951},{},[3952],{"type":31,"value":362},{"type":26,"tag":27,"props":3954,"children":3955},{},[3956],{"type":31,"value":367},{"type":26,"tag":292,"props":3958,"children":3959},{},[3960,3969,3978,3987],{"type":26,"tag":296,"props":3961,"children":3962},{},[3963,3968],{"type":26,"tag":354,"props":3964,"children":3966},{"className":3965},[],[3967],{"type":31,"value":379},{"type":31,"value":381},{"type":26,"tag":296,"props":3970,"children":3971},{},[3972,3977],{"type":26,"tag":354,"props":3973,"children":3975},{"className":3974},[],[3976],{"type":31,"value":390},{"type":31,"value":392},{"type":26,"tag":296,"props":3979,"children":3980},{},[3981,3986],{"type":26,"tag":354,"props":3982,"children":3984},{"className":3983},[],[3985],{"type":31,"value":401},{"type":31,"value":403},{"type":26,"tag":296,"props":3988,"children":3989},{},[3990,3995],{"type":26,"tag":354,"props":3991,"children":3993},{"className":3992},[],[3994],{"type":31,"value":412},{"type":31,"value":414},{"type":26,"tag":27,"props":3997,"children":3998},{},[3999],{"type":31,"value":419},{"type":26,"tag":76,"props":4001,"children":4002},{"id":422},[4003],{"type":31,"value":425},{"type":26,"tag":27,"props":4005,"children":4006},{},[4007],{"type":31,"value":430},{"type":26,"tag":292,"props":4009,"children":4010},{},[4011,4015,4019,4023],{"type":26,"tag":296,"props":4012,"children":4013},{},[4014],{"type":31,"value":438},{"type":26,"tag":296,"props":4016,"children":4017},{},[4018],{"type":31,"value":443},{"type":26,"tag":296,"props":4020,"children":4021},{},[4022],{"type":31,"value":448},{"type":26,"tag":296,"props":4024,"children":4025},{},[4026],{"type":31,"value":453},{"type":26,"tag":27,"props":4028,"children":4029},{},[4030],{"type":31,"value":458},{"type":26,"tag":27,"props":4032,"children":4033},{},[4034,4035,4040],{"type":31,"value":463},{"type":26,"tag":354,"props":4036,"children":4038},{"className":4037},[],[4039],{"type":31,"value":469},{"type":31,"value":471},{"type":26,"tag":76,"props":4042,"children":4043},{"id":474},[4044],{"type":31,"value":477},{"type":26,"tag":27,"props":4046,"children":4047},{},[4048],{"type":31,"value":482},{"type":26,"tag":346,"props":4050,"children":4052},{"className":4051,"code":487,"language":31,"meta":7},[486],[4053],{"type":26,"tag":354,"props":4054,"children":4055},{"__ignoreMap":7},[4056],{"type":31,"value":487},{"type":26,"tag":27,"props":4058,"children":4059},{},[4060],{"type":31,"value":497},{"type":26,"tag":27,"props":4062,"children":4063},{},[4064],{"type":31,"value":502},{"type":26,"tag":346,"props":4066,"children":4068},{"className":4067,"code":506,"language":31,"meta":7},[486],[4069],{"type":26,"tag":354,"props":4070,"children":4071},{"__ignoreMap":7},[4072],{"type":31,"value":506},{"type":26,"tag":27,"props":4074,"children":4075},{},[4076],{"type":31,"value":516},{"type":26,"tag":76,"props":4078,"children":4079},{"id":519},[4080],{"type":31,"value":522},{"type":26,"tag":27,"props":4082,"children":4083},{},[4084],{"type":31,"value":527},{"type":26,"tag":83,"props":4086,"children":4087},{},[4088,4102],{"type":26,"tag":87,"props":4089,"children":4090},{},[4091],{"type":26,"tag":91,"props":4092,"children":4093},{},[4094,4098],{"type":26,"tag":95,"props":4095,"children":4096},{},[4097],{"type":31,"value":541},{"type":26,"tag":95,"props":4099,"children":4100},{},[4101],{"type":31,"value":546},{"type":26,"tag":106,"props":4103,"children":4104},{},[4105,4116,4127],{"type":26,"tag":91,"props":4106,"children":4107},{},[4108,4112],{"type":26,"tag":113,"props":4109,"children":4110},{},[4111],{"type":31,"value":557},{"type":26,"tag":113,"props":4113,"children":4114},{},[4115],{"type":31,"value":562},{"type":26,"tag":91,"props":4117,"children":4118},{},[4119,4123],{"type":26,"tag":113,"props":4120,"children":4121},{},[4122],{"type":31,"value":570},{"type":26,"tag":113,"props":4124,"children":4125},{},[4126],{"type":31,"value":575},{"type":26,"tag":91,"props":4128,"children":4129},{},[4130,4134],{"type":26,"tag":113,"props":4131,"children":4132},{},[4133],{"type":31,"value":583},{"type":26,"tag":113,"props":4135,"children":4136},{},[4137],{"type":31,"value":588},{"type":26,"tag":27,"props":4139,"children":4140},{},[4141],{"type":31,"value":593},{"type":26,"tag":76,"props":4143,"children":4144},{"id":596},[4145],{"type":31,"value":599},{"type":26,"tag":27,"props":4147,"children":4148},{},[4149],{"type":31,"value":604},{"type":26,"tag":83,"props":4151,"children":4152},{},[4153,4167],{"type":26,"tag":87,"props":4154,"children":4155},{},[4156],{"type":26,"tag":91,"props":4157,"children":4158},{},[4159,4163],{"type":26,"tag":95,"props":4160,"children":4161},{},[4162],{"type":31,"value":618},{"type":26,"tag":95,"props":4164,"children":4165},{},[4166],{"type":31,"value":623},{"type":26,"tag":106,"props":4168,"children":4169},{},[4170,4181,4192,4203,4214],{"type":26,"tag":91,"props":4171,"children":4172},{},[4173,4177],{"type":26,"tag":113,"props":4174,"children":4175},{},[4176],{"type":31,"value":634},{"type":26,"tag":113,"props":4178,"children":4179},{},[4180],{"type":31,"value":639},{"type":26,"tag":91,"props":4182,"children":4183},{},[4184,4188],{"type":26,"tag":113,"props":4185,"children":4186},{},[4187],{"type":31,"value":647},{"type":26,"tag":113,"props":4189,"children":4190},{},[4191],{"type":31,"value":652},{"type":26,"tag":91,"props":4193,"children":4194},{},[4195,4199],{"type":26,"tag":113,"props":4196,"children":4197},{},[4198],{"type":31,"value":660},{"type":26,"tag":113,"props":4200,"children":4201},{},[4202],{"type":31,"value":665},{"type":26,"tag":91,"props":4204,"children":4205},{},[4206,4210],{"type":26,"tag":113,"props":4207,"children":4208},{},[4209],{"type":31,"value":673},{"type":26,"tag":113,"props":4211,"children":4212},{},[4213],{"type":31,"value":678},{"type":26,"tag":91,"props":4215,"children":4216},{},[4217,4221],{"type":26,"tag":113,"props":4218,"children":4219},{},[4220],{"type":31,"value":686},{"type":26,"tag":113,"props":4222,"children":4223},{},[4224],{"type":31,"value":691},{"type":26,"tag":27,"props":4226,"children":4227},{},[4228],{"type":31,"value":696},{"type":26,"tag":76,"props":4230,"children":4231},{"id":699},[4232],{"type":31,"value":702},{"type":26,"tag":27,"props":4234,"children":4235},{},[4236],{"type":31,"value":707},{"type":26,"tag":292,"props":4238,"children":4239},{},[4240,4244,4248,4252],{"type":26,"tag":296,"props":4241,"children":4242},{},[4243],{"type":31,"value":715},{"type":26,"tag":296,"props":4245,"children":4246},{},[4247],{"type":31,"value":720},{"type":26,"tag":296,"props":4249,"children":4250},{},[4251],{"type":31,"value":725},{"type":26,"tag":296,"props":4253,"children":4254},{},[4255],{"type":31,"value":730},{"type":26,"tag":27,"props":4257,"children":4258},{},[4259],{"type":31,"value":735},{"type":26,"tag":76,"props":4261,"children":4262},{"id":738},[4263],{"type":31,"value":741},{"type":26,"tag":292,"props":4265,"children":4267},{"className":4266},[745],[4268,4276,4284,4292,4300,4308,4316,4324,4332,4340,4348],{"type":26,"tag":296,"props":4269,"children":4271},{"className":4270},[750],[4272,4275],{"type":26,"tag":753,"props":4273,"children":4274},{"disabled":755,"type":756},[],{"type":31,"value":759},{"type":26,"tag":296,"props":4277,"children":4279},{"className":4278},[750],[4280,4283],{"type":26,"tag":753,"props":4281,"children":4282},{"disabled":755,"type":756},[],{"type":31,"value":768},{"type":26,"tag":296,"props":4285,"children":4287},{"className":4286},[750],[4288,4291],{"type":26,"tag":753,"props":4289,"children":4290},{"disabled":755,"type":756},[],{"type":31,"value":777},{"type":26,"tag":296,"props":4293,"children":4295},{"className":4294},[750],[4296,4299],{"type":26,"tag":753,"props":4297,"children":4298},{"disabled":755,"type":756},[],{"type":31,"value":786},{"type":26,"tag":296,"props":4301,"children":4303},{"className":4302},[750],[4304,4307],{"type":26,"tag":753,"props":4305,"children":4306},{"disabled":755,"type":756},[],{"type":31,"value":795},{"type":26,"tag":296,"props":4309,"children":4311},{"className":4310},[750],[4312,4315],{"type":26,"tag":753,"props":4313,"children":4314},{"disabled":755,"type":756},[],{"type":31,"value":804},{"type":26,"tag":296,"props":4317,"children":4319},{"className":4318},[750],[4320,4323],{"type":26,"tag":753,"props":4321,"children":4322},{"disabled":755,"type":756},[],{"type":31,"value":813},{"type":26,"tag":296,"props":4325,"children":4327},{"className":4326},[750],[4328,4331],{"type":26,"tag":753,"props":4329,"children":4330},{"disabled":755,"type":756},[],{"type":31,"value":822},{"type":26,"tag":296,"props":4333,"children":4335},{"className":4334},[750],[4336,4339],{"type":26,"tag":753,"props":4337,"children":4338},{"disabled":755,"type":756},[],{"type":31,"value":831},{"type":26,"tag":296,"props":4341,"children":4343},{"className":4342},[750],[4344,4347],{"type":26,"tag":753,"props":4345,"children":4346},{"disabled":755,"type":756},[],{"type":31,"value":840},{"type":26,"tag":296,"props":4349,"children":4351},{"className":4350},[750],[4352,4355],{"type":26,"tag":753,"props":4353,"children":4354},{"disabled":755,"type":756},[],{"type":31,"value":849},{"type":26,"tag":76,"props":4357,"children":4358},{"id":852},[4359],{"type":31,"value":852},{"type":26,"tag":27,"props":4361,"children":4362},{},[4363],{"type":31,"value":859},{"type":26,"tag":27,"props":4365,"children":4366},{},[4367],{"type":31,"value":864},{"type":26,"tag":292,"props":4369,"children":4370},{},[4371,4378,4385,4392],{"type":26,"tag":296,"props":4372,"children":4373},{},[4374],{"type":26,"tag":44,"props":4375,"children":4376},{"href":46},[4377],{"type":31,"value":49},{"type":26,"tag":296,"props":4379,"children":4380},{},[4381],{"type":26,"tag":44,"props":4382,"children":4383},{"href":61},[4384],{"type":31,"value":64},{"type":26,"tag":296,"props":4386,"children":4387},{},[4388],{"type":26,"tag":44,"props":4389,"children":4390},{"href":54},[4391],{"type":31,"value":57},{"type":26,"tag":296,"props":4393,"children":4394},{},[4395],{"type":26,"tag":44,"props":4396,"children":4397},{"href":69},[4398],{"type":31,"value":72},{"title":7,"searchDepth":897,"depth":897,"links":4400},[4401,4402,4403,4404,4405,4406,4407,4408,4409,4410,4411],{"id":78,"depth":900,"text":81},{"id":179,"depth":900,"text":182},{"id":282,"depth":900,"text":285},{"id":336,"depth":900,"text":339},{"id":422,"depth":900,"text":425},{"id":474,"depth":900,"text":477},{"id":519,"depth":900,"text":522},{"id":596,"depth":900,"text":599},{"id":699,"depth":900,"text":702},{"id":738,"depth":900,"text":741},{"id":852,"depth":900,"text":852},1778331340584]