maycur-ai-bug-clue-analyzer — 缺陷线索分析
链路起点:从用户输入或 TB 提取缺陷线索,产出 clue/clue.md 指引下游 log-analyzer 查日志。不支持独立使用,只在 bug-killer 编排下跑。
收集优先级
- 对话或 TB 中出现 traceId → 立即结束收集,直接进日志分析
- 有 TB → 重点提取异常代码/异常提示(便于日志查询)→ 其次 entCode/单据号/环境
- 都没有 → 向用户索取
必填校验(collect_clue.py 执行)
- 有 traceId → 通过
- 否则必须:entCode + 环境 +(单据号 OR 异常信息)齐全
Claude vs 脚本分工
- Claude:调 tb skill
QueryTaskV3(TB 方式)+ 语义提取字段 - collect_clue.py:必填校验 + 时间窗 + 生成 clue.md / {tb_id}.md
执行流程
- 接收 bug-killer 编排器传入
{bug_dir, 用户原始输入} - 判断来源:
- 输入含 tb id → TB 方式:调 tb skill
QueryTaskV3拿 TB 详情(存入 tb_raw) - 否则 → 对话方式:AskUserQuestion 收集(traceId?entCode?单据号?环境?异常代码/提示?)
- 输入含 tb id → TB 方式:调 tb skill
- 语义提取字段:entCode / 单据号 / 环境 / 异常代码 / 异常提示 / traceId / 发生时间(TB 自定义字段优先,回退创建时间)
- 若已获 traceId → 跳过进一步收集
- 组装 payload JSON:
{
"bug_id": "...", "source": "tb|dialogue", "tb_id": "...",
"summary": "一句话现象",
"tb_raw": { "...QueryTaskV3 返回..." },
"fields": {"entCode":"...","单据号":"...","环境":"prod|sit|uat",
"异常代码":"...","异常提示":"...","traceId":"...",
"发生时间":"ISO本地时间","env_source":"用户明确|TB字段|堆栈推断"},
"output_dir": "<bug_dir>/clue"
}
- 调脚本:
python <skill-dir>/scripts/collect_clue.py --input <payload.json>
- 脚本退出码 1(校验失败)→ 读 stderr 缺失字段 → AskUserQuestion 补 → 重调脚本
- 退出码 0 →
clue/clue.md(+clue/{tb_id}.md)已生成,结束
时间窗(脚本计算)
- 有 TB:
from = 发生时间 - 1天,to = 发生时间 - 无 TB:
from = now - 48h,to = now
产出
clue/clue.md(必有):线索摘要 + 关键字段 + 时间窗 + 日志查询建议clue/{tb_id}.md(TB 方式):TB 完整信息文档
边界
- 不查日志(log-analyzer)、不调 opser(code-manager)、不做代码分析(code-analyzer)
- 单一路径:查日志(sls + langfuse)
- 不独立使用
依赖
- tb skill(TB 方式):
QueryTaskV3 - collect_clue.py(自带脚本)