[{"data":1,"prerenderedAt":6748},["ShallowReactive",2],{"article-/topics/ai/ai-agent-operation-audit-trail-immutability":3,"related-ai":2193,"content-query-PoerAcAodP":4948},{"_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":2187,"_id":2188,"_source":2189,"_file":2190,"_stem":2191,"_extension":2192},"/topics/ai/ai-agent-operation-audit-trail-immutability","ai",false,"","AI agent Operation Audit Trail：每次工具调用、状态变更和人工干预如何留下不可篡改的日志","审计日志不是简单的应用日志，而是责任追溯、合规审计和故障排查的关键证据。本文讲清 AI agent audit trail 的记录范围、存储架构、防篡改机制和查询接口，并提供 SOC 2、GDPR 等合规场景的落地建议，确保每次操作都可追溯、不可抵赖。","2026-06-15","HTMLPAGE 团队",[13,14,15,16,17],"audit trail","operation logging","immutable logs","tamper-proof logs","compliance logging","/images/articles/as03-featured.jpeg",15,{"type":21,"children":22,"toc":2140},"root",[23,32,38,68,73,93,99,106,111,154,159,165,170,223,228,234,239,282,287,292,297,493,498,511,517,528,546,551,557,567,577,610,619,637,646,659,668,676,682,691,699,708,716,734,742,760,766,775,783,816,824,842,850,863,868,874,883,892,901,910,928,934,943,951,960,968,981,989,1007,1013,1022,1030,1039,1047,1065,1073,1086,1091,1097,1102,1113,1118,1123,1131,1149,1157,1170,1178,1191,1199,1235,1240,1251,1256,1261,1270,1288,1297,1315,1320,1328,1346,1354,1372,1377,1385,1398,1406,1424,1430,1436,1446,1489,1495,1504,1547,1553,1562,1610,1616,1624,1690,1696,1705,1748,1754,1762,1805,1811,1820,1843,1852,1858,1867,1910,1915,1958,1963,2008,2014,2019,2118,2122],{"type":24,"tag":25,"props":26,"children":28},"element","h2",{"id":27},"为什么-ai-agent-需要不可篡改的审计日志",[29],{"type":30,"value":31},"text","为什么 AI agent 需要不可篡改的审计日志？",{"type":24,"tag":33,"props":34,"children":35},"p",{},[36],{"type":30,"value":37},"2025 年 3 月，某医疗 AI 初创公司收到 FDA 的调查通知：他们的诊断辅助 agent 在某个病例中给出了错误建议，导致患者接受了不必要的治疗。FDA 要求提供完整的操作记录，包括：",{"type":24,"tag":39,"props":40,"children":41},"ul",{},[42,48,53,58,63],{"type":24,"tag":43,"props":44,"children":45},"li",{},[46],{"type":30,"value":47},"agent 在什么时候接收了哪些输入数据？",{"type":24,"tag":43,"props":49,"children":50},{},[51],{"type":30,"value":52},"agent 调用了哪些工具（如病历查询、实验室结果检索）？",{"type":24,"tag":43,"props":54,"children":55},{},[56],{"type":30,"value":57},"agent 的推理过程是什么？做出了哪些决策？",{"type":24,"tag":43,"props":59,"children":60},{},[61],{"type":30,"value":62},"是否有医生进行了人工干预？干预的内容是什么？",{"type":24,"tag":43,"props":64,"children":65},{},[66],{"type":30,"value":67},"最终的建议是如何生成的？",{"type":24,"tag":33,"props":69,"children":70},{},[71],{"type":30,"value":72},"遗憾的是，这家公司只记录了简单的应用日志（如 \"Agent started\", \"Tool called: search_emr\", \"Response generated\"），缺少详细的上下文、时间戳和因果关系链。他们无法重建完整的事件时间线，也无法证明 agent 的行为符合医疗规范。最终，FDA 暂停了该产品的使用许可，公司损失了数百万美元的收入。",{"type":24,"tag":33,"props":74,"children":75},{},[76,78,84,86,91],{"type":30,"value":77},"这个案例揭示了一个残酷的现实：",{"type":24,"tag":79,"props":80,"children":81},"strong",{},[82],{"type":30,"value":83},"对于 AI agent 系统，简单的应用日志远远不够",{"type":30,"value":85},"。你需要的是 ",{"type":24,"tag":79,"props":87,"children":88},{},[89],{"type":30,"value":90},"Operation Audit Trail（操作审计轨迹）",{"type":30,"value":92},"——一个完整的、不可篡改的、可追溯的操作记录系统。",{"type":24,"tag":25,"props":94,"children":96},{"id":95},"为什么要-audit-trail",[97],{"type":30,"value":98},"为什么要 Audit Trail？",{"type":24,"tag":100,"props":101,"children":103},"h3",{"id":102},"_1-责任追溯accountability",[104],{"type":30,"value":105},"1. 责任追溯（Accountability）",{"type":24,"tag":33,"props":107,"children":108},{},[109],{"type":30,"value":110},"当 agent 做出错误或有害的决策时，需要能够追溯：",{"type":24,"tag":39,"props":112,"children":113},{},[114,124,134,144],{"type":24,"tag":43,"props":115,"children":116},{},[117,122],{"type":24,"tag":79,"props":118,"children":119},{},[120],{"type":30,"value":121},"谁触发了这个操作",{"type":30,"value":123},"：是哪个用户、哪个系统、哪个定时任务？",{"type":24,"tag":43,"props":125,"children":126},{},[127,132],{"type":24,"tag":79,"props":128,"children":129},{},[130],{"type":30,"value":131},"agent 使用了哪些凭证和数据",{"type":30,"value":133},"：访问了哪些数据库、调用了哪些 API？",{"type":24,"tag":43,"props":135,"children":136},{},[137,142],{"type":24,"tag":79,"props":138,"children":139},{},[140],{"type":30,"value":141},"agent 的决策依据是什么",{"type":30,"value":143},"：基于哪些输入、哪些工具调用结果、哪些历史上下文？",{"type":24,"tag":43,"props":145,"children":146},{},[147,152],{"type":24,"tag":79,"props":148,"children":149},{},[150],{"type":30,"value":151},"是否有人工干预",{"type":30,"value":153},"：是否有 operator 修改了 agent 的输出或覆盖了决策？",{"type":24,"tag":33,"props":155,"children":156},{},[157],{"type":30,"value":158},"没有完整的审计轨迹，就无法确定责任归属，也无法改进系统设计。",{"type":24,"tag":100,"props":160,"children":162},{"id":161},"_2-合规审计compliance",[163],{"type":30,"value":164},"2. 合规审计（Compliance）",{"type":24,"tag":33,"props":166,"children":167},{},[168],{"type":30,"value":169},"许多行业标准要求保留完整的操作日志：",{"type":24,"tag":39,"props":171,"children":172},{},[173,183,193,203,213],{"type":24,"tag":43,"props":174,"children":175},{},[176,181],{"type":24,"tag":79,"props":177,"children":178},{},[179],{"type":30,"value":180},"SOC 2",{"type":30,"value":182},"：要求记录所有对敏感数据的访问和操作，保留至少 1 年。",{"type":24,"tag":43,"props":184,"children":185},{},[186,191],{"type":24,"tag":79,"props":187,"children":188},{},[189],{"type":30,"value":190},"GDPR",{"type":30,"value":192},"：要求记录个人数据的处理活动，包括谁访问了数据、何时访问、为何访问。",{"type":24,"tag":43,"props":194,"children":195},{},[196,201],{"type":24,"tag":79,"props":197,"children":198},{},[199],{"type":30,"value":200},"HIPAA",{"type":30,"value":202},"（医疗行业）：要求记录所有对患者健康信息（PHI）的访问，保留至少 6 年。",{"type":24,"tag":43,"props":204,"children":205},{},[206,211],{"type":24,"tag":79,"props":207,"children":208},{},[209],{"type":30,"value":210},"PCI DSS",{"type":30,"value":212},"（支付行业）：要求记录所有对持卡人数据的访问，保留至少 1 年。",{"type":24,"tag":43,"props":214,"children":215},{},[216,221],{"type":24,"tag":79,"props":217,"children":218},{},[219],{"type":30,"value":220},"ISO 27001",{"type":30,"value":222},"：要求记录安全事件和异常操作，支持 incident response。",{"type":24,"tag":33,"props":224,"children":225},{},[226],{"type":30,"value":227},"如果无法提供完整的审计日志，可能面临罚款、诉讼甚至业务停摆。",{"type":24,"tag":100,"props":229,"children":231},{"id":230},"_3-故障排查troubleshooting",[232],{"type":30,"value":233},"3. 故障排查（Troubleshooting）",{"type":24,"tag":33,"props":235,"children":236},{},[237],{"type":30,"value":238},"当 agent 行为异常时，审计日志可以帮助快速定位问题：",{"type":24,"tag":39,"props":240,"children":241},{},[242,252,262,272],{"type":24,"tag":43,"props":243,"children":244},{},[245,250],{"type":24,"tag":79,"props":246,"children":247},{},[248],{"type":30,"value":249},"性能问题",{"type":30,"value":251},"：哪个工具调用耗时最长？哪个环节出现了瓶颈？",{"type":24,"tag":43,"props":253,"children":254},{},[255,260],{"type":24,"tag":79,"props":256,"children":257},{},[258],{"type":30,"value":259},"逻辑错误",{"type":30,"value":261},"：agent 为什么做出了错误的决策？是基于错误的输入还是错误的推理？",{"type":24,"tag":43,"props":263,"children":264},{},[265,270],{"type":24,"tag":79,"props":266,"children":267},{},[268],{"type":30,"value":269},"权限问题",{"type":30,"value":271},"：agent 是否尝试访问了未授权的资源？",{"type":24,"tag":43,"props":273,"children":274},{},[275,280],{"type":24,"tag":79,"props":276,"children":277},{},[278],{"type":30,"value":279},"依赖故障",{"type":30,"value":281},"：哪个外部服务出现了故障？影响了哪些 agent 操作？",{"type":24,"tag":33,"props":283,"children":284},{},[285],{"type":30,"value":286},"没有详细的审计日志，故障排查就像大海捞针。",{"type":24,"tag":25,"props":288,"children":290},{"id":289},"记录范围定义",[291],{"type":30,"value":289},{"type":24,"tag":100,"props":293,"children":295},{"id":294},"必须记录的操作类型",[296],{"type":30,"value":294},{"type":24,"tag":298,"props":299,"children":300},"table",{},[301,325],{"type":24,"tag":302,"props":303,"children":304},"thead",{},[305],{"type":24,"tag":306,"props":307,"children":308},"tr",{},[309,315,320],{"type":24,"tag":310,"props":311,"children":312},"th",{},[313],{"type":30,"value":314},"操作类型",{"type":24,"tag":310,"props":316,"children":317},{},[318],{"type":30,"value":319},"示例",{"type":24,"tag":310,"props":321,"children":322},{},[323],{"type":30,"value":324},"重要性",{"type":24,"tag":326,"props":327,"children":328},"tbody",{},[329,351,371,391,412,432,452,473],{"type":24,"tag":306,"props":330,"children":331},{},[332,341,346],{"type":24,"tag":333,"props":334,"children":335},"td",{},[336],{"type":24,"tag":79,"props":337,"children":338},{},[339],{"type":30,"value":340},"工具调用",{"type":24,"tag":333,"props":342,"children":343},{},[344],{"type":30,"value":345},"调用 OpenAI API、查询数据库、发送 Slack 消息",{"type":24,"tag":333,"props":347,"children":348},{},[349],{"type":30,"value":350},"🔴 极高",{"type":24,"tag":306,"props":352,"children":353},{},[354,362,367],{"type":24,"tag":333,"props":355,"children":356},{},[357],{"type":24,"tag":79,"props":358,"children":359},{},[360],{"type":30,"value":361},"状态变更",{"type":24,"tag":333,"props":363,"children":364},{},[365],{"type":30,"value":366},"Agent 从 \"idle\" 变为 \"running\"、任务从 \"pending\" 变为 \"completed\"",{"type":24,"tag":333,"props":368,"children":369},{},[370],{"type":30,"value":350},{"type":24,"tag":306,"props":372,"children":373},{},[374,382,387],{"type":24,"tag":333,"props":375,"children":376},{},[377],{"type":24,"tag":79,"props":378,"children":379},{},[380],{"type":30,"value":381},"人工干预",{"type":24,"tag":333,"props":383,"children":384},{},[385],{"type":30,"value":386},"Operator 修改了 agent 的输出、批准/拒绝了某个操作",{"type":24,"tag":333,"props":388,"children":389},{},[390],{"type":30,"value":350},{"type":24,"tag":306,"props":392,"children":393},{},[394,402,407],{"type":24,"tag":333,"props":395,"children":396},{},[397],{"type":24,"tag":79,"props":398,"children":399},{},[400],{"type":30,"value":401},"凭证访问",{"type":24,"tag":333,"props":403,"children":404},{},[405],{"type":30,"value":406},"Agent 从 Vault 获取了 API Key、数据库密码",{"type":24,"tag":333,"props":408,"children":409},{},[410],{"type":30,"value":411},"🟠 高",{"type":24,"tag":306,"props":413,"children":414},{},[415,423,428],{"type":24,"tag":333,"props":416,"children":417},{},[418],{"type":24,"tag":79,"props":419,"children":420},{},[421],{"type":30,"value":422},"数据访问",{"type":24,"tag":333,"props":424,"children":425},{},[426],{"type":30,"value":427},"Agent 读取了用户数据、写入了数据库记录",{"type":24,"tag":333,"props":429,"children":430},{},[431],{"type":30,"value":411},{"type":24,"tag":306,"props":433,"children":434},{},[435,443,448],{"type":24,"tag":333,"props":436,"children":437},{},[438],{"type":24,"tag":79,"props":439,"children":440},{},[441],{"type":30,"value":442},"配置变更",{"type":24,"tag":333,"props":444,"children":445},{},[446],{"type":30,"value":447},"修改了 agent 的参数、更新了 prompt 模板",{"type":24,"tag":333,"props":449,"children":450},{},[451],{"type":30,"value":411},{"type":24,"tag":306,"props":453,"children":454},{},[455,463,468],{"type":24,"tag":333,"props":456,"children":457},{},[458],{"type":24,"tag":79,"props":459,"children":460},{},[461],{"type":30,"value":462},"认证与授权",{"type":24,"tag":333,"props":464,"children":465},{},[466],{"type":30,"value":467},"Agent 登录、Token 刷新、权限检查失败",{"type":24,"tag":333,"props":469,"children":470},{},[471],{"type":30,"value":472},"🟡 中",{"type":24,"tag":306,"props":474,"children":475},{},[476,484,489],{"type":24,"tag":333,"props":477,"children":478},{},[479],{"type":24,"tag":79,"props":480,"children":481},{},[482],{"type":30,"value":483},"错误与异常",{"type":24,"tag":333,"props":485,"children":486},{},[487],{"type":30,"value":488},"工具调用失败、超时、权限拒绝",{"type":24,"tag":333,"props":490,"children":491},{},[492],{"type":30,"value":472},{"type":24,"tag":100,"props":494,"children":496},{"id":495},"每条审计日志应包含的字段",[497],{"type":30,"value":495},{"type":24,"tag":499,"props":500,"children":505},"pre",{"code":501,"language":502,"meta":7,"className":503},"interface AuditLogEntry {\n  // 基本信息\n  timestamp: string;        // ISO 8601 格式，精确到毫秒\n  event_id: string;         // 唯一事件 ID（UUID v4）\n  event_type: string;       // 事件类型（tool_call, state_change, human_intervention, etc.）\n  \n  // Actor 信息\n  actor_type: \"user\" | \"agent\" | \"system\" | \"scheduler\";\n  actor_id: string;         // Actor 的唯一标识\n  actor_metadata?: {        // 额外元数据\n    user_email?: string;\n    agent_name?: string;\n    agent_version?: string;\n    service_account?: string;\n  };\n  \n  // 操作详情\n  action: string;           // 具体操作（read, write, execute, approve, reject）\n  resource_type: string;    // 资源类型（database, api, file, credential）\n  resource_id: string;      // 资源的唯一标识\n  resource_path?: string;   // 资源路径（如 /users/123/profile）\n  \n  // 上下文信息\n  session_id: string;       // 会话 ID，关联同一用户的多次操作\n  request_id: string;       // 请求 ID，关联分布式系统中的多次调用\n  correlation_id?: string;  // 关联 ID，跨系统的追踪标识\n  \n  // 输入与输出\n  input?: any;              // 操作的输入参数（脱敏后）\n  output?: any;             // 操作的输出结果（脱敏后）\n  error?: {                 // 如果操作失败\n    code: string;\n    message: string;\n    stack_trace?: string;\n  };\n  \n  // 环境信息\n  environment: \"production\" | \"staging\" | \"development\";\n  region: string;           // 部署区域（如 us-east-1）\n  source_ip: string;        // 来源 IP 地址\n  user_agent?: string;      // User-Agent 字符串\n  \n  // 权限与策略\n  policy_used?: string;     // 使用的权限策略名称\n  auth_method: string;      // 认证方式（token, api_key, oauth）\n  \n  // 元数据\n  metadata?: Record\u003Cstring, any>; // 额外的自定义元数据\n  \n  // 完整性保护\n  signature: string;        // 数字签名，防止篡改\n  previous_hash: string;    // 前一条日志的哈希值（形成哈希链）\n}\n","typescript",[504],"language-typescript",[506],{"type":24,"tag":507,"props":508,"children":509},"code",{"__ignoreMap":7},[510],{"type":30,"value":501},{"type":24,"tag":100,"props":512,"children":514},{"id":513},"示例工具调用的审计日志",[515],{"type":30,"value":516},"示例：工具调用的审计日志",{"type":24,"tag":499,"props":518,"children":523},{"code":519,"language":520,"meta":7,"className":521},"{\n  \"timestamp\": \"2026-06-15T14:23:45.123Z\",\n  \"event_id\": \"evt_7f8a9b2c-3d4e-5f6g-7h8i-9j0k1l2m3n4o\",\n  \"event_type\": \"tool_call\",\n  \n  \"actor_type\": \"agent\",\n  \"actor_id\": \"agent:customer-support-bot\",\n  \"actor_metadata\": {\n    \"agent_name\": \"customer-support-bot\",\n    \"agent_version\": \"2.3.1\",\n    \"session_id\": \"sess_abc123\"\n  },\n  \n  \"action\": \"execute\",\n  \"resource_type\": \"api\",\n  \"resource_id\": \"openai:gpt-4-turbo\",\n  \"resource_path\": \"/v1/chat/completions\",\n  \n  \"session_id\": \"sess_abc123\",\n  \"request_id\": \"req_xyz789\",\n  \"correlation_id\": \"corr_def456\",\n  \n  \"input\": {\n    \"model\": \"gpt-4-turbo\",\n    \"messages\": [\n      {\"role\": \"user\", \"content\": \"[REDACTED]\"} \n    ],\n    \"temperature\": 0.7,\n    \"max_tokens\": 500\n  },\n  \n  \"output\": {\n    \"choices\": [\n      {\n        \"message\": {\n          \"role\": \"assistant\",\n          \"content\": \"[REDACTED]\"\n        }\n      }\n    ],\n    \"usage\": {\n      \"prompt_tokens\": 120,\n      \"completion_tokens\": 85,\n      \"total_tokens\": 205\n    }\n  },\n  \n  \"environment\": \"production\",\n  \"region\": \"us-east-1\",\n  \"source_ip\": \"10.0.1.42\",\n  \n  \"policy_used\": \"customer-support-policy\",\n  \"auth_method\": \"vault_token\",\n  \n  \"metadata\": {\n    \"duration_ms\": 1234,\n    \"cost_usd\": 0.0041,\n    \"cache_hit\": false\n  },\n  \n  \"signature\": \"sha256:a1b2c3d4e5f6...\",\n  \"previous_hash\": \"sha256:9z8y7x6w5v4u...\"\n}\n","json",[522],"language-json",[524],{"type":24,"tag":507,"props":525,"children":526},{"__ignoreMap":7},[527],{"type":30,"value":519},{"type":24,"tag":33,"props":529,"children":530},{},[531,536,538,544],{"type":24,"tag":79,"props":532,"children":533},{},[534],{"type":30,"value":535},"注意",{"type":30,"value":537},"：输入和输出中的敏感内容（如用户个人信息、API Key）已脱敏（标记为 ",{"type":24,"tag":507,"props":539,"children":541},{"className":540},[],[542],{"type":30,"value":543},"[REDACTED]",{"type":30,"value":545},"）。",{"type":24,"tag":25,"props":547,"children":549},{"id":548},"存储架构设计",[550],{"type":30,"value":548},{"type":24,"tag":100,"props":552,"children":554},{"id":553},"方案一worm-storage一次写入多次读取",[555],{"type":30,"value":556},"方案一：WORM Storage（一次写入，多次读取）",{"type":24,"tag":33,"props":558,"children":559},{},[560,565],{"type":24,"tag":79,"props":561,"children":562},{},[563],{"type":30,"value":564},"原理",{"type":30,"value":566},"：使用 WORM（Write Once Read Many）存储介质，确保日志一旦写入就无法修改或删除。",{"type":24,"tag":33,"props":568,"children":569},{},[570,575],{"type":24,"tag":79,"props":571,"children":572},{},[573],{"type":30,"value":574},"实现方式",{"type":30,"value":576},"：",{"type":24,"tag":39,"props":578,"children":579},{},[580,590,600],{"type":24,"tag":43,"props":581,"children":582},{},[583,588],{"type":24,"tag":79,"props":584,"children":585},{},[586],{"type":30,"value":587},"AWS S3 Object Lock",{"type":30,"value":589},"：启用 S3 Bucket 的 Object Lock 功能，设置 retention period（如 7 年）。",{"type":24,"tag":43,"props":591,"children":592},{},[593,598],{"type":24,"tag":79,"props":594,"children":595},{},[596],{"type":30,"value":597},"Azure Immutable Blob Storage",{"type":30,"value":599},"：使用 Azure 的 immutable blob，支持 time-based 或 legal hold 策略。",{"type":24,"tag":43,"props":601,"children":602},{},[603,608],{"type":24,"tag":79,"props":604,"children":605},{},[606],{"type":30,"value":607},"Google Cloud Storage Retention Policy",{"type":30,"value":609},"：配置 GCS Bucket 的 retention policy，防止日志被删除。",{"type":24,"tag":33,"props":611,"children":612},{},[613,618],{"type":24,"tag":79,"props":614,"children":615},{},[616],{"type":30,"value":617},"优点",{"type":30,"value":576},{"type":24,"tag":39,"props":620,"children":621},{},[622,627,632],{"type":24,"tag":43,"props":623,"children":624},{},[625],{"type":30,"value":626},"强保证：物理上无法篡改或删除日志。",{"type":24,"tag":43,"props":628,"children":629},{},[630],{"type":30,"value":631},"合规友好：满足 SOC 2、GDPR、HIPAA 等标准的不可篡改要求。",{"type":24,"tag":43,"props":633,"children":634},{},[635],{"type":30,"value":636},"成本低：对象存储的价格远低于数据库。",{"type":24,"tag":33,"props":638,"children":639},{},[640,645],{"type":24,"tag":79,"props":641,"children":642},{},[643],{"type":30,"value":644},"缺点",{"type":30,"value":576},{"type":24,"tag":39,"props":647,"children":648},{},[649,654],{"type":24,"tag":43,"props":650,"children":651},{},[652],{"type":30,"value":653},"查询困难：对象存储不适合实时查询和分析。",{"type":24,"tag":43,"props":655,"children":656},{},[657],{"type":30,"value":658},"延迟高：写入和读取的延迟较高，不适合高频日志。",{"type":24,"tag":33,"props":660,"children":661},{},[662,667],{"type":24,"tag":79,"props":663,"children":664},{},[665],{"type":30,"value":666},"典型架构",{"type":30,"value":576},{"type":24,"tag":499,"props":669,"children":671},{"code":670},"┌─────────────┐     ┌──────────────┐     ┌─────────────┐\n│  AI Agents  │────▶│  Log Shipper │────▶│  AWS S3     │\n│             │     │  (Fluentd /  │     │  (WORM      │\n└─────────────┘     │   Vector)    │     │   Enabled)  │\n                    └──────────────┘     └─────────────┘\n                                                │\n                                         ┌──────┴──────┐\n                                         │  Athena /   │\n                                         │  Glue for   │\n                                         │  Querying   │\n                                         └─────────────┘\n",[672],{"type":24,"tag":507,"props":673,"children":674},{"__ignoreMap":7},[675],{"type":30,"value":670},{"type":24,"tag":100,"props":677,"children":679},{"id":678},"方案二blockchain-ledger区块链式哈希链",[680],{"type":30,"value":681},"方案二：Blockchain Ledger（区块链式哈希链）",{"type":24,"tag":33,"props":683,"children":684},{},[685,689],{"type":24,"tag":79,"props":686,"children":687},{},[688],{"type":30,"value":564},{"type":30,"value":690},"：每条日志包含前一条日志的哈希值，形成哈希链。任何篡改都会破坏哈希链，立即被发现。",{"type":24,"tag":33,"props":692,"children":693},{},[694,698],{"type":24,"tag":79,"props":695,"children":696},{},[697],{"type":30,"value":574},{"type":30,"value":576},{"type":24,"tag":499,"props":700,"children":703},{"code":701,"language":502,"meta":7,"className":702},"interface AuditLogWithHash {\n  // ... 其他字段 ...\n  previous_hash: string;  // 前一条日志的 SHA-256 哈希\n  current_hash: string;   // 当前日志的 SHA-256 哈希（包含 previous_hash）\n}\n\nasync function appendAuditLog(entry: AuditLogEntry): Promise\u003Cvoid> {\n  // 获取最后一条日志的哈希值\n  const lastEntry = await getLastAuditLog();\n  const previousHash = lastEntry ? lastEntry.current_hash : \"genesis\";\n  \n  // 计算当前日志的哈希值\n  const entryWithPreviousHash = { ...entry, previous_hash: previousHash };\n  const currentHash = sha256(JSON.stringify(entryWithPreviousHash));\n  \n  // 添加哈希值\n  const finalEntry = { ...entryWithPreviousHash, current_hash: currentHash };\n  \n  // 写入数据库\n  await database.insert(\"audit_logs\", finalEntry);\n}\n\nasync function verifyIntegrity(): Promise\u003Cboolean> {\n  const logs = await database.selectAll(\"audit_logs\");\n  \n  let previousHash = \"genesis\";\n  for (const log of logs) {\n    // 验证 previous_hash\n    if (log.previous_hash !== previousHash) {\n      console.error(`Hash chain broken at log ${log.event_id}`);\n      return false;\n    }\n    \n    // 验证 current_hash\n    const expectedHash = sha256(JSON.stringify({\n      ...log,\n      current_hash: undefined // 排除 current_hash 本身\n    }));\n    \n    if (log.current_hash !== expectedHash) {\n      console.error(`Current hash mismatch at log ${log.event_id}`);\n      return false;\n    }\n    \n    previousHash = log.current_hash;\n  }\n  \n  return true;\n}\n",[504],[704],{"type":24,"tag":507,"props":705,"children":706},{"__ignoreMap":7},[707],{"type":30,"value":701},{"type":24,"tag":33,"props":709,"children":710},{},[711,715],{"type":24,"tag":79,"props":712,"children":713},{},[714],{"type":30,"value":617},{"type":30,"value":576},{"type":24,"tag":39,"props":717,"children":718},{},[719,724,729],{"type":24,"tag":43,"props":720,"children":721},{},[722],{"type":30,"value":723},"防篡改：任何修改都会破坏哈希链，立即被发现。",{"type":24,"tag":43,"props":725,"children":726},{},[727],{"type":30,"value":728},"轻量级：不需要特殊的存储介质，普通数据库即可。",{"type":24,"tag":43,"props":730,"children":731},{},[732],{"type":30,"value":733},"可验证：任何人都可以独立验证日志的完整性。",{"type":24,"tag":33,"props":735,"children":736},{},[737,741],{"type":24,"tag":79,"props":738,"children":739},{},[740],{"type":30,"value":644},{"type":30,"value":576},{"type":24,"tag":39,"props":743,"children":744},{},[745,750,755],{"type":24,"tag":43,"props":746,"children":747},{},[748],{"type":30,"value":749},"性能开销：每条日志都需要计算哈希值。",{"type":24,"tag":43,"props":751,"children":752},{},[753],{"type":30,"value":754},"复杂性：需要维护哈希链的正确性，处理并发写入。",{"type":24,"tag":43,"props":756,"children":757},{},[758],{"type":30,"value":759},"不完全防删除：虽然无法篡改，但仍可能删除日志（需要配合 WORM 存储）。",{"type":24,"tag":100,"props":761,"children":763},{"id":762},"方案三append-only-database仅追加数据库",[764],{"type":30,"value":765},"方案三：Append-only Database（仅追加数据库）",{"type":24,"tag":33,"props":767,"children":768},{},[769,773],{"type":24,"tag":79,"props":770,"children":771},{},[772],{"type":30,"value":564},{"type":30,"value":774},"：使用仅支持追加操作、不支持更新和删除的数据库。",{"type":24,"tag":33,"props":776,"children":777},{},[778,782],{"type":24,"tag":79,"props":779,"children":780},{},[781],{"type":30,"value":574},{"type":30,"value":576},{"type":24,"tag":39,"props":784,"children":785},{},[786,796,806],{"type":24,"tag":43,"props":787,"children":788},{},[789,794],{"type":24,"tag":79,"props":790,"children":791},{},[792],{"type":30,"value":793},"Apache Kafka",{"type":30,"value":795},"：日志作为消息写入 Kafka Topic，配置 retention period（如 7 年）。",{"type":24,"tag":43,"props":797,"children":798},{},[799,804],{"type":24,"tag":79,"props":800,"children":801},{},[802],{"type":30,"value":803},"Elasticsearch ILM",{"type":30,"value":805},"：使用 Index Lifecycle Management，日志写入后只能追加，不能修改。",{"type":24,"tag":43,"props":807,"children":808},{},[809,814],{"type":24,"tag":79,"props":810,"children":811},{},[812],{"type":30,"value":813},"TimescaleDB",{"type":30,"value":815},"：时序数据库，天然支持仅追加模式。",{"type":24,"tag":33,"props":817,"children":818},{},[819,823],{"type":24,"tag":79,"props":820,"children":821},{},[822],{"type":30,"value":617},{"type":30,"value":576},{"type":24,"tag":39,"props":825,"children":826},{},[827,832,837],{"type":24,"tag":43,"props":828,"children":829},{},[830],{"type":30,"value":831},"高性能：专为高频写入优化。",{"type":24,"tag":43,"props":833,"children":834},{},[835],{"type":30,"value":836},"易查询：支持 SQL 或 DSL 查询，便于分析。",{"type":24,"tag":43,"props":838,"children":839},{},[840],{"type":30,"value":841},"可扩展：支持水平扩展，处理海量日志。",{"type":24,"tag":33,"props":843,"children":844},{},[845,849],{"type":24,"tag":79,"props":846,"children":847},{},[848],{"type":30,"value":644},{"type":30,"value":576},{"type":24,"tag":39,"props":851,"children":852},{},[853,858],{"type":24,"tag":43,"props":854,"children":855},{},[856],{"type":30,"value":857},"需要额外措施防止篡改：仅追加不等于不可篡改，仍需配合数字签名或哈希链。",{"type":24,"tag":43,"props":859,"children":860},{},[861],{"type":30,"value":862},"运维复杂：需要管理 Kafka Cluster 或 Elasticsearch Cluster。",{"type":24,"tag":25,"props":864,"children":866},{"id":865},"防篡改机制",[867],{"type":30,"value":865},{"type":24,"tag":100,"props":869,"children":871},{"id":870},"_1-数字签名digital-signature",[872],{"type":30,"value":873},"1. 数字签名（Digital Signature）",{"type":24,"tag":33,"props":875,"children":876},{},[877,881],{"type":24,"tag":79,"props":878,"children":879},{},[880],{"type":30,"value":564},{"type":30,"value":882},"：使用私钥对每条日志进行签名，验证时使用公钥验证签名的有效性。",{"type":24,"tag":33,"props":884,"children":885},{},[886,891],{"type":24,"tag":79,"props":887,"children":888},{},[889],{"type":30,"value":890},"实现",{"type":30,"value":576},{"type":24,"tag":499,"props":893,"children":896},{"code":894,"language":502,"meta":7,"className":895},"import crypto from \"crypto\";\n\nconst privateKey = process.env.AUDIT_LOG_PRIVATE_KEY;\nconst publicKey = process.env.AUDIT_LOG_PUBLIC_KEY;\n\nasync function signAuditLog(entry: AuditLogEntry): Promise\u003CAuditLogEntry> {\n  // 排除 signature 字段，对其他所有字段进行签名\n  const dataToSign = JSON.stringify({\n    ...entry,\n    signature: undefined,\n  });\n  \n  const signature = crypto.sign(\"SHA256\", Buffer.from(dataToSign), privateKey);\n  \n  return {\n    ...entry,\n    signature: signature.toString(\"base64\"),\n  };\n}\n\nasync function verifyAuditLog(entry: AuditLogEntry): Promise\u003Cboolean> {\n  const dataToVerify = JSON.stringify({\n    ...entry,\n    signature: undefined,\n  });\n  \n  const signature = Buffer.from(entry.signature, \"base64\");\n  \n  return crypto.verify(\"SHA256\", Buffer.from(dataToVerify), publicKey, signature);\n}\n",[504],[897],{"type":24,"tag":507,"props":898,"children":899},{"__ignoreMap":7},[900],{"type":30,"value":894},{"type":24,"tag":33,"props":902,"children":903},{},[904,909],{"type":24,"tag":79,"props":905,"children":906},{},[907],{"type":30,"value":908},"密钥管理",{"type":30,"value":576},{"type":24,"tag":39,"props":911,"children":912},{},[913,918,923],{"type":24,"tag":43,"props":914,"children":915},{},[916],{"type":30,"value":917},"私钥存储在 HSM（Hardware Security Module）或 KMS（Key Management Service）中。",{"type":24,"tag":43,"props":919,"children":920},{},[921],{"type":30,"value":922},"定期轮换签名密钥（如每年一次），旧密钥保留用于验证历史日志。",{"type":24,"tag":43,"props":924,"children":925},{},[926],{"type":30,"value":927},"公钥公开分发，任何人都可以验证日志的真实性。",{"type":24,"tag":100,"props":929,"children":931},{"id":930},"_2-时间戳服务timestamping-authority-tsa",[932],{"type":30,"value":933},"2. 时间戳服务（Timestamping Authority, TSA）",{"type":24,"tag":33,"props":935,"children":936},{},[937,941],{"type":24,"tag":79,"props":938,"children":939},{},[940],{"type":30,"value":564},{"type":30,"value":942},"：将日志的哈希值发送到可信的时间戳服务机构（TSA），获取带有权威时间戳的证明。",{"type":24,"tag":33,"props":944,"children":945},{},[946,950],{"type":24,"tag":79,"props":947,"children":948},{},[949],{"type":30,"value":890},{"type":30,"value":576},{"type":24,"tag":499,"props":952,"children":955},{"code":953,"language":502,"meta":7,"className":954},"async function addTrustedTimestamp(entry: AuditLogEntry): Promise\u003CAuditLogEntry> {\n  // 计算日志的哈希值\n  const hash = sha256(JSON.stringify(entry));\n  \n  // 向 TSA 请求时间戳\n  const timestampResponse = await fetch(\"https://tsa.example.com/timestamp\", {\n    method: \"POST\",\n    headers: { \"Content-Type\": \"application/json\" },\n    body: JSON.stringify({ hash }),\n  });\n  \n  const timestamp = await timestampResponse.json();\n  \n  return {\n    ...entry,\n    trusted_timestamp: timestamp,\n  };\n}\n",[504],[956],{"type":24,"tag":507,"props":957,"children":958},{"__ignoreMap":7},[959],{"type":30,"value":953},{"type":24,"tag":33,"props":961,"children":962},{},[963,967],{"type":24,"tag":79,"props":964,"children":965},{},[966],{"type":30,"value":617},{"type":30,"value":576},{"type":24,"tag":39,"props":969,"children":970},{},[971,976],{"type":24,"tag":43,"props":972,"children":973},{},[974],{"type":30,"value":975},"权威时间戳：由可信第三方提供，无法伪造。",{"type":24,"tag":43,"props":977,"children":978},{},[979],{"type":30,"value":980},"法律证据：在许多司法管辖区，TSA 时间戳具有法律效力。",{"type":24,"tag":33,"props":982,"children":983},{},[984,988],{"type":24,"tag":79,"props":985,"children":986},{},[987],{"type":30,"value":644},{"type":30,"value":576},{"type":24,"tag":39,"props":990,"children":991},{},[992,997,1002],{"type":24,"tag":43,"props":993,"children":994},{},[995],{"type":30,"value":996},"成本高：每次请求都需要付费。",{"type":24,"tag":43,"props":998,"children":999},{},[1000],{"type":30,"value":1001},"延迟高：网络请求增加了日志写入的延迟。",{"type":24,"tag":43,"props":1003,"children":1004},{},[1005],{"type":30,"value":1006},"依赖外部服务：TSA 不可用时会影响日志写入。",{"type":24,"tag":100,"props":1008,"children":1010},{"id":1009},"_3-merkle-tree默克尔树",[1011],{"type":30,"value":1012},"3. Merkle Tree（默克尔树）",{"type":24,"tag":33,"props":1014,"children":1015},{},[1016,1020],{"type":24,"tag":79,"props":1017,"children":1018},{},[1019],{"type":30,"value":564},{"type":30,"value":1021},"：将多条日志组织成 Merkle Tree，根哈希值定期发布到公开渠道（如区块链、GitHub）。任何篡改都会改变根哈希值，立即被发现。",{"type":24,"tag":33,"props":1023,"children":1024},{},[1025,1029],{"type":24,"tag":79,"props":1026,"children":1027},{},[1028],{"type":30,"value":890},{"type":30,"value":576},{"type":24,"tag":499,"props":1031,"children":1034},{"code":1032,"language":502,"meta":7,"className":1033},"class MerkleTree {\n  private leaves: string[];\n  private tree: string[][];\n  \n  constructor(logs: AuditLogEntry[]) {\n    this.leaves = logs.map(log => sha256(JSON.stringify(log)));\n    this.tree = this.buildTree(this.leaves);\n  }\n  \n  private buildTree(leaves: string[]): string[][] {\n    const tree = [leaves];\n    \n    let currentLevel = leaves;\n    while (currentLevel.length > 1) {\n      const nextLevel: string[] = [];\n      \n      for (let i = 0; i \u003C currentLevel.length; i += 2) {\n        const left = currentLevel[i];\n        const right = currentLevel[i + 1] || left; // 如果奇数个，复制最后一个\n        nextLevel.push(sha256(left + right));\n      }\n      \n      tree.push(nextLevel);\n      currentLevel = nextLevel;\n    }\n    \n    return tree;\n  }\n  \n  getRootHash(): string {\n    return this.tree[this.tree.length - 1][0];\n  }\n  \n  getProof(index: number): string[] {\n    const proof: string[] = [];\n    let currentIndex = index;\n    \n    for (let level = 0; level \u003C this.tree.length - 1; level++) {\n      const siblingIndex = currentIndex % 2 === 0 ? currentIndex + 1 : currentIndex - 1;\n      \n      if (siblingIndex \u003C this.tree[level].length) {\n        proof.push(this.tree[level][siblingIndex]);\n      }\n      \n      currentIndex = Math.floor(currentIndex / 2);\n    }\n    \n    return proof;\n  }\n}\n\n// 每小时构建一次 Merkle Tree，并将根哈希发布到区块链\nsetInterval(async () => {\n  const logs = await getLogsLastHour();\n  const tree = new MerkleTree(logs);\n  const rootHash = tree.getRootHash();\n  \n  // 发布到以太坊区块链\n  await publishToBlockchain(rootHash);\n  \n  console.log(`Merkle root hash published: ${rootHash}`);\n}, 60 * 60 * 1000); // 每小时\n",[504],[1035],{"type":24,"tag":507,"props":1036,"children":1037},{"__ignoreMap":7},[1038],{"type":30,"value":1032},{"type":24,"tag":33,"props":1040,"children":1041},{},[1042,1046],{"type":24,"tag":79,"props":1043,"children":1044},{},[1045],{"type":30,"value":617},{"type":30,"value":576},{"type":24,"tag":39,"props":1048,"children":1049},{},[1050,1055,1060],{"type":24,"tag":43,"props":1051,"children":1052},{},[1053],{"type":30,"value":1054},"高效验证：只需提供 Merkle Proof，无需传输整棵树。",{"type":24,"tag":43,"props":1056,"children":1057},{},[1058],{"type":30,"value":1059},"公开可验证：根哈希发布到区块链后，任何人都可以验证。",{"type":24,"tag":43,"props":1061,"children":1062},{},[1063],{"type":30,"value":1064},"批量处理：一次性验证多条日志的完整性。",{"type":24,"tag":33,"props":1066,"children":1067},{},[1068,1072],{"type":24,"tag":79,"props":1069,"children":1070},{},[1071],{"type":30,"value":644},{"type":30,"value":576},{"type":24,"tag":39,"props":1074,"children":1075},{},[1076,1081],{"type":24,"tag":43,"props":1077,"children":1078},{},[1079],{"type":30,"value":1080},"复杂性高：实现和维护 Merkle Tree 需要专业知识。",{"type":24,"tag":43,"props":1082,"children":1083},{},[1084],{"type":30,"value":1085},"延迟：需要等待批量处理完成才能生成根哈希。",{"type":24,"tag":25,"props":1087,"children":1089},{"id":1088},"查询与分析",[1090],{"type":30,"value":1088},{"type":24,"tag":100,"props":1092,"children":1094},{"id":1093},"sql-查询示例",[1095],{"type":30,"value":1096},"SQL 查询示例",{"type":24,"tag":33,"props":1098,"children":1099},{},[1100],{"type":30,"value":1101},"假设审计日志存储在 PostgreSQL 数据库中：",{"type":24,"tag":499,"props":1103,"children":1108},{"code":1104,"language":1105,"meta":7,"className":1106},"-- 查询某个 agent 在过去 24 小时的所有工具调用\nSELECT \n  timestamp,\n  actor_id,\n  resource_type,\n  resource_id,\n  input,\n  output,\n  metadata->>'duration_ms' AS duration_ms\nFROM audit_logs\nWHERE \n  actor_id = 'agent:customer-support-bot'\n  AND event_type = 'tool_call'\n  AND timestamp >= NOW() - INTERVAL '24 hours'\nORDER BY timestamp DESC;\n\n-- 查询失败的工具调用\nSELECT \n  timestamp,\n  actor_id,\n  resource_id,\n  error->>'message' AS error_message\nFROM audit_logs\nWHERE \n  event_type = 'tool_call'\n  AND error IS NOT NULL\n  AND timestamp >= NOW() - INTERVAL '7 days'\nORDER BY timestamp DESC;\n\n-- 统计每个 agent 的工具调用次数\nSELECT \n  actor_id,\n  COUNT(*) AS call_count,\n  AVG((metadata->>'duration_ms')::numeric) AS avg_duration_ms\nFROM audit_logs\nWHERE \n  event_type = 'tool_call'\n  AND timestamp >= NOW() - INTERVAL '30 days'\nGROUP BY actor_id\nORDER BY call_count DESC;\n\n-- 查询某个会话的完整操作序列\nSELECT \n  timestamp,\n  event_type,\n  action,\n  resource_type,\n  resource_id,\n  input,\n  output\nFROM audit_logs\nWHERE \n  session_id = 'sess_abc123'\nORDER BY timestamp ASC;\n","sql",[1107],"language-sql",[1109],{"type":24,"tag":507,"props":1110,"children":1111},{"__ignoreMap":7},[1112],{"type":30,"value":1104},{"type":24,"tag":100,"props":1114,"children":1116},{"id":1115},"可视化看板",[1117],{"type":30,"value":1115},{"type":24,"tag":33,"props":1119,"children":1120},{},[1121],{"type":30,"value":1122},"使用 Grafana、Kibana 或 Datadog 构建审计日志仪表盘：",{"type":24,"tag":33,"props":1124,"children":1125},{},[1126],{"type":24,"tag":79,"props":1127,"children":1128},{},[1129],{"type":30,"value":1130},"面板 1：实时操作流",{"type":24,"tag":39,"props":1132,"children":1133},{},[1134,1139,1144],{"type":24,"tag":43,"props":1135,"children":1136},{},[1137],{"type":30,"value":1138},"显示最近 1 小时的审计日志时间线。",{"type":24,"tag":43,"props":1140,"children":1141},{},[1142],{"type":30,"value":1143},"按事件类型着色（工具调用=蓝色、状态变更=绿色、人工干预=橙色、错误=红色）。",{"type":24,"tag":43,"props":1145,"children":1146},{},[1147],{"type":30,"value":1148},"点击任意事件可查看详细信息。",{"type":24,"tag":33,"props":1150,"children":1151},{},[1152],{"type":24,"tag":79,"props":1153,"children":1154},{},[1155],{"type":30,"value":1156},"面板 2：Top 10 活跃 Agent",{"type":24,"tag":39,"props":1158,"children":1159},{},[1160,1165],{"type":24,"tag":43,"props":1161,"children":1162},{},[1163],{"type":30,"value":1164},"柱状图显示过去 24 小时工具调用次数最多的 10 个 agent。",{"type":24,"tag":43,"props":1166,"children":1167},{},[1168],{"type":30,"value":1169},"悬停显示平均耗时、错误率等指标。",{"type":24,"tag":33,"props":1171,"children":1172},{},[1173],{"type":24,"tag":79,"props":1174,"children":1175},{},[1176],{"type":30,"value":1177},"面板 3：错误趋势",{"type":24,"tag":39,"props":1179,"children":1180},{},[1181,1186],{"type":24,"tag":43,"props":1182,"children":1183},{},[1184],{"type":30,"value":1185},"折线图显示过去 7 天的错误数量趋势。",{"type":24,"tag":43,"props":1187,"children":1188},{},[1189],{"type":30,"value":1190},"按错误类型分组（超时、权限拒绝、API 错误等）。",{"type":24,"tag":33,"props":1192,"children":1193},{},[1194],{"type":24,"tag":79,"props":1195,"children":1196},{},[1197],{"type":30,"value":1198},"面板 4：合规报告",{"type":24,"tag":39,"props":1200,"children":1201},{},[1202],{"type":24,"tag":43,"props":1203,"children":1204},{},[1205,1207],{"type":30,"value":1206},"表格显示过去 30 天的合规指标：\n",{"type":24,"tag":39,"props":1208,"children":1209},{},[1210,1215,1220,1225,1230],{"type":24,"tag":43,"props":1211,"children":1212},{},[1213],{"type":30,"value":1214},"总操作数",{"type":24,"tag":43,"props":1216,"children":1217},{},[1218],{"type":30,"value":1219},"人工干预次数",{"type":24,"tag":43,"props":1221,"children":1222},{},[1223],{"type":30,"value":1224},"凭证访问次数",{"type":24,"tag":43,"props":1226,"children":1227},{},[1228],{"type":30,"value":1229},"数据导出次数",{"type":24,"tag":43,"props":1231,"children":1232},{},[1233],{"type":30,"value":1234},"异常操作数量",{"type":24,"tag":100,"props":1236,"children":1238},{"id":1237},"告警规则",[1239],{"type":30,"value":1237},{"type":24,"tag":499,"props":1241,"children":1246},{"code":1242,"language":1243,"meta":7,"className":1244},"groups:\n  - name: audit_trail\n    rules:\n      - alert: UnusualActivityDetected\n        expr: |\n          sum by (actor_id) (rate(audit_log_total{event_type=\"tool_call\"}[1h])) \n          > 3 * avg by (actor_id) (sum by (actor_id) (rate(audit_log_total{event_type=\"tool_call\"}[24h])))\n        for: 10m\n        labels:\n          severity: warning\n        annotations:\n          summary: \"Unusual activity detected for {{ $labels.actor_id }}\"\n          description: \"Call rate is {{ $value | humanize }}x higher than the 24h average\"\n      \n      - alert: AuditLogIntegrityCheckFailed\n        expr: audit_log_integrity_check_success == 0\n        for: 5m\n        labels:\n          severity: critical\n        annotations:\n          summary: \"Audit log integrity check failed\"\n          description: \"Hash chain verification failed, possible tampering detected\"\n      \n      - alert: HumanInterventionSpike\n        expr: increase(audit_log_total{event_type=\"human_intervention\"}[1h]) > 10\n        for: 5m\n        labels:\n          severity: warning\n        annotations:\n          summary: \"Spike in human interventions\"\n          description: \"{{ $value }} human interventions in the last hour\"\n","yaml",[1245],"language-yaml",[1247],{"type":24,"tag":507,"props":1248,"children":1249},{"__ignoreMap":7},[1250],{"type":30,"value":1242},{"type":24,"tag":25,"props":1252,"children":1254},{"id":1253},"合规映射",[1255],{"type":30,"value":1253},{"type":24,"tag":100,"props":1257,"children":1259},{"id":1258},"soc-2",[1260],{"type":30,"value":180},{"type":24,"tag":33,"props":1262,"children":1263},{},[1264,1269],{"type":24,"tag":79,"props":1265,"children":1266},{},[1267],{"type":30,"value":1268},"要求",{"type":30,"value":576},{"type":24,"tag":39,"props":1271,"children":1272},{},[1273,1278,1283],{"type":24,"tag":43,"props":1274,"children":1275},{},[1276],{"type":30,"value":1277},"CC7.1：检测并监控安全事件。",{"type":24,"tag":43,"props":1279,"children":1280},{},[1281],{"type":30,"value":1282},"CC7.2：评估安全事件的影响。",{"type":24,"tag":43,"props":1284,"children":1285},{},[1286],{"type":30,"value":1287},"CC7.3：响应安全事件。",{"type":24,"tag":33,"props":1289,"children":1290},{},[1291,1296],{"type":24,"tag":79,"props":1292,"children":1293},{},[1294],{"type":30,"value":1295},"审计日志如何满足",{"type":30,"value":576},{"type":24,"tag":39,"props":1298,"children":1299},{},[1300,1305,1310],{"type":24,"tag":43,"props":1301,"children":1302},{},[1303],{"type":30,"value":1304},"记录所有对敏感数据的访问和操作。",{"type":24,"tag":43,"props":1306,"children":1307},{},[1308],{"type":30,"value":1309},"提供实时告警，检测异常活动。",{"type":24,"tag":43,"props":1311,"children":1312},{},[1313],{"type":30,"value":1314},"保留至少 1 年的日志，支持事后审计。",{"type":24,"tag":100,"props":1316,"children":1318},{"id":1317},"gdpr",[1319],{"type":30,"value":190},{"type":24,"tag":33,"props":1321,"children":1322},{},[1323,1327],{"type":24,"tag":79,"props":1324,"children":1325},{},[1326],{"type":30,"value":1268},{"type":30,"value":576},{"type":24,"tag":39,"props":1329,"children":1330},{},[1331,1336,1341],{"type":24,"tag":43,"props":1332,"children":1333},{},[1334],{"type":30,"value":1335},"Article 30：记录数据处理活动。",{"type":24,"tag":43,"props":1337,"children":1338},{},[1339],{"type":30,"value":1340},"Article 33：数据泄露通知。",{"type":24,"tag":43,"props":1342,"children":1343},{},[1344],{"type":30,"value":1345},"Article 35：数据保护影响评估。",{"type":24,"tag":33,"props":1347,"children":1348},{},[1349,1353],{"type":24,"tag":79,"props":1350,"children":1351},{},[1352],{"type":30,"value":1295},{"type":30,"value":576},{"type":24,"tag":39,"props":1355,"children":1356},{},[1357,1362,1367],{"type":24,"tag":43,"props":1358,"children":1359},{},[1360],{"type":30,"value":1361},"记录所有对个人数据的处理活动（谁、何时、为何、如何）。",{"type":24,"tag":43,"props":1363,"children":1364},{},[1365],{"type":30,"value":1366},"检测到数据泄露时，提供完整的证据链。",{"type":24,"tag":43,"props":1368,"children":1369},{},[1370],{"type":30,"value":1371},"支持 DPIA（Data Protection Impact Assessment），展示数据流向。",{"type":24,"tag":100,"props":1373,"children":1375},{"id":1374},"hipaa",[1376],{"type":30,"value":200},{"type":24,"tag":33,"props":1378,"children":1379},{},[1380,1384],{"type":24,"tag":79,"props":1381,"children":1382},{},[1383],{"type":30,"value":1268},{"type":30,"value":576},{"type":24,"tag":39,"props":1386,"children":1387},{},[1388,1393],{"type":24,"tag":43,"props":1389,"children":1390},{},[1391],{"type":30,"value":1392},"§164.312(b)：审计控制，记录信息系统活动。",{"type":24,"tag":43,"props":1394,"children":1395},{},[1396],{"type":30,"value":1397},"§164.308(a)(1)(ii)(D)：信息安全管理系统，包括日志审查。",{"type":24,"tag":33,"props":1399,"children":1400},{},[1401,1405],{"type":24,"tag":79,"props":1402,"children":1403},{},[1404],{"type":30,"value":1295},{"type":30,"value":576},{"type":24,"tag":39,"props":1407,"children":1408},{},[1409,1414,1419],{"type":24,"tag":43,"props":1410,"children":1411},{},[1412],{"type":30,"value":1413},"记录所有对患者健康信息（PHI）的访问。",{"type":24,"tag":43,"props":1415,"children":1416},{},[1417],{"type":30,"value":1418},"保留至少 6 年的日志。",{"type":24,"tag":43,"props":1420,"children":1421},{},[1422],{"type":30,"value":1423},"定期审查日志，发现异常访问模式。",{"type":24,"tag":25,"props":1425,"children":1427},{"id":1426},"faq",[1428],{"type":30,"value":1429},"FAQ",{"type":24,"tag":100,"props":1431,"children":1433},{"id":1432},"q1-audit-trail-和普通应用日志有什么区别",[1434],{"type":30,"value":1435},"Q1: Audit Trail 和普通应用日志有什么区别？",{"type":24,"tag":33,"props":1437,"children":1438},{},[1439,1444],{"type":24,"tag":79,"props":1440,"children":1441},{},[1442],{"type":30,"value":1443},"A",{"type":30,"value":1445},":",{"type":24,"tag":39,"props":1447,"children":1448},{},[1449,1459,1469,1479],{"type":24,"tag":43,"props":1450,"children":1451},{},[1452,1457],{"type":24,"tag":79,"props":1453,"children":1454},{},[1455],{"type":30,"value":1456},"目的不同",{"type":30,"value":1458},"：应用日志用于调试和监控，审计日志用于责任追溯和合规审计。",{"type":24,"tag":43,"props":1460,"children":1461},{},[1462,1467],{"type":24,"tag":79,"props":1463,"children":1464},{},[1465],{"type":30,"value":1466},"完整性要求不同",{"type":30,"value":1468},"：应用日志可以丢失或篡改，审计日志必须完整且不可篡改。",{"type":24,"tag":43,"props":1470,"children":1471},{},[1472,1477],{"type":24,"tag":79,"props":1473,"children":1474},{},[1475],{"type":30,"value":1476},"保留期限不同",{"type":30,"value":1478},"：应用日志通常保留 7-30 天，审计日志需要保留 1-7 年。",{"type":24,"tag":43,"props":1480,"children":1481},{},[1482,1487],{"type":24,"tag":79,"props":1483,"children":1484},{},[1485],{"type":30,"value":1486},"详细程度不同",{"type":30,"value":1488},"：应用日志记录关键事件，审计日志记录所有操作，包括输入输出、上下文、权限等。",{"type":24,"tag":100,"props":1490,"children":1492},{"id":1491},"q2-如何保证日志不被篡改",[1493],{"type":30,"value":1494},"Q2: 如何保证日志不被篡改？",{"type":24,"tag":33,"props":1496,"children":1497},{},[1498,1502],{"type":24,"tag":79,"props":1499,"children":1500},{},[1501],{"type":30,"value":1443},{"type":30,"value":1503},": 结合多种机制：",{"type":24,"tag":39,"props":1505,"children":1506},{},[1507,1517,1527,1537],{"type":24,"tag":43,"props":1508,"children":1509},{},[1510,1515],{"type":24,"tag":79,"props":1511,"children":1512},{},[1513],{"type":30,"value":1514},"WORM Storage",{"type":30,"value":1516},"：物理上无法修改或删除日志。",{"type":24,"tag":43,"props":1518,"children":1519},{},[1520,1525],{"type":24,"tag":79,"props":1521,"children":1522},{},[1523],{"type":30,"value":1524},"数字签名",{"type":30,"value":1526},"：每条日志都有数字签名，篡改后签名验证失败。",{"type":24,"tag":43,"props":1528,"children":1529},{},[1530,1535],{"type":24,"tag":79,"props":1531,"children":1532},{},[1533],{"type":30,"value":1534},"哈希链",{"type":30,"value":1536},"：每条日志包含前一条日志的哈希值，篡改会破坏哈希链。",{"type":24,"tag":43,"props":1538,"children":1539},{},[1540,1545],{"type":24,"tag":79,"props":1541,"children":1542},{},[1543],{"type":30,"value":1544},"Merkle Tree",{"type":30,"value":1546},"：定期将根哈希发布到区块链，公开可验证。",{"type":24,"tag":100,"props":1548,"children":1550},{"id":1549},"q3-日志需要保留多久",[1551],{"type":30,"value":1552},"Q3: 日志需要保留多久？",{"type":24,"tag":33,"props":1554,"children":1555},{},[1556,1560],{"type":24,"tag":79,"props":1557,"children":1558},{},[1559],{"type":30,"value":1443},{"type":30,"value":1561},": 取决于合规要求：",{"type":24,"tag":39,"props":1563,"children":1564},{},[1565,1574,1583,1592,1600],{"type":24,"tag":43,"props":1566,"children":1567},{},[1568,1572],{"type":24,"tag":79,"props":1569,"children":1570},{},[1571],{"type":30,"value":180},{"type":30,"value":1573},"：至少 1 年。",{"type":24,"tag":43,"props":1575,"children":1576},{},[1577,1581],{"type":24,"tag":79,"props":1578,"children":1579},{},[1580],{"type":30,"value":190},{"type":30,"value":1582},"：根据数据处理活动的性质，通常 1-7 年。",{"type":24,"tag":43,"props":1584,"children":1585},{},[1586,1590],{"type":24,"tag":79,"props":1587,"children":1588},{},[1589],{"type":30,"value":200},{"type":30,"value":1591},"：至少 6 年。",{"type":24,"tag":43,"props":1593,"children":1594},{},[1595,1599],{"type":24,"tag":79,"props":1596,"children":1597},{},[1598],{"type":30,"value":210},{"type":30,"value":1573},{"type":24,"tag":43,"props":1601,"children":1602},{},[1603,1608],{"type":24,"tag":79,"props":1604,"children":1605},{},[1606],{"type":30,"value":1607},"内部政策",{"type":30,"value":1609},"：建议至少 2 年，便于长期趋势分析和故障排查。",{"type":24,"tag":100,"props":1611,"children":1613},{"id":1612},"q4-如何快速定位某个-agent-的所有操作",[1614],{"type":30,"value":1615},"Q4: 如何快速定位某个 agent 的所有操作？",{"type":24,"tag":33,"props":1617,"children":1618},{},[1619,1623],{"type":24,"tag":79,"props":1620,"children":1621},{},[1622],{"type":30,"value":1443},{"type":30,"value":1445},{"type":24,"tag":39,"props":1625,"children":1626},{},[1627,1660,1670,1680],{"type":24,"tag":43,"props":1628,"children":1629},{},[1630,1635,1637,1643,1645,1651,1652,1658],{"type":24,"tag":79,"props":1631,"children":1632},{},[1633],{"type":30,"value":1634},"索引优化",{"type":30,"value":1636},"：在 ",{"type":24,"tag":507,"props":1638,"children":1640},{"className":1639},[],[1641],{"type":30,"value":1642},"actor_id",{"type":30,"value":1644},"、",{"type":24,"tag":507,"props":1646,"children":1648},{"className":1647},[],[1649],{"type":30,"value":1650},"session_id",{"type":30,"value":1644},{"type":24,"tag":507,"props":1653,"children":1655},{"className":1654},[],[1656],{"type":30,"value":1657},"timestamp",{"type":30,"value":1659}," 字段上建立索引。",{"type":24,"tag":43,"props":1661,"children":1662},{},[1663,1668],{"type":24,"tag":79,"props":1664,"children":1665},{},[1666],{"type":30,"value":1667},"分区表",{"type":30,"value":1669},"：按时间分区（如每月一个分区），提高查询效率。",{"type":24,"tag":43,"props":1671,"children":1672},{},[1673,1678],{"type":24,"tag":79,"props":1674,"children":1675},{},[1676],{"type":30,"value":1677},"缓存热点数据",{"type":30,"value":1679},"：将最近 7 天的日志缓存在 Redis 中，加速查询。",{"type":24,"tag":43,"props":1681,"children":1682},{},[1683,1688],{"type":24,"tag":79,"props":1684,"children":1685},{},[1686],{"type":30,"value":1687},"使用专用查询引擎",{"type":30,"value":1689},"：如 Elasticsearch、ClickHouse，支持海量日志的快速检索。",{"type":24,"tag":100,"props":1691,"children":1693},{"id":1692},"q5-日志量太大会影响性能吗",[1694],{"type":30,"value":1695},"Q5: 日志量太大会影响性能吗？",{"type":24,"tag":33,"props":1697,"children":1698},{},[1699,1703],{"type":24,"tag":79,"props":1700,"children":1701},{},[1702],{"type":30,"value":1443},{"type":30,"value":1704},": 会的。优化建议：",{"type":24,"tag":39,"props":1706,"children":1707},{},[1708,1718,1728,1738],{"type":24,"tag":43,"props":1709,"children":1710},{},[1711,1716],{"type":24,"tag":79,"props":1712,"children":1713},{},[1714],{"type":30,"value":1715},"异步写入",{"type":30,"value":1717},"：日志写入不要阻塞主流程，使用消息队列（如 Kafka）缓冲。",{"type":24,"tag":43,"props":1719,"children":1720},{},[1721,1726],{"type":24,"tag":79,"props":1722,"children":1723},{},[1724],{"type":30,"value":1725},"批量写入",{"type":30,"value":1727},"：每 100 条日志批量写入一次，减少 I/O 次数。",{"type":24,"tag":43,"props":1729,"children":1730},{},[1731,1736],{"type":24,"tag":79,"props":1732,"children":1733},{},[1734],{"type":30,"value":1735},"采样策略",{"type":30,"value":1737},"：对于高频操作（如每秒数千次的 API 调用），可以采样记录（如每 100 次记录 1 次）。",{"type":24,"tag":43,"props":1739,"children":1740},{},[1741,1746],{"type":24,"tag":79,"props":1742,"children":1743},{},[1744],{"type":30,"value":1745},"分层存储",{"type":30,"value":1747},"：热数据（最近 7 天）存储在高速存储（如 SSD），冷数据（7 天前）归档到低成本存储（如 S3 Glacier）。",{"type":24,"tag":100,"props":1749,"children":1751},{"id":1750},"q6-如何实现日志的实时告警",[1752],{"type":30,"value":1753},"Q6: 如何实现日志的实时告警？",{"type":24,"tag":33,"props":1755,"children":1756},{},[1757,1761],{"type":24,"tag":79,"props":1758,"children":1759},{},[1760],{"type":30,"value":1443},{"type":30,"value":1445},{"type":24,"tag":39,"props":1763,"children":1764},{},[1765,1775,1785,1795],{"type":24,"tag":43,"props":1766,"children":1767},{},[1768,1773],{"type":24,"tag":79,"props":1769,"children":1770},{},[1771],{"type":30,"value":1772},"流处理",{"type":30,"value":1774},"：使用 Apache Flink、Spark Streaming 或 Kafka Streams 实时处理日志流。",{"type":24,"tag":43,"props":1776,"children":1777},{},[1778,1783],{"type":24,"tag":79,"props":1779,"children":1780},{},[1781],{"type":30,"value":1782},"规则引擎",{"type":30,"value":1784},"：定义告警规则（如 \"1 小时内错误次数 > 10\"），实时匹配。",{"type":24,"tag":43,"props":1786,"children":1787},{},[1788,1793],{"type":24,"tag":79,"props":1789,"children":1790},{},[1791],{"type":30,"value":1792},"告警通道",{"type":30,"value":1794},"：通过 Slack、PagerDuty、Email 等通道发送告警。",{"type":24,"tag":43,"props":1796,"children":1797},{},[1798,1803],{"type":24,"tag":79,"props":1799,"children":1800},{},[1801],{"type":30,"value":1802},"抑制策略",{"type":30,"value":1804},"：避免告警风暴，相同告警在 5 分钟内只发送一次。",{"type":24,"tag":100,"props":1806,"children":1808},{"id":1807},"q7-gdpr-要求删除用户数据时审计日志怎么处理",[1809],{"type":30,"value":1810},"Q7: GDPR 要求删除用户数据时，审计日志怎么处理？",{"type":24,"tag":33,"props":1812,"children":1813},{},[1814,1818],{"type":24,"tag":79,"props":1815,"children":1816},{},[1817],{"type":30,"value":1443},{"type":30,"value":1819},": 这是一个复杂的问题，有两种处理方式：",{"type":24,"tag":39,"props":1821,"children":1822},{},[1823,1833],{"type":24,"tag":43,"props":1824,"children":1825},{},[1826,1831],{"type":24,"tag":79,"props":1827,"children":1828},{},[1829],{"type":30,"value":1830},"匿名化",{"type":30,"value":1832},"：不删除日志，但将日志中的个人身份信息（PII）匿名化（如将用户 ID 替换为哈希值）。",{"type":24,"tag":43,"props":1834,"children":1835},{},[1836,1841],{"type":24,"tag":79,"props":1837,"children":1838},{},[1839],{"type":30,"value":1840},"分离存储",{"type":30,"value":1842},"：将审计日志和个人数据分开存储。删除个人数据时，保留审计日志（因为审计日志本身不包含个人数据，或者已匿名化）。",{"type":24,"tag":33,"props":1844,"children":1845},{},[1846,1850],{"type":24,"tag":79,"props":1847,"children":1848},{},[1849],{"type":30,"value":535},{"type":30,"value":1851},"：某些司法管辖区允许为了合规审计目的保留日志，即使个人数据已被删除。建议咨询法律顾问，确保符合当地法规。",{"type":24,"tag":100,"props":1853,"children":1855},{"id":1854},"q8-如何选择-worm-storage-方案",[1856],{"type":30,"value":1857},"Q8: 如何选择 WORM Storage 方案？",{"type":24,"tag":33,"props":1859,"children":1860},{},[1861,1865],{"type":24,"tag":79,"props":1862,"children":1863},{},[1864],{"type":30,"value":1443},{"type":30,"value":1866},": 根据云服务商选择：",{"type":24,"tag":39,"props":1868,"children":1869},{},[1870,1880,1890,1900],{"type":24,"tag":43,"props":1871,"children":1872},{},[1873,1878],{"type":24,"tag":79,"props":1874,"children":1875},{},[1876],{"type":30,"value":1877},"AWS",{"type":30,"value":1879},"：S3 Object Lock，支持 Compliance 或 Governance 模式。",{"type":24,"tag":43,"props":1881,"children":1882},{},[1883,1888],{"type":24,"tag":79,"props":1884,"children":1885},{},[1886],{"type":30,"value":1887},"Azure",{"type":30,"value":1889},"：Immutable Blob Storage，支持 time-based 或 legal hold 策略。",{"type":24,"tag":43,"props":1891,"children":1892},{},[1893,1898],{"type":24,"tag":79,"props":1894,"children":1895},{},[1896],{"type":30,"value":1897},"GCP",{"type":30,"value":1899},"：Cloud Storage Retention Policy，支持 bucket-level 或 object-level 策略。",{"type":24,"tag":43,"props":1901,"children":1902},{},[1903,1908],{"type":24,"tag":79,"props":1904,"children":1905},{},[1906],{"type":30,"value":1907},"自建",{"type":30,"value":1909},"：使用 MinIO（兼容 S3 API）+ WORM 插件。",{"type":24,"tag":33,"props":1911,"children":1912},{},[1913],{"type":30,"value":1914},"选择时考虑：",{"type":24,"tag":39,"props":1916,"children":1917},{},[1918,1928,1938,1948],{"type":24,"tag":43,"props":1919,"children":1920},{},[1921,1926],{"type":24,"tag":79,"props":1922,"children":1923},{},[1924],{"type":30,"value":1925},"合规认证",{"type":30,"value":1927},"：是否通过 SOC 2、ISO 27001 等认证。",{"type":24,"tag":43,"props":1929,"children":1930},{},[1931,1936],{"type":24,"tag":79,"props":1932,"children":1933},{},[1934],{"type":30,"value":1935},"成本",{"type":30,"value":1937},"：存储费用和 API 调用费用。",{"type":24,"tag":43,"props":1939,"children":1940},{},[1941,1946],{"type":24,"tag":79,"props":1942,"children":1943},{},[1944],{"type":30,"value":1945},"易用性",{"type":30,"value":1947},"：是否支持与现有日志系统集成。",{"type":24,"tag":43,"props":1949,"children":1950},{},[1951,1956],{"type":24,"tag":79,"props":1952,"children":1953},{},[1954],{"type":30,"value":1955},"灵活性",{"type":30,"value":1957},"：是否支持不同的 retention period 和 legal hold。",{"type":24,"tag":25,"props":1959,"children":1961},{"id":1960},"延伸阅读",[1962],{"type":30,"value":1960},{"type":24,"tag":39,"props":1964,"children":1965},{},[1966,1978,1988,1998],{"type":24,"tag":43,"props":1967,"children":1968},{},[1969],{"type":24,"tag":1970,"props":1971,"children":1975},"a",{"href":1972,"rel":1973},"https://csrc.nist.gov/publications/detail/sp/800-92/final",[1974],"nofollow",[1976],{"type":30,"value":1977},"NIST SP 800-92: Guide to Computer Security Log Management",{"type":24,"tag":43,"props":1979,"children":1980},{},[1981],{"type":24,"tag":1970,"props":1982,"children":1985},{"href":1983,"rel":1984},"https://cheatsheetseries.owasp.org/cheatsheets/Logging_Cheat_Sheet.html",[1974],[1986],{"type":30,"value":1987},"OWASP Logging Cheat Sheet",{"type":24,"tag":43,"props":1989,"children":1990},{},[1991],{"type":24,"tag":1970,"props":1992,"children":1995},{"href":1993,"rel":1994},"https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-best-practices.html",[1974],[1996],{"type":30,"value":1997},"AWS CloudTrail Best Practices",{"type":24,"tag":43,"props":1999,"children":2000},{},[2001],{"type":24,"tag":1970,"props":2002,"children":2005},{"href":2003,"rel":2004},"https://www.aicpa.org/content/dam/aicpa/interestareas/frc/assuranceadvisoryservices/aicpasoc2report.pdf",[1974],[2006],{"type":30,"value":2007},"SOC 2 Trust Services Criteria",{"type":24,"tag":25,"props":2009,"children":2011},{"id":2010},"checklist",[2012],{"type":30,"value":2013},"Checklist",{"type":24,"tag":33,"props":2015,"children":2016},{},[2017],{"type":30,"value":2018},"在实施 Operation Audit Trail 之前，请确认以下事项：",{"type":24,"tag":39,"props":2020,"children":2023},{"className":2021},[2022],"contains-task-list",[2024,2037,2046,2055,2064,2073,2082,2091,2100,2109],{"type":24,"tag":43,"props":2025,"children":2028},{"className":2026},[2027],"task-list-item",[2029,2035],{"type":24,"tag":2030,"props":2031,"children":2034},"input",{"disabled":2032,"type":2033},true,"checkbox",[],{"type":30,"value":2036}," 已定义审计日志的记录范围，覆盖所有关键操作类型",{"type":24,"tag":43,"props":2038,"children":2040},{"className":2039},[2027],[2041,2044],{"type":24,"tag":2030,"props":2042,"children":2043},{"disabled":2032,"type":2033},[],{"type":30,"value":2045}," 已设计审计日志的数据结构，包含所有必要字段",{"type":24,"tag":43,"props":2047,"children":2049},{"className":2048},[2027],[2050,2053],{"type":24,"tag":2030,"props":2051,"children":2052},{"disabled":2032,"type":2033},[],{"type":30,"value":2054}," 已选择存储方案（WORM Storage / Blockchain / Append-only DB）",{"type":24,"tag":43,"props":2056,"children":2058},{"className":2057},[2027],[2059,2062],{"type":24,"tag":2030,"props":2060,"children":2061},{"disabled":2032,"type":2033},[],{"type":30,"value":2063}," 已实现防篡改机制（数字签名 / 哈希链 / Merkle Tree）",{"type":24,"tag":43,"props":2065,"children":2067},{"className":2066},[2027],[2068,2071],{"type":24,"tag":2030,"props":2069,"children":2070},{"disabled":2032,"type":2033},[],{"type":30,"value":2072}," 已配置日志脱敏规则，防止敏感信息泄露",{"type":24,"tag":43,"props":2074,"children":2076},{"className":2075},[2027],[2077,2080],{"type":24,"tag":2030,"props":2078,"children":2079},{"disabled":2032,"type":2033},[],{"type":30,"value":2081}," 已建立查询接口，支持 SQL 或 DSL 查询",{"type":24,"tag":43,"props":2083,"children":2085},{"className":2084},[2027],[2086,2089],{"type":24,"tag":2030,"props":2087,"children":2088},{"disabled":2032,"type":2033},[],{"type":30,"value":2090}," 已构建可视化看板，实时监控审计日志",{"type":24,"tag":43,"props":2092,"children":2094},{"className":2093},[2027],[2095,2098],{"type":24,"tag":2030,"props":2096,"children":2097},{"disabled":2032,"type":2033},[],{"type":30,"value":2099}," 已配置告警规则，检测异常活动",{"type":24,"tag":43,"props":2101,"children":2103},{"className":2102},[2027],[2104,2107],{"type":24,"tag":2030,"props":2105,"children":2106},{"disabled":2032,"type":2033},[],{"type":30,"value":2108}," 已映射合规要求（SOC 2 / GDPR / HIPAA），确保满足标准",{"type":24,"tag":43,"props":2110,"children":2112},{"className":2111},[2027],[2113,2116],{"type":24,"tag":2030,"props":2114,"children":2115},{"disabled":2032,"type":2033},[],{"type":30,"value":2117}," 已制定日志保留和清理策略，平衡成本和合规需求",{"type":24,"tag":2119,"props":2120,"children":2121},"hr",{},[],{"type":24,"tag":33,"props":2123,"children":2124},{},[2125,2130,2132,2138],{"type":24,"tag":79,"props":2126,"children":2127},{},[2128],{"type":30,"value":2129},"下一步行动",{"type":30,"value":2131},"：阅读 ",{"type":24,"tag":1970,"props":2133,"children":2135},{"href":2134},"./ai-agent-compliance-reporting-automation-evidence",[2136],{"type":30,"value":2137},"AI agent Compliance Reporting 自动化",{"type":30,"value":2139},"，了解如何自动生成 SOC 2、GDPR 和内部审计需要的证据，告别手动准备审计材料。",{"title":7,"searchDepth":2141,"depth":2141,"links":2142},3,[2143,2145,2150,2155,2160,2165,2170,2175,2185,2186],{"id":27,"depth":2144,"text":31},2,{"id":95,"depth":2144,"text":98,"children":2146},[2147,2148,2149],{"id":102,"depth":2141,"text":105},{"id":161,"depth":2141,"text":164},{"id":230,"depth":2141,"text":233},{"id":289,"depth":2144,"text":289,"children":2151},[2152,2153,2154],{"id":294,"depth":2141,"text":294},{"id":495,"depth":2141,"text":495},{"id":513,"depth":2141,"text":516},{"id":548,"depth":2144,"text":548,"children":2156},[2157,2158,2159],{"id":553,"depth":2141,"text":556},{"id":678,"depth":2141,"text":681},{"id":762,"depth":2141,"text":765},{"id":865,"depth":2144,"text":865,"children":2161},[2162,2163,2164],{"id":870,"depth":2141,"text":873},{"id":930,"depth":2141,"text":933},{"id":1009,"depth":2141,"text":1012},{"id":1088,"depth":2144,"text":1088,"children":2166},[2167,2168,2169],{"id":1093,"depth":2141,"text":1096},{"id":1115,"depth":2141,"text":1115},{"id":1237,"depth":2141,"text":1237},{"id":1253,"depth":2144,"text":1253,"children":2171},[2172,2173,2174],{"id":1258,"depth":2141,"text":180},{"id":1317,"depth":2141,"text":190},{"id":1374,"depth":2141,"text":200},{"id":1426,"depth":2144,"text":1429,"children":2176},[2177,2178,2179,2180,2181,2182,2183,2184],{"id":1432,"depth":2141,"text":1435},{"id":1491,"depth":2141,"text":1494},{"id":1549,"depth":2141,"text":1552},{"id":1612,"depth":2141,"text":1615},{"id":1692,"depth":2141,"text":1695},{"id":1750,"depth":2141,"text":1753},{"id":1807,"depth":2141,"text":1810},{"id":1854,"depth":2141,"text":1857},{"id":1960,"depth":2144,"text":1960},{"id":2010,"depth":2144,"text":2013},"markdown","content:topics:ai:ai-agent-operation-audit-trail-immutability.md","content","topics/ai/ai-agent-operation-audit-trail-immutability.md","topics/ai/ai-agent-operation-audit-trail-immutability","md",[2194,3344,4290],{"_path":2195,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":2196,"description":2197,"date":2198,"topic":5,"author":11,"tags":2199,"image":2205,"imageAlt":2206,"pexelsPhotoId":2207,"pexelsUrl":2208,"readingTime":2209,"body":2210,"_type":2187,"_id":3341,"_source":2189,"_file":3342,"_stem":3343,"_extension":2192},"/topics/ai/cursor-keyboard-shortcuts-cheatsheet","Cursor 快捷键速查表（macOS/Windows）：从“会用”到“能提效”的 10 个工作流","把 Cursor 常用快捷键按任务分组（查代码、改代码、多文件、对话、审查与回滚），给出可直接照抄的工作流与最小回归清单，避免“快捷键背了也没变快”。","2026-03-02",[2200,2201,2202,2203,2204],"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":2211,"toc":3315},[2212,2217,2235,2240,2268,2273,2309,2312,2318,2323,2356,2361,2384,2387,2393,2398,2616,2625,2628,2634,2640,2659,2667,2688,2693,2699,2714,2745,2750,2763,2769,2788,2806,2814,2819,2825,2830,2851,2859,2865,2870,2893,2898,2904,2917,2923,2940,2958,2964,2975,2993,2999,3009,3015,3020,3063,3066,3072,3080,3133,3136,3142,3148,3153,3158,3181,3199,3204,3229,3232,3238,3244,3249,3255,3260,3266,3271,3274,3280],{"type":24,"tag":33,"props":2213,"children":2214},{},[2215],{"type":30,"value":2216},"如果你在搜“Cursor 快捷键”，你大概率不是想背一张表，而是想解决这类问题：",{"type":24,"tag":39,"props":2218,"children":2219},{},[2220,2225,2230],{"type":24,"tag":43,"props":2221,"children":2222},{},[2223],{"type":30,"value":2224},"为什么我用了 AI，还是很慢？（对话来回太多、改动不可控）",{"type":24,"tag":43,"props":2226,"children":2227},{},[2228],{"type":30,"value":2229},"为什么它“看起来懂了”，却改错文件/改出回归？（上下文与范围没锁住）",{"type":24,"tag":43,"props":2231,"children":2232},{},[2233],{"type":30,"value":2234},"多文件改动怎么做得安全？（验收、回滚、最小回归集）",{"type":24,"tag":33,"props":2236,"children":2237},{},[2238],{"type":30,"value":2239},"这篇文章给你两份东西：",{"type":24,"tag":2241,"props":2242,"children":2243},"ol",{},[2244,2256],{"type":24,"tag":43,"props":2245,"children":2246},{},[2247,2249,2254],{"type":30,"value":2248},"一张",{"type":24,"tag":79,"props":2250,"children":2251},{},[2252],{"type":30,"value":2253},"按任务分组",{"type":30,"value":2255},"的快捷键表（不是按功能堆在一起）",{"type":24,"tag":43,"props":2257,"children":2258},{},[2259,2261,2266],{"type":30,"value":2260},"一套“从需求到落地”的",{"type":24,"tag":79,"props":2262,"children":2263},{},[2264],{"type":30,"value":2265},"最小闭环工作流",{"type":30,"value":2267},"（每一步都有快捷键）",{"type":24,"tag":33,"props":2269,"children":2270},{},[2271],{"type":30,"value":2272},"想看系统玩法：",{"type":24,"tag":39,"props":2274,"children":2275},{},[2276,2287,2298],{"type":24,"tag":43,"props":2277,"children":2278},{},[2279,2281],{"type":30,"value":2280},"入门教程看：",{"type":24,"tag":1970,"props":2282,"children":2284},{"href":2283},"/topics/ai/cursor-tutorial",[2285],{"type":30,"value":2286},"Cursor 使用教程（2026）",{"type":24,"tag":43,"props":2288,"children":2289},{},[2290,2292],{"type":30,"value":2291},"进阶玩法看：",{"type":24,"tag":1970,"props":2293,"children":2295},{"href":2294},"/topics/ai/cursor-editor-guide",[2296],{"type":30,"value":2297},"Cursor 编辑器深度玩法",{"type":24,"tag":43,"props":2299,"children":2300},{},[2301,2303],{"type":30,"value":2302},"规则与忽略看：",{"type":24,"tag":1970,"props":2304,"children":2306},{"href":2305},"/topics/ai/cursor-rules-cursorrules",[2307],{"type":30,"value":2308},"Cursor Rules 与 .cursorrules",{"type":24,"tag":2119,"props":2310,"children":2311},{},[],{"type":24,"tag":25,"props":2313,"children":2315},{"id":2314},"先给结论提效不是按得快而是闭环更短",[2316],{"type":30,"value":2317},"先给结论：提效不是“按得快”，而是“闭环更短”",{"type":24,"tag":33,"props":2319,"children":2320},{},[2321],{"type":30,"value":2322},"你可以把 Cursor 的快捷键理解为 3 条流水线：",{"type":24,"tag":39,"props":2324,"children":2325},{},[2326,2336,2346],{"type":24,"tag":43,"props":2327,"children":2328},{},[2329,2334],{"type":24,"tag":79,"props":2330,"children":2331},{},[2332],{"type":30,"value":2333},"改一小段",{"type":30,"value":2335},"（内联编辑）：把改动限制在一个函数/一段样式",{"type":24,"tag":43,"props":2337,"children":2338},{},[2339,2344],{"type":24,"tag":79,"props":2340,"children":2341},{},[2342],{"type":30,"value":2343},"改一组文件",{"type":30,"value":2345},"（Composer）：把改动限制在一组明确文件，并要求输出 diff + 验收点",{"type":24,"tag":43,"props":2347,"children":2348},{},[2349,2354],{"type":24,"tag":79,"props":2350,"children":2351},{},[2352],{"type":30,"value":2353},"聊清楚再动手",{"type":30,"value":2355},"（侧边对话）：先对齐目标、范围、验收、回滚",{"type":24,"tag":33,"props":2357,"children":2358},{},[2359],{"type":30,"value":2360},"当你觉得“它乱改/改太大”时，往往不是快捷键没记住，而是缺了两件事：",{"type":24,"tag":39,"props":2362,"children":2363},{},[2364,2374],{"type":24,"tag":43,"props":2365,"children":2366},{},[2367,2369],{"type":30,"value":2368},"没有在动手前锁定",{"type":24,"tag":79,"props":2370,"children":2371},{},[2372],{"type":30,"value":2373},"范围",{"type":24,"tag":43,"props":2375,"children":2376},{},[2377,2379],{"type":30,"value":2378},"没有在接受改动前准备",{"type":24,"tag":79,"props":2380,"children":2381},{},[2382],{"type":30,"value":2383},"验收/回滚",{"type":24,"tag":2119,"props":2385,"children":2386},{},[],{"type":24,"tag":25,"props":2388,"children":2390},{"id":2389},"快捷键速查表按任务分组",[2391],{"type":30,"value":2392},"快捷键速查表（按任务分组）",{"type":24,"tag":33,"props":2394,"children":2395},{},[2396],{"type":30,"value":2397},"说明：下表按“你正在做什么”组织，而不是按“功能名字”组织。不同版本快捷键可能略有差异，但核心逻辑一致。",{"type":24,"tag":298,"props":2399,"children":2400},{},[2401,2427],{"type":24,"tag":302,"props":2402,"children":2403},{},[2404],{"type":24,"tag":306,"props":2405,"children":2406},{},[2407,2412,2417,2422],{"type":24,"tag":310,"props":2408,"children":2409},{},[2410],{"type":30,"value":2411},"任务",{"type":24,"tag":310,"props":2413,"children":2414},{},[2415],{"type":30,"value":2416},"macOS",{"type":24,"tag":310,"props":2418,"children":2419},{},[2420],{"type":30,"value":2421},"Windows",{"type":24,"tag":310,"props":2423,"children":2424},{},[2425],{"type":30,"value":2426},"你该在什么时候用",{"type":24,"tag":326,"props":2428,"children":2429},{},[2430,2461,2492,2523,2554,2585],{"type":24,"tag":306,"props":2431,"children":2432},{},[2433,2438,2447,2456],{"type":24,"tag":333,"props":2434,"children":2435},{},[2436],{"type":30,"value":2437},"改一小段（最安全）",{"type":24,"tag":333,"props":2439,"children":2440},{},[2441],{"type":24,"tag":507,"props":2442,"children":2444},{"className":2443},[],[2445],{"type":30,"value":2446},"Cmd + K",{"type":24,"tag":333,"props":2448,"children":2449},{},[2450],{"type":24,"tag":507,"props":2451,"children":2453},{"className":2452},[],[2454],{"type":30,"value":2455},"Ctrl + K",{"type":24,"tag":333,"props":2457,"children":2458},{},[2459],{"type":30,"value":2460},"只想改一个函数/一段 CSS，不想动别的",{"type":24,"tag":306,"props":2462,"children":2463},{},[2464,2469,2478,2487],{"type":24,"tag":333,"props":2465,"children":2466},{},[2467],{"type":30,"value":2468},"打开 AI 对话（先对齐再动手）",{"type":24,"tag":333,"props":2470,"children":2471},{},[2472],{"type":24,"tag":507,"props":2473,"children":2475},{"className":2474},[],[2476],{"type":30,"value":2477},"Cmd + L",{"type":24,"tag":333,"props":2479,"children":2480},{},[2481],{"type":24,"tag":507,"props":2482,"children":2484},{"className":2483},[],[2485],{"type":30,"value":2486},"Ctrl + L",{"type":24,"tag":333,"props":2488,"children":2489},{},[2490],{"type":30,"value":2491},"需要澄清目标、制定步骤、给验收点",{"type":24,"tag":306,"props":2493,"children":2494},{},[2495,2500,2509,2518],{"type":24,"tag":333,"props":2496,"children":2497},{},[2498],{"type":30,"value":2499},"多文件编辑（有组织地改一组文件）",{"type":24,"tag":333,"props":2501,"children":2502},{},[2503],{"type":24,"tag":507,"props":2504,"children":2506},{"className":2505},[],[2507],{"type":30,"value":2508},"Cmd + I",{"type":24,"tag":333,"props":2510,"children":2511},{},[2512],{"type":24,"tag":507,"props":2513,"children":2515},{"className":2514},[],[2516],{"type":30,"value":2517},"Ctrl + I",{"type":24,"tag":333,"props":2519,"children":2520},{},[2521],{"type":30,"value":2522},"改动涉及多个文件：组件+样式+测试",{"type":24,"tag":306,"props":2524,"children":2525},{},[2526,2531,2540,2549],{"type":24,"tag":333,"props":2527,"children":2528},{},[2529],{"type":30,"value":2530},"把选中代码加入对话上下文",{"type":24,"tag":333,"props":2532,"children":2533},{},[2534],{"type":24,"tag":507,"props":2535,"children":2537},{"className":2536},[],[2538],{"type":30,"value":2539},"Cmd + Shift + L",{"type":24,"tag":333,"props":2541,"children":2542},{},[2543],{"type":24,"tag":507,"props":2544,"children":2546},{"className":2545},[],[2547],{"type":30,"value":2548},"Ctrl + Shift + L",{"type":24,"tag":333,"props":2550,"children":2551},{},[2552],{"type":30,"value":2553},"让 AI 只看你选的片段（降低噪音）",{"type":24,"tag":306,"props":2555,"children":2556},{},[2557,2562,2571,2580],{"type":24,"tag":333,"props":2558,"children":2559},{},[2560],{"type":30,"value":2561},"接受当前建议",{"type":24,"tag":333,"props":2563,"children":2564},{},[2565],{"type":24,"tag":507,"props":2566,"children":2568},{"className":2567},[],[2569],{"type":30,"value":2570},"Cmd + Y",{"type":24,"tag":333,"props":2572,"children":2573},{},[2574],{"type":24,"tag":507,"props":2575,"children":2577},{"className":2576},[],[2578],{"type":30,"value":2579},"Ctrl + Y",{"type":24,"tag":333,"props":2581,"children":2582},{},[2583],{"type":30,"value":2584},"你已经准备好验收/回滚，并确认改动范围",{"type":24,"tag":306,"props":2586,"children":2587},{},[2588,2593,2602,2611],{"type":24,"tag":333,"props":2589,"children":2590},{},[2591],{"type":30,"value":2592},"拒绝当前建议",{"type":24,"tag":333,"props":2594,"children":2595},{},[2596],{"type":24,"tag":507,"props":2597,"children":2599},{"className":2598},[],[2600],{"type":30,"value":2601},"Cmd + N",{"type":24,"tag":333,"props":2603,"children":2604},{},[2605],{"type":24,"tag":507,"props":2606,"children":2608},{"className":2607},[],[2609],{"type":30,"value":2610},"Ctrl + N",{"type":24,"tag":333,"props":2612,"children":2613},{},[2614],{"type":30,"value":2615},"改得太大、改错方向，立刻收手",{"type":24,"tag":2617,"props":2618,"children":2619},"blockquote",{},[2620],{"type":24,"tag":33,"props":2621,"children":2622},{},[2623],{"type":30,"value":2624},"小技巧：把“改一小段”当默认路径。只有当你能清晰写出“会改哪几类文件、怎么验收”时再进入多文件。",{"type":24,"tag":2119,"props":2626,"children":2627},{},[],{"type":24,"tag":25,"props":2629,"children":2631},{"id":2630},"_10-个可直接照抄的提效工作流每个都能闭环",[2632],{"type":30,"value":2633},"10 个可直接照抄的提效工作流（每个都能闭环）",{"type":24,"tag":100,"props":2635,"children":2637},{"id":2636},"工作流-1需求计划小步改新手最稳",[2638],{"type":30,"value":2639},"工作流 1：需求→计划→小步改（新手最稳）",{"type":24,"tag":2241,"props":2641,"children":2642},{},[2643,2654],{"type":24,"tag":43,"props":2644,"children":2645},{},[2646,2652],{"type":24,"tag":507,"props":2647,"children":2649},{"className":2648},[],[2650],{"type":30,"value":2651},"Cmd/Ctrl + L",{"type":30,"value":2653}," 打开对话",{"type":24,"tag":43,"props":2655,"children":2656},{},[2657],{"type":30,"value":2658},"先发这段（可复制）：",{"type":24,"tag":2617,"props":2660,"children":2661},{},[2662],{"type":24,"tag":33,"props":2663,"children":2664},{},[2665],{"type":30,"value":2666},"目标：……\n范围：只修改以下文件/模块：……\n非目标：……（明确不做）\n验收：……（可测试/可手动检查）\n输出格式：先给计划，再逐步执行；每一步写出 diff 摘要。",{"type":24,"tag":2241,"props":2668,"children":2669},{"start":2141},[2670,2675],{"type":24,"tag":43,"props":2671,"children":2672},{},[2673],{"type":30,"value":2674},"让 AI 先给“计划（3~6 步）”，你确认后再执行",{"type":24,"tag":43,"props":2676,"children":2677},{},[2678,2680,2686],{"type":30,"value":2679},"任何一步涉及改代码：优先回到编辑区，选中片段用 ",{"type":24,"tag":507,"props":2681,"children":2683},{"className":2682},[],[2684],{"type":30,"value":2685},"Cmd/Ctrl + K",{"type":30,"value":2687}," 小步改",{"type":24,"tag":33,"props":2689,"children":2690},{},[2691],{"type":30,"value":2692},"为什么有效：你把“想法”变成了“可执行约束”，这就是 GEO（面向 AI/模型的可理解结构）。",{"type":24,"tag":100,"props":2694,"children":2696},{"id":2695},"工作流-2只改一个函数高频低风险",[2697],{"type":30,"value":2698},"工作流 2：只改一个函数（高频、低风险）",{"type":24,"tag":39,"props":2700,"children":2701},{},[2702],{"type":24,"tag":43,"props":2703,"children":2704},{},[2705,2707,2712],{"type":30,"value":2706},"选中函数 → ",{"type":24,"tag":507,"props":2708,"children":2710},{"className":2709},[],[2711],{"type":30,"value":2685},{"type":30,"value":2713}," → 输入指令：",{"type":24,"tag":2617,"props":2715,"children":2716},{},[2717,2722],{"type":24,"tag":33,"props":2718,"children":2719},{},[2720],{"type":30,"value":2721},"把这段改成更可读：",{"type":24,"tag":39,"props":2723,"children":2724},{},[2725,2730,2735,2740],{"type":24,"tag":43,"props":2726,"children":2727},{},[2728],{"type":30,"value":2729},"用 async/await",{"type":24,"tag":43,"props":2731,"children":2732},{},[2733],{"type":30,"value":2734},"错误处理不要吞掉",{"type":24,"tag":43,"props":2736,"children":2737},{},[2738],{"type":30,"value":2739},"添加类型（若可推断）",{"type":24,"tag":43,"props":2741,"children":2742},{},[2743],{"type":30,"value":2744},"不要改函数签名",{"type":24,"tag":33,"props":2746,"children":2747},{},[2748],{"type":30,"value":2749},"验收方式（强制）：",{"type":24,"tag":39,"props":2751,"children":2752},{},[2753,2758],{"type":24,"tag":43,"props":2754,"children":2755},{},[2756],{"type":30,"value":2757},"输出前后函数行为一致（输入/输出）",{"type":24,"tag":43,"props":2759,"children":2760},{},[2761],{"type":30,"value":2762},"失败分支有可观测日志（不要悄悄 return null）",{"type":24,"tag":100,"props":2764,"children":2766},{"id":2765},"工作流-3多文件改动先定文件清单",[2767],{"type":30,"value":2768},"工作流 3：多文件改动（先定“文件清单”）",{"type":24,"tag":2241,"props":2770,"children":2771},{},[2772,2783],{"type":24,"tag":43,"props":2773,"children":2774},{},[2775,2781],{"type":24,"tag":507,"props":2776,"children":2778},{"className":2777},[],[2779],{"type":30,"value":2780},"Cmd/Ctrl + I",{"type":30,"value":2782}," 进入多文件",{"type":24,"tag":43,"props":2784,"children":2785},{},[2786],{"type":30,"value":2787},"先让 AI 输出：",{"type":24,"tag":39,"props":2789,"children":2790},{},[2791,2796,2801],{"type":24,"tag":43,"props":2792,"children":2793},{},[2794],{"type":30,"value":2795},"预计会改哪些文件（最多 5 个）",{"type":24,"tag":43,"props":2797,"children":2798},{},[2799],{"type":30,"value":2800},"每个文件改什么",{"type":24,"tag":43,"props":2802,"children":2803},{},[2804],{"type":30,"value":2805},"每一步怎么验收",{"type":24,"tag":2241,"props":2807,"children":2808},{"start":2141},[2809],{"type":24,"tag":43,"props":2810,"children":2811},{},[2812],{"type":30,"value":2813},"你确认文件清单后再开始生成改动",{"type":24,"tag":33,"props":2815,"children":2816},{},[2817],{"type":30,"value":2818},"关键点：多文件最容易翻车的是“它把你没想到的文件也改了”。所以文件清单是第一道闸门。",{"type":24,"tag":100,"props":2820,"children":2822},{"id":2821},"工作流-4把上下文噪音砍掉防跑偏",[2823],{"type":30,"value":2824},"工作流 4：把“上下文噪音”砍掉（防跑偏）",{"type":24,"tag":33,"props":2826,"children":2827},{},[2828],{"type":30,"value":2829},"当你怀疑它在胡说/乱改时：",{"type":24,"tag":39,"props":2831,"children":2832},{},[2833,2846],{"type":24,"tag":43,"props":2834,"children":2835},{},[2836,2838,2844],{"type":30,"value":2837},"只选择关键代码片段 → ",{"type":24,"tag":507,"props":2839,"children":2841},{"className":2840},[],[2842],{"type":30,"value":2843},"Cmd/Ctrl + Shift + L",{"type":30,"value":2845}," 加入对话",{"type":24,"tag":43,"props":2847,"children":2848},{},[2849],{"type":30,"value":2850},"然后在对话里要求：",{"type":24,"tag":2617,"props":2852,"children":2853},{},[2854],{"type":24,"tag":33,"props":2855,"children":2856},{},[2857],{"type":30,"value":2858},"只基于我提供的代码片段回答，不要假设其它文件存在。",{"type":24,"tag":100,"props":2860,"children":2862},{"id":2861},"工作流-5生成变更说明让-code-review-变快",[2863],{"type":30,"value":2864},"工作流 5：生成变更说明（让 code review 变快）",{"type":24,"tag":33,"props":2866,"children":2867},{},[2868],{"type":30,"value":2869},"改完后在对话里让它输出：",{"type":24,"tag":39,"props":2871,"children":2872},{},[2873,2878,2883,2888],{"type":24,"tag":43,"props":2874,"children":2875},{},[2876],{"type":30,"value":2877},"改动摘要（3~7 条）",{"type":24,"tag":43,"props":2879,"children":2880},{},[2881],{"type":30,"value":2882},"风险点（依赖/边界条件）",{"type":24,"tag":43,"props":2884,"children":2885},{},[2886],{"type":30,"value":2887},"回滚方式",{"type":24,"tag":43,"props":2889,"children":2890},{},[2891],{"type":30,"value":2892},"验收步骤",{"type":24,"tag":33,"props":2894,"children":2895},{},[2896],{"type":30,"value":2897},"这套结构能直接贴进 PR 描述。",{"type":24,"tag":100,"props":2899,"children":2901},{"id":2900},"工作流-6写最小回归集不写回归-等事故",[2902],{"type":30,"value":2903},"工作流 6：写“最小回归集”（不写回归 = 等事故）",{"type":24,"tag":33,"props":2905,"children":2906},{},[2907,2909,2915],{"type":30,"value":2908},"每次改动都至少做 10 条最小回归（见下文清单）。你可以把它写在 ",{"type":24,"tag":507,"props":2910,"children":2912},{"className":2911},[],[2913],{"type":30,"value":2914},"README",{"type":30,"value":2916}," 或团队 wiki。",{"type":24,"tag":100,"props":2918,"children":2920},{"id":2919},"工作流-7把接受建议变成最后一步",[2921],{"type":30,"value":2922},"工作流 7：把“接受建议”变成最后一步",{"type":24,"tag":33,"props":2924,"children":2925},{},[2926,2932,2934,2939],{"type":24,"tag":507,"props":2927,"children":2929},{"className":2928},[],[2930],{"type":30,"value":2931},"Cmd/Ctrl + Y",{"type":30,"value":2933}," 应该是",{"type":24,"tag":79,"props":2935,"children":2936},{},[2937],{"type":30,"value":2938},"最后一步",{"type":30,"value":576},{"type":24,"tag":39,"props":2941,"children":2942},{},[2943,2948,2953],{"type":24,"tag":43,"props":2944,"children":2945},{},[2946],{"type":30,"value":2947},"你已经看过 diff",{"type":24,"tag":43,"props":2949,"children":2950},{},[2951],{"type":30,"value":2952},"你能说清楚“怎么验收”",{"type":24,"tag":43,"props":2954,"children":2955},{},[2956],{"type":30,"value":2957},"你知道“怎么回滚”",{"type":24,"tag":100,"props":2959,"children":2961},{"id":2960},"工作流-8拒绝建议不是失败是风控动作",[2962],{"type":30,"value":2963},"工作流 8：拒绝建议不是失败，是风控动作",{"type":24,"tag":33,"props":2965,"children":2966},{},[2967,2973],{"type":24,"tag":507,"props":2968,"children":2970},{"className":2969},[],[2971],{"type":30,"value":2972},"Cmd/Ctrl + N",{"type":30,"value":2974}," 的使用时机：",{"type":24,"tag":39,"props":2976,"children":2977},{},[2978,2983,2988],{"type":24,"tag":43,"props":2979,"children":2980},{},[2981],{"type":30,"value":2982},"它开始改你没提过的东西（范围漂移）",{"type":24,"tag":43,"props":2984,"children":2985},{},[2986],{"type":30,"value":2987},"它改了 10 个文件但你只想改 1 个",{"type":24,"tag":43,"props":2989,"children":2990},{},[2991],{"type":30,"value":2992},"它为了“更优雅”引入新依赖/新抽象",{"type":24,"tag":100,"props":2994,"children":2996},{"id":2995},"工作流-9重复任务做成模板提示词不是一次性",[2997],{"type":30,"value":2998},"工作流 9：重复任务做成模板（提示词不是一次性）",{"type":24,"tag":33,"props":3000,"children":3001},{},[3002,3004,3008],{"type":30,"value":3003},"把高频任务（比如“写组件+样式+验收”）固化成模板，放进 Rules（见：",{"type":24,"tag":1970,"props":3005,"children":3006},{"href":2305},[3007],{"type":30,"value":2308},{"type":30,"value":545},{"type":24,"tag":100,"props":3010,"children":3012},{"id":3011},"工作流-10把快捷键表做成你自己的任务表",[3013],{"type":30,"value":3014},"工作流 10：把“快捷键表”做成你自己的任务表",{"type":24,"tag":33,"props":3016,"children":3017},{},[3018],{"type":30,"value":3019},"你不需要记住所有快捷键，只需要记住：",{"type":24,"tag":39,"props":3021,"children":3022},{},[3023,3033,3043,3053],{"type":24,"tag":43,"props":3024,"children":3025},{},[3026,3028],{"type":30,"value":3027},"小步改：",{"type":24,"tag":507,"props":3029,"children":3031},{"className":3030},[],[3032],{"type":30,"value":2685},{"type":24,"tag":43,"props":3034,"children":3035},{},[3036,3038],{"type":30,"value":3037},"先对齐：",{"type":24,"tag":507,"props":3039,"children":3041},{"className":3040},[],[3042],{"type":30,"value":2651},{"type":24,"tag":43,"props":3044,"children":3045},{},[3046,3048],{"type":30,"value":3047},"多文件：",{"type":24,"tag":507,"props":3049,"children":3051},{"className":3050},[],[3052],{"type":30,"value":2780},{"type":24,"tag":43,"props":3054,"children":3055},{},[3056,3058],{"type":30,"value":3057},"上下文聚焦：",{"type":24,"tag":507,"props":3059,"children":3061},{"className":3060},[],[3062],{"type":30,"value":2843},{"type":24,"tag":2119,"props":3064,"children":3065},{},[],{"type":24,"tag":25,"props":3067,"children":3069},{"id":3068},"必交付物-1最小回归任务清单10-条通用",[3070],{"type":30,"value":3071},"必交付物 1：最小回归任务清单（10 条，通用）",{"type":24,"tag":2617,"props":3073,"children":3074},{},[3075],{"type":24,"tag":33,"props":3076,"children":3077},{},[3078],{"type":30,"value":3079},"这份清单的意义：让每次 AI 改动都能“被验证”。否则你只是把不可控变成了更快的不可控。",{"type":24,"tag":2241,"props":3081,"children":3082},{},[3083,3088,3093,3098,3103,3108,3113,3118,3123,3128],{"type":24,"tag":43,"props":3084,"children":3085},{},[3086],{"type":30,"value":3087},"关键路径能跑通（手动点击/请求一次）",{"type":24,"tag":43,"props":3089,"children":3090},{},[3091],{"type":30,"value":3092},"错误路径能触发（模拟一次失败输入）",{"type":24,"tag":43,"props":3094,"children":3095},{},[3096],{"type":30,"value":3097},"控制台无新增错误（至少关注 1 次真实操作）",{"type":24,"tag":43,"props":3099,"children":3100},{},[3101],{"type":30,"value":3102},"关键 UI 未错位（移动端/桌面端各看一眼）",{"type":24,"tag":43,"props":3104,"children":3105},{},[3106],{"type":30,"value":3107},"刷新后状态正确（尤其是表单/列表）",{"type":24,"tag":43,"props":3109,"children":3110},{},[3111],{"type":30,"value":3112},"路由跳转没断（从入口到目标页）",{"type":24,"tag":43,"props":3114,"children":3115},{},[3116],{"type":30,"value":3117},"相关接口未改变契约（字段名/类型）",{"type":24,"tag":43,"props":3119,"children":3120},{},[3121],{"type":30,"value":3122},"性能没有明显退化（首屏、交互卡顿）",{"type":24,"tag":43,"props":3124,"children":3125},{},[3126],{"type":30,"value":3127},"回滚方案可执行（知道回滚哪几个文件/commit）",{"type":24,"tag":43,"props":3129,"children":3130},{},[3131],{"type":30,"value":3132},"写下“这次改动解决了什么、风险是什么”（可贴 PR）",{"type":24,"tag":2119,"props":3134,"children":3135},{},[],{"type":24,"tag":25,"props":3137,"children":3139},{"id":3138},"必交付物-2失败案例复盘真实会发生",[3140],{"type":30,"value":3141},"必交付物 2：失败案例复盘（真实会发生）",{"type":24,"tag":100,"props":3143,"children":3145},{"id":3144},"现象快捷键用得很熟但交付还是慢",[3146],{"type":30,"value":3147},"现象：快捷键用得很熟，但交付还是慢",{"type":24,"tag":33,"props":3149,"children":3150},{},[3151],{"type":30,"value":3152},"典型原因：你把 Cursor 当成“更聪明的搜索框”，不断对话，直到它给出你想要的答案。",{"type":24,"tag":33,"props":3154,"children":3155},{},[3156],{"type":30,"value":3157},"复现路径：",{"type":24,"tag":39,"props":3159,"children":3160},{},[3161,3166,3171,3176],{"type":24,"tag":43,"props":3162,"children":3163},{},[3164],{"type":30,"value":3165},"你直接说“把页面做得更好看、更高级”",{"type":24,"tag":43,"props":3167,"children":3168},{},[3169],{"type":30,"value":3170},"AI 开始大改样式、抽象组件、甚至引入新依赖",{"type":24,"tag":43,"props":3172,"children":3173},{},[3174],{"type":30,"value":3175},"你为了省事按了“接受建议”",{"type":24,"tag":43,"props":3177,"children":3178},{},[3179],{"type":30,"value":3180},"最后发现：设计没统一、移动端崩、甚至埋了性能问题",{"type":24,"tag":33,"props":3182,"children":3183},{},[3184,3186,3190,3192,3197],{"type":30,"value":3185},"根因：缺少",{"type":24,"tag":79,"props":3187,"children":3188},{},[3189],{"type":30,"value":2373},{"type":30,"value":3191},"与",{"type":24,"tag":79,"props":3193,"children":3194},{},[3195],{"type":30,"value":3196},"验收",{"type":30,"value":3198},"。",{"type":24,"tag":33,"props":3200,"children":3201},{},[3202],{"type":30,"value":3203},"修复方式（可照抄）：",{"type":24,"tag":39,"props":3205,"children":3206},{},[3207,3212,3224],{"type":24,"tag":43,"props":3208,"children":3209},{},[3210],{"type":30,"value":3211},"把需求拆成 3 个可验证目标：例如“按钮样式统一”“首屏 CTA 更明显”“移动端间距不挤”",{"type":24,"tag":43,"props":3213,"children":3214},{},[3215,3217,3222],{"type":30,"value":3216},"每个目标只用 ",{"type":24,"tag":507,"props":3218,"children":3220},{"className":3219},[],[3221],{"type":30,"value":2685},{"type":30,"value":3223}," 改一个局部",{"type":24,"tag":43,"props":3225,"children":3226},{},[3227],{"type":30,"value":3228},"每次接受建议前跑一遍“最小回归集”",{"type":24,"tag":2119,"props":3230,"children":3231},{},[],{"type":24,"tag":25,"props":3233,"children":3235},{"id":3234},"faq高频问题",[3236],{"type":30,"value":3237},"FAQ（高频问题）",{"type":24,"tag":100,"props":3239,"children":3241},{"id":3240},"q1我应该先记快捷键还是先学工作流",[3242],{"type":30,"value":3243},"Q1：我应该先记快捷键还是先学工作流？",{"type":24,"tag":33,"props":3245,"children":3246},{},[3247],{"type":30,"value":3248},"先学工作流。快捷键只是把工作流的步骤变短。",{"type":24,"tag":100,"props":3250,"children":3252},{"id":3251},"q2为什么我一用多文件就容易翻车",[3253],{"type":30,"value":3254},"Q2：为什么我一用多文件就容易翻车？",{"type":24,"tag":33,"props":3256,"children":3257},{},[3258],{"type":30,"value":3259},"因为多文件意味着范围更大、依赖更多、验收更难。先锁定“文件清单 + 每步验收”，再让它动手。",{"type":24,"tag":100,"props":3261,"children":3263},{"id":3262},"q3有没有万能提示词",[3264],{"type":30,"value":3265},"Q3：有没有“万能提示词”？",{"type":24,"tag":33,"props":3267,"children":3268},{},[3269],{"type":30,"value":3270},"没有，但有“万能结构”：目标、范围、非目标、验收、输出格式。",{"type":24,"tag":2119,"props":3272,"children":3273},{},[],{"type":24,"tag":25,"props":3275,"children":3277},{"id":3276},"延伸阅读建议按顺序",[3278],{"type":30,"value":3279},"延伸阅读（建议按顺序）",{"type":24,"tag":39,"props":3281,"children":3282},{},[3283,3290,3297,3304],{"type":24,"tag":43,"props":3284,"children":3285},{},[3286],{"type":24,"tag":1970,"props":3287,"children":3288},{"href":2283},[3289],{"type":30,"value":2286},{"type":24,"tag":43,"props":3291,"children":3292},{},[3293],{"type":24,"tag":1970,"props":3294,"children":3295},{"href":2294},[3296],{"type":30,"value":2297},{"type":24,"tag":43,"props":3298,"children":3299},{},[3300],{"type":24,"tag":1970,"props":3301,"children":3302},{"href":2305},[3303],{"type":30,"value":2308},{"type":24,"tag":43,"props":3305,"children":3306},{},[3307,3309],{"type":30,"value":3308},"如果你更关心“网页制作落地”：看这篇 ",{"type":24,"tag":1970,"props":3310,"children":3312},{"href":3311},"/topics/practical-tips/htmlpage-quick-landing-page",[3313],{"type":30,"value":3314},"3 分钟用 HTMLPAGE 做落地页",{"title":7,"searchDepth":2141,"depth":2141,"links":3316},[3317,3318,3319,3331,3332,3335,3340],{"id":2314,"depth":2144,"text":2317},{"id":2389,"depth":2144,"text":2392},{"id":2630,"depth":2144,"text":2633,"children":3320},[3321,3322,3323,3324,3325,3326,3327,3328,3329,3330],{"id":2636,"depth":2141,"text":2639},{"id":2695,"depth":2141,"text":2698},{"id":2765,"depth":2141,"text":2768},{"id":2821,"depth":2141,"text":2824},{"id":2861,"depth":2141,"text":2864},{"id":2900,"depth":2141,"text":2903},{"id":2919,"depth":2141,"text":2922},{"id":2960,"depth":2141,"text":2963},{"id":2995,"depth":2141,"text":2998},{"id":3011,"depth":2141,"text":3014},{"id":3068,"depth":2144,"text":3071},{"id":3138,"depth":2144,"text":3141,"children":3333},[3334],{"id":3144,"depth":2141,"text":3147},{"id":3234,"depth":2144,"text":3237,"children":3336},[3337,3338,3339],{"id":3240,"depth":2141,"text":3243},{"id":3251,"depth":2141,"text":3254},{"id":3262,"depth":2141,"text":3265},{"id":3276,"depth":2144,"text":3279},"content:topics:ai:cursor-keyboard-shortcuts-cheatsheet.md","topics/ai/cursor-keyboard-shortcuts-cheatsheet.md","topics/ai/cursor-keyboard-shortcuts-cheatsheet",{"_path":3345,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":3346,"description":3347,"date":3348,"topic":5,"author":11,"tags":3349,"image":3353,"imageAlt":3354,"pexelsPhotoId":3355,"pexelsUrl":3356,"readingTime":19,"body":3357,"_type":2187,"_id":4287,"_source":2189,"_file":4288,"_stem":4289,"_extension":2192},"/topics/ai/cursor-vs-copilot-vscode-workflow","Cursor vs GitHub Copilot vs VS Code：怎么选、怎么搭配、怎么把风险关在笼子里","用“任务类型×风险×验收成本”的选择矩阵解释 Cursor/Copilot/VS Code 的差异，并给出一套可落地的协作工作流（范围闸门、最小回归集、回滚策略）。","2026-03-01",[2200,3350,2203,3351,3352],"GitHub Copilot","AI 编程","工作流","/images/topics/ai/cursor-vs-copilot-vscode-workflow.jpg","团队在电脑前进行协作讨论",1181371,"https://www.pexels.com/photo/man-wearing-blue-dress-shirt-1181371/",{"type":21,"children":3358,"toc":4265},[3359,3364,3369,3387,3392,3410,3413,3419,3424,3455,3460,3463,3469,3477,3681,3689,3702,3705,3711,3717,3730,3735,3748,3754,3759,3792,3798,3803,3821,3824,3830,3835,3841,3846,3879,3885,3898,3903,3916,3922,3934,3940,3945,3958,3963,3966,3972,3977,4098,4101,4107,4117,4126,4144,4153,4161,4170,4188,4191,4195,4201,4206,4212,4217,4220,4224],{"type":24,"tag":33,"props":3360,"children":3361},{},[3362],{"type":30,"value":3363},"“Cursor 和 Copilot 到底有什么区别？”",{"type":24,"tag":33,"props":3365,"children":3366},{},[3367],{"type":30,"value":3368},"这个问题问得越早越好，因为你一旦把工具选错，后面所有痛苦都不是“提示词不够好”，而是：",{"type":24,"tag":39,"props":3370,"children":3371},{},[3372,3377,3382],{"type":24,"tag":43,"props":3373,"children":3374},{},[3375],{"type":30,"value":3376},"改动不可控（范围漂移、改错文件）",{"type":24,"tag":43,"props":3378,"children":3379},{},[3380],{"type":30,"value":3381},"验收成本爆炸（不知道要测什么）",{"type":24,"tag":43,"props":3383,"children":3384},{},[3385],{"type":30,"value":3386},"团队协作崩盘（没有闸门、没有回滚）",{"type":24,"tag":33,"props":3388,"children":3389},{},[3390],{"type":30,"value":3391},"这篇文章用一张选择矩阵 + 一套可执行工作流，帮你做到两件事：",{"type":24,"tag":2241,"props":3393,"children":3394},{},[3395,3400],{"type":24,"tag":43,"props":3396,"children":3397},{},[3398],{"type":30,"value":3399},"知道什么时候用 Cursor、什么时候用 Copilot、什么时候“纯 VS Code 更快”",{"type":24,"tag":43,"props":3401,"children":3402},{},[3403,3405],{"type":30,"value":3404},"就算用 AI，也能把风险关在笼子里：",{"type":24,"tag":79,"props":3406,"children":3407},{},[3408],{"type":30,"value":3409},"可审查、可验证、可回滚",{"type":24,"tag":2119,"props":3411,"children":3412},{},[],{"type":24,"tag":25,"props":3414,"children":3416},{"id":3415},"结论先说三者不是互斥而是分工",[3417],{"type":30,"value":3418},"结论先说：三者不是互斥，而是分工",{"type":24,"tag":33,"props":3420,"children":3421},{},[3422],{"type":30,"value":3423},"你可以把它们看成三层能力：",{"type":24,"tag":39,"props":3425,"children":3426},{},[3427,3436,3446],{"type":24,"tag":43,"props":3428,"children":3429},{},[3430,3434],{"type":24,"tag":79,"props":3431,"children":3432},{},[3433],{"type":30,"value":2203},{"type":30,"value":3435},"：编辑器与生态（调试、插件、任务、终端、语言服务）",{"type":24,"tag":43,"props":3437,"children":3438},{},[3439,3444],{"type":24,"tag":79,"props":3440,"children":3441},{},[3442],{"type":30,"value":3443},"Copilot",{"type":30,"value":3445},"：代码补全与局部建议（“我正在写这一行/这一段”）",{"type":24,"tag":43,"props":3447,"children":3448},{},[3449,3453],{"type":24,"tag":79,"props":3450,"children":3451},{},[3452],{"type":30,"value":2200},{"type":30,"value":3454},"：以项目为单位的 AI 协作（对话、索引、多文件编辑、规则）",{"type":24,"tag":33,"props":3456,"children":3457},{},[3458],{"type":30,"value":3459},"最常见的误区是：把“局部补全能力”当作“能做架构与多文件落地”。",{"type":24,"tag":2119,"props":3461,"children":3462},{},[],{"type":24,"tag":25,"props":3464,"children":3466},{"id":3465},"选择矩阵按任务类型选工具不是按偏好",[3467],{"type":30,"value":3468},"选择矩阵：按任务类型选工具（不是按偏好）",{"type":24,"tag":2617,"props":3470,"children":3471},{},[3472],{"type":24,"tag":33,"props":3473,"children":3474},{},[3475],{"type":30,"value":3476},"你只要把自己的任务放进表格，就能得到推荐路径。",{"type":24,"tag":298,"props":3478,"children":3479},{},[3480,3512],{"type":24,"tag":302,"props":3481,"children":3482},{},[3483],{"type":24,"tag":306,"props":3484,"children":3485},{},[3486,3491,3497,3502,3507],{"type":24,"tag":310,"props":3487,"children":3488},{},[3489],{"type":30,"value":3490},"任务类型",{"type":24,"tag":310,"props":3492,"children":3494},{"align":3493},"right",[3495],{"type":30,"value":3496},"风险",{"type":24,"tag":310,"props":3498,"children":3499},{"align":3493},[3500],{"type":30,"value":3501},"验收成本",{"type":24,"tag":310,"props":3503,"children":3504},{},[3505],{"type":30,"value":3506},"更推荐",{"type":24,"tag":310,"props":3508,"children":3509},{},[3510],{"type":30,"value":3511},"为什么",{"type":24,"tag":326,"props":3513,"children":3514},{},[3515,3542,3575,3601,3628,3655],{"type":24,"tag":306,"props":3516,"children":3517},{},[3518,3523,3528,3532,3537],{"type":24,"tag":333,"props":3519,"children":3520},{},[3521],{"type":30,"value":3522},"写一段代码/补一个 if",{"type":24,"tag":333,"props":3524,"children":3525},{"align":3493},[3526],{"type":30,"value":3527},"低",{"type":24,"tag":333,"props":3529,"children":3530},{"align":3493},[3531],{"type":30,"value":3527},{"type":24,"tag":333,"props":3533,"children":3534},{},[3535],{"type":30,"value":3536},"Copilot / Cursor 内联编辑",{"type":24,"tag":333,"props":3538,"children":3539},{},[3540],{"type":30,"value":3541},"局部建议足够，成本最低",{"type":24,"tag":306,"props":3543,"children":3544},{},[3545,3550,3555,3559,3570],{"type":24,"tag":333,"props":3546,"children":3547},{},[3548],{"type":30,"value":3549},"重构一个函数",{"type":24,"tag":333,"props":3551,"children":3552},{"align":3493},[3553],{"type":30,"value":3554},"中",{"type":24,"tag":333,"props":3556,"children":3557},{"align":3493},[3558],{"type":30,"value":3554},{"type":24,"tag":333,"props":3560,"children":3561},{},[3562,3564],{"type":30,"value":3563},"Cursor ",{"type":24,"tag":507,"props":3565,"children":3567},{"className":3566},[],[3568],{"type":30,"value":3569},"内联编辑",{"type":24,"tag":333,"props":3571,"children":3572},{},[3573],{"type":30,"value":3574},"需要解释、需要约束输出",{"type":24,"tag":306,"props":3576,"children":3577},{},[3578,3583,3587,3591,3596],{"type":24,"tag":333,"props":3579,"children":3580},{},[3581],{"type":30,"value":3582},"改一个组件 + 样式",{"type":24,"tag":333,"props":3584,"children":3585},{"align":3493},[3586],{"type":30,"value":3554},{"type":24,"tag":333,"props":3588,"children":3589},{"align":3493},[3590],{"type":30,"value":3554},{"type":24,"tag":333,"props":3592,"children":3593},{},[3594],{"type":30,"value":3595},"Cursor（小范围多文件）",{"type":24,"tag":333,"props":3597,"children":3598},{},[3599],{"type":30,"value":3600},"需要同时改模板与样式",{"type":24,"tag":306,"props":3602,"children":3603},{},[3604,3609,3614,3618,3623],{"type":24,"tag":333,"props":3605,"children":3606},{},[3607],{"type":30,"value":3608},"改 3~5 个文件（组件+api+测试）",{"type":24,"tag":333,"props":3610,"children":3611},{"align":3493},[3612],{"type":30,"value":3613},"高",{"type":24,"tag":333,"props":3615,"children":3616},{"align":3493},[3617],{"type":30,"value":3613},{"type":24,"tag":333,"props":3619,"children":3620},{},[3621],{"type":30,"value":3622},"Cursor Composer + 闸门",{"type":24,"tag":333,"props":3624,"children":3625},{},[3626],{"type":30,"value":3627},"需要计划、验收、回滚",{"type":24,"tag":306,"props":3629,"children":3630},{},[3631,3636,3641,3645,3650],{"type":24,"tag":333,"props":3632,"children":3633},{},[3634],{"type":30,"value":3635},"重写一段架构/引入新依赖",{"type":24,"tag":333,"props":3637,"children":3638},{"align":3493},[3639],{"type":30,"value":3640},"很高",{"type":24,"tag":333,"props":3642,"children":3643},{"align":3493},[3644],{"type":30,"value":3640},{"type":24,"tag":333,"props":3646,"children":3647},{},[3648],{"type":30,"value":3649},"先人脑设计 + VS Code 实现",{"type":24,"tag":333,"props":3651,"children":3652},{},[3653],{"type":30,"value":3654},"AI 易发散，最好先设计再执行",{"type":24,"tag":306,"props":3656,"children":3657},{},[3658,3663,3667,3671,3676],{"type":24,"tag":333,"props":3659,"children":3660},{},[3661],{"type":30,"value":3662},"排查线上问题/性能抖动",{"type":24,"tag":333,"props":3664,"children":3665},{"align":3493},[3666],{"type":30,"value":3613},{"type":24,"tag":333,"props":3668,"children":3669},{"align":3493},[3670],{"type":30,"value":3640},{"type":24,"tag":333,"props":3672,"children":3673},{},[3674],{"type":30,"value":3675},"VS Code + 工具链优先，AI 辅助归纳",{"type":24,"tag":333,"props":3677,"children":3678},{},[3679],{"type":30,"value":3680},"需要证据，不要“猜”",{"type":24,"tag":33,"props":3682,"children":3683},{},[3684],{"type":24,"tag":79,"props":3685,"children":3686},{},[3687],{"type":30,"value":3688},"一句话规则：",{"type":24,"tag":39,"props":3690,"children":3691},{},[3692,3697],{"type":24,"tag":43,"props":3693,"children":3694},{},[3695],{"type":30,"value":3696},"当你的改动可以用“10 条最小回归集”覆盖时，用 Cursor。",{"type":24,"tag":43,"props":3698,"children":3699},{},[3700],{"type":30,"value":3701},"当你的改动无法验证时，先别让 AI 动手。",{"type":24,"tag":2119,"props":3703,"children":3704},{},[],{"type":24,"tag":25,"props":3706,"children":3708},{"id":3707},"差异拆解到底差在哪里",[3709],{"type":30,"value":3710},"差异拆解：到底差在哪里？",{"type":24,"tag":100,"props":3712,"children":3714},{"id":3713},"_1-上下文来源补全-vs-项目索引",[3715],{"type":30,"value":3716},"1) 上下文来源：补全 vs 项目索引",{"type":24,"tag":39,"props":3718,"children":3719},{},[3720,3725],{"type":24,"tag":43,"props":3721,"children":3722},{},[3723],{"type":30,"value":3724},"Copilot 更擅长：你正在写的这几行、当前文件的局部上下文",{"type":24,"tag":43,"props":3726,"children":3727},{},[3728],{"type":30,"value":3729},"Cursor 更擅长：项目级索引 + 多文件关联理解",{"type":24,"tag":33,"props":3731,"children":3732},{},[3733],{"type":30,"value":3734},"因此：",{"type":24,"tag":39,"props":3736,"children":3737},{},[3738,3743],{"type":24,"tag":43,"props":3739,"children":3740},{},[3741],{"type":30,"value":3742},"写代码片段：Copilot 速度更快",{"type":24,"tag":43,"props":3744,"children":3745},{},[3746],{"type":30,"value":3747},"改一坨工程：Cursor 更有胜算（但更需要闸门）",{"type":24,"tag":100,"props":3749,"children":3751},{"id":3750},"_2-交互方式你能不能控制范围",[3752],{"type":30,"value":3753},"2) 交互方式：你能不能控制范围",{"type":24,"tag":33,"props":3755,"children":3756},{},[3757],{"type":30,"value":3758},"范围控制的三个层级：",{"type":24,"tag":2241,"props":3760,"children":3761},{},[3762,3772,3782],{"type":24,"tag":43,"props":3763,"children":3764},{},[3765,3767],{"type":30,"value":3766},"内联编辑（选中一段）→ ",{"type":24,"tag":79,"props":3768,"children":3769},{},[3770],{"type":30,"value":3771},"最强范围控制",{"type":24,"tag":43,"props":3773,"children":3774},{},[3775,3777],{"type":30,"value":3776},"Composer 多文件（先列文件清单）→ ",{"type":24,"tag":79,"props":3778,"children":3779},{},[3780],{"type":30,"value":3781},"可控但要闸门",{"type":24,"tag":43,"props":3783,"children":3784},{},[3785,3787],{"type":30,"value":3786},"大对话（泛目标）→ ",{"type":24,"tag":79,"props":3788,"children":3789},{},[3790],{"type":30,"value":3791},"最容易跑偏",{"type":24,"tag":100,"props":3793,"children":3795},{"id":3794},"_3-输出形态建议-vs-可审查的变更",[3796],{"type":30,"value":3797},"3) 输出形态：建议 vs 可审查的变更",{"type":24,"tag":33,"props":3799,"children":3800},{},[3801],{"type":30,"value":3802},"最好的 AI 输出不是“给我一段代码”，而是：",{"type":24,"tag":39,"props":3804,"children":3805},{},[3806,3811,3816],{"type":24,"tag":43,"props":3807,"children":3808},{},[3809],{"type":30,"value":3810},"改动摘要（做了什么）",{"type":24,"tag":43,"props":3812,"children":3813},{},[3814],{"type":30,"value":3815},"diff 级别的可审查变更",{"type":24,"tag":43,"props":3817,"children":3818},{},[3819],{"type":30,"value":3820},"验收步骤与回滚方案",{"type":24,"tag":2119,"props":3822,"children":3823},{},[],{"type":24,"tag":25,"props":3825,"children":3827},{"id":3826},"一套可落地的团队工作流把风险关住",[3828],{"type":30,"value":3829},"一套可落地的团队工作流（把风险关住）",{"type":24,"tag":33,"props":3831,"children":3832},{},[3833],{"type":30,"value":3834},"下面这套流程，你可以直接写进团队规范：",{"type":24,"tag":100,"props":3836,"children":3838},{"id":3837},"step-1先写任务单geo-友好结构",[3839],{"type":30,"value":3840},"Step 1：先写任务单（GEO 友好结构）",{"type":24,"tag":33,"props":3842,"children":3843},{},[3844],{"type":30,"value":3845},"模板：",{"type":24,"tag":39,"props":3847,"children":3848},{},[3849,3854,3859,3864,3869,3874],{"type":24,"tag":43,"props":3850,"children":3851},{},[3852],{"type":30,"value":3853},"目标：……",{"type":24,"tag":43,"props":3855,"children":3856},{},[3857],{"type":30,"value":3858},"背景：……",{"type":24,"tag":43,"props":3860,"children":3861},{},[3862],{"type":30,"value":3863},"范围：只改这些文件/模块：……",{"type":24,"tag":43,"props":3865,"children":3866},{},[3867],{"type":30,"value":3868},"非目标：不做哪些事情：……",{"type":24,"tag":43,"props":3870,"children":3871},{},[3872],{"type":30,"value":3873},"验收：如何判断完成（可测试/可观察）：……",{"type":24,"tag":43,"props":3875,"children":3876},{},[3877],{"type":30,"value":3878},"回滚：如果失败怎么撤回：……",{"type":24,"tag":100,"props":3880,"children":3882},{"id":3881},"step-2用范围闸门限制-ai",[3883],{"type":30,"value":3884},"Step 2：用“范围闸门”限制 AI",{"type":24,"tag":39,"props":3886,"children":3887},{},[3888,3893],{"type":24,"tag":43,"props":3889,"children":3890},{},[3891],{"type":30,"value":3892},"单文件改动：优先 Cursor 内联编辑",{"type":24,"tag":43,"props":3894,"children":3895},{},[3896],{"type":30,"value":3897},"多文件改动：必须先让 AI 输出“文件清单（≤5）+ 每步验收”",{"type":24,"tag":33,"props":3899,"children":3900},{},[3901],{"type":30,"value":3902},"如果 AI 输出的文件清单超过 5 个：",{"type":24,"tag":39,"props":3904,"children":3905},{},[3906,3911],{"type":24,"tag":43,"props":3907,"children":3908},{},[3909],{"type":30,"value":3910},"不是它太强，是任务太大",{"type":24,"tag":43,"props":3912,"children":3913},{},[3914],{"type":30,"value":3915},"你需要拆任务，而不是继续推进",{"type":24,"tag":100,"props":3917,"children":3919},{"id":3918},"step-3最小回归集10-条",[3920],{"type":30,"value":3921},"Step 3：最小回归集（10 条）",{"type":24,"tag":33,"props":3923,"children":3924},{},[3925,3927,3932],{"type":30,"value":3926},"每次接受改动前必须跑（可参考：",{"type":24,"tag":1970,"props":3928,"children":3929},{"href":2195},[3930],{"type":30,"value":3931},"Cursor 快捷键速查表",{"type":30,"value":3933}," 里的清单）。",{"type":24,"tag":100,"props":3935,"children":3937},{"id":3936},"step-4回滚策略不用等事故才想",[3938],{"type":30,"value":3939},"Step 4：回滚策略（不用等事故才想）",{"type":24,"tag":33,"props":3941,"children":3942},{},[3943],{"type":30,"value":3944},"回滚最常见的两条路：",{"type":24,"tag":39,"props":3946,"children":3947},{},[3948,3953],{"type":24,"tag":43,"props":3949,"children":3950},{},[3951],{"type":30,"value":3952},"git 回滚 commit",{"type":24,"tag":43,"props":3954,"children":3955},{},[3956],{"type":30,"value":3957},"对关键文件保留前版本（至少能快速恢复）",{"type":24,"tag":33,"props":3959,"children":3960},{},[3961],{"type":30,"value":3962},"你需要做到：任何一轮 AI 改动都能在 5 分钟内撤回。",{"type":24,"tag":2119,"props":3964,"children":3965},{},[],{"type":24,"tag":25,"props":3967,"children":3969},{"id":3968},"必交付物对比矩阵可复制",[3970],{"type":30,"value":3971},"必交付物：对比矩阵（可复制）",{"type":24,"tag":33,"props":3973,"children":3974},{},[3975],{"type":30,"value":3976},"下面这张表可以直接贴到你的团队 wiki：",{"type":24,"tag":298,"props":3978,"children":3979},{},[3980,4003],{"type":24,"tag":302,"props":3981,"children":3982},{},[3983],{"type":24,"tag":306,"props":3984,"children":3985},{},[3986,3991,3995,3999],{"type":24,"tag":310,"props":3987,"children":3988},{},[3989],{"type":30,"value":3990},"维度",{"type":24,"tag":310,"props":3992,"children":3993},{},[3994],{"type":30,"value":2203},{"type":24,"tag":310,"props":3996,"children":3997},{},[3998],{"type":30,"value":3443},{"type":24,"tag":310,"props":4000,"children":4001},{},[4002],{"type":30,"value":2200},{"type":24,"tag":326,"props":4004,"children":4005},{},[4006,4029,4052,4075],{"type":24,"tag":306,"props":4007,"children":4008},{},[4009,4014,4019,4024],{"type":24,"tag":333,"props":4010,"children":4011},{},[4012],{"type":30,"value":4013},"强项",{"type":24,"tag":333,"props":4015,"children":4016},{},[4017],{"type":30,"value":4018},"工具链、调试、生态",{"type":24,"tag":333,"props":4020,"children":4021},{},[4022],{"type":30,"value":4023},"补全与局部建议",{"type":24,"tag":333,"props":4025,"children":4026},{},[4027],{"type":30,"value":4028},"项目上下文、多文件落地",{"type":24,"tag":306,"props":4030,"children":4031},{},[4032,4037,4042,4047],{"type":24,"tag":333,"props":4033,"children":4034},{},[4035],{"type":30,"value":4036},"适合任务",{"type":24,"tag":333,"props":4038,"children":4039},{},[4040],{"type":30,"value":4041},"排查、调试、验证",{"type":24,"tag":333,"props":4043,"children":4044},{},[4045],{"type":30,"value":4046},"写一段、补一段",{"type":24,"tag":333,"props":4048,"children":4049},{},[4050],{"type":30,"value":4051},"改一段、改一组文件",{"type":24,"tag":306,"props":4053,"children":4054},{},[4055,4060,4065,4070],{"type":24,"tag":333,"props":4056,"children":4057},{},[4058],{"type":30,"value":4059},"最大风险",{"type":24,"tag":333,"props":4061,"children":4062},{},[4063],{"type":30,"value":4064},"无",{"type":24,"tag":333,"props":4066,"children":4067},{},[4068],{"type":30,"value":4069},"过度依赖建议",{"type":24,"tag":333,"props":4071,"children":4072},{},[4073],{"type":30,"value":4074},"范围漂移、多文件回归",{"type":24,"tag":306,"props":4076,"children":4077},{},[4078,4083,4088,4093],{"type":24,"tag":333,"props":4079,"children":4080},{},[4081],{"type":30,"value":4082},"必须搭配",{"type":24,"tag":333,"props":4084,"children":4085},{},[4086],{"type":30,"value":4087},"规范与检查",{"type":24,"tag":333,"props":4089,"children":4090},{},[4091],{"type":30,"value":4092},"代码评审",{"type":24,"tag":333,"props":4094,"children":4095},{},[4096],{"type":30,"value":4097},"闸门 + 最小回归集",{"type":24,"tag":2119,"props":4099,"children":4100},{},[],{"type":24,"tag":25,"props":4102,"children":4104},{"id":4103},"失败案例多文件看似成功实际埋雷",[4105],{"type":30,"value":4106},"失败案例：多文件“看似成功”，实际埋雷",{"type":24,"tag":33,"props":4108,"children":4109},{},[4110,4115],{"type":24,"tag":79,"props":4111,"children":4112},{},[4113],{"type":30,"value":4114},"现象",{"type":30,"value":4116},"：AI 说“我已经把所有地方都改了”，你也接受了，结果上线后 404 或样式错位。",{"type":24,"tag":33,"props":4118,"children":4119},{},[4120,4125],{"type":24,"tag":79,"props":4121,"children":4122},{},[4123],{"type":30,"value":4124},"复现条件",{"type":30,"value":576},{"type":24,"tag":39,"props":4127,"children":4128},{},[4129,4134,4139],{"type":24,"tag":43,"props":4130,"children":4131},{},[4132],{"type":30,"value":4133},"你给了一个大目标（例如“把所有按钮统一成主题色”）",{"type":24,"tag":43,"props":4135,"children":4136},{},[4137],{"type":30,"value":4138},"它改了组件、样式、甚至主题配置",{"type":24,"tag":43,"props":4140,"children":4141},{},[4142],{"type":30,"value":4143},"你没有按页面模块走一遍，直接合并",{"type":24,"tag":33,"props":4145,"children":4146},{},[4147,4152],{"type":24,"tag":79,"props":4148,"children":4149},{},[4150],{"type":30,"value":4151},"根因",{"type":30,"value":576},{"type":24,"tag":39,"props":4154,"children":4155},{},[4156],{"type":24,"tag":43,"props":4157,"children":4158},{},[4159],{"type":30,"value":4160},"改动范围大，但验收仍按“小改动”的方式做（只看一处）",{"type":24,"tag":33,"props":4162,"children":4163},{},[4164,4169],{"type":24,"tag":79,"props":4165,"children":4166},{},[4167],{"type":30,"value":4168},"修复",{"type":30,"value":576},{"type":24,"tag":39,"props":4171,"children":4172},{},[4173,4178,4183],{"type":24,"tag":43,"props":4174,"children":4175},{},[4176],{"type":30,"value":4177},"强制把任务拆成“模块级目标”：Hero、Feature、Pricing、Form",{"type":24,"tag":43,"props":4179,"children":4180},{},[4181],{"type":30,"value":4182},"每个模块改完就验收一次",{"type":24,"tag":43,"props":4184,"children":4185},{},[4186],{"type":30,"value":4187},"验收通过再进入下一个模块",{"type":24,"tag":2119,"props":4189,"children":4190},{},[],{"type":24,"tag":25,"props":4192,"children":4193},{"id":1426},[4194],{"type":30,"value":1429},{"type":24,"tag":100,"props":4196,"children":4198},{"id":4197},"q1我已经用了-cursor为什么还要用-copilot",[4199],{"type":30,"value":4200},"Q1：我已经用了 Cursor，为什么还要用 Copilot？",{"type":24,"tag":33,"props":4202,"children":4203},{},[4204],{"type":30,"value":4205},"因为“补全”这种高频低风险任务，Copilot 的交互成本更低；Cursor 更适合需要解释与约束的改动。",{"type":24,"tag":100,"props":4207,"children":4209},{"id":4208},"q2什么时候应该完全不用-ai",[4210],{"type":30,"value":4211},"Q2：什么时候应该完全不用 AI？",{"type":24,"tag":33,"props":4213,"children":4214},{},[4215],{"type":30,"value":4216},"当你无法定义验收标准时。比如“更高级”“更好看”这种目标，先做信息结构与设计规则，再让 AI 帮你落地局部。",{"type":24,"tag":2119,"props":4218,"children":4219},{},[],{"type":24,"tag":25,"props":4221,"children":4222},{"id":1960},[4223],{"type":30,"value":1960},{"type":24,"tag":39,"props":4225,"children":4226},{},[4227,4236,4245,4254],{"type":24,"tag":43,"props":4228,"children":4229},{},[4230,4232],{"type":30,"value":4231},"Cursor 入门：",{"type":24,"tag":1970,"props":4233,"children":4234},{"href":2283},[4235],{"type":30,"value":2286},{"type":24,"tag":43,"props":4237,"children":4238},{},[4239,4241],{"type":30,"value":4240},"Cursor 进阶：",{"type":24,"tag":1970,"props":4242,"children":4243},{"href":2294},[4244],{"type":30,"value":2297},{"type":24,"tag":43,"props":4246,"children":4247},{},[4248,4250],{"type":30,"value":4249},"规则配置：",{"type":24,"tag":1970,"props":4251,"children":4252},{"href":2305},[4253],{"type":30,"value":2308},{"type":24,"tag":43,"props":4255,"children":4256},{},[4257,4259],{"type":30,"value":4258},"Copilot 实战：",{"type":24,"tag":1970,"props":4260,"children":4262},{"href":4261},"/topics/ai/github-copilot-tips",[4263],{"type":30,"value":4264},"GitHub Copilot 实用技巧",{"title":7,"searchDepth":2141,"depth":2141,"links":4266},[4267,4268,4269,4274,4280,4281,4282,4286],{"id":3415,"depth":2144,"text":3418},{"id":3465,"depth":2144,"text":3468},{"id":3707,"depth":2144,"text":3710,"children":4270},[4271,4272,4273],{"id":3713,"depth":2141,"text":3716},{"id":3750,"depth":2141,"text":3753},{"id":3794,"depth":2141,"text":3797},{"id":3826,"depth":2144,"text":3829,"children":4275},[4276,4277,4278,4279],{"id":3837,"depth":2141,"text":3840},{"id":3881,"depth":2141,"text":3884},{"id":3918,"depth":2141,"text":3921},{"id":3936,"depth":2141,"text":3939},{"id":3968,"depth":2144,"text":3971},{"id":4103,"depth":2144,"text":4106},{"id":1426,"depth":2144,"text":1429,"children":4283},[4284,4285],{"id":4197,"depth":2141,"text":4200},{"id":4208,"depth":2141,"text":4211},{"id":1960,"depth":2144,"text":1960},"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":4291,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":4292,"description":4293,"date":4294,"topic":5,"author":11,"tags":4295,"image":4300,"featured":2032,"readingTime":19,"body":4301,"_type":2187,"_id":4945,"_source":2189,"_file":4946,"_stem":4947,"_extension":2192},"/topics/ai/ai-debugging-troubleshooting-guide","AI 辅助调试与问题排查：让 AI 成为你的调试搭档","深入探讨如何利用 AI 工具提升调试效率，包括错误信息分析、日志解读、性能问题定位、复杂 bug 排查等实战场景，构建 AI 驱动的调试工作流。","2026-01-18",[4296,4297,4298,2204,4299],"AI 调试","问题排查","Debug","错误处理","/images/topics/ai/ai-debugging-guide.jpg",{"type":21,"children":4302,"toc":4916},[4303,4309,4315,4320,4325,4330,4336,4342,4347,4355,4383,4391,4414,4420,4430,4439,4447,4455,4488,4496,4526,4539,4547,4552,4560,4568,4577,4583,4591,4602,4610,4619,4625,4631,4636,4645,4651,4656,4665,4671,4677,4686,4692,4701,4707,4716,4722,4728,4737,4743,4752,4758,4764,4772,4778,4787,4795,4803,4806,4812,4817,4836,4848,4851,4857,4862,4871,4876,4879,4885,4890,4908],{"type":24,"tag":25,"props":4304,"children":4306},{"id":4305},"ai-辅助调试与问题排查",[4307],{"type":30,"value":4308},"AI 辅助调试与问题排查",{"type":24,"tag":25,"props":4310,"children":4312},{"id":4311},"引言调试的痛与-ai-的解药",[4313],{"type":30,"value":4314},"引言：调试的痛与 AI 的解药",{"type":24,"tag":33,"props":4316,"children":4317},{},[4318],{"type":30,"value":4319},"调试是每个程序员的日常，也是最消耗时间和精力的工作之一。我们都有过这样的经历：盯着一个莫名其妙的错误信息，翻遍 Stack Overflow，尝试各种方案，几个小时后才发现是一个愚蠢的拼写错误。",{"type":24,"tag":33,"props":4321,"children":4322},{},[4323],{"type":30,"value":4324},"AI 工具的出现，正在改变调试的方式。不是替代你的思考，而是加速你的分析过程——帮你快速理解错误、缩小排查范围、验证假设。",{"type":24,"tag":33,"props":4326,"children":4327},{},[4328],{"type":30,"value":4329},"这篇文章分享我在实际项目中使用 AI 辅助调试的经验和方法论。",{"type":24,"tag":25,"props":4331,"children":4333},{"id":4332},"第一部分建立-ai-调试的思维模型",[4334],{"type":30,"value":4335},"第一部分：建立 AI 调试的思维模型",{"type":24,"tag":100,"props":4337,"children":4339},{"id":4338},"_11-ai-在调试中的角色",[4340],{"type":30,"value":4341},"1.1 AI 在调试中的角色",{"type":24,"tag":33,"props":4343,"children":4344},{},[4345],{"type":30,"value":4346},"把 AI 想象成一个经验丰富但不了解你项目的高级工程师。它：",{"type":24,"tag":33,"props":4348,"children":4349},{},[4350],{"type":24,"tag":79,"props":4351,"children":4352},{},[4353],{"type":30,"value":4354},"擅长的事情：",{"type":24,"tag":39,"props":4356,"children":4357},{},[4358,4363,4368,4373,4378],{"type":24,"tag":43,"props":4359,"children":4360},{},[4361],{"type":30,"value":4362},"解读错误信息的含义",{"type":24,"tag":43,"props":4364,"children":4365},{},[4366],{"type":30,"value":4367},"提供可能的原因列表",{"type":24,"tag":43,"props":4369,"children":4370},{},[4371],{"type":30,"value":4372},"给出排查方向建议",{"type":24,"tag":43,"props":4374,"children":4375},{},[4376],{"type":30,"value":4377},"解释复杂的技术概念",{"type":24,"tag":43,"props":4379,"children":4380},{},[4381],{"type":30,"value":4382},"生成调试代码片段",{"type":24,"tag":33,"props":4384,"children":4385},{},[4386],{"type":24,"tag":79,"props":4387,"children":4388},{},[4389],{"type":30,"value":4390},"不擅长的事情：",{"type":24,"tag":39,"props":4392,"children":4393},{},[4394,4399,4404,4409],{"type":24,"tag":43,"props":4395,"children":4396},{},[4397],{"type":30,"value":4398},"了解你的业务逻辑",{"type":24,"tag":43,"props":4400,"children":4401},{},[4402],{"type":30,"value":4403},"知道你的代码历史",{"type":24,"tag":43,"props":4405,"children":4406},{},[4407],{"type":30,"value":4408},"理解项目特定的约定",{"type":24,"tag":43,"props":4410,"children":4411},{},[4412],{"type":30,"value":4413},"做出架构级判断",{"type":24,"tag":100,"props":4415,"children":4417},{"id":4416},"_12-有效提问的结构",[4418],{"type":30,"value":4419},"1.2 有效提问的结构",{"type":24,"tag":499,"props":4421,"children":4425},{"code":4422,"language":2187,"meta":7,"className":4423},"## 高效的调试提问模板\n\n**问题描述**\n[简洁描述遇到的问题]\n\n**错误信息**\n",[4424],"language-markdown",[4426],{"type":24,"tag":507,"props":4427,"children":4428},{"__ignoreMap":7},[4429],{"type":30,"value":4422},{"type":24,"tag":33,"props":4431,"children":4432},{},[4433],{"type":24,"tag":4434,"props":4435,"children":4436},"span",{},[4437],{"type":30,"value":4438},"完整的错误信息，不要截断",{"type":24,"tag":499,"props":4440,"children":4442},{"code":4441},"\n**相关代码**\n```javascript\n[精简但完整的相关代码]\n",[4443],{"type":24,"tag":507,"props":4444,"children":4445},{"__ignoreMap":7},[4446],{"type":30,"value":4441},{"type":24,"tag":33,"props":4448,"children":4449},{},[4450],{"type":24,"tag":79,"props":4451,"children":4452},{},[4453],{"type":30,"value":4454},"环境信息",{"type":24,"tag":39,"props":4456,"children":4457},{},[4458,4468,4478],{"type":24,"tag":43,"props":4459,"children":4460},{},[4461,4463],{"type":30,"value":4462},"运行环境：",{"type":24,"tag":4434,"props":4464,"children":4465},{},[4466],{"type":30,"value":4467},"Node 版本/浏览器版本",{"type":24,"tag":43,"props":4469,"children":4470},{},[4471,4473],{"type":30,"value":4472},"框架版本：",{"type":24,"tag":4434,"props":4474,"children":4475},{},[4476],{"type":30,"value":4477},"相关框架版本",{"type":24,"tag":43,"props":4479,"children":4480},{},[4481,4483],{"type":30,"value":4482},"操作系统：",{"type":24,"tag":4434,"props":4484,"children":4485},{},[4486],{"type":30,"value":4487},"如果相关",{"type":24,"tag":33,"props":4489,"children":4490},{},[4491],{"type":24,"tag":79,"props":4492,"children":4493},{},[4494],{"type":30,"value":4495},"已尝试的方案",{"type":24,"tag":39,"props":4497,"children":4498},{},[4499,4513],{"type":24,"tag":43,"props":4500,"children":4501},{},[4502,4507,4508],{"type":24,"tag":4434,"props":4503,"children":4504},{},[4505],{"type":30,"value":4506},"方案1",{"type":30,"value":576},{"type":24,"tag":4434,"props":4509,"children":4510},{},[4511],{"type":30,"value":4512},"结果",{"type":24,"tag":43,"props":4514,"children":4515},{},[4516,4521,4522],{"type":24,"tag":4434,"props":4517,"children":4518},{},[4519],{"type":30,"value":4520},"方案2",{"type":30,"value":576},{"type":24,"tag":4434,"props":4523,"children":4524},{},[4525],{"type":30,"value":4512},{"type":24,"tag":33,"props":4527,"children":4528},{},[4529,4534],{"type":24,"tag":79,"props":4530,"children":4531},{},[4532],{"type":30,"value":4533},"期望的结果",{"type":24,"tag":4434,"props":4535,"children":4536},{},[4537],{"type":30,"value":4538},"描述期望的行为",{"type":24,"tag":499,"props":4540,"children":4542},{"code":4541},"\n### 1.3 分级调试策略\n\n",[4543],{"type":24,"tag":507,"props":4544,"children":4545},{"__ignoreMap":7},[4546],{"type":30,"value":4541},{"type":24,"tag":33,"props":4548,"children":4549},{},[4550],{"type":30,"value":4551},"┌───────────────────────────────────────────────────────────┐\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":499,"props":4553,"children":4555},{"code":4554},"\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",[4556],{"type":24,"tag":507,"props":4557,"children":4558},{"__ignoreMap":7},[4559],{"type":30,"value":4554},{"type":24,"tag":33,"props":4561,"children":4562},{},[4563],{"type":24,"tag":79,"props":4564,"children":4565},{},[4566],{"type":30,"value":4567},"场景 2：Vue 响应式警告",{"type":24,"tag":499,"props":4569,"children":4572},{"code":4570,"language":502,"meta":7,"className":4571},"// 警告信息：\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",[504],[4573],{"type":24,"tag":507,"props":4574,"children":4575},{"__ignoreMap":7},[4576],{"type":30,"value":4570},{"type":24,"tag":100,"props":4578,"children":4580},{"id":4579},"_22-后端错误分析",[4581],{"type":30,"value":4582},"2.2 后端错误分析",{"type":24,"tag":33,"props":4584,"children":4585},{},[4586],{"type":24,"tag":79,"props":4587,"children":4588},{},[4589],{"type":30,"value":4590},"场景 1：Node.js 内存问题",{"type":24,"tag":499,"props":4592,"children":4597},{"code":4593,"language":4594,"meta":7,"className":4595},"// 错误信息：\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",[4596],"language-javascript",[4598],{"type":24,"tag":507,"props":4599,"children":4600},{"__ignoreMap":7},[4601],{"type":30,"value":4593},{"type":24,"tag":33,"props":4603,"children":4604},{},[4605],{"type":24,"tag":79,"props":4606,"children":4607},{},[4608],{"type":30,"value":4609},"场景 2：数据库连接问题",{"type":24,"tag":499,"props":4611,"children":4614},{"code":4612,"language":502,"meta":7,"className":4613},"// 错误信息：\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",[504],[4615],{"type":24,"tag":507,"props":4616,"children":4617},{"__ignoreMap":7},[4618],{"type":30,"value":4612},{"type":24,"tag":25,"props":4620,"children":4622},{"id":4621},"第三部分日志分析与问题定位",[4623],{"type":30,"value":4624},"第三部分：日志分析与问题定位",{"type":24,"tag":100,"props":4626,"children":4628},{"id":4627},"_31-结构化日志分析",[4629],{"type":30,"value":4630},"3.1 结构化日志分析",{"type":24,"tag":33,"props":4632,"children":4633},{},[4634],{"type":30,"value":4635},"当面对大量日志时，让 AI 帮你快速定位问题：",{"type":24,"tag":499,"props":4637,"children":4640},{"code":4638,"language":4594,"meta":7,"className":4639},"// 提问示例：\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",[4596],[4641],{"type":24,"tag":507,"props":4642,"children":4643},{"__ignoreMap":7},[4644],{"type":30,"value":4638},{"type":24,"tag":100,"props":4646,"children":4648},{"id":4647},"_32-创建调试日志",[4649],{"type":30,"value":4650},"3.2 创建调试日志",{"type":24,"tag":33,"props":4652,"children":4653},{},[4654],{"type":30,"value":4655},"让 AI 帮你生成调试用的日志代码：",{"type":24,"tag":499,"props":4657,"children":4660},{"code":4658,"language":502,"meta":7,"className":4659},"// 请求：\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",[504],[4661],{"type":24,"tag":507,"props":4662,"children":4663},{"__ignoreMap":7},[4664],{"type":30,"value":4658},{"type":24,"tag":25,"props":4666,"children":4668},{"id":4667},"第四部分性能问题排查",[4669],{"type":30,"value":4670},"第四部分：性能问题排查",{"type":24,"tag":100,"props":4672,"children":4674},{"id":4673},"_41-前端性能分析",[4675],{"type":30,"value":4676},"4.1 前端性能分析",{"type":24,"tag":499,"props":4678,"children":4681},{"code":4679,"language":502,"meta":7,"className":4680},"// 场景：页面加载慢，需要分析原因\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",[504],[4682],{"type":24,"tag":507,"props":4683,"children":4684},{"__ignoreMap":7},[4685],{"type":30,"value":4679},{"type":24,"tag":100,"props":4687,"children":4689},{"id":4688},"_42-内存泄漏排查",[4690],{"type":30,"value":4691},"4.2 内存泄漏排查",{"type":24,"tag":499,"props":4693,"children":4696},{"code":4694,"language":502,"meta":7,"className":4695},"// 场景：应用运行一段时间后变卡\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",[504],[4697],{"type":24,"tag":507,"props":4698,"children":4699},{"__ignoreMap":7},[4700],{"type":30,"value":4694},{"type":24,"tag":100,"props":4702,"children":4704},{"id":4703},"_43-数据库查询优化",[4705],{"type":30,"value":4706},"4.3 数据库查询优化",{"type":24,"tag":499,"props":4708,"children":4711},{"code":4709,"language":1105,"meta":7,"className":4710},"-- 场景：查询很慢，让 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",[1107],[4712],{"type":24,"tag":507,"props":4713,"children":4714},{"__ignoreMap":7},[4715],{"type":30,"value":4709},{"type":24,"tag":25,"props":4717,"children":4719},{"id":4718},"第五部分复杂-bug-排查",[4720],{"type":30,"value":4721},"第五部分：复杂 Bug 排查",{"type":24,"tag":100,"props":4723,"children":4725},{"id":4724},"_51-竞态条件",[4726],{"type":30,"value":4727},"5.1 竞态条件",{"type":24,"tag":499,"props":4729,"children":4732},{"code":4730,"language":502,"meta":7,"className":4731},"// 场景：偶发的数据不一致问题\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",[504],[4733],{"type":24,"tag":507,"props":4734,"children":4735},{"__ignoreMap":7},[4736],{"type":30,"value":4730},{"type":24,"tag":100,"props":4738,"children":4740},{"id":4739},"_52-分布式系统问题",[4741],{"type":30,"value":4742},"5.2 分布式系统问题",{"type":24,"tag":499,"props":4744,"children":4747},{"code":4745,"language":502,"meta":7,"className":4746},"// 场景：微服务间的数据不一致\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",[504],[4748],{"type":24,"tag":507,"props":4749,"children":4750},{"__ignoreMap":7},[4751],{"type":30,"value":4745},{"type":24,"tag":25,"props":4753,"children":4755},{"id":4754},"第六部分ai-调试工作流",[4756],{"type":30,"value":4757},"第六部分：AI 调试工作流",{"type":24,"tag":100,"props":4759,"children":4761},{"id":4760},"_61-我的调试流程",[4762],{"type":30,"value":4763},"6.1 我的调试流程",{"type":24,"tag":499,"props":4765,"children":4767},{"code":4766},"┌────────────────────────────────────────────────────────────┐\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",[4768],{"type":24,"tag":507,"props":4769,"children":4770},{"__ignoreMap":7},[4771],{"type":30,"value":4766},{"type":24,"tag":100,"props":4773,"children":4775},{"id":4774},"_62-调试对话模板",[4776],{"type":30,"value":4777},"6.2 调试对话模板",{"type":24,"tag":499,"props":4779,"children":4782},{"code":4780,"language":2187,"meta":7,"className":4781},"## 第一轮：问题描述\n\n我遇到了一个问题：[简述问题]\n\n错误信息：\n",[4424],[4783],{"type":24,"tag":507,"props":4784,"children":4785},{"__ignoreMap":7},[4786],{"type":30,"value":4780},{"type":24,"tag":33,"props":4788,"children":4789},{},[4790],{"type":24,"tag":4434,"props":4791,"children":4792},{},[4793],{"type":30,"value":4794},"粘贴完整错误",{"type":24,"tag":499,"props":4796,"children":4798},{"code":4797},"\n相关代码：\n```javascript\n[粘贴代码]\n",[4799],{"type":24,"tag":507,"props":4800,"children":4801},{"__ignoreMap":7},[4802],{"type":30,"value":4797},{"type":24,"tag":2119,"props":4804,"children":4805},{},[],{"type":24,"tag":25,"props":4807,"children":4809},{"id":4808},"第二轮补充信息",[4810],{"type":30,"value":4811},"第二轮：补充信息",{"type":24,"tag":33,"props":4813,"children":4814},{},[4815],{"type":30,"value":4816},"根据你的建议，我添加了日志，发现：",{"type":24,"tag":39,"props":4818,"children":4819},{},[4820,4828],{"type":24,"tag":43,"props":4821,"children":4822},{},[4823],{"type":24,"tag":4434,"props":4824,"children":4825},{},[4826],{"type":30,"value":4827},"发现 1",{"type":24,"tag":43,"props":4829,"children":4830},{},[4831],{"type":24,"tag":4434,"props":4832,"children":4833},{},[4834],{"type":30,"value":4835},"发现 2",{"type":24,"tag":33,"props":4837,"children":4838},{},[4839,4841,4846],{"type":30,"value":4840},"这是否说明问题出在 ",{"type":24,"tag":4434,"props":4842,"children":4843},{},[4844],{"type":30,"value":4845},"你的猜测",{"type":30,"value":4847},"？",{"type":24,"tag":2119,"props":4849,"children":4850},{},[],{"type":24,"tag":25,"props":4852,"children":4854},{"id":4853},"第三轮确认修复",[4855],{"type":30,"value":4856},"第三轮：确认修复",{"type":24,"tag":33,"props":4858,"children":4859},{},[4860],{"type":30,"value":4861},"我按照你的建议修改了代码：",{"type":24,"tag":499,"props":4863,"children":4866},{"code":4864,"language":4594,"meta":7,"className":4865},"[粘贴修改后的代码]\n",[4596],[4867],{"type":24,"tag":507,"props":4868,"children":4869},{"__ignoreMap":7},[4870],{"type":30,"value":4864},{"type":24,"tag":33,"props":4872,"children":4873},{},[4874],{"type":30,"value":4875},"请确认这个修复是否正确，以及是否有其他潜在问题。",{"type":24,"tag":2119,"props":4877,"children":4878},{},[],{"type":24,"tag":25,"props":4880,"children":4882},{"id":4881},"第四轮预防",[4883],{"type":30,"value":4884},"第四轮：预防",{"type":24,"tag":33,"props":4886,"children":4887},{},[4888],{"type":30,"value":4889},"这个问题已解决。请建议：",{"type":24,"tag":2241,"props":4891,"children":4892},{},[4893,4898,4903],{"type":24,"tag":43,"props":4894,"children":4895},{},[4896],{"type":30,"value":4897},"如何防止类似问题再次发生？",{"type":24,"tag":43,"props":4899,"children":4900},{},[4901],{"type":30,"value":4902},"应该添加什么测试用例？",{"type":24,"tag":43,"props":4904,"children":4905},{},[4906],{"type":30,"value":4907},"有什么最佳实践可以参考？",{"type":24,"tag":499,"props":4909,"children":4911},{"code":4910},"\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",[4912],{"type":24,"tag":507,"props":4913,"children":4914},{"__ignoreMap":7},[4915],{"type":30,"value":4910},{"title":7,"searchDepth":2141,"depth":2141,"links":4917},[4918,4919,4920,4925,4929,4934,4938,4942,4943,4944],{"id":4305,"depth":2144,"text":4308},{"id":4311,"depth":2144,"text":4314},{"id":4332,"depth":2144,"text":4335,"children":4921},[4922,4923,4924],{"id":4338,"depth":2141,"text":4341},{"id":4416,"depth":2141,"text":4419},{"id":4579,"depth":2141,"text":4582},{"id":4621,"depth":2144,"text":4624,"children":4926},[4927,4928],{"id":4627,"depth":2141,"text":4630},{"id":4647,"depth":2141,"text":4650},{"id":4667,"depth":2144,"text":4670,"children":4930},[4931,4932,4933],{"id":4673,"depth":2141,"text":4676},{"id":4688,"depth":2141,"text":4691},{"id":4703,"depth":2141,"text":4706},{"id":4718,"depth":2144,"text":4721,"children":4935},[4936,4937],{"id":4724,"depth":2141,"text":4727},{"id":4739,"depth":2141,"text":4742},{"id":4754,"depth":2144,"text":4757,"children":4939},[4940,4941],{"id":4760,"depth":2141,"text":4763},{"id":4774,"depth":2141,"text":4777},{"id":4808,"depth":2144,"text":4811},{"id":4853,"depth":2144,"text":4856},{"id":4881,"depth":2144,"text":4884},"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":4949,"image":18,"featured":6,"readingTime":19,"body":4950,"_type":2187,"_id":2188,"_source":2189,"_file":2190,"_stem":2191,"_extension":2192},[13,14,15,16,17],{"type":21,"children":4951,"toc":6703},[4952,4956,4960,4983,4987,5001,5005,5009,5013,5048,5052,5056,5060,5103,5107,5111,5115,5150,5154,5158,5162,5330,5334,5342,5346,5354,5368,5372,5376,5384,5392,5419,5427,5442,5450,5461,5469,5476,5480,5488,5496,5504,5512,5527,5535,5550,5554,5562,5570,5597,5605,5620,5628,5639,5643,5647,5655,5663,5671,5679,5694,5698,5706,5714,5722,5730,5741,5749,5764,5768,5776,5784,5792,5800,5815,5823,5834,5838,5842,5846,5854,5858,5862,5869,5884,5891,5902,5909,5920,5927,5957,5961,5969,5973,5977,5985,6000,6008,6023,6027,6035,6050,6058,6073,6077,6085,6096,6104,6119,6123,6127,6135,6170,6174,6182,6217,6221,6229,6272,6276,6284,6337,6341,6349,6384,6388,6396,6431,6435,6443,6462,6470,6474,6482,6517,6521,6556,6560,6595,6599,6603,6687,6690],{"type":24,"tag":25,"props":4953,"children":4954},{"id":27},[4955],{"type":30,"value":31},{"type":24,"tag":33,"props":4957,"children":4958},{},[4959],{"type":30,"value":37},{"type":24,"tag":39,"props":4961,"children":4962},{},[4963,4967,4971,4975,4979],{"type":24,"tag":43,"props":4964,"children":4965},{},[4966],{"type":30,"value":47},{"type":24,"tag":43,"props":4968,"children":4969},{},[4970],{"type":30,"value":52},{"type":24,"tag":43,"props":4972,"children":4973},{},[4974],{"type":30,"value":57},{"type":24,"tag":43,"props":4976,"children":4977},{},[4978],{"type":30,"value":62},{"type":24,"tag":43,"props":4980,"children":4981},{},[4982],{"type":30,"value":67},{"type":24,"tag":33,"props":4984,"children":4985},{},[4986],{"type":30,"value":72},{"type":24,"tag":33,"props":4988,"children":4989},{},[4990,4991,4995,4996,5000],{"type":30,"value":77},{"type":24,"tag":79,"props":4992,"children":4993},{},[4994],{"type":30,"value":83},{"type":30,"value":85},{"type":24,"tag":79,"props":4997,"children":4998},{},[4999],{"type":30,"value":90},{"type":30,"value":92},{"type":24,"tag":25,"props":5002,"children":5003},{"id":95},[5004],{"type":30,"value":98},{"type":24,"tag":100,"props":5006,"children":5007},{"id":102},[5008],{"type":30,"value":105},{"type":24,"tag":33,"props":5010,"children":5011},{},[5012],{"type":30,"value":110},{"type":24,"tag":39,"props":5014,"children":5015},{},[5016,5024,5032,5040],{"type":24,"tag":43,"props":5017,"children":5018},{},[5019,5023],{"type":24,"tag":79,"props":5020,"children":5021},{},[5022],{"type":30,"value":121},{"type":30,"value":123},{"type":24,"tag":43,"props":5025,"children":5026},{},[5027,5031],{"type":24,"tag":79,"props":5028,"children":5029},{},[5030],{"type":30,"value":131},{"type":30,"value":133},{"type":24,"tag":43,"props":5033,"children":5034},{},[5035,5039],{"type":24,"tag":79,"props":5036,"children":5037},{},[5038],{"type":30,"value":141},{"type":30,"value":143},{"type":24,"tag":43,"props":5041,"children":5042},{},[5043,5047],{"type":24,"tag":79,"props":5044,"children":5045},{},[5046],{"type":30,"value":151},{"type":30,"value":153},{"type":24,"tag":33,"props":5049,"children":5050},{},[5051],{"type":30,"value":158},{"type":24,"tag":100,"props":5053,"children":5054},{"id":161},[5055],{"type":30,"value":164},{"type":24,"tag":33,"props":5057,"children":5058},{},[5059],{"type":30,"value":169},{"type":24,"tag":39,"props":5061,"children":5062},{},[5063,5071,5079,5087,5095],{"type":24,"tag":43,"props":5064,"children":5065},{},[5066,5070],{"type":24,"tag":79,"props":5067,"children":5068},{},[5069],{"type":30,"value":180},{"type":30,"value":182},{"type":24,"tag":43,"props":5072,"children":5073},{},[5074,5078],{"type":24,"tag":79,"props":5075,"children":5076},{},[5077],{"type":30,"value":190},{"type":30,"value":192},{"type":24,"tag":43,"props":5080,"children":5081},{},[5082,5086],{"type":24,"tag":79,"props":5083,"children":5084},{},[5085],{"type":30,"value":200},{"type":30,"value":202},{"type":24,"tag":43,"props":5088,"children":5089},{},[5090,5094],{"type":24,"tag":79,"props":5091,"children":5092},{},[5093],{"type":30,"value":210},{"type":30,"value":212},{"type":24,"tag":43,"props":5096,"children":5097},{},[5098,5102],{"type":24,"tag":79,"props":5099,"children":5100},{},[5101],{"type":30,"value":220},{"type":30,"value":222},{"type":24,"tag":33,"props":5104,"children":5105},{},[5106],{"type":30,"value":227},{"type":24,"tag":100,"props":5108,"children":5109},{"id":230},[5110],{"type":30,"value":233},{"type":24,"tag":33,"props":5112,"children":5113},{},[5114],{"type":30,"value":238},{"type":24,"tag":39,"props":5116,"children":5117},{},[5118,5126,5134,5142],{"type":24,"tag":43,"props":5119,"children":5120},{},[5121,5125],{"type":24,"tag":79,"props":5122,"children":5123},{},[5124],{"type":30,"value":249},{"type":30,"value":251},{"type":24,"tag":43,"props":5127,"children":5128},{},[5129,5133],{"type":24,"tag":79,"props":5130,"children":5131},{},[5132],{"type":30,"value":259},{"type":30,"value":261},{"type":24,"tag":43,"props":5135,"children":5136},{},[5137,5141],{"type":24,"tag":79,"props":5138,"children":5139},{},[5140],{"type":30,"value":269},{"type":30,"value":271},{"type":24,"tag":43,"props":5143,"children":5144},{},[5145,5149],{"type":24,"tag":79,"props":5146,"children":5147},{},[5148],{"type":30,"value":279},{"type":30,"value":281},{"type":24,"tag":33,"props":5151,"children":5152},{},[5153],{"type":30,"value":286},{"type":24,"tag":25,"props":5155,"children":5156},{"id":289},[5157],{"type":30,"value":289},{"type":24,"tag":100,"props":5159,"children":5160},{"id":294},[5161],{"type":30,"value":294},{"type":24,"tag":298,"props":5163,"children":5164},{},[5165,5183],{"type":24,"tag":302,"props":5166,"children":5167},{},[5168],{"type":24,"tag":306,"props":5169,"children":5170},{},[5171,5175,5179],{"type":24,"tag":310,"props":5172,"children":5173},{},[5174],{"type":30,"value":314},{"type":24,"tag":310,"props":5176,"children":5177},{},[5178],{"type":30,"value":319},{"type":24,"tag":310,"props":5180,"children":5181},{},[5182],{"type":30,"value":324},{"type":24,"tag":326,"props":5184,"children":5185},{},[5186,5204,5222,5240,5258,5276,5294,5312],{"type":24,"tag":306,"props":5187,"children":5188},{},[5189,5196,5200],{"type":24,"tag":333,"props":5190,"children":5191},{},[5192],{"type":24,"tag":79,"props":5193,"children":5194},{},[5195],{"type":30,"value":340},{"type":24,"tag":333,"props":5197,"children":5198},{},[5199],{"type":30,"value":345},{"type":24,"tag":333,"props":5201,"children":5202},{},[5203],{"type":30,"value":350},{"type":24,"tag":306,"props":5205,"children":5206},{},[5207,5214,5218],{"type":24,"tag":333,"props":5208,"children":5209},{},[5210],{"type":24,"tag":79,"props":5211,"children":5212},{},[5213],{"type":30,"value":361},{"type":24,"tag":333,"props":5215,"children":5216},{},[5217],{"type":30,"value":366},{"type":24,"tag":333,"props":5219,"children":5220},{},[5221],{"type":30,"value":350},{"type":24,"tag":306,"props":5223,"children":5224},{},[5225,5232,5236],{"type":24,"tag":333,"props":5226,"children":5227},{},[5228],{"type":24,"tag":79,"props":5229,"children":5230},{},[5231],{"type":30,"value":381},{"type":24,"tag":333,"props":5233,"children":5234},{},[5235],{"type":30,"value":386},{"type":24,"tag":333,"props":5237,"children":5238},{},[5239],{"type":30,"value":350},{"type":24,"tag":306,"props":5241,"children":5242},{},[5243,5250,5254],{"type":24,"tag":333,"props":5244,"children":5245},{},[5246],{"type":24,"tag":79,"props":5247,"children":5248},{},[5249],{"type":30,"value":401},{"type":24,"tag":333,"props":5251,"children":5252},{},[5253],{"type":30,"value":406},{"type":24,"tag":333,"props":5255,"children":5256},{},[5257],{"type":30,"value":411},{"type":24,"tag":306,"props":5259,"children":5260},{},[5261,5268,5272],{"type":24,"tag":333,"props":5262,"children":5263},{},[5264],{"type":24,"tag":79,"props":5265,"children":5266},{},[5267],{"type":30,"value":422},{"type":24,"tag":333,"props":5269,"children":5270},{},[5271],{"type":30,"value":427},{"type":24,"tag":333,"props":5273,"children":5274},{},[5275],{"type":30,"value":411},{"type":24,"tag":306,"props":5277,"children":5278},{},[5279,5286,5290],{"type":24,"tag":333,"props":5280,"children":5281},{},[5282],{"type":24,"tag":79,"props":5283,"children":5284},{},[5285],{"type":30,"value":442},{"type":24,"tag":333,"props":5287,"children":5288},{},[5289],{"type":30,"value":447},{"type":24,"tag":333,"props":5291,"children":5292},{},[5293],{"type":30,"value":411},{"type":24,"tag":306,"props":5295,"children":5296},{},[5297,5304,5308],{"type":24,"tag":333,"props":5298,"children":5299},{},[5300],{"type":24,"tag":79,"props":5301,"children":5302},{},[5303],{"type":30,"value":462},{"type":24,"tag":333,"props":5305,"children":5306},{},[5307],{"type":30,"value":467},{"type":24,"tag":333,"props":5309,"children":5310},{},[5311],{"type":30,"value":472},{"type":24,"tag":306,"props":5313,"children":5314},{},[5315,5322,5326],{"type":24,"tag":333,"props":5316,"children":5317},{},[5318],{"type":24,"tag":79,"props":5319,"children":5320},{},[5321],{"type":30,"value":483},{"type":24,"tag":333,"props":5323,"children":5324},{},[5325],{"type":30,"value":488},{"type":24,"tag":333,"props":5327,"children":5328},{},[5329],{"type":30,"value":472},{"type":24,"tag":100,"props":5331,"children":5332},{"id":495},[5333],{"type":30,"value":495},{"type":24,"tag":499,"props":5335,"children":5337},{"code":501,"language":502,"meta":7,"className":5336},[504],[5338],{"type":24,"tag":507,"props":5339,"children":5340},{"__ignoreMap":7},[5341],{"type":30,"value":501},{"type":24,"tag":100,"props":5343,"children":5344},{"id":513},[5345],{"type":30,"value":516},{"type":24,"tag":499,"props":5347,"children":5349},{"code":519,"language":520,"meta":7,"className":5348},[522],[5350],{"type":24,"tag":507,"props":5351,"children":5352},{"__ignoreMap":7},[5353],{"type":30,"value":519},{"type":24,"tag":33,"props":5355,"children":5356},{},[5357,5361,5362,5367],{"type":24,"tag":79,"props":5358,"children":5359},{},[5360],{"type":30,"value":535},{"type":30,"value":537},{"type":24,"tag":507,"props":5363,"children":5365},{"className":5364},[],[5366],{"type":30,"value":543},{"type":30,"value":545},{"type":24,"tag":25,"props":5369,"children":5370},{"id":548},[5371],{"type":30,"value":548},{"type":24,"tag":100,"props":5373,"children":5374},{"id":553},[5375],{"type":30,"value":556},{"type":24,"tag":33,"props":5377,"children":5378},{},[5379,5383],{"type":24,"tag":79,"props":5380,"children":5381},{},[5382],{"type":30,"value":564},{"type":30,"value":566},{"type":24,"tag":33,"props":5385,"children":5386},{},[5387,5391],{"type":24,"tag":79,"props":5388,"children":5389},{},[5390],{"type":30,"value":574},{"type":30,"value":576},{"type":24,"tag":39,"props":5393,"children":5394},{},[5395,5403,5411],{"type":24,"tag":43,"props":5396,"children":5397},{},[5398,5402],{"type":24,"tag":79,"props":5399,"children":5400},{},[5401],{"type":30,"value":587},{"type":30,"value":589},{"type":24,"tag":43,"props":5404,"children":5405},{},[5406,5410],{"type":24,"tag":79,"props":5407,"children":5408},{},[5409],{"type":30,"value":597},{"type":30,"value":599},{"type":24,"tag":43,"props":5412,"children":5413},{},[5414,5418],{"type":24,"tag":79,"props":5415,"children":5416},{},[5417],{"type":30,"value":607},{"type":30,"value":609},{"type":24,"tag":33,"props":5420,"children":5421},{},[5422,5426],{"type":24,"tag":79,"props":5423,"children":5424},{},[5425],{"type":30,"value":617},{"type":30,"value":576},{"type":24,"tag":39,"props":5428,"children":5429},{},[5430,5434,5438],{"type":24,"tag":43,"props":5431,"children":5432},{},[5433],{"type":30,"value":626},{"type":24,"tag":43,"props":5435,"children":5436},{},[5437],{"type":30,"value":631},{"type":24,"tag":43,"props":5439,"children":5440},{},[5441],{"type":30,"value":636},{"type":24,"tag":33,"props":5443,"children":5444},{},[5445,5449],{"type":24,"tag":79,"props":5446,"children":5447},{},[5448],{"type":30,"value":644},{"type":30,"value":576},{"type":24,"tag":39,"props":5451,"children":5452},{},[5453,5457],{"type":24,"tag":43,"props":5454,"children":5455},{},[5456],{"type":30,"value":653},{"type":24,"tag":43,"props":5458,"children":5459},{},[5460],{"type":30,"value":658},{"type":24,"tag":33,"props":5462,"children":5463},{},[5464,5468],{"type":24,"tag":79,"props":5465,"children":5466},{},[5467],{"type":30,"value":666},{"type":30,"value":576},{"type":24,"tag":499,"props":5470,"children":5471},{"code":670},[5472],{"type":24,"tag":507,"props":5473,"children":5474},{"__ignoreMap":7},[5475],{"type":30,"value":670},{"type":24,"tag":100,"props":5477,"children":5478},{"id":678},[5479],{"type":30,"value":681},{"type":24,"tag":33,"props":5481,"children":5482},{},[5483,5487],{"type":24,"tag":79,"props":5484,"children":5485},{},[5486],{"type":30,"value":564},{"type":30,"value":690},{"type":24,"tag":33,"props":5489,"children":5490},{},[5491,5495],{"type":24,"tag":79,"props":5492,"children":5493},{},[5494],{"type":30,"value":574},{"type":30,"value":576},{"type":24,"tag":499,"props":5497,"children":5499},{"code":701,"language":502,"meta":7,"className":5498},[504],[5500],{"type":24,"tag":507,"props":5501,"children":5502},{"__ignoreMap":7},[5503],{"type":30,"value":701},{"type":24,"tag":33,"props":5505,"children":5506},{},[5507,5511],{"type":24,"tag":79,"props":5508,"children":5509},{},[5510],{"type":30,"value":617},{"type":30,"value":576},{"type":24,"tag":39,"props":5513,"children":5514},{},[5515,5519,5523],{"type":24,"tag":43,"props":5516,"children":5517},{},[5518],{"type":30,"value":723},{"type":24,"tag":43,"props":5520,"children":5521},{},[5522],{"type":30,"value":728},{"type":24,"tag":43,"props":5524,"children":5525},{},[5526],{"type":30,"value":733},{"type":24,"tag":33,"props":5528,"children":5529},{},[5530,5534],{"type":24,"tag":79,"props":5531,"children":5532},{},[5533],{"type":30,"value":644},{"type":30,"value":576},{"type":24,"tag":39,"props":5536,"children":5537},{},[5538,5542,5546],{"type":24,"tag":43,"props":5539,"children":5540},{},[5541],{"type":30,"value":749},{"type":24,"tag":43,"props":5543,"children":5544},{},[5545],{"type":30,"value":754},{"type":24,"tag":43,"props":5547,"children":5548},{},[5549],{"type":30,"value":759},{"type":24,"tag":100,"props":5551,"children":5552},{"id":762},[5553],{"type":30,"value":765},{"type":24,"tag":33,"props":5555,"children":5556},{},[5557,5561],{"type":24,"tag":79,"props":5558,"children":5559},{},[5560],{"type":30,"value":564},{"type":30,"value":774},{"type":24,"tag":33,"props":5563,"children":5564},{},[5565,5569],{"type":24,"tag":79,"props":5566,"children":5567},{},[5568],{"type":30,"value":574},{"type":30,"value":576},{"type":24,"tag":39,"props":5571,"children":5572},{},[5573,5581,5589],{"type":24,"tag":43,"props":5574,"children":5575},{},[5576,5580],{"type":24,"tag":79,"props":5577,"children":5578},{},[5579],{"type":30,"value":793},{"type":30,"value":795},{"type":24,"tag":43,"props":5582,"children":5583},{},[5584,5588],{"type":24,"tag":79,"props":5585,"children":5586},{},[5587],{"type":30,"value":803},{"type":30,"value":805},{"type":24,"tag":43,"props":5590,"children":5591},{},[5592,5596],{"type":24,"tag":79,"props":5593,"children":5594},{},[5595],{"type":30,"value":813},{"type":30,"value":815},{"type":24,"tag":33,"props":5598,"children":5599},{},[5600,5604],{"type":24,"tag":79,"props":5601,"children":5602},{},[5603],{"type":30,"value":617},{"type":30,"value":576},{"type":24,"tag":39,"props":5606,"children":5607},{},[5608,5612,5616],{"type":24,"tag":43,"props":5609,"children":5610},{},[5611],{"type":30,"value":831},{"type":24,"tag":43,"props":5613,"children":5614},{},[5615],{"type":30,"value":836},{"type":24,"tag":43,"props":5617,"children":5618},{},[5619],{"type":30,"value":841},{"type":24,"tag":33,"props":5621,"children":5622},{},[5623,5627],{"type":24,"tag":79,"props":5624,"children":5625},{},[5626],{"type":30,"value":644},{"type":30,"value":576},{"type":24,"tag":39,"props":5629,"children":5630},{},[5631,5635],{"type":24,"tag":43,"props":5632,"children":5633},{},[5634],{"type":30,"value":857},{"type":24,"tag":43,"props":5636,"children":5637},{},[5638],{"type":30,"value":862},{"type":24,"tag":25,"props":5640,"children":5641},{"id":865},[5642],{"type":30,"value":865},{"type":24,"tag":100,"props":5644,"children":5645},{"id":870},[5646],{"type":30,"value":873},{"type":24,"tag":33,"props":5648,"children":5649},{},[5650,5654],{"type":24,"tag":79,"props":5651,"children":5652},{},[5653],{"type":30,"value":564},{"type":30,"value":882},{"type":24,"tag":33,"props":5656,"children":5657},{},[5658,5662],{"type":24,"tag":79,"props":5659,"children":5660},{},[5661],{"type":30,"value":890},{"type":30,"value":576},{"type":24,"tag":499,"props":5664,"children":5666},{"code":894,"language":502,"meta":7,"className":5665},[504],[5667],{"type":24,"tag":507,"props":5668,"children":5669},{"__ignoreMap":7},[5670],{"type":30,"value":894},{"type":24,"tag":33,"props":5672,"children":5673},{},[5674,5678],{"type":24,"tag":79,"props":5675,"children":5676},{},[5677],{"type":30,"value":908},{"type":30,"value":576},{"type":24,"tag":39,"props":5680,"children":5681},{},[5682,5686,5690],{"type":24,"tag":43,"props":5683,"children":5684},{},[5685],{"type":30,"value":917},{"type":24,"tag":43,"props":5687,"children":5688},{},[5689],{"type":30,"value":922},{"type":24,"tag":43,"props":5691,"children":5692},{},[5693],{"type":30,"value":927},{"type":24,"tag":100,"props":5695,"children":5696},{"id":930},[5697],{"type":30,"value":933},{"type":24,"tag":33,"props":5699,"children":5700},{},[5701,5705],{"type":24,"tag":79,"props":5702,"children":5703},{},[5704],{"type":30,"value":564},{"type":30,"value":942},{"type":24,"tag":33,"props":5707,"children":5708},{},[5709,5713],{"type":24,"tag":79,"props":5710,"children":5711},{},[5712],{"type":30,"value":890},{"type":30,"value":576},{"type":24,"tag":499,"props":5715,"children":5717},{"code":953,"language":502,"meta":7,"className":5716},[504],[5718],{"type":24,"tag":507,"props":5719,"children":5720},{"__ignoreMap":7},[5721],{"type":30,"value":953},{"type":24,"tag":33,"props":5723,"children":5724},{},[5725,5729],{"type":24,"tag":79,"props":5726,"children":5727},{},[5728],{"type":30,"value":617},{"type":30,"value":576},{"type":24,"tag":39,"props":5731,"children":5732},{},[5733,5737],{"type":24,"tag":43,"props":5734,"children":5735},{},[5736],{"type":30,"value":975},{"type":24,"tag":43,"props":5738,"children":5739},{},[5740],{"type":30,"value":980},{"type":24,"tag":33,"props":5742,"children":5743},{},[5744,5748],{"type":24,"tag":79,"props":5745,"children":5746},{},[5747],{"type":30,"value":644},{"type":30,"value":576},{"type":24,"tag":39,"props":5750,"children":5751},{},[5752,5756,5760],{"type":24,"tag":43,"props":5753,"children":5754},{},[5755],{"type":30,"value":996},{"type":24,"tag":43,"props":5757,"children":5758},{},[5759],{"type":30,"value":1001},{"type":24,"tag":43,"props":5761,"children":5762},{},[5763],{"type":30,"value":1006},{"type":24,"tag":100,"props":5765,"children":5766},{"id":1009},[5767],{"type":30,"value":1012},{"type":24,"tag":33,"props":5769,"children":5770},{},[5771,5775],{"type":24,"tag":79,"props":5772,"children":5773},{},[5774],{"type":30,"value":564},{"type":30,"value":1021},{"type":24,"tag":33,"props":5777,"children":5778},{},[5779,5783],{"type":24,"tag":79,"props":5780,"children":5781},{},[5782],{"type":30,"value":890},{"type":30,"value":576},{"type":24,"tag":499,"props":5785,"children":5787},{"code":1032,"language":502,"meta":7,"className":5786},[504],[5788],{"type":24,"tag":507,"props":5789,"children":5790},{"__ignoreMap":7},[5791],{"type":30,"value":1032},{"type":24,"tag":33,"props":5793,"children":5794},{},[5795,5799],{"type":24,"tag":79,"props":5796,"children":5797},{},[5798],{"type":30,"value":617},{"type":30,"value":576},{"type":24,"tag":39,"props":5801,"children":5802},{},[5803,5807,5811],{"type":24,"tag":43,"props":5804,"children":5805},{},[5806],{"type":30,"value":1054},{"type":24,"tag":43,"props":5808,"children":5809},{},[5810],{"type":30,"value":1059},{"type":24,"tag":43,"props":5812,"children":5813},{},[5814],{"type":30,"value":1064},{"type":24,"tag":33,"props":5816,"children":5817},{},[5818,5822],{"type":24,"tag":79,"props":5819,"children":5820},{},[5821],{"type":30,"value":644},{"type":30,"value":576},{"type":24,"tag":39,"props":5824,"children":5825},{},[5826,5830],{"type":24,"tag":43,"props":5827,"children":5828},{},[5829],{"type":30,"value":1080},{"type":24,"tag":43,"props":5831,"children":5832},{},[5833],{"type":30,"value":1085},{"type":24,"tag":25,"props":5835,"children":5836},{"id":1088},[5837],{"type":30,"value":1088},{"type":24,"tag":100,"props":5839,"children":5840},{"id":1093},[5841],{"type":30,"value":1096},{"type":24,"tag":33,"props":5843,"children":5844},{},[5845],{"type":30,"value":1101},{"type":24,"tag":499,"props":5847,"children":5849},{"code":1104,"language":1105,"meta":7,"className":5848},[1107],[5850],{"type":24,"tag":507,"props":5851,"children":5852},{"__ignoreMap":7},[5853],{"type":30,"value":1104},{"type":24,"tag":100,"props":5855,"children":5856},{"id":1115},[5857],{"type":30,"value":1115},{"type":24,"tag":33,"props":5859,"children":5860},{},[5861],{"type":30,"value":1122},{"type":24,"tag":33,"props":5863,"children":5864},{},[5865],{"type":24,"tag":79,"props":5866,"children":5867},{},[5868],{"type":30,"value":1130},{"type":24,"tag":39,"props":5870,"children":5871},{},[5872,5876,5880],{"type":24,"tag":43,"props":5873,"children":5874},{},[5875],{"type":30,"value":1138},{"type":24,"tag":43,"props":5877,"children":5878},{},[5879],{"type":30,"value":1143},{"type":24,"tag":43,"props":5881,"children":5882},{},[5883],{"type":30,"value":1148},{"type":24,"tag":33,"props":5885,"children":5886},{},[5887],{"type":24,"tag":79,"props":5888,"children":5889},{},[5890],{"type":30,"value":1156},{"type":24,"tag":39,"props":5892,"children":5893},{},[5894,5898],{"type":24,"tag":43,"props":5895,"children":5896},{},[5897],{"type":30,"value":1164},{"type":24,"tag":43,"props":5899,"children":5900},{},[5901],{"type":30,"value":1169},{"type":24,"tag":33,"props":5903,"children":5904},{},[5905],{"type":24,"tag":79,"props":5906,"children":5907},{},[5908],{"type":30,"value":1177},{"type":24,"tag":39,"props":5910,"children":5911},{},[5912,5916],{"type":24,"tag":43,"props":5913,"children":5914},{},[5915],{"type":30,"value":1185},{"type":24,"tag":43,"props":5917,"children":5918},{},[5919],{"type":30,"value":1190},{"type":24,"tag":33,"props":5921,"children":5922},{},[5923],{"type":24,"tag":79,"props":5924,"children":5925},{},[5926],{"type":30,"value":1198},{"type":24,"tag":39,"props":5928,"children":5929},{},[5930],{"type":24,"tag":43,"props":5931,"children":5932},{},[5933,5934],{"type":30,"value":1206},{"type":24,"tag":39,"props":5935,"children":5936},{},[5937,5941,5945,5949,5953],{"type":24,"tag":43,"props":5938,"children":5939},{},[5940],{"type":30,"value":1214},{"type":24,"tag":43,"props":5942,"children":5943},{},[5944],{"type":30,"value":1219},{"type":24,"tag":43,"props":5946,"children":5947},{},[5948],{"type":30,"value":1224},{"type":24,"tag":43,"props":5950,"children":5951},{},[5952],{"type":30,"value":1229},{"type":24,"tag":43,"props":5954,"children":5955},{},[5956],{"type":30,"value":1234},{"type":24,"tag":100,"props":5958,"children":5959},{"id":1237},[5960],{"type":30,"value":1237},{"type":24,"tag":499,"props":5962,"children":5964},{"code":1242,"language":1243,"meta":7,"className":5963},[1245],[5965],{"type":24,"tag":507,"props":5966,"children":5967},{"__ignoreMap":7},[5968],{"type":30,"value":1242},{"type":24,"tag":25,"props":5970,"children":5971},{"id":1253},[5972],{"type":30,"value":1253},{"type":24,"tag":100,"props":5974,"children":5975},{"id":1258},[5976],{"type":30,"value":180},{"type":24,"tag":33,"props":5978,"children":5979},{},[5980,5984],{"type":24,"tag":79,"props":5981,"children":5982},{},[5983],{"type":30,"value":1268},{"type":30,"value":576},{"type":24,"tag":39,"props":5986,"children":5987},{},[5988,5992,5996],{"type":24,"tag":43,"props":5989,"children":5990},{},[5991],{"type":30,"value":1277},{"type":24,"tag":43,"props":5993,"children":5994},{},[5995],{"type":30,"value":1282},{"type":24,"tag":43,"props":5997,"children":5998},{},[5999],{"type":30,"value":1287},{"type":24,"tag":33,"props":6001,"children":6002},{},[6003,6007],{"type":24,"tag":79,"props":6004,"children":6005},{},[6006],{"type":30,"value":1295},{"type":30,"value":576},{"type":24,"tag":39,"props":6009,"children":6010},{},[6011,6015,6019],{"type":24,"tag":43,"props":6012,"children":6013},{},[6014],{"type":30,"value":1304},{"type":24,"tag":43,"props":6016,"children":6017},{},[6018],{"type":30,"value":1309},{"type":24,"tag":43,"props":6020,"children":6021},{},[6022],{"type":30,"value":1314},{"type":24,"tag":100,"props":6024,"children":6025},{"id":1317},[6026],{"type":30,"value":190},{"type":24,"tag":33,"props":6028,"children":6029},{},[6030,6034],{"type":24,"tag":79,"props":6031,"children":6032},{},[6033],{"type":30,"value":1268},{"type":30,"value":576},{"type":24,"tag":39,"props":6036,"children":6037},{},[6038,6042,6046],{"type":24,"tag":43,"props":6039,"children":6040},{},[6041],{"type":30,"value":1335},{"type":24,"tag":43,"props":6043,"children":6044},{},[6045],{"type":30,"value":1340},{"type":24,"tag":43,"props":6047,"children":6048},{},[6049],{"type":30,"value":1345},{"type":24,"tag":33,"props":6051,"children":6052},{},[6053,6057],{"type":24,"tag":79,"props":6054,"children":6055},{},[6056],{"type":30,"value":1295},{"type":30,"value":576},{"type":24,"tag":39,"props":6059,"children":6060},{},[6061,6065,6069],{"type":24,"tag":43,"props":6062,"children":6063},{},[6064],{"type":30,"value":1361},{"type":24,"tag":43,"props":6066,"children":6067},{},[6068],{"type":30,"value":1366},{"type":24,"tag":43,"props":6070,"children":6071},{},[6072],{"type":30,"value":1371},{"type":24,"tag":100,"props":6074,"children":6075},{"id":1374},[6076],{"type":30,"value":200},{"type":24,"tag":33,"props":6078,"children":6079},{},[6080,6084],{"type":24,"tag":79,"props":6081,"children":6082},{},[6083],{"type":30,"value":1268},{"type":30,"value":576},{"type":24,"tag":39,"props":6086,"children":6087},{},[6088,6092],{"type":24,"tag":43,"props":6089,"children":6090},{},[6091],{"type":30,"value":1392},{"type":24,"tag":43,"props":6093,"children":6094},{},[6095],{"type":30,"value":1397},{"type":24,"tag":33,"props":6097,"children":6098},{},[6099,6103],{"type":24,"tag":79,"props":6100,"children":6101},{},[6102],{"type":30,"value":1295},{"type":30,"value":576},{"type":24,"tag":39,"props":6105,"children":6106},{},[6107,6111,6115],{"type":24,"tag":43,"props":6108,"children":6109},{},[6110],{"type":30,"value":1413},{"type":24,"tag":43,"props":6112,"children":6113},{},[6114],{"type":30,"value":1418},{"type":24,"tag":43,"props":6116,"children":6117},{},[6118],{"type":30,"value":1423},{"type":24,"tag":25,"props":6120,"children":6121},{"id":1426},[6122],{"type":30,"value":1429},{"type":24,"tag":100,"props":6124,"children":6125},{"id":1432},[6126],{"type":30,"value":1435},{"type":24,"tag":33,"props":6128,"children":6129},{},[6130,6134],{"type":24,"tag":79,"props":6131,"children":6132},{},[6133],{"type":30,"value":1443},{"type":30,"value":1445},{"type":24,"tag":39,"props":6136,"children":6137},{},[6138,6146,6154,6162],{"type":24,"tag":43,"props":6139,"children":6140},{},[6141,6145],{"type":24,"tag":79,"props":6142,"children":6143},{},[6144],{"type":30,"value":1456},{"type":30,"value":1458},{"type":24,"tag":43,"props":6147,"children":6148},{},[6149,6153],{"type":24,"tag":79,"props":6150,"children":6151},{},[6152],{"type":30,"value":1466},{"type":30,"value":1468},{"type":24,"tag":43,"props":6155,"children":6156},{},[6157,6161],{"type":24,"tag":79,"props":6158,"children":6159},{},[6160],{"type":30,"value":1476},{"type":30,"value":1478},{"type":24,"tag":43,"props":6163,"children":6164},{},[6165,6169],{"type":24,"tag":79,"props":6166,"children":6167},{},[6168],{"type":30,"value":1486},{"type":30,"value":1488},{"type":24,"tag":100,"props":6171,"children":6172},{"id":1491},[6173],{"type":30,"value":1494},{"type":24,"tag":33,"props":6175,"children":6176},{},[6177,6181],{"type":24,"tag":79,"props":6178,"children":6179},{},[6180],{"type":30,"value":1443},{"type":30,"value":1503},{"type":24,"tag":39,"props":6183,"children":6184},{},[6185,6193,6201,6209],{"type":24,"tag":43,"props":6186,"children":6187},{},[6188,6192],{"type":24,"tag":79,"props":6189,"children":6190},{},[6191],{"type":30,"value":1514},{"type":30,"value":1516},{"type":24,"tag":43,"props":6194,"children":6195},{},[6196,6200],{"type":24,"tag":79,"props":6197,"children":6198},{},[6199],{"type":30,"value":1524},{"type":30,"value":1526},{"type":24,"tag":43,"props":6202,"children":6203},{},[6204,6208],{"type":24,"tag":79,"props":6205,"children":6206},{},[6207],{"type":30,"value":1534},{"type":30,"value":1536},{"type":24,"tag":43,"props":6210,"children":6211},{},[6212,6216],{"type":24,"tag":79,"props":6213,"children":6214},{},[6215],{"type":30,"value":1544},{"type":30,"value":1546},{"type":24,"tag":100,"props":6218,"children":6219},{"id":1549},[6220],{"type":30,"value":1552},{"type":24,"tag":33,"props":6222,"children":6223},{},[6224,6228],{"type":24,"tag":79,"props":6225,"children":6226},{},[6227],{"type":30,"value":1443},{"type":30,"value":1561},{"type":24,"tag":39,"props":6230,"children":6231},{},[6232,6240,6248,6256,6264],{"type":24,"tag":43,"props":6233,"children":6234},{},[6235,6239],{"type":24,"tag":79,"props":6236,"children":6237},{},[6238],{"type":30,"value":180},{"type":30,"value":1573},{"type":24,"tag":43,"props":6241,"children":6242},{},[6243,6247],{"type":24,"tag":79,"props":6244,"children":6245},{},[6246],{"type":30,"value":190},{"type":30,"value":1582},{"type":24,"tag":43,"props":6249,"children":6250},{},[6251,6255],{"type":24,"tag":79,"props":6252,"children":6253},{},[6254],{"type":30,"value":200},{"type":30,"value":1591},{"type":24,"tag":43,"props":6257,"children":6258},{},[6259,6263],{"type":24,"tag":79,"props":6260,"children":6261},{},[6262],{"type":30,"value":210},{"type":30,"value":1573},{"type":24,"tag":43,"props":6265,"children":6266},{},[6267,6271],{"type":24,"tag":79,"props":6268,"children":6269},{},[6270],{"type":30,"value":1607},{"type":30,"value":1609},{"type":24,"tag":100,"props":6273,"children":6274},{"id":1612},[6275],{"type":30,"value":1615},{"type":24,"tag":33,"props":6277,"children":6278},{},[6279,6283],{"type":24,"tag":79,"props":6280,"children":6281},{},[6282],{"type":30,"value":1443},{"type":30,"value":1445},{"type":24,"tag":39,"props":6285,"children":6286},{},[6287,6313,6321,6329],{"type":24,"tag":43,"props":6288,"children":6289},{},[6290,6294,6295,6300,6301,6306,6307,6312],{"type":24,"tag":79,"props":6291,"children":6292},{},[6293],{"type":30,"value":1634},{"type":30,"value":1636},{"type":24,"tag":507,"props":6296,"children":6298},{"className":6297},[],[6299],{"type":30,"value":1642},{"type":30,"value":1644},{"type":24,"tag":507,"props":6302,"children":6304},{"className":6303},[],[6305],{"type":30,"value":1650},{"type":30,"value":1644},{"type":24,"tag":507,"props":6308,"children":6310},{"className":6309},[],[6311],{"type":30,"value":1657},{"type":30,"value":1659},{"type":24,"tag":43,"props":6314,"children":6315},{},[6316,6320],{"type":24,"tag":79,"props":6317,"children":6318},{},[6319],{"type":30,"value":1667},{"type":30,"value":1669},{"type":24,"tag":43,"props":6322,"children":6323},{},[6324,6328],{"type":24,"tag":79,"props":6325,"children":6326},{},[6327],{"type":30,"value":1677},{"type":30,"value":1679},{"type":24,"tag":43,"props":6330,"children":6331},{},[6332,6336],{"type":24,"tag":79,"props":6333,"children":6334},{},[6335],{"type":30,"value":1687},{"type":30,"value":1689},{"type":24,"tag":100,"props":6338,"children":6339},{"id":1692},[6340],{"type":30,"value":1695},{"type":24,"tag":33,"props":6342,"children":6343},{},[6344,6348],{"type":24,"tag":79,"props":6345,"children":6346},{},[6347],{"type":30,"value":1443},{"type":30,"value":1704},{"type":24,"tag":39,"props":6350,"children":6351},{},[6352,6360,6368,6376],{"type":24,"tag":43,"props":6353,"children":6354},{},[6355,6359],{"type":24,"tag":79,"props":6356,"children":6357},{},[6358],{"type":30,"value":1715},{"type":30,"value":1717},{"type":24,"tag":43,"props":6361,"children":6362},{},[6363,6367],{"type":24,"tag":79,"props":6364,"children":6365},{},[6366],{"type":30,"value":1725},{"type":30,"value":1727},{"type":24,"tag":43,"props":6369,"children":6370},{},[6371,6375],{"type":24,"tag":79,"props":6372,"children":6373},{},[6374],{"type":30,"value":1735},{"type":30,"value":1737},{"type":24,"tag":43,"props":6377,"children":6378},{},[6379,6383],{"type":24,"tag":79,"props":6380,"children":6381},{},[6382],{"type":30,"value":1745},{"type":30,"value":1747},{"type":24,"tag":100,"props":6385,"children":6386},{"id":1750},[6387],{"type":30,"value":1753},{"type":24,"tag":33,"props":6389,"children":6390},{},[6391,6395],{"type":24,"tag":79,"props":6392,"children":6393},{},[6394],{"type":30,"value":1443},{"type":30,"value":1445},{"type":24,"tag":39,"props":6397,"children":6398},{},[6399,6407,6415,6423],{"type":24,"tag":43,"props":6400,"children":6401},{},[6402,6406],{"type":24,"tag":79,"props":6403,"children":6404},{},[6405],{"type":30,"value":1772},{"type":30,"value":1774},{"type":24,"tag":43,"props":6408,"children":6409},{},[6410,6414],{"type":24,"tag":79,"props":6411,"children":6412},{},[6413],{"type":30,"value":1782},{"type":30,"value":1784},{"type":24,"tag":43,"props":6416,"children":6417},{},[6418,6422],{"type":24,"tag":79,"props":6419,"children":6420},{},[6421],{"type":30,"value":1792},{"type":30,"value":1794},{"type":24,"tag":43,"props":6424,"children":6425},{},[6426,6430],{"type":24,"tag":79,"props":6427,"children":6428},{},[6429],{"type":30,"value":1802},{"type":30,"value":1804},{"type":24,"tag":100,"props":6432,"children":6433},{"id":1807},[6434],{"type":30,"value":1810},{"type":24,"tag":33,"props":6436,"children":6437},{},[6438,6442],{"type":24,"tag":79,"props":6439,"children":6440},{},[6441],{"type":30,"value":1443},{"type":30,"value":1819},{"type":24,"tag":39,"props":6444,"children":6445},{},[6446,6454],{"type":24,"tag":43,"props":6447,"children":6448},{},[6449,6453],{"type":24,"tag":79,"props":6450,"children":6451},{},[6452],{"type":30,"value":1830},{"type":30,"value":1832},{"type":24,"tag":43,"props":6455,"children":6456},{},[6457,6461],{"type":24,"tag":79,"props":6458,"children":6459},{},[6460],{"type":30,"value":1840},{"type":30,"value":1842},{"type":24,"tag":33,"props":6463,"children":6464},{},[6465,6469],{"type":24,"tag":79,"props":6466,"children":6467},{},[6468],{"type":30,"value":535},{"type":30,"value":1851},{"type":24,"tag":100,"props":6471,"children":6472},{"id":1854},[6473],{"type":30,"value":1857},{"type":24,"tag":33,"props":6475,"children":6476},{},[6477,6481],{"type":24,"tag":79,"props":6478,"children":6479},{},[6480],{"type":30,"value":1443},{"type":30,"value":1866},{"type":24,"tag":39,"props":6483,"children":6484},{},[6485,6493,6501,6509],{"type":24,"tag":43,"props":6486,"children":6487},{},[6488,6492],{"type":24,"tag":79,"props":6489,"children":6490},{},[6491],{"type":30,"value":1877},{"type":30,"value":1879},{"type":24,"tag":43,"props":6494,"children":6495},{},[6496,6500],{"type":24,"tag":79,"props":6497,"children":6498},{},[6499],{"type":30,"value":1887},{"type":30,"value":1889},{"type":24,"tag":43,"props":6502,"children":6503},{},[6504,6508],{"type":24,"tag":79,"props":6505,"children":6506},{},[6507],{"type":30,"value":1897},{"type":30,"value":1899},{"type":24,"tag":43,"props":6510,"children":6511},{},[6512,6516],{"type":24,"tag":79,"props":6513,"children":6514},{},[6515],{"type":30,"value":1907},{"type":30,"value":1909},{"type":24,"tag":33,"props":6518,"children":6519},{},[6520],{"type":30,"value":1914},{"type":24,"tag":39,"props":6522,"children":6523},{},[6524,6532,6540,6548],{"type":24,"tag":43,"props":6525,"children":6526},{},[6527,6531],{"type":24,"tag":79,"props":6528,"children":6529},{},[6530],{"type":30,"value":1925},{"type":30,"value":1927},{"type":24,"tag":43,"props":6533,"children":6534},{},[6535,6539],{"type":24,"tag":79,"props":6536,"children":6537},{},[6538],{"type":30,"value":1935},{"type":30,"value":1937},{"type":24,"tag":43,"props":6541,"children":6542},{},[6543,6547],{"type":24,"tag":79,"props":6544,"children":6545},{},[6546],{"type":30,"value":1945},{"type":30,"value":1947},{"type":24,"tag":43,"props":6549,"children":6550},{},[6551,6555],{"type":24,"tag":79,"props":6552,"children":6553},{},[6554],{"type":30,"value":1955},{"type":30,"value":1957},{"type":24,"tag":25,"props":6557,"children":6558},{"id":1960},[6559],{"type":30,"value":1960},{"type":24,"tag":39,"props":6561,"children":6562},{},[6563,6571,6579,6587],{"type":24,"tag":43,"props":6564,"children":6565},{},[6566],{"type":24,"tag":1970,"props":6567,"children":6569},{"href":1972,"rel":6568},[1974],[6570],{"type":30,"value":1977},{"type":24,"tag":43,"props":6572,"children":6573},{},[6574],{"type":24,"tag":1970,"props":6575,"children":6577},{"href":1983,"rel":6576},[1974],[6578],{"type":30,"value":1987},{"type":24,"tag":43,"props":6580,"children":6581},{},[6582],{"type":24,"tag":1970,"props":6583,"children":6585},{"href":1993,"rel":6584},[1974],[6586],{"type":30,"value":1997},{"type":24,"tag":43,"props":6588,"children":6589},{},[6590],{"type":24,"tag":1970,"props":6591,"children":6593},{"href":2003,"rel":6592},[1974],[6594],{"type":30,"value":2007},{"type":24,"tag":25,"props":6596,"children":6597},{"id":2010},[6598],{"type":30,"value":2013},{"type":24,"tag":33,"props":6600,"children":6601},{},[6602],{"type":30,"value":2018},{"type":24,"tag":39,"props":6604,"children":6606},{"className":6605},[2022],[6607,6615,6623,6631,6639,6647,6655,6663,6671,6679],{"type":24,"tag":43,"props":6608,"children":6610},{"className":6609},[2027],[6611,6614],{"type":24,"tag":2030,"props":6612,"children":6613},{"disabled":2032,"type":2033},[],{"type":30,"value":2036},{"type":24,"tag":43,"props":6616,"children":6618},{"className":6617},[2027],[6619,6622],{"type":24,"tag":2030,"props":6620,"children":6621},{"disabled":2032,"type":2033},[],{"type":30,"value":2045},{"type":24,"tag":43,"props":6624,"children":6626},{"className":6625},[2027],[6627,6630],{"type":24,"tag":2030,"props":6628,"children":6629},{"disabled":2032,"type":2033},[],{"type":30,"value":2054},{"type":24,"tag":43,"props":6632,"children":6634},{"className":6633},[2027],[6635,6638],{"type":24,"tag":2030,"props":6636,"children":6637},{"disabled":2032,"type":2033},[],{"type":30,"value":2063},{"type":24,"tag":43,"props":6640,"children":6642},{"className":6641},[2027],[6643,6646],{"type":24,"tag":2030,"props":6644,"children":6645},{"disabled":2032,"type":2033},[],{"type":30,"value":2072},{"type":24,"tag":43,"props":6648,"children":6650},{"className":6649},[2027],[6651,6654],{"type":24,"tag":2030,"props":6652,"children":6653},{"disabled":2032,"type":2033},[],{"type":30,"value":2081},{"type":24,"tag":43,"props":6656,"children":6658},{"className":6657},[2027],[6659,6662],{"type":24,"tag":2030,"props":6660,"children":6661},{"disabled":2032,"type":2033},[],{"type":30,"value":2090},{"type":24,"tag":43,"props":6664,"children":6666},{"className":6665},[2027],[6667,6670],{"type":24,"tag":2030,"props":6668,"children":6669},{"disabled":2032,"type":2033},[],{"type":30,"value":2099},{"type":24,"tag":43,"props":6672,"children":6674},{"className":6673},[2027],[6675,6678],{"type":24,"tag":2030,"props":6676,"children":6677},{"disabled":2032,"type":2033},[],{"type":30,"value":2108},{"type":24,"tag":43,"props":6680,"children":6682},{"className":6681},[2027],[6683,6686],{"type":24,"tag":2030,"props":6684,"children":6685},{"disabled":2032,"type":2033},[],{"type":30,"value":2117},{"type":24,"tag":2119,"props":6688,"children":6689},{},[],{"type":24,"tag":33,"props":6691,"children":6692},{},[6693,6697,6698,6702],{"type":24,"tag":79,"props":6694,"children":6695},{},[6696],{"type":30,"value":2129},{"type":30,"value":2131},{"type":24,"tag":1970,"props":6699,"children":6700},{"href":2134},[6701],{"type":30,"value":2137},{"type":30,"value":2139},{"title":7,"searchDepth":2141,"depth":2141,"links":6704},[6705,6706,6711,6716,6721,6726,6731,6736,6746,6747],{"id":27,"depth":2144,"text":31},{"id":95,"depth":2144,"text":98,"children":6707},[6708,6709,6710],{"id":102,"depth":2141,"text":105},{"id":161,"depth":2141,"text":164},{"id":230,"depth":2141,"text":233},{"id":289,"depth":2144,"text":289,"children":6712},[6713,6714,6715],{"id":294,"depth":2141,"text":294},{"id":495,"depth":2141,"text":495},{"id":513,"depth":2141,"text":516},{"id":548,"depth":2144,"text":548,"children":6717},[6718,6719,6720],{"id":553,"depth":2141,"text":556},{"id":678,"depth":2141,"text":681},{"id":762,"depth":2141,"text":765},{"id":865,"depth":2144,"text":865,"children":6722},[6723,6724,6725],{"id":870,"depth":2141,"text":873},{"id":930,"depth":2141,"text":933},{"id":1009,"depth":2141,"text":1012},{"id":1088,"depth":2144,"text":1088,"children":6727},[6728,6729,6730],{"id":1093,"depth":2141,"text":1096},{"id":1115,"depth":2141,"text":1115},{"id":1237,"depth":2141,"text":1237},{"id":1253,"depth":2144,"text":1253,"children":6732},[6733,6734,6735],{"id":1258,"depth":2141,"text":180},{"id":1317,"depth":2141,"text":190},{"id":1374,"depth":2141,"text":200},{"id":1426,"depth":2144,"text":1429,"children":6737},[6738,6739,6740,6741,6742,6743,6744,6745],{"id":1432,"depth":2141,"text":1435},{"id":1491,"depth":2141,"text":1494},{"id":1549,"depth":2141,"text":1552},{"id":1612,"depth":2141,"text":1615},{"id":1692,"depth":2141,"text":1695},{"id":1750,"depth":2141,"text":1753},{"id":1807,"depth":2141,"text":1810},{"id":1854,"depth":2141,"text":1857},{"id":1960,"depth":2144,"text":1960},{"id":2010,"depth":2144,"text":2013},1782088241165]