[{"data":1,"prerenderedAt":7589},["ShallowReactive",2],{"article-/topics/ai/ai-agent-incident-forensics-root-cause-analysis":3,"related-ai":2676,"content-query-tWFhLp9zKG":5435},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"topic":5,"author":11,"tags":12,"image":18,"featured":6,"readingTime":19,"body":20,"_type":2670,"_id":2671,"_source":2672,"_file":2673,"_stem":2674,"_extension":2675},"/topics/ai/ai-agent-incident-forensics-root-cause-analysis","ai",false,"","AI agent Incident Forensics：安全事件发生后，如何快速定位根因和影响范围","出事了怎么办？本文提供事件响应的标准流程、取证方法和分析工具,结合真实案例展示如何从海量日志中快速定位问题,实现快速响应与根因分析。","2026-06-15","HTMLPAGE 团队",[13,14,15,16,17],"incident forensics","root cause analysis","security investigation","incident response","forensic timeline","/images/articles/as09-featured.jpeg",13,{"type":21,"children":22,"toc":2617},"root",[23,32,38,43,89,94,127,137,149,154,161,166,199,205,210,242,247,253,258,301,306,312,317,327,333,340,345,398,408,416,422,427,569,575,580,591,597,603,608,622,631,675,686,692,697,706,749,755,760,769,812,821,827,832,841,884,893,899,904,913,966,975,1020,1025,1031,1036,1045,1054,1062,1068,1073,1082,1115,1125,1136,1142,1147,1156,1209,1218,1271,1276,1282,1287,1296,1349,1358,1401,1407,1412,1421,1464,1474,1485,1491,1496,1505,1558,1567,1610,1615,1621,1626,1634,1697,1706,1714,1732,1738,1743,1751,1757,1762,1770,1778,1784,1790,1799,1850,1856,1864,1917,1927,1933,1941,1994,2000,2008,2061,2067,2075,2128,2134,2142,2195,2201,2209,2272,2278,2293,2336,2345,2388,2397,2440,2445,2490,2496,2501,2595,2599],{"type":24,"tag":25,"props":26,"children":28},"element","h2",{"id":27},"为什么需要-incident-forensics",[29],{"type":30,"value":31},"text","为什么需要 Incident Forensics?",{"type":24,"tag":33,"props":34,"children":35},"p",{},[36],{"type":30,"value":37},"2025 年 9 月的一个凌晨,某金融科技公司的监控告警响起:检测到异常的 API 调用模式,某个 AI agent 在过去 1 小时内调用了 10,000 次 OpenAI API,产生了 $5,000 的账单。",{"type":24,"tag":33,"props":39,"children":40},{},[41],{"type":30,"value":42},"on-call 工程师立即介入,但面临以下挑战:",{"type":24,"tag":44,"props":45,"children":46},"ul",{},[47,59,69,79],{"type":24,"tag":48,"props":49,"children":50},"li",{},[51,57],{"type":24,"tag":52,"props":53,"children":54},"strong",{},[55],{"type":30,"value":56},"不知道从哪里开始",{"type":30,"value":58},": 日志分散在 10 个不同的系统中。",{"type":24,"tag":48,"props":60,"children":61},{},[62,67],{"type":24,"tag":52,"props":63,"children":64},{},[65],{"type":30,"value":66},"不知道影响范围",{"type":30,"value":68},": 有多少用户的数据可能被泄露?",{"type":24,"tag":48,"props":70,"children":71},{},[72,77],{"type":24,"tag":52,"props":73,"children":74},{},[75],{"type":30,"value":76},"不知道根因",{"type":30,"value":78},": 是代码 bug、配置错误还是外部攻击?",{"type":24,"tag":48,"props":80,"children":81},{},[82,87],{"type":24,"tag":52,"props":83,"children":84},{},[85],{"type":30,"value":86},"时间压力",{"type":30,"value":88},": 必须在 4 小时内向管理层汇报初步调查结果。",{"type":24,"tag":33,"props":90,"children":91},{},[92],{"type":30,"value":93},"最终,团队花了 8 小时才定位到根因:一个测试环境的 API Key 被误配置到生产环境,且没有速率限制。这次事故导致了:",{"type":24,"tag":44,"props":95,"children":96},{},[97,107,117],{"type":24,"tag":48,"props":98,"children":99},{},[100,105],{"type":24,"tag":52,"props":101,"children":102},{},[103],{"type":30,"value":104},"直接损失",{"type":30,"value":106},": $5,000 的 API 费用。",{"type":24,"tag":48,"props":108,"children":109},{},[110,115],{"type":24,"tag":52,"props":111,"children":112},{},[113],{"type":30,"value":114},"间接损失",{"type":30,"value":116},": 8 小时的工程师时间 + 客户信任下降。",{"type":24,"tag":48,"props":118,"children":119},{},[120,125],{"type":24,"tag":52,"props":121,"children":122},{},[123],{"type":30,"value":124},"合规风险",{"type":30,"value":126},": 如果涉及用户数据泄露,可能面临 GDPR 罚款。",{"type":24,"tag":33,"props":128,"children":129},{},[130,135],{"type":24,"tag":52,"props":131,"children":132},{},[133],{"type":30,"value":134},"根本原因",{"type":30,"value":136},": 缺乏系统化的 Incident Forensics(事件取证)流程和工具,导致响应缓慢、调查低效。",{"type":24,"tag":33,"props":138,"children":139},{},[140,142,147],{"type":30,"value":141},"Incident Forensics 就是为了解决这些问题而设计的系统性方案。它不是简单的\"查日志\",而是提供",{"type":24,"tag":52,"props":143,"children":144},{},[145],{"type":30,"value":146},"事件响应流程、取证方法、分析工具和根因分析技术",{"type":30,"value":148},"的完整框架,确保安全事件发生后能够快速定位问题并采取正确的补救措施。",{"type":24,"tag":25,"props":150,"children":152},{"id":151},"为什么需要-incident-forensics-1",[153],{"type":30,"value":31},{"type":24,"tag":155,"props":156,"children":158},"h3",{"id":157},"_1-快速响应rapid-response",[159],{"type":30,"value":160},"1. 快速响应(Rapid Response)",{"type":24,"tag":33,"props":162,"children":163},{},[164],{"type":30,"value":165},"安全事件的响应速度直接影响损失大小:",{"type":24,"tag":44,"props":167,"children":168},{},[169,179,189],{"type":24,"tag":48,"props":170,"children":171},{},[172,177],{"type":24,"tag":52,"props":173,"children":174},{},[175],{"type":30,"value":176},"每延迟 1 小时",{"type":30,"value":178},": 攻击者可能窃取更多数据、造成更大破坏。",{"type":24,"tag":48,"props":180,"children":181},{},[182,187],{"type":24,"tag":52,"props":183,"children":184},{},[185],{"type":30,"value":186},"每延迟 1 天",{"type":30,"value":188},": 合规罚款可能增加,客户信任进一步下降。",{"type":24,"tag":48,"props":190,"children":191},{},[192,197],{"type":24,"tag":52,"props":193,"children":194},{},[195],{"type":30,"value":196},"快速响应的好处",{"type":30,"value":198},": 最小化损失、满足合规要求、维护声誉。",{"type":24,"tag":155,"props":200,"children":202},{"id":201},"_2-根因定位root-cause-identification",[203],{"type":30,"value":204},"2. 根因定位(Root Cause Identification)",{"type":24,"tag":33,"props":206,"children":207},{},[208],{"type":30,"value":209},"只有找到根因,才能防止类似事件再次发生:",{"type":24,"tag":44,"props":211,"children":212},{},[213,223,233],{"type":24,"tag":48,"props":214,"children":215},{},[216,221],{"type":24,"tag":52,"props":217,"children":218},{},[219],{"type":30,"value":220},"表面症状",{"type":30,"value":222},": API 调用异常增加。",{"type":24,"tag":48,"props":224,"children":225},{},[226,231],{"type":24,"tag":52,"props":227,"children":228},{},[229],{"type":30,"value":230},"直接原因",{"type":30,"value":232},": 测试 API Key 被误配置到生产环境。",{"type":24,"tag":48,"props":234,"children":235},{},[236,240],{"type":24,"tag":52,"props":237,"children":238},{},[239],{"type":30,"value":134},{"type":30,"value":241},": 缺乏配置管理流程、没有自动化验证、缺少速率限制。",{"type":24,"tag":33,"props":243,"children":244},{},[245],{"type":30,"value":246},"如果不找到根本原因,只是修复表面症状,问题会反复出现。",{"type":24,"tag":155,"props":248,"children":250},{"id":249},"_3-责任追溯accountability",[251],{"type":30,"value":252},"3. 责任追溯(Accountability)",{"type":24,"tag":33,"props":254,"children":255},{},[256],{"type":30,"value":257},"事件发生后,需要明确:",{"type":24,"tag":44,"props":259,"children":260},{},[261,271,281,291],{"type":24,"tag":48,"props":262,"children":263},{},[264,269],{"type":24,"tag":52,"props":265,"children":266},{},[267],{"type":30,"value":268},"谁触发了事件",{"type":30,"value":270},": 是哪个用户、哪个系统、哪个定时任务?",{"type":24,"tag":48,"props":272,"children":273},{},[274,279],{"type":24,"tag":52,"props":275,"children":276},{},[277],{"type":30,"value":278},"谁负责响应",{"type":30,"value":280},": on-call 工程师、安全团队、管理层各自的角色。",{"type":24,"tag":48,"props":282,"children":283},{},[284,289],{"type":24,"tag":52,"props":285,"children":286},{},[287],{"type":30,"value":288},"谁负责修复",{"type":30,"value":290},": 开发团队、运维团队、安全团队的分工。",{"type":24,"tag":48,"props":292,"children":293},{},[294,299],{"type":24,"tag":52,"props":295,"children":296},{},[297],{"type":30,"value":298},"谁负责预防",{"type":30,"value":300},": 如何改进流程和系统,防止类似事件再次发生。",{"type":24,"tag":25,"props":302,"children":304},{"id":303},"事件响应流程",[305],{"type":30,"value":303},{"type":24,"tag":155,"props":307,"children":309},{"id":308},"nist-incident-response-lifecycle",[310],{"type":30,"value":311},"NIST Incident Response Lifecycle",{"type":24,"tag":33,"props":313,"children":314},{},[315],{"type":30,"value":316},"遵循 NIST SP 800-61 定义的事件响应生命周期:",{"type":24,"tag":318,"props":319,"children":321},"pre",{"code":320},"┌─────────────┐\n│ Preparation │  ← 准备阶段:制定计划、培训团队、部署工具\n└──────┬──────┘\n       │\n       ▼\n┌─────────────┐\n│Detection &  │  ← 检测与分析:发现事件、评估严重程度、确定范围\n│ Analysis    │\n└──────┬──────┘\n       │\n       ▼\n┌─────────────┐\n│Containment, │  ← 遏制、 eradication、恢复:阻止事件扩散、消除威胁、恢复正常\n│Eradication &│\n│ Recovery    │\n└──────┬──────┘\n       │\n       ▼\n┌─────────────┐\n│Post-Incident│  ← 事后总结:经验教训、改进措施、文档更新\n│ Activity    │\n└─────────────┘\n",[322],{"type":24,"tag":323,"props":324,"children":325},"code",{"__ignoreMap":7},[326],{"type":30,"value":320},{"type":24,"tag":155,"props":328,"children":330},{"id":329},"阶段一detection-analysis检测与分析",[331],{"type":30,"value":332},"阶段一:Detection & Analysis(检测与分析)",{"type":24,"tag":334,"props":335,"children":337},"h4",{"id":336},"_11-事件发现",[338],{"type":30,"value":339},"1.1 事件发现",{"type":24,"tag":33,"props":341,"children":342},{},[343],{"type":30,"value":344},"事件可能通过以下方式被发现:",{"type":24,"tag":44,"props":346,"children":347},{},[348,358,368,378,388],{"type":24,"tag":48,"props":349,"children":350},{},[351,356],{"type":24,"tag":52,"props":352,"children":353},{},[354],{"type":30,"value":355},"自动告警",{"type":30,"value":357},":监控系统检测到异常(如 API 调用量突增、错误率上升)。",{"type":24,"tag":48,"props":359,"children":360},{},[361,366],{"type":24,"tag":52,"props":362,"children":363},{},[364],{"type":30,"value":365},"用户报告",{"type":30,"value":367},":客户投诉功能异常或数据泄露。",{"type":24,"tag":48,"props":369,"children":370},{},[371,376],{"type":24,"tag":52,"props":372,"children":373},{},[374],{"type":30,"value":375},"内部发现",{"type":30,"value":377},":工程师在日常工作中发现异常。",{"type":24,"tag":48,"props":379,"children":380},{},[381,386],{"type":24,"tag":52,"props":382,"children":383},{},[384],{"type":30,"value":385},"第三方通知",{"type":30,"value":387},":云服务商、安全厂商通知安全事件。",{"type":24,"tag":48,"props":389,"children":390},{},[391,396],{"type":24,"tag":52,"props":392,"children":393},{},[394],{"type":30,"value":395},"监管通报",{"type":30,"value":397},":数据保护机构通知数据泄露。",{"type":24,"tag":33,"props":399,"children":400},{},[401,406],{"type":24,"tag":52,"props":402,"children":403},{},[404],{"type":30,"value":405},"关键指标",{"type":30,"value":407},":",{"type":24,"tag":44,"props":409,"children":410},{},[411],{"type":24,"tag":48,"props":412,"children":413},{},[414],{"type":30,"value":415},"MTTD(Mean Time To Detect):平均检测时间,目标 \u003C 1 小时。",{"type":24,"tag":334,"props":417,"children":419},{"id":418},"_12-事件分类与优先级",[420],{"type":30,"value":421},"1.2 事件分类与优先级",{"type":24,"tag":33,"props":423,"children":424},{},[425],{"type":30,"value":426},"根据严重程度对事件进行分类:",{"type":24,"tag":428,"props":429,"children":430},"table",{},[431,460],{"type":24,"tag":432,"props":433,"children":434},"thead",{},[435],{"type":24,"tag":436,"props":437,"children":438},"tr",{},[439,445,450,455],{"type":24,"tag":440,"props":441,"children":442},"th",{},[443],{"type":30,"value":444},"级别",{"type":24,"tag":440,"props":446,"children":447},{},[448],{"type":30,"value":449},"描述",{"type":24,"tag":440,"props":451,"children":452},{},[453],{"type":30,"value":454},"响应时间",{"type":24,"tag":440,"props":456,"children":457},{},[458],{"type":30,"value":459},"示例",{"type":24,"tag":461,"props":462,"children":463},"tbody",{},[464,491,517,543],{"type":24,"tag":436,"props":465,"children":466},{},[467,476,481,486],{"type":24,"tag":468,"props":469,"children":470},"td",{},[471],{"type":24,"tag":52,"props":472,"children":473},{},[474],{"type":30,"value":475},"Critical",{"type":24,"tag":468,"props":477,"children":478},{},[479],{"type":30,"value":480},"严重影响业务,数据泄露,合规违规",{"type":24,"tag":468,"props":482,"children":483},{},[484],{"type":30,"value":485},"立即(\u003C 15 分钟)",{"type":24,"tag":468,"props":487,"children":488},{},[489],{"type":30,"value":490},"生产数据库被入侵,PII 数据泄露",{"type":24,"tag":436,"props":492,"children":493},{},[494,502,507,512],{"type":24,"tag":468,"props":495,"children":496},{},[497],{"type":24,"tag":52,"props":498,"children":499},{},[500],{"type":30,"value":501},"High",{"type":24,"tag":468,"props":503,"children":504},{},[505],{"type":30,"value":506},"影响部分业务,潜在安全风险",{"type":24,"tag":468,"props":508,"children":509},{},[510],{"type":30,"value":511},"\u003C 1 小时",{"type":24,"tag":468,"props":513,"children":514},{},[515],{"type":30,"value":516},"API Key 泄露,但未发现滥用",{"type":24,"tag":436,"props":518,"children":519},{},[520,528,533,538],{"type":24,"tag":468,"props":521,"children":522},{},[523],{"type":24,"tag":52,"props":524,"children":525},{},[526],{"type":30,"value":527},"Medium",{"type":24,"tag":468,"props":529,"children":530},{},[531],{"type":30,"value":532},"轻微影响,可控的安全问题",{"type":24,"tag":468,"props":534,"children":535},{},[536],{"type":30,"value":537},"\u003C 4 小时",{"type":24,"tag":468,"props":539,"children":540},{},[541],{"type":30,"value":542},"配置错误导致服务降级",{"type":24,"tag":436,"props":544,"children":545},{},[546,554,559,564],{"type":24,"tag":468,"props":547,"children":548},{},[549],{"type":24,"tag":52,"props":550,"children":551},{},[552],{"type":30,"value":553},"Low",{"type":24,"tag":468,"props":555,"children":556},{},[557],{"type":30,"value":558},"最小影响,例行安全问题",{"type":24,"tag":468,"props":560,"children":561},{},[562],{"type":30,"value":563},"\u003C 24 小时",{"type":24,"tag":468,"props":565,"children":566},{},[567],{"type":30,"value":568},"过期的 SSL 证书警告",{"type":24,"tag":334,"props":570,"children":572},{"id":571},"_13-初步评估",[573],{"type":30,"value":574},"1.3 初步评估",{"type":24,"tag":33,"props":576,"children":577},{},[578],{"type":30,"value":579},"快速评估事件的影响范围和紧急程度:",{"type":24,"tag":318,"props":581,"children":586},{"code":582,"language":583,"meta":7,"className":584},"interface IncidentAssessment {\n  incident_id: string;\n  detected_at: string;\n  severity: \"critical\" | \"high\" | \"medium\" | \"low\";\n  \n  // 影响范围\n  affected_systems: string[];\n  affected_users?: number;\n  data_exposed?: DataClassification[];\n  financial_impact?: number;\n  \n  // 初步判断\n  suspected_cause?: string;\n  attack_vector?: string;\n  threat_actor?: \"internal\" | \"external\" | \"unknown\";\n  \n  // 响应团队\n  incident_commander: string;\n  responders: string[];\n  \n  // 时间线\n  estimated_start_time?: string;\n  containment_eta?: string;\n}\n","typescript",[585],"language-typescript",[587],{"type":24,"tag":323,"props":588,"children":589},{"__ignoreMap":7},[590],{"type":30,"value":582},{"type":24,"tag":155,"props":592,"children":594},{"id":593},"阶段二containment遏制",[595],{"type":30,"value":596},"阶段二:Containment(遏制)",{"type":24,"tag":334,"props":598,"children":600},{"id":599},"_21-短期遏制short-term-containment",[601],{"type":30,"value":602},"2.1 短期遏制(Short-term Containment)",{"type":24,"tag":33,"props":604,"children":605},{},[606],{"type":30,"value":607},"立即采取措施阻止事件扩散:",{"type":24,"tag":33,"props":609,"children":610},{},[611,616,620],{"type":24,"tag":52,"props":612,"children":613},{},[614],{"type":30,"value":615},"示例场景",{"type":24,"tag":617,"props":618,"children":619},"api",{},[],{"type":30,"value":621}," Key 泄露导致异常调用",{"type":24,"tag":33,"props":623,"children":624},{},[625,630],{"type":24,"tag":52,"props":626,"children":627},{},[628],{"type":30,"value":629},"短期遏制措施",{"type":30,"value":407},{"type":24,"tag":632,"props":633,"children":634},"ol",{},[635,645,655,665],{"type":24,"tag":48,"props":636,"children":637},{},[638,643],{"type":24,"tag":52,"props":639,"children":640},{},[641],{"type":30,"value":642},"撤销泄露的凭证",{"type":30,"value":644},":立即在 Vault 或云控制台中吊销 API Key。",{"type":24,"tag":48,"props":646,"children":647},{},[648,653],{"type":24,"tag":52,"props":649,"children":650},{},[651],{"type":30,"value":652},"启用速率限制",{"type":30,"value":654},":临时降低 API 调用速率限制。",{"type":24,"tag":48,"props":656,"children":657},{},[658,663],{"type":24,"tag":52,"props":659,"children":660},{},[661],{"type":30,"value":662},"隔离受影响的系统",{"type":30,"value":664},":将受影响的 agent 实例从负载均衡器中移除。",{"type":24,"tag":48,"props":666,"children":667},{},[668,673],{"type":24,"tag":52,"props":669,"children":670},{},[671],{"type":30,"value":672},"阻断可疑 IP",{"type":30,"value":674},":如果检测到来自特定 IP 的异常调用,在 WAF 中阻断。",{"type":24,"tag":318,"props":676,"children":681},{"code":677,"language":678,"meta":7,"className":679},"# 撤销 API Key\naws secretsmanager rotate-secret --secret-id prod/openai/api-key\n\n# 启用速率限制\nkubectl patch deployment customer-support-agent \\\n  -p '{\"spec\":{\"template\":{\"spec\":{\"containers\":[{\"name\":\"agent\",\"env\":[{\"name\":\"RATE_LIMIT\",\"value\":\"100\"}]}]}}}}'\n\n# 阻断可疑 IP\naws wafv2 update-ip-set --name blocked-ips --scope REGIONAL \\\n  --addresses 203.0.113.42/32\n","bash",[680],"language-bash",[682],{"type":24,"tag":323,"props":683,"children":684},{"__ignoreMap":7},[685],{"type":30,"value":677},{"type":24,"tag":334,"props":687,"children":689},{"id":688},"_22-长期遏制long-term-containment",[690],{"type":30,"value":691},"2.2 长期遏制(Long-term Containment)",{"type":24,"tag":33,"props":693,"children":694},{},[695],{"type":30,"value":696},"实施更持久的措施,确保事件不会复发:",{"type":24,"tag":33,"props":698,"children":699},{},[700,705],{"type":24,"tag":52,"props":701,"children":702},{},[703],{"type":30,"value":704},"长期遏制措施",{"type":30,"value":407},{"type":24,"tag":632,"props":707,"children":708},{},[709,719,729,739],{"type":24,"tag":48,"props":710,"children":711},{},[712,717],{"type":24,"tag":52,"props":713,"children":714},{},[715],{"type":30,"value":716},"修复配置错误",{"type":30,"value":718},":更正 API Key 配置,确保测试和生产环境隔离。",{"type":24,"tag":48,"props":720,"children":721},{},[722,727],{"type":24,"tag":52,"props":723,"children":724},{},[725],{"type":30,"value":726},"加强访问控制",{"type":30,"value":728},":实施更严格的 RBAC,限制谁可以访问生产凭证。",{"type":24,"tag":48,"props":730,"children":731},{},[732,737],{"type":24,"tag":52,"props":733,"children":734},{},[735],{"type":30,"value":736},"增强监控",{"type":30,"value":738},":添加更细粒度的告警规则,提前检测异常。",{"type":24,"tag":48,"props":740,"children":741},{},[742,747],{"type":24,"tag":52,"props":743,"children":744},{},[745],{"type":30,"value":746},"实施防御深度",{"type":30,"value":748},":多层防护(速率限制、预算告警、自动熔断)。",{"type":24,"tag":155,"props":750,"children":752},{"id":751},"阶段三eradication消除",[753],{"type":30,"value":754},"阶段三:Eradication(消除)",{"type":24,"tag":33,"props":756,"children":757},{},[758],{"type":30,"value":759},"彻底消除威胁根源:",{"type":24,"tag":33,"props":761,"children":762},{},[763,768],{"type":24,"tag":52,"props":764,"children":765},{},[766],{"type":30,"value":767},"消除措施",{"type":30,"value":407},{"type":24,"tag":632,"props":770,"children":771},{},[772,782,792,802],{"type":24,"tag":48,"props":773,"children":774},{},[775,780],{"type":24,"tag":52,"props":776,"children":777},{},[778],{"type":30,"value":779},"修复代码 bug",{"type":30,"value":781},":如果事件由代码缺陷引起,修复并部署补丁。",{"type":24,"tag":48,"props":783,"children":784},{},[785,790],{"type":24,"tag":52,"props":786,"children":787},{},[788],{"type":30,"value":789},"清除恶意软件",{"type":30,"value":791},":如果系统被入侵,扫描并清除恶意软件。",{"type":24,"tag":48,"props":793,"children":794},{},[795,800],{"type":24,"tag":52,"props":796,"children":797},{},[798],{"type":30,"value":799},"重置凭证",{"type":30,"value":801},":重置所有可能泄露的凭证(密码、API Key、Token)。",{"type":24,"tag":48,"props":803,"children":804},{},[805,810],{"type":24,"tag":52,"props":806,"children":807},{},[808],{"type":30,"value":809},"修补漏洞",{"type":30,"value":811},":应用安全补丁,修复已知漏洞。",{"type":24,"tag":318,"props":813,"children":816},{"code":814,"language":678,"meta":7,"className":815},"# 修复代码并部署\ngit checkout -b fix/api-key-leak\n# ... 修改代码 ...\ngit commit -m \"Fix: Prevent test API key from being used in production\"\ngit push origin fix/api-key-leak\n# CI/CD 自动部署\n\n# 重置所有相关凭证\nvault token revoke -self\naws iam create-access-key --user-name prod-service-account\n",[680],[817],{"type":24,"tag":323,"props":818,"children":819},{"__ignoreMap":7},[820],{"type":30,"value":814},{"type":24,"tag":155,"props":822,"children":824},{"id":823},"阶段四recovery恢复",[825],{"type":30,"value":826},"阶段四:Recovery(恢复)",{"type":24,"tag":33,"props":828,"children":829},{},[830],{"type":30,"value":831},"恢复正常运行:",{"type":24,"tag":33,"props":833,"children":834},{},[835,840],{"type":24,"tag":52,"props":836,"children":837},{},[838],{"type":30,"value":839},"恢复步骤",{"type":30,"value":407},{"type":24,"tag":632,"props":842,"children":843},{},[844,854,864,874],{"type":24,"tag":48,"props":845,"children":846},{},[847,852],{"type":24,"tag":52,"props":848,"children":849},{},[850],{"type":30,"value":851},"验证修复",{"type":30,"value":853},":在测试环境中验证修复是否有效。",{"type":24,"tag":48,"props":855,"children":856},{},[857,862],{"type":24,"tag":52,"props":858,"children":859},{},[860],{"type":30,"value":861},"渐进式恢复",{"type":30,"value":863},":先在少量实例上部署修复,验证无误后再全量部署。",{"type":24,"tag":48,"props":865,"children":866},{},[867,872],{"type":24,"tag":52,"props":868,"children":869},{},[870],{"type":30,"value":871},"监控验证",{"type":30,"value":873},":密切监控恢复后的系统,确保没有遗留问题。",{"type":24,"tag":48,"props":875,"children":876},{},[877,882],{"type":24,"tag":52,"props":878,"children":879},{},[880],{"type":30,"value":881},"通知相关方",{"type":30,"value":883},":告知客户、合作伙伴、监管机构事件已解决。",{"type":24,"tag":318,"props":885,"children":888},{"code":886,"language":583,"meta":7,"className":887},"// 渐进式部署(Canary Release)\nasync function canaryDeploy(fixVersion: string): Promise\u003Cvoid> {\n  // Step 1: 部署到 5% 的实例\n  await deployToCanary(fixVersion, 0.05);\n  \n  // Step 2: 监控 30 分钟\n  const metrics = await monitorCanary(30 * 60 * 1000);\n  \n  if (metrics.error_rate \u003C 0.01 && metrics.latency_p95 \u003C 500) {\n    // Step 3: 扩展到 50%\n    await deployToCanary(fixVersion, 0.50);\n    \n    // Step 4: 再监控 30 分钟\n    const metrics2 = await monitorCanary(30 * 60 * 1000);\n    \n    if (metrics2.error_rate \u003C 0.01) {\n      // Step 5: 全量部署\n      await deployToAll(fixVersion);\n    }\n  }\n}\n",[585],[889],{"type":24,"tag":323,"props":890,"children":891},{"__ignoreMap":7},[892],{"type":30,"value":886},{"type":24,"tag":155,"props":894,"children":896},{"id":895},"阶段五lessons-learned经验教训",[897],{"type":30,"value":898},"阶段五:Lessons Learned(经验教训)",{"type":24,"tag":33,"props":900,"children":901},{},[902],{"type":30,"value":903},"事后总结,防止类似事件再次发生:",{"type":24,"tag":33,"props":905,"children":906},{},[907,912],{"type":24,"tag":52,"props":908,"children":909},{},[910],{"type":30,"value":911},"事后复盘会议(Postmortem)",{"type":30,"value":407},{"type":24,"tag":632,"props":914,"children":915},{},[916,926,936,946,956],{"type":24,"tag":48,"props":917,"children":918},{},[919,924],{"type":24,"tag":52,"props":920,"children":921},{},[922],{"type":30,"value":923},"时间线重建",{"type":30,"value":925},":详细记录事件从发生到解决的每个步骤。",{"type":24,"tag":48,"props":927,"children":928},{},[929,934],{"type":24,"tag":52,"props":930,"children":931},{},[932],{"type":30,"value":933},"根因分析",{"type":30,"value":935},":使用 5 Whys、Fishbone Diagram 等方法找出根本原因。",{"type":24,"tag":48,"props":937,"children":938},{},[939,944],{"type":24,"tag":52,"props":940,"children":941},{},[942],{"type":30,"value":943},"改进措施",{"type":30,"value":945},":列出具体的改进行动项(Action Items)。",{"type":24,"tag":48,"props":947,"children":948},{},[949,954],{"type":24,"tag":52,"props":950,"children":951},{},[952],{"type":30,"value":953},"责任分配",{"type":30,"value":955},":为每个行动项分配责任人和截止日期。",{"type":24,"tag":48,"props":957,"children":958},{},[959,964],{"type":24,"tag":52,"props":960,"children":961},{},[962],{"type":30,"value":963},"文档更新",{"type":30,"value":965},":更新 runbook、playbook、架构文档。",{"type":24,"tag":33,"props":967,"children":968},{},[969,974],{"type":24,"tag":52,"props":970,"children":971},{},[972],{"type":30,"value":973},"示例 Action Items",{"type":30,"value":407},{"type":24,"tag":44,"props":976,"children":979},{"className":977},[978],"contains-task-list",[980,993,1002,1011],{"type":24,"tag":48,"props":981,"children":984},{"className":982},[983],"task-list-item",[985,991],{"type":24,"tag":986,"props":987,"children":990},"input",{"disabled":988,"type":989},true,"checkbox",[],{"type":30,"value":992}," 实施配置验证 pipeline,防止测试凭证进入生产环境(责任人: DevOps Team, 截止: 2 周)",{"type":24,"tag":48,"props":994,"children":996},{"className":995},[983],[997,1000],{"type":24,"tag":986,"props":998,"children":999},{"disabled":988,"type":989},[],{"type":30,"value":1001}," 添加 API 调用预算告警,当费用超过阈值时自动告警(责任人: Finance Team, 截止: 1 周)",{"type":24,"tag":48,"props":1003,"children":1005},{"className":1004},[983],[1006,1009],{"type":24,"tag":986,"props":1007,"children":1008},{"disabled":988,"type":989},[],{"type":30,"value":1010}," 实施自动熔断机制,当 API 调用异常时自动停止(责任人: Engineering Team, 截止: 3 周)",{"type":24,"tag":48,"props":1012,"children":1014},{"className":1013},[983],[1015,1018],{"type":24,"tag":986,"props":1016,"children":1017},{"disabled":988,"type":989},[],{"type":30,"value":1019}," 定期进行安全演练,提高团队应急响应能力(责任人: Security Team, 截止: 每季度)",{"type":24,"tag":25,"props":1021,"children":1023},{"id":1022},"取证方法",[1024],{"type":30,"value":1022},{"type":24,"tag":155,"props":1026,"children":1028},{"id":1027},"timeline-reconstruction时间线重建",[1029],{"type":30,"value":1030},"Timeline Reconstruction(时间线重建)",{"type":24,"tag":33,"props":1032,"children":1033},{},[1034],{"type":30,"value":1035},"重建事件的完整时间线,从第一个异常信号到最终解决。",{"type":24,"tag":318,"props":1037,"children":1040},{"code":1038,"language":583,"meta":7,"className":1039},"interface TimelineEvent {\n  timestamp: string;\n  event_type: \"detection\" | \"response\" | \"containment\" | \"eradication\" | \"recovery\";\n  description: string;\n  actor: string;\n  system: string;\n  evidence_source: string;\n}\n\nasync function reconstructTimeline(incidentId: string): Promise\u003CTimelineEvent[]> {\n  const events: TimelineEvent[] = [];\n  \n  // 从审计日志中收集事件\n  const auditLogs = await queryAuditLogs(incidentId);\n  for (const log of auditLogs) {\n    events.push({\n      timestamp: log.timestamp,\n      event_type: classifyEventType(log),\n      description: log.message,\n      actor: log.actor_id,\n      system: log.system,\n      evidence_source: \"audit_log\",\n    });\n  }\n  \n  // 从监控系统中收集事件\n  const alerts = await queryAlerts(incidentId);\n  for (const alert of alerts) {\n    events.push({\n      timestamp: alert.triggered_at,\n      event_type: \"detection\",\n      description: alert.message,\n      actor: \"monitoring_system\",\n      system: alert.system,\n      evidence_source: \"monitoring\",\n    });\n  }\n  \n  // 从工单系统中收集事件\n  const tickets = await queryTickets(incidentId);\n  for (const ticket of tickets) {\n    events.push({\n      timestamp: ticket.created_at,\n      event_type: \"response\",\n      description: `Ticket created: ${ticket.title}`,\n      actor: ticket.assignee,\n      system: \"ticketing_system\",\n      evidence_source: \"ticket\",\n    });\n  }\n  \n  // 按时间排序\n  events.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());\n  \n  return events;\n}\n",[585],[1041],{"type":24,"tag":323,"props":1042,"children":1043},{"__ignoreMap":7},[1044],{"type":30,"value":1038},{"type":24,"tag":33,"props":1046,"children":1047},{},[1048,1053],{"type":24,"tag":52,"props":1049,"children":1050},{},[1051],{"type":30,"value":1052},"可视化时间线",{"type":30,"value":407},{"type":24,"tag":318,"props":1055,"children":1057},{"code":1056},"2025-09-15 02:13:45  [DETECTION]  Alert triggered: API call spike detected (Source: monitoring)\n2025-09-15 02:14:12  [RESPONSE]   On-call engineer acknowledged alert (Source: PagerDuty)\n2025-09-15 02:15:30  [RESPONSE]   Incident commander assigned: Alice (Source: ticketing)\n2025-09-15 02:17:45  [ANALYSIS]   Identified abnormal API key usage (Source: audit log)\n2025-09-15 02:20:00  [CONTAINMENT] Revoked compromised API key (Source: Vault)\n2025-09-15 02:22:15  [CONTAINMENT] Enabled rate limiting (Source: Kubernetes)\n2025-09-15 02:30:00  [ERADICATION] Fixed configuration error (Source: Git)\n2025-09-15 02:45:00  [RECOVERY]   Deployed fix to canary instances (Source: CI/CD)\n2025-09-15 03:15:00  [RECOVERY]   Full deployment completed (Source: CI/CD)\n2025-09-15 03:30:00  [RECOVERY]   System stabilized, monitoring normal (Source: monitoring)\n",[1058],{"type":24,"tag":323,"props":1059,"children":1060},{"__ignoreMap":7},[1061],{"type":30,"value":1056},{"type":24,"tag":155,"props":1063,"children":1065},{"id":1064},"log-correlation日志关联",[1066],{"type":30,"value":1067},"Log Correlation(日志关联)",{"type":24,"tag":33,"props":1069,"children":1070},{},[1071],{"type":30,"value":1072},"将来自不同系统的日志关联起来,形成完整的事件视图。",{"type":24,"tag":33,"props":1074,"children":1075},{},[1076,1081],{"type":24,"tag":52,"props":1077,"children":1078},{},[1079],{"type":30,"value":1080},"关键技术",{"type":30,"value":407},{"type":24,"tag":44,"props":1083,"children":1084},{},[1085,1095,1105],{"type":24,"tag":48,"props":1086,"children":1087},{},[1088,1093],{"type":24,"tag":52,"props":1089,"children":1090},{},[1091],{"type":30,"value":1092},"Correlation ID",{"type":30,"value":1094},": 在分布式系统中传递唯一的请求 ID,关联跨服务的日志。",{"type":24,"tag":48,"props":1096,"children":1097},{},[1098,1103],{"type":24,"tag":52,"props":1099,"children":1100},{},[1101],{"type":30,"value":1102},"Session ID",{"type":30,"value":1104},": 关联同一用户的多次操作。",{"type":24,"tag":48,"props":1106,"children":1107},{},[1108,1113],{"type":24,"tag":52,"props":1109,"children":1110},{},[1111],{"type":30,"value":1112},"Timestamp Alignment",{"type":30,"value":1114},": 确保所有系统使用同步的时钟(NTP),便于时间对齐。",{"type":24,"tag":33,"props":1116,"children":1117},{},[1118,1123],{"type":24,"tag":52,"props":1119,"children":1120},{},[1121],{"type":30,"value":1122},"示例查询",{"type":30,"value":1124},"(Elasticsearch):",{"type":24,"tag":318,"props":1126,"children":1131},{"code":1127,"language":1128,"meta":7,"className":1129},"GET /logs-*/_search\n{\n  \"query\": {\n    \"bool\": {\n      \"must\": [\n        { \"term\": { \"correlation_id\": \"corr_abc123\" } },\n        { \"range\": { \"timestamp\": { \"gte\": \"2025-09-15T02:00:00Z\", \"lte\": \"2025-09-15T04:00:00Z\" } } }\n      ]\n    }\n  },\n  \"sort\": [\n    { \"timestamp\": { \"order\": \"asc\" } }\n  ]\n}\n","json",[1130],"language-json",[1132],{"type":24,"tag":323,"props":1133,"children":1134},{"__ignoreMap":7},[1135],{"type":30,"value":1127},{"type":24,"tag":155,"props":1137,"children":1139},{"id":1138},"artifact-analysis证据分析",[1140],{"type":30,"value":1141},"Artifact Analysis(证据分析)",{"type":24,"tag":33,"props":1143,"children":1144},{},[1145],{"type":30,"value":1146},"收集和分析数字证据:",{"type":24,"tag":33,"props":1148,"children":1149},{},[1150,1155],{"type":24,"tag":52,"props":1151,"children":1152},{},[1153],{"type":30,"value":1154},"证据类型",{"type":30,"value":407},{"type":24,"tag":44,"props":1157,"children":1158},{},[1159,1169,1179,1189,1199],{"type":24,"tag":48,"props":1160,"children":1161},{},[1162,1167],{"type":24,"tag":52,"props":1163,"children":1164},{},[1165],{"type":30,"value":1166},"日志文件",{"type":30,"value":1168},": 应用日志、系统日志、审计日志。",{"type":24,"tag":48,"props":1170,"children":1171},{},[1172,1177],{"type":24,"tag":52,"props":1173,"children":1174},{},[1175],{"type":30,"value":1176},"内存转储",{"type":30,"value":1178},": 进程内存快照,用于分析运行时状态。",{"type":24,"tag":48,"props":1180,"children":1181},{},[1182,1187],{"type":24,"tag":52,"props":1183,"children":1184},{},[1185],{"type":30,"value":1186},"磁盘镜像",{"type":30,"value":1188},": 完整的磁盘副本,用于离线分析。",{"type":24,"tag":48,"props":1190,"children":1191},{},[1192,1197],{"type":24,"tag":52,"props":1193,"children":1194},{},[1195],{"type":30,"value":1196},"网络抓包",{"type":30,"value":1198},": PCAP 文件,分析网络通信。",{"type":24,"tag":48,"props":1200,"children":1201},{},[1202,1207],{"type":24,"tag":52,"props":1203,"children":1204},{},[1205],{"type":30,"value":1206},"配置文件",{"type":30,"value":1208},": 系统配置、应用配置、环境变量。",{"type":24,"tag":33,"props":1210,"children":1211},{},[1212,1217],{"type":24,"tag":52,"props":1213,"children":1214},{},[1215],{"type":30,"value":1216},"分析工具",{"type":30,"value":407},{"type":24,"tag":44,"props":1219,"children":1220},{},[1221,1231,1241,1251,1261],{"type":24,"tag":48,"props":1222,"children":1223},{},[1224,1229],{"type":24,"tag":52,"props":1225,"children":1226},{},[1227],{"type":30,"value":1228},"日志分析",{"type":30,"value":1230},": ELK Stack(Elasticsearch、Logstash、Kibana)、Splunk。",{"type":24,"tag":48,"props":1232,"children":1233},{},[1234,1239],{"type":24,"tag":52,"props":1235,"children":1236},{},[1237],{"type":30,"value":1238},"内存分析",{"type":30,"value":1240},": Volatility、Rekall。",{"type":24,"tag":48,"props":1242,"children":1243},{},[1244,1249],{"type":24,"tag":52,"props":1245,"children":1246},{},[1247],{"type":30,"value":1248},"磁盘分析",{"type":30,"value":1250},": Autopsy、The Sleuth Kit。",{"type":24,"tag":48,"props":1252,"children":1253},{},[1254,1259],{"type":24,"tag":52,"props":1255,"children":1256},{},[1257],{"type":30,"value":1258},"网络分析",{"type":30,"value":1260},": Wireshark、tcpdump。",{"type":24,"tag":48,"props":1262,"children":1263},{},[1264,1269],{"type":24,"tag":52,"props":1265,"children":1266},{},[1267],{"type":30,"value":1268},"取证平台",{"type":30,"value":1270},": GRR、Magnet AXIOM。",{"type":24,"tag":25,"props":1272,"children":1274},{"id":1273},"分析工具链",[1275],{"type":30,"value":1273},{"type":24,"tag":155,"props":1277,"children":1279},{"id":1278},"siemsecurity-information-and-event-management",[1280],{"type":30,"value":1281},"SIEM(Security Information and Event Management)",{"type":24,"tag":33,"props":1283,"children":1284},{},[1285],{"type":30,"value":1286},"集中收集和分析安全日志。",{"type":24,"tag":33,"props":1288,"children":1289},{},[1290,1295],{"type":24,"tag":52,"props":1291,"children":1292},{},[1293],{"type":30,"value":1294},"常见 SIEM 工具",{"type":30,"value":407},{"type":24,"tag":44,"props":1297,"children":1298},{},[1299,1309,1319,1329,1339],{"type":24,"tag":48,"props":1300,"children":1301},{},[1302,1307],{"type":24,"tag":52,"props":1303,"children":1304},{},[1305],{"type":30,"value":1306},"Splunk",{"type":30,"value":1308},": 功能强大,但成本高。",{"type":24,"tag":48,"props":1310,"children":1311},{},[1312,1317],{"type":24,"tag":52,"props":1313,"children":1314},{},[1315],{"type":30,"value":1316},"ELK Stack",{"type":30,"value":1318},": 开源,灵活,但需要自己维护。",{"type":24,"tag":48,"props":1320,"children":1321},{},[1322,1327],{"type":24,"tag":52,"props":1323,"children":1324},{},[1325],{"type":30,"value":1326},"Azure Sentinel",{"type":30,"value":1328},": 云原生,与 Azure 生态深度集成。",{"type":24,"tag":48,"props":1330,"children":1331},{},[1332,1337],{"type":24,"tag":52,"props":1333,"children":1334},{},[1335],{"type":30,"value":1336},"AWS Security Hub",{"type":30,"value":1338},": AWS 原生的安全管理服务。",{"type":24,"tag":48,"props":1340,"children":1341},{},[1342,1347],{"type":24,"tag":52,"props":1343,"children":1344},{},[1345],{"type":30,"value":1346},"Datadog Security Monitoring",{"type":30,"value":1348},": 与 Datadog 监控无缝集成。",{"type":24,"tag":33,"props":1350,"children":1351},{},[1352,1357],{"type":24,"tag":52,"props":1353,"children":1354},{},[1355],{"type":30,"value":1356},"典型用例",{"type":30,"value":407},{"type":24,"tag":44,"props":1359,"children":1360},{},[1361,1371,1381,1391],{"type":24,"tag":48,"props":1362,"children":1363},{},[1364,1369],{"type":24,"tag":52,"props":1365,"children":1366},{},[1367],{"type":30,"value":1368},"实时告警",{"type":30,"value":1370},": 检测异常登录、权限提升、数据 exfiltration。",{"type":24,"tag":48,"props":1372,"children":1373},{},[1374,1379],{"type":24,"tag":52,"props":1375,"children":1376},{},[1377],{"type":30,"value":1378},"日志聚合",{"type":30,"value":1380},": 集中存储和查询所有系统的日志。",{"type":24,"tag":48,"props":1382,"children":1383},{},[1384,1389],{"type":24,"tag":52,"props":1385,"children":1386},{},[1387],{"type":30,"value":1388},"合规报告",{"type":30,"value":1390},": 自动生成 SOC 2、GDPR、HIPAA 合规报告。",{"type":24,"tag":48,"props":1392,"children":1393},{},[1394,1399],{"type":24,"tag":52,"props":1395,"children":1396},{},[1397],{"type":30,"value":1398},"威胁狩猎",{"type":30,"value":1400},": 主动搜索潜在的威胁指标(IOCs)。",{"type":24,"tag":155,"props":1402,"children":1404},{"id":1403},"log-aggregator日志聚合器",[1405],{"type":30,"value":1406},"Log Aggregator(日志聚合器)",{"type":24,"tag":33,"props":1408,"children":1409},{},[1410],{"type":30,"value":1411},"收集和索引日志,支持快速检索。",{"type":24,"tag":33,"props":1413,"children":1414},{},[1415,1420],{"type":24,"tag":52,"props":1416,"children":1417},{},[1418],{"type":30,"value":1419},"实现方式",{"type":30,"value":407},{"type":24,"tag":44,"props":1422,"children":1423},{},[1424,1434,1444,1454],{"type":24,"tag":48,"props":1425,"children":1426},{},[1427,1432],{"type":24,"tag":52,"props":1428,"children":1429},{},[1430],{"type":30,"value":1431},"Fluentd",{"type":30,"value":1433},": 轻量级,插件丰富。",{"type":24,"tag":48,"props":1435,"children":1436},{},[1437,1442],{"type":24,"tag":52,"props":1438,"children":1439},{},[1440],{"type":30,"value":1441},"Vector",{"type":30,"value":1443},": 高性能,用 Rust 编写。",{"type":24,"tag":48,"props":1445,"children":1446},{},[1447,1452],{"type":24,"tag":52,"props":1448,"children":1449},{},[1450],{"type":30,"value":1451},"Logstash",{"type":30,"value":1453},": 功能强大,但资源消耗大。",{"type":24,"tag":48,"props":1455,"children":1456},{},[1457,1462],{"type":24,"tag":52,"props":1458,"children":1459},{},[1460],{"type":30,"value":1461},"Filebeat",{"type":30,"value":1463},": 轻量级,适合边缘节点。",{"type":24,"tag":33,"props":1465,"children":1466},{},[1467,1472],{"type":24,"tag":52,"props":1468,"children":1469},{},[1470],{"type":30,"value":1471},"配置示例",{"type":30,"value":1473},"(Vector):",{"type":24,"tag":318,"props":1475,"children":1480},{"code":1476,"language":1477,"meta":7,"className":1478},"[sources.app_logs]\ntype = \"file\"\ninclude = [\"/var/log/app/*.log\"]\n\n[transforms.parse_json]\ntype = \"remap\"\ninputs = [\"app_logs\"]\nsource = '''\n. = parse_json!(string!(.message))\n'''\n\n[sinks.elasticsearch]\ntype = \"elasticsearch\"\ninputs = [\"parse_json\"]\nendpoints = [\"https://elasticsearch.example.com:9200\"]\nindex = \"logs-%Y.%m.%d\"\n","toml",[1479],"language-toml",[1481],{"type":24,"tag":323,"props":1482,"children":1483},{"__ignoreMap":7},[1484],{"type":30,"value":1476},{"type":24,"tag":155,"props":1486,"children":1488},{"id":1487},"forensic-toolkit取证工具包",[1489],{"type":30,"value":1490},"Forensic Toolkit(取证工具包)",{"type":24,"tag":33,"props":1492,"children":1493},{},[1494],{"type":30,"value":1495},"专门的取证分析工具。",{"type":24,"tag":33,"props":1497,"children":1498},{},[1499,1504],{"type":24,"tag":52,"props":1500,"children":1501},{},[1502],{"type":30,"value":1503},"常见工具",{"type":30,"value":407},{"type":24,"tag":44,"props":1506,"children":1507},{},[1508,1518,1528,1538,1548],{"type":24,"tag":48,"props":1509,"children":1510},{},[1511,1516],{"type":24,"tag":52,"props":1512,"children":1513},{},[1514],{"type":30,"value":1515},"Autopsy",{"type":30,"value":1517},": 图形化的数字取证平台。",{"type":24,"tag":48,"props":1519,"children":1520},{},[1521,1526],{"type":24,"tag":52,"props":1522,"children":1523},{},[1524],{"type":30,"value":1525},"The Sleuth Kit",{"type":30,"value":1527},": 命令行取证工具集。",{"type":24,"tag":48,"props":1529,"children":1530},{},[1531,1536],{"type":24,"tag":52,"props":1532,"children":1533},{},[1534],{"type":30,"value":1535},"Volatility",{"type":30,"value":1537},": 内存取证框架。",{"type":24,"tag":48,"props":1539,"children":1540},{},[1541,1546],{"type":24,"tag":52,"props":1542,"children":1543},{},[1544],{"type":30,"value":1545},"Wireshark",{"type":30,"value":1547},": 网络协议分析器。",{"type":24,"tag":48,"props":1549,"children":1550},{},[1551,1556],{"type":24,"tag":52,"props":1552,"children":1553},{},[1554],{"type":30,"value":1555},"GRR Rapid Response",{"type":30,"value":1557},": 远程实时取证平台。",{"type":24,"tag":33,"props":1559,"children":1560},{},[1561,1566],{"type":24,"tag":52,"props":1562,"children":1563},{},[1564],{"type":30,"value":1565},"使用场景",{"type":30,"value":407},{"type":24,"tag":44,"props":1568,"children":1569},{},[1570,1580,1590,1600],{"type":24,"tag":48,"props":1571,"children":1572},{},[1573,1578],{"type":24,"tag":52,"props":1574,"children":1575},{},[1576],{"type":30,"value":1577},"恶意软件分析",{"type":30,"value":1579},": 逆向工程恶意软件,提取 IOCs。",{"type":24,"tag":48,"props":1581,"children":1582},{},[1583,1588],{"type":24,"tag":52,"props":1584,"children":1585},{},[1586],{"type":30,"value":1587},"数据恢复",{"type":30,"value":1589},": 从删除的文件中恢复数据。",{"type":24,"tag":48,"props":1591,"children":1592},{},[1593,1598],{"type":24,"tag":52,"props":1594,"children":1595},{},[1596],{"type":30,"value":1597},"网络取证",{"type":30,"value":1599},": 分析网络流量,发现 C&C 通信。",{"type":24,"tag":48,"props":1601,"children":1602},{},[1603,1608],{"type":24,"tag":52,"props":1604,"children":1605},{},[1606],{"type":30,"value":1607},"内存取证",{"type":30,"value":1609},": 分析进程内存,发现注入的代码。",{"type":24,"tag":25,"props":1611,"children":1613},{"id":1612},"根因分析技术",[1614],{"type":30,"value":1612},{"type":24,"tag":155,"props":1616,"children":1618},{"id":1617},"_5-whys五个为什么",[1619],{"type":30,"value":1620},"5 Whys(五个为什么)",{"type":24,"tag":33,"props":1622,"children":1623},{},[1624],{"type":30,"value":1625},"通过连续问\"为什么\"找出根本原因。",{"type":24,"tag":33,"props":1627,"children":1628},{},[1629,1633],{"type":24,"tag":52,"props":1630,"children":1631},{},[1632],{"type":30,"value":459},{"type":30,"value":407},{"type":24,"tag":44,"props":1635,"children":1636},{},[1637,1647,1657,1667,1677,1687],{"type":24,"tag":48,"props":1638,"children":1639},{},[1640,1645],{"type":24,"tag":52,"props":1641,"children":1642},{},[1643],{"type":30,"value":1644},"问题",{"type":30,"value":1646},": API 调用量异常增加。",{"type":24,"tag":48,"props":1648,"children":1649},{},[1650,1655],{"type":24,"tag":52,"props":1651,"children":1652},{},[1653],{"type":30,"value":1654},"Why 1",{"type":30,"value":1656},": 为什么 API 调用量增加? → 因为某个 agent 实例在循环调用 API。",{"type":24,"tag":48,"props":1658,"children":1659},{},[1660,1665],{"type":24,"tag":52,"props":1661,"children":1662},{},[1663],{"type":30,"value":1664},"Why 2",{"type":30,"value":1666},": 为什么会循环调用? → 因为代码中有 bug,重试逻辑没有退出条件。",{"type":24,"tag":48,"props":1668,"children":1669},{},[1670,1675],{"type":24,"tag":52,"props":1671,"children":1672},{},[1673],{"type":30,"value":1674},"Why 3",{"type":30,"value":1676},": 为什么会有这个 bug? → 因为代码审查时没有发现这个问题。",{"type":24,"tag":48,"props":1678,"children":1679},{},[1680,1685],{"type":24,"tag":52,"props":1681,"children":1682},{},[1683],{"type":30,"value":1684},"Why 4",{"type":30,"value":1686},": 为什么代码审查没发现? → 因为没有自动化测试覆盖这个场景。",{"type":24,"tag":48,"props":1688,"children":1689},{},[1690,1695],{"type":24,"tag":52,"props":1691,"children":1692},{},[1693],{"type":30,"value":1694},"Why 5",{"type":30,"value":1696},": 为什么没有自动化测试? → 因为团队没有建立完善的测试文化。",{"type":24,"tag":33,"props":1698,"children":1699},{},[1700,1704],{"type":24,"tag":52,"props":1701,"children":1702},{},[1703],{"type":30,"value":134},{"type":30,"value":1705},": 缺乏测试文化和自动化测试覆盖。",{"type":24,"tag":33,"props":1707,"children":1708},{},[1709,1713],{"type":24,"tag":52,"props":1710,"children":1711},{},[1712],{"type":30,"value":943},{"type":30,"value":407},{"type":24,"tag":44,"props":1715,"children":1716},{},[1717,1722,1727],{"type":24,"tag":48,"props":1718,"children":1719},{},[1720],{"type":30,"value":1721},"建立单元测试和集成测试覆盖率要求。",{"type":24,"tag":48,"props":1723,"children":1724},{},[1725],{"type":30,"value":1726},"实施代码审查 checklist,包括边界条件和异常处理。",{"type":24,"tag":48,"props":1728,"children":1729},{},[1730],{"type":30,"value":1731},"定期举办测试最佳实践培训。",{"type":24,"tag":155,"props":1733,"children":1735},{"id":1734},"fishbone-diagram鱼骨图",[1736],{"type":30,"value":1737},"Fishbone Diagram(鱼骨图)",{"type":24,"tag":33,"props":1739,"children":1740},{},[1741],{"type":30,"value":1742},"可视化地展示问题的各种可能原因。",{"type":24,"tag":318,"props":1744,"children":1746},{"code":1745},"                ┌─────────────┐\n                │  API Spike  │\n                └──────┬──────┘\n                       │\n    ┌──────────────────┼──────────────────┐\n    │                  │                   │\n┌───┴───┐        ┌────┴────┐        ┌────┴────┐\n│People │        │Process  │        │Technology│\n└───┬───┘        └────┬────┘        └────┬────┘\n    │                  │                   │\n ┌──┴──┐          ┌───┴───┐          ┌───┴───┐\n │Training│       │Code Review│      │Monitoring│\n │Workload│       │Testing     │      │Rate Limit│\n │Experience│     │Deployment  │      │Config Mgmt│\n └──────┘        └──────────┘        └────────┘\n",[1747],{"type":24,"tag":323,"props":1748,"children":1749},{"__ignoreMap":7},[1750],{"type":30,"value":1745},{"type":24,"tag":155,"props":1752,"children":1754},{"id":1753},"fault-tree-analysis故障树分析",[1755],{"type":30,"value":1756},"Fault Tree Analysis(故障树分析)",{"type":24,"tag":33,"props":1758,"children":1759},{},[1760],{"type":30,"value":1761},"自顶向下分析,找出导致故障的所有可能路径。",{"type":24,"tag":33,"props":1763,"children":1764},{},[1765,1769],{"type":24,"tag":52,"props":1766,"children":1767},{},[1768],{"type":30,"value":459},{"type":30,"value":407},{"type":24,"tag":318,"props":1771,"children":1773},{"code":1772},"Top Event: API Cost Overrun\n├─ AND Gate: High API Usage AND No Budget Alert\n│  ├─ OR Gate: High API Usage Causes\n│  │  ├─ Bug in retry logic\n│  │  ├─ Misconfigured API key\n│  │  └─ External attack\n│  └─ OR Gate: No Budget Alert Causes\n│     ├─ Alert not configured\n│     ├─ Alert threshold too high\n│     └─ Alert channel misconfigured\n",[1774],{"type":24,"tag":323,"props":1775,"children":1776},{"__ignoreMap":7},[1777],{"type":30,"value":1772},{"type":24,"tag":25,"props":1779,"children":1781},{"id":1780},"faq",[1782],{"type":30,"value":1783},"FAQ",{"type":24,"tag":155,"props":1785,"children":1787},{"id":1786},"q1-如何快速发现安全事件",[1788],{"type":30,"value":1789},"Q1: 如何快速发现安全事件?",{"type":24,"tag":33,"props":1791,"children":1792},{},[1793,1798],{"type":24,"tag":52,"props":1794,"children":1795},{},[1796],{"type":30,"value":1797},"A",{"type":30,"value":407},{"type":24,"tag":44,"props":1800,"children":1801},{},[1802,1812,1821,1830,1840],{"type":24,"tag":48,"props":1803,"children":1804},{},[1805,1810],{"type":24,"tag":52,"props":1806,"children":1807},{},[1808],{"type":30,"value":1809},"实时监控",{"type":30,"value":1811},": 部署监控系统,检测异常指标(如 API 调用量、错误率、延迟)。",{"type":24,"tag":48,"props":1813,"children":1814},{},[1815,1819],{"type":24,"tag":52,"props":1816,"children":1817},{},[1818],{"type":30,"value":355},{"type":30,"value":1820},": 配置告警规则,当指标超过阈值时立即通知 on-call 工程师。",{"type":24,"tag":48,"props":1822,"children":1823},{},[1824,1828],{"type":24,"tag":52,"props":1825,"children":1826},{},[1827],{"type":30,"value":1228},{"type":30,"value":1829},": 使用 SIEM 工具实时分析日志,检测可疑模式。",{"type":24,"tag":48,"props":1831,"children":1832},{},[1833,1838],{"type":24,"tag":52,"props":1834,"children":1835},{},[1836],{"type":30,"value":1837},"威胁情报",{"type":30,"value":1839},": 订阅威胁情报源,及时了解新的攻击手法和 IOCs。",{"type":24,"tag":48,"props":1841,"children":1842},{},[1843,1848],{"type":24,"tag":52,"props":1844,"children":1845},{},[1846],{"type":30,"value":1847},"用户反馈",{"type":30,"value":1849},": 建立渠道让用户报告异常情况。",{"type":24,"tag":155,"props":1851,"children":1853},{"id":1852},"q2-事件发生后第一步该做什么",[1854],{"type":30,"value":1855},"Q2: 事件发生后第一步该做什么?",{"type":24,"tag":33,"props":1857,"children":1858},{},[1859,1863],{"type":24,"tag":52,"props":1860,"children":1861},{},[1862],{"type":30,"value":1797},{"type":30,"value":407},{"type":24,"tag":632,"props":1865,"children":1866},{},[1867,1877,1887,1897,1907],{"type":24,"tag":48,"props":1868,"children":1869},{},[1870,1875],{"type":24,"tag":52,"props":1871,"children":1872},{},[1873],{"type":30,"value":1874},"确认事件",{"type":30,"value":1876},": 验证告警是否真实,排除误报。",{"type":24,"tag":48,"props":1878,"children":1879},{},[1880,1885],{"type":24,"tag":52,"props":1881,"children":1882},{},[1883],{"type":30,"value":1884},"评估严重程度",{"type":30,"value":1886},": 根据影响范围和数据敏感性确定优先级。",{"type":24,"tag":48,"props":1888,"children":1889},{},[1890,1895],{"type":24,"tag":52,"props":1891,"children":1892},{},[1893],{"type":30,"value":1894},"启动响应团队",{"type":30,"value":1896},": 通知 incident commander 和 responder。",{"type":24,"tag":48,"props":1898,"children":1899},{},[1900,1905],{"type":24,"tag":52,"props":1901,"children":1902},{},[1903],{"type":30,"value":1904},"短期遏制",{"type":30,"value":1906},": 立即采取措施阻止事件扩散(如撤销凭证、隔离系统)。",{"type":24,"tag":48,"props":1908,"children":1909},{},[1910,1915],{"type":24,"tag":52,"props":1911,"children":1912},{},[1913],{"type":30,"value":1914},"记录时间线",{"type":30,"value":1916},": 开始记录事件的每个步骤,便于事后复盘。",{"type":24,"tag":33,"props":1918,"children":1919},{},[1920,1925],{"type":24,"tag":52,"props":1921,"children":1922},{},[1923],{"type":30,"value":1924},"注意",{"type":30,"value":1926},": 不要急于修复,先遏制和取证,避免破坏证据。",{"type":24,"tag":155,"props":1928,"children":1930},{"id":1929},"q3-如何重建事件时间线",[1931],{"type":30,"value":1932},"Q3: 如何重建事件时间线?",{"type":24,"tag":33,"props":1934,"children":1935},{},[1936,1940],{"type":24,"tag":52,"props":1937,"children":1938},{},[1939],{"type":30,"value":1797},{"type":30,"value":407},{"type":24,"tag":44,"props":1942,"children":1943},{},[1944,1954,1964,1974,1984],{"type":24,"tag":48,"props":1945,"children":1946},{},[1947,1952],{"type":24,"tag":52,"props":1948,"children":1949},{},[1950],{"type":30,"value":1951},"收集日志",{"type":30,"value":1953},": 从所有相关系统收集日志(应用、系统、网络、审计)。",{"type":24,"tag":48,"props":1955,"children":1956},{},[1957,1962],{"type":24,"tag":52,"props":1958,"children":1959},{},[1960],{"type":30,"value":1961},"时间对齐",{"type":30,"value":1963},": 确保所有系统使用同步的时钟(NTP)。",{"type":24,"tag":48,"props":1965,"children":1966},{},[1967,1972],{"type":24,"tag":52,"props":1968,"children":1969},{},[1970],{"type":30,"value":1971},"关联 ID",{"type":30,"value":1973},": 使用 correlation ID、session ID 关联跨系统的日志。",{"type":24,"tag":48,"props":1975,"children":1976},{},[1977,1982],{"type":24,"tag":52,"props":1978,"children":1979},{},[1980],{"type":30,"value":1981},"可视化工具",{"type":30,"value":1983},": 使用时间线可视化工具(如 Kibana、Grafana)展示事件序列。",{"type":24,"tag":48,"props":1985,"children":1986},{},[1987,1992],{"type":24,"tag":52,"props":1988,"children":1989},{},[1990],{"type":30,"value":1991},"人工验证",{"type":30,"value":1993},": 由经验丰富的工程师审查时间线,确保准确性。",{"type":24,"tag":155,"props":1995,"children":1997},{"id":1996},"q4-如何从海量日志中找到关键线索",[1998],{"type":30,"value":1999},"Q4: 如何从海量日志中找到关键线索?",{"type":24,"tag":33,"props":2001,"children":2002},{},[2003,2007],{"type":24,"tag":52,"props":2004,"children":2005},{},[2006],{"type":30,"value":1797},{"type":30,"value":407},{"type":24,"tag":44,"props":2009,"children":2010},{},[2011,2021,2031,2041,2051],{"type":24,"tag":48,"props":2012,"children":2013},{},[2014,2019],{"type":24,"tag":52,"props":2015,"children":2016},{},[2017],{"type":30,"value":2018},"过滤和聚合",{"type":30,"value":2020},": 使用 Elasticsearch、Splunk 等工具过滤无关日志,聚合关键指标。",{"type":24,"tag":48,"props":2022,"children":2023},{},[2024,2029],{"type":24,"tag":52,"props":2025,"children":2026},{},[2027],{"type":30,"value":2028},"异常检测",{"type":30,"value":2030},": 使用机器学习检测异常模式(如突然增加的 API 调用)。",{"type":24,"tag":48,"props":2032,"children":2033},{},[2034,2039],{"type":24,"tag":52,"props":2035,"children":2036},{},[2037],{"type":30,"value":2038},"关键词搜索",{"type":30,"value":2040},": 搜索特定的关键词(如错误消息、异常堆栈)。",{"type":24,"tag":48,"props":2042,"children":2043},{},[2044,2049],{"type":24,"tag":52,"props":2045,"children":2046},{},[2047],{"type":30,"value":2048},"基线对比",{"type":30,"value":2050},": 将当前指标与历史基线对比,发现偏离正常的行为。",{"type":24,"tag":48,"props":2052,"children":2053},{},[2054,2059],{"type":24,"tag":52,"props":2055,"children":2056},{},[2057],{"type":30,"value":2058},"专家经验",{"type":30,"value":2060},": 依靠安全专家的经验和直觉,识别可疑模式。",{"type":24,"tag":155,"props":2062,"children":2064},{"id":2063},"q5-根因分析有哪些常用方法",[2065],{"type":30,"value":2066},"Q5: 根因分析有哪些常用方法?",{"type":24,"tag":33,"props":2068,"children":2069},{},[2070,2074],{"type":24,"tag":52,"props":2071,"children":2072},{},[2073],{"type":30,"value":1797},{"type":30,"value":407},{"type":24,"tag":44,"props":2076,"children":2077},{},[2078,2088,2098,2108,2118],{"type":24,"tag":48,"props":2079,"children":2080},{},[2081,2086],{"type":24,"tag":52,"props":2082,"children":2083},{},[2084],{"type":30,"value":2085},"5 Whys",{"type":30,"value":2087},": 连续问\"为什么\",找出根本原因。简单有效,适合大多数场景。",{"type":24,"tag":48,"props":2089,"children":2090},{},[2091,2096],{"type":24,"tag":52,"props":2092,"children":2093},{},[2094],{"type":30,"value":2095},"Fishbone Diagram",{"type":30,"value":2097},": 可视化展示各种可能原因,适合复杂问题。",{"type":24,"tag":48,"props":2099,"children":2100},{},[2101,2106],{"type":24,"tag":52,"props":2102,"children":2103},{},[2104],{"type":30,"value":2105},"Fault Tree Analysis",{"type":30,"value":2107},": 自顶向下分析故障路径,适合安全性关键系统。",{"type":24,"tag":48,"props":2109,"children":2110},{},[2111,2116],{"type":24,"tag":52,"props":2112,"children":2113},{},[2114],{"type":30,"value":2115},"Ishikawa Diagram",{"type":30,"value":2117},": 类似于鱼骨图,强调人、机、料、法、环等因素。",{"type":24,"tag":48,"props":2119,"children":2120},{},[2121,2126],{"type":24,"tag":52,"props":2122,"children":2123},{},[2124],{"type":30,"value":2125},"Pareto Analysis",{"type":30,"value":2127},": 识别导致 80% 问题的 20% 原因,优先解决关键问题。",{"type":24,"tag":155,"props":2129,"children":2131},{"id":2130},"q6-如何评估事件的影响范围",[2132],{"type":30,"value":2133},"Q6: 如何评估事件的影响范围?",{"type":24,"tag":33,"props":2135,"children":2136},{},[2137,2141],{"type":24,"tag":52,"props":2138,"children":2139},{},[2140],{"type":30,"value":1797},{"type":30,"value":407},{"type":24,"tag":44,"props":2143,"children":2144},{},[2145,2155,2165,2175,2185],{"type":24,"tag":48,"props":2146,"children":2147},{},[2148,2153],{"type":24,"tag":52,"props":2149,"children":2150},{},[2151],{"type":30,"value":2152},"数据血缘追踪",{"type":30,"value":2154},": 使用 data lineage 系统追踪受影响的数据流。",{"type":24,"tag":48,"props":2156,"children":2157},{},[2158,2163],{"type":24,"tag":52,"props":2159,"children":2160},{},[2161],{"type":30,"value":2162},"用户影响分析",{"type":30,"value":2164},": 查询受影响的的用户数量和类型。",{"type":24,"tag":48,"props":2166,"children":2167},{},[2168,2173],{"type":24,"tag":52,"props":2169,"children":2170},{},[2171],{"type":30,"value":2172},"财务影响评估",{"type":30,"value":2174},": 计算直接损失(如 API 费用)和间接损失(如工程师时间、客户流失)。",{"type":24,"tag":48,"props":2176,"children":2177},{},[2178,2183],{"type":24,"tag":52,"props":2179,"children":2180},{},[2181],{"type":30,"value":2182},"合规影响评估",{"type":30,"value":2184},": 评估是否违反法规(如 GDPR、HIPAA),可能的罚款金额。",{"type":24,"tag":48,"props":2186,"children":2187},{},[2188,2193],{"type":24,"tag":52,"props":2189,"children":2190},{},[2191],{"type":30,"value":2192},"声誉影响评估",{"type":30,"value":2194},": 评估对客户信任和品牌声誉的影响。",{"type":24,"tag":155,"props":2196,"children":2198},{"id":2197},"q7-如何防止类似事件再次发生",[2199],{"type":30,"value":2200},"Q7: 如何防止类似事件再次发生?",{"type":24,"tag":33,"props":2202,"children":2203},{},[2204,2208],{"type":24,"tag":52,"props":2205,"children":2206},{},[2207],{"type":30,"value":1797},{"type":30,"value":407},{"type":24,"tag":44,"props":2210,"children":2211},{},[2212,2222,2232,2242,2252,2262],{"type":24,"tag":48,"props":2213,"children":2214},{},[2215,2220],{"type":24,"tag":52,"props":2216,"children":2217},{},[2218],{"type":30,"value":2219},"根本原因修复",{"type":30,"value":2221},": 不仅修复表面症状,还要解决根本原因。",{"type":24,"tag":48,"props":2223,"children":2224},{},[2225,2230],{"type":24,"tag":52,"props":2226,"children":2227},{},[2228],{"type":30,"value":2229},"自动化防护",{"type":30,"value":2231},": 实施自动化检测和防护机制(如速率限制、预算告警、自动熔断)。",{"type":24,"tag":48,"props":2233,"children":2234},{},[2235,2240],{"type":24,"tag":52,"props":2236,"children":2237},{},[2238],{"type":30,"value":2239},"流程改进",{"type":30,"value":2241},": 更新开发和运维流程,增加安全检查点。",{"type":24,"tag":48,"props":2243,"children":2244},{},[2245,2250],{"type":24,"tag":52,"props":2246,"children":2247},{},[2248],{"type":30,"value":2249},"培训和演练",{"type":30,"value":2251},": 定期培训团队,进行安全演练,提高应急响应能力。",{"type":24,"tag":48,"props":2253,"children":2254},{},[2255,2260],{"type":24,"tag":52,"props":2256,"children":2257},{},[2258],{"type":30,"value":2259},"持续监控",{"type":30,"value":2261},": 持续监控关键指标,及时发现新问题。",{"type":24,"tag":48,"props":2263,"children":2264},{},[2265,2270],{"type":24,"tag":52,"props":2266,"children":2267},{},[2268],{"type":30,"value":2269},"经验分享",{"type":30,"value":2271},": 将事件经验分享给其他团队和行业,促进行业整体提升。",{"type":24,"tag":155,"props":2273,"children":2275},{"id":2274},"q8-事件响应团队应该如何组建",[2276],{"type":30,"value":2277},"Q8: 事件响应团队应该如何组建?",{"type":24,"tag":33,"props":2279,"children":2280},{},[2281,2285,2287,2292],{"type":24,"tag":52,"props":2282,"children":2283},{},[2284],{"type":30,"value":1797},{"type":30,"value":2286},":\n",{"type":24,"tag":52,"props":2288,"children":2289},{},[2290],{"type":30,"value":2291},"核心角色",{"type":30,"value":407},{"type":24,"tag":44,"props":2294,"children":2295},{},[2296,2306,2316,2326],{"type":24,"tag":48,"props":2297,"children":2298},{},[2299,2304],{"type":24,"tag":52,"props":2300,"children":2301},{},[2302],{"type":30,"value":2303},"Incident Commander",{"type":30,"value":2305},": 总指挥,协调响应工作,做出关键决策。",{"type":24,"tag":48,"props":2307,"children":2308},{},[2309,2314],{"type":24,"tag":52,"props":2310,"children":2311},{},[2312],{"type":30,"value":2313},"Technical Lead",{"type":30,"value":2315},": 技术负责人,领导技术调查和修复。",{"type":24,"tag":48,"props":2317,"children":2318},{},[2319,2324],{"type":24,"tag":52,"props":2320,"children":2321},{},[2322],{"type":30,"value":2323},"Communications Lead",{"type":30,"value":2325},": 沟通负责人,对内对外沟通,管理信息披露。",{"type":24,"tag":48,"props":2327,"children":2328},{},[2329,2334],{"type":24,"tag":52,"props":2330,"children":2331},{},[2332],{"type":30,"value":2333},"Scribe",{"type":30,"value":2335},": 记录员,记录事件的每个步骤和决策。",{"type":24,"tag":33,"props":2337,"children":2338},{},[2339,2344],{"type":24,"tag":52,"props":2340,"children":2341},{},[2342],{"type":30,"value":2343},"支持角色",{"type":30,"value":407},{"type":24,"tag":44,"props":2346,"children":2347},{},[2348,2358,2368,2378],{"type":24,"tag":48,"props":2349,"children":2350},{},[2351,2356],{"type":24,"tag":52,"props":2352,"children":2353},{},[2354],{"type":30,"value":2355},"Security Engineer",{"type":30,"value":2357},": 安全专家,负责取证和威胁分析。",{"type":24,"tag":48,"props":2359,"children":2360},{},[2361,2366],{"type":24,"tag":52,"props":2362,"children":2363},{},[2364],{"type":30,"value":2365},"DevOps Engineer",{"type":30,"value":2367},": 运维专家,负责系统恢复和部署修复。",{"type":24,"tag":48,"props":2369,"children":2370},{},[2371,2376],{"type":24,"tag":52,"props":2372,"children":2373},{},[2374],{"type":30,"value":2375},"Legal Counsel",{"type":30,"value":2377},": 法律顾问,评估合规风险和法律责任。",{"type":24,"tag":48,"props":2379,"children":2380},{},[2381,2386],{"type":24,"tag":52,"props":2382,"children":2383},{},[2384],{"type":30,"value":2385},"PR/Marketing",{"type":30,"value":2387},": 公关团队,管理媒体和客户沟通。",{"type":24,"tag":33,"props":2389,"children":2390},{},[2391,2396],{"type":24,"tag":52,"props":2392,"children":2393},{},[2394],{"type":30,"value":2395},"最佳实践",{"type":30,"value":407},{"type":24,"tag":44,"props":2398,"children":2399},{},[2400,2410,2420,2430],{"type":24,"tag":48,"props":2401,"children":2402},{},[2403,2408],{"type":24,"tag":52,"props":2404,"children":2405},{},[2406],{"type":30,"value":2407},"明确职责",{"type":30,"value":2409},": 每个角色有明确的职责和权限。",{"type":24,"tag":48,"props":2411,"children":2412},{},[2413,2418],{"type":24,"tag":52,"props":2414,"children":2415},{},[2416],{"type":30,"value":2417},"定期演练",{"type":30,"value":2419},": 定期进行事件响应演练,熟悉流程。",{"type":24,"tag":48,"props":2421,"children":2422},{},[2423,2428],{"type":24,"tag":52,"props":2424,"children":2425},{},[2426],{"type":30,"value":2427},"轮班制度",{"type":30,"value":2429},": 建立 on-call 轮班制度,确保 24/7 覆盖。",{"type":24,"tag":48,"props":2431,"children":2432},{},[2433,2438],{"type":24,"tag":52,"props":2434,"children":2435},{},[2436],{"type":30,"value":2437},"事后复盘",{"type":30,"value":2439},": 每次事件后进行复盘,持续改进响应流程。",{"type":24,"tag":25,"props":2441,"children":2443},{"id":2442},"延伸阅读",[2444],{"type":30,"value":2442},{"type":24,"tag":44,"props":2446,"children":2447},{},[2448,2460,2470,2480],{"type":24,"tag":48,"props":2449,"children":2450},{},[2451],{"type":24,"tag":2452,"props":2453,"children":2457},"a",{"href":2454,"rel":2455},"https://csrc.nist.gov/publications/detail/sp/800-61/rev-2/final",[2456],"nofollow",[2458],{"type":30,"value":2459},"NIST SP 800-61 Rev. 2: Computer Security Incident Handling Guide",{"type":24,"tag":48,"props":2461,"children":2462},{},[2463],{"type":24,"tag":2452,"props":2464,"children":2467},{"href":2465,"rel":2466},"https://www.sans.org/courses/incident-handling/",[2456],[2468],{"type":30,"value":2469},"SANS Incident Response Process",{"type":24,"tag":48,"props":2471,"children":2472},{},[2473],{"type":24,"tag":2452,"props":2474,"children":2477},{"href":2475,"rel":2476},"https://cheatsheetseries.owasp.org/cheatsheets/Incident_Response_Cheat_Sheet.html",[2456],[2478],{"type":30,"value":2479},"OWASP Incident Response Cheat Sheet",{"type":24,"tag":48,"props":2481,"children":2482},{},[2483],{"type":24,"tag":2452,"props":2484,"children":2487},{"href":2485,"rel":2486},"https://response.pagerduty.com/",[2456],[2488],{"type":30,"value":2489},"PagerDuty Incident Response Documentation",{"type":24,"tag":25,"props":2491,"children":2493},{"id":2492},"checklist",[2494],{"type":30,"value":2495},"Checklist",{"type":24,"tag":33,"props":2497,"children":2498},{},[2499],{"type":30,"value":2500},"在建立 Incident Forensics 能力之前,请确认以下事项:",{"type":24,"tag":44,"props":2502,"children":2504},{"className":2503},[978],[2505,2514,2523,2532,2541,2550,2559,2568,2577,2586],{"type":24,"tag":48,"props":2506,"children":2508},{"className":2507},[983],[2509,2512],{"type":24,"tag":986,"props":2510,"children":2511},{"disabled":988,"type":989},[],{"type":30,"value":2513}," 已制定事件响应计划(Incident Response Plan),明确流程和角色",{"type":24,"tag":48,"props":2515,"children":2517},{"className":2516},[983],[2518,2521],{"type":24,"tag":986,"props":2519,"children":2520},{"disabled":988,"type":989},[],{"type":30,"value":2522}," 已组建事件响应团队,明确 incident commander、responder 等角色",{"type":24,"tag":48,"props":2524,"children":2526},{"className":2525},[983],[2527,2530],{"type":24,"tag":986,"props":2528,"children":2529},{"disabled":988,"type":989},[],{"type":30,"value":2531}," 已部署监控和告警系统,能够及时发现异常",{"type":24,"tag":48,"props":2533,"children":2535},{"className":2534},[983],[2536,2539],{"type":24,"tag":986,"props":2537,"children":2538},{"disabled":988,"type":989},[],{"type":30,"value":2540}," 已集中收集日志,支持快速检索和关联分析",{"type":24,"tag":48,"props":2542,"children":2544},{"className":2543},[983],[2545,2548],{"type":24,"tag":986,"props":2546,"children":2547},{"disabled":988,"type":989},[],{"type":30,"value":2549}," 已建立取证工具链,包括 SIEM、日志聚合器、取证工具包",{"type":24,"tag":48,"props":2551,"children":2553},{"className":2552},[983],[2554,2557],{"type":24,"tag":986,"props":2555,"children":2556},{"disabled":988,"type":989},[],{"type":30,"value":2558}," 已定义事件分类和优先级标准",{"type":24,"tag":48,"props":2560,"children":2562},{"className":2561},[983],[2563,2566],{"type":24,"tag":986,"props":2564,"children":2565},{"disabled":988,"type":989},[],{"type":30,"value":2567}," 已建立时间线重建和根因分析方法",{"type":24,"tag":48,"props":2569,"children":2571},{"className":2570},[983],[2572,2575],{"type":24,"tag":986,"props":2573,"children":2574},{"disabled":988,"type":989},[],{"type":30,"value":2576}," 已制定事后复盘流程,包括 action items 跟踪",{"type":24,"tag":48,"props":2578,"children":2580},{"className":2579},[983],[2581,2584],{"type":24,"tag":986,"props":2582,"children":2583},{"disabled":988,"type":989},[],{"type":30,"value":2585}," 已定期进行事件响应演练,提高团队应急能力",{"type":24,"tag":48,"props":2587,"children":2589},{"className":2588},[983],[2590,2593],{"type":24,"tag":986,"props":2591,"children":2592},{"disabled":988,"type":989},[],{"type":30,"value":2594}," 已建立与外部机构(如 DPA、执法部门)的沟通渠道",{"type":24,"tag":2596,"props":2597,"children":2598},"hr",{},[],{"type":24,"tag":33,"props":2600,"children":2601},{},[2602,2607,2609,2615],{"type":24,"tag":52,"props":2603,"children":2604},{},[2605],{"type":30,"value":2606},"下一步行动",{"type":30,"value":2608},": 阅读 ",{"type":24,"tag":2452,"props":2610,"children":2612},{"href":2611},"./ai-agent-security-testing-ci-credential-scan",[2613],{"type":30,"value":2614},"AI agent Security Testing in CI",{"type":30,"value":2616},",了解如何在 CI/CD 流程中自动检测安全问题,左移安全防护。",{"title":7,"searchDepth":2618,"depth":2618,"links":2619},3,[2620,2622,2627,2643,2648,2653,2658,2668,2669],{"id":27,"depth":2621,"text":31},2,{"id":151,"depth":2621,"text":31,"children":2623},[2624,2625,2626],{"id":157,"depth":2618,"text":160},{"id":201,"depth":2618,"text":204},{"id":249,"depth":2618,"text":252},{"id":303,"depth":2621,"text":303,"children":2628},[2629,2630,2636,2640,2641,2642],{"id":308,"depth":2618,"text":311},{"id":329,"depth":2618,"text":332,"children":2631},[2632,2634,2635],{"id":336,"depth":2633,"text":339},4,{"id":418,"depth":2633,"text":421},{"id":571,"depth":2633,"text":574},{"id":593,"depth":2618,"text":596,"children":2637},[2638,2639],{"id":599,"depth":2633,"text":602},{"id":688,"depth":2633,"text":691},{"id":751,"depth":2618,"text":754},{"id":823,"depth":2618,"text":826},{"id":895,"depth":2618,"text":898},{"id":1022,"depth":2621,"text":1022,"children":2644},[2645,2646,2647],{"id":1027,"depth":2618,"text":1030},{"id":1064,"depth":2618,"text":1067},{"id":1138,"depth":2618,"text":1141},{"id":1273,"depth":2621,"text":1273,"children":2649},[2650,2651,2652],{"id":1278,"depth":2618,"text":1281},{"id":1403,"depth":2618,"text":1406},{"id":1487,"depth":2618,"text":1490},{"id":1612,"depth":2621,"text":1612,"children":2654},[2655,2656,2657],{"id":1617,"depth":2618,"text":1620},{"id":1734,"depth":2618,"text":1737},{"id":1753,"depth":2618,"text":1756},{"id":1780,"depth":2621,"text":1783,"children":2659},[2660,2661,2662,2663,2664,2665,2666,2667],{"id":1786,"depth":2618,"text":1789},{"id":1852,"depth":2618,"text":1855},{"id":1929,"depth":2618,"text":1932},{"id":1996,"depth":2618,"text":1999},{"id":2063,"depth":2618,"text":2066},{"id":2130,"depth":2618,"text":2133},{"id":2197,"depth":2618,"text":2200},{"id":2274,"depth":2618,"text":2277},{"id":2442,"depth":2621,"text":2442},{"id":2492,"depth":2621,"text":2495},"markdown","content:topics:ai:ai-agent-incident-forensics-root-cause-analysis.md","content","topics/ai/ai-agent-incident-forensics-root-cause-analysis.md","topics/ai/ai-agent-incident-forensics-root-cause-analysis","md",[2677,3828,4775],{"_path":2678,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":2679,"description":2680,"date":2681,"topic":5,"author":11,"tags":2682,"image":2688,"imageAlt":2689,"pexelsPhotoId":2690,"pexelsUrl":2691,"readingTime":2692,"body":2693,"_type":2670,"_id":3825,"_source":2672,"_file":3826,"_stem":3827,"_extension":2675},"/topics/ai/cursor-keyboard-shortcuts-cheatsheet","Cursor 快捷键速查表（macOS/Windows）：从“会用”到“能提效”的 10 个工作流","把 Cursor 常用快捷键按任务分组（查代码、改代码、多文件、对话、审查与回滚），给出可直接照抄的工作流与最小回归清单，避免“快捷键背了也没变快”。","2026-03-02",[2683,2684,2685,2686,2687],"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":21,"children":2694,"toc":3799},[2695,2700,2718,2723,2750,2755,2791,2794,2800,2805,2838,2843,2866,2869,2875,2880,3098,3107,3110,3116,3122,3141,3149,3170,3175,3181,3196,3227,3232,3245,3251,3270,3288,3296,3301,3307,3312,3333,3341,3347,3352,3375,3380,3386,3399,3405,3423,3441,3447,3458,3476,3482,3493,3499,3504,3547,3550,3556,3564,3617,3620,3626,3632,3637,3642,3665,3683,3688,3713,3716,3722,3728,3733,3739,3744,3750,3755,3758,3764],{"type":24,"tag":33,"props":2696,"children":2697},{},[2698],{"type":30,"value":2699},"如果你在搜“Cursor 快捷键”，你大概率不是想背一张表，而是想解决这类问题：",{"type":24,"tag":44,"props":2701,"children":2702},{},[2703,2708,2713],{"type":24,"tag":48,"props":2704,"children":2705},{},[2706],{"type":30,"value":2707},"为什么我用了 AI，还是很慢？（对话来回太多、改动不可控）",{"type":24,"tag":48,"props":2709,"children":2710},{},[2711],{"type":30,"value":2712},"为什么它“看起来懂了”，却改错文件/改出回归？（上下文与范围没锁住）",{"type":24,"tag":48,"props":2714,"children":2715},{},[2716],{"type":30,"value":2717},"多文件改动怎么做得安全？（验收、回滚、最小回归集）",{"type":24,"tag":33,"props":2719,"children":2720},{},[2721],{"type":30,"value":2722},"这篇文章给你两份东西：",{"type":24,"tag":632,"props":2724,"children":2725},{},[2726,2738],{"type":24,"tag":48,"props":2727,"children":2728},{},[2729,2731,2736],{"type":30,"value":2730},"一张",{"type":24,"tag":52,"props":2732,"children":2733},{},[2734],{"type":30,"value":2735},"按任务分组",{"type":30,"value":2737},"的快捷键表（不是按功能堆在一起）",{"type":24,"tag":48,"props":2739,"children":2740},{},[2741,2743,2748],{"type":30,"value":2742},"一套“从需求到落地”的",{"type":24,"tag":52,"props":2744,"children":2745},{},[2746],{"type":30,"value":2747},"最小闭环工作流",{"type":30,"value":2749},"（每一步都有快捷键）",{"type":24,"tag":33,"props":2751,"children":2752},{},[2753],{"type":30,"value":2754},"想看系统玩法：",{"type":24,"tag":44,"props":2756,"children":2757},{},[2758,2769,2780],{"type":24,"tag":48,"props":2759,"children":2760},{},[2761,2763],{"type":30,"value":2762},"入门教程看：",{"type":24,"tag":2452,"props":2764,"children":2766},{"href":2765},"/topics/ai/cursor-tutorial",[2767],{"type":30,"value":2768},"Cursor 使用教程（2026）",{"type":24,"tag":48,"props":2770,"children":2771},{},[2772,2774],{"type":30,"value":2773},"进阶玩法看：",{"type":24,"tag":2452,"props":2775,"children":2777},{"href":2776},"/topics/ai/cursor-editor-guide",[2778],{"type":30,"value":2779},"Cursor 编辑器深度玩法",{"type":24,"tag":48,"props":2781,"children":2782},{},[2783,2785],{"type":30,"value":2784},"规则与忽略看：",{"type":24,"tag":2452,"props":2786,"children":2788},{"href":2787},"/topics/ai/cursor-rules-cursorrules",[2789],{"type":30,"value":2790},"Cursor Rules 与 .cursorrules",{"type":24,"tag":2596,"props":2792,"children":2793},{},[],{"type":24,"tag":25,"props":2795,"children":2797},{"id":2796},"先给结论提效不是按得快而是闭环更短",[2798],{"type":30,"value":2799},"先给结论：提效不是“按得快”，而是“闭环更短”",{"type":24,"tag":33,"props":2801,"children":2802},{},[2803],{"type":30,"value":2804},"你可以把 Cursor 的快捷键理解为 3 条流水线：",{"type":24,"tag":44,"props":2806,"children":2807},{},[2808,2818,2828],{"type":24,"tag":48,"props":2809,"children":2810},{},[2811,2816],{"type":24,"tag":52,"props":2812,"children":2813},{},[2814],{"type":30,"value":2815},"改一小段",{"type":30,"value":2817},"（内联编辑）：把改动限制在一个函数/一段样式",{"type":24,"tag":48,"props":2819,"children":2820},{},[2821,2826],{"type":24,"tag":52,"props":2822,"children":2823},{},[2824],{"type":30,"value":2825},"改一组文件",{"type":30,"value":2827},"（Composer）：把改动限制在一组明确文件，并要求输出 diff + 验收点",{"type":24,"tag":48,"props":2829,"children":2830},{},[2831,2836],{"type":24,"tag":52,"props":2832,"children":2833},{},[2834],{"type":30,"value":2835},"聊清楚再动手",{"type":30,"value":2837},"（侧边对话）：先对齐目标、范围、验收、回滚",{"type":24,"tag":33,"props":2839,"children":2840},{},[2841],{"type":30,"value":2842},"当你觉得“它乱改/改太大”时，往往不是快捷键没记住，而是缺了两件事：",{"type":24,"tag":44,"props":2844,"children":2845},{},[2846,2856],{"type":24,"tag":48,"props":2847,"children":2848},{},[2849,2851],{"type":30,"value":2850},"没有在动手前锁定",{"type":24,"tag":52,"props":2852,"children":2853},{},[2854],{"type":30,"value":2855},"范围",{"type":24,"tag":48,"props":2857,"children":2858},{},[2859,2861],{"type":30,"value":2860},"没有在接受改动前准备",{"type":24,"tag":52,"props":2862,"children":2863},{},[2864],{"type":30,"value":2865},"验收/回滚",{"type":24,"tag":2596,"props":2867,"children":2868},{},[],{"type":24,"tag":25,"props":2870,"children":2872},{"id":2871},"快捷键速查表按任务分组",[2873],{"type":30,"value":2874},"快捷键速查表（按任务分组）",{"type":24,"tag":33,"props":2876,"children":2877},{},[2878],{"type":30,"value":2879},"说明：下表按“你正在做什么”组织，而不是按“功能名字”组织。不同版本快捷键可能略有差异，但核心逻辑一致。",{"type":24,"tag":428,"props":2881,"children":2882},{},[2883,2909],{"type":24,"tag":432,"props":2884,"children":2885},{},[2886],{"type":24,"tag":436,"props":2887,"children":2888},{},[2889,2894,2899,2904],{"type":24,"tag":440,"props":2890,"children":2891},{},[2892],{"type":30,"value":2893},"任务",{"type":24,"tag":440,"props":2895,"children":2896},{},[2897],{"type":30,"value":2898},"macOS",{"type":24,"tag":440,"props":2900,"children":2901},{},[2902],{"type":30,"value":2903},"Windows",{"type":24,"tag":440,"props":2905,"children":2906},{},[2907],{"type":30,"value":2908},"你该在什么时候用",{"type":24,"tag":461,"props":2910,"children":2911},{},[2912,2943,2974,3005,3036,3067],{"type":24,"tag":436,"props":2913,"children":2914},{},[2915,2920,2929,2938],{"type":24,"tag":468,"props":2916,"children":2917},{},[2918],{"type":30,"value":2919},"改一小段（最安全）",{"type":24,"tag":468,"props":2921,"children":2922},{},[2923],{"type":24,"tag":323,"props":2924,"children":2926},{"className":2925},[],[2927],{"type":30,"value":2928},"Cmd + K",{"type":24,"tag":468,"props":2930,"children":2931},{},[2932],{"type":24,"tag":323,"props":2933,"children":2935},{"className":2934},[],[2936],{"type":30,"value":2937},"Ctrl + K",{"type":24,"tag":468,"props":2939,"children":2940},{},[2941],{"type":30,"value":2942},"只想改一个函数/一段 CSS，不想动别的",{"type":24,"tag":436,"props":2944,"children":2945},{},[2946,2951,2960,2969],{"type":24,"tag":468,"props":2947,"children":2948},{},[2949],{"type":30,"value":2950},"打开 AI 对话（先对齐再动手）",{"type":24,"tag":468,"props":2952,"children":2953},{},[2954],{"type":24,"tag":323,"props":2955,"children":2957},{"className":2956},[],[2958],{"type":30,"value":2959},"Cmd + L",{"type":24,"tag":468,"props":2961,"children":2962},{},[2963],{"type":24,"tag":323,"props":2964,"children":2966},{"className":2965},[],[2967],{"type":30,"value":2968},"Ctrl + L",{"type":24,"tag":468,"props":2970,"children":2971},{},[2972],{"type":30,"value":2973},"需要澄清目标、制定步骤、给验收点",{"type":24,"tag":436,"props":2975,"children":2976},{},[2977,2982,2991,3000],{"type":24,"tag":468,"props":2978,"children":2979},{},[2980],{"type":30,"value":2981},"多文件编辑（有组织地改一组文件）",{"type":24,"tag":468,"props":2983,"children":2984},{},[2985],{"type":24,"tag":323,"props":2986,"children":2988},{"className":2987},[],[2989],{"type":30,"value":2990},"Cmd + I",{"type":24,"tag":468,"props":2992,"children":2993},{},[2994],{"type":24,"tag":323,"props":2995,"children":2997},{"className":2996},[],[2998],{"type":30,"value":2999},"Ctrl + I",{"type":24,"tag":468,"props":3001,"children":3002},{},[3003],{"type":30,"value":3004},"改动涉及多个文件：组件+样式+测试",{"type":24,"tag":436,"props":3006,"children":3007},{},[3008,3013,3022,3031],{"type":24,"tag":468,"props":3009,"children":3010},{},[3011],{"type":30,"value":3012},"把选中代码加入对话上下文",{"type":24,"tag":468,"props":3014,"children":3015},{},[3016],{"type":24,"tag":323,"props":3017,"children":3019},{"className":3018},[],[3020],{"type":30,"value":3021},"Cmd + Shift + L",{"type":24,"tag":468,"props":3023,"children":3024},{},[3025],{"type":24,"tag":323,"props":3026,"children":3028},{"className":3027},[],[3029],{"type":30,"value":3030},"Ctrl + Shift + L",{"type":24,"tag":468,"props":3032,"children":3033},{},[3034],{"type":30,"value":3035},"让 AI 只看你选的片段（降低噪音）",{"type":24,"tag":436,"props":3037,"children":3038},{},[3039,3044,3053,3062],{"type":24,"tag":468,"props":3040,"children":3041},{},[3042],{"type":30,"value":3043},"接受当前建议",{"type":24,"tag":468,"props":3045,"children":3046},{},[3047],{"type":24,"tag":323,"props":3048,"children":3050},{"className":3049},[],[3051],{"type":30,"value":3052},"Cmd + Y",{"type":24,"tag":468,"props":3054,"children":3055},{},[3056],{"type":24,"tag":323,"props":3057,"children":3059},{"className":3058},[],[3060],{"type":30,"value":3061},"Ctrl + Y",{"type":24,"tag":468,"props":3063,"children":3064},{},[3065],{"type":30,"value":3066},"你已经准备好验收/回滚，并确认改动范围",{"type":24,"tag":436,"props":3068,"children":3069},{},[3070,3075,3084,3093],{"type":24,"tag":468,"props":3071,"children":3072},{},[3073],{"type":30,"value":3074},"拒绝当前建议",{"type":24,"tag":468,"props":3076,"children":3077},{},[3078],{"type":24,"tag":323,"props":3079,"children":3081},{"className":3080},[],[3082],{"type":30,"value":3083},"Cmd + N",{"type":24,"tag":468,"props":3085,"children":3086},{},[3087],{"type":24,"tag":323,"props":3088,"children":3090},{"className":3089},[],[3091],{"type":30,"value":3092},"Ctrl + N",{"type":24,"tag":468,"props":3094,"children":3095},{},[3096],{"type":30,"value":3097},"改得太大、改错方向，立刻收手",{"type":24,"tag":3099,"props":3100,"children":3101},"blockquote",{},[3102],{"type":24,"tag":33,"props":3103,"children":3104},{},[3105],{"type":30,"value":3106},"小技巧：把“改一小段”当默认路径。只有当你能清晰写出“会改哪几类文件、怎么验收”时再进入多文件。",{"type":24,"tag":2596,"props":3108,"children":3109},{},[],{"type":24,"tag":25,"props":3111,"children":3113},{"id":3112},"_10-个可直接照抄的提效工作流每个都能闭环",[3114],{"type":30,"value":3115},"10 个可直接照抄的提效工作流（每个都能闭环）",{"type":24,"tag":155,"props":3117,"children":3119},{"id":3118},"工作流-1需求计划小步改新手最稳",[3120],{"type":30,"value":3121},"工作流 1：需求→计划→小步改（新手最稳）",{"type":24,"tag":632,"props":3123,"children":3124},{},[3125,3136],{"type":24,"tag":48,"props":3126,"children":3127},{},[3128,3134],{"type":24,"tag":323,"props":3129,"children":3131},{"className":3130},[],[3132],{"type":30,"value":3133},"Cmd/Ctrl + L",{"type":30,"value":3135}," 打开对话",{"type":24,"tag":48,"props":3137,"children":3138},{},[3139],{"type":30,"value":3140},"先发这段（可复制）：",{"type":24,"tag":3099,"props":3142,"children":3143},{},[3144],{"type":24,"tag":33,"props":3145,"children":3146},{},[3147],{"type":30,"value":3148},"目标：……\n范围：只修改以下文件/模块：……\n非目标：……（明确不做）\n验收：……（可测试/可手动检查）\n输出格式：先给计划，再逐步执行；每一步写出 diff 摘要。",{"type":24,"tag":632,"props":3150,"children":3151},{"start":2618},[3152,3157],{"type":24,"tag":48,"props":3153,"children":3154},{},[3155],{"type":30,"value":3156},"让 AI 先给“计划（3~6 步）”，你确认后再执行",{"type":24,"tag":48,"props":3158,"children":3159},{},[3160,3162,3168],{"type":30,"value":3161},"任何一步涉及改代码：优先回到编辑区，选中片段用 ",{"type":24,"tag":323,"props":3163,"children":3165},{"className":3164},[],[3166],{"type":30,"value":3167},"Cmd/Ctrl + K",{"type":30,"value":3169}," 小步改",{"type":24,"tag":33,"props":3171,"children":3172},{},[3173],{"type":30,"value":3174},"为什么有效：你把“想法”变成了“可执行约束”，这就是 GEO（面向 AI/模型的可理解结构）。",{"type":24,"tag":155,"props":3176,"children":3178},{"id":3177},"工作流-2只改一个函数高频低风险",[3179],{"type":30,"value":3180},"工作流 2：只改一个函数（高频、低风险）",{"type":24,"tag":44,"props":3182,"children":3183},{},[3184],{"type":24,"tag":48,"props":3185,"children":3186},{},[3187,3189,3194],{"type":30,"value":3188},"选中函数 → ",{"type":24,"tag":323,"props":3190,"children":3192},{"className":3191},[],[3193],{"type":30,"value":3167},{"type":30,"value":3195}," → 输入指令：",{"type":24,"tag":3099,"props":3197,"children":3198},{},[3199,3204],{"type":24,"tag":33,"props":3200,"children":3201},{},[3202],{"type":30,"value":3203},"把这段改成更可读：",{"type":24,"tag":44,"props":3205,"children":3206},{},[3207,3212,3217,3222],{"type":24,"tag":48,"props":3208,"children":3209},{},[3210],{"type":30,"value":3211},"用 async/await",{"type":24,"tag":48,"props":3213,"children":3214},{},[3215],{"type":30,"value":3216},"错误处理不要吞掉",{"type":24,"tag":48,"props":3218,"children":3219},{},[3220],{"type":30,"value":3221},"添加类型（若可推断）",{"type":24,"tag":48,"props":3223,"children":3224},{},[3225],{"type":30,"value":3226},"不要改函数签名",{"type":24,"tag":33,"props":3228,"children":3229},{},[3230],{"type":30,"value":3231},"验收方式（强制）：",{"type":24,"tag":44,"props":3233,"children":3234},{},[3235,3240],{"type":24,"tag":48,"props":3236,"children":3237},{},[3238],{"type":30,"value":3239},"输出前后函数行为一致（输入/输出）",{"type":24,"tag":48,"props":3241,"children":3242},{},[3243],{"type":30,"value":3244},"失败分支有可观测日志（不要悄悄 return null）",{"type":24,"tag":155,"props":3246,"children":3248},{"id":3247},"工作流-3多文件改动先定文件清单",[3249],{"type":30,"value":3250},"工作流 3：多文件改动（先定“文件清单”）",{"type":24,"tag":632,"props":3252,"children":3253},{},[3254,3265],{"type":24,"tag":48,"props":3255,"children":3256},{},[3257,3263],{"type":24,"tag":323,"props":3258,"children":3260},{"className":3259},[],[3261],{"type":30,"value":3262},"Cmd/Ctrl + I",{"type":30,"value":3264}," 进入多文件",{"type":24,"tag":48,"props":3266,"children":3267},{},[3268],{"type":30,"value":3269},"先让 AI 输出：",{"type":24,"tag":44,"props":3271,"children":3272},{},[3273,3278,3283],{"type":24,"tag":48,"props":3274,"children":3275},{},[3276],{"type":30,"value":3277},"预计会改哪些文件（最多 5 个）",{"type":24,"tag":48,"props":3279,"children":3280},{},[3281],{"type":30,"value":3282},"每个文件改什么",{"type":24,"tag":48,"props":3284,"children":3285},{},[3286],{"type":30,"value":3287},"每一步怎么验收",{"type":24,"tag":632,"props":3289,"children":3290},{"start":2618},[3291],{"type":24,"tag":48,"props":3292,"children":3293},{},[3294],{"type":30,"value":3295},"你确认文件清单后再开始生成改动",{"type":24,"tag":33,"props":3297,"children":3298},{},[3299],{"type":30,"value":3300},"关键点：多文件最容易翻车的是“它把你没想到的文件也改了”。所以文件清单是第一道闸门。",{"type":24,"tag":155,"props":3302,"children":3304},{"id":3303},"工作流-4把上下文噪音砍掉防跑偏",[3305],{"type":30,"value":3306},"工作流 4：把“上下文噪音”砍掉（防跑偏）",{"type":24,"tag":33,"props":3308,"children":3309},{},[3310],{"type":30,"value":3311},"当你怀疑它在胡说/乱改时：",{"type":24,"tag":44,"props":3313,"children":3314},{},[3315,3328],{"type":24,"tag":48,"props":3316,"children":3317},{},[3318,3320,3326],{"type":30,"value":3319},"只选择关键代码片段 → ",{"type":24,"tag":323,"props":3321,"children":3323},{"className":3322},[],[3324],{"type":30,"value":3325},"Cmd/Ctrl + Shift + L",{"type":30,"value":3327}," 加入对话",{"type":24,"tag":48,"props":3329,"children":3330},{},[3331],{"type":30,"value":3332},"然后在对话里要求：",{"type":24,"tag":3099,"props":3334,"children":3335},{},[3336],{"type":24,"tag":33,"props":3337,"children":3338},{},[3339],{"type":30,"value":3340},"只基于我提供的代码片段回答，不要假设其它文件存在。",{"type":24,"tag":155,"props":3342,"children":3344},{"id":3343},"工作流-5生成变更说明让-code-review-变快",[3345],{"type":30,"value":3346},"工作流 5：生成变更说明（让 code review 变快）",{"type":24,"tag":33,"props":3348,"children":3349},{},[3350],{"type":30,"value":3351},"改完后在对话里让它输出：",{"type":24,"tag":44,"props":3353,"children":3354},{},[3355,3360,3365,3370],{"type":24,"tag":48,"props":3356,"children":3357},{},[3358],{"type":30,"value":3359},"改动摘要（3~7 条）",{"type":24,"tag":48,"props":3361,"children":3362},{},[3363],{"type":30,"value":3364},"风险点（依赖/边界条件）",{"type":24,"tag":48,"props":3366,"children":3367},{},[3368],{"type":30,"value":3369},"回滚方式",{"type":24,"tag":48,"props":3371,"children":3372},{},[3373],{"type":30,"value":3374},"验收步骤",{"type":24,"tag":33,"props":3376,"children":3377},{},[3378],{"type":30,"value":3379},"这套结构能直接贴进 PR 描述。",{"type":24,"tag":155,"props":3381,"children":3383},{"id":3382},"工作流-6写最小回归集不写回归-等事故",[3384],{"type":30,"value":3385},"工作流 6：写“最小回归集”（不写回归 = 等事故）",{"type":24,"tag":33,"props":3387,"children":3388},{},[3389,3391,3397],{"type":30,"value":3390},"每次改动都至少做 10 条最小回归（见下文清单）。你可以把它写在 ",{"type":24,"tag":323,"props":3392,"children":3394},{"className":3393},[],[3395],{"type":30,"value":3396},"README",{"type":30,"value":3398}," 或团队 wiki。",{"type":24,"tag":155,"props":3400,"children":3402},{"id":3401},"工作流-7把接受建议变成最后一步",[3403],{"type":30,"value":3404},"工作流 7：把“接受建议”变成最后一步",{"type":24,"tag":33,"props":3406,"children":3407},{},[3408,3414,3416,3421],{"type":24,"tag":323,"props":3409,"children":3411},{"className":3410},[],[3412],{"type":30,"value":3413},"Cmd/Ctrl + Y",{"type":30,"value":3415}," 应该是",{"type":24,"tag":52,"props":3417,"children":3418},{},[3419],{"type":30,"value":3420},"最后一步",{"type":30,"value":3422},"：",{"type":24,"tag":44,"props":3424,"children":3425},{},[3426,3431,3436],{"type":24,"tag":48,"props":3427,"children":3428},{},[3429],{"type":30,"value":3430},"你已经看过 diff",{"type":24,"tag":48,"props":3432,"children":3433},{},[3434],{"type":30,"value":3435},"你能说清楚“怎么验收”",{"type":24,"tag":48,"props":3437,"children":3438},{},[3439],{"type":30,"value":3440},"你知道“怎么回滚”",{"type":24,"tag":155,"props":3442,"children":3444},{"id":3443},"工作流-8拒绝建议不是失败是风控动作",[3445],{"type":30,"value":3446},"工作流 8：拒绝建议不是失败，是风控动作",{"type":24,"tag":33,"props":3448,"children":3449},{},[3450,3456],{"type":24,"tag":323,"props":3451,"children":3453},{"className":3452},[],[3454],{"type":30,"value":3455},"Cmd/Ctrl + N",{"type":30,"value":3457}," 的使用时机：",{"type":24,"tag":44,"props":3459,"children":3460},{},[3461,3466,3471],{"type":24,"tag":48,"props":3462,"children":3463},{},[3464],{"type":30,"value":3465},"它开始改你没提过的东西（范围漂移）",{"type":24,"tag":48,"props":3467,"children":3468},{},[3469],{"type":30,"value":3470},"它改了 10 个文件但你只想改 1 个",{"type":24,"tag":48,"props":3472,"children":3473},{},[3474],{"type":30,"value":3475},"它为了“更优雅”引入新依赖/新抽象",{"type":24,"tag":155,"props":3477,"children":3479},{"id":3478},"工作流-9重复任务做成模板提示词不是一次性",[3480],{"type":30,"value":3481},"工作流 9：重复任务做成模板（提示词不是一次性）",{"type":24,"tag":33,"props":3483,"children":3484},{},[3485,3487,3491],{"type":30,"value":3486},"把高频任务（比如“写组件+样式+验收”）固化成模板，放进 Rules（见：",{"type":24,"tag":2452,"props":3488,"children":3489},{"href":2787},[3490],{"type":30,"value":2790},{"type":30,"value":3492},"）。",{"type":24,"tag":155,"props":3494,"children":3496},{"id":3495},"工作流-10把快捷键表做成你自己的任务表",[3497],{"type":30,"value":3498},"工作流 10：把“快捷键表”做成你自己的任务表",{"type":24,"tag":33,"props":3500,"children":3501},{},[3502],{"type":30,"value":3503},"你不需要记住所有快捷键，只需要记住：",{"type":24,"tag":44,"props":3505,"children":3506},{},[3507,3517,3527,3537],{"type":24,"tag":48,"props":3508,"children":3509},{},[3510,3512],{"type":30,"value":3511},"小步改：",{"type":24,"tag":323,"props":3513,"children":3515},{"className":3514},[],[3516],{"type":30,"value":3167},{"type":24,"tag":48,"props":3518,"children":3519},{},[3520,3522],{"type":30,"value":3521},"先对齐：",{"type":24,"tag":323,"props":3523,"children":3525},{"className":3524},[],[3526],{"type":30,"value":3133},{"type":24,"tag":48,"props":3528,"children":3529},{},[3530,3532],{"type":30,"value":3531},"多文件：",{"type":24,"tag":323,"props":3533,"children":3535},{"className":3534},[],[3536],{"type":30,"value":3262},{"type":24,"tag":48,"props":3538,"children":3539},{},[3540,3542],{"type":30,"value":3541},"上下文聚焦：",{"type":24,"tag":323,"props":3543,"children":3545},{"className":3544},[],[3546],{"type":30,"value":3325},{"type":24,"tag":2596,"props":3548,"children":3549},{},[],{"type":24,"tag":25,"props":3551,"children":3553},{"id":3552},"必交付物-1最小回归任务清单10-条通用",[3554],{"type":30,"value":3555},"必交付物 1：最小回归任务清单（10 条，通用）",{"type":24,"tag":3099,"props":3557,"children":3558},{},[3559],{"type":24,"tag":33,"props":3560,"children":3561},{},[3562],{"type":30,"value":3563},"这份清单的意义：让每次 AI 改动都能“被验证”。否则你只是把不可控变成了更快的不可控。",{"type":24,"tag":632,"props":3565,"children":3566},{},[3567,3572,3577,3582,3587,3592,3597,3602,3607,3612],{"type":24,"tag":48,"props":3568,"children":3569},{},[3570],{"type":30,"value":3571},"关键路径能跑通（手动点击/请求一次）",{"type":24,"tag":48,"props":3573,"children":3574},{},[3575],{"type":30,"value":3576},"错误路径能触发（模拟一次失败输入）",{"type":24,"tag":48,"props":3578,"children":3579},{},[3580],{"type":30,"value":3581},"控制台无新增错误（至少关注 1 次真实操作）",{"type":24,"tag":48,"props":3583,"children":3584},{},[3585],{"type":30,"value":3586},"关键 UI 未错位（移动端/桌面端各看一眼）",{"type":24,"tag":48,"props":3588,"children":3589},{},[3590],{"type":30,"value":3591},"刷新后状态正确（尤其是表单/列表）",{"type":24,"tag":48,"props":3593,"children":3594},{},[3595],{"type":30,"value":3596},"路由跳转没断（从入口到目标页）",{"type":24,"tag":48,"props":3598,"children":3599},{},[3600],{"type":30,"value":3601},"相关接口未改变契约（字段名/类型）",{"type":24,"tag":48,"props":3603,"children":3604},{},[3605],{"type":30,"value":3606},"性能没有明显退化（首屏、交互卡顿）",{"type":24,"tag":48,"props":3608,"children":3609},{},[3610],{"type":30,"value":3611},"回滚方案可执行（知道回滚哪几个文件/commit）",{"type":24,"tag":48,"props":3613,"children":3614},{},[3615],{"type":30,"value":3616},"写下“这次改动解决了什么、风险是什么”（可贴 PR）",{"type":24,"tag":2596,"props":3618,"children":3619},{},[],{"type":24,"tag":25,"props":3621,"children":3623},{"id":3622},"必交付物-2失败案例复盘真实会发生",[3624],{"type":30,"value":3625},"必交付物 2：失败案例复盘（真实会发生）",{"type":24,"tag":155,"props":3627,"children":3629},{"id":3628},"现象快捷键用得很熟但交付还是慢",[3630],{"type":30,"value":3631},"现象：快捷键用得很熟，但交付还是慢",{"type":24,"tag":33,"props":3633,"children":3634},{},[3635],{"type":30,"value":3636},"典型原因：你把 Cursor 当成“更聪明的搜索框”，不断对话，直到它给出你想要的答案。",{"type":24,"tag":33,"props":3638,"children":3639},{},[3640],{"type":30,"value":3641},"复现路径：",{"type":24,"tag":44,"props":3643,"children":3644},{},[3645,3650,3655,3660],{"type":24,"tag":48,"props":3646,"children":3647},{},[3648],{"type":30,"value":3649},"你直接说“把页面做得更好看、更高级”",{"type":24,"tag":48,"props":3651,"children":3652},{},[3653],{"type":30,"value":3654},"AI 开始大改样式、抽象组件、甚至引入新依赖",{"type":24,"tag":48,"props":3656,"children":3657},{},[3658],{"type":30,"value":3659},"你为了省事按了“接受建议”",{"type":24,"tag":48,"props":3661,"children":3662},{},[3663],{"type":30,"value":3664},"最后发现：设计没统一、移动端崩、甚至埋了性能问题",{"type":24,"tag":33,"props":3666,"children":3667},{},[3668,3670,3674,3676,3681],{"type":30,"value":3669},"根因：缺少",{"type":24,"tag":52,"props":3671,"children":3672},{},[3673],{"type":30,"value":2855},{"type":30,"value":3675},"与",{"type":24,"tag":52,"props":3677,"children":3678},{},[3679],{"type":30,"value":3680},"验收",{"type":30,"value":3682},"。",{"type":24,"tag":33,"props":3684,"children":3685},{},[3686],{"type":30,"value":3687},"修复方式（可照抄）：",{"type":24,"tag":44,"props":3689,"children":3690},{},[3691,3696,3708],{"type":24,"tag":48,"props":3692,"children":3693},{},[3694],{"type":30,"value":3695},"把需求拆成 3 个可验证目标：例如“按钮样式统一”“首屏 CTA 更明显”“移动端间距不挤”",{"type":24,"tag":48,"props":3697,"children":3698},{},[3699,3701,3706],{"type":30,"value":3700},"每个目标只用 ",{"type":24,"tag":323,"props":3702,"children":3704},{"className":3703},[],[3705],{"type":30,"value":3167},{"type":30,"value":3707}," 改一个局部",{"type":24,"tag":48,"props":3709,"children":3710},{},[3711],{"type":30,"value":3712},"每次接受建议前跑一遍“最小回归集”",{"type":24,"tag":2596,"props":3714,"children":3715},{},[],{"type":24,"tag":25,"props":3717,"children":3719},{"id":3718},"faq高频问题",[3720],{"type":30,"value":3721},"FAQ（高频问题）",{"type":24,"tag":155,"props":3723,"children":3725},{"id":3724},"q1我应该先记快捷键还是先学工作流",[3726],{"type":30,"value":3727},"Q1：我应该先记快捷键还是先学工作流？",{"type":24,"tag":33,"props":3729,"children":3730},{},[3731],{"type":30,"value":3732},"先学工作流。快捷键只是把工作流的步骤变短。",{"type":24,"tag":155,"props":3734,"children":3736},{"id":3735},"q2为什么我一用多文件就容易翻车",[3737],{"type":30,"value":3738},"Q2：为什么我一用多文件就容易翻车？",{"type":24,"tag":33,"props":3740,"children":3741},{},[3742],{"type":30,"value":3743},"因为多文件意味着范围更大、依赖更多、验收更难。先锁定“文件清单 + 每步验收”，再让它动手。",{"type":24,"tag":155,"props":3745,"children":3747},{"id":3746},"q3有没有万能提示词",[3748],{"type":30,"value":3749},"Q3：有没有“万能提示词”？",{"type":24,"tag":33,"props":3751,"children":3752},{},[3753],{"type":30,"value":3754},"没有，但有“万能结构”：目标、范围、非目标、验收、输出格式。",{"type":24,"tag":2596,"props":3756,"children":3757},{},[],{"type":24,"tag":25,"props":3759,"children":3761},{"id":3760},"延伸阅读建议按顺序",[3762],{"type":30,"value":3763},"延伸阅读（建议按顺序）",{"type":24,"tag":44,"props":3765,"children":3766},{},[3767,3774,3781,3788],{"type":24,"tag":48,"props":3768,"children":3769},{},[3770],{"type":24,"tag":2452,"props":3771,"children":3772},{"href":2765},[3773],{"type":30,"value":2768},{"type":24,"tag":48,"props":3775,"children":3776},{},[3777],{"type":24,"tag":2452,"props":3778,"children":3779},{"href":2776},[3780],{"type":30,"value":2779},{"type":24,"tag":48,"props":3782,"children":3783},{},[3784],{"type":24,"tag":2452,"props":3785,"children":3786},{"href":2787},[3787],{"type":30,"value":2790},{"type":24,"tag":48,"props":3789,"children":3790},{},[3791,3793],{"type":30,"value":3792},"如果你更关心“网页制作落地”：看这篇 ",{"type":24,"tag":2452,"props":3794,"children":3796},{"href":3795},"/topics/practical-tips/htmlpage-quick-landing-page",[3797],{"type":30,"value":3798},"3 分钟用 HTMLPAGE 做落地页",{"title":7,"searchDepth":2618,"depth":2618,"links":3800},[3801,3802,3803,3815,3816,3819,3824],{"id":2796,"depth":2621,"text":2799},{"id":2871,"depth":2621,"text":2874},{"id":3112,"depth":2621,"text":3115,"children":3804},[3805,3806,3807,3808,3809,3810,3811,3812,3813,3814],{"id":3118,"depth":2618,"text":3121},{"id":3177,"depth":2618,"text":3180},{"id":3247,"depth":2618,"text":3250},{"id":3303,"depth":2618,"text":3306},{"id":3343,"depth":2618,"text":3346},{"id":3382,"depth":2618,"text":3385},{"id":3401,"depth":2618,"text":3404},{"id":3443,"depth":2618,"text":3446},{"id":3478,"depth":2618,"text":3481},{"id":3495,"depth":2618,"text":3498},{"id":3552,"depth":2621,"text":3555},{"id":3622,"depth":2621,"text":3625,"children":3817},[3818],{"id":3628,"depth":2618,"text":3631},{"id":3718,"depth":2621,"text":3721,"children":3820},[3821,3822,3823],{"id":3724,"depth":2618,"text":3727},{"id":3735,"depth":2618,"text":3738},{"id":3746,"depth":2618,"text":3749},{"id":3760,"depth":2621,"text":3763},"content:topics:ai:cursor-keyboard-shortcuts-cheatsheet.md","topics/ai/cursor-keyboard-shortcuts-cheatsheet.md","topics/ai/cursor-keyboard-shortcuts-cheatsheet",{"_path":3829,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":3830,"description":3831,"date":3832,"topic":5,"author":11,"tags":3833,"image":3837,"imageAlt":3838,"pexelsPhotoId":3839,"pexelsUrl":3840,"readingTime":3841,"body":3842,"_type":2670,"_id":4772,"_source":2672,"_file":4773,"_stem":4774,"_extension":2675},"/topics/ai/cursor-vs-copilot-vscode-workflow","Cursor vs GitHub Copilot vs VS Code：怎么选、怎么搭配、怎么把风险关在笼子里","用“任务类型×风险×验收成本”的选择矩阵解释 Cursor/Copilot/VS Code 的差异，并给出一套可落地的协作工作流（范围闸门、最小回归集、回滚策略）。","2026-03-01",[2683,3834,2686,3835,3836],"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":21,"children":3843,"toc":4750},[3844,3849,3854,3872,3877,3895,3898,3904,3909,3940,3945,3948,3954,3962,4166,4174,4187,4190,4196,4202,4215,4220,4233,4239,4244,4277,4283,4288,4306,4309,4315,4320,4326,4331,4364,4370,4383,4388,4401,4407,4419,4425,4430,4443,4448,4451,4457,4462,4583,4586,4592,4602,4611,4629,4638,4646,4655,4673,4676,4680,4686,4691,4697,4702,4705,4709],{"type":24,"tag":33,"props":3845,"children":3846},{},[3847],{"type":30,"value":3848},"“Cursor 和 Copilot 到底有什么区别？”",{"type":24,"tag":33,"props":3850,"children":3851},{},[3852],{"type":30,"value":3853},"这个问题问得越早越好，因为你一旦把工具选错，后面所有痛苦都不是“提示词不够好”，而是：",{"type":24,"tag":44,"props":3855,"children":3856},{},[3857,3862,3867],{"type":24,"tag":48,"props":3858,"children":3859},{},[3860],{"type":30,"value":3861},"改动不可控（范围漂移、改错文件）",{"type":24,"tag":48,"props":3863,"children":3864},{},[3865],{"type":30,"value":3866},"验收成本爆炸（不知道要测什么）",{"type":24,"tag":48,"props":3868,"children":3869},{},[3870],{"type":30,"value":3871},"团队协作崩盘（没有闸门、没有回滚）",{"type":24,"tag":33,"props":3873,"children":3874},{},[3875],{"type":30,"value":3876},"这篇文章用一张选择矩阵 + 一套可执行工作流，帮你做到两件事：",{"type":24,"tag":632,"props":3878,"children":3879},{},[3880,3885],{"type":24,"tag":48,"props":3881,"children":3882},{},[3883],{"type":30,"value":3884},"知道什么时候用 Cursor、什么时候用 Copilot、什么时候“纯 VS Code 更快”",{"type":24,"tag":48,"props":3886,"children":3887},{},[3888,3890],{"type":30,"value":3889},"就算用 AI，也能把风险关在笼子里：",{"type":24,"tag":52,"props":3891,"children":3892},{},[3893],{"type":30,"value":3894},"可审查、可验证、可回滚",{"type":24,"tag":2596,"props":3896,"children":3897},{},[],{"type":24,"tag":25,"props":3899,"children":3901},{"id":3900},"结论先说三者不是互斥而是分工",[3902],{"type":30,"value":3903},"结论先说：三者不是互斥，而是分工",{"type":24,"tag":33,"props":3905,"children":3906},{},[3907],{"type":30,"value":3908},"你可以把它们看成三层能力：",{"type":24,"tag":44,"props":3910,"children":3911},{},[3912,3921,3931],{"type":24,"tag":48,"props":3913,"children":3914},{},[3915,3919],{"type":24,"tag":52,"props":3916,"children":3917},{},[3918],{"type":30,"value":2686},{"type":30,"value":3920},"：编辑器与生态（调试、插件、任务、终端、语言服务）",{"type":24,"tag":48,"props":3922,"children":3923},{},[3924,3929],{"type":24,"tag":52,"props":3925,"children":3926},{},[3927],{"type":30,"value":3928},"Copilot",{"type":30,"value":3930},"：代码补全与局部建议（“我正在写这一行/这一段”）",{"type":24,"tag":48,"props":3932,"children":3933},{},[3934,3938],{"type":24,"tag":52,"props":3935,"children":3936},{},[3937],{"type":30,"value":2683},{"type":30,"value":3939},"：以项目为单位的 AI 协作（对话、索引、多文件编辑、规则）",{"type":24,"tag":33,"props":3941,"children":3942},{},[3943],{"type":30,"value":3944},"最常见的误区是：把“局部补全能力”当作“能做架构与多文件落地”。",{"type":24,"tag":2596,"props":3946,"children":3947},{},[],{"type":24,"tag":25,"props":3949,"children":3951},{"id":3950},"选择矩阵按任务类型选工具不是按偏好",[3952],{"type":30,"value":3953},"选择矩阵：按任务类型选工具（不是按偏好）",{"type":24,"tag":3099,"props":3955,"children":3956},{},[3957],{"type":24,"tag":33,"props":3958,"children":3959},{},[3960],{"type":30,"value":3961},"你只要把自己的任务放进表格，就能得到推荐路径。",{"type":24,"tag":428,"props":3963,"children":3964},{},[3965,3997],{"type":24,"tag":432,"props":3966,"children":3967},{},[3968],{"type":24,"tag":436,"props":3969,"children":3970},{},[3971,3976,3982,3987,3992],{"type":24,"tag":440,"props":3972,"children":3973},{},[3974],{"type":30,"value":3975},"任务类型",{"type":24,"tag":440,"props":3977,"children":3979},{"align":3978},"right",[3980],{"type":30,"value":3981},"风险",{"type":24,"tag":440,"props":3983,"children":3984},{"align":3978},[3985],{"type":30,"value":3986},"验收成本",{"type":24,"tag":440,"props":3988,"children":3989},{},[3990],{"type":30,"value":3991},"更推荐",{"type":24,"tag":440,"props":3993,"children":3994},{},[3995],{"type":30,"value":3996},"为什么",{"type":24,"tag":461,"props":3998,"children":3999},{},[4000,4027,4060,4086,4113,4140],{"type":24,"tag":436,"props":4001,"children":4002},{},[4003,4008,4013,4017,4022],{"type":24,"tag":468,"props":4004,"children":4005},{},[4006],{"type":30,"value":4007},"写一段代码/补一个 if",{"type":24,"tag":468,"props":4009,"children":4010},{"align":3978},[4011],{"type":30,"value":4012},"低",{"type":24,"tag":468,"props":4014,"children":4015},{"align":3978},[4016],{"type":30,"value":4012},{"type":24,"tag":468,"props":4018,"children":4019},{},[4020],{"type":30,"value":4021},"Copilot / Cursor 内联编辑",{"type":24,"tag":468,"props":4023,"children":4024},{},[4025],{"type":30,"value":4026},"局部建议足够，成本最低",{"type":24,"tag":436,"props":4028,"children":4029},{},[4030,4035,4040,4044,4055],{"type":24,"tag":468,"props":4031,"children":4032},{},[4033],{"type":30,"value":4034},"重构一个函数",{"type":24,"tag":468,"props":4036,"children":4037},{"align":3978},[4038],{"type":30,"value":4039},"中",{"type":24,"tag":468,"props":4041,"children":4042},{"align":3978},[4043],{"type":30,"value":4039},{"type":24,"tag":468,"props":4045,"children":4046},{},[4047,4049],{"type":30,"value":4048},"Cursor ",{"type":24,"tag":323,"props":4050,"children":4052},{"className":4051},[],[4053],{"type":30,"value":4054},"内联编辑",{"type":24,"tag":468,"props":4056,"children":4057},{},[4058],{"type":30,"value":4059},"需要解释、需要约束输出",{"type":24,"tag":436,"props":4061,"children":4062},{},[4063,4068,4072,4076,4081],{"type":24,"tag":468,"props":4064,"children":4065},{},[4066],{"type":30,"value":4067},"改一个组件 + 样式",{"type":24,"tag":468,"props":4069,"children":4070},{"align":3978},[4071],{"type":30,"value":4039},{"type":24,"tag":468,"props":4073,"children":4074},{"align":3978},[4075],{"type":30,"value":4039},{"type":24,"tag":468,"props":4077,"children":4078},{},[4079],{"type":30,"value":4080},"Cursor（小范围多文件）",{"type":24,"tag":468,"props":4082,"children":4083},{},[4084],{"type":30,"value":4085},"需要同时改模板与样式",{"type":24,"tag":436,"props":4087,"children":4088},{},[4089,4094,4099,4103,4108],{"type":24,"tag":468,"props":4090,"children":4091},{},[4092],{"type":30,"value":4093},"改 3~5 个文件（组件+api+测试）",{"type":24,"tag":468,"props":4095,"children":4096},{"align":3978},[4097],{"type":30,"value":4098},"高",{"type":24,"tag":468,"props":4100,"children":4101},{"align":3978},[4102],{"type":30,"value":4098},{"type":24,"tag":468,"props":4104,"children":4105},{},[4106],{"type":30,"value":4107},"Cursor Composer + 闸门",{"type":24,"tag":468,"props":4109,"children":4110},{},[4111],{"type":30,"value":4112},"需要计划、验收、回滚",{"type":24,"tag":436,"props":4114,"children":4115},{},[4116,4121,4126,4130,4135],{"type":24,"tag":468,"props":4117,"children":4118},{},[4119],{"type":30,"value":4120},"重写一段架构/引入新依赖",{"type":24,"tag":468,"props":4122,"children":4123},{"align":3978},[4124],{"type":30,"value":4125},"很高",{"type":24,"tag":468,"props":4127,"children":4128},{"align":3978},[4129],{"type":30,"value":4125},{"type":24,"tag":468,"props":4131,"children":4132},{},[4133],{"type":30,"value":4134},"先人脑设计 + VS Code 实现",{"type":24,"tag":468,"props":4136,"children":4137},{},[4138],{"type":30,"value":4139},"AI 易发散，最好先设计再执行",{"type":24,"tag":436,"props":4141,"children":4142},{},[4143,4148,4152,4156,4161],{"type":24,"tag":468,"props":4144,"children":4145},{},[4146],{"type":30,"value":4147},"排查线上问题/性能抖动",{"type":24,"tag":468,"props":4149,"children":4150},{"align":3978},[4151],{"type":30,"value":4098},{"type":24,"tag":468,"props":4153,"children":4154},{"align":3978},[4155],{"type":30,"value":4125},{"type":24,"tag":468,"props":4157,"children":4158},{},[4159],{"type":30,"value":4160},"VS Code + 工具链优先，AI 辅助归纳",{"type":24,"tag":468,"props":4162,"children":4163},{},[4164],{"type":30,"value":4165},"需要证据，不要“猜”",{"type":24,"tag":33,"props":4167,"children":4168},{},[4169],{"type":24,"tag":52,"props":4170,"children":4171},{},[4172],{"type":30,"value":4173},"一句话规则：",{"type":24,"tag":44,"props":4175,"children":4176},{},[4177,4182],{"type":24,"tag":48,"props":4178,"children":4179},{},[4180],{"type":30,"value":4181},"当你的改动可以用“10 条最小回归集”覆盖时，用 Cursor。",{"type":24,"tag":48,"props":4183,"children":4184},{},[4185],{"type":30,"value":4186},"当你的改动无法验证时，先别让 AI 动手。",{"type":24,"tag":2596,"props":4188,"children":4189},{},[],{"type":24,"tag":25,"props":4191,"children":4193},{"id":4192},"差异拆解到底差在哪里",[4194],{"type":30,"value":4195},"差异拆解：到底差在哪里？",{"type":24,"tag":155,"props":4197,"children":4199},{"id":4198},"_1-上下文来源补全-vs-项目索引",[4200],{"type":30,"value":4201},"1) 上下文来源：补全 vs 项目索引",{"type":24,"tag":44,"props":4203,"children":4204},{},[4205,4210],{"type":24,"tag":48,"props":4206,"children":4207},{},[4208],{"type":30,"value":4209},"Copilot 更擅长：你正在写的这几行、当前文件的局部上下文",{"type":24,"tag":48,"props":4211,"children":4212},{},[4213],{"type":30,"value":4214},"Cursor 更擅长：项目级索引 + 多文件关联理解",{"type":24,"tag":33,"props":4216,"children":4217},{},[4218],{"type":30,"value":4219},"因此：",{"type":24,"tag":44,"props":4221,"children":4222},{},[4223,4228],{"type":24,"tag":48,"props":4224,"children":4225},{},[4226],{"type":30,"value":4227},"写代码片段：Copilot 速度更快",{"type":24,"tag":48,"props":4229,"children":4230},{},[4231],{"type":30,"value":4232},"改一坨工程：Cursor 更有胜算（但更需要闸门）",{"type":24,"tag":155,"props":4234,"children":4236},{"id":4235},"_2-交互方式你能不能控制范围",[4237],{"type":30,"value":4238},"2) 交互方式：你能不能控制范围",{"type":24,"tag":33,"props":4240,"children":4241},{},[4242],{"type":30,"value":4243},"范围控制的三个层级：",{"type":24,"tag":632,"props":4245,"children":4246},{},[4247,4257,4267],{"type":24,"tag":48,"props":4248,"children":4249},{},[4250,4252],{"type":30,"value":4251},"内联编辑（选中一段）→ ",{"type":24,"tag":52,"props":4253,"children":4254},{},[4255],{"type":30,"value":4256},"最强范围控制",{"type":24,"tag":48,"props":4258,"children":4259},{},[4260,4262],{"type":30,"value":4261},"Composer 多文件（先列文件清单）→ ",{"type":24,"tag":52,"props":4263,"children":4264},{},[4265],{"type":30,"value":4266},"可控但要闸门",{"type":24,"tag":48,"props":4268,"children":4269},{},[4270,4272],{"type":30,"value":4271},"大对话（泛目标）→ ",{"type":24,"tag":52,"props":4273,"children":4274},{},[4275],{"type":30,"value":4276},"最容易跑偏",{"type":24,"tag":155,"props":4278,"children":4280},{"id":4279},"_3-输出形态建议-vs-可审查的变更",[4281],{"type":30,"value":4282},"3) 输出形态：建议 vs 可审查的变更",{"type":24,"tag":33,"props":4284,"children":4285},{},[4286],{"type":30,"value":4287},"最好的 AI 输出不是“给我一段代码”，而是：",{"type":24,"tag":44,"props":4289,"children":4290},{},[4291,4296,4301],{"type":24,"tag":48,"props":4292,"children":4293},{},[4294],{"type":30,"value":4295},"改动摘要（做了什么）",{"type":24,"tag":48,"props":4297,"children":4298},{},[4299],{"type":30,"value":4300},"diff 级别的可审查变更",{"type":24,"tag":48,"props":4302,"children":4303},{},[4304],{"type":30,"value":4305},"验收步骤与回滚方案",{"type":24,"tag":2596,"props":4307,"children":4308},{},[],{"type":24,"tag":25,"props":4310,"children":4312},{"id":4311},"一套可落地的团队工作流把风险关住",[4313],{"type":30,"value":4314},"一套可落地的团队工作流（把风险关住）",{"type":24,"tag":33,"props":4316,"children":4317},{},[4318],{"type":30,"value":4319},"下面这套流程，你可以直接写进团队规范：",{"type":24,"tag":155,"props":4321,"children":4323},{"id":4322},"step-1先写任务单geo-友好结构",[4324],{"type":30,"value":4325},"Step 1：先写任务单（GEO 友好结构）",{"type":24,"tag":33,"props":4327,"children":4328},{},[4329],{"type":30,"value":4330},"模板：",{"type":24,"tag":44,"props":4332,"children":4333},{},[4334,4339,4344,4349,4354,4359],{"type":24,"tag":48,"props":4335,"children":4336},{},[4337],{"type":30,"value":4338},"目标：……",{"type":24,"tag":48,"props":4340,"children":4341},{},[4342],{"type":30,"value":4343},"背景：……",{"type":24,"tag":48,"props":4345,"children":4346},{},[4347],{"type":30,"value":4348},"范围：只改这些文件/模块：……",{"type":24,"tag":48,"props":4350,"children":4351},{},[4352],{"type":30,"value":4353},"非目标：不做哪些事情：……",{"type":24,"tag":48,"props":4355,"children":4356},{},[4357],{"type":30,"value":4358},"验收：如何判断完成（可测试/可观察）：……",{"type":24,"tag":48,"props":4360,"children":4361},{},[4362],{"type":30,"value":4363},"回滚：如果失败怎么撤回：……",{"type":24,"tag":155,"props":4365,"children":4367},{"id":4366},"step-2用范围闸门限制-ai",[4368],{"type":30,"value":4369},"Step 2：用“范围闸门”限制 AI",{"type":24,"tag":44,"props":4371,"children":4372},{},[4373,4378],{"type":24,"tag":48,"props":4374,"children":4375},{},[4376],{"type":30,"value":4377},"单文件改动：优先 Cursor 内联编辑",{"type":24,"tag":48,"props":4379,"children":4380},{},[4381],{"type":30,"value":4382},"多文件改动：必须先让 AI 输出“文件清单（≤5）+ 每步验收”",{"type":24,"tag":33,"props":4384,"children":4385},{},[4386],{"type":30,"value":4387},"如果 AI 输出的文件清单超过 5 个：",{"type":24,"tag":44,"props":4389,"children":4390},{},[4391,4396],{"type":24,"tag":48,"props":4392,"children":4393},{},[4394],{"type":30,"value":4395},"不是它太强，是任务太大",{"type":24,"tag":48,"props":4397,"children":4398},{},[4399],{"type":30,"value":4400},"你需要拆任务，而不是继续推进",{"type":24,"tag":155,"props":4402,"children":4404},{"id":4403},"step-3最小回归集10-条",[4405],{"type":30,"value":4406},"Step 3：最小回归集（10 条）",{"type":24,"tag":33,"props":4408,"children":4409},{},[4410,4412,4417],{"type":30,"value":4411},"每次接受改动前必须跑（可参考：",{"type":24,"tag":2452,"props":4413,"children":4414},{"href":2678},[4415],{"type":30,"value":4416},"Cursor 快捷键速查表",{"type":30,"value":4418}," 里的清单）。",{"type":24,"tag":155,"props":4420,"children":4422},{"id":4421},"step-4回滚策略不用等事故才想",[4423],{"type":30,"value":4424},"Step 4：回滚策略（不用等事故才想）",{"type":24,"tag":33,"props":4426,"children":4427},{},[4428],{"type":30,"value":4429},"回滚最常见的两条路：",{"type":24,"tag":44,"props":4431,"children":4432},{},[4433,4438],{"type":24,"tag":48,"props":4434,"children":4435},{},[4436],{"type":30,"value":4437},"git 回滚 commit",{"type":24,"tag":48,"props":4439,"children":4440},{},[4441],{"type":30,"value":4442},"对关键文件保留前版本（至少能快速恢复）",{"type":24,"tag":33,"props":4444,"children":4445},{},[4446],{"type":30,"value":4447},"你需要做到：任何一轮 AI 改动都能在 5 分钟内撤回。",{"type":24,"tag":2596,"props":4449,"children":4450},{},[],{"type":24,"tag":25,"props":4452,"children":4454},{"id":4453},"必交付物对比矩阵可复制",[4455],{"type":30,"value":4456},"必交付物：对比矩阵（可复制）",{"type":24,"tag":33,"props":4458,"children":4459},{},[4460],{"type":30,"value":4461},"下面这张表可以直接贴到你的团队 wiki：",{"type":24,"tag":428,"props":4463,"children":4464},{},[4465,4488],{"type":24,"tag":432,"props":4466,"children":4467},{},[4468],{"type":24,"tag":436,"props":4469,"children":4470},{},[4471,4476,4480,4484],{"type":24,"tag":440,"props":4472,"children":4473},{},[4474],{"type":30,"value":4475},"维度",{"type":24,"tag":440,"props":4477,"children":4478},{},[4479],{"type":30,"value":2686},{"type":24,"tag":440,"props":4481,"children":4482},{},[4483],{"type":30,"value":3928},{"type":24,"tag":440,"props":4485,"children":4486},{},[4487],{"type":30,"value":2683},{"type":24,"tag":461,"props":4489,"children":4490},{},[4491,4514,4537,4560],{"type":24,"tag":436,"props":4492,"children":4493},{},[4494,4499,4504,4509],{"type":24,"tag":468,"props":4495,"children":4496},{},[4497],{"type":30,"value":4498},"强项",{"type":24,"tag":468,"props":4500,"children":4501},{},[4502],{"type":30,"value":4503},"工具链、调试、生态",{"type":24,"tag":468,"props":4505,"children":4506},{},[4507],{"type":30,"value":4508},"补全与局部建议",{"type":24,"tag":468,"props":4510,"children":4511},{},[4512],{"type":30,"value":4513},"项目上下文、多文件落地",{"type":24,"tag":436,"props":4515,"children":4516},{},[4517,4522,4527,4532],{"type":24,"tag":468,"props":4518,"children":4519},{},[4520],{"type":30,"value":4521},"适合任务",{"type":24,"tag":468,"props":4523,"children":4524},{},[4525],{"type":30,"value":4526},"排查、调试、验证",{"type":24,"tag":468,"props":4528,"children":4529},{},[4530],{"type":30,"value":4531},"写一段、补一段",{"type":24,"tag":468,"props":4533,"children":4534},{},[4535],{"type":30,"value":4536},"改一段、改一组文件",{"type":24,"tag":436,"props":4538,"children":4539},{},[4540,4545,4550,4555],{"type":24,"tag":468,"props":4541,"children":4542},{},[4543],{"type":30,"value":4544},"最大风险",{"type":24,"tag":468,"props":4546,"children":4547},{},[4548],{"type":30,"value":4549},"无",{"type":24,"tag":468,"props":4551,"children":4552},{},[4553],{"type":30,"value":4554},"过度依赖建议",{"type":24,"tag":468,"props":4556,"children":4557},{},[4558],{"type":30,"value":4559},"范围漂移、多文件回归",{"type":24,"tag":436,"props":4561,"children":4562},{},[4563,4568,4573,4578],{"type":24,"tag":468,"props":4564,"children":4565},{},[4566],{"type":30,"value":4567},"必须搭配",{"type":24,"tag":468,"props":4569,"children":4570},{},[4571],{"type":30,"value":4572},"规范与检查",{"type":24,"tag":468,"props":4574,"children":4575},{},[4576],{"type":30,"value":4577},"代码评审",{"type":24,"tag":468,"props":4579,"children":4580},{},[4581],{"type":30,"value":4582},"闸门 + 最小回归集",{"type":24,"tag":2596,"props":4584,"children":4585},{},[],{"type":24,"tag":25,"props":4587,"children":4589},{"id":4588},"失败案例多文件看似成功实际埋雷",[4590],{"type":30,"value":4591},"失败案例：多文件“看似成功”，实际埋雷",{"type":24,"tag":33,"props":4593,"children":4594},{},[4595,4600],{"type":24,"tag":52,"props":4596,"children":4597},{},[4598],{"type":30,"value":4599},"现象",{"type":30,"value":4601},"：AI 说“我已经把所有地方都改了”，你也接受了，结果上线后 404 或样式错位。",{"type":24,"tag":33,"props":4603,"children":4604},{},[4605,4610],{"type":24,"tag":52,"props":4606,"children":4607},{},[4608],{"type":30,"value":4609},"复现条件",{"type":30,"value":3422},{"type":24,"tag":44,"props":4612,"children":4613},{},[4614,4619,4624],{"type":24,"tag":48,"props":4615,"children":4616},{},[4617],{"type":30,"value":4618},"你给了一个大目标（例如“把所有按钮统一成主题色”）",{"type":24,"tag":48,"props":4620,"children":4621},{},[4622],{"type":30,"value":4623},"它改了组件、样式、甚至主题配置",{"type":24,"tag":48,"props":4625,"children":4626},{},[4627],{"type":30,"value":4628},"你没有按页面模块走一遍，直接合并",{"type":24,"tag":33,"props":4630,"children":4631},{},[4632,4637],{"type":24,"tag":52,"props":4633,"children":4634},{},[4635],{"type":30,"value":4636},"根因",{"type":30,"value":3422},{"type":24,"tag":44,"props":4639,"children":4640},{},[4641],{"type":24,"tag":48,"props":4642,"children":4643},{},[4644],{"type":30,"value":4645},"改动范围大，但验收仍按“小改动”的方式做（只看一处）",{"type":24,"tag":33,"props":4647,"children":4648},{},[4649,4654],{"type":24,"tag":52,"props":4650,"children":4651},{},[4652],{"type":30,"value":4653},"修复",{"type":30,"value":3422},{"type":24,"tag":44,"props":4656,"children":4657},{},[4658,4663,4668],{"type":24,"tag":48,"props":4659,"children":4660},{},[4661],{"type":30,"value":4662},"强制把任务拆成“模块级目标”：Hero、Feature、Pricing、Form",{"type":24,"tag":48,"props":4664,"children":4665},{},[4666],{"type":30,"value":4667},"每个模块改完就验收一次",{"type":24,"tag":48,"props":4669,"children":4670},{},[4671],{"type":30,"value":4672},"验收通过再进入下一个模块",{"type":24,"tag":2596,"props":4674,"children":4675},{},[],{"type":24,"tag":25,"props":4677,"children":4678},{"id":1780},[4679],{"type":30,"value":1783},{"type":24,"tag":155,"props":4681,"children":4683},{"id":4682},"q1我已经用了-cursor为什么还要用-copilot",[4684],{"type":30,"value":4685},"Q1：我已经用了 Cursor，为什么还要用 Copilot？",{"type":24,"tag":33,"props":4687,"children":4688},{},[4689],{"type":30,"value":4690},"因为“补全”这种高频低风险任务，Copilot 的交互成本更低；Cursor 更适合需要解释与约束的改动。",{"type":24,"tag":155,"props":4692,"children":4694},{"id":4693},"q2什么时候应该完全不用-ai",[4695],{"type":30,"value":4696},"Q2：什么时候应该完全不用 AI？",{"type":24,"tag":33,"props":4698,"children":4699},{},[4700],{"type":30,"value":4701},"当你无法定义验收标准时。比如“更高级”“更好看”这种目标，先做信息结构与设计规则，再让 AI 帮你落地局部。",{"type":24,"tag":2596,"props":4703,"children":4704},{},[],{"type":24,"tag":25,"props":4706,"children":4707},{"id":2442},[4708],{"type":30,"value":2442},{"type":24,"tag":44,"props":4710,"children":4711},{},[4712,4721,4730,4739],{"type":24,"tag":48,"props":4713,"children":4714},{},[4715,4717],{"type":30,"value":4716},"Cursor 入门：",{"type":24,"tag":2452,"props":4718,"children":4719},{"href":2765},[4720],{"type":30,"value":2768},{"type":24,"tag":48,"props":4722,"children":4723},{},[4724,4726],{"type":30,"value":4725},"Cursor 进阶：",{"type":24,"tag":2452,"props":4727,"children":4728},{"href":2776},[4729],{"type":30,"value":2779},{"type":24,"tag":48,"props":4731,"children":4732},{},[4733,4735],{"type":30,"value":4734},"规则配置：",{"type":24,"tag":2452,"props":4736,"children":4737},{"href":2787},[4738],{"type":30,"value":2790},{"type":24,"tag":48,"props":4740,"children":4741},{},[4742,4744],{"type":30,"value":4743},"Copilot 实战：",{"type":24,"tag":2452,"props":4745,"children":4747},{"href":4746},"/topics/ai/github-copilot-tips",[4748],{"type":30,"value":4749},"GitHub Copilot 实用技巧",{"title":7,"searchDepth":2618,"depth":2618,"links":4751},[4752,4753,4754,4759,4765,4766,4767,4771],{"id":3900,"depth":2621,"text":3903},{"id":3950,"depth":2621,"text":3953},{"id":4192,"depth":2621,"text":4195,"children":4755},[4756,4757,4758],{"id":4198,"depth":2618,"text":4201},{"id":4235,"depth":2618,"text":4238},{"id":4279,"depth":2618,"text":4282},{"id":4311,"depth":2621,"text":4314,"children":4760},[4761,4762,4763,4764],{"id":4322,"depth":2618,"text":4325},{"id":4366,"depth":2618,"text":4369},{"id":4403,"depth":2618,"text":4406},{"id":4421,"depth":2618,"text":4424},{"id":4453,"depth":2621,"text":4456},{"id":4588,"depth":2621,"text":4591},{"id":1780,"depth":2621,"text":1783,"children":4768},[4769,4770],{"id":4682,"depth":2618,"text":4685},{"id":4693,"depth":2618,"text":4696},{"id":2442,"depth":2621,"text":2442},"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":4776,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":4777,"description":4778,"date":4779,"topic":5,"author":11,"tags":4780,"image":4785,"featured":988,"readingTime":3841,"body":4786,"_type":2670,"_id":5432,"_source":2672,"_file":5433,"_stem":5434,"_extension":2675},"/topics/ai/ai-debugging-troubleshooting-guide","AI 辅助调试与问题排查：让 AI 成为你的调试搭档","深入探讨如何利用 AI 工具提升调试效率，包括错误信息分析、日志解读、性能问题定位、复杂 bug 排查等实战场景，构建 AI 驱动的调试工作流。","2026-01-18",[4781,4782,4783,2687,4784],"AI 调试","问题排查","Debug","错误处理","/images/topics/ai/ai-debugging-guide.jpg",{"type":21,"children":4787,"toc":5403},[4788,4794,4800,4805,4810,4815,4821,4827,4832,4840,4868,4876,4899,4905,4915,4924,4932,4940,4973,4981,5011,5024,5032,5037,5045,5053,5062,5068,5076,5087,5095,5104,5110,5116,5121,5130,5136,5141,5150,5156,5162,5171,5177,5186,5192,5203,5209,5215,5224,5230,5239,5245,5251,5259,5265,5274,5282,5290,5293,5299,5304,5323,5335,5338,5344,5349,5358,5363,5366,5372,5377,5395],{"type":24,"tag":25,"props":4789,"children":4791},{"id":4790},"ai-辅助调试与问题排查",[4792],{"type":30,"value":4793},"AI 辅助调试与问题排查",{"type":24,"tag":25,"props":4795,"children":4797},{"id":4796},"引言调试的痛与-ai-的解药",[4798],{"type":30,"value":4799},"引言：调试的痛与 AI 的解药",{"type":24,"tag":33,"props":4801,"children":4802},{},[4803],{"type":30,"value":4804},"调试是每个程序员的日常，也是最消耗时间和精力的工作之一。我们都有过这样的经历：盯着一个莫名其妙的错误信息，翻遍 Stack Overflow，尝试各种方案，几个小时后才发现是一个愚蠢的拼写错误。",{"type":24,"tag":33,"props":4806,"children":4807},{},[4808],{"type":30,"value":4809},"AI 工具的出现，正在改变调试的方式。不是替代你的思考，而是加速你的分析过程——帮你快速理解错误、缩小排查范围、验证假设。",{"type":24,"tag":33,"props":4811,"children":4812},{},[4813],{"type":30,"value":4814},"这篇文章分享我在实际项目中使用 AI 辅助调试的经验和方法论。",{"type":24,"tag":25,"props":4816,"children":4818},{"id":4817},"第一部分建立-ai-调试的思维模型",[4819],{"type":30,"value":4820},"第一部分：建立 AI 调试的思维模型",{"type":24,"tag":155,"props":4822,"children":4824},{"id":4823},"_11-ai-在调试中的角色",[4825],{"type":30,"value":4826},"1.1 AI 在调试中的角色",{"type":24,"tag":33,"props":4828,"children":4829},{},[4830],{"type":30,"value":4831},"把 AI 想象成一个经验丰富但不了解你项目的高级工程师。它：",{"type":24,"tag":33,"props":4833,"children":4834},{},[4835],{"type":24,"tag":52,"props":4836,"children":4837},{},[4838],{"type":30,"value":4839},"擅长的事情：",{"type":24,"tag":44,"props":4841,"children":4842},{},[4843,4848,4853,4858,4863],{"type":24,"tag":48,"props":4844,"children":4845},{},[4846],{"type":30,"value":4847},"解读错误信息的含义",{"type":24,"tag":48,"props":4849,"children":4850},{},[4851],{"type":30,"value":4852},"提供可能的原因列表",{"type":24,"tag":48,"props":4854,"children":4855},{},[4856],{"type":30,"value":4857},"给出排查方向建议",{"type":24,"tag":48,"props":4859,"children":4860},{},[4861],{"type":30,"value":4862},"解释复杂的技术概念",{"type":24,"tag":48,"props":4864,"children":4865},{},[4866],{"type":30,"value":4867},"生成调试代码片段",{"type":24,"tag":33,"props":4869,"children":4870},{},[4871],{"type":24,"tag":52,"props":4872,"children":4873},{},[4874],{"type":30,"value":4875},"不擅长的事情：",{"type":24,"tag":44,"props":4877,"children":4878},{},[4879,4884,4889,4894],{"type":24,"tag":48,"props":4880,"children":4881},{},[4882],{"type":30,"value":4883},"了解你的业务逻辑",{"type":24,"tag":48,"props":4885,"children":4886},{},[4887],{"type":30,"value":4888},"知道你的代码历史",{"type":24,"tag":48,"props":4890,"children":4891},{},[4892],{"type":30,"value":4893},"理解项目特定的约定",{"type":24,"tag":48,"props":4895,"children":4896},{},[4897],{"type":30,"value":4898},"做出架构级判断",{"type":24,"tag":155,"props":4900,"children":4902},{"id":4901},"_12-有效提问的结构",[4903],{"type":30,"value":4904},"1.2 有效提问的结构",{"type":24,"tag":318,"props":4906,"children":4910},{"code":4907,"language":2670,"meta":7,"className":4908},"## 高效的调试提问模板\n\n**问题描述**\n[简洁描述遇到的问题]\n\n**错误信息**\n",[4909],"language-markdown",[4911],{"type":24,"tag":323,"props":4912,"children":4913},{"__ignoreMap":7},[4914],{"type":30,"value":4907},{"type":24,"tag":33,"props":4916,"children":4917},{},[4918],{"type":24,"tag":4919,"props":4920,"children":4921},"span",{},[4922],{"type":30,"value":4923},"完整的错误信息，不要截断",{"type":24,"tag":318,"props":4925,"children":4927},{"code":4926},"\n**相关代码**\n```javascript\n[精简但完整的相关代码]\n",[4928],{"type":24,"tag":323,"props":4929,"children":4930},{"__ignoreMap":7},[4931],{"type":30,"value":4926},{"type":24,"tag":33,"props":4933,"children":4934},{},[4935],{"type":24,"tag":52,"props":4936,"children":4937},{},[4938],{"type":30,"value":4939},"环境信息",{"type":24,"tag":44,"props":4941,"children":4942},{},[4943,4953,4963],{"type":24,"tag":48,"props":4944,"children":4945},{},[4946,4948],{"type":30,"value":4947},"运行环境：",{"type":24,"tag":4919,"props":4949,"children":4950},{},[4951],{"type":30,"value":4952},"Node 版本/浏览器版本",{"type":24,"tag":48,"props":4954,"children":4955},{},[4956,4958],{"type":30,"value":4957},"框架版本：",{"type":24,"tag":4919,"props":4959,"children":4960},{},[4961],{"type":30,"value":4962},"相关框架版本",{"type":24,"tag":48,"props":4964,"children":4965},{},[4966,4968],{"type":30,"value":4967},"操作系统：",{"type":24,"tag":4919,"props":4969,"children":4970},{},[4971],{"type":30,"value":4972},"如果相关",{"type":24,"tag":33,"props":4974,"children":4975},{},[4976],{"type":24,"tag":52,"props":4977,"children":4978},{},[4979],{"type":30,"value":4980},"已尝试的方案",{"type":24,"tag":44,"props":4982,"children":4983},{},[4984,4998],{"type":24,"tag":48,"props":4985,"children":4986},{},[4987,4992,4993],{"type":24,"tag":4919,"props":4988,"children":4989},{},[4990],{"type":30,"value":4991},"方案1",{"type":30,"value":3422},{"type":24,"tag":4919,"props":4994,"children":4995},{},[4996],{"type":30,"value":4997},"结果",{"type":24,"tag":48,"props":4999,"children":5000},{},[5001,5006,5007],{"type":24,"tag":4919,"props":5002,"children":5003},{},[5004],{"type":30,"value":5005},"方案2",{"type":30,"value":3422},{"type":24,"tag":4919,"props":5008,"children":5009},{},[5010],{"type":30,"value":4997},{"type":24,"tag":33,"props":5012,"children":5013},{},[5014,5019],{"type":24,"tag":52,"props":5015,"children":5016},{},[5017],{"type":30,"value":5018},"期望的结果",{"type":24,"tag":4919,"props":5020,"children":5021},{},[5022],{"type":30,"value":5023},"描述期望的行为",{"type":24,"tag":318,"props":5025,"children":5027},{"code":5026},"\n### 1.3 分级调试策略\n\n",[5028],{"type":24,"tag":323,"props":5029,"children":5030},{"__ignoreMap":7},[5031],{"type":30,"value":5026},{"type":24,"tag":33,"props":5033,"children":5034},{},[5035],{"type":30,"value":5036},"┌───────────────────────────────────────────────────────────┐\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":24,"tag":318,"props":5038,"children":5040},{"code":5039},"\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",[5041],{"type":24,"tag":323,"props":5042,"children":5043},{"__ignoreMap":7},[5044],{"type":30,"value":5039},{"type":24,"tag":33,"props":5046,"children":5047},{},[5048],{"type":24,"tag":52,"props":5049,"children":5050},{},[5051],{"type":30,"value":5052},"场景 2：Vue 响应式警告",{"type":24,"tag":318,"props":5054,"children":5057},{"code":5055,"language":583,"meta":7,"className":5056},"// 警告信息：\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",[585],[5058],{"type":24,"tag":323,"props":5059,"children":5060},{"__ignoreMap":7},[5061],{"type":30,"value":5055},{"type":24,"tag":155,"props":5063,"children":5065},{"id":5064},"_22-后端错误分析",[5066],{"type":30,"value":5067},"2.2 后端错误分析",{"type":24,"tag":33,"props":5069,"children":5070},{},[5071],{"type":24,"tag":52,"props":5072,"children":5073},{},[5074],{"type":30,"value":5075},"场景 1：Node.js 内存问题",{"type":24,"tag":318,"props":5077,"children":5082},{"code":5078,"language":5079,"meta":7,"className":5080},"// 错误信息：\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",[5081],"language-javascript",[5083],{"type":24,"tag":323,"props":5084,"children":5085},{"__ignoreMap":7},[5086],{"type":30,"value":5078},{"type":24,"tag":33,"props":5088,"children":5089},{},[5090],{"type":24,"tag":52,"props":5091,"children":5092},{},[5093],{"type":30,"value":5094},"场景 2：数据库连接问题",{"type":24,"tag":318,"props":5096,"children":5099},{"code":5097,"language":583,"meta":7,"className":5098},"// 错误信息：\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",[585],[5100],{"type":24,"tag":323,"props":5101,"children":5102},{"__ignoreMap":7},[5103],{"type":30,"value":5097},{"type":24,"tag":25,"props":5105,"children":5107},{"id":5106},"第三部分日志分析与问题定位",[5108],{"type":30,"value":5109},"第三部分：日志分析与问题定位",{"type":24,"tag":155,"props":5111,"children":5113},{"id":5112},"_31-结构化日志分析",[5114],{"type":30,"value":5115},"3.1 结构化日志分析",{"type":24,"tag":33,"props":5117,"children":5118},{},[5119],{"type":30,"value":5120},"当面对大量日志时，让 AI 帮你快速定位问题：",{"type":24,"tag":318,"props":5122,"children":5125},{"code":5123,"language":5079,"meta":7,"className":5124},"// 提问示例：\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",[5081],[5126],{"type":24,"tag":323,"props":5127,"children":5128},{"__ignoreMap":7},[5129],{"type":30,"value":5123},{"type":24,"tag":155,"props":5131,"children":5133},{"id":5132},"_32-创建调试日志",[5134],{"type":30,"value":5135},"3.2 创建调试日志",{"type":24,"tag":33,"props":5137,"children":5138},{},[5139],{"type":30,"value":5140},"让 AI 帮你生成调试用的日志代码：",{"type":24,"tag":318,"props":5142,"children":5145},{"code":5143,"language":583,"meta":7,"className":5144},"// 请求：\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",[585],[5146],{"type":24,"tag":323,"props":5147,"children":5148},{"__ignoreMap":7},[5149],{"type":30,"value":5143},{"type":24,"tag":25,"props":5151,"children":5153},{"id":5152},"第四部分性能问题排查",[5154],{"type":30,"value":5155},"第四部分：性能问题排查",{"type":24,"tag":155,"props":5157,"children":5159},{"id":5158},"_41-前端性能分析",[5160],{"type":30,"value":5161},"4.1 前端性能分析",{"type":24,"tag":318,"props":5163,"children":5166},{"code":5164,"language":583,"meta":7,"className":5165},"// 场景：页面加载慢，需要分析原因\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",[585],[5167],{"type":24,"tag":323,"props":5168,"children":5169},{"__ignoreMap":7},[5170],{"type":30,"value":5164},{"type":24,"tag":155,"props":5172,"children":5174},{"id":5173},"_42-内存泄漏排查",[5175],{"type":30,"value":5176},"4.2 内存泄漏排查",{"type":24,"tag":318,"props":5178,"children":5181},{"code":5179,"language":583,"meta":7,"className":5180},"// 场景：应用运行一段时间后变卡\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",[585],[5182],{"type":24,"tag":323,"props":5183,"children":5184},{"__ignoreMap":7},[5185],{"type":30,"value":5179},{"type":24,"tag":155,"props":5187,"children":5189},{"id":5188},"_43-数据库查询优化",[5190],{"type":30,"value":5191},"4.3 数据库查询优化",{"type":24,"tag":318,"props":5193,"children":5198},{"code":5194,"language":5195,"meta":7,"className":5196},"-- 场景：查询很慢，让 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",[5197],"language-sql",[5199],{"type":24,"tag":323,"props":5200,"children":5201},{"__ignoreMap":7},[5202],{"type":30,"value":5194},{"type":24,"tag":25,"props":5204,"children":5206},{"id":5205},"第五部分复杂-bug-排查",[5207],{"type":30,"value":5208},"第五部分：复杂 Bug 排查",{"type":24,"tag":155,"props":5210,"children":5212},{"id":5211},"_51-竞态条件",[5213],{"type":30,"value":5214},"5.1 竞态条件",{"type":24,"tag":318,"props":5216,"children":5219},{"code":5217,"language":583,"meta":7,"className":5218},"// 场景：偶发的数据不一致问题\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",[585],[5220],{"type":24,"tag":323,"props":5221,"children":5222},{"__ignoreMap":7},[5223],{"type":30,"value":5217},{"type":24,"tag":155,"props":5225,"children":5227},{"id":5226},"_52-分布式系统问题",[5228],{"type":30,"value":5229},"5.2 分布式系统问题",{"type":24,"tag":318,"props":5231,"children":5234},{"code":5232,"language":583,"meta":7,"className":5233},"// 场景：微服务间的数据不一致\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",[585],[5235],{"type":24,"tag":323,"props":5236,"children":5237},{"__ignoreMap":7},[5238],{"type":30,"value":5232},{"type":24,"tag":25,"props":5240,"children":5242},{"id":5241},"第六部分ai-调试工作流",[5243],{"type":30,"value":5244},"第六部分：AI 调试工作流",{"type":24,"tag":155,"props":5246,"children":5248},{"id":5247},"_61-我的调试流程",[5249],{"type":30,"value":5250},"6.1 我的调试流程",{"type":24,"tag":318,"props":5252,"children":5254},{"code":5253},"┌────────────────────────────────────────────────────────────┐\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",[5255],{"type":24,"tag":323,"props":5256,"children":5257},{"__ignoreMap":7},[5258],{"type":30,"value":5253},{"type":24,"tag":155,"props":5260,"children":5262},{"id":5261},"_62-调试对话模板",[5263],{"type":30,"value":5264},"6.2 调试对话模板",{"type":24,"tag":318,"props":5266,"children":5269},{"code":5267,"language":2670,"meta":7,"className":5268},"## 第一轮：问题描述\n\n我遇到了一个问题：[简述问题]\n\n错误信息：\n",[4909],[5270],{"type":24,"tag":323,"props":5271,"children":5272},{"__ignoreMap":7},[5273],{"type":30,"value":5267},{"type":24,"tag":33,"props":5275,"children":5276},{},[5277],{"type":24,"tag":4919,"props":5278,"children":5279},{},[5280],{"type":30,"value":5281},"粘贴完整错误",{"type":24,"tag":318,"props":5283,"children":5285},{"code":5284},"\n相关代码：\n```javascript\n[粘贴代码]\n",[5286],{"type":24,"tag":323,"props":5287,"children":5288},{"__ignoreMap":7},[5289],{"type":30,"value":5284},{"type":24,"tag":2596,"props":5291,"children":5292},{},[],{"type":24,"tag":25,"props":5294,"children":5296},{"id":5295},"第二轮补充信息",[5297],{"type":30,"value":5298},"第二轮：补充信息",{"type":24,"tag":33,"props":5300,"children":5301},{},[5302],{"type":30,"value":5303},"根据你的建议，我添加了日志，发现：",{"type":24,"tag":44,"props":5305,"children":5306},{},[5307,5315],{"type":24,"tag":48,"props":5308,"children":5309},{},[5310],{"type":24,"tag":4919,"props":5311,"children":5312},{},[5313],{"type":30,"value":5314},"发现 1",{"type":24,"tag":48,"props":5316,"children":5317},{},[5318],{"type":24,"tag":4919,"props":5319,"children":5320},{},[5321],{"type":30,"value":5322},"发现 2",{"type":24,"tag":33,"props":5324,"children":5325},{},[5326,5328,5333],{"type":30,"value":5327},"这是否说明问题出在 ",{"type":24,"tag":4919,"props":5329,"children":5330},{},[5331],{"type":30,"value":5332},"你的猜测",{"type":30,"value":5334},"？",{"type":24,"tag":2596,"props":5336,"children":5337},{},[],{"type":24,"tag":25,"props":5339,"children":5341},{"id":5340},"第三轮确认修复",[5342],{"type":30,"value":5343},"第三轮：确认修复",{"type":24,"tag":33,"props":5345,"children":5346},{},[5347],{"type":30,"value":5348},"我按照你的建议修改了代码：",{"type":24,"tag":318,"props":5350,"children":5353},{"code":5351,"language":5079,"meta":7,"className":5352},"[粘贴修改后的代码]\n",[5081],[5354],{"type":24,"tag":323,"props":5355,"children":5356},{"__ignoreMap":7},[5357],{"type":30,"value":5351},{"type":24,"tag":33,"props":5359,"children":5360},{},[5361],{"type":30,"value":5362},"请确认这个修复是否正确，以及是否有其他潜在问题。",{"type":24,"tag":2596,"props":5364,"children":5365},{},[],{"type":24,"tag":25,"props":5367,"children":5369},{"id":5368},"第四轮预防",[5370],{"type":30,"value":5371},"第四轮：预防",{"type":24,"tag":33,"props":5373,"children":5374},{},[5375],{"type":30,"value":5376},"这个问题已解决。请建议：",{"type":24,"tag":632,"props":5378,"children":5379},{},[5380,5385,5390],{"type":24,"tag":48,"props":5381,"children":5382},{},[5383],{"type":30,"value":5384},"如何防止类似问题再次发生？",{"type":24,"tag":48,"props":5386,"children":5387},{},[5388],{"type":30,"value":5389},"应该添加什么测试用例？",{"type":24,"tag":48,"props":5391,"children":5392},{},[5393],{"type":30,"value":5394},"有什么最佳实践可以参考？",{"type":24,"tag":318,"props":5396,"children":5398},{"code":5397},"\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",[5399],{"type":24,"tag":323,"props":5400,"children":5401},{"__ignoreMap":7},[5402],{"type":30,"value":5397},{"title":7,"searchDepth":2618,"depth":2618,"links":5404},[5405,5406,5407,5412,5416,5421,5425,5429,5430,5431],{"id":4790,"depth":2621,"text":4793},{"id":4796,"depth":2621,"text":4799},{"id":4817,"depth":2621,"text":4820,"children":5408},[5409,5410,5411],{"id":4823,"depth":2618,"text":4826},{"id":4901,"depth":2618,"text":4904},{"id":5064,"depth":2618,"text":5067},{"id":5106,"depth":2621,"text":5109,"children":5413},[5414,5415],{"id":5112,"depth":2618,"text":5115},{"id":5132,"depth":2618,"text":5135},{"id":5152,"depth":2621,"text":5155,"children":5417},[5418,5419,5420],{"id":5158,"depth":2618,"text":5161},{"id":5173,"depth":2618,"text":5176},{"id":5188,"depth":2618,"text":5191},{"id":5205,"depth":2621,"text":5208,"children":5422},[5423,5424],{"id":5211,"depth":2618,"text":5214},{"id":5226,"depth":2618,"text":5229},{"id":5241,"depth":2621,"text":5244,"children":5426},[5427,5428],{"id":5247,"depth":2618,"text":5250},{"id":5261,"depth":2618,"text":5264},{"id":5295,"depth":2621,"text":5298},{"id":5340,"depth":2621,"text":5343},{"id":5368,"depth":2621,"text":5371},"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":5436,"image":18,"featured":6,"readingTime":19,"body":5437,"_type":2670,"_id":2671,"_source":2672,"_file":2673,"_stem":2674,"_extension":2675},[13,14,15,16,17],{"type":21,"children":5438,"toc":7539},[5439,5443,5447,5451,5486,5490,5517,5525,5534,5538,5542,5546,5573,5577,5581,5608,5612,5616,5620,5655,5659,5663,5667,5674,5678,5682,5686,5729,5737,5744,5748,5752,5868,5872,5876,5884,5888,5892,5896,5907,5915,5950,5958,5962,5966,5974,6009,6013,6017,6025,6060,6068,6072,6076,6084,6119,6127,6131,6135,6143,6186,6194,6230,6234,6238,6242,6250,6258,6265,6269,6273,6281,6308,6316,6324,6328,6332,6340,6383,6391,6434,6438,6442,6446,6454,6497,6505,6540,6544,6548,6556,6591,6599,6607,6611,6615,6623,6666,6674,6709,6713,6717,6721,6729,6780,6788,6796,6811,6815,6819,6826,6830,6834,6842,6849,6853,6857,6865,6908,6912,6920,6963,6971,6975,6983,7026,7030,7038,7081,7085,7093,7136,7140,7148,7191,7195,7203,7254,7258,7271,7306,7314,7349,7357,7392,7396,7431,7435,7439,7523,7526],{"type":24,"tag":25,"props":5440,"children":5441},{"id":27},[5442],{"type":30,"value":31},{"type":24,"tag":33,"props":5444,"children":5445},{},[5446],{"type":30,"value":37},{"type":24,"tag":33,"props":5448,"children":5449},{},[5450],{"type":30,"value":42},{"type":24,"tag":44,"props":5452,"children":5453},{},[5454,5462,5470,5478],{"type":24,"tag":48,"props":5455,"children":5456},{},[5457,5461],{"type":24,"tag":52,"props":5458,"children":5459},{},[5460],{"type":30,"value":56},{"type":30,"value":58},{"type":24,"tag":48,"props":5463,"children":5464},{},[5465,5469],{"type":24,"tag":52,"props":5466,"children":5467},{},[5468],{"type":30,"value":66},{"type":30,"value":68},{"type":24,"tag":48,"props":5471,"children":5472},{},[5473,5477],{"type":24,"tag":52,"props":5474,"children":5475},{},[5476],{"type":30,"value":76},{"type":30,"value":78},{"type":24,"tag":48,"props":5479,"children":5480},{},[5481,5485],{"type":24,"tag":52,"props":5482,"children":5483},{},[5484],{"type":30,"value":86},{"type":30,"value":88},{"type":24,"tag":33,"props":5487,"children":5488},{},[5489],{"type":30,"value":93},{"type":24,"tag":44,"props":5491,"children":5492},{},[5493,5501,5509],{"type":24,"tag":48,"props":5494,"children":5495},{},[5496,5500],{"type":24,"tag":52,"props":5497,"children":5498},{},[5499],{"type":30,"value":104},{"type":30,"value":106},{"type":24,"tag":48,"props":5502,"children":5503},{},[5504,5508],{"type":24,"tag":52,"props":5505,"children":5506},{},[5507],{"type":30,"value":114},{"type":30,"value":116},{"type":24,"tag":48,"props":5510,"children":5511},{},[5512,5516],{"type":24,"tag":52,"props":5513,"children":5514},{},[5515],{"type":30,"value":124},{"type":30,"value":126},{"type":24,"tag":33,"props":5518,"children":5519},{},[5520,5524],{"type":24,"tag":52,"props":5521,"children":5522},{},[5523],{"type":30,"value":134},{"type":30,"value":136},{"type":24,"tag":33,"props":5526,"children":5527},{},[5528,5529,5533],{"type":30,"value":141},{"type":24,"tag":52,"props":5530,"children":5531},{},[5532],{"type":30,"value":146},{"type":30,"value":148},{"type":24,"tag":25,"props":5535,"children":5536},{"id":151},[5537],{"type":30,"value":31},{"type":24,"tag":155,"props":5539,"children":5540},{"id":157},[5541],{"type":30,"value":160},{"type":24,"tag":33,"props":5543,"children":5544},{},[5545],{"type":30,"value":165},{"type":24,"tag":44,"props":5547,"children":5548},{},[5549,5557,5565],{"type":24,"tag":48,"props":5550,"children":5551},{},[5552,5556],{"type":24,"tag":52,"props":5553,"children":5554},{},[5555],{"type":30,"value":176},{"type":30,"value":178},{"type":24,"tag":48,"props":5558,"children":5559},{},[5560,5564],{"type":24,"tag":52,"props":5561,"children":5562},{},[5563],{"type":30,"value":186},{"type":30,"value":188},{"type":24,"tag":48,"props":5566,"children":5567},{},[5568,5572],{"type":24,"tag":52,"props":5569,"children":5570},{},[5571],{"type":30,"value":196},{"type":30,"value":198},{"type":24,"tag":155,"props":5574,"children":5575},{"id":201},[5576],{"type":30,"value":204},{"type":24,"tag":33,"props":5578,"children":5579},{},[5580],{"type":30,"value":209},{"type":24,"tag":44,"props":5582,"children":5583},{},[5584,5592,5600],{"type":24,"tag":48,"props":5585,"children":5586},{},[5587,5591],{"type":24,"tag":52,"props":5588,"children":5589},{},[5590],{"type":30,"value":220},{"type":30,"value":222},{"type":24,"tag":48,"props":5593,"children":5594},{},[5595,5599],{"type":24,"tag":52,"props":5596,"children":5597},{},[5598],{"type":30,"value":230},{"type":30,"value":232},{"type":24,"tag":48,"props":5601,"children":5602},{},[5603,5607],{"type":24,"tag":52,"props":5604,"children":5605},{},[5606],{"type":30,"value":134},{"type":30,"value":241},{"type":24,"tag":33,"props":5609,"children":5610},{},[5611],{"type":30,"value":246},{"type":24,"tag":155,"props":5613,"children":5614},{"id":249},[5615],{"type":30,"value":252},{"type":24,"tag":33,"props":5617,"children":5618},{},[5619],{"type":30,"value":257},{"type":24,"tag":44,"props":5621,"children":5622},{},[5623,5631,5639,5647],{"type":24,"tag":48,"props":5624,"children":5625},{},[5626,5630],{"type":24,"tag":52,"props":5627,"children":5628},{},[5629],{"type":30,"value":268},{"type":30,"value":270},{"type":24,"tag":48,"props":5632,"children":5633},{},[5634,5638],{"type":24,"tag":52,"props":5635,"children":5636},{},[5637],{"type":30,"value":278},{"type":30,"value":280},{"type":24,"tag":48,"props":5640,"children":5641},{},[5642,5646],{"type":24,"tag":52,"props":5643,"children":5644},{},[5645],{"type":30,"value":288},{"type":30,"value":290},{"type":24,"tag":48,"props":5648,"children":5649},{},[5650,5654],{"type":24,"tag":52,"props":5651,"children":5652},{},[5653],{"type":30,"value":298},{"type":30,"value":300},{"type":24,"tag":25,"props":5656,"children":5657},{"id":303},[5658],{"type":30,"value":303},{"type":24,"tag":155,"props":5660,"children":5661},{"id":308},[5662],{"type":30,"value":311},{"type":24,"tag":33,"props":5664,"children":5665},{},[5666],{"type":30,"value":316},{"type":24,"tag":318,"props":5668,"children":5669},{"code":320},[5670],{"type":24,"tag":323,"props":5671,"children":5672},{"__ignoreMap":7},[5673],{"type":30,"value":320},{"type":24,"tag":155,"props":5675,"children":5676},{"id":329},[5677],{"type":30,"value":332},{"type":24,"tag":334,"props":5679,"children":5680},{"id":336},[5681],{"type":30,"value":339},{"type":24,"tag":33,"props":5683,"children":5684},{},[5685],{"type":30,"value":344},{"type":24,"tag":44,"props":5687,"children":5688},{},[5689,5697,5705,5713,5721],{"type":24,"tag":48,"props":5690,"children":5691},{},[5692,5696],{"type":24,"tag":52,"props":5693,"children":5694},{},[5695],{"type":30,"value":355},{"type":30,"value":357},{"type":24,"tag":48,"props":5698,"children":5699},{},[5700,5704],{"type":24,"tag":52,"props":5701,"children":5702},{},[5703],{"type":30,"value":365},{"type":30,"value":367},{"type":24,"tag":48,"props":5706,"children":5707},{},[5708,5712],{"type":24,"tag":52,"props":5709,"children":5710},{},[5711],{"type":30,"value":375},{"type":30,"value":377},{"type":24,"tag":48,"props":5714,"children":5715},{},[5716,5720],{"type":24,"tag":52,"props":5717,"children":5718},{},[5719],{"type":30,"value":385},{"type":30,"value":387},{"type":24,"tag":48,"props":5722,"children":5723},{},[5724,5728],{"type":24,"tag":52,"props":5725,"children":5726},{},[5727],{"type":30,"value":395},{"type":30,"value":397},{"type":24,"tag":33,"props":5730,"children":5731},{},[5732,5736],{"type":24,"tag":52,"props":5733,"children":5734},{},[5735],{"type":30,"value":405},{"type":30,"value":407},{"type":24,"tag":44,"props":5738,"children":5739},{},[5740],{"type":24,"tag":48,"props":5741,"children":5742},{},[5743],{"type":30,"value":415},{"type":24,"tag":334,"props":5745,"children":5746},{"id":418},[5747],{"type":30,"value":421},{"type":24,"tag":33,"props":5749,"children":5750},{},[5751],{"type":30,"value":426},{"type":24,"tag":428,"props":5753,"children":5754},{},[5755,5777],{"type":24,"tag":432,"props":5756,"children":5757},{},[5758],{"type":24,"tag":436,"props":5759,"children":5760},{},[5761,5765,5769,5773],{"type":24,"tag":440,"props":5762,"children":5763},{},[5764],{"type":30,"value":444},{"type":24,"tag":440,"props":5766,"children":5767},{},[5768],{"type":30,"value":449},{"type":24,"tag":440,"props":5770,"children":5771},{},[5772],{"type":30,"value":454},{"type":24,"tag":440,"props":5774,"children":5775},{},[5776],{"type":30,"value":459},{"type":24,"tag":461,"props":5778,"children":5779},{},[5780,5802,5824,5846],{"type":24,"tag":436,"props":5781,"children":5782},{},[5783,5790,5794,5798],{"type":24,"tag":468,"props":5784,"children":5785},{},[5786],{"type":24,"tag":52,"props":5787,"children":5788},{},[5789],{"type":30,"value":475},{"type":24,"tag":468,"props":5791,"children":5792},{},[5793],{"type":30,"value":480},{"type":24,"tag":468,"props":5795,"children":5796},{},[5797],{"type":30,"value":485},{"type":24,"tag":468,"props":5799,"children":5800},{},[5801],{"type":30,"value":490},{"type":24,"tag":436,"props":5803,"children":5804},{},[5805,5812,5816,5820],{"type":24,"tag":468,"props":5806,"children":5807},{},[5808],{"type":24,"tag":52,"props":5809,"children":5810},{},[5811],{"type":30,"value":501},{"type":24,"tag":468,"props":5813,"children":5814},{},[5815],{"type":30,"value":506},{"type":24,"tag":468,"props":5817,"children":5818},{},[5819],{"type":30,"value":511},{"type":24,"tag":468,"props":5821,"children":5822},{},[5823],{"type":30,"value":516},{"type":24,"tag":436,"props":5825,"children":5826},{},[5827,5834,5838,5842],{"type":24,"tag":468,"props":5828,"children":5829},{},[5830],{"type":24,"tag":52,"props":5831,"children":5832},{},[5833],{"type":30,"value":527},{"type":24,"tag":468,"props":5835,"children":5836},{},[5837],{"type":30,"value":532},{"type":24,"tag":468,"props":5839,"children":5840},{},[5841],{"type":30,"value":537},{"type":24,"tag":468,"props":5843,"children":5844},{},[5845],{"type":30,"value":542},{"type":24,"tag":436,"props":5847,"children":5848},{},[5849,5856,5860,5864],{"type":24,"tag":468,"props":5850,"children":5851},{},[5852],{"type":24,"tag":52,"props":5853,"children":5854},{},[5855],{"type":30,"value":553},{"type":24,"tag":468,"props":5857,"children":5858},{},[5859],{"type":30,"value":558},{"type":24,"tag":468,"props":5861,"children":5862},{},[5863],{"type":30,"value":563},{"type":24,"tag":468,"props":5865,"children":5866},{},[5867],{"type":30,"value":568},{"type":24,"tag":334,"props":5869,"children":5870},{"id":571},[5871],{"type":30,"value":574},{"type":24,"tag":33,"props":5873,"children":5874},{},[5875],{"type":30,"value":579},{"type":24,"tag":318,"props":5877,"children":5879},{"code":582,"language":583,"meta":7,"className":5878},[585],[5880],{"type":24,"tag":323,"props":5881,"children":5882},{"__ignoreMap":7},[5883],{"type":30,"value":582},{"type":24,"tag":155,"props":5885,"children":5886},{"id":593},[5887],{"type":30,"value":596},{"type":24,"tag":334,"props":5889,"children":5890},{"id":599},[5891],{"type":30,"value":602},{"type":24,"tag":33,"props":5893,"children":5894},{},[5895],{"type":30,"value":607},{"type":24,"tag":33,"props":5897,"children":5898},{},[5899,5903,5906],{"type":24,"tag":52,"props":5900,"children":5901},{},[5902],{"type":30,"value":615},{"type":24,"tag":617,"props":5904,"children":5905},{},[],{"type":30,"value":621},{"type":24,"tag":33,"props":5908,"children":5909},{},[5910,5914],{"type":24,"tag":52,"props":5911,"children":5912},{},[5913],{"type":30,"value":629},{"type":30,"value":407},{"type":24,"tag":632,"props":5916,"children":5917},{},[5918,5926,5934,5942],{"type":24,"tag":48,"props":5919,"children":5920},{},[5921,5925],{"type":24,"tag":52,"props":5922,"children":5923},{},[5924],{"type":30,"value":642},{"type":30,"value":644},{"type":24,"tag":48,"props":5927,"children":5928},{},[5929,5933],{"type":24,"tag":52,"props":5930,"children":5931},{},[5932],{"type":30,"value":652},{"type":30,"value":654},{"type":24,"tag":48,"props":5935,"children":5936},{},[5937,5941],{"type":24,"tag":52,"props":5938,"children":5939},{},[5940],{"type":30,"value":662},{"type":30,"value":664},{"type":24,"tag":48,"props":5943,"children":5944},{},[5945,5949],{"type":24,"tag":52,"props":5946,"children":5947},{},[5948],{"type":30,"value":672},{"type":30,"value":674},{"type":24,"tag":318,"props":5951,"children":5953},{"code":677,"language":678,"meta":7,"className":5952},[680],[5954],{"type":24,"tag":323,"props":5955,"children":5956},{"__ignoreMap":7},[5957],{"type":30,"value":677},{"type":24,"tag":334,"props":5959,"children":5960},{"id":688},[5961],{"type":30,"value":691},{"type":24,"tag":33,"props":5963,"children":5964},{},[5965],{"type":30,"value":696},{"type":24,"tag":33,"props":5967,"children":5968},{},[5969,5973],{"type":24,"tag":52,"props":5970,"children":5971},{},[5972],{"type":30,"value":704},{"type":30,"value":407},{"type":24,"tag":632,"props":5975,"children":5976},{},[5977,5985,5993,6001],{"type":24,"tag":48,"props":5978,"children":5979},{},[5980,5984],{"type":24,"tag":52,"props":5981,"children":5982},{},[5983],{"type":30,"value":716},{"type":30,"value":718},{"type":24,"tag":48,"props":5986,"children":5987},{},[5988,5992],{"type":24,"tag":52,"props":5989,"children":5990},{},[5991],{"type":30,"value":726},{"type":30,"value":728},{"type":24,"tag":48,"props":5994,"children":5995},{},[5996,6000],{"type":24,"tag":52,"props":5997,"children":5998},{},[5999],{"type":30,"value":736},{"type":30,"value":738},{"type":24,"tag":48,"props":6002,"children":6003},{},[6004,6008],{"type":24,"tag":52,"props":6005,"children":6006},{},[6007],{"type":30,"value":746},{"type":30,"value":748},{"type":24,"tag":155,"props":6010,"children":6011},{"id":751},[6012],{"type":30,"value":754},{"type":24,"tag":33,"props":6014,"children":6015},{},[6016],{"type":30,"value":759},{"type":24,"tag":33,"props":6018,"children":6019},{},[6020,6024],{"type":24,"tag":52,"props":6021,"children":6022},{},[6023],{"type":30,"value":767},{"type":30,"value":407},{"type":24,"tag":632,"props":6026,"children":6027},{},[6028,6036,6044,6052],{"type":24,"tag":48,"props":6029,"children":6030},{},[6031,6035],{"type":24,"tag":52,"props":6032,"children":6033},{},[6034],{"type":30,"value":779},{"type":30,"value":781},{"type":24,"tag":48,"props":6037,"children":6038},{},[6039,6043],{"type":24,"tag":52,"props":6040,"children":6041},{},[6042],{"type":30,"value":789},{"type":30,"value":791},{"type":24,"tag":48,"props":6045,"children":6046},{},[6047,6051],{"type":24,"tag":52,"props":6048,"children":6049},{},[6050],{"type":30,"value":799},{"type":30,"value":801},{"type":24,"tag":48,"props":6053,"children":6054},{},[6055,6059],{"type":24,"tag":52,"props":6056,"children":6057},{},[6058],{"type":30,"value":809},{"type":30,"value":811},{"type":24,"tag":318,"props":6061,"children":6063},{"code":814,"language":678,"meta":7,"className":6062},[680],[6064],{"type":24,"tag":323,"props":6065,"children":6066},{"__ignoreMap":7},[6067],{"type":30,"value":814},{"type":24,"tag":155,"props":6069,"children":6070},{"id":823},[6071],{"type":30,"value":826},{"type":24,"tag":33,"props":6073,"children":6074},{},[6075],{"type":30,"value":831},{"type":24,"tag":33,"props":6077,"children":6078},{},[6079,6083],{"type":24,"tag":52,"props":6080,"children":6081},{},[6082],{"type":30,"value":839},{"type":30,"value":407},{"type":24,"tag":632,"props":6085,"children":6086},{},[6087,6095,6103,6111],{"type":24,"tag":48,"props":6088,"children":6089},{},[6090,6094],{"type":24,"tag":52,"props":6091,"children":6092},{},[6093],{"type":30,"value":851},{"type":30,"value":853},{"type":24,"tag":48,"props":6096,"children":6097},{},[6098,6102],{"type":24,"tag":52,"props":6099,"children":6100},{},[6101],{"type":30,"value":861},{"type":30,"value":863},{"type":24,"tag":48,"props":6104,"children":6105},{},[6106,6110],{"type":24,"tag":52,"props":6107,"children":6108},{},[6109],{"type":30,"value":871},{"type":30,"value":873},{"type":24,"tag":48,"props":6112,"children":6113},{},[6114,6118],{"type":24,"tag":52,"props":6115,"children":6116},{},[6117],{"type":30,"value":881},{"type":30,"value":883},{"type":24,"tag":318,"props":6120,"children":6122},{"code":886,"language":583,"meta":7,"className":6121},[585],[6123],{"type":24,"tag":323,"props":6124,"children":6125},{"__ignoreMap":7},[6126],{"type":30,"value":886},{"type":24,"tag":155,"props":6128,"children":6129},{"id":895},[6130],{"type":30,"value":898},{"type":24,"tag":33,"props":6132,"children":6133},{},[6134],{"type":30,"value":903},{"type":24,"tag":33,"props":6136,"children":6137},{},[6138,6142],{"type":24,"tag":52,"props":6139,"children":6140},{},[6141],{"type":30,"value":911},{"type":30,"value":407},{"type":24,"tag":632,"props":6144,"children":6145},{},[6146,6154,6162,6170,6178],{"type":24,"tag":48,"props":6147,"children":6148},{},[6149,6153],{"type":24,"tag":52,"props":6150,"children":6151},{},[6152],{"type":30,"value":923},{"type":30,"value":925},{"type":24,"tag":48,"props":6155,"children":6156},{},[6157,6161],{"type":24,"tag":52,"props":6158,"children":6159},{},[6160],{"type":30,"value":933},{"type":30,"value":935},{"type":24,"tag":48,"props":6163,"children":6164},{},[6165,6169],{"type":24,"tag":52,"props":6166,"children":6167},{},[6168],{"type":30,"value":943},{"type":30,"value":945},{"type":24,"tag":48,"props":6171,"children":6172},{},[6173,6177],{"type":24,"tag":52,"props":6174,"children":6175},{},[6176],{"type":30,"value":953},{"type":30,"value":955},{"type":24,"tag":48,"props":6179,"children":6180},{},[6181,6185],{"type":24,"tag":52,"props":6182,"children":6183},{},[6184],{"type":30,"value":963},{"type":30,"value":965},{"type":24,"tag":33,"props":6187,"children":6188},{},[6189,6193],{"type":24,"tag":52,"props":6190,"children":6191},{},[6192],{"type":30,"value":973},{"type":30,"value":407},{"type":24,"tag":44,"props":6195,"children":6197},{"className":6196},[978],[6198,6206,6214,6222],{"type":24,"tag":48,"props":6199,"children":6201},{"className":6200},[983],[6202,6205],{"type":24,"tag":986,"props":6203,"children":6204},{"disabled":988,"type":989},[],{"type":30,"value":992},{"type":24,"tag":48,"props":6207,"children":6209},{"className":6208},[983],[6210,6213],{"type":24,"tag":986,"props":6211,"children":6212},{"disabled":988,"type":989},[],{"type":30,"value":1001},{"type":24,"tag":48,"props":6215,"children":6217},{"className":6216},[983],[6218,6221],{"type":24,"tag":986,"props":6219,"children":6220},{"disabled":988,"type":989},[],{"type":30,"value":1010},{"type":24,"tag":48,"props":6223,"children":6225},{"className":6224},[983],[6226,6229],{"type":24,"tag":986,"props":6227,"children":6228},{"disabled":988,"type":989},[],{"type":30,"value":1019},{"type":24,"tag":25,"props":6231,"children":6232},{"id":1022},[6233],{"type":30,"value":1022},{"type":24,"tag":155,"props":6235,"children":6236},{"id":1027},[6237],{"type":30,"value":1030},{"type":24,"tag":33,"props":6239,"children":6240},{},[6241],{"type":30,"value":1035},{"type":24,"tag":318,"props":6243,"children":6245},{"code":1038,"language":583,"meta":7,"className":6244},[585],[6246],{"type":24,"tag":323,"props":6247,"children":6248},{"__ignoreMap":7},[6249],{"type":30,"value":1038},{"type":24,"tag":33,"props":6251,"children":6252},{},[6253,6257],{"type":24,"tag":52,"props":6254,"children":6255},{},[6256],{"type":30,"value":1052},{"type":30,"value":407},{"type":24,"tag":318,"props":6259,"children":6260},{"code":1056},[6261],{"type":24,"tag":323,"props":6262,"children":6263},{"__ignoreMap":7},[6264],{"type":30,"value":1056},{"type":24,"tag":155,"props":6266,"children":6267},{"id":1064},[6268],{"type":30,"value":1067},{"type":24,"tag":33,"props":6270,"children":6271},{},[6272],{"type":30,"value":1072},{"type":24,"tag":33,"props":6274,"children":6275},{},[6276,6280],{"type":24,"tag":52,"props":6277,"children":6278},{},[6279],{"type":30,"value":1080},{"type":30,"value":407},{"type":24,"tag":44,"props":6282,"children":6283},{},[6284,6292,6300],{"type":24,"tag":48,"props":6285,"children":6286},{},[6287,6291],{"type":24,"tag":52,"props":6288,"children":6289},{},[6290],{"type":30,"value":1092},{"type":30,"value":1094},{"type":24,"tag":48,"props":6293,"children":6294},{},[6295,6299],{"type":24,"tag":52,"props":6296,"children":6297},{},[6298],{"type":30,"value":1102},{"type":30,"value":1104},{"type":24,"tag":48,"props":6301,"children":6302},{},[6303,6307],{"type":24,"tag":52,"props":6304,"children":6305},{},[6306],{"type":30,"value":1112},{"type":30,"value":1114},{"type":24,"tag":33,"props":6309,"children":6310},{},[6311,6315],{"type":24,"tag":52,"props":6312,"children":6313},{},[6314],{"type":30,"value":1122},{"type":30,"value":1124},{"type":24,"tag":318,"props":6317,"children":6319},{"code":1127,"language":1128,"meta":7,"className":6318},[1130],[6320],{"type":24,"tag":323,"props":6321,"children":6322},{"__ignoreMap":7},[6323],{"type":30,"value":1127},{"type":24,"tag":155,"props":6325,"children":6326},{"id":1138},[6327],{"type":30,"value":1141},{"type":24,"tag":33,"props":6329,"children":6330},{},[6331],{"type":30,"value":1146},{"type":24,"tag":33,"props":6333,"children":6334},{},[6335,6339],{"type":24,"tag":52,"props":6336,"children":6337},{},[6338],{"type":30,"value":1154},{"type":30,"value":407},{"type":24,"tag":44,"props":6341,"children":6342},{},[6343,6351,6359,6367,6375],{"type":24,"tag":48,"props":6344,"children":6345},{},[6346,6350],{"type":24,"tag":52,"props":6347,"children":6348},{},[6349],{"type":30,"value":1166},{"type":30,"value":1168},{"type":24,"tag":48,"props":6352,"children":6353},{},[6354,6358],{"type":24,"tag":52,"props":6355,"children":6356},{},[6357],{"type":30,"value":1176},{"type":30,"value":1178},{"type":24,"tag":48,"props":6360,"children":6361},{},[6362,6366],{"type":24,"tag":52,"props":6363,"children":6364},{},[6365],{"type":30,"value":1186},{"type":30,"value":1188},{"type":24,"tag":48,"props":6368,"children":6369},{},[6370,6374],{"type":24,"tag":52,"props":6371,"children":6372},{},[6373],{"type":30,"value":1196},{"type":30,"value":1198},{"type":24,"tag":48,"props":6376,"children":6377},{},[6378,6382],{"type":24,"tag":52,"props":6379,"children":6380},{},[6381],{"type":30,"value":1206},{"type":30,"value":1208},{"type":24,"tag":33,"props":6384,"children":6385},{},[6386,6390],{"type":24,"tag":52,"props":6387,"children":6388},{},[6389],{"type":30,"value":1216},{"type":30,"value":407},{"type":24,"tag":44,"props":6392,"children":6393},{},[6394,6402,6410,6418,6426],{"type":24,"tag":48,"props":6395,"children":6396},{},[6397,6401],{"type":24,"tag":52,"props":6398,"children":6399},{},[6400],{"type":30,"value":1228},{"type":30,"value":1230},{"type":24,"tag":48,"props":6403,"children":6404},{},[6405,6409],{"type":24,"tag":52,"props":6406,"children":6407},{},[6408],{"type":30,"value":1238},{"type":30,"value":1240},{"type":24,"tag":48,"props":6411,"children":6412},{},[6413,6417],{"type":24,"tag":52,"props":6414,"children":6415},{},[6416],{"type":30,"value":1248},{"type":30,"value":1250},{"type":24,"tag":48,"props":6419,"children":6420},{},[6421,6425],{"type":24,"tag":52,"props":6422,"children":6423},{},[6424],{"type":30,"value":1258},{"type":30,"value":1260},{"type":24,"tag":48,"props":6427,"children":6428},{},[6429,6433],{"type":24,"tag":52,"props":6430,"children":6431},{},[6432],{"type":30,"value":1268},{"type":30,"value":1270},{"type":24,"tag":25,"props":6435,"children":6436},{"id":1273},[6437],{"type":30,"value":1273},{"type":24,"tag":155,"props":6439,"children":6440},{"id":1278},[6441],{"type":30,"value":1281},{"type":24,"tag":33,"props":6443,"children":6444},{},[6445],{"type":30,"value":1286},{"type":24,"tag":33,"props":6447,"children":6448},{},[6449,6453],{"type":24,"tag":52,"props":6450,"children":6451},{},[6452],{"type":30,"value":1294},{"type":30,"value":407},{"type":24,"tag":44,"props":6455,"children":6456},{},[6457,6465,6473,6481,6489],{"type":24,"tag":48,"props":6458,"children":6459},{},[6460,6464],{"type":24,"tag":52,"props":6461,"children":6462},{},[6463],{"type":30,"value":1306},{"type":30,"value":1308},{"type":24,"tag":48,"props":6466,"children":6467},{},[6468,6472],{"type":24,"tag":52,"props":6469,"children":6470},{},[6471],{"type":30,"value":1316},{"type":30,"value":1318},{"type":24,"tag":48,"props":6474,"children":6475},{},[6476,6480],{"type":24,"tag":52,"props":6477,"children":6478},{},[6479],{"type":30,"value":1326},{"type":30,"value":1328},{"type":24,"tag":48,"props":6482,"children":6483},{},[6484,6488],{"type":24,"tag":52,"props":6485,"children":6486},{},[6487],{"type":30,"value":1336},{"type":30,"value":1338},{"type":24,"tag":48,"props":6490,"children":6491},{},[6492,6496],{"type":24,"tag":52,"props":6493,"children":6494},{},[6495],{"type":30,"value":1346},{"type":30,"value":1348},{"type":24,"tag":33,"props":6498,"children":6499},{},[6500,6504],{"type":24,"tag":52,"props":6501,"children":6502},{},[6503],{"type":30,"value":1356},{"type":30,"value":407},{"type":24,"tag":44,"props":6506,"children":6507},{},[6508,6516,6524,6532],{"type":24,"tag":48,"props":6509,"children":6510},{},[6511,6515],{"type":24,"tag":52,"props":6512,"children":6513},{},[6514],{"type":30,"value":1368},{"type":30,"value":1370},{"type":24,"tag":48,"props":6517,"children":6518},{},[6519,6523],{"type":24,"tag":52,"props":6520,"children":6521},{},[6522],{"type":30,"value":1378},{"type":30,"value":1380},{"type":24,"tag":48,"props":6525,"children":6526},{},[6527,6531],{"type":24,"tag":52,"props":6528,"children":6529},{},[6530],{"type":30,"value":1388},{"type":30,"value":1390},{"type":24,"tag":48,"props":6533,"children":6534},{},[6535,6539],{"type":24,"tag":52,"props":6536,"children":6537},{},[6538],{"type":30,"value":1398},{"type":30,"value":1400},{"type":24,"tag":155,"props":6541,"children":6542},{"id":1403},[6543],{"type":30,"value":1406},{"type":24,"tag":33,"props":6545,"children":6546},{},[6547],{"type":30,"value":1411},{"type":24,"tag":33,"props":6549,"children":6550},{},[6551,6555],{"type":24,"tag":52,"props":6552,"children":6553},{},[6554],{"type":30,"value":1419},{"type":30,"value":407},{"type":24,"tag":44,"props":6557,"children":6558},{},[6559,6567,6575,6583],{"type":24,"tag":48,"props":6560,"children":6561},{},[6562,6566],{"type":24,"tag":52,"props":6563,"children":6564},{},[6565],{"type":30,"value":1431},{"type":30,"value":1433},{"type":24,"tag":48,"props":6568,"children":6569},{},[6570,6574],{"type":24,"tag":52,"props":6571,"children":6572},{},[6573],{"type":30,"value":1441},{"type":30,"value":1443},{"type":24,"tag":48,"props":6576,"children":6577},{},[6578,6582],{"type":24,"tag":52,"props":6579,"children":6580},{},[6581],{"type":30,"value":1451},{"type":30,"value":1453},{"type":24,"tag":48,"props":6584,"children":6585},{},[6586,6590],{"type":24,"tag":52,"props":6587,"children":6588},{},[6589],{"type":30,"value":1461},{"type":30,"value":1463},{"type":24,"tag":33,"props":6592,"children":6593},{},[6594,6598],{"type":24,"tag":52,"props":6595,"children":6596},{},[6597],{"type":30,"value":1471},{"type":30,"value":1473},{"type":24,"tag":318,"props":6600,"children":6602},{"code":1476,"language":1477,"meta":7,"className":6601},[1479],[6603],{"type":24,"tag":323,"props":6604,"children":6605},{"__ignoreMap":7},[6606],{"type":30,"value":1476},{"type":24,"tag":155,"props":6608,"children":6609},{"id":1487},[6610],{"type":30,"value":1490},{"type":24,"tag":33,"props":6612,"children":6613},{},[6614],{"type":30,"value":1495},{"type":24,"tag":33,"props":6616,"children":6617},{},[6618,6622],{"type":24,"tag":52,"props":6619,"children":6620},{},[6621],{"type":30,"value":1503},{"type":30,"value":407},{"type":24,"tag":44,"props":6624,"children":6625},{},[6626,6634,6642,6650,6658],{"type":24,"tag":48,"props":6627,"children":6628},{},[6629,6633],{"type":24,"tag":52,"props":6630,"children":6631},{},[6632],{"type":30,"value":1515},{"type":30,"value":1517},{"type":24,"tag":48,"props":6635,"children":6636},{},[6637,6641],{"type":24,"tag":52,"props":6638,"children":6639},{},[6640],{"type":30,"value":1525},{"type":30,"value":1527},{"type":24,"tag":48,"props":6643,"children":6644},{},[6645,6649],{"type":24,"tag":52,"props":6646,"children":6647},{},[6648],{"type":30,"value":1535},{"type":30,"value":1537},{"type":24,"tag":48,"props":6651,"children":6652},{},[6653,6657],{"type":24,"tag":52,"props":6654,"children":6655},{},[6656],{"type":30,"value":1545},{"type":30,"value":1547},{"type":24,"tag":48,"props":6659,"children":6660},{},[6661,6665],{"type":24,"tag":52,"props":6662,"children":6663},{},[6664],{"type":30,"value":1555},{"type":30,"value":1557},{"type":24,"tag":33,"props":6667,"children":6668},{},[6669,6673],{"type":24,"tag":52,"props":6670,"children":6671},{},[6672],{"type":30,"value":1565},{"type":30,"value":407},{"type":24,"tag":44,"props":6675,"children":6676},{},[6677,6685,6693,6701],{"type":24,"tag":48,"props":6678,"children":6679},{},[6680,6684],{"type":24,"tag":52,"props":6681,"children":6682},{},[6683],{"type":30,"value":1577},{"type":30,"value":1579},{"type":24,"tag":48,"props":6686,"children":6687},{},[6688,6692],{"type":24,"tag":52,"props":6689,"children":6690},{},[6691],{"type":30,"value":1587},{"type":30,"value":1589},{"type":24,"tag":48,"props":6694,"children":6695},{},[6696,6700],{"type":24,"tag":52,"props":6697,"children":6698},{},[6699],{"type":30,"value":1597},{"type":30,"value":1599},{"type":24,"tag":48,"props":6702,"children":6703},{},[6704,6708],{"type":24,"tag":52,"props":6705,"children":6706},{},[6707],{"type":30,"value":1607},{"type":30,"value":1609},{"type":24,"tag":25,"props":6710,"children":6711},{"id":1612},[6712],{"type":30,"value":1612},{"type":24,"tag":155,"props":6714,"children":6715},{"id":1617},[6716],{"type":30,"value":1620},{"type":24,"tag":33,"props":6718,"children":6719},{},[6720],{"type":30,"value":1625},{"type":24,"tag":33,"props":6722,"children":6723},{},[6724,6728],{"type":24,"tag":52,"props":6725,"children":6726},{},[6727],{"type":30,"value":459},{"type":30,"value":407},{"type":24,"tag":44,"props":6730,"children":6731},{},[6732,6740,6748,6756,6764,6772],{"type":24,"tag":48,"props":6733,"children":6734},{},[6735,6739],{"type":24,"tag":52,"props":6736,"children":6737},{},[6738],{"type":30,"value":1644},{"type":30,"value":1646},{"type":24,"tag":48,"props":6741,"children":6742},{},[6743,6747],{"type":24,"tag":52,"props":6744,"children":6745},{},[6746],{"type":30,"value":1654},{"type":30,"value":1656},{"type":24,"tag":48,"props":6749,"children":6750},{},[6751,6755],{"type":24,"tag":52,"props":6752,"children":6753},{},[6754],{"type":30,"value":1664},{"type":30,"value":1666},{"type":24,"tag":48,"props":6757,"children":6758},{},[6759,6763],{"type":24,"tag":52,"props":6760,"children":6761},{},[6762],{"type":30,"value":1674},{"type":30,"value":1676},{"type":24,"tag":48,"props":6765,"children":6766},{},[6767,6771],{"type":24,"tag":52,"props":6768,"children":6769},{},[6770],{"type":30,"value":1684},{"type":30,"value":1686},{"type":24,"tag":48,"props":6773,"children":6774},{},[6775,6779],{"type":24,"tag":52,"props":6776,"children":6777},{},[6778],{"type":30,"value":1694},{"type":30,"value":1696},{"type":24,"tag":33,"props":6781,"children":6782},{},[6783,6787],{"type":24,"tag":52,"props":6784,"children":6785},{},[6786],{"type":30,"value":134},{"type":30,"value":1705},{"type":24,"tag":33,"props":6789,"children":6790},{},[6791,6795],{"type":24,"tag":52,"props":6792,"children":6793},{},[6794],{"type":30,"value":943},{"type":30,"value":407},{"type":24,"tag":44,"props":6797,"children":6798},{},[6799,6803,6807],{"type":24,"tag":48,"props":6800,"children":6801},{},[6802],{"type":30,"value":1721},{"type":24,"tag":48,"props":6804,"children":6805},{},[6806],{"type":30,"value":1726},{"type":24,"tag":48,"props":6808,"children":6809},{},[6810],{"type":30,"value":1731},{"type":24,"tag":155,"props":6812,"children":6813},{"id":1734},[6814],{"type":30,"value":1737},{"type":24,"tag":33,"props":6816,"children":6817},{},[6818],{"type":30,"value":1742},{"type":24,"tag":318,"props":6820,"children":6821},{"code":1745},[6822],{"type":24,"tag":323,"props":6823,"children":6824},{"__ignoreMap":7},[6825],{"type":30,"value":1745},{"type":24,"tag":155,"props":6827,"children":6828},{"id":1753},[6829],{"type":30,"value":1756},{"type":24,"tag":33,"props":6831,"children":6832},{},[6833],{"type":30,"value":1761},{"type":24,"tag":33,"props":6835,"children":6836},{},[6837,6841],{"type":24,"tag":52,"props":6838,"children":6839},{},[6840],{"type":30,"value":459},{"type":30,"value":407},{"type":24,"tag":318,"props":6843,"children":6844},{"code":1772},[6845],{"type":24,"tag":323,"props":6846,"children":6847},{"__ignoreMap":7},[6848],{"type":30,"value":1772},{"type":24,"tag":25,"props":6850,"children":6851},{"id":1780},[6852],{"type":30,"value":1783},{"type":24,"tag":155,"props":6854,"children":6855},{"id":1786},[6856],{"type":30,"value":1789},{"type":24,"tag":33,"props":6858,"children":6859},{},[6860,6864],{"type":24,"tag":52,"props":6861,"children":6862},{},[6863],{"type":30,"value":1797},{"type":30,"value":407},{"type":24,"tag":44,"props":6866,"children":6867},{},[6868,6876,6884,6892,6900],{"type":24,"tag":48,"props":6869,"children":6870},{},[6871,6875],{"type":24,"tag":52,"props":6872,"children":6873},{},[6874],{"type":30,"value":1809},{"type":30,"value":1811},{"type":24,"tag":48,"props":6877,"children":6878},{},[6879,6883],{"type":24,"tag":52,"props":6880,"children":6881},{},[6882],{"type":30,"value":355},{"type":30,"value":1820},{"type":24,"tag":48,"props":6885,"children":6886},{},[6887,6891],{"type":24,"tag":52,"props":6888,"children":6889},{},[6890],{"type":30,"value":1228},{"type":30,"value":1829},{"type":24,"tag":48,"props":6893,"children":6894},{},[6895,6899],{"type":24,"tag":52,"props":6896,"children":6897},{},[6898],{"type":30,"value":1837},{"type":30,"value":1839},{"type":24,"tag":48,"props":6901,"children":6902},{},[6903,6907],{"type":24,"tag":52,"props":6904,"children":6905},{},[6906],{"type":30,"value":1847},{"type":30,"value":1849},{"type":24,"tag":155,"props":6909,"children":6910},{"id":1852},[6911],{"type":30,"value":1855},{"type":24,"tag":33,"props":6913,"children":6914},{},[6915,6919],{"type":24,"tag":52,"props":6916,"children":6917},{},[6918],{"type":30,"value":1797},{"type":30,"value":407},{"type":24,"tag":632,"props":6921,"children":6922},{},[6923,6931,6939,6947,6955],{"type":24,"tag":48,"props":6924,"children":6925},{},[6926,6930],{"type":24,"tag":52,"props":6927,"children":6928},{},[6929],{"type":30,"value":1874},{"type":30,"value":1876},{"type":24,"tag":48,"props":6932,"children":6933},{},[6934,6938],{"type":24,"tag":52,"props":6935,"children":6936},{},[6937],{"type":30,"value":1884},{"type":30,"value":1886},{"type":24,"tag":48,"props":6940,"children":6941},{},[6942,6946],{"type":24,"tag":52,"props":6943,"children":6944},{},[6945],{"type":30,"value":1894},{"type":30,"value":1896},{"type":24,"tag":48,"props":6948,"children":6949},{},[6950,6954],{"type":24,"tag":52,"props":6951,"children":6952},{},[6953],{"type":30,"value":1904},{"type":30,"value":1906},{"type":24,"tag":48,"props":6956,"children":6957},{},[6958,6962],{"type":24,"tag":52,"props":6959,"children":6960},{},[6961],{"type":30,"value":1914},{"type":30,"value":1916},{"type":24,"tag":33,"props":6964,"children":6965},{},[6966,6970],{"type":24,"tag":52,"props":6967,"children":6968},{},[6969],{"type":30,"value":1924},{"type":30,"value":1926},{"type":24,"tag":155,"props":6972,"children":6973},{"id":1929},[6974],{"type":30,"value":1932},{"type":24,"tag":33,"props":6976,"children":6977},{},[6978,6982],{"type":24,"tag":52,"props":6979,"children":6980},{},[6981],{"type":30,"value":1797},{"type":30,"value":407},{"type":24,"tag":44,"props":6984,"children":6985},{},[6986,6994,7002,7010,7018],{"type":24,"tag":48,"props":6987,"children":6988},{},[6989,6993],{"type":24,"tag":52,"props":6990,"children":6991},{},[6992],{"type":30,"value":1951},{"type":30,"value":1953},{"type":24,"tag":48,"props":6995,"children":6996},{},[6997,7001],{"type":24,"tag":52,"props":6998,"children":6999},{},[7000],{"type":30,"value":1961},{"type":30,"value":1963},{"type":24,"tag":48,"props":7003,"children":7004},{},[7005,7009],{"type":24,"tag":52,"props":7006,"children":7007},{},[7008],{"type":30,"value":1971},{"type":30,"value":1973},{"type":24,"tag":48,"props":7011,"children":7012},{},[7013,7017],{"type":24,"tag":52,"props":7014,"children":7015},{},[7016],{"type":30,"value":1981},{"type":30,"value":1983},{"type":24,"tag":48,"props":7019,"children":7020},{},[7021,7025],{"type":24,"tag":52,"props":7022,"children":7023},{},[7024],{"type":30,"value":1991},{"type":30,"value":1993},{"type":24,"tag":155,"props":7027,"children":7028},{"id":1996},[7029],{"type":30,"value":1999},{"type":24,"tag":33,"props":7031,"children":7032},{},[7033,7037],{"type":24,"tag":52,"props":7034,"children":7035},{},[7036],{"type":30,"value":1797},{"type":30,"value":407},{"type":24,"tag":44,"props":7039,"children":7040},{},[7041,7049,7057,7065,7073],{"type":24,"tag":48,"props":7042,"children":7043},{},[7044,7048],{"type":24,"tag":52,"props":7045,"children":7046},{},[7047],{"type":30,"value":2018},{"type":30,"value":2020},{"type":24,"tag":48,"props":7050,"children":7051},{},[7052,7056],{"type":24,"tag":52,"props":7053,"children":7054},{},[7055],{"type":30,"value":2028},{"type":30,"value":2030},{"type":24,"tag":48,"props":7058,"children":7059},{},[7060,7064],{"type":24,"tag":52,"props":7061,"children":7062},{},[7063],{"type":30,"value":2038},{"type":30,"value":2040},{"type":24,"tag":48,"props":7066,"children":7067},{},[7068,7072],{"type":24,"tag":52,"props":7069,"children":7070},{},[7071],{"type":30,"value":2048},{"type":30,"value":2050},{"type":24,"tag":48,"props":7074,"children":7075},{},[7076,7080],{"type":24,"tag":52,"props":7077,"children":7078},{},[7079],{"type":30,"value":2058},{"type":30,"value":2060},{"type":24,"tag":155,"props":7082,"children":7083},{"id":2063},[7084],{"type":30,"value":2066},{"type":24,"tag":33,"props":7086,"children":7087},{},[7088,7092],{"type":24,"tag":52,"props":7089,"children":7090},{},[7091],{"type":30,"value":1797},{"type":30,"value":407},{"type":24,"tag":44,"props":7094,"children":7095},{},[7096,7104,7112,7120,7128],{"type":24,"tag":48,"props":7097,"children":7098},{},[7099,7103],{"type":24,"tag":52,"props":7100,"children":7101},{},[7102],{"type":30,"value":2085},{"type":30,"value":2087},{"type":24,"tag":48,"props":7105,"children":7106},{},[7107,7111],{"type":24,"tag":52,"props":7108,"children":7109},{},[7110],{"type":30,"value":2095},{"type":30,"value":2097},{"type":24,"tag":48,"props":7113,"children":7114},{},[7115,7119],{"type":24,"tag":52,"props":7116,"children":7117},{},[7118],{"type":30,"value":2105},{"type":30,"value":2107},{"type":24,"tag":48,"props":7121,"children":7122},{},[7123,7127],{"type":24,"tag":52,"props":7124,"children":7125},{},[7126],{"type":30,"value":2115},{"type":30,"value":2117},{"type":24,"tag":48,"props":7129,"children":7130},{},[7131,7135],{"type":24,"tag":52,"props":7132,"children":7133},{},[7134],{"type":30,"value":2125},{"type":30,"value":2127},{"type":24,"tag":155,"props":7137,"children":7138},{"id":2130},[7139],{"type":30,"value":2133},{"type":24,"tag":33,"props":7141,"children":7142},{},[7143,7147],{"type":24,"tag":52,"props":7144,"children":7145},{},[7146],{"type":30,"value":1797},{"type":30,"value":407},{"type":24,"tag":44,"props":7149,"children":7150},{},[7151,7159,7167,7175,7183],{"type":24,"tag":48,"props":7152,"children":7153},{},[7154,7158],{"type":24,"tag":52,"props":7155,"children":7156},{},[7157],{"type":30,"value":2152},{"type":30,"value":2154},{"type":24,"tag":48,"props":7160,"children":7161},{},[7162,7166],{"type":24,"tag":52,"props":7163,"children":7164},{},[7165],{"type":30,"value":2162},{"type":30,"value":2164},{"type":24,"tag":48,"props":7168,"children":7169},{},[7170,7174],{"type":24,"tag":52,"props":7171,"children":7172},{},[7173],{"type":30,"value":2172},{"type":30,"value":2174},{"type":24,"tag":48,"props":7176,"children":7177},{},[7178,7182],{"type":24,"tag":52,"props":7179,"children":7180},{},[7181],{"type":30,"value":2182},{"type":30,"value":2184},{"type":24,"tag":48,"props":7184,"children":7185},{},[7186,7190],{"type":24,"tag":52,"props":7187,"children":7188},{},[7189],{"type":30,"value":2192},{"type":30,"value":2194},{"type":24,"tag":155,"props":7192,"children":7193},{"id":2197},[7194],{"type":30,"value":2200},{"type":24,"tag":33,"props":7196,"children":7197},{},[7198,7202],{"type":24,"tag":52,"props":7199,"children":7200},{},[7201],{"type":30,"value":1797},{"type":30,"value":407},{"type":24,"tag":44,"props":7204,"children":7205},{},[7206,7214,7222,7230,7238,7246],{"type":24,"tag":48,"props":7207,"children":7208},{},[7209,7213],{"type":24,"tag":52,"props":7210,"children":7211},{},[7212],{"type":30,"value":2219},{"type":30,"value":2221},{"type":24,"tag":48,"props":7215,"children":7216},{},[7217,7221],{"type":24,"tag":52,"props":7218,"children":7219},{},[7220],{"type":30,"value":2229},{"type":30,"value":2231},{"type":24,"tag":48,"props":7223,"children":7224},{},[7225,7229],{"type":24,"tag":52,"props":7226,"children":7227},{},[7228],{"type":30,"value":2239},{"type":30,"value":2241},{"type":24,"tag":48,"props":7231,"children":7232},{},[7233,7237],{"type":24,"tag":52,"props":7234,"children":7235},{},[7236],{"type":30,"value":2249},{"type":30,"value":2251},{"type":24,"tag":48,"props":7239,"children":7240},{},[7241,7245],{"type":24,"tag":52,"props":7242,"children":7243},{},[7244],{"type":30,"value":2259},{"type":30,"value":2261},{"type":24,"tag":48,"props":7247,"children":7248},{},[7249,7253],{"type":24,"tag":52,"props":7250,"children":7251},{},[7252],{"type":30,"value":2269},{"type":30,"value":2271},{"type":24,"tag":155,"props":7255,"children":7256},{"id":2274},[7257],{"type":30,"value":2277},{"type":24,"tag":33,"props":7259,"children":7260},{},[7261,7265,7266,7270],{"type":24,"tag":52,"props":7262,"children":7263},{},[7264],{"type":30,"value":1797},{"type":30,"value":2286},{"type":24,"tag":52,"props":7267,"children":7268},{},[7269],{"type":30,"value":2291},{"type":30,"value":407},{"type":24,"tag":44,"props":7272,"children":7273},{},[7274,7282,7290,7298],{"type":24,"tag":48,"props":7275,"children":7276},{},[7277,7281],{"type":24,"tag":52,"props":7278,"children":7279},{},[7280],{"type":30,"value":2303},{"type":30,"value":2305},{"type":24,"tag":48,"props":7283,"children":7284},{},[7285,7289],{"type":24,"tag":52,"props":7286,"children":7287},{},[7288],{"type":30,"value":2313},{"type":30,"value":2315},{"type":24,"tag":48,"props":7291,"children":7292},{},[7293,7297],{"type":24,"tag":52,"props":7294,"children":7295},{},[7296],{"type":30,"value":2323},{"type":30,"value":2325},{"type":24,"tag":48,"props":7299,"children":7300},{},[7301,7305],{"type":24,"tag":52,"props":7302,"children":7303},{},[7304],{"type":30,"value":2333},{"type":30,"value":2335},{"type":24,"tag":33,"props":7307,"children":7308},{},[7309,7313],{"type":24,"tag":52,"props":7310,"children":7311},{},[7312],{"type":30,"value":2343},{"type":30,"value":407},{"type":24,"tag":44,"props":7315,"children":7316},{},[7317,7325,7333,7341],{"type":24,"tag":48,"props":7318,"children":7319},{},[7320,7324],{"type":24,"tag":52,"props":7321,"children":7322},{},[7323],{"type":30,"value":2355},{"type":30,"value":2357},{"type":24,"tag":48,"props":7326,"children":7327},{},[7328,7332],{"type":24,"tag":52,"props":7329,"children":7330},{},[7331],{"type":30,"value":2365},{"type":30,"value":2367},{"type":24,"tag":48,"props":7334,"children":7335},{},[7336,7340],{"type":24,"tag":52,"props":7337,"children":7338},{},[7339],{"type":30,"value":2375},{"type":30,"value":2377},{"type":24,"tag":48,"props":7342,"children":7343},{},[7344,7348],{"type":24,"tag":52,"props":7345,"children":7346},{},[7347],{"type":30,"value":2385},{"type":30,"value":2387},{"type":24,"tag":33,"props":7350,"children":7351},{},[7352,7356],{"type":24,"tag":52,"props":7353,"children":7354},{},[7355],{"type":30,"value":2395},{"type":30,"value":407},{"type":24,"tag":44,"props":7358,"children":7359},{},[7360,7368,7376,7384],{"type":24,"tag":48,"props":7361,"children":7362},{},[7363,7367],{"type":24,"tag":52,"props":7364,"children":7365},{},[7366],{"type":30,"value":2407},{"type":30,"value":2409},{"type":24,"tag":48,"props":7369,"children":7370},{},[7371,7375],{"type":24,"tag":52,"props":7372,"children":7373},{},[7374],{"type":30,"value":2417},{"type":30,"value":2419},{"type":24,"tag":48,"props":7377,"children":7378},{},[7379,7383],{"type":24,"tag":52,"props":7380,"children":7381},{},[7382],{"type":30,"value":2427},{"type":30,"value":2429},{"type":24,"tag":48,"props":7385,"children":7386},{},[7387,7391],{"type":24,"tag":52,"props":7388,"children":7389},{},[7390],{"type":30,"value":2437},{"type":30,"value":2439},{"type":24,"tag":25,"props":7393,"children":7394},{"id":2442},[7395],{"type":30,"value":2442},{"type":24,"tag":44,"props":7397,"children":7398},{},[7399,7407,7415,7423],{"type":24,"tag":48,"props":7400,"children":7401},{},[7402],{"type":24,"tag":2452,"props":7403,"children":7405},{"href":2454,"rel":7404},[2456],[7406],{"type":30,"value":2459},{"type":24,"tag":48,"props":7408,"children":7409},{},[7410],{"type":24,"tag":2452,"props":7411,"children":7413},{"href":2465,"rel":7412},[2456],[7414],{"type":30,"value":2469},{"type":24,"tag":48,"props":7416,"children":7417},{},[7418],{"type":24,"tag":2452,"props":7419,"children":7421},{"href":2475,"rel":7420},[2456],[7422],{"type":30,"value":2479},{"type":24,"tag":48,"props":7424,"children":7425},{},[7426],{"type":24,"tag":2452,"props":7427,"children":7429},{"href":2485,"rel":7428},[2456],[7430],{"type":30,"value":2489},{"type":24,"tag":25,"props":7432,"children":7433},{"id":2492},[7434],{"type":30,"value":2495},{"type":24,"tag":33,"props":7436,"children":7437},{},[7438],{"type":30,"value":2500},{"type":24,"tag":44,"props":7440,"children":7442},{"className":7441},[978],[7443,7451,7459,7467,7475,7483,7491,7499,7507,7515],{"type":24,"tag":48,"props":7444,"children":7446},{"className":7445},[983],[7447,7450],{"type":24,"tag":986,"props":7448,"children":7449},{"disabled":988,"type":989},[],{"type":30,"value":2513},{"type":24,"tag":48,"props":7452,"children":7454},{"className":7453},[983],[7455,7458],{"type":24,"tag":986,"props":7456,"children":7457},{"disabled":988,"type":989},[],{"type":30,"value":2522},{"type":24,"tag":48,"props":7460,"children":7462},{"className":7461},[983],[7463,7466],{"type":24,"tag":986,"props":7464,"children":7465},{"disabled":988,"type":989},[],{"type":30,"value":2531},{"type":24,"tag":48,"props":7468,"children":7470},{"className":7469},[983],[7471,7474],{"type":24,"tag":986,"props":7472,"children":7473},{"disabled":988,"type":989},[],{"type":30,"value":2540},{"type":24,"tag":48,"props":7476,"children":7478},{"className":7477},[983],[7479,7482],{"type":24,"tag":986,"props":7480,"children":7481},{"disabled":988,"type":989},[],{"type":30,"value":2549},{"type":24,"tag":48,"props":7484,"children":7486},{"className":7485},[983],[7487,7490],{"type":24,"tag":986,"props":7488,"children":7489},{"disabled":988,"type":989},[],{"type":30,"value":2558},{"type":24,"tag":48,"props":7492,"children":7494},{"className":7493},[983],[7495,7498],{"type":24,"tag":986,"props":7496,"children":7497},{"disabled":988,"type":989},[],{"type":30,"value":2567},{"type":24,"tag":48,"props":7500,"children":7502},{"className":7501},[983],[7503,7506],{"type":24,"tag":986,"props":7504,"children":7505},{"disabled":988,"type":989},[],{"type":30,"value":2576},{"type":24,"tag":48,"props":7508,"children":7510},{"className":7509},[983],[7511,7514],{"type":24,"tag":986,"props":7512,"children":7513},{"disabled":988,"type":989},[],{"type":30,"value":2585},{"type":24,"tag":48,"props":7516,"children":7518},{"className":7517},[983],[7519,7522],{"type":24,"tag":986,"props":7520,"children":7521},{"disabled":988,"type":989},[],{"type":30,"value":2594},{"type":24,"tag":2596,"props":7524,"children":7525},{},[],{"type":24,"tag":33,"props":7527,"children":7528},{},[7529,7533,7534,7538],{"type":24,"tag":52,"props":7530,"children":7531},{},[7532],{"type":30,"value":2606},{"type":30,"value":2608},{"type":24,"tag":2452,"props":7535,"children":7536},{"href":2611},[7537],{"type":30,"value":2614},{"type":30,"value":2616},{"title":7,"searchDepth":2618,"depth":2618,"links":7540},[7541,7542,7547,7562,7567,7572,7577,7587,7588],{"id":27,"depth":2621,"text":31},{"id":151,"depth":2621,"text":31,"children":7543},[7544,7545,7546],{"id":157,"depth":2618,"text":160},{"id":201,"depth":2618,"text":204},{"id":249,"depth":2618,"text":252},{"id":303,"depth":2621,"text":303,"children":7548},[7549,7550,7555,7559,7560,7561],{"id":308,"depth":2618,"text":311},{"id":329,"depth":2618,"text":332,"children":7551},[7552,7553,7554],{"id":336,"depth":2633,"text":339},{"id":418,"depth":2633,"text":421},{"id":571,"depth":2633,"text":574},{"id":593,"depth":2618,"text":596,"children":7556},[7557,7558],{"id":599,"depth":2633,"text":602},{"id":688,"depth":2633,"text":691},{"id":751,"depth":2618,"text":754},{"id":823,"depth":2618,"text":826},{"id":895,"depth":2618,"text":898},{"id":1022,"depth":2621,"text":1022,"children":7563},[7564,7565,7566],{"id":1027,"depth":2618,"text":1030},{"id":1064,"depth":2618,"text":1067},{"id":1138,"depth":2618,"text":1141},{"id":1273,"depth":2621,"text":1273,"children":7568},[7569,7570,7571],{"id":1278,"depth":2618,"text":1281},{"id":1403,"depth":2618,"text":1406},{"id":1487,"depth":2618,"text":1490},{"id":1612,"depth":2621,"text":1612,"children":7573},[7574,7575,7576],{"id":1617,"depth":2618,"text":1620},{"id":1734,"depth":2618,"text":1737},{"id":1753,"depth":2618,"text":1756},{"id":1780,"depth":2621,"text":1783,"children":7578},[7579,7580,7581,7582,7583,7584,7585,7586],{"id":1786,"depth":2618,"text":1789},{"id":1852,"depth":2618,"text":1855},{"id":1929,"depth":2618,"text":1932},{"id":1996,"depth":2618,"text":1999},{"id":2063,"depth":2618,"text":2066},{"id":2130,"depth":2618,"text":2133},{"id":2197,"depth":2618,"text":2200},{"id":2274,"depth":2618,"text":2277},{"id":2442,"depth":2621,"text":2442},{"id":2492,"depth":2621,"text":2495},1782088240510]