☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜
{"type":"doc","content":[{"type":"heading","attrs":{"id":"32abceee-0c00-4f84-84f4-043c921543d1","textalign":"inherit","indent":0,"level":1,"ishoverdraghandle":false},"content":[{"type":"text","text":"一、概述"}]},{"type":"paragraph","attrs":{"id":"4f819f04-f451-42f5-a4ce-81f5a1399471","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"做后端开发,调 bug 有一个让人头疼的固定流程:打开日志平台,输入 traceid 或关键词,搜日志;从几十上百条日志里,找到关键的那几条;把日志里的类名、方法名复制出来,去 ide 里找对应代码;结合代码逻辑,判断哪里出了问题;如果一次找不准,回去再搜日志,再翻代码……"}]},{"type":"paragraph","attrs":{"id":"ab06268c-fbd9-4a4f-bad2-6fdbdebdb118","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"这个过程相对固定,但非常耗时间。每次 bug 定位,光在日志平台和 ide 之间来回切换,就能消耗掉大半的时间。"}]},{"type":"paragraph","attrs":{"id":"9d5e6afd-fead-412b-8e60-18d2efb306d7","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"最开始在去年 q3 想到这个问题的时候,脑子里浮现的第一个方案是:用 cursor + mcp,把日志平台接进来,再挂一个代码知识库,让 ai 帮我查日志。但这个方案有缺陷 —— 日志查询是「动态的」,它依赖环境、应用、时间范围,没办法静态预置。此外,这样处理没有办法做到比较丝滑地读代码、改代码。"}]},{"type":"paragraph","attrs":{"id":"baca2320-8923-41a0-817b-2eded4c74177","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"后来开始用 claude code,接触到了 skill 的概念:可以在项目里定义一套自定义命令,描述 ai 应该怎么执行这个命令的每个步骤,于是整个思路变得清晰了。"}]},{"type":"paragraph","attrs":{"id":"86c321bf-aedf-4fc5-971b-fd645fddce2e","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"日志平台有 mcp,claude code 有 skill,两者结合,就能让 ai 自动完成「查日志 → 找关键信息 → 扫描代码 → 定位问题」这整个闭环。然后在 pm 的帮助下,才有了 /log-diagnosis 这个 skill。"}]},{"type":"heading","attrs":{"id":"2554cbfd-4133-44eb-bb42-1ba57a0b4f51","textalign":"inherit","indent":0,"level":1,"ishoverdraghandle":false},"content":[{"type":"text","text":"二、日志平台 mcp 是什么"}]},{"type":"heading","attrs":{"id":"413e945b-d26a-487a-954a-25697c4d1d64","textalign":"inherit","indent":0,"level":2,"ishoverdraghandle":false},"content":[{"type":"text","text":"mcp 原理"}]},{"type":"paragraph","attrs":{"id":"d21c343b-7a99-49e4-9bb0-24ecca6fc44a","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"日志平台推出了基于 mcp(model context protocol)协议的日志查询服务,让 claude 可以直接调用日志平台的能力,无需人工在日志平台上手动查询。"}]},{"type":"paragraph","attrs":{"id":"77c8b868-e2c9-424c-803d-dd14a626bca5","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"mcp 本质上是一种标准化的「工具调用协议」,claude code 通过 sse(server-sent events)长连接与 mcp server 通信,实时获取日志数据。"}]},{"type":"heading","attrs":{"id":"fdc60ca6-f596-4026-86cb-2101b8e64a9e","textalign":"inherit","indent":0,"level":2,"ishoverdraghandle":false},"content":[{"type":"text","text":"mcp 环境对照"}]},{"type":"image","attrs":{"id":"cfe7f2a6-9a26-4576-bb07-8752ff98afd6","src":"https://developer.qcloudimg.com/http-save/audit-9927536/e17cc396eb09e0500165858018b12860.png","extension":"png","align":"center","alt":"","showalt":false,"href":"","boxshadow":"","width":1076,"aspectratio":"1.788079","status":"success","showtext":true,"ispercentage":false,"percentage":0,"ishoverdraghandle":false}},{"type":"heading","attrs":{"id":"36ac1761-993a-45c5-b757-11a379d4137a","textalign":"inherit","indent":0,"level":2,"ishoverdraghandle":false},"content":[{"type":"text","text":"核心 mcp 工具"}]},{"type":"image","attrs":{"id":"11575ab2-7687-432f-997c-e6fb6e79dc0a","src":"https://developer.qcloudimg.com/http-save/audit-9927536/05d89611f7b23ef15c3c1f8dcf8a57b4.png","extension":"png","align":"center","alt":"","showalt":false,"href":"","boxshadow":"","width":1076,"aspectratio":"2.014925","status":"success","showtext":true,"ispercentage":false,"percentage":0,"ishoverdraghandle":false}},{"type":"heading","attrs":{"id":"b3e2a787-7fe2-4ba2-907f-587c716f33c2","textalign":"inherit","indent":0,"level":2,"ishoverdraghandle":false},"content":[{"type":"text","text":"鉴权流程"}]},{"type":"codeblock","attrs":{"id":"25e9e02a-3b27-4f69-ae6c-3f00c763ab42","language":"javascript","theme":"atom-one-dark","runtimes":0,"ishoverdraghandle":false,"key":"","languagebyai":"javascript"},"content":[{"type":"text","text":"secretkey(日志平台后管申请) ↓ acquiretokentoolccesstoken(1小时有效,最多同时存在5个) ↓ 携带 accesstokenlogsquery / logsqlquery / countlogtool ..."}]},{"type":"paragraph","attrs":{"id":"3f75e799-26f5-4480-8655-f106164c29ad","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"secretkey 申请地址:进入日志管理后台 → 日志权限 → 我的应用 → 生成密钥。"}]},{"type":"heading","attrs":{"id":"25519a03-b3a6-4177-9d34-b18c03b2b7ab","textalign":"inherit","indent":0,"level":1,"ishoverdraghandle":false},"content":[{"type":"text","text":"三、/log-diagnosis skill 是什么"}]},{"type":"heading","attrs":{"id":"66d8fd43-88bd-4975-99f0-05c7e037f2c0","textalign":"inherit","indent":0,"level":2,"ishoverdraghandle":false},"content":[{"type":"text","text":"skill 工作原理"}]},{"type":"paragraph","attrs":{"id":"6d87eff0-7490-4ab5-9289-dc94bd282a9e","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"log-diagnosis 是一个运行在 claude code 里的自定义诊断命令。claude code 支持通过 .claude/skills/ 目录定义自定义技能(skill),以 markdown 文件描述行为规范,claude 在收到对应命令时会自动加载并执行。你只需要把 traceid 或告警信息告诉它,剩下的全部交给 ai。完整执行链路如下:"}]},{"type":"codeblock","attrs":{"id":"33071f55-26dd-421c-a3ba-4285a23d62f7","language":"javascript","theme":"atom-one-dark","runtimes":0,"ishoverdraghandle":false,"key":"","languagebyai":"javascript"},"content":[{"type":"text","text":"用户输入 /log-diagnosis {环境} {代码分支} {诉求} ↓claude 加载 .claude/skills/log-diagnosis/skill.md ↓读取 .diagnosis/config.json 获取当前环境配置 ↓检查 accesstoken 是否过期,过期则自动刷新 ↓从 traceid 计算日志时间范围(取第9-16位16进制时间戳) ↓调用日志平台 mcp 分页拉取全量日志(最多20页,不遗漏) ↓切换到指定代码分支,结合日志关键词检索代码 ↓综合分析:上游日志 + 当前服务日志 + 代码逻辑 → 根因 ↓生成诊断报告(飞书文档 or 本地 markdown) ↓恢复原始代码分支"}]},{"type":"heading","attrs":{"id":"05b08e67-085d-4f94-a915-a360f1ca797b","textalign":"inherit","indent":0,"level":2,"ishoverdraghandle":false},"content":[{"type":"text","text":"两种诊断入口"}]},{"type":"image","attrs":{"id":"cc3cc3b9-2b34-465c-b3cc-67b8efb6a288","src":"https://developer.qcloudimg.com/http-save/audit-9927536/414a57d9888b45bb677d6fe468061435.png","extension":"png","align":"center","alt":"","showalt":false,"href":"","boxshadow":"","width":1076,"aspectratio":"4.320000","status":"success","showtext":true,"ispercentage":false,"percentage":0,"ishoverdraghandle":false}},{"type":"heading","attrs":{"id":"fc17e22a-adf8-4311-8f86-42d9b13c4b4b","textalign":"inherit","indent":0,"level":2,"ishoverdraghandle":false},"content":[{"type":"text","text":"核心能力"}]},{"type":"bulletlist","attrs":{"id":"cf9fe1b0-39b4-4260-b2a3-fec8c57bc31f","ishoverdraghandle":false},"content":[{"type":"listitem","attrs":{"id":"88303d6e-fa97-438b-8de2-3c18ba788a60"},"content":[{"type":"paragraph","attrs":{"id":"65832ff6-46b3-405c-a409-242808cbf6b5","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"token 自动管理:"},{"type":"text","text":"accesstoken 过期自动刷新,无需手动维护;"}]}]},{"type":"listitem","attrs":{"id":"b5cecdc1-b1a0-4eb6-bb2a-528ed07c9240"},"content":[{"type":"paragraph","attrs":{"id":"2daf35e4-ebb8-4e7b-9460-2737067fe24b","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"分页全量拉取:"},{"type":"text","text":"自动分页拉完所有日志,禁止只查第一页就下结论(最多 20 页);"}]}]},{"type":"listitem","attrs":{"id":"29fdbcbf-5694-4ca7-bcdd-f6264ed2e2b8"},"content":[{"type":"paragraph","attrs":{"id":"cdb7599f-8fd9-4abf-b4f4-7d31176daa88","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"跨服务分析:"},{"type":"text","text":"自动识别上下游服务,拉取关联服务日志交叉验证;"}]}]},{"type":"listitem","attrs":{"id":"34aecbd6-aa16-45fe-a9ef-e88dae6ddf02"},"content":[{"type":"paragraph","attrs":{"id":"6a35db73-cc48-4031-8d02-11ec8aa04c61","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"代码联动:"},{"type":"text","text":"日志里出现的类名/方法名,直接在代码里精确定位。"}]}]}]},{"type":"heading","attrs":{"id":"0635baea-34c7-4648-b140-34fd024fe589","textalign":"inherit","indent":0,"level":2,"ishoverdraghandle":false},"content":[{"type":"text","text":"querystring 语法规则"}]},{"type":"codeblock","attrs":{"id":"e11ab6ea-e74e-45cd-b301-a28c1b7bddce","language":"javascript","theme":"atom-one-dark","runtimes":0,"ishoverdraghandle":false,"key":"","languagebyai":"javascript"},"content":[{"type":"text","text":"# 格式{field} {操作符} \"{值}\" {连接符} {field} {操作符} \"{值}\"# 操作符= : 精确匹配≈ : 模糊匹配(like)# 连接符nd / or / not# 示例 race_id = \"a1b2c3d4e5f6789012345678abcdef01\" race_id = \"xxx\" and log_level = \"error\"endpoint ≈ \"/api/your-endpoint\" and log_level = \"error\"message ≈ \"timeout\""}]},{"type":"paragraph","attrs":{"id":"4b88a040-cf1f-4a80-9537-bd7ef2f6414b","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"注意:时间范围只通过 start/end 参数控制,不要写在 querystring 中。"}]},{"type":"heading","attrs":{"id":"e4531987-4c0c-4951-ab69-0c7d544c0fc2","textalign":"inherit","indent":0,"level":1,"ishoverdraghandle":false},"content":[{"type":"text","text":"四、安装与配置"}]},{"type":"heading","attrs":{"id":"f1bdedc0-5711-41b8-abc9-7b1192ceb29c","textalign":"inherit","indent":0,"level":2,"ishoverdraghandle":false},"content":[{"type":"text","text":"安装日志平台 mcp"}]},{"type":"heading","attrs":{"id":"1c105822-4414-4130-8c6f-cf22e149ec1f","textalign":"inherit","indent":0,"level":3,"ishoverdraghandle":false},"content":[{"type":"text","text":"claude code"}]},{"type":"paragraph","attrs":{"id":"c52abf9b-4b8d-43e6-9d4c-bda67b07f970","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"在 claude code 命令行中执行,按需安装对应环境:"}]},{"type":"codeblock","attrs":{"id":"22d09972-dbcb-4f9a-bc63-f6fabad130e1","language":"javascript","theme":"atom-one-dark","runtimes":0,"ishoverdraghandle":false,"key":"","languagebyai":"javascript"},"content":[{"type":"text","text":"# 测试环境claude mcp add --transport sse dw-log-mcp-t1 https://{your-t1-aigw-domain}/api/v1/mcp/log-mcp/sse# 预发环境claude mcp add --transport sse dw-log-mcp-pre https://{your-pre-aigw-domain}/api/v1/mcp/log-mcp/sse# 生产环境claude mcp add --transport sse dw-log-mcp-prd https://{your-prd-aigw-domain}/api/v1/mcp/log-mcp/sse"}]},{"type":"paragraph","attrs":{"id":"e965fd89-e6a9-45dd-ac82-157869abfe8f","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"安装后重启 claude code,执行 /mcp 确认连接状态正常。"}]},{"type":"heading","attrs":{"id":"5103ad21-d936-498f-a4e0-3eabe87146b3","textalign":"inherit","indent":0,"level":3,"ishoverdraghandle":false},"content":[{"type":"text","text":"cursor"}]},{"type":"paragraph","attrs":{"id":"52d530c2-6bda-43df-b0bf-fada9089087d","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"1. 打开 cursor setting;"}]},{"type":"paragraph","attrs":{"id":"dad34568-0aea-4a8f-abe0-ca67111b910e","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"2. 点击 tools u0026 mcp,添加 mcp server;"}]},{"type":"paragraph","attrs":{"id":"0e55ff77-53a4-433e-9601-1742a506d962","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"3. 添加 url,mcp server 名称任意。"}]},{"type":"paragraph","attrs":{"id":"14953f37-1923-4113-9919-c9bd997f7ee4","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"建议按需安装 mcp server,避免额外消耗 token,示例配置:"}]},{"type":"codeblock","attrs":{"id":"304a1449-a6fb-4ed3-8940-f4a71ea11a82","language":"javascript","theme":"atom-one-dark","runtimes":0,"ishoverdraghandle":false,"key":"","languagebyai":"javascript"},"content":[{"type":"text","text":"{ \"mcpservers\": { \"dw-log-mcp-t1\": { \"url\": \"https://{your-t1-aigw-domain}/api/v1/mcp/log-mcp/sse\" }, \"dw-log-mcp-pre\": { \"url\": \"https://{your-pre-aigw-domain}/api/v1/mcp/log-mcp/sse\" }, \"dw-log-mcp-prd\": { \"url\": \"https://{your-prd-aigw-domain}/api/v1/mcp/log-mcp/sse\" }, \"dw-log-mcp-oversea-prd\": { \"url\": \"https://{your-oversea-aigw-domain}/api/v1/mcp/log-mcp/sse\" } }}"}]},{"type":"paragraph","attrs":{"id":"91766e61-f57c-4414-906b-17f0e485d707","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"4. 返回设置,就可以看到已经连接上。"}]},{"type":"heading","attrs":{"id":"5da47131-4a0d-4739-8b6e-4755fed59823","textalign":"inherit","indent":0,"level":1,"ishoverdraghandle":false},"content":[{"type":"text","text":"安装 /log-diagnosis skill"}]},{"type":"paragraph","attrs":{"id":"fbda4afb-1c0d-4eab-95cb-2d144fc04891","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"将 log-diagnosis 目录放到项目的对应目录下:"}]},{"type":"heading","attrs":{"id":"8a0f5178-3d70-4ea4-b3ba-4e0ea75d543b","textalign":"inherit","indent":0,"level":3,"ishoverdraghandle":false},"content":[{"type":"text","text":"claude code"}]},{"type":"codeblock","attrs":{"id":"745ab7c7-9410-4e8d-9e69-a37d1792c12a","language":"javascript","theme":"atom-one-dark","runtimes":0,"ishoverdraghandle":false,"key":"","languagebyai":"javascript"},"content":[{"type":"text","text":"your-project/└── .claude/ └── skills/ └── log-diagnosis/ ├── skill.md # 技能行为规范(核心) ├── readme.md # 使用说明 └── reference.md # 附录:时间脚本、querystring 示例等"}]},{"type":"heading","attrs":{"id":"f233fc75-8b14-433c-9391-85f6d9d25131","textalign":"inherit","indent":0,"level":3,"ishoverdraghandle":false},"content":[{"type":"text","text":"cursor"}]},{"type":"codeblock","attrs":{"id":"736c8136-81f0-4ada-acac-7c57ca5ea43d","language":"javascript","theme":"atom-one-dark","runtimes":0,"ishoverdraghandle":false,"key":"","languagebyai":"javascript"},"content":[{"type":"text","text":"your-project/└── .cursor/ └── skills/ └── log-diagnosis/ ├── skill.md # 技能行为规范(核心) ├── readme.md # 使用说明 └── reference.md # 附录:时间脚本、querystring 示例等"}]},{"type":"heading","attrs":{"id":"ced3453d-582e-4483-974d-4bdf637d4046","textalign":"inherit","indent":0,"level":3,"ishoverdraghandle":false},"content":[{"type":"text","text":"配置 .diagnosis/config.json"}]},{"type":"paragraph","attrs":{"id":"4d65f212-788d-4ad3-a1e7-d01d068c895a","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"首次运行会自动引导创建"},{"type":"text","marks":[{"type":"bold"}],"text":"(直接调用 /log-diagnosis,skill 会一步步指示你给出 secret key)"},{"type":"text","text":",也可手动在项目根目录创建 .diagnosis/config.json:"}]},{"type":"codeblock","attrs":{"id":"68f06fd1-bb07-4f03-bc3a-130230c0d8c9","language":"javascript","theme":"atom-one-dark","runtimes":0,"ishoverdraghandle":false,"key":"","languagebyai":"javascript"},"content":[{"type":"text","text":"your-project/└── .cursor/ └── skills/ └── log-diagnosis/ ├── skill.md # 技能行为规范(核心) ├── readme.md # 使用说明 └── reference.md # 附录:时间脚本、querystring 示例等"}]},{"type":"paragraph","attrs":{"id":"6749394a-f8cb-43a3-b6e4-729f1754e544","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"字段说明:"}]},{"type":"paragraph","attrs":{"id":"9d3b0255-8a8d-4b2b-8ac5-b77f7cfa9365","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"secretkey:"},{"type":"text","marks":[{"type":"bold"}],"text":"唯一需要人工填写的字段"},{"type":"text","text":",在日志平台后管申请;"}]},{"type":"paragraph","attrs":{"id":"b2d1d157-fa95-4e52-9146-7901f973ffa4","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"accesstoken:首次使用时由 ai 自动调用 acquiretokentool 获取,过期自动刷新;"}]},{"type":"paragraph","attrs":{"id":"7928a884-392c-4cdb-9e0d-41a6ac95e0cd","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"accesstokenexpireat:从 acquiretokentool 返回值自动填充;"}]},{"type":"paragraph","attrs":{"id":"8c1fd8c7-dc6f-4426-8275-a9b25f8a508d","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"fields:调用 logfields 工具自动获取。"}]},{"type":"heading","attrs":{"id":"84e319a1-6eaf-42c2-9006-d67a36992257","textalign":"inherit","indent":0,"level":1,"ishoverdraghandle":false},"content":[{"type":"text","text":"五、使用方式"}]},{"type":"paragraph","attrs":{"id":"351e4168-87a2-4c2a-a247-0cf7bc52d337","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"命令格式:"}]},{"type":"codeblock","attrs":{"id":"0d084f93-d45e-4967-bd7b-5c2b822f4d16","language":"javascript","theme":"atom-one-dark","runtimes":0,"ishoverdraghandle":false,"key":"","languagebyai":"javascript"},"content":[{"type":"text","text":"/log-diagnosis {环境} {代码分支(可选)} {诉求描述}"}]},{"type":"paragraph","attrs":{"id":"075a6dfe-1164-41cb-b23f-efc2b3d718e0","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"参数说明:"}]},{"type":"bulletlist","attrs":{"id":"033cb04e-45a7-4ec4-ae15-83e603ede4e2","ishoverdraghandle":false},"content":[{"type":"listitem","attrs":{"id":"6111d984-6b32-4c85-8b67-0373a9cee9a6"},"content":[{"type":"paragraph","attrs":{"id":"f96c8988-acb7-4073-84d7-031d0efbb7c4","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"{环境}:t1 / pre / prd(按实际环境标识填写);"}]}]},{"type":"listitem","attrs":{"id":"62b1049f-f2c8-4e0b-aede-900ab8548da6"},"content":[{"type":"paragraph","attrs":{"id":"c25675ff-b2f4-4471-ac56-82a8138793c1","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"{代码分支}:可选,留空则使用当前分支;"}]}]},{"type":"listitem","attrs":{"id":"92e63c7e-be06-4b4b-a571-0aa57d0ec5a9"},"content":[{"type":"paragraph","attrs":{"id":"940757c9-6d97-41be-aebc-0bd13d029678","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"{诉求描述}:包含 traceid 或告警信息的问题描述,用自然语言书写即可。"}]}]}]},{"type":"paragraph","attrs":{"id":"7dbe087e-d863-466f-97b8-d2fe4393dcb4","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"示例:"}]},{"type":"codeblock","attrs":{"id":"bff4ad12-0dc6-4a60-b806-619ac547e0e1","language":"javascript","theme":"atom-one-dark","runtimes":0,"ishoverdraghandle":false,"key":"","languagebyai":"javascript"},"content":[{"type":"text","text":"# 用 traceid 定位接口异常/log-diagnosis t1 feature/your-branch trace_id: \"your-trace\" 为什么最终没有返回数据# 用告警信息分析错误原因/log-diagnosis prd master 告警详情:【接口:yourservice/yourmethod】【业务码:10002000】【业务码消息:系统异常,请稍后重试】帮我分析问题可能性"}]},{"type":"paragraph","attrs":{"id":"15d59213-26de-4370-8f4a-1bc05d8b267e","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"一行命令,ai 全程接管,几分钟内给出根因分析。"}]},{"type":"heading","attrs":{"id":"323656d6-fb46-40ff-93c9-76ab4199f2dd","textalign":"inherit","indent":0,"level":1,"ishoverdraghandle":false},"content":[{"type":"text","text":"六、实战案例:一个隐蔽的 sql bug"}]},{"type":"heading","attrs":{"id":"c21725e4-79b4-4df6-a82c-5a8a05259609","textalign":"inherit","indent":0,"level":2,"ishoverdraghandle":false},"content":[{"type":"text","text":"背景"}]},{"type":"paragraph","attrs":{"id":"75231448-e1f0-4556-b412-a9c86280c2f9","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"某搜索接口在测试环境反馈没有返回数据。拿到 traceid,直接执行:"}]},{"type":"codeblock","attrs":{"id":"d5b61d1f-f7f4-4329-88a5-045cfab4280b","language":"javascript","theme":"atom-one-dark","runtimes":0,"ishoverdraghandle":false,"key":"","languagebyai":"javascript"},"content":[{"type":"text","text":"/log-diagnosis t1 feature/your-branch trace_id: \"your-trace\" 为什么最终没有返回数据"}]},{"type":"paragraph","attrs":{"id":"bf43f5b5-24ae-41d4-9fa9-4b99d13d46b6","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"← 就这一句话,接下来全部交给 ai。"}]},{"type":"heading","attrs":{"id":"c2e0567d-7d81-460e-a7bc-a73a6b9b33f1","textalign":"inherit","indent":0,"level":2,"ishoverdraghandle":false},"content":[{"type":"text","text":"ai 自动拉取日志"}]},{"type":"paragraph","attrs":{"id":"c1e6c360-c908-4857-ab24-18cfcda866aa","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"skill 触发后,ai 自动完成:"}]},{"type":"bulletlist","attrs":{"id":"c9f74a6d-3a14-47cc-be15-1bbe0099507e","ishoverdraghandle":false},"content":[{"type":"listitem","attrs":{"id":"733b31f6-60d3-42f8-9de9-4825e3270b35"},"content":[{"type":"paragraph","attrs":{"id":"67cf4284-b1ce-4390-8a41-9ca8a56628bb","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"从 traceid 推算出日志时间范围(2026-02-27 全天);"}]}]},{"type":"listitem","attrs":{"id":"2417aeb9-d218-435a-bb14-09c11864ac0b"},"content":[{"type":"paragraph","attrs":{"id":"a89f2922-a4df-4d68-8620-0c11b985e389","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"检查 accesstoken 已过期,自动刷新;"}]}]},{"type":"listitem","attrs":{"id":"146477dc-a4a6-42aa-be11-38c8e135feb2"},"content":[{"type":"paragraph","attrs":{"id":"bf416106-e54d-4e77-ad82-48542d63422a","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"调用日志平台 mcp,分 2 页拉取完整日志,共 73 条。"}]}]}]},{"type":"paragraph","attrs":{"id":"c4432e06-95ab-4c3c-8549-dbad09d824f6","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"请求入参(从日志自动提取):"}]},{"type":"codeblock","attrs":{"id":"90c376ce-70e1-4cf5-96d3-b3c1615d39e8","language":"javascript","theme":"atom-one-dark","runtimes":0,"ishoverdraghandle":false,"key":"","languagebyai":"javascript"},"content":[{"type":"text","text":"{ \"assemblebyorg\": true, \"channeltype\": \"manual\", \"orderno\": \"your-order-no\", \"status\": 1, \"ticketno\": \"your-ticket-no\"}"}]},{"type":"heading","attrs":{"id":"f95cb325-259a-4d45-b14c-d12f7562e11d","textalign":"inherit","indent":0,"level":2,"ishoverdraghandle":false},"content":[{"type":"text","text":"ai 还原完整调用链路"}]},{"type":"image","attrs":{"id":"95726983-60ff-4dd0-a0cf-85b189ac6532","src":"https://developer.qcloudimg.com/http-save/audit-9927536/056b33ff448892194893cdef454def4b.png","extension":"png","align":"center","alt":"","showalt":false,"href":"","boxshadow":"","width":1076,"aspectratio":"1.197339","status":"success","showtext":true,"ispercentage":false,"percentage":0,"ishoverdraghandle":false}},{"type":"paragraph","attrs":{"id":"f69eb79a-0832-406e-b866-8ba4a5d5735d","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"ai 自动识别出关键节点:resultlist is empty,sql 查询返回了空结果。问题在 db 层,而不在业务逻辑层。"}]},{"type":"heading","attrs":{"id":"e682ed8e-c087-404c-88f2-23bead272309","textalign":"inherit","indent":0,"level":2,"ishoverdraghandle":false},"content":[{"type":"text","text":"ai 提取组装后的查询 dto"}]},{"type":"paragraph","attrs":{"id":"cd3e7226-642f-4154-a1cc-0adb9e527c57","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"从日志中提取到 tosearchdto 组装结果:"}]},{"type":"codeblock","attrs":{"id":"04e43827-6283-4429-a75a-0631a40b4cb2","language":"javascript","theme":"atom-one-dark","runtimes":0,"ishoverdraghandle":false,"key":"","languagebyai":"javascript"},"content":[{"type":"text","text":"{ \"channeltype\": \"manual\", \"customertag\": 1, \"deliverymode\": \"某配送方式\", \"orderstatus\": \"8010\", \"ordertype\": \"0\", \"productcategoryids\": [29], \"status\": 1, \"ticketsource\": 67, \"tickettypeid\": 5802}"}]},{"type":"heading","attrs":{"id":"bd39a30c-c137-4a2d-9434-8e3ba4e7465c","textalign":"inherit","indent":0,"level":2,"ishoverdraghandle":false},"content":[{"type":"text","text":"ai 从日志中提取实际执行的 sql 发现根因"}]},{"type":"paragraph","attrs":{"id":"c06726ae-4ea3-411a-9ce4-232c96df7b45","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"orm 框架在日志中打印了实际执行的 sql,ai 直接读取并分析:"}]},{"type":"codeblock","attrs":{"id":"76fb4002-675e-49d3-a033-c929a9a4fc2e","language":"javascript","theme":"atom-one-dark","runtimes":0,"ishoverdraghandle":false,"key":"","languagebyai":"javascript"},"content":[{"type":"text","text":"select a.id, a.pid, a.name, a.mode, a.status, a.org_id, a.org_ids, a.ticket_group_id, a.tenant_id, a.is_del, a.channel_typesrom your_type_table aleft join your_relation_table b on b.tenant_id = 1 and a.id = b.type_id and b.type = 3 and b.is_del = 0where a.tenant_id = 1 and a.mode = 2 and a.is_del = 0 and a.status = 1 and (a.channel_types is null or a.channel_types = '' or find_in_set('manual', a.channel_types) u003e 0) and (b.root_id is null or b.root_id in (29)) and (a.order_types is null or a.order_types = '' or find_in_set('0', a.order_types) u003e 0) and (a.order_statuses is null or a.order_statuses = '' or find_in_set('8010', a.order_statuses) u003e 0) and (a.delivery_modes is null or a.delivery_modes = '' or find_in_set('某配送方式', a.delivery_modes) u003e 0) and (a.ticket_sources is null or a.ticket_sources = '' or find_in_set(67, a.ticket_sources) u003e 0) and (a.customer_tag is null or a.customer_tag = 1) ← bug 在此"}]},{"type":"paragraph","attrs":{"id":"e10fc660-a903-4812-8488-a6096b04f78d","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"ai 发现:其他字段都处理了 is null 和 = ''(空字符串代表 “不限制”)两种情况,唯独 customer_tag 只判断了 is null,遗漏了空字符串 '' 的情况。"}]},{"type":"paragraph","attrs":{"id":"dc431c12-0402-45b1-9900-d5f4b32bc888","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"sql 语义对比:"}]},{"type":"codeblock","attrs":{"id":"77e0a7fe-cc63-479c-9072-c1e7c18e2397","language":"javascript","theme":"atom-one-dark","runtimes":0,"ishoverdraghandle":false,"key":"","languagebyai":"javascript"},"content":[{"type":"text","text":"-- 其他字段(正确):is null 和 '' 都处理了nd (a.order_types is null or a.order_types = '' or find_in_set('0', a.order_types) u003e 0)nd (a.delivery_modes is null or a.delivery_modes = '' or find_in_set('某配送方式', a.delivery_modes) u003e 0)nd (a.ticket_sources is null or a.ticket_sources = '' or find_in_set(67, a.ticket_sources) u003e 0)-- customer_tag(遗漏了 = '' 的判断)← bugnd (a.customer_tag is null or a.customer_tag = 1)"}]},{"type":"paragraph","attrs":{"id":"fd1bb562-418d-4a72-a3a1-592bc7fe051a","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"db 中现有的数据,customer_tag 字段都存的是空字符串(未配置),按业务语义本应匹配所有请求,却因为这个遗漏被全部过滤掉了。"}]},{"type":"heading","attrs":{"id":"5054cd18-f731-4ccc-a4c9-de1fce4b57f0","textalign":"inherit","indent":0,"level":2,"ishoverdraghandle":false},"content":[{"type":"text","text":"ai 定位代码,给出修复方案"}]},{"type":"paragraph","attrs":{"id":"d4062f1b-d462-4dbb-8721-6d39b054fca2","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"ai 在代码中直接找到对应的 mybatis mapper xml:"}]},{"type":"codeblock","attrs":{"id":"5ea79359-7710-4b30-ba87-42e0783e43af","language":"javascript","theme":"atom-one-dark","runtimes":0,"ishoverdraghandle":false,"key":"","languagebyai":"javascript"},"content":[{"type":"text","text":"u003c!-- 问题代码 --u003e\u003cif test=\"customertag != null\"u003e and (a.customer_tag is null or a.customer_tag = #{customertag})\u003c/ifu003e\u003c!-- 修复后 --u003e\u003cif test=\"customertag != null\"u003e and (a.customer_tag is null or a.customer_tag = '' or a.customer_tag = #{customertag})\u003c/ifu003e"}]},{"type":"heading","attrs":{"id":"fbcb8b09-e9ec-4bf8-9e3c-17159b9f404c","textalign":"inherit","indent":0,"level":2,"ishoverdraghandle":false},"content":[{"type":"text","text":"效率对比"}]},{"type":"image","attrs":{"id":"c14b43f0-bb8d-481e-aa80-177a4b1ddffa","src":"https://developer.qcloudimg.com/http-save/audit-9927536/d055b1e36204693b73181d5cde2c37f9.png","extension":"png","align":"center","alt":"","showalt":false,"href":"","boxshadow":"","width":1076,"aspectratio":"2.589928","status":"success","showtext":true,"ispercentage":false,"percentage":0,"ishoverdraghandle":false}},{"type":"paragraph","attrs":{"id":"46aa5013-110c-4426-8d5b-689d0395141d","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"这个 bug 的隐蔽性在于:sql 语法正确,逻辑上也「看起来」没问题——只有对比了其他字段的写法,才能发现 customer_tag 独自遗漏了空字符串的处理。这类细节差异,人工排查很容易忽略,ai 反而很擅长。"}]},{"type":"heading","attrs":{"id":"105ca25e-c1e1-4f11-847b-5c1851bc039c","textalign":"inherit","indent":0,"level":1,"ishoverdraghandle":false},"content":[{"type":"text","text":"七、诊断效率关键点"}]},{"type":"bulletlist","attrs":{"id":"50b522f0-e649-4d39-8a68-2b3c4d3fe999","ishoverdraghandle":false},"content":[{"type":"listitem","attrs":{"id":"e44a3c82-c48a-4be0-9981-77601c2211a7"},"content":[{"type":"paragraph","attrs":{"id":"405a2413-3a37-4917-8196-b3a39de5bbdb","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"有 traceid 时优先用 traceid 拉日志,可精准获取单次请求的完整链路,比关键词搜索精确得多;"}]}]},{"type":"listitem","attrs":{"id":"2c483484-9cc6-4bde-88c7-82dda87722f3"},"content":[{"type":"paragraph","attrs":{"id":"9d6db6b2-111f-4186-b39a-8d6ff78f2bc7","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"关注关键日志节点:tosearchdto finished / search begins / resultlist is empty / search finished 等,快速判断数据在哪一层丢失;"}]}]},{"type":"listitem","attrs":{"id":"78aff0f3-7f6b-4a24-83c0-0d27c02bab98"},"content":[{"type":"paragraph","attrs":{"id":"87296384-ec1f-464c-8401-8cd9ffb754fb","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"sql 打印日志(orm 框架输出)是黄金线索,直接反映最终执行的查询条件,ai 能从中发现肉眼难以察觉的差异;"}]}]},{"type":"listitem","attrs":{"id":"8c7bd6b4-e98d-4709-a040-9199bc1cce34"},"content":[{"type":"paragraph","attrs":{"id":"03ca9264-3fe9-4065-a78d-8b2e719729c1","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"分页必须拉完:日志平台一次只返回部分数据,ai 会严格执行分页直到取完,确保不遗漏关键日志。"}]}]}]},{"type":"heading","attrs":{"id":"ffbed370-8cff-4d94-84a9-2bf620b23b19","textalign":"inherit","indent":0,"level":1,"ishoverdraghandle":false},"content":[{"type":"text","text":"八、总结"}]},{"type":"paragraph","attrs":{"id":"8b973c91-5b93-41e8-b129-ec43128c6d5e","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"核心思路:用「协议 + 规范」让 ai 接管固定流程:"}]},{"type":"paragraph","attrs":{"id":"b9fdf205-859b-4553-8df6-8c015a9a0e75","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"这篇文章的本质,是一次对重复性工程劳动的自动化尝试。调 bug 的过程——查日志、提取关键信息、找代码、分析原因——逻辑固定,步骤繁琐,但并不需要太多创造性思维。这类工作恰好是 ai 最擅长接管的。"}]},{"type":"paragraph","attrs":{"id":"74c1ffba-8461-4228-aa5f-2d8d1408a4c3","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"实现这个闭环,靠的是两个关键组合:"}]},{"type":"bulletlist","attrs":{"id":"ea9ec917-b45e-410b-b3c7-977db3b4d92d","ishoverdraghandle":false},"content":[{"type":"listitem","attrs":{"id":"cea7a09a-5899-4112-9b25-95e2530cdb4c"},"content":[{"type":"paragraph","attrs":{"id":"db7abe4e-3081-4be7-baea-3589431f15b1","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"mcp:"},{"type":"text","text":"让 ai 能够调用外部系统(日志平台),突破了「ai 只能处理静态上下文」的限制,实现了对动态数据的实时获取。"}]}]},{"type":"listitem","attrs":{"id":"9de2ad0c-af2c-42fb-81d8-0ea94380fc7f"},"content":[{"type":"paragraph","attrs":{"id":"df14482c-46e4-4016-9180-ca3031ec5f10","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"skill:"},{"type":"text","text":"给 ai 一份行为规范,告诉它每一步该怎么做、先做什么后做什么、遇到什么情况怎么处理,把「一次性对话」变成「可复用的工程化能力」。"}]}]}]},{"type":"paragraph","attrs":{"id":"35cb513e-1f81-43a5-9b45-c21a2838f3ea","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"两者缺一不可。只有 mcp,ai 能查日志但不知道怎么系统地分析;只有 skill,ai 有流程但没有数据来源。组合起来,才形成了真正可落地的闭环。"}]},{"type":"paragraph","attrs":{"id":"25174d55-0eee-4739-a10f-0c301b9f8f30","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false}},{"type":"paragraph","attrs":{"id":"125de630-f0b9-4fc1-a03e-399ff0618734","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","marks":[{"type":"bold"}],"text":"值得借鉴的地方:"}]},{"type":"paragraph","attrs":{"id":"e88f2086-34ca-403b-be71-9e0bed41e25a","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"识别「固定流程」是自动化的起点:"}]},{"type":"paragraph","attrs":{"id":"45546e87-95f7-4b9f-806f-aaee48576f35","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"不是所有工作都适合 ai 接管,但凡是「步骤固定、信息来源明确、输出格式可预期」的工作,都值得尝试用 skill + mcp 的方式来自动化。排查 bug 是一个典型,类似的还有:代码审查、性能分析报告生成、告警巡检等。"}]},{"type":"paragraph","attrs":{"id":"79671610-b80e-4e54-9b59-21515eee0cdf","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"skill 的本质是「给 ai 写操作手册」:"}]},{"type":"paragraph","attrs":{"id":"71c73d3f-d4f8-4758-92ea-7c136fe14626","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"skill 文件不是在「训练模型」,而是在给 ai 一份清晰的 sop。写得越细、约束越明确(比如「禁止只查第一页就下结论」「必须分页拉完所有数据」),ai 的执行质量越稳定。这和写给人看的文档本质上是一回事。"}]},{"type":"paragraph","attrs":{"id":"ab8cb538-234f-44cc-b1cb-47ac12df980b","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"ai 擅长发现「横向对比」类的 bug:"}]},{"type":"paragraph","attrs":{"id":"8c44a961-1307-40a4-9074-ca7c44258d69","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"本文的案例揭示了一个有意思的规律:ai 在处理「同类字段逻辑不一致」这类问题时,表现往往比人工更好。原因在于 ai 没有「先入为主」的经验偏见,不会因为「这段代码看起来没问题」就跳过,它会对所有字段做同等的审查。"}]},{"type":"paragraph","attrs":{"id":"96299868-236d-4282-890d-787086f3d1a5","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"最后说一句:ai 时代,工程师的核心竞争力不只是「能写代码」,更是「能把自己的经验和流程转化成可复用的 ai 能力」。/log-diagnosis 是一次小小的尝试,但背后的思路,值得在更多场景里延伸。"}]},{"type":"paragraph","attrs":{"id":"e39b7eb6-5cf5-4f88-a3b8-cd64dfc4b440","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false}},{"type":"heading","attrs":{"id":"d70192a8-b901-4be6-b1cd-a501d860050f","textalign":"inherit","indent":0,"level":1,"ishoverdraghandle":false},"content":[{"type":"text","text":"往期回顾"}]},{"type":"paragraph","attrs":{"id":"fd05ee0a-f7bb-467e-be14-2b1b95e17f21","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false}},{"type":"paragraph","attrs":{"id":"7a4e1e77-e38f-46f9-8385-47da9fc95535","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"1.redis 自动化运维最佳实践|得物技术"}]},{"type":"paragraph","attrs":{"id":"e0ba1a14-b923-48b7-9f34-ee9fd61d6adf","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"2.claude在得物app数仓的深度集成与效能演进"}]},{"type":"paragraph","attrs":{"id":"9366b976-454d-4e5b-bcaa-af61f70993ac","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"3.claude code + openspec 正在加速 aicoding 落地:从模型博弈到工程化的范式转移|得物技术"}]},{"type":"paragraph","attrs":{"id":"2d98b5f4-3e23-416e-89b4-adf22e256501","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"4.大禹平台:流批一体离线dump平台的设计与应用|得物技术"}]},{"type":"paragraph","attrs":{"id":"d298bb54-0a9f-4775-8981-09c4fd143d79","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"5.基于 cursor agent 的流水线 ai cr 实践|得物技术"}]},{"type":"paragraph","attrs":{"id":"6ee4b6e3-696e-479a-b27d-f1c30a72570a","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false}},{"type":"heading","attrs":{"id":"b6c09885-6a7d-44d8-8252-f33e8e04fa2d","textalign":"inherit","indent":0,"level":1,"ishoverdraghandle":false},"content":[{"type":"text","text":"文 /阿程"}]},{"type":"paragraph","attrs":{"id":"76e47936-835e-44c8-a9dd-5408e3665996","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false}},{"type":"paragraph","attrs":{"id":"694e3ae7-09d2-47ef-86cf-ff895b478ca3","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"关注得物技术,每周更新技术干货"}]},{"type":"paragraph","attrs":{"id":"a14f46b4-a23f-4b57-94da-1b5968443fb0","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"要是觉得文章对你有帮助的话,欢迎评论转发点赞~"}]},{"type":"paragraph","attrs":{"id":"f390a7c3-8643-46ea-92cd-e861ed8e07b2","textalign":"inherit","indent":0,"color":null,"background":null,"ishoverdraghandle":false},"content":[{"type":"text","text":"未经得物技术许可严禁转载,否则依法追究法律责任。"}]}]}











