| @@ -0,0 +1,148 @@ | |||
| 1 | +# issue-response-eval 评测系统开发过程记录 | ||
| 2 | + | ||
| 3 | +> 日期: 2026-07-06 | ||
| 4 | +> 分支: feat/issue-response-eval | ||
| 5 | +> 关联: PR #2551 (issue-response skill) | ||
| 6 | + | ||
| 7 | +## 1. 起因 | ||
| 8 | + | ||
| 9 | +PR #2551 提交了 `issue-response` skill(GitCode Issue 分级回复助手),已经过 12 轮测试覆盖度达 95%,但存在三个问题: | ||
| 10 | +- 测试用例仅 3 条,无法覆盖各子场景 | ||
| 11 | +- 不可回归,每次修改后无法自动验证是否退化 | ||
| 12 | +- 采纳效率未知,草稿与维护者真实回复的差距缺乏量化 | ||
| 13 | + | ||
| 14 | +用户希望构建系统性评测,通过"历史提交回放 + 模拟回复 + 采纳效率"驱动 skill 持续迭代。 | ||
| 15 | + | ||
| 16 | +## 2. 头脑风暴与方案选择 | ||
| 17 | + | ||
| 18 | +通过 brainstorming skill 进行 5 轮澄清问答: | ||
| 19 | + | ||
| 20 | +| 问题 | 用户选择 | | ||
| 21 | +|------|---------| | ||
| 22 | +| 采纳效率定义 | 两者结合:历史回放基准 + 实时人工采纳 | | ||
| 23 | +| 基准集规模 | 分层抽样 ~20 条 | | ||
| 24 | +| 对比打分方式 | 规则打分 + LLM 裁判 | | ||
| 25 | +| 迭代节奏 | 每轮基准后立即迭代 | | ||
| 26 | +| 架构方案 | 方案 B:评测 skill + 基准数据集(非纯脚本/非 CI 门禁) | | ||
| 27 | + | ||
| 28 | +## 3. 外部 Issue 集筛选 | ||
| 29 | + | ||
| 30 | +### 3.1 全量扫描 | ||
| 31 | + | ||
| 32 | +从 GitCode API 拉取仓库全部 631 条 issue,按以下维度分类: | ||
| 33 | +- assignee 是否为 null | ||
| 34 | +- 提交者 login 与实名映射 | ||
| 35 | +- 标题前缀([Question]/[Documentation]/[Bug-Report]/[Requirement]) | ||
| 36 | +- 正文摘要 | ||
| 37 | + | ||
| 38 | +### 3.2 用户人工标注 | ||
| 39 | + | ||
| 40 | +生成 `issue-review-with-bodies.md`(含提交者实名+正文摘要,判定栏在最前),用户逐条标注: | ||
| 41 | +- 外部 = 1 | ||
| 42 | +- 内部 = 0(空) | ||
| 43 | +- 无法辨别 = 不标 | ||
| 44 | +- QA = 用户不区分,由我自动判定 | ||
| 45 | + | ||
| 46 | +### 3.3 标注结果 | ||
| 47 | + | ||
| 48 | +| 分类 | 总数 | 外部(1) | 内部(空) | 其他 | | ||
| 49 | +|------|------|---------|---------|------| | ||
| 50 | +| C类(咨询/文档) | 32 | 28 | 3 | 1(没法辨别) | | ||
| 51 | +| D1(MBpanzz代码审计) | 5 | 5 | 0 | — | | ||
| 52 | +| D2(RiddleTan编译/样例) | 12 | 12 | 0 | — (我判定2条QA: #193 #68) | | ||
| 53 | +| D3(内部账号bug) | 12 | 5 | 7 | — | | ||
| 54 | +| D4(剩余bug) | 15 | 1(#16) | 14 | — | | ||
| 55 | +| F类(无前缀非CVE) | 6 | 0 | 6 | — | | ||
| 56 | + | ||
| 57 | +对空标注中疑似外部的 issue 做二次确认,用户追认 #275 #295 #448 #502 为外部。 | ||
| 58 | + | ||
| 59 | +### 3.4 最终外部 Issue 集:53 条 | ||
| 60 | + | ||
| 61 | +全部 53 条均有维护者回复(ground truth)。 | ||
| 62 | + | ||
| 63 | +## 4. 基准数据集构建 | ||
| 64 | + | ||
| 65 | +### 4.1 L0/L1/L2 分类 | ||
| 66 | + | ||
| 67 | +对 53 条做自动分类(基于标题/正文/回复的关键词规则),分布: | ||
| 68 | +- L0/doc-faq: 15 | ||
| 69 | +- L1/error-code-log: 14 | ||
| 70 | +- L1/hw-concept: 2 | ||
| 71 | +- L1/build-sample: 3 | ||
| 72 | +- L2/code-audit: 5 | ||
| 73 | +- L2/cross-platform: 11(含样例失败误分类) | ||
| 74 | +- L2/framework-integration: 3 | ||
| 75 | + | ||
| 76 | +### 4.2 分层抽样 20 条 | ||
| 77 | + | ||
| 78 | +| Level | Subtype | 配额 | 选取 issue | | ||
| 79 | +|-------|---------|------|-----------| | ||
| 80 | +| L0 | doc-faq | 6 | #110 #142 #152 #19 #321 #651 | | ||
| 81 | +| L1 | error-code-log | 4 | #164 #27 #480 #59 | | ||
| 82 | +| L1 | hw-concept | 2 | #624 #613 | | ||
| 83 | +| L1 | build-sample | 4 | #52 #54 #44 #38 | | ||
| 84 | +| L2 | framework-integration | 1 | #275 | | ||
| 85 | +| L2 | code-audit | 2 | #645 #647 | | ||
| 86 | +| L2 | complex-analysis | 1 | #448 | | ||
| 87 | + | ||
| 88 | +## 5. 设计文档 | ||
| 89 | + | ||
| 90 | +完整设计 spec 保存于 `docs/superpowers/specs/2026-07-06-issue-response-eval-design.md`,涵盖: | ||
| 91 | +- §1 背景与目标 | ||
| 92 | +- §2 外部 Issue 集确认(53条筛选过程) | ||
| 93 | +- §3 整体架构(两条回路 + 关键约束) | ||
| 94 | +- §4 基准数据集(20条配额 + 记录结构) | ||
| 95 | +- §5 打分器(R1-R6 规则 + LLM 裁判 + 综合分公式) | ||
| 96 | +- §6 评测执行器(subagent 驱动 + 强制草稿模式) | ||
| 97 | +- §7 迭代闭环(基准迭代 + 实时分流通路 + 版本管理) | ||
| 98 | +- §8 文件结构 | ||
| 99 | +- §9 待办(图片内容解析) | ||
| 100 | + | ||
| 101 | +## 6. 实现计划与执行 | ||
| 102 | + | ||
| 103 | +实现计划保存于 `docs/superpowers/plans/2026-07-06-issue-response-eval.md`(8 个 Task,1295 行)。 | ||
| 104 | + | ||
| 105 | +通过 subagent-driven-development 执行,每个 Task 派 fresh subagent: | ||
| 106 | + | ||
| 107 | +| Task | 内容 | Commit | 状态 | | ||
| 108 | +|------|------|--------|------| | ||
| 109 | +| 1 | 创建 skill 目录骨架 + SKILL.md | 840bf7e | 完成 | | ||
| 110 | +| 2 | 构建 benchmark.jsonl 20 条 | c6633a2 | 完成 | | ||
| 111 | +| 3 | 实现 run_benchmark.sh | 3ba9b00 | 完成 | | ||
| 112 | +| 4 | 实现 score.py(R1-R6 + LLM 裁判) | 1d4c7fd | 完成 | | ||
| 113 | +| 5 | 验证 score.py 空跑 | e72f30e | 完成 | | ||
| 114 | +| 6 | 实现 regress.sh | 2c56693 | 完成 | | ||
| 115 | +| 7 | 实现 triage_open.sh | c06cd77 | 完成 | | ||
| 116 | +| 8 | 端到端验证 + 使用示例 | 86ec6b0 | 完成 | | ||
| 117 | + | ||
| 118 | +最终审查(全分支 review):功能完整性/代码质量/安全性/一致性四维全部 PASS。 | ||
| 119 | + | ||
| 120 | +## 7. 交付物 | ||
| 121 | + | ||
| 122 | +``` | ||
| 123 | +.claude/skills/issue-response-eval/ | ||
| 124 | +├── SKILL.md — 评测流程编排 + 使用示例 | ||
| 125 | +├── evals/ | ||
| 126 | +│ ├── benchmark.jsonl — 20 条基准(L0×6 L1×10 L2×4) | ||
| 127 | +│ └── live_decisions.jsonl — 实时决策记录(空,待累积) | ||
| 128 | +├── scripts/ | ||
| 129 | +│ ├── run_benchmark.sh — 基准执行器 | ||
| 130 | +│ ├── score.py — 打分器(R1-R6 + LLM 裁判) | ||
| 131 | +│ ├── triage_open.sh — 实时分流 + 采纳率统计 | ||
| 132 | +│ └── regress.sh — 回归验证 | ||
| 133 | +├── reports/ | ||
| 134 | +│ ├── drafts/ — 草稿落盘目录 | ||
| 135 | +│ ├── run_log.json — 执行日志 | ||
| 136 | +│ ├── scores.jsonl — 打分结果 | ||
| 137 | +│ └── score_summary.json — 打分汇总 | ||
| 138 | +└── references/ | ||
| 139 | + ├── scoring-rubric.md — 打分标准 + LLM 裁判 prompt | ||
| 140 | + └── benchmark-sampling.md — 抽样规则 + 分类配额 | ||
| 141 | +``` | ||
| 142 | + | ||
| 143 | +## 8. 待办 | ||
| 144 | + | ||
| 145 | +- **图片内容解析**:约 15 条基准 issue 的关键信息在截图中(标记为 [图]),当前无法自动解析。后续考虑接入 OCR + 图像理解,或人工补充 `image_descriptions` 字段。 | ||
| 146 | +- **subagent 接入**:run_benchmark.sh 和 regress.sh 中的 subagent 调用目前是 echo 占位,需接入 opencode Task subagent 实际驱动 issue-response skill。 | ||
| 147 | +- **LLM 裁判自动化**:score.py 当前输出 LLM 裁判 prompt 但不自动执行,需接入 LLM 能力自动打分。 | ||
| 148 | +- **基准扩展**:剩余 33 条外部 issue 作为扩展池,可通过实时分流通路逐步回灌 benchmark.jsonl。 | ||
| @@ -0,0 +1,81 @@ | |||
| 1 | +--- | ||
| 2 | +name: issue-response-eval | ||
| 3 | +description: > | ||
| 4 | + 对 issue-response skill 进行系统性评测和迭代驱动。支持基准回放(20条历史外部issue)、 | ||
| 5 | + 实时分流(新open issue生成草稿+人工采纳决策)、迭代闭环(失败用例→修改skill→重跑验证)。 | ||
| 6 | + 当用户要求评测 issue-response skill、跑基准测试、评估回复质量、运行 eval、 | ||
| 7 | + "评测skill"、"跑基准"、"benchmark回归"、"实时分流"、"采纳率统计"时触发。 | ||
| 8 | +--- | ||
| 9 | + | ||
| 10 | +# Skill: issue-response-eval | ||
| 11 | + | ||
| 12 | +## 核心定位 | ||
| 13 | + | ||
| 14 | +对 issue-response skill 的回复质量进行系统性评测,驱动持续迭代。评测全程不提交任何 issue 评论。 | ||
| 15 | + | ||
| 16 | +## 三条工作回路 | ||
| 17 | + | ||
| 18 | +### 1. 基准回放(run_benchmark.sh) | ||
| 19 | + | ||
| 20 | +对 evals/benchmark.jsonl 中的 20 条历史外部 issue,用 Task subagent 真实跑 issue-response skill 全流程,生成草稿后与维护者真实回复对比打分。 | ||
| 21 | + | ||
| 22 | +```bash | ||
| 23 | +bash scripts/run_benchmark.sh | ||
| 24 | +``` | ||
| 25 | + | ||
| 26 | +输出:`reports/benchmark_v{N}.json` + `reports/benchmark_v{N}.md` | ||
| 27 | + | ||
| 28 | +### 2. 实时分流(triage_open.sh) | ||
| 29 | + | ||
| 30 | +拉取新的外部 open issue,跑 skill 生成草稿,人工录入采纳/改/拒决策。 | ||
| 31 | + | ||
| 32 | +```bash | ||
| 33 | +bash scripts/triage_open.sh | ||
| 34 | +``` | ||
| 35 | + | ||
| 36 | +### 3. 迭代闭环 | ||
| 37 | + | ||
| 38 | +基准跑完 → 分析失败用例 → 修改 issue-response skill → regress.sh 重跑验证 → 全量回归。 | ||
| 39 | + | ||
| 40 | +```bash | ||
| 41 | +bash scripts/regress.sh <issue_numbers_comma_separated> | ||
| 42 | +``` | ||
| 43 | + | ||
| 44 | +## 关键约束 | ||
| 45 | + | ||
| 46 | +- 评测全程不提交 issue 评论,草稿只落盘到 reports/drafts/ | ||
| 47 | +- subagent 强制"仅草稿模式",禁止调用 gitcode-pr | ||
| 48 | +- 通过线:基准总分 0.85 | ||
| 49 | +- LLM 裁判跑 2 次取均分,分差 >1 标记 disputed | ||
| 50 | + | ||
| 51 | +## 使用示例 | ||
| 52 | + | ||
| 53 | +### 跑一轮完整基准评测 | ||
| 54 | + | ||
| 55 | +```bash | ||
| 56 | +cd .claude/skills/issue-response-eval | ||
| 57 | +bash scripts/run_benchmark.sh # subagent 跑 20 条 issue 生成草稿 | ||
| 58 | +python3 scripts/score.py # 打分 | ||
| 59 | +cat reports/score_summary.json # 查看汇总 | ||
| 60 | +``` | ||
| 61 | + | ||
| 62 | +### 回归验证失败用例 | ||
| 63 | + | ||
| 64 | +```bash | ||
| 65 | +bash scripts/regress.sh 624,645 # 只重跑 #624 和 #645 | ||
| 66 | +python3 scripts/score.py # 重新打分 | ||
| 67 | +``` | ||
| 68 | + | ||
| 69 | +### 实时分流新 issue | ||
| 70 | + | ||
| 71 | +```bash | ||
| 72 | +export GITCODE_API_TOKEN="your_token" | ||
| 73 | +bash scripts/triage_open.sh # 拉取新 open issue 生成草稿 | ||
| 74 | +``` | ||
| 75 | + | ||
| 76 | +### 迭代闭环 | ||
| 77 | + | ||
| 78 | +1. 跑基准 → score.py 输出失败用例 | ||
| 79 | +2. 分析失败原因 → 修改 issue-response skill 的 SKILL.md/references/ | ||
| 80 | +3. regress.sh 重跑失败用例验证 | ||
| 81 | +4. 每隔 3 轮跑一次全量回归 | ||
| @@ -0,0 +1,20 @@ | |||
| 1 | +{"id":"bm-001","issue_number":110,"expected_level":"L0","expected_subtype":"doc-faq","ground_truth_reply_summary":"维护者回复:build中编译用于前置校验,并非开源发布。该部分需要结合闭源代码在其他子包中发布。","expected_checkpoints":["应说明runtime_camodel的so不在开源产物中","应解释cmodel是内部编译校验用途"],"tags":["build","cmodel"],"notes":""} | ||
| 2 | +{"id":"bm-002","issue_number":142,"expected_level":"L0","expected_subtype":"doc-faq","ground_truth_reply_summary":"维护者回复:建议到cann/community咨询版本对应关系。","expected_checkpoints":["应识别为版本咨询类","应引导用户到正确渠道cann/community"],"tags":["version","redirect"],"notes":""} | ||
| 3 | +{"id":"bm-003","issue_number":152,"expected_level":"L0","expected_subtype":"doc-faq","ground_truth_reply_summary":"维护者回复:runtime对外发布接口及支持情况在docs目录有说明,rtIpcOpenMemory是内部接口。","expected_checkpoints":["应说明rtIpcOpenMemory为内部接口","应引导查看docs目录的接口支持情况"],"tags":["api","internal-interface"],"notes":""} | ||
| 4 | +{"id":"bm-004","issue_number":19,"expected_level":"L0","expected_subtype":"doc-faq","ground_truth_reply_summary":"维护者回复:record接口异步体现在event运行在stream上,record本身下发到设备是同步的。Host侧调用先后顺序不保证多线程下query/sync获取预期结果。","expected_checkpoints":["应解释record的异步语义","应说明多线程下时序不保证","应提供线程安全使用建议"],"tags":["thread-safety","event","async"],"notes":"DEV_REPORT已测试"} | ||
| 5 | +{"id":"bm-005","issue_number":321,"expected_level":"L0","expected_subtype":"doc-faq","ground_truth_reply_summary":"维护者回复:详细解答了runtime库卸载步骤和run包安装路径管理。","expected_checkpoints":["应提供uninstall步骤","应说明install-path管理方式"],"tags":["uninstall","install"],"notes":""} | ||
| 6 | +{"id":"bm-006","issue_number":651,"expected_level":"L0","expected_subtype":"doc-faq","ground_truth_reply_summary":"维护者回复:aclrtSetDevice首次调用耗时较长是正常行为,涉及设备初始化。","expected_checkpoints":["应说明首次调用涉及设备初始化","应说明这是正常行为"],"tags":["performance","setdevice","init"],"notes":""} | ||
| 7 | +{"id":"bm-007","issue_number":164,"expected_level":"L1","expected_subtype":"error-code-log","ground_truth_reply_summary":"维护者回复:未使能默认device时aclrtmalloc会报错拦截;跨device访问需enablep2p调用aclrtDeviceCanAccessPeer。","expected_checkpoints":["应说明aclrtmalloc需先setdevice","应解释p2p访问需enablep2p","应提到aclrtDeviceCanAccessPeer接口"],"tags":["malloc","p2p","device"],"notes":""} | ||
| 8 | +{"id":"bm-008","issue_number":27,"expected_level":"L1","expected_subtype":"error-code-log","ground_truth_reply_summary":"维护者回复:runtime包编译安装后与cann包ABI不兼容,undefined symbol是版本不匹配导致。","expected_checkpoints":["应识别为ABI不匹配问题","应建议使用匹配版本的cann包","应解释undefined symbol的根因"],"tags":["abi","link-error","version-mismatch"],"notes":""} | ||
| 9 | +{"id":"bm-009","issue_number":480,"expected_level":"L1","expected_subtype":"error-code-log","ground_truth_reply_summary":"维护者回复:分析aicore异常的排查方向,建议收集plog日志定位。","expected_checkpoints":["应引导收集plog日志","应提供aicore异常排查方向","应说明plog定位异常而非仅Device侧异常"],"tags":["aicore","plog","error"],"notes":""} | ||
| 10 | +{"id":"bm-010","issue_number":59,"expected_level":"L1","expected_subtype":"error-code-log","ground_truth_reply_summary":"维护者回复:openssl/sha.h缺失是依赖未安装,需安装libssl-dev或openssl-devel。","expected_checkpoints":["应识别为openssl依赖缺失","应提供安装命令libssl-dev/openssl-devel"],"tags":["openssl","build-dep"],"notes":""} | ||
| 11 | +{"id":"bm-011","issue_number":624,"expected_level":"L1","expected_subtype":"hw-concept","ground_truth_reply_summary":"维护者回复:ATC的aicore-num是编译时参数,rtKernelLaunch的numBlocks是运行时参数,两者不互相约束。blockDim由算子编译决定。","expected_checkpoints":["应区分编译时参数aicore-num与运行时参数blockDim","应说明两者不互相约束","应提到slog可查block信息"],"tags":["aicore-num","blockdim","compile-vs-runtime"],"notes":"DEV_REPORT已测试,触发slog/plog区分改进"} | ||
| 12 | +{"id":"bm-012","issue_number":613,"expected_level":"L1","expected_subtype":"hw-concept","ground_truth_reply_summary":"维护者回复:GM/L2/UB三级存储由硬件自动调度,当前无API手动约束L2驻留。","expected_checkpoints":["应解释GM/L2/UB三级存储","应说明当前无手动L2驻留API","应提供替代优化方向"],"tags":["l2-cache","storage","ascendc"],"notes":""} | ||
| 13 | +{"id":"bm-013","issue_number":52,"expected_level":"L1","expected_subtype":"build-sample","ground_truth_reply_summary":"维护者回复:0_simple_model样例失败因缺少aclnnop头文件,需安装配套opp包。","expected_checkpoints":["应识别aclnn_add.h缺失根因","应指导安装opp包","应提供样例编译前置依赖说明"],"tags":["sample","aclnnop","opp"],"notes":""} | ||
| 14 | +{"id":"bm-014","issue_number":54,"expected_level":"L1","expected_subtype":"build-sample","ground_truth_reply_summary":"维护者回复:libopapi.so找不到是LD_LIBRARY_PATH未设置,需source环境变量。","expected_checkpoints":["应识别libopapi.so缺失根因","应指导设置LD_LIBRARY_PATH","应提供source环境变量步骤"],"tags":["sample","ld-library-path","opapi"],"notes":""} | ||
| 15 | +{"id":"bm-015","issue_number":44,"expected_level":"L1","expected_subtype":"build-sample","ground_truth_reply_summary":"维护者回复:aclrtMallocHost报错107002是内存不足或设备未初始化。","expected_checkpoints":["应识别错误码107002含义","应排查设备初始化状态","应提供MallocHost失败排查步骤"],"tags":["sample","mallochost","107002"],"notes":""} | ||
| 16 | +{"id":"bm-016","issue_number":38,"expected_level":"L1","expected_subtype":"build-sample","ground_truth_reply_summary":"维护者回复:install_deps.sh不支持EulerOS,需手动安装依赖。","expected_checkpoints":["应识别EulerOS不被自动支持","应提供手动安装依赖指引","应说明install_deps.sh支持的OS列表"],"tags":["install-deps","euleros","os-support"],"notes":""} | ||
| 17 | +{"id":"bm-017","issue_number":275,"expected_level":"L2","expected_subtype":"framework-integration","ground_truth_reply_summary":"维护者回复:ATC转换失败涉及动态shape处理,建议简化模型或使用固定shape。","expected_checkpoints":["应分析ATC动态shape限制","应提供简化模型建议","应说明框架集成的已知限制"],"tags":["atc","onnx","dynamic-shape"],"notes":""} | ||
| 18 | +{"id":"bm-018","issue_number":645,"expected_level":"L2","expected_subtype":"code-audit","ground_truth_reply_summary":"维护者回复:经再审查确认不存在实际问题,TPRT设备关闭后文件描述符不会被用于读写操作。","expected_checkpoints":["应源码验证TprtDeviceRead/Write的生命周期检查","应输出明确的验证结论","不应仅给建议验证方向"],"tags":["uaf","tprt","code-audit"],"notes":"DEV_REPORT已测试,触发源码自动验证改进"} | ||
| 19 | +{"id":"bm-019","issue_number":647,"expected_level":"L2","expected_subtype":"code-audit","ground_truth_reply_summary":"维护者回复:经再审查确认不存在实质性问题,offset+write_size越界路径已有保护。","expected_checkpoints":["应源码验证offset+write_size是否有联合越界检查","应输出明确的验证结论","应附具体代码行号证据"],"tags":["overflow","buffer","code-audit"],"notes":"DEV_REPORT已测试"} | ||
| 20 | +{"id":"bm-020","issue_number":448,"expected_level":"L2","expected_subtype":"complex-analysis","ground_truth_reply_summary":"维护者回复:数据拷贝接口性能波动大,需实验对比不同拷贝方式,可能涉及硬件调度策略。","expected_checkpoints":["应分析性能波动可能原因","应建议profiling对比","应说明需实验验证"],"tags":["performance","memcpy","910c"],"notes":""} | ||
| @@ -0,0 +1,21 @@ | |||
| 1 | +# 基准抽样规则 | ||
| 2 | + | ||
| 3 | +## 数据来源 | ||
| 4 | + | ||
| 5 | +仓库全部 631 条 issue 中,筛选出 53 条外部社区 issue(assignee=null 且非内部开发/QA/CVE),全部有维护者回复。 | ||
| 6 | + | ||
| 7 | +## 分类配额(20条) | ||
| 8 | + | ||
| 9 | +| Level | Subtype | 配额 | 选取 issue | | ||
| 10 | +|-------|---------|------|-----------| | ||
| 11 | +| L0 | doc-faq | 6 | #110 #142 #152 #19 #321 #651 | | ||
| 12 | +| L1 | error-code-log | 4 | #164 #27 #480 #59 | | ||
| 13 | +| L1 | hw-concept | 2 | #624 #613 | | ||
| 14 | +| L1 | build-sample | 4 | #52 #54 #44 #38 | | ||
| 15 | +| L2 | framework-integration | 1 | #275 | | ||
| 16 | +| L2 | code-audit | 2 | #645 #647 | | ||
| 17 | +| L2 | complex-analysis | 1 | #448 | | ||
| 18 | + | ||
| 19 | +## 扩展机制 | ||
| 20 | + | ||
| 21 | +实时分流通路中被判定"采纳"或"需大改"的高价值案例,经人工审核后回灌 benchmark.jsonl,版本 +1。 | ||
| @@ -0,0 +1,49 @@ | |||
| 1 | +# 打分标准 | ||
| 2 | + | ||
| 3 | +## 规则检查层(R1-R6) | ||
| 4 | + | ||
| 5 | +| # | 检查项 | 判定方法 | 通过条件 | | ||
| 6 | +|---|--------|---------|---------| | ||
| 7 | +| R1 | 分类一致性 | exec_log.classified_level == benchmark.expected_level | 完全匹配 | | ||
| 8 | +| R2 | 链接可达性 | 草稿中所有 gitcode.com/cann/runtime/blob/master/docs/... 链接,git show origin/master:<path> 全部存在 | 全部存在 | | ||
| 9 | +| R3 | 错误码引用正确 | 草稿引用的错误码含义与 log-analyzer.md 一致;issue有错误码与API不匹配时草稿须指出 | 一致或指出不匹配 | | ||
| 10 | +| R4 | 检查点覆盖 | benchmark.expected_checkpoints 每条做关键词匹配,覆盖率 >= N-1 | >= N-1 | | ||
| 11 | +| R5 | 不重复维护者回复 | 草稿不含 ground_truth_reply_summary 核心结论的简单重复 | 有增量 | | ||
| 12 | +| R6 | 源码验证结论存在 | L2 或 issue含代码引用时,草稿含 ✅/❌/⚠️ 标记的明确结论 | 存在明确结论 | | ||
| 13 | + | ||
| 14 | +## LLM 裁判层(3维度 0-2分) | ||
| 15 | + | ||
| 16 | +### 裁判 Prompt | ||
| 17 | + | ||
| 18 | +你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。 | ||
| 19 | + | ||
| 20 | +## Issue 原文 | ||
| 21 | +{issue_text} | ||
| 22 | + | ||
| 23 | +## AI 生成草稿 | ||
| 24 | +{draft_text} | ||
| 25 | + | ||
| 26 | +## 维护者真实回复摘要 | ||
| 27 | +{ground_truth_summary} | ||
| 28 | + | ||
| 29 | +## 打分维度 | ||
| 30 | + | ||
| 31 | +| 维度 | 0分 | 1分 | 2分 | | ||
| 32 | +|------|-----|-----|-----| | ||
| 33 | +| accuracy(技术准确性) | 有事实错误/误导 | 无错但不完整 | 准确且完整 | | ||
| 34 | +| actionability(可执行性) | 无可操作步骤 | 有方向但模糊 | 有具体操作步骤 | | ||
| 35 | +| adoptability(采纳适宜度) | 维护者不会采纳 | 需大改后可采纳 | 可直接采纳或微调采纳 | | ||
| 36 | + | ||
| 37 | +请输出 JSON: | ||
| 38 | +{"accuracy": 0-2, "actionability": 0-2, "adoptability": 0-2, "reasoning": "简要说明"} | ||
| 39 | + | ||
| 40 | +## 综合分计算 | ||
| 41 | + | ||
| 42 | +单条总分 = (R1..R6 通过率 * 0.6) + (LLM 三维均分/2 * 0.4) | ||
| 43 | +基准总分 = 20 条均分 | ||
| 44 | +通过线 = 0.85 | ||
| 45 | + | ||
| 46 | +## LLM 裁判降随机性 | ||
| 47 | + | ||
| 48 | +- 同一草稿跑 2 次,取均分 | ||
| 49 | +- 两次分差 >1 的维度标记 disputed | ||
| @@ -0,0 +1 @@ | |||
| 1 | +{"version":1,"timestamp":"test","results":[]} | ||
| @@ -0,0 +1,948 @@ | |||
| 1 | +{ | ||
| 2 | + "total_issues": 20, | ||
| 3 | + "passed": 0, | ||
| 4 | + "avg_score": 0.0, | ||
| 5 | + "pass_threshold": 0.85, | ||
| 6 | + "results": [ | ||
| 7 | + { | ||
| 8 | + "id": "bm-001", | ||
| 9 | + "issue_number": 110, | ||
| 10 | + "expected_level": "L0", | ||
| 11 | + "rule_results": [ | ||
| 12 | + { | ||
| 13 | + "rule": "R1", | ||
| 14 | + "passed": false, | ||
| 15 | + "detail": "classified=UNKNOWN, expected=L0" | ||
| 16 | + }, | ||
| 17 | + { | ||
| 18 | + "rule": "R2", | ||
| 19 | + "passed": false, | ||
| 20 | + "detail": "草稿不存在" | ||
| 21 | + }, | ||
| 22 | + { | ||
| 23 | + "rule": "R3", | ||
| 24 | + "passed": false, | ||
| 25 | + "detail": "草稿不存在" | ||
| 26 | + }, | ||
| 27 | + { | ||
| 28 | + "rule": "R4", | ||
| 29 | + "passed": false, | ||
| 30 | + "detail": "草稿不存在" | ||
| 31 | + }, | ||
| 32 | + { | ||
| 33 | + "rule": "R5", | ||
| 34 | + "passed": false, | ||
| 35 | + "detail": "草稿不存在" | ||
| 36 | + }, | ||
| 37 | + { | ||
| 38 | + "rule": "R6", | ||
| 39 | + "passed": false, | ||
| 40 | + "detail": "草稿不存在" | ||
| 41 | + } | ||
| 42 | + ], | ||
| 43 | + "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:build中编译用于前置校验,并非开源发布。该部分需要结合闭源代码在其他子包中发布。\n\n## 打分维度\n| 维度 | 0分 | 1分 | 2分 |\n|------|--...", | ||
| 44 | + "score": { | ||
| 45 | + "total": 0.0, | ||
| 46 | + "rule_score": 0.0, | ||
| 47 | + "llm_score": 0, | ||
| 48 | + "rule_passed": 0, | ||
| 49 | + "rule_total": 6, | ||
| 50 | + "llm_scores": null, | ||
| 51 | + "passed": false | ||
| 52 | + } | ||
| 53 | + }, | ||
| 54 | + { | ||
| 55 | + "id": "bm-002", | ||
| 56 | + "issue_number": 142, | ||
| 57 | + "expected_level": "L0", | ||
| 58 | + "rule_results": [ | ||
| 59 | + { | ||
| 60 | + "rule": "R1", | ||
| 61 | + "passed": false, | ||
| 62 | + "detail": "classified=UNKNOWN, expected=L0" | ||
| 63 | + }, | ||
| 64 | + { | ||
| 65 | + "rule": "R2", | ||
| 66 | + "passed": false, | ||
| 67 | + "detail": "草稿不存在" | ||
| 68 | + }, | ||
| 69 | + { | ||
| 70 | + "rule": "R3", | ||
| 71 | + "passed": false, | ||
| 72 | + "detail": "草稿不存在" | ||
| 73 | + }, | ||
| 74 | + { | ||
| 75 | + "rule": "R4", | ||
| 76 | + "passed": false, | ||
| 77 | + "detail": "草稿不存在" | ||
| 78 | + }, | ||
| 79 | + { | ||
| 80 | + "rule": "R5", | ||
| 81 | + "passed": false, | ||
| 82 | + "detail": "草稿不存在" | ||
| 83 | + }, | ||
| 84 | + { | ||
| 85 | + "rule": "R6", | ||
| 86 | + "passed": false, | ||
| 87 | + "detail": "草稿不存在" | ||
| 88 | + } | ||
| 89 | + ], | ||
| 90 | + "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:建议到cann/community咨询版本对应关系。\n\n## 打分维度\n| 维度 | 0分 | 1分 | 2分 |\n|------|-----|-----|-----|...", | ||
| 91 | + "score": { | ||
| 92 | + "total": 0.0, | ||
| 93 | + "rule_score": 0.0, | ||
| 94 | + "llm_score": 0, | ||
| 95 | + "rule_passed": 0, | ||
| 96 | + "rule_total": 6, | ||
| 97 | + "llm_scores": null, | ||
| 98 | + "passed": false | ||
| 99 | + } | ||
| 100 | + }, | ||
| 101 | + { | ||
| 102 | + "id": "bm-003", | ||
| 103 | + "issue_number": 152, | ||
| 104 | + "expected_level": "L0", | ||
| 105 | + "rule_results": [ | ||
| 106 | + { | ||
| 107 | + "rule": "R1", | ||
| 108 | + "passed": false, | ||
| 109 | + "detail": "classified=UNKNOWN, expected=L0" | ||
| 110 | + }, | ||
| 111 | + { | ||
| 112 | + "rule": "R2", | ||
| 113 | + "passed": false, | ||
| 114 | + "detail": "草稿不存在" | ||
| 115 | + }, | ||
| 116 | + { | ||
| 117 | + "rule": "R3", | ||
| 118 | + "passed": false, | ||
| 119 | + "detail": "草稿不存在" | ||
| 120 | + }, | ||
| 121 | + { | ||
| 122 | + "rule": "R4", | ||
| 123 | + "passed": false, | ||
| 124 | + "detail": "草稿不存在" | ||
| 125 | + }, | ||
| 126 | + { | ||
| 127 | + "rule": "R5", | ||
| 128 | + "passed": false, | ||
| 129 | + "detail": "草稿不存在" | ||
| 130 | + }, | ||
| 131 | + { | ||
| 132 | + "rule": "R6", | ||
| 133 | + "passed": false, | ||
| 134 | + "detail": "草稿不存在" | ||
| 135 | + } | ||
| 136 | + ], | ||
| 137 | + "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:runtime对外发布接口及支持情况在docs目录有说明,rtIpcOpenMemory是内部接口。\n\n## 打分维度\n| 维度 | 0分 | 1分 | 2分 |\n|-...", | ||
| 138 | + "score": { | ||
| 139 | + "total": 0.0, | ||
| 140 | + "rule_score": 0.0, | ||
| 141 | + "llm_score": 0, | ||
| 142 | + "rule_passed": 0, | ||
| 143 | + "rule_total": 6, | ||
| 144 | + "llm_scores": null, | ||
| 145 | + "passed": false | ||
| 146 | + } | ||
| 147 | + }, | ||
| 148 | + { | ||
| 149 | + "id": "bm-004", | ||
| 150 | + "issue_number": 19, | ||
| 151 | + "expected_level": "L0", | ||
| 152 | + "rule_results": [ | ||
| 153 | + { | ||
| 154 | + "rule": "R1", | ||
| 155 | + "passed": false, | ||
| 156 | + "detail": "classified=UNKNOWN, expected=L0" | ||
| 157 | + }, | ||
| 158 | + { | ||
| 159 | + "rule": "R2", | ||
| 160 | + "passed": false, | ||
| 161 | + "detail": "草稿不存在" | ||
| 162 | + }, | ||
| 163 | + { | ||
| 164 | + "rule": "R3", | ||
| 165 | + "passed": false, | ||
| 166 | + "detail": "草稿不存在" | ||
| 167 | + }, | ||
| 168 | + { | ||
| 169 | + "rule": "R4", | ||
| 170 | + "passed": false, | ||
| 171 | + "detail": "草稿不存在" | ||
| 172 | + }, | ||
| 173 | + { | ||
| 174 | + "rule": "R5", | ||
| 175 | + "passed": false, | ||
| 176 | + "detail": "草稿不存在" | ||
| 177 | + }, | ||
| 178 | + { | ||
| 179 | + "rule": "R6", | ||
| 180 | + "passed": false, | ||
| 181 | + "detail": "草稿不存在" | ||
| 182 | + } | ||
| 183 | + ], | ||
| 184 | + "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:record接口异步体现在event运行在stream上,record本身下发到设备是同步的。Host侧调用先后顺序不保证多线程下query/sync获取预期结果。\n\n...", | ||
| 185 | + "score": { | ||
| 186 | + "total": 0.0, | ||
| 187 | + "rule_score": 0.0, | ||
| 188 | + "llm_score": 0, | ||
| 189 | + "rule_passed": 0, | ||
| 190 | + "rule_total": 6, | ||
| 191 | + "llm_scores": null, | ||
| 192 | + "passed": false | ||
| 193 | + } | ||
| 194 | + }, | ||
| 195 | + { | ||
| 196 | + "id": "bm-005", | ||
| 197 | + "issue_number": 321, | ||
| 198 | + "expected_level": "L0", | ||
| 199 | + "rule_results": [ | ||
| 200 | + { | ||
| 201 | + "rule": "R1", | ||
| 202 | + "passed": false, | ||
| 203 | + "detail": "classified=UNKNOWN, expected=L0" | ||
| 204 | + }, | ||
| 205 | + { | ||
| 206 | + "rule": "R2", | ||
| 207 | + "passed": false, | ||
| 208 | + "detail": "草稿不存在" | ||
| 209 | + }, | ||
| 210 | + { | ||
| 211 | + "rule": "R3", | ||
| 212 | + "passed": false, | ||
| 213 | + "detail": "草稿不存在" | ||
| 214 | + }, | ||
| 215 | + { | ||
| 216 | + "rule": "R4", | ||
| 217 | + "passed": false, | ||
| 218 | + "detail": "草稿不存在" | ||
| 219 | + }, | ||
| 220 | + { | ||
| 221 | + "rule": "R5", | ||
| 222 | + "passed": false, | ||
| 223 | + "detail": "草稿不存在" | ||
| 224 | + }, | ||
| 225 | + { | ||
| 226 | + "rule": "R6", | ||
| 227 | + "passed": false, | ||
| 228 | + "detail": "草稿不存在" | ||
| 229 | + } | ||
| 230 | + ], | ||
| 231 | + "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:详细解答了runtime库卸载步骤和run包安装路径管理。\n\n## 打分维度\n| 维度 | 0分 | 1分 | 2分 |\n|------|-----|-----|---...", | ||
| 232 | + "score": { | ||
| 233 | + "total": 0.0, | ||
| 234 | + "rule_score": 0.0, | ||
| 235 | + "llm_score": 0, | ||
| 236 | + "rule_passed": 0, | ||
| 237 | + "rule_total": 6, | ||
| 238 | + "llm_scores": null, | ||
| 239 | + "passed": false | ||
| 240 | + } | ||
| 241 | + }, | ||
| 242 | + { | ||
| 243 | + "id": "bm-006", | ||
| 244 | + "issue_number": 651, | ||
| 245 | + "expected_level": "L0", | ||
| 246 | + "rule_results": [ | ||
| 247 | + { | ||
| 248 | + "rule": "R1", | ||
| 249 | + "passed": false, | ||
| 250 | + "detail": "classified=UNKNOWN, expected=L0" | ||
| 251 | + }, | ||
| 252 | + { | ||
| 253 | + "rule": "R2", | ||
| 254 | + "passed": false, | ||
| 255 | + "detail": "草稿不存在" | ||
| 256 | + }, | ||
| 257 | + { | ||
| 258 | + "rule": "R3", | ||
| 259 | + "passed": false, | ||
| 260 | + "detail": "草稿不存在" | ||
| 261 | + }, | ||
| 262 | + { | ||
| 263 | + "rule": "R4", | ||
| 264 | + "passed": false, | ||
| 265 | + "detail": "草稿不存在" | ||
| 266 | + }, | ||
| 267 | + { | ||
| 268 | + "rule": "R5", | ||
| 269 | + "passed": false, | ||
| 270 | + "detail": "草稿不存在" | ||
| 271 | + }, | ||
| 272 | + { | ||
| 273 | + "rule": "R6", | ||
| 274 | + "passed": false, | ||
| 275 | + "detail": "草稿不存在" | ||
| 276 | + } | ||
| 277 | + ], | ||
| 278 | + "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:aclrtSetDevice首次调用耗时较长是正常行为,涉及设备初始化。\n\n## 打分维度\n| 维度 | 0分 | 1分 | 2分 |\n|------|-----|--...", | ||
| 279 | + "score": { | ||
| 280 | + "total": 0.0, | ||
| 281 | + "rule_score": 0.0, | ||
| 282 | + "llm_score": 0, | ||
| 283 | + "rule_passed": 0, | ||
| 284 | + "rule_total": 6, | ||
| 285 | + "llm_scores": null, | ||
| 286 | + "passed": false | ||
| 287 | + } | ||
| 288 | + }, | ||
| 289 | + { | ||
| 290 | + "id": "bm-007", | ||
| 291 | + "issue_number": 164, | ||
| 292 | + "expected_level": "L1", | ||
| 293 | + "rule_results": [ | ||
| 294 | + { | ||
| 295 | + "rule": "R1", | ||
| 296 | + "passed": false, | ||
| 297 | + "detail": "classified=UNKNOWN, expected=L1" | ||
| 298 | + }, | ||
| 299 | + { | ||
| 300 | + "rule": "R2", | ||
| 301 | + "passed": false, | ||
| 302 | + "detail": "草稿不存在" | ||
| 303 | + }, | ||
| 304 | + { | ||
| 305 | + "rule": "R3", | ||
| 306 | + "passed": false, | ||
| 307 | + "detail": "草稿不存在" | ||
| 308 | + }, | ||
| 309 | + { | ||
| 310 | + "rule": "R4", | ||
| 311 | + "passed": false, | ||
| 312 | + "detail": "草稿不存在" | ||
| 313 | + }, | ||
| 314 | + { | ||
| 315 | + "rule": "R5", | ||
| 316 | + "passed": false, | ||
| 317 | + "detail": "草稿不存在" | ||
| 318 | + }, | ||
| 319 | + { | ||
| 320 | + "rule": "R6", | ||
| 321 | + "passed": false, | ||
| 322 | + "detail": "草稿不存在" | ||
| 323 | + } | ||
| 324 | + ], | ||
| 325 | + "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:未使能默认device时aclrtmalloc会报错拦截;跨device访问需enablep2p调用aclrtDeviceCanAccessPeer。\n\n## 打分维度...", | ||
| 326 | + "score": { | ||
| 327 | + "total": 0.0, | ||
| 328 | + "rule_score": 0.0, | ||
| 329 | + "llm_score": 0, | ||
| 330 | + "rule_passed": 0, | ||
| 331 | + "rule_total": 6, | ||
| 332 | + "llm_scores": null, | ||
| 333 | + "passed": false | ||
| 334 | + } | ||
| 335 | + }, | ||
| 336 | + { | ||
| 337 | + "id": "bm-008", | ||
| 338 | + "issue_number": 27, | ||
| 339 | + "expected_level": "L1", | ||
| 340 | + "rule_results": [ | ||
| 341 | + { | ||
| 342 | + "rule": "R1", | ||
| 343 | + "passed": false, | ||
| 344 | + "detail": "classified=UNKNOWN, expected=L1" | ||
| 345 | + }, | ||
| 346 | + { | ||
| 347 | + "rule": "R2", | ||
| 348 | + "passed": false, | ||
| 349 | + "detail": "草稿不存在" | ||
| 350 | + }, | ||
| 351 | + { | ||
| 352 | + "rule": "R3", | ||
| 353 | + "passed": false, | ||
| 354 | + "detail": "草稿不存在" | ||
| 355 | + }, | ||
| 356 | + { | ||
| 357 | + "rule": "R4", | ||
| 358 | + "passed": false, | ||
| 359 | + "detail": "草稿不存在" | ||
| 360 | + }, | ||
| 361 | + { | ||
| 362 | + "rule": "R5", | ||
| 363 | + "passed": false, | ||
| 364 | + "detail": "草稿不存在" | ||
| 365 | + }, | ||
| 366 | + { | ||
| 367 | + "rule": "R6", | ||
| 368 | + "passed": false, | ||
| 369 | + "detail": "草稿不存在" | ||
| 370 | + } | ||
| 371 | + ], | ||
| 372 | + "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:runtime包编译安装后与cann包ABI不兼容,undefined symbol是版本不匹配导致。\n\n## 打分维度\n| 维度 | 0分 | 1分 | 2分 |\n|...", | ||
| 373 | + "score": { | ||
| 374 | + "total": 0.0, | ||
| 375 | + "rule_score": 0.0, | ||
| 376 | + "llm_score": 0, | ||
| 377 | + "rule_passed": 0, | ||
| 378 | + "rule_total": 6, | ||
| 379 | + "llm_scores": null, | ||
| 380 | + "passed": false | ||
| 381 | + } | ||
| 382 | + }, | ||
| 383 | + { | ||
| 384 | + "id": "bm-009", | ||
| 385 | + "issue_number": 480, | ||
| 386 | + "expected_level": "L1", | ||
| 387 | + "rule_results": [ | ||
| 388 | + { | ||
| 389 | + "rule": "R1", | ||
| 390 | + "passed": false, | ||
| 391 | + "detail": "classified=UNKNOWN, expected=L1" | ||
| 392 | + }, | ||
| 393 | + { | ||
| 394 | + "rule": "R2", | ||
| 395 | + "passed": false, | ||
| 396 | + "detail": "草稿不存在" | ||
| 397 | + }, | ||
| 398 | + { | ||
| 399 | + "rule": "R3", | ||
| 400 | + "passed": false, | ||
| 401 | + "detail": "草稿不存在" | ||
| 402 | + }, | ||
| 403 | + { | ||
| 404 | + "rule": "R4", | ||
| 405 | + "passed": false, | ||
| 406 | + "detail": "草稿不存在" | ||
| 407 | + }, | ||
| 408 | + { | ||
| 409 | + "rule": "R5", | ||
| 410 | + "passed": false, | ||
| 411 | + "detail": "草稿不存在" | ||
| 412 | + }, | ||
| 413 | + { | ||
| 414 | + "rule": "R6", | ||
| 415 | + "passed": false, | ||
| 416 | + "detail": "草稿不存在" | ||
| 417 | + } | ||
| 418 | + ], | ||
| 419 | + "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:分析aicore异常的排查方向,建议收集plog日志定位。\n\n## 打分维度\n| 维度 | 0分 | 1分 | 2分 |\n|------|-----|-----|---...", | ||
| 420 | + "score": { | ||
| 421 | + "total": 0.0, | ||
| 422 | + "rule_score": 0.0, | ||
| 423 | + "llm_score": 0, | ||
| 424 | + "rule_passed": 0, | ||
| 425 | + "rule_total": 6, | ||
| 426 | + "llm_scores": null, | ||
| 427 | + "passed": false | ||
| 428 | + } | ||
| 429 | + }, | ||
| 430 | + { | ||
| 431 | + "id": "bm-010", | ||
| 432 | + "issue_number": 59, | ||
| 433 | + "expected_level": "L1", | ||
| 434 | + "rule_results": [ | ||
| 435 | + { | ||
| 436 | + "rule": "R1", | ||
| 437 | + "passed": false, | ||
| 438 | + "detail": "classified=UNKNOWN, expected=L1" | ||
| 439 | + }, | ||
| 440 | + { | ||
| 441 | + "rule": "R2", | ||
| 442 | + "passed": false, | ||
| 443 | + "detail": "草稿不存在" | ||
| 444 | + }, | ||
| 445 | + { | ||
| 446 | + "rule": "R3", | ||
| 447 | + "passed": false, | ||
| 448 | + "detail": "草稿不存在" | ||
| 449 | + }, | ||
| 450 | + { | ||
| 451 | + "rule": "R4", | ||
| 452 | + "passed": false, | ||
| 453 | + "detail": "草稿不存在" | ||
| 454 | + }, | ||
| 455 | + { | ||
| 456 | + "rule": "R5", | ||
| 457 | + "passed": false, | ||
| 458 | + "detail": "草稿不存在" | ||
| 459 | + }, | ||
| 460 | + { | ||
| 461 | + "rule": "R6", | ||
| 462 | + "passed": false, | ||
| 463 | + "detail": "草稿不存在" | ||
| 464 | + } | ||
| 465 | + ], | ||
| 466 | + "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:openssl/sha.h缺失是依赖未安装,需安装libssl-dev或openssl-devel。\n\n## 打分维度\n| 维度 | 0分 | 1分 | 2分 |\n|-...", | ||
| 467 | + "score": { | ||
| 468 | + "total": 0.0, | ||
| 469 | + "rule_score": 0.0, | ||
| 470 | + "llm_score": 0, | ||
| 471 | + "rule_passed": 0, | ||
| 472 | + "rule_total": 6, | ||
| 473 | + "llm_scores": null, | ||
| 474 | + "passed": false | ||
| 475 | + } | ||
| 476 | + }, | ||
| 477 | + { | ||
| 478 | + "id": "bm-011", | ||
| 479 | + "issue_number": 624, | ||
| 480 | + "expected_level": "L1", | ||
| 481 | + "rule_results": [ | ||
| 482 | + { | ||
| 483 | + "rule": "R1", | ||
| 484 | + "passed": false, | ||
| 485 | + "detail": "classified=UNKNOWN, expected=L1" | ||
| 486 | + }, | ||
| 487 | + { | ||
| 488 | + "rule": "R2", | ||
| 489 | + "passed": false, | ||
| 490 | + "detail": "草稿不存在" | ||
| 491 | + }, | ||
| 492 | + { | ||
| 493 | + "rule": "R3", | ||
| 494 | + "passed": false, | ||
| 495 | + "detail": "草稿不存在" | ||
| 496 | + }, | ||
| 497 | + { | ||
| 498 | + "rule": "R4", | ||
| 499 | + "passed": false, | ||
| 500 | + "detail": "草稿不存在" | ||
| 501 | + }, | ||
| 502 | + { | ||
| 503 | + "rule": "R5", | ||
| 504 | + "passed": false, | ||
| 505 | + "detail": "草稿不存在" | ||
| 506 | + }, | ||
| 507 | + { | ||
| 508 | + "rule": "R6", | ||
| 509 | + "passed": false, | ||
| 510 | + "detail": "草稿不存在" | ||
| 511 | + } | ||
| 512 | + ], | ||
| 513 | + "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:ATC的aicore-num是编译时参数,rtKernelLaunch的numBlocks是运行时参数,两者不互相约束。blockDim由算子编译决定。\n\n## 打分维...", | ||
| 514 | + "score": { | ||
| 515 | + "total": 0.0, | ||
| 516 | + "rule_score": 0.0, | ||
| 517 | + "llm_score": 0, | ||
| 518 | + "rule_passed": 0, | ||
| 519 | + "rule_total": 6, | ||
| 520 | + "llm_scores": null, | ||
| 521 | + "passed": false | ||
| 522 | + } | ||
| 523 | + }, | ||
| 524 | + { | ||
| 525 | + "id": "bm-012", | ||
| 526 | + "issue_number": 613, | ||
| 527 | + "expected_level": "L1", | ||
| 528 | + "rule_results": [ | ||
| 529 | + { | ||
| 530 | + "rule": "R1", | ||
| 531 | + "passed": false, | ||
| 532 | + "detail": "classified=UNKNOWN, expected=L1" | ||
| 533 | + }, | ||
| 534 | + { | ||
| 535 | + "rule": "R2", | ||
| 536 | + "passed": false, | ||
| 537 | + "detail": "草稿不存在" | ||
| 538 | + }, | ||
| 539 | + { | ||
| 540 | + "rule": "R3", | ||
| 541 | + "passed": false, | ||
| 542 | + "detail": "草稿不存在" | ||
| 543 | + }, | ||
| 544 | + { | ||
| 545 | + "rule": "R4", | ||
| 546 | + "passed": false, | ||
| 547 | + "detail": "草稿不存在" | ||
| 548 | + }, | ||
| 549 | + { | ||
| 550 | + "rule": "R5", | ||
| 551 | + "passed": false, | ||
| 552 | + "detail": "草稿不存在" | ||
| 553 | + }, | ||
| 554 | + { | ||
| 555 | + "rule": "R6", | ||
| 556 | + "passed": false, | ||
| 557 | + "detail": "草稿不存在" | ||
| 558 | + } | ||
| 559 | + ], | ||
| 560 | + "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:GM/L2/UB三级存储由硬件自动调度,当前无API手动约束L2驻留。\n\n## 打分维度\n| 维度 | 0分 | 1分 | 2分 |\n|------|-----|---...", | ||
| 561 | + "score": { | ||
| 562 | + "total": 0.0, | ||
| 563 | + "rule_score": 0.0, | ||
| 564 | + "llm_score": 0, | ||
| 565 | + "rule_passed": 0, | ||
| 566 | + "rule_total": 6, | ||
| 567 | + "llm_scores": null, | ||
| 568 | + "passed": false | ||
| 569 | + } | ||
| 570 | + }, | ||
| 571 | + { | ||
| 572 | + "id": "bm-013", | ||
| 573 | + "issue_number": 52, | ||
| 574 | + "expected_level": "L1", | ||
| 575 | + "rule_results": [ | ||
| 576 | + { | ||
| 577 | + "rule": "R1", | ||
| 578 | + "passed": false, | ||
| 579 | + "detail": "classified=UNKNOWN, expected=L1" | ||
| 580 | + }, | ||
| 581 | + { | ||
| 582 | + "rule": "R2", | ||
| 583 | + "passed": false, | ||
| 584 | + "detail": "草稿不存在" | ||
| 585 | + }, | ||
| 586 | + { | ||
| 587 | + "rule": "R3", | ||
| 588 | + "passed": false, | ||
| 589 | + "detail": "草稿不存在" | ||
| 590 | + }, | ||
| 591 | + { | ||
| 592 | + "rule": "R4", | ||
| 593 | + "passed": false, | ||
| 594 | + "detail": "草稿不存在" | ||
| 595 | + }, | ||
| 596 | + { | ||
| 597 | + "rule": "R5", | ||
| 598 | + "passed": false, | ||
| 599 | + "detail": "草稿不存在" | ||
| 600 | + }, | ||
| 601 | + { | ||
| 602 | + "rule": "R6", | ||
| 603 | + "passed": false, | ||
| 604 | + "detail": "草稿不存在" | ||
| 605 | + } | ||
| 606 | + ], | ||
| 607 | + "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:0_simple_model样例失败因缺少aclnnop头文件,需安装配套opp包。\n\n## 打分维度\n| 维度 | 0分 | 1分 | 2分 |\n|------|--...", | ||
| 608 | + "score": { | ||
| 609 | + "total": 0.0, | ||
| 610 | + "rule_score": 0.0, | ||
| 611 | + "llm_score": 0, | ||
| 612 | + "rule_passed": 0, | ||
| 613 | + "rule_total": 6, | ||
| 614 | + "llm_scores": null, | ||
| 615 | + "passed": false | ||
| 616 | + } | ||
| 617 | + }, | ||
| 618 | + { | ||
| 619 | + "id": "bm-014", | ||
| 620 | + "issue_number": 54, | ||
| 621 | + "expected_level": "L1", | ||
| 622 | + "rule_results": [ | ||
| 623 | + { | ||
| 624 | + "rule": "R1", | ||
| 625 | + "passed": false, | ||
| 626 | + "detail": "classified=UNKNOWN, expected=L1" | ||
| 627 | + }, | ||
| 628 | + { | ||
| 629 | + "rule": "R2", | ||
| 630 | + "passed": false, | ||
| 631 | + "detail": "草稿不存在" | ||
| 632 | + }, | ||
| 633 | + { | ||
| 634 | + "rule": "R3", | ||
| 635 | + "passed": false, | ||
| 636 | + "detail": "草稿不存在" | ||
| 637 | + }, | ||
| 638 | + { | ||
| 639 | + "rule": "R4", | ||
| 640 | + "passed": false, | ||
| 641 | + "detail": "草稿不存在" | ||
| 642 | + }, | ||
| 643 | + { | ||
| 644 | + "rule": "R5", | ||
| 645 | + "passed": false, | ||
| 646 | + "detail": "草稿不存在" | ||
| 647 | + }, | ||
| 648 | + { | ||
| 649 | + "rule": "R6", | ||
| 650 | + "passed": false, | ||
| 651 | + "detail": "草稿不存在" | ||
| 652 | + } | ||
| 653 | + ], | ||
| 654 | + "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:libopapi.so找不到是LD_LIBRARY_PATH未设置,需source环境变量。\n\n## 打分维度\n| 维度 | 0分 | 1分 | 2分 |\n|-----...", | ||
| 655 | + "score": { | ||
| 656 | + "total": 0.0, | ||
| 657 | + "rule_score": 0.0, | ||
| 658 | + "llm_score": 0, | ||
| 659 | + "rule_passed": 0, | ||
| 660 | + "rule_total": 6, | ||
| 661 | + "llm_scores": null, | ||
| 662 | + "passed": false | ||
| 663 | + } | ||
| 664 | + }, | ||
| 665 | + { | ||
| 666 | + "id": "bm-015", | ||
| 667 | + "issue_number": 44, | ||
| 668 | + "expected_level": "L1", | ||
| 669 | + "rule_results": [ | ||
| 670 | + { | ||
| 671 | + "rule": "R1", | ||
| 672 | + "passed": false, | ||
| 673 | + "detail": "classified=UNKNOWN, expected=L1" | ||
| 674 | + }, | ||
| 675 | + { | ||
| 676 | + "rule": "R2", | ||
| 677 | + "passed": false, | ||
| 678 | + "detail": "草稿不存在" | ||
| 679 | + }, | ||
| 680 | + { | ||
| 681 | + "rule": "R3", | ||
| 682 | + "passed": false, | ||
| 683 | + "detail": "草稿不存在" | ||
| 684 | + }, | ||
| 685 | + { | ||
| 686 | + "rule": "R4", | ||
| 687 | + "passed": false, | ||
| 688 | + "detail": "草稿不存在" | ||
| 689 | + }, | ||
| 690 | + { | ||
| 691 | + "rule": "R5", | ||
| 692 | + "passed": false, | ||
| 693 | + "detail": "草稿不存在" | ||
| 694 | + }, | ||
| 695 | + { | ||
| 696 | + "rule": "R6", | ||
| 697 | + "passed": false, | ||
| 698 | + "detail": "草稿不存在" | ||
| 699 | + } | ||
| 700 | + ], | ||
| 701 | + "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:aclrtMallocHost报错107002是内存不足或设备未初始化。\n\n## 打分维度\n| 维度 | 0分 | 1分 | 2分 |\n|------|-----|--...", | ||
| 702 | + "score": { | ||
| 703 | + "total": 0.0, | ||
| 704 | + "rule_score": 0.0, | ||
| 705 | + "llm_score": 0, | ||
| 706 | + "rule_passed": 0, | ||
| 707 | + "rule_total": 6, | ||
| 708 | + "llm_scores": null, | ||
| 709 | + "passed": false | ||
| 710 | + } | ||
| 711 | + }, | ||
| 712 | + { | ||
| 713 | + "id": "bm-016", | ||
| 714 | + "issue_number": 38, | ||
| 715 | + "expected_level": "L1", | ||
| 716 | + "rule_results": [ | ||
| 717 | + { | ||
| 718 | + "rule": "R1", | ||
| 719 | + "passed": false, | ||
| 720 | + "detail": "classified=UNKNOWN, expected=L1" | ||
| 721 | + }, | ||
| 722 | + { | ||
| 723 | + "rule": "R2", | ||
| 724 | + "passed": false, | ||
| 725 | + "detail": "草稿不存在" | ||
| 726 | + }, | ||
| 727 | + { | ||
| 728 | + "rule": "R3", | ||
| 729 | + "passed": false, | ||
| 730 | + "detail": "草稿不存在" | ||
| 731 | + }, | ||
| 732 | + { | ||
| 733 | + "rule": "R4", | ||
| 734 | + "passed": false, | ||
| 735 | + "detail": "草稿不存在" | ||
| 736 | + }, | ||
| 737 | + { | ||
| 738 | + "rule": "R5", | ||
| 739 | + "passed": false, | ||
| 740 | + "detail": "草稿不存在" | ||
| 741 | + }, | ||
| 742 | + { | ||
| 743 | + "rule": "R6", | ||
| 744 | + "passed": false, | ||
| 745 | + "detail": "草稿不存在" | ||
| 746 | + } | ||
| 747 | + ], | ||
| 748 | + "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:install_deps.sh不支持EulerOS,需手动安装依赖。\n\n## 打分维度\n| 维度 | 0分 | 1分 | 2分 |\n|------|-----|----...", | ||
| 749 | + "score": { | ||
| 750 | + "total": 0.0, | ||
| 751 | + "rule_score": 0.0, | ||
| 752 | + "llm_score": 0, | ||
| 753 | + "rule_passed": 0, | ||
| 754 | + "rule_total": 6, | ||
| 755 | + "llm_scores": null, | ||
| 756 | + "passed": false | ||
| 757 | + } | ||
| 758 | + }, | ||
| 759 | + { | ||
| 760 | + "id": "bm-017", | ||
| 761 | + "issue_number": 275, | ||
| 762 | + "expected_level": "L2", | ||
| 763 | + "rule_results": [ | ||
| 764 | + { | ||
| 765 | + "rule": "R1", | ||
| 766 | + "passed": false, | ||
| 767 | + "detail": "classified=UNKNOWN, expected=L2" | ||
| 768 | + }, | ||
| 769 | + { | ||
| 770 | + "rule": "R2", | ||
| 771 | + "passed": false, | ||
| 772 | + "detail": "草稿不存在" | ||
| 773 | + }, | ||
| 774 | + { | ||
| 775 | + "rule": "R3", | ||
| 776 | + "passed": false, | ||
| 777 | + "detail": "草稿不存在" | ||
| 778 | + }, | ||
| 779 | + { | ||
| 780 | + "rule": "R4", | ||
| 781 | + "passed": false, | ||
| 782 | + "detail": "草稿不存在" | ||
| 783 | + }, | ||
| 784 | + { | ||
| 785 | + "rule": "R5", | ||
| 786 | + "passed": false, | ||
| 787 | + "detail": "草稿不存在" | ||
| 788 | + }, | ||
| 789 | + { | ||
| 790 | + "rule": "R6", | ||
| 791 | + "passed": false, | ||
| 792 | + "detail": "草稿不存在" | ||
| 793 | + } | ||
| 794 | + ], | ||
| 795 | + "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:ATC转换失败涉及动态shape处理,建议简化模型或使用固定shape。\n\n## 打分维度\n| 维度 | 0分 | 1分 | 2分 |\n|------|-----|--...", | ||
| 796 | + "score": { | ||
| 797 | + "total": 0.0, | ||
| 798 | + "rule_score": 0.0, | ||
| 799 | + "llm_score": 0, | ||
| 800 | + "rule_passed": 0, | ||
| 801 | + "rule_total": 6, | ||
| 802 | + "llm_scores": null, | ||
| 803 | + "passed": false | ||
| 804 | + } | ||
| 805 | + }, | ||
| 806 | + { | ||
| 807 | + "id": "bm-018", | ||
| 808 | + "issue_number": 645, | ||
| 809 | + "expected_level": "L2", | ||
| 810 | + "rule_results": [ | ||
| 811 | + { | ||
| 812 | + "rule": "R1", | ||
| 813 | + "passed": false, | ||
| 814 | + "detail": "classified=UNKNOWN, expected=L2" | ||
| 815 | + }, | ||
| 816 | + { | ||
| 817 | + "rule": "R2", | ||
| 818 | + "passed": false, | ||
| 819 | + "detail": "草稿不存在" | ||
| 820 | + }, | ||
| 821 | + { | ||
| 822 | + "rule": "R3", | ||
| 823 | + "passed": false, | ||
| 824 | + "detail": "草稿不存在" | ||
| 825 | + }, | ||
| 826 | + { | ||
| 827 | + "rule": "R4", | ||
| 828 | + "passed": false, | ||
| 829 | + "detail": "草稿不存在" | ||
| 830 | + }, | ||
| 831 | + { | ||
| 832 | + "rule": "R5", | ||
| 833 | + "passed": false, | ||
| 834 | + "detail": "草稿不存在" | ||
| 835 | + }, | ||
| 836 | + { | ||
| 837 | + "rule": "R6", | ||
| 838 | + "passed": false, | ||
| 839 | + "detail": "草稿不存在" | ||
| 840 | + } | ||
| 841 | + ], | ||
| 842 | + "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:经再审查确认不存在实际问题,TPRT设备关闭后文件描述符不会被用于读写操作。\n\n## 打分维度\n| 维度 | 0分 | 1分 | 2分 |\n|------|-----|...", | ||
| 843 | + "score": { | ||
| 844 | + "total": 0.0, | ||
| 845 | + "rule_score": 0.0, | ||
| 846 | + "llm_score": 0, | ||
| 847 | + "rule_passed": 0, | ||
| 848 | + "rule_total": 6, | ||
| 849 | + "llm_scores": null, | ||
| 850 | + "passed": false | ||
| 851 | + } | ||
| 852 | + }, | ||
| 853 | + { | ||
| 854 | + "id": "bm-019", | ||
| 855 | + "issue_number": 647, | ||
| 856 | + "expected_level": "L2", | ||
| 857 | + "rule_results": [ | ||
| 858 | + { | ||
| 859 | + "rule": "R1", | ||
| 860 | + "passed": false, | ||
| 861 | + "detail": "classified=UNKNOWN, expected=L2" | ||
| 862 | + }, | ||
| 863 | + { | ||
| 864 | + "rule": "R2", | ||
| 865 | + "passed": false, | ||
| 866 | + "detail": "草稿不存在" | ||
| 867 | + }, | ||
| 868 | + { | ||
| 869 | + "rule": "R3", | ||
| 870 | + "passed": false, | ||
| 871 | + "detail": "草稿不存在" | ||
| 872 | + }, | ||
| 873 | + { | ||
| 874 | + "rule": "R4", | ||
| 875 | + "passed": false, | ||
| 876 | + "detail": "草稿不存在" | ||
| 877 | + }, | ||
| 878 | + { | ||
| 879 | + "rule": "R5", | ||
| 880 | + "passed": false, | ||
| 881 | + "detail": "草稿不存在" | ||
| 882 | + }, | ||
| 883 | + { | ||
| 884 | + "rule": "R6", | ||
| 885 | + "passed": false, | ||
| 886 | + "detail": "草稿不存在" | ||
| 887 | + } | ||
| 888 | + ], | ||
| 889 | + "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:经再审查确认不存在实质性问题,offset+write_size越界路径已有保护。\n\n## 打分维度\n| 维度 | 0分 | 1分 | 2分 |\n|------|---...", | ||
| 890 | + "score": { | ||
| 891 | + "total": 0.0, | ||
| 892 | + "rule_score": 0.0, | ||
| 893 | + "llm_score": 0, | ||
| 894 | + "rule_passed": 0, | ||
| 895 | + "rule_total": 6, | ||
| 896 | + "llm_scores": null, | ||
| 897 | + "passed": false | ||
| 898 | + } | ||
| 899 | + }, | ||
| 900 | + { | ||
| 901 | + "id": "bm-020", | ||
| 902 | + "issue_number": 448, | ||
| 903 | + "expected_level": "L2", | ||
| 904 | + "rule_results": [ | ||
| 905 | + { | ||
| 906 | + "rule": "R1", | ||
| 907 | + "passed": false, | ||
| 908 | + "detail": "classified=UNKNOWN, expected=L2" | ||
| 909 | + }, | ||
| 910 | + { | ||
| 911 | + "rule": "R2", | ||
| 912 | + "passed": false, | ||
| 913 | + "detail": "草稿不存在" | ||
| 914 | + }, | ||
| 915 | + { | ||
| 916 | + "rule": "R3", | ||
| 917 | + "passed": false, | ||
| 918 | + "detail": "草稿不存在" | ||
| 919 | + }, | ||
| 920 | + { | ||
| 921 | + "rule": "R4", | ||
| 922 | + "passed": false, | ||
| 923 | + "detail": "草稿不存在" | ||
| 924 | + }, | ||
| 925 | + { | ||
| 926 | + "rule": "R5", | ||
| 927 | + "passed": false, | ||
| 928 | + "detail": "草稿不存在" | ||
| 929 | + }, | ||
| 930 | + { | ||
| 931 | + "rule": "R6", | ||
| 932 | + "passed": false, | ||
| 933 | + "detail": "草稿不存在" | ||
| 934 | + } | ||
| 935 | + ], | ||
| 936 | + "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:数据拷贝接口性能波动大,需实验对比不同拷贝方式,可能涉及硬件调度策略。\n\n## 打分维度\n| 维度 | 0分 | 1分 | 2分 |\n|------|-----|---...", | ||
| 937 | + "score": { | ||
| 938 | + "total": 0.0, | ||
| 939 | + "rule_score": 0.0, | ||
| 940 | + "llm_score": 0, | ||
| 941 | + "rule_passed": 0, | ||
| 942 | + "rule_total": 6, | ||
| 943 | + "llm_scores": null, | ||
| 944 | + "passed": false | ||
| 945 | + } | ||
| 946 | + } | ||
| 947 | + ] | ||
| 948 | +} | ||
| @@ -0,0 +1,20 @@ | |||
| 1 | +{"id": "bm-001", "issue_number": 110, "expected_level": "L0", "rule_results": [{"rule": "R1", "passed": false, "detail": "classified=UNKNOWN, expected=L0"}, {"rule": "R2", "passed": false, "detail": "草稿不存在"}, {"rule": "R3", "passed": false, "detail": "草稿不存在"}, {"rule": "R4", "passed": false, "detail": "草稿不存在"}, {"rule": "R5", "passed": false, "detail": "草稿不存在"}, {"rule": "R6", "passed": false, "detail": "草稿不存在"}], "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:build中编译用于前置校验,并非开源发布。该部分需要结合闭源代码在其他子包中发布。\n\n## 打分维度\n| 维度 | 0分 | 1分 | 2分 |\n|------|--...", "score": {"total": 0.0, "rule_score": 0.0, "llm_score": 0, "rule_passed": 0, "rule_total": 6, "llm_scores": null, "passed": false}} | ||
| 2 | +{"id": "bm-002", "issue_number": 142, "expected_level": "L0", "rule_results": [{"rule": "R1", "passed": false, "detail": "classified=UNKNOWN, expected=L0"}, {"rule": "R2", "passed": false, "detail": "草稿不存在"}, {"rule": "R3", "passed": false, "detail": "草稿不存在"}, {"rule": "R4", "passed": false, "detail": "草稿不存在"}, {"rule": "R5", "passed": false, "detail": "草稿不存在"}, {"rule": "R6", "passed": false, "detail": "草稿不存在"}], "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:建议到cann/community咨询版本对应关系。\n\n## 打分维度\n| 维度 | 0分 | 1分 | 2分 |\n|------|-----|-----|-----|...", "score": {"total": 0.0, "rule_score": 0.0, "llm_score": 0, "rule_passed": 0, "rule_total": 6, "llm_scores": null, "passed": false}} | ||
| 3 | +{"id": "bm-003", "issue_number": 152, "expected_level": "L0", "rule_results": [{"rule": "R1", "passed": false, "detail": "classified=UNKNOWN, expected=L0"}, {"rule": "R2", "passed": false, "detail": "草稿不存在"}, {"rule": "R3", "passed": false, "detail": "草稿不存在"}, {"rule": "R4", "passed": false, "detail": "草稿不存在"}, {"rule": "R5", "passed": false, "detail": "草稿不存在"}, {"rule": "R6", "passed": false, "detail": "草稿不存在"}], "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:runtime对外发布接口及支持情况在docs目录有说明,rtIpcOpenMemory是内部接口。\n\n## 打分维度\n| 维度 | 0分 | 1分 | 2分 |\n|-...", "score": {"total": 0.0, "rule_score": 0.0, "llm_score": 0, "rule_passed": 0, "rule_total": 6, "llm_scores": null, "passed": false}} | ||
| 4 | +{"id": "bm-004", "issue_number": 19, "expected_level": "L0", "rule_results": [{"rule": "R1", "passed": false, "detail": "classified=UNKNOWN, expected=L0"}, {"rule": "R2", "passed": false, "detail": "草稿不存在"}, {"rule": "R3", "passed": false, "detail": "草稿不存在"}, {"rule": "R4", "passed": false, "detail": "草稿不存在"}, {"rule": "R5", "passed": false, "detail": "草稿不存在"}, {"rule": "R6", "passed": false, "detail": "草稿不存在"}], "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:record接口异步体现在event运行在stream上,record本身下发到设备是同步的。Host侧调用先后顺序不保证多线程下query/sync获取预期结果。\n\n...", "score": {"total": 0.0, "rule_score": 0.0, "llm_score": 0, "rule_passed": 0, "rule_total": 6, "llm_scores": null, "passed": false}} | ||
| 5 | +{"id": "bm-005", "issue_number": 321, "expected_level": "L0", "rule_results": [{"rule": "R1", "passed": false, "detail": "classified=UNKNOWN, expected=L0"}, {"rule": "R2", "passed": false, "detail": "草稿不存在"}, {"rule": "R3", "passed": false, "detail": "草稿不存在"}, {"rule": "R4", "passed": false, "detail": "草稿不存在"}, {"rule": "R5", "passed": false, "detail": "草稿不存在"}, {"rule": "R6", "passed": false, "detail": "草稿不存在"}], "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:详细解答了runtime库卸载步骤和run包安装路径管理。\n\n## 打分维度\n| 维度 | 0分 | 1分 | 2分 |\n|------|-----|-----|---...", "score": {"total": 0.0, "rule_score": 0.0, "llm_score": 0, "rule_passed": 0, "rule_total": 6, "llm_scores": null, "passed": false}} | ||
| 6 | +{"id": "bm-006", "issue_number": 651, "expected_level": "L0", "rule_results": [{"rule": "R1", "passed": false, "detail": "classified=UNKNOWN, expected=L0"}, {"rule": "R2", "passed": false, "detail": "草稿不存在"}, {"rule": "R3", "passed": false, "detail": "草稿不存在"}, {"rule": "R4", "passed": false, "detail": "草稿不存在"}, {"rule": "R5", "passed": false, "detail": "草稿不存在"}, {"rule": "R6", "passed": false, "detail": "草稿不存在"}], "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:aclrtSetDevice首次调用耗时较长是正常行为,涉及设备初始化。\n\n## 打分维度\n| 维度 | 0分 | 1分 | 2分 |\n|------|-----|--...", "score": {"total": 0.0, "rule_score": 0.0, "llm_score": 0, "rule_passed": 0, "rule_total": 6, "llm_scores": null, "passed": false}} | ||
| 7 | +{"id": "bm-007", "issue_number": 164, "expected_level": "L1", "rule_results": [{"rule": "R1", "passed": false, "detail": "classified=UNKNOWN, expected=L1"}, {"rule": "R2", "passed": false, "detail": "草稿不存在"}, {"rule": "R3", "passed": false, "detail": "草稿不存在"}, {"rule": "R4", "passed": false, "detail": "草稿不存在"}, {"rule": "R5", "passed": false, "detail": "草稿不存在"}, {"rule": "R6", "passed": false, "detail": "草稿不存在"}], "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:未使能默认device时aclrtmalloc会报错拦截;跨device访问需enablep2p调用aclrtDeviceCanAccessPeer。\n\n## 打分维度...", "score": {"total": 0.0, "rule_score": 0.0, "llm_score": 0, "rule_passed": 0, "rule_total": 6, "llm_scores": null, "passed": false}} | ||
| 8 | +{"id": "bm-008", "issue_number": 27, "expected_level": "L1", "rule_results": [{"rule": "R1", "passed": false, "detail": "classified=UNKNOWN, expected=L1"}, {"rule": "R2", "passed": false, "detail": "草稿不存在"}, {"rule": "R3", "passed": false, "detail": "草稿不存在"}, {"rule": "R4", "passed": false, "detail": "草稿不存在"}, {"rule": "R5", "passed": false, "detail": "草稿不存在"}, {"rule": "R6", "passed": false, "detail": "草稿不存在"}], "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:runtime包编译安装后与cann包ABI不兼容,undefined symbol是版本不匹配导致。\n\n## 打分维度\n| 维度 | 0分 | 1分 | 2分 |\n|...", "score": {"total": 0.0, "rule_score": 0.0, "llm_score": 0, "rule_passed": 0, "rule_total": 6, "llm_scores": null, "passed": false}} | ||
| 9 | +{"id": "bm-009", "issue_number": 480, "expected_level": "L1", "rule_results": [{"rule": "R1", "passed": false, "detail": "classified=UNKNOWN, expected=L1"}, {"rule": "R2", "passed": false, "detail": "草稿不存在"}, {"rule": "R3", "passed": false, "detail": "草稿不存在"}, {"rule": "R4", "passed": false, "detail": "草稿不存在"}, {"rule": "R5", "passed": false, "detail": "草稿不存在"}, {"rule": "R6", "passed": false, "detail": "草稿不存在"}], "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:分析aicore异常的排查方向,建议收集plog日志定位。\n\n## 打分维度\n| 维度 | 0分 | 1分 | 2分 |\n|------|-----|-----|---...", "score": {"total": 0.0, "rule_score": 0.0, "llm_score": 0, "rule_passed": 0, "rule_total": 6, "llm_scores": null, "passed": false}} | ||
| 10 | +{"id": "bm-010", "issue_number": 59, "expected_level": "L1", "rule_results": [{"rule": "R1", "passed": false, "detail": "classified=UNKNOWN, expected=L1"}, {"rule": "R2", "passed": false, "detail": "草稿不存在"}, {"rule": "R3", "passed": false, "detail": "草稿不存在"}, {"rule": "R4", "passed": false, "detail": "草稿不存在"}, {"rule": "R5", "passed": false, "detail": "草稿不存在"}, {"rule": "R6", "passed": false, "detail": "草稿不存在"}], "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:openssl/sha.h缺失是依赖未安装,需安装libssl-dev或openssl-devel。\n\n## 打分维度\n| 维度 | 0分 | 1分 | 2分 |\n|-...", "score": {"total": 0.0, "rule_score": 0.0, "llm_score": 0, "rule_passed": 0, "rule_total": 6, "llm_scores": null, "passed": false}} | ||
| 11 | +{"id": "bm-011", "issue_number": 624, "expected_level": "L1", "rule_results": [{"rule": "R1", "passed": false, "detail": "classified=UNKNOWN, expected=L1"}, {"rule": "R2", "passed": false, "detail": "草稿不存在"}, {"rule": "R3", "passed": false, "detail": "草稿不存在"}, {"rule": "R4", "passed": false, "detail": "草稿不存在"}, {"rule": "R5", "passed": false, "detail": "草稿不存在"}, {"rule": "R6", "passed": false, "detail": "草稿不存在"}], "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:ATC的aicore-num是编译时参数,rtKernelLaunch的numBlocks是运行时参数,两者不互相约束。blockDim由算子编译决定。\n\n## 打分维...", "score": {"total": 0.0, "rule_score": 0.0, "llm_score": 0, "rule_passed": 0, "rule_total": 6, "llm_scores": null, "passed": false}} | ||
| 12 | +{"id": "bm-012", "issue_number": 613, "expected_level": "L1", "rule_results": [{"rule": "R1", "passed": false, "detail": "classified=UNKNOWN, expected=L1"}, {"rule": "R2", "passed": false, "detail": "草稿不存在"}, {"rule": "R3", "passed": false, "detail": "草稿不存在"}, {"rule": "R4", "passed": false, "detail": "草稿不存在"}, {"rule": "R5", "passed": false, "detail": "草稿不存在"}, {"rule": "R6", "passed": false, "detail": "草稿不存在"}], "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:GM/L2/UB三级存储由硬件自动调度,当前无API手动约束L2驻留。\n\n## 打分维度\n| 维度 | 0分 | 1分 | 2分 |\n|------|-----|---...", "score": {"total": 0.0, "rule_score": 0.0, "llm_score": 0, "rule_passed": 0, "rule_total": 6, "llm_scores": null, "passed": false}} | ||
| 13 | +{"id": "bm-013", "issue_number": 52, "expected_level": "L1", "rule_results": [{"rule": "R1", "passed": false, "detail": "classified=UNKNOWN, expected=L1"}, {"rule": "R2", "passed": false, "detail": "草稿不存在"}, {"rule": "R3", "passed": false, "detail": "草稿不存在"}, {"rule": "R4", "passed": false, "detail": "草稿不存在"}, {"rule": "R5", "passed": false, "detail": "草稿不存在"}, {"rule": "R6", "passed": false, "detail": "草稿不存在"}], "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:0_simple_model样例失败因缺少aclnnop头文件,需安装配套opp包。\n\n## 打分维度\n| 维度 | 0分 | 1分 | 2分 |\n|------|--...", "score": {"total": 0.0, "rule_score": 0.0, "llm_score": 0, "rule_passed": 0, "rule_total": 6, "llm_scores": null, "passed": false}} | ||
| 14 | +{"id": "bm-014", "issue_number": 54, "expected_level": "L1", "rule_results": [{"rule": "R1", "passed": false, "detail": "classified=UNKNOWN, expected=L1"}, {"rule": "R2", "passed": false, "detail": "草稿不存在"}, {"rule": "R3", "passed": false, "detail": "草稿不存在"}, {"rule": "R4", "passed": false, "detail": "草稿不存在"}, {"rule": "R5", "passed": false, "detail": "草稿不存在"}, {"rule": "R6", "passed": false, "detail": "草稿不存在"}], "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:libopapi.so找不到是LD_LIBRARY_PATH未设置,需source环境变量。\n\n## 打分维度\n| 维度 | 0分 | 1分 | 2分 |\n|-----...", "score": {"total": 0.0, "rule_score": 0.0, "llm_score": 0, "rule_passed": 0, "rule_total": 6, "llm_scores": null, "passed": false}} | ||
| 15 | +{"id": "bm-015", "issue_number": 44, "expected_level": "L1", "rule_results": [{"rule": "R1", "passed": false, "detail": "classified=UNKNOWN, expected=L1"}, {"rule": "R2", "passed": false, "detail": "草稿不存在"}, {"rule": "R3", "passed": false, "detail": "草稿不存在"}, {"rule": "R4", "passed": false, "detail": "草稿不存在"}, {"rule": "R5", "passed": false, "detail": "草稿不存在"}, {"rule": "R6", "passed": false, "detail": "草稿不存在"}], "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:aclrtMallocHost报错107002是内存不足或设备未初始化。\n\n## 打分维度\n| 维度 | 0分 | 1分 | 2分 |\n|------|-----|--...", "score": {"total": 0.0, "rule_score": 0.0, "llm_score": 0, "rule_passed": 0, "rule_total": 6, "llm_scores": null, "passed": false}} | ||
| 16 | +{"id": "bm-016", "issue_number": 38, "expected_level": "L1", "rule_results": [{"rule": "R1", "passed": false, "detail": "classified=UNKNOWN, expected=L1"}, {"rule": "R2", "passed": false, "detail": "草稿不存在"}, {"rule": "R3", "passed": false, "detail": "草稿不存在"}, {"rule": "R4", "passed": false, "detail": "草稿不存在"}, {"rule": "R5", "passed": false, "detail": "草稿不存在"}, {"rule": "R6", "passed": false, "detail": "草稿不存在"}], "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:install_deps.sh不支持EulerOS,需手动安装依赖。\n\n## 打分维度\n| 维度 | 0分 | 1分 | 2分 |\n|------|-----|----...", "score": {"total": 0.0, "rule_score": 0.0, "llm_score": 0, "rule_passed": 0, "rule_total": 6, "llm_scores": null, "passed": false}} | ||
| 17 | +{"id": "bm-017", "issue_number": 275, "expected_level": "L2", "rule_results": [{"rule": "R1", "passed": false, "detail": "classified=UNKNOWN, expected=L2"}, {"rule": "R2", "passed": false, "detail": "草稿不存在"}, {"rule": "R3", "passed": false, "detail": "草稿不存在"}, {"rule": "R4", "passed": false, "detail": "草稿不存在"}, {"rule": "R5", "passed": false, "detail": "草稿不存在"}, {"rule": "R6", "passed": false, "detail": "草稿不存在"}], "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:ATC转换失败涉及动态shape处理,建议简化模型或使用固定shape。\n\n## 打分维度\n| 维度 | 0分 | 1分 | 2分 |\n|------|-----|--...", "score": {"total": 0.0, "rule_score": 0.0, "llm_score": 0, "rule_passed": 0, "rule_total": 6, "llm_scores": null, "passed": false}} | ||
| 18 | +{"id": "bm-018", "issue_number": 645, "expected_level": "L2", "rule_results": [{"rule": "R1", "passed": false, "detail": "classified=UNKNOWN, expected=L2"}, {"rule": "R2", "passed": false, "detail": "草稿不存在"}, {"rule": "R3", "passed": false, "detail": "草稿不存在"}, {"rule": "R4", "passed": false, "detail": "草稿不存在"}, {"rule": "R5", "passed": false, "detail": "草稿不存在"}, {"rule": "R6", "passed": false, "detail": "草稿不存在"}], "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:经再审查确认不存在实际问题,TPRT设备关闭后文件描述符不会被用于读写操作。\n\n## 打分维度\n| 维度 | 0分 | 1分 | 2分 |\n|------|-----|...", "score": {"total": 0.0, "rule_score": 0.0, "llm_score": 0, "rule_passed": 0, "rule_total": 6, "llm_scores": null, "passed": false}} | ||
| 19 | +{"id": "bm-019", "issue_number": 647, "expected_level": "L2", "rule_results": [{"rule": "R1", "passed": false, "detail": "classified=UNKNOWN, expected=L2"}, {"rule": "R2", "passed": false, "detail": "草稿不存在"}, {"rule": "R3", "passed": false, "detail": "草稿不存在"}, {"rule": "R4", "passed": false, "detail": "草稿不存在"}, {"rule": "R5", "passed": false, "detail": "草稿不存在"}, {"rule": "R6", "passed": false, "detail": "草稿不存在"}], "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:经再审查确认不存在实质性问题,offset+write_size越界路径已有保护。\n\n## 打分维度\n| 维度 | 0分 | 1分 | 2分 |\n|------|---...", "score": {"total": 0.0, "rule_score": 0.0, "llm_score": 0, "rule_passed": 0, "rule_total": 6, "llm_scores": null, "passed": false}} | ||
| 20 | +{"id": "bm-020", "issue_number": 448, "expected_level": "L2", "rule_results": [{"rule": "R1", "passed": false, "detail": "classified=UNKNOWN, expected=L2"}, {"rule": "R2", "passed": false, "detail": "草稿不存在"}, {"rule": "R3", "passed": false, "detail": "草稿不存在"}, {"rule": "R4", "passed": false, "detail": "草稿不存在"}, {"rule": "R5", "passed": false, "detail": "草稿不存在"}, {"rule": "R6", "passed": false, "detail": "草稿不存在"}], "llm_prompt": "你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。\n\n## Issue 原文\n\n\n## AI 生成草稿\n(草稿缺失)\n\n## 维护者真实回复摘要\n维护者回复:数据拷贝接口性能波动大,需实验对比不同拷贝方式,可能涉及硬件调度策略。\n\n## 打分维度\n| 维度 | 0分 | 1分 | 2分 |\n|------|-----|---...", "score": {"total": 0.0, "rule_score": 0.0, "llm_score": 0, "rule_passed": 0, "rule_total": 6, "llm_scores": null, "passed": false}} | ||
| @@ -0,0 +1,50 @@ | |||
| 1 | +#!/bin/bash | ||
| 2 | +set -euo pipefail | ||
| 3 | + | ||
| 4 | +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" | ||
| 5 | +SKILL_DIR="$(dirname "$SCRIPT_DIR")" | ||
| 6 | +BENCHMARK_FILE="$SKILL_DIR/evals/benchmark.jsonl" | ||
| 7 | +DRAFTS_DIR="$SKILL_DIR/reports/drafts" | ||
| 8 | + | ||
| 9 | +if [ $# -lt 1 ]; then | ||
| 10 | + echo "用法: bash regress.sh <issue_numbers_comma_separated>" | ||
| 11 | + echo "示例: bash regress.sh 609,624,645" | ||
| 12 | + exit 1 | ||
| 13 | +fi | ||
| 14 | + | ||
| 15 | +ISSUE_NUMBERS="$1" | ||
| 16 | +IFS=',' read -ra NUMS <<< "$ISSUE_NUMBERS" | ||
| 17 | + | ||
| 18 | +mkdir -p "$DRAFTS_DIR" | ||
| 19 | + | ||
| 20 | +echo "=== 回归验证: ${#NUMS[@]} 条 ===" | ||
| 21 | + | ||
| 22 | +for num in "${NUMS[@]}"; do | ||
| 23 | + num=$(echo "$num" | tr -d ' ') | ||
| 24 | + echo "--- 重跑 issue #$num ---" | ||
| 25 | + | ||
| 26 | + DRAFT_FILE="$DRAFTS_DIR/${num}.md" | ||
| 27 | + | ||
| 28 | + # 查找 benchmark 中的期望分类 | ||
| 29 | + EXPECTED=$(jq -r --argjson n "$num" 'select(.issue_number == $n) | "\(.expected_level)/\(.expected_subtype)"' "$BENCHMARK_FILE" 2>/dev/null || echo "未找到") | ||
| 30 | + echo " 期望分类: $EXPECTED" | ||
| 31 | + | ||
| 32 | + # 跑 subagent(与 run_benchmark.sh 相同逻辑) | ||
| 33 | + timeout 600 bash -c " | ||
| 34 | + echo '分析并回复 GitCode 上的 issue #$num。 | ||
| 35 | +重要约束:只生成回复草稿,禁止调用 gitcode-pr 提交评论。 | ||
| 36 | +草稿写入文件 $DRAFT_FILE。 | ||
| 37 | +完成后输出 JSON 格式的执行日志到 stdout。 | ||
| 38 | +' 2>&1 | ||
| 39 | + " > "$DRAFT_FILE.exec_log" 2>&1 || echo " WARNING: 执行超时或失败" | ||
| 40 | + | ||
| 41 | + if [ -f "$DRAFT_FILE" ]; then | ||
| 42 | + echo " 草稿已生成: $(wc -c < "$DRAFT_FILE") bytes" | ||
| 43 | + else | ||
| 44 | + echo " WARNING: 草稿未生成" | ||
| 45 | + fi | ||
| 46 | +done | ||
| 47 | + | ||
| 48 | +echo "" | ||
| 49 | +echo "=== 回归完成,请运行 score.py 查看结果 ===" | ||
| 50 | +echo "python3 scripts/score.py" | ||
| @@ -0,0 +1,121 @@ | |||
| 1 | +#!/bin/bash | ||
| 2 | +set -euo pipefail | ||
| 3 | + | ||
| 4 | +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" | ||
| 5 | +SKILL_DIR="$(dirname "$SCRIPT_DIR")" | ||
| 6 | +BENCHMARK_FILE="$SKILL_DIR/evals/benchmark.jsonl" | ||
| 7 | +DRAFTS_DIR="$SKILL_DIR/reports/drafts" | ||
| 8 | +LOG_FILE="$SKILL_DIR/reports/run_log.json" | ||
| 9 | +TIMEOUT_SECONDS=600 | ||
| 10 | + | ||
| 11 | +mkdir -p "$DRAFTS_DIR" | ||
| 12 | + | ||
| 13 | +if [ ! -f "$BENCHMARK_FILE" ]; then | ||
| 14 | + echo "ERROR: benchmark.jsonl not found at $BENCHMARK_FILE" | ||
| 15 | + exit 1 | ||
| 16 | +fi | ||
| 17 | + | ||
| 18 | +# 确定本轮版本号 | ||
| 19 | +LATEST_VERSION=$(ls "$SKILL_DIR/reports/"benchmark_v*.json 2>/dev/null | sort -V | tail -1 | grep -oP 'v\K[0-9]+' || echo "0") | ||
| 20 | +THIS_VERSION=$((LATEST_VERSION + 1)) | ||
| 21 | +OUTPUT_JSON="$SKILL_DIR/reports/benchmark_v${THIS_VERSION}.json" | ||
| 22 | + | ||
| 23 | +echo "=== issue-response-eval 基准评测 v${THIS_VERSION} ===" | ||
| 24 | +echo "基准文件: $BENCHMARK_FILE" | ||
| 25 | +echo "草稿目录: $DRAFTS_DIR" | ||
| 26 | +echo "" | ||
| 27 | + | ||
| 28 | +# 初始化日志 | ||
| 29 | +echo '{"version":'$THIS_VERSION',"timestamp":"'$(date -Iseconds)'","results":[' > "$LOG_FILE.tmp" | ||
| 30 | +FIRST=true | ||
| 31 | + | ||
| 32 | +# 遍历 benchmark.jsonl | ||
| 33 | +while IFS= read -r line; do | ||
| 34 | + [ -z "$line" ] && continue | ||
| 35 | + | ||
| 36 | + ISSUE_NUM=$(echo "$line" | jq -r '.issue_number') | ||
| 37 | + ISSUE_ID=$(echo "$line" | jq -r '.id') | ||
| 38 | + EXPECTED_LEVEL=$(echo "$line" | jq -r '.expected_level') | ||
| 39 | + | ||
| 40 | + echo "--- 处理 $ISSUE_ID: issue #$ISSUE_NUM (期望: $EXPECTED_LEVEL) ---" | ||
| 41 | + | ||
| 42 | + DRAFT_FILE="$DRAFTS_DIR/${ISSUE_NUM}.md" | ||
| 43 | + | ||
| 44 | + # 记录开始时间 | ||
| 45 | + START_TIME=$(date +%s) | ||
| 46 | + | ||
| 47 | + # 用 timeout 包裹 subagent 调用 | ||
| 48 | + TIMEOUT_OCCURRED=false | ||
| 49 | + timeout "$TIMEOUT_SECONDS" bash -c " | ||
| 50 | + echo '分析并回复 GitCode 上的 issue #$ISSUE_NUM。 | ||
| 51 | + | ||
| 52 | +重要约束: | ||
| 53 | +- 只生成回复草稿,禁止调用 gitcode-pr 提交评论 | ||
| 54 | +- 草稿写入文件 $DRAFT_FILE | ||
| 55 | +- 完成后输出 JSON 格式的执行日志到 stdout | ||
| 56 | + | ||
| 57 | +执行日志 JSON 格式: | ||
| 58 | +{ | ||
| 59 | + \"issue_num\": $ISSUE_NUM, | ||
| 60 | + \"classified_level\": \"L0|L1|L2\", | ||
| 61 | + \"classified_subtype\": \"...\", | ||
| 62 | + \"matched_faqs\": [\"...\"], | ||
| 63 | + \"error_code_verified\": true, | ||
| 64 | + \"source_verification\": {\"claim\": \"...\", \"result\": \"OK|FAIL|PARTIAL\"}, | ||
| 65 | + \"links_checked\": [{\"url\": \"...\", \"valid\": true}] | ||
| 66 | +} | ||
| 67 | + | ||
| 68 | +请使用 issue-response skill 的完整流程分析此 issue 并生成草稿。 | ||
| 69 | +' 2>&1 | ||
| 70 | + " > "$DRAFT_FILE.exec_log" 2>&1 || TIMEOUT_OCCURRED=true | ||
| 71 | + | ||
| 72 | + END_TIME=$(date +%s) | ||
| 73 | + DURATION=$((END_TIME - START_TIME)) | ||
| 74 | + | ||
| 75 | + # 检查草稿是否生成 | ||
| 76 | + if [ ! -f "$DRAFT_FILE" ] || [ "$TIMEOUT_OCCURRED" = true ]; then | ||
| 77 | + echo " WARNING: 草稿未生成或超时 (${DURATION}s)" | ||
| 78 | + DRAFT_EXISTS=false | ||
| 79 | + echo " [TIMEOUT]" >> "$DRAFT_FILE" 2>/dev/null || true | ||
| 80 | + else | ||
| 81 | + DRAFT_EXISTS=true | ||
| 82 | + echo " 草稿已生成: $DRAFT_FILE (${DURATION}s, $(wc -c < "$DRAFT_FILE") bytes)" | ||
| 83 | + fi | ||
| 84 | + | ||
| 85 | + # 解析执行日志(从 exec_log 文件中提取 JSON) | ||
| 86 | + EXEC_LOG_JSON=$(python3 -c " | ||
| 87 | +import json, sys | ||
| 88 | +try: | ||
| 89 | + with open('$DRAFT_FILE.exec_log') as f: | ||
| 90 | + content = f.read() | ||
| 91 | + import re | ||
| 92 | + match = re.search(r'\{[^{}]*\"classified_level\"[^{}]*\}', content, re.DOTALL) | ||
| 93 | + if match: | ||
| 94 | + obj = json.loads(match.group()) | ||
| 95 | + print(json.dumps(obj)) | ||
| 96 | + else: | ||
| 97 | + print(json.dumps({'issue_num': $ISSUE_NUM, 'classified_level': 'UNKNOWN', 'classified_subtype': 'UNKNOWN', 'matched_faqs': [], 'error_code_verified': false, 'source_verification': null, 'links_checked': []})) | ||
| 98 | +except Exception as e: | ||
| 99 | + print(json.dumps({'issue_num': $ISSUE_NUM, 'classified_level': 'UNKNOWN', 'error': str(e), 'matched_faqs': [], 'error_code_verified': false, 'source_verification': null, 'links_checked': []})) | ||
| 100 | +" 2>/dev/null || echo "{\"issue_num\":$ISSUE_NUM,\"classified_level\":\"UNKNOWN\",\"matched_faqs\":[],\"error_code_verified\":false,\"source_verification\":null,\"links_checked\":[]}") | ||
| 101 | + | ||
| 102 | + # 写入日志 | ||
| 103 | + if [ "$FIRST" = true ]; then | ||
| 104 | + FIRST=false | ||
| 105 | + else | ||
| 106 | + echo "," >> "$LOG_FILE.tmp" | ||
| 107 | + fi | ||
| 108 | + | ||
| 109 | + echo -n "{\"id\":\"$ISSUE_ID\",\"issue_number\":$ISSUE_NUM,\"duration_seconds\":$DURATION,\"timeout\":$TIMEOUT_OCCURRED,\"draft_exists\":$DRAFT_EXISTS,\"exec_log\":$EXEC_LOG_JSON}" >> "$LOG_FILE.tmp" | ||
| 110 | + | ||
| 111 | + echo "" | ||
| 112 | +done < "$BENCHMARK_FILE" | ||
| 113 | + | ||
| 114 | +echo "]}" >> "$LOG_FILE.tmp" | ||
| 115 | +mv "$LOG_FILE.tmp" "$LOG_FILE" | ||
| 116 | + | ||
| 117 | +echo "" | ||
| 118 | +echo "=== 基准执行完成 ===" | ||
| 119 | +echo "执行日志: $LOG_FILE" | ||
| 120 | +echo "草稿目录: $DRAFTS_DIR" | ||
| 121 | +echo "下一步: 运行 python3 scripts/score.py 打分" | ||
| @@ -0,0 +1,262 @@ | |||||||||||||||
| 1 | +#!/usr/bin/env python3 | ||||||||||||||
| 2 | +"""issue-response-eval 打分器:规则检查 + LLM 裁判。""" | ||||||||||||||
| 3 | +import json | ||||||||||||||
| 4 | +import os | ||||||||||||||
| 5 | +import re | ||||||||||||||
| 6 | +import subprocess | ||||||||||||||
| 7 | +import sys | ||||||||||||||
| 8 | +from pathlib import Path | ||||||||||||||
| 9 | +from urllib.parse import unquote | ||||||||||||||
| 10 | + | ||||||||||||||
| 11 | +SCRIPT_DIR = Path(__file__).parent.resolve() | ||||||||||||||
| 12 | +SKILL_DIR = SCRIPT_DIR.parent | ||||||||||||||
| 13 | +DRAFTS_DIR = SKILL_DIR / "reports" / "drafts" | ||||||||||||||
| 14 | +BENCHMARK_FILE = SKILL_DIR / "evals" / "benchmark.jsonl" | ||||||||||||||
| 15 | +RUN_LOG = SKILL_DIR / "reports" / "run_log.json" | ||||||||||||||
| 16 | +SCORES_FILE = SKILL_DIR / "reports" / "scores.jsonl" | ||||||||||||||
| 17 | +REPO_ROOT = SKILL_DIR.parent.parent.parent | ||||||||||||||
| 18 | + | ||||||||||||||
| 19 | + | ||||||||||||||
| 20 | +def load_benchmark(): | ||||||||||||||
| 21 | + items = [] | ||||||||||||||
| 22 | + with open(BENCHMARK_FILE, "r", encoding="utf-8") as f: | ||||||||||||||
| 23 | + for line in f: | ||||||||||||||
| 24 | + line = line.strip() | ||||||||||||||
| 25 | + if line: | ||||||||||||||
| 26 | + items.append(json.loads(line)) | ||||||||||||||
| 27 | + return items | ||||||||||||||
| 28 | + | ||||||||||||||
| 29 | + | ||||||||||||||
| 30 | +def load_run_log(): | ||||||||||||||
| 31 | + with open(RUN_LOG, "r", encoding="utf-8") as f: | ||||||||||||||
| 32 | + return json.load(f) | ||||||||||||||
| 33 | + | ||||||||||||||
| 34 | + | ||||||||||||||
| 35 | +def load_draft(issue_num): | ||||||||||||||
| 36 | + draft_path = DRAFTS_DIR / f"{issue_num}.md" | ||||||||||||||
| 37 | + if not draft_path.exists(): | ||||||||||||||
| 38 | + return None | ||||||||||||||
| 39 | + with open(draft_path, "r", encoding="utf-8") as f: | ||||||||||||||
| 40 | + return f.read() | ||||||||||||||
| 41 | + | ||||||||||||||
| 42 | + | ||||||||||||||
| 43 | +def find_exec_log(run_log, issue_num): | ||||||||||||||
| 44 | + for result in run_log.get("results", []): | ||||||||||||||
| 45 | + if result.get("issue_number") == issue_num: | ||||||||||||||
| 46 | + return result.get("exec_log", {}) | ||||||||||||||
| 47 | + return {} | ||||||||||||||
| 48 | + | ||||||||||||||
| 49 | + | ||||||||||||||
| 50 | +def check_r1_classification(exec_log, benchmark_item): | ||||||||||||||
| 51 | + classified = exec_log.get("classified_level", "UNKNOWN") | ||||||||||||||
| 52 | + expected = benchmark_item["expected_level"] | ||||||||||||||
| 53 | + passed = classified == expected | ||||||||||||||
| 54 | + return {"rule": "R1", "passed": passed, "detail": f"classified={classified}, expected={expected}"} | ||||||||||||||
| 55 | + | ||||||||||||||
| 56 | + | ||||||||||||||
| 57 | +def check_r2_links(draft_text): | ||||||||||||||
| 58 | + if not draft_text: | ||||||||||||||
| 59 | + return {"rule": "R2", "passed": False, "detail": "草稿不存在"} | ||||||||||||||
| 60 | + pattern = r'gitcode\.com/cann/runtime/blob/master/(docs/[^\s)]+)' | ||||||||||||||
| 61 | + links = re.findall(pattern, draft_text) | ||||||||||||||
| 62 | + if not links: | ||||||||||||||
| 63 | + return {"rule": "R2", "passed": True, "detail": "草稿中无docs链接", "links_count": 0} | ||||||||||||||
| 64 | + results = [] | ||||||||||||||
| 65 | + all_valid = True | ||||||||||||||
| 66 | + for link in links: | ||||||||||||||
| 67 | + path = unquote(link) | ||||||||||||||
| 68 | + try: | ||||||||||||||
| 69 | + subprocess.run( | ||||||||||||||
| 70 | + ["git", "show", f"origin/master:{path}"], | ||||||||||||||
| 71 | + capture_output=True, check=True, timeout=5, | ||||||||||||||
| 72 | + cwd=str(REPO_ROOT) | ||||||||||||||
| 73 | + ) | ||||||||||||||
| 74 | + results.append({"path": path, "valid": True}) | ||||||||||||||
| 75 | + except (subprocess.CalledProcessError, subprocess.TimeoutExpired): | ||||||||||||||
| 76 | + results.append({"path": path, "valid": False}) | ||||||||||||||
| 77 | + all_valid = False | ||||||||||||||
| 78 | + return {"rule": "R2", "passed": all_valid, "detail": results, "links_count": len(links)} | ||||||||||||||
| 79 | + | ||||||||||||||
| 80 | + | ||||||||||||||
| 81 | +def check_r3_error_code(draft_text, benchmark_item): | ||||||||||||||
| 82 | + if not draft_text: | ||||||||||||||
| 83 | + return {"rule": "R3", "passed": False, "detail": "草稿不存在"} | ||||||||||||||
| 84 | + error_codes_in_draft = re.findall(r'(?:ACL_ERROR_|error code[:\s]*)(\d{6})', draft_text, re.IGNORECASE) | ||||||||||||||
| 85 | + checkpoints = benchmark_item.get("expected_checkpoints", []) | ||||||||||||||
| 86 | + error_related = any("错误码" in cp or "error" in cp.lower() or "107002" in cp or "507" in cp for cp in checkpoints) | ||||||||||||||
🟡 Medium Priority
因此这 4 条全部被判定为 触发条件:任何 benchmark item 的 修复方向:在 建议:在 error_related 判断中增加 subtype 检查: 改动建议
![]() ![]() 不准确? | |||||||||||||||
| 87 | + if not error_related: | ||||||||||||||
| 88 | + return {"rule": "R3", "passed": True, "detail": "此issue不涉及错误码", "applicable": False} | ||||||||||||||
| 89 | + if not error_codes_in_draft: | ||||||||||||||
| 90 | + return {"rule": "R3", "passed": False, "detail": "issue涉及错误码但草稿未提及", "applicable": True} | ||||||||||||||
| 91 | + return {"rule": "R3", "passed": True, "detail": f"草稿引用了错误码: {error_codes_in_draft}", "applicable": True} | ||||||||||||||
| 92 | + | ||||||||||||||
| 93 | + | ||||||||||||||
| 94 | +def check_r4_checkpoints(draft_text, benchmark_item): | ||||||||||||||
| 95 | + if not draft_text: | ||||||||||||||
| 96 | + return {"rule": "R4", "passed": False, "detail": "草稿不存在"} | ||||||||||||||
| 97 | + checkpoints = benchmark_item.get("expected_checkpoints", []) | ||||||||||||||
| 98 | + if not checkpoints: | ||||||||||||||
| 99 | + return {"rule": "R4", "passed": True, "detail": "无检查点", "covered": 0, "total": 0} | ||||||||||||||
| 100 | + draft_lower = draft_text.lower() | ||||||||||||||
| 101 | + covered = 0 | ||||||||||||||
| 102 | + details = [] | ||||||||||||||
| 103 | + for cp in checkpoints: | ||||||||||||||
| 104 | + keywords = re.findall(r'[\u4e00-\u9fff]{2,}|[a-zA-Z_]{3,}', cp) | ||||||||||||||
| 105 | + matched = False | ||||||||||||||
| 106 | + for kw in keywords[:5]: | ||||||||||||||
| 107 | + if kw.lower() in draft_lower: | ||||||||||||||
| 108 | + matched = True | ||||||||||||||
| 109 | + break | ||||||||||||||
| 110 | + if matched: | ||||||||||||||
| 111 | + covered += 1 | ||||||||||||||
| 112 | + details.append({"checkpoint": cp, "covered": matched}) | ||||||||||||||
| 113 | + threshold = len(checkpoints) - 1 | ||||||||||||||
| 114 | + passed = covered >= threshold | ||||||||||||||
| 115 | + return {"rule": "R4", "passed": passed, "detail": details, "covered": covered, "total": len(checkpoints)} | ||||||||||||||
| 116 | + | ||||||||||||||
| 117 | + | ||||||||||||||
| 118 | +def check_r5_no_duplicate(draft_text, benchmark_item): | ||||||||||||||
| 119 | + if not draft_text: | ||||||||||||||
| 120 | + return {"rule": "R5", "passed": False, "detail": "草稿不存在"} | ||||||||||||||
| 121 | + gt_summary = benchmark_item.get("ground_truth_reply_summary", "") | ||||||||||||||
| 122 | + if not gt_summary: | ||||||||||||||
| 123 | + return {"rule": "R5", "passed": True, "detail": "无ground truth", "applicable": False} | ||||||||||||||
| 124 | + gt_keywords = re.findall(r'[\u4e00-\u9fff]{3,}|[a-zA-Z_]{4,}', gt_summary) | ||||||||||||||
| 125 | + draft_lower = draft_text.lower() | ||||||||||||||
| 126 | + consecutive_match = 0 | ||||||||||||||
| 127 | + max_consecutive = 0 | ||||||||||||||
| 128 | + for kw in gt_keywords: | ||||||||||||||
| 129 | + if kw.lower() in draft_lower: | ||||||||||||||
| 130 | + consecutive_match += 1 | ||||||||||||||
| 131 | + max_consecutive = max(max_consecutive, consecutive_match) | ||||||||||||||
| 132 | + else: | ||||||||||||||
| 133 | + consecutive_match = 0 | ||||||||||||||
| 134 | + is_simple_copy = max_consecutive > 5 and len(draft_text) < len(gt_summary) * 2 | ||||||||||||||
| 135 | + return {"rule": "R5", "passed": not is_simple_copy, "detail": f"max_consecutive_match={max_consecutive}", "applicable": True} | ||||||||||||||
| 136 | + | ||||||||||||||
| 137 | + | ||||||||||||||
| 138 | +def check_r6_source_verification(draft_text, benchmark_item): | ||||||||||||||
| 139 | + if not draft_text: | ||||||||||||||
| 140 | + return {"rule": "R6", "passed": False, "detail": "草稿不存在"} | ||||||||||||||
| 141 | + level = benchmark_item.get("expected_level", "") | ||||||||||||||
| 142 | + subtype = benchmark_item.get("expected_subtype", "") | ||||||||||||||
| 143 | + if level != "L2" and subtype != "code-audit": | ||||||||||||||
| 144 | + return {"rule": "R6", "passed": True, "detail": "此issue不需要源码验证", "applicable": False} | ||||||||||||||
| 145 | + has_verification = bool(re.search(r'✅|❌|⚠️|确认有效|不准确|部分成立|确认存在|不存在', draft_text)) | ||||||||||||||
| 146 | + return {"rule": "R6", "passed": has_verification, "detail": f"has_verification={has_verification}", "applicable": True} | ||||||||||||||
| 147 | + | ||||||||||||||
| 148 | + | ||||||||||||||
| 149 | +def llm_judge(issue_text, draft_text, ground_truth_summary): | ||||||||||||||
| 150 | + prompt = f"""你是 issue 回复质量评估裁判。请对比以下 issue 的 AI 生成草稿与维护者真实回复,按3个维度打分(0-2分)。 | ||||||||||||||
| 151 | + | ||||||||||||||
| 152 | +## Issue 原文 | ||||||||||||||
| 153 | +{issue_text[:1000]} | ||||||||||||||
| 154 | + | ||||||||||||||
| 155 | +## AI 生成草稿 | ||||||||||||||
| 156 | +{draft_text[:2000] if draft_text else '(草稿缺失)'} | ||||||||||||||
| 157 | + | ||||||||||||||
| 158 | +## 维护者真实回复摘要 | ||||||||||||||
| 159 | +{ground_truth_summary} | ||||||||||||||
| 160 | + | ||||||||||||||
| 161 | +## 打分维度 | ||||||||||||||
| 162 | +| 维度 | 0分 | 1分 | 2分 | | ||||||||||||||
| 163 | +|------|-----|-----|-----| | ||||||||||||||
| 164 | +| accuracy | 有事实错误/误导 | 无错但不完整 | 准确且完整 | | ||||||||||||||
| 165 | +| actionability | 无可操作步骤 | 有方向但模糊 | 有具体操作步骤 | | ||||||||||||||
| 166 | +| adoptability | 维护者不会采纳 | 需大改后可采纳 | 可直接采纳或微调采纳 | | ||||||||||||||
| 167 | + | ||||||||||||||
| 168 | +请输出 JSON:{{"accuracy": 0-2, "actionability": 0-2, "adoptability": 0-2, "reasoning": "简要说明"}} | ||||||||||||||
| 169 | +""" | ||||||||||||||
| 170 | + return {"prompt": prompt, "note": "此 prompt 需由 LLM 执行,脚本模式下返回 None"} | ||||||||||||||
| 171 | + | ||||||||||||||
| 172 | + | ||||||||||||||
| 173 | +def calculate_score(rule_results, llm_scores=None): | ||||||||||||||
| 174 | + rule_passed = sum(1 for r in rule_results if r["passed"]) | ||||||||||||||
| 175 | + rule_total = len(rule_results) | ||||||||||||||
| 176 | + rule_score = rule_passed / rule_total if rule_total > 0 else 0 | ||||||||||||||
| 177 | + if llm_scores and len(llm_scores) > 0: | ||||||||||||||
| 178 | + avg_llm = sum(sum(s.values()) for s in llm_scores) / len(llm_scores) | ||||||||||||||
| 179 | + llm_score = (avg_llm / 2) | ||||||||||||||
🟡 Medium Priority
这里 以满分(两个 run 均为 {2,2,2})为例: 差距达 3 倍。一旦 LLM 裁判自动化(DEV_PROCESS.md 第 147 行的 TODO)接入,总分将被严重扭曲——规则分最高贡献 0.6,LLM 分最高贡献 1.2,LLM 分将主导评分。当前因 建议:修改为:先对每个 run 的三维度求均值再跨 run 平均,即 改动建议
![]() ![]() 不准确? 🟡 Medium Priority
该公式将所有维度的原始分直接求和再除以运行次数(而非总维度数),导致分子缺少对每轮 3 个维度的平均。 设计公式:「LLM 三维均分 = 每轮 (accuracy+actionability+adoptability)/3,两轮取均值,再 /2 归一化」。
设 2 轮 × 3 维 = 6 个值,正确计算应为 高估倍数:12/4 = 3 倍(LLM 维度);反映到综合分上 LLM 贡献被高估 50%(因为还有 ×0.4 系数)。 例如规则分 0.6 + LLM 全满分时,正确综合分 = 0.36 + 0.4 = 0.76,当前代码 = 0.36 + 0.6 = 0.96,导致未达标用例错误通过 0.85 阈值。 当前 建议:将分母从 改动建议
![]() ![]() 不准确? | |||||||||||||||
| 180 | + else: | ||||||||||||||
| 181 | + llm_score = 0 | ||||||||||||||
| 182 | + total = rule_score * 0.6 + llm_score * 0.4 | ||||||||||||||
| 183 | + return { | ||||||||||||||
| 184 | + "total": round(total, 4), | ||||||||||||||
| 185 | + "rule_score": round(rule_score, 4), | ||||||||||||||
| 186 | + "llm_score": round(llm_score, 4), | ||||||||||||||
| 187 | + "rule_passed": rule_passed, | ||||||||||||||
| 188 | + "rule_total": rule_total, | ||||||||||||||
| 189 | + "llm_scores": llm_scores, | ||||||||||||||
| 190 | + "passed": total >= 0.85 | ||||||||||||||
| 191 | + } | ||||||||||||||
| 192 | + | ||||||||||||||
| 193 | + | ||||||||||||||
| 194 | +def main(): | ||||||||||||||
| 195 | + benchmark_items = load_benchmark() | ||||||||||||||
| 196 | + run_log = load_run_log() | ||||||||||||||
| 197 | + | ||||||||||||||
| 198 | + print(f"=== 打分开始: {len(benchmark_items)} 条 ===\n") | ||||||||||||||
| 199 | + | ||||||||||||||
| 200 | + all_results = [] | ||||||||||||||
| 201 | + with open(SCORES_FILE, "w", encoding="utf-8") as f: | ||||||||||||||
| 202 | + for item in benchmark_items: | ||||||||||||||
| 203 | + issue_num = item["issue_number"] | ||||||||||||||
| 204 | + print(f"--- #{issue_num} ({item['id']}) ---") | ||||||||||||||
| 205 | + | ||||||||||||||
| 206 | + draft = load_draft(issue_num) | ||||||||||||||
| 207 | + exec_log = find_exec_log(run_log, issue_num) | ||||||||||||||
| 208 | + | ||||||||||||||
| 209 | + rule_results = [ | ||||||||||||||
| 210 | + check_r1_classification(exec_log, item), | ||||||||||||||
| 211 | + check_r2_links(draft), | ||||||||||||||
| 212 | + check_r3_error_code(draft, item), | ||||||||||||||
| 213 | + check_r4_checkpoints(draft, item), | ||||||||||||||
| 214 | + check_r5_no_duplicate(draft, item), | ||||||||||||||
| 215 | + check_r6_source_verification(draft, item), | ||||||||||||||
| 216 | + ] | ||||||||||||||
| 217 | + | ||||||||||||||
| 218 | + for r in rule_results: | ||||||||||||||
| 219 | + status = "PASS" if r["passed"] else "FAIL" | ||||||||||||||
| 220 | + detail = r["detail"][:80] if isinstance(r["detail"], str) else str(r["detail"])[:80] | ||||||||||||||
| 221 | + print(f" {r['rule']}: {status} - {detail}") | ||||||||||||||
| 222 | + | ||||||||||||||
| 223 | + llm_prompt = llm_judge("", draft or "", item.get("ground_truth_reply_summary", "")) | ||||||||||||||
| 224 | + score = calculate_score(rule_results, None) | ||||||||||||||
| 225 | + | ||||||||||||||
| 226 | + result = { | ||||||||||||||
| 227 | + "id": item["id"], | ||||||||||||||
| 228 | + "issue_number": issue_num, | ||||||||||||||
| 229 | + "expected_level": item["expected_level"], | ||||||||||||||
| 230 | + "rule_results": rule_results, | ||||||||||||||
| 231 | + "llm_prompt": llm_prompt["prompt"][:200] + "...", | ||||||||||||||
| 232 | + "score": score | ||||||||||||||
| 233 | + } | ||||||||||||||
| 234 | + | ||||||||||||||
| 235 | + print(f" 总分: {score['total']} ({'PASS' if score['passed'] else 'FAIL'})\n") | ||||||||||||||
| 236 | + | ||||||||||||||
| 237 | + f.write(json.dumps(result, ensure_ascii=False) + "\n") | ||||||||||||||
| 238 | + all_results.append(result) | ||||||||||||||
| 239 | + | ||||||||||||||
| 240 | + total_pass = sum(1 for r in all_results if r["score"]["passed"]) | ||||||||||||||
| 241 | + avg_score = sum(r["score"]["total"] for r in all_results) / len(all_results) | ||||||||||||||
| 242 | + | ||||||||||||||
| 243 | + print(f"=== 打分完成 ===") | ||||||||||||||
| 244 | + print(f"通过: {total_pass}/{len(all_results)}") | ||||||||||||||
| 245 | + print(f"平均分: {avg_score:.4f} (通过线: 0.85)") | ||||||||||||||
| 246 | + print(f"结果文件: {SCORES_FILE}") | ||||||||||||||
| 247 | + | ||||||||||||||
| 248 | + summary_file = SKILL_DIR / "reports" / "score_summary.json" | ||||||||||||||
| 249 | + summary = { | ||||||||||||||
| 250 | + "total_issues": len(all_results), | ||||||||||||||
| 251 | + "passed": total_pass, | ||||||||||||||
| 252 | + "avg_score": round(avg_score, 4), | ||||||||||||||
| 253 | + "pass_threshold": 0.85, | ||||||||||||||
| 254 | + "results": all_results | ||||||||||||||
| 255 | + } | ||||||||||||||
| 256 | + with open(summary_file, "w", encoding="utf-8") as f: | ||||||||||||||
| 257 | + json.dump(summary, f, ensure_ascii=False, indent=2) | ||||||||||||||
| 258 | + print(f"汇总文件: {summary_file}") | ||||||||||||||
| 259 | + | ||||||||||||||
| 260 | + | ||||||||||||||
| 261 | +if __name__ == "__main__": | ||||||||||||||
| 262 | + main() | ||||||||||||||
| @@ -0,0 +1,104 @@ | |||
| 1 | +#!/bin/bash | ||
| 2 | +set -euo pipefail | ||
| 3 | + | ||
| 4 | +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" | ||
| 5 | +SKILL_DIR="$(dirname "$SCRIPT_DIR")" | ||
| 6 | +DRAFTS_DIR="$SKILL_DIR/reports/drafts" | ||
| 7 | +DECISIONS_FILE="$SKILL_DIR/evals/live_decisions.jsonl" | ||
| 8 | + | ||
| 9 | +mkdir -p "$DRAFTS_DIR" | ||
| 10 | + | ||
| 11 | +if [ -z "${GITCODE_API_TOKEN:-}" ]; then | ||
| 12 | + echo "ERROR: GITCODE_API_TOKEN 环境变量未设置" | ||
| 13 | + exit 1 | ||
| 14 | +fi | ||
| 15 | + | ||
| 16 | +echo "=== 拉取外部 open issue ===" | ||
| 17 | + | ||
| 18 | +# 拉取 assignee=null 且标题含 Question/Documentation 的 open issue | ||
| 19 | +ISSUES_JSON=$(curl -s "https://api.gitcode.com/api/v5/repos/cann/runtime/issues?state=open&per_page=50&access_token=$GITCODE_API_TOKEN" 2>/dev/null) | ||
🟡 Medium Priority 第19行 风险:
虽然这是开发者工具而非生产服务,但 token 泄露风险真实存在。应使用 HTTP Header(如 建议:改用 HTTP Header 传递 token: ![]() ![]() 不准确? | |||
| 20 | + | ||
| 21 | +# 过滤:assignee=null + 标题含 [Question 或 [Documentation | ||
| 22 | +FILTERED=$(echo "$ISSUES_JSON" | jq -r '.[] | select(.assignee == null) | select(.title | test("\\[Question|\\[Documentation")) | "\(.number)\t\(.title)"' 2>/dev/null) | ||
| 23 | + | ||
| 24 | +if [ -z "$FILTERED" ]; then | ||
| 25 | + echo "无新的外部 open issue" | ||
| 26 | + exit 0 | ||
| 27 | +fi | ||
| 28 | + | ||
| 29 | +# 去重:排除已在 live_decisions.jsonl 中的 | ||
| 30 | +PROCESSED_NUMS=$(awk -F'\t' '{print $1}' "$DECISIONS_FILE" 2>/dev/null || echo "") | ||
| 31 | + | ||
| 32 | +NEW_COUNT=0 | ||
| 33 | +while IFS=$'\t' read -r num title; do | ||
| 34 | + [ -z "$num" ] && continue | ||
| 35 | + | ||
| 36 | + # 检查是否已处理 | ||
| 37 | + if echo "$PROCESSED_NUMS" | grep -q "^${num}$"; then | ||
| 38 | + continue | ||
| 39 | + fi | ||
| 40 | + | ||
| 41 | + echo "--- 新 issue #$num: $title ---" | ||
| 42 | + | ||
| 43 | + DRAFT_FILE="$DRAFTS_DIR/${num}.md" | ||
| 44 | + | ||
| 45 | + # 跑 subagent 生成草稿 | ||
| 46 | + timeout 600 bash -c " | ||
| 47 | + echo '分析并回复 GitCode 上的 issue #$num。 | ||
| 48 | +重要约束:只生成回复草稿,禁止调用 gitcode-pr 提交评论。 | ||
| 49 | +草稿写入文件 $DRAFT_FILE。 | ||
| 50 | +' 2>&1 | ||
| 51 | + " > /dev/null 2>&1 || echo " WARNING: 执行超时或失败" | ||
| 52 | + | ||
| 53 | + if [ -f "$DRAFT_FILE" ]; then | ||
| 54 | + echo " 草稿已生成: $DRAFT_FILE" | ||
| 55 | + echo " 请审阅草稿后录入决策:" | ||
| 56 | + echo " 1) adopt - 可直接采纳" | ||
| 57 | + echo " 2) revise - 需修改后可用(附修改要点)" | ||
| 58 | + echo " 3) reject - 不可用(附原因)" | ||
| 59 | + echo "" | ||
| 60 | + read -r -p " 决策 [1/2/3]: " decision | ||
| 61 | + | ||
| 62 | + case $decision in | ||
| 63 | + 1) | ||
| 64 | + echo -e "${num}\tadopt\t$(date -Iseconds)\t${title}" >> "$DECISIONS_FILE" | ||
| 65 | + echo " 已记录: adopt" | ||
| 66 | + ;; | ||
| 67 | + 2) | ||
| 68 | + read -r -p " 修改要点: " notes | ||
| 69 | + echo -e "${num}\trevise\t$(date -Iseconds)\t${title}\t${notes}" >> "$DECISIONS_FILE" | ||
| 70 | + echo " 已记录: revise" | ||
| 71 | + ;; | ||
| 72 | + 3) | ||
| 73 | + read -r -p " 拒绝原因: " reason | ||
| 74 | + echo -e "${num}\treject\t$(date -Iseconds)\t${title}\t${reason}" >> "$DECISIONS_FILE" | ||
| 75 | + echo " 已记录: reject" | ||
| 76 | + ;; | ||
| 77 | + *) | ||
| 78 | + echo " 无效输入,跳过" | ||
| 79 | + ;; | ||
| 80 | + esac | ||
| 81 | + else | ||
| 82 | + echo " WARNING: 草稿未生成,跳过" | ||
| 83 | + fi | ||
| 84 | + | ||
| 85 | + NEW_COUNT=$((NEW_COUNT + 1)) | ||
| 86 | + echo "" | ||
| 87 | +done <<< "$FILTERED" | ||
| 88 | + | ||
| 89 | +echo "=== 分流完成: 处理了 $NEW_COUNT 条新 issue ===" | ||
| 90 | +echo "决策记录: $DECISIONS_FILE" | ||
| 91 | + | ||
| 92 | +# 统计 | ||
| 93 | +if [ -f "$DECISIONS_FILE" ]; then | ||
| 94 | + echo "" | ||
| 95 | + echo "=== 采纳率统计 ===" | ||
| 96 | + TOTAL=$(wc -l < "$DECISIONS_FILE") | ||
| 97 | + ADOPT=$(grep -c $'\tadopt\t' "$DECISIONS_FILE" 2>/dev/null || echo 0) | ||
| 98 | + REVISE=$(grep -c $'\trevise\t' "$DECISIONS_FILE" 2>/dev/null || echo 0) | ||
| 99 | + REJECT=$(grep -c $'\treject\t' "$DECISIONS_FILE" 2>/dev/null || echo 0) | ||
| 100 | + echo "总计: $TOTAL" | ||
| 101 | + echo "采纳: $ADOPT" | ||
| 102 | + echo "需改: $REVISE" | ||
| 103 | + echo "拒绝: $REJECT" | ||
| 104 | +fi | ||
| @@ -0,0 +1,370 @@ | |||
| 1 | +# issue-response Skill 开发报告 | ||
| 2 | + | ||
| 3 | +## 1. 背景 | ||
| 4 | + | ||
| 5 | +CANN Runtime 仓库在 GitCode 上持续收到外部开发者提交的 Issue,涵盖技术疑问、Bug 报告、文档反馈、性能问题等多种类型。当前 Issue 回复依赖人工处理,响应速度慢、质量不一致,且难以系统性地沉淀回复经验。 | ||
| 6 | + | ||
| 7 | +原始 PR #2551 提交了 `issue-sample-response` skill,核心流程是"Issue分析 → 实验设计 → 编写Sample → 文档+PR"。但实际使用中发现: | ||
| 8 | + | ||
| 9 | +1. **生成 Sample 不是必需的**:多数 Issue 只需要技术解释和排查指导,不需要完整可运行样例 | ||
| 10 | +2. **回复应分级处理**:简单问题可以快速回复,复杂问题只需分析摘要 | ||
| 11 | +3. **需要自动化演进路径**:当前手动回复,后续挂机器人自动回复 | ||
| 12 | + | ||
| 13 | +**核心问题**:如何系统性地分级回复 GitCode Issue,确保回复质量一致、避免遗漏关键技术点、且为后续自动化演进预留空间? | ||
| 14 | + | ||
| 15 | +## 2. 需求 | ||
| 16 | + | ||
| 17 | +开发一个 `issue-response` skill,标准化 Issue 回复流程: | ||
| 18 | + | ||
| 19 | +- **输入**:GitCode Issue URL 或编号 | ||
| 20 | +- **输出**:分级回复草稿(L0/L1/L2),提交前与用户确认 | ||
| 21 | +- **关键约束**:绝不擅自提交回复;所有回复提交前必须与用户确认 | ||
| 22 | +- **分级策略**: | ||
| 23 | + - L0(简单FAQ):匹配文档生成完整回复 | ||
| 24 | + - L1(有日志/报错):错误码校验 + FAQ + 日志分析初版回复 | ||
| 25 | + - L2(复杂/需实验):仅分析摘要 + Runtime 能力说明 | ||
| 26 | +- **与 PR #2551 关系**:两个 skill 共存,各有侧重 | ||
| 27 | + | ||
| 28 | +## 3. 提效场景 | ||
| 29 | + | ||
| 30 | +### 场景 A:快速响应外部 Issue | ||
| 31 | + | ||
| 32 | +外部开发者提交 Issue → agent 使用 skill 分级分析 → 生成回复草稿 → 用户确认 → 提交回复 | ||
| 33 | + | ||
| 34 | +**提效**:从人工分析+编写回复(通常需要 1-4 小时)到 skill 辅助生成(约 5-15 分钟交互 + 确认) | ||
| 35 | + | ||
| 36 | +### 场景 B:批量 Issue 处理 | ||
| 37 | + | ||
| 38 | +多个 Issue 同时待处理 → agent 逐个使用 skill 分析分级 → 批量生成草稿 → 用户逐个确认提交 | ||
| 39 | + | ||
| 40 | +**提效**:系统性处理,避免遗漏,回复格式一致 | ||
| 41 | + | ||
| 42 | +### 场景 C:后续自动化演进 | ||
| 43 | + | ||
| 44 | +当前 skill 生成草稿、用户确认提交 → 后续挂机器人框架 → L0 级别全自动回复、L1 级别半自动回复 | ||
| 45 | + | ||
| 46 | +**提效**:Skill 设计为自动化演进预留接口(分级策略、通知模板、FAQ 匹配机制) | ||
| 47 | + | ||
| 48 | +## 4. Skill 文件结构 | ||
| 49 | + | ||
| 50 | +``` | ||
| 51 | +.claude/skills/issue-response/ | ||
| 52 | +├── SKILL.md — 主文件:触发条件 + 9步工作流 + 分级策略 + 禁止行为 | ||
| 53 | +├── evals/evals.json — 3个测试用例(L0/L1/L2) | ||
| 54 | +└── references/ | ||
| 55 | + ├── issue-classifier.md — L0/L1/L2 分类标准 + 快速判定流程图 | ||
| 56 | + ├── reply-templates.md — 4个分级回复模板 + L2强化模板(含源码验证结论) + 信息补充请求模板 | ||
| 57 | + ├── faq-matcher.md — 16个FAQ关键词映射 + 26个API参考映射 + 错误码快速映射 + 链接可达性校验 | ||
| 58 | + ├── faq-semantic-map.md — 语义意图→FAQ目录映射(关键词无命中时使用)【Phase 1 新增】 | ||
| 59 | + ├── log-analyzer.md — 错误码4层体系 + slog/plog区分 + 首报错分析流程 + 模块归属映射 | ||
| 60 | + ├── real-case-study.md — 12个真实Issue分类对照 | ||
| 61 | + ├── tool-guide.md — gitcode-issue/CodeGraph/gitcode-pr/Task + 源码验证工具指南【Phase 1 更新】 | ||
| 62 | + └── rag-config.md — RAG配置占位(Phase 2)【Phase 1 新增】 | ||
| 63 | +``` | ||
| 64 | + | ||
| 65 | +## 5. 提效效果 | ||
| 66 | + | ||
| 67 | +| 指标 | 人工回复 | Skill 辅助 | | ||
| 68 | +|------|---------|-----------| | ||
| 69 | +| 回复生成时间 | 1-4小时 | 5-15分钟交互 | | ||
| 70 | +| 错误码准确性 | 依赖个人经验,可能遗漏 | 强制校验步骤,避免错误码与API不匹配 | | ||
| 71 | +| FAQ匹配完整性 | 可能遗漏相关文档 | 关键词+目录映射表系统性搜索 | | ||
| 72 | +| plog/slog区分 | 容易混淆 | 明确指导 slog 搜 kernel/plog 搜 Device异常 | | ||
| 73 | +| 已有评论审查 | 可能重复维护者回答 | 强制检查已有评论,补充而非重复 | | ||
| 74 | +| 回复格式一致性 | 格式不统一 | 分级模板标准化 | | ||
| 75 | + | ||
| 76 | +## 6. 测试设计 | ||
| 77 | + | ||
| 78 | +### 测试点覆盖 | ||
| 79 | + | ||
| 80 | +5轮真实 Issue 测试 + 3轮初始评测,覆盖 L0/L1/L2 三级: | ||
| 81 | + | ||
| 82 | +| 测试 | Issue | 分类 | 核心验证点 | | ||
| 83 | +|------|-------|------|-----------| | ||
| 84 | +| T1(初始) | #551(文档链接跳转) | L0 | 简单FAQ回复的简洁性和准确性 | | ||
| 85 | +| T2(初始) | #609(aclrtMalloc 507011) | L1 | 错误码校验、FAQ匹配、升级场景分析 | | ||
| 86 | +| T3(初始) | #578(内存碎片OOM) | L2 | 仅分析摘要、4个假设、模块归属 | | ||
| 87 | +| T4(真实) | #624(aicore-num vs blockDim) | L1 | 编译时vs运行时参数区分、slog/plog区分 | | ||
| 88 | +| T5(真实) | #571(OOM但显存充足) | L1 | 大页/小页分离、aclrtGetMemInfo用法 | | ||
| 89 | +| T6(真实) | #572(vLLM KV Cache) | L2 | 框架集成类、Runtime能力说明 | | ||
| 90 | +| T7(真实) | #607(AIC+AIV资源争抢) | L1 | 硬件概念澄清、核资源控制API | | ||
| 91 | +| T8(真实) | #609(正式提交) | L1 | 用户确认后正式提交评论 | | ||
| 92 | +| T9(Phase 1验证) | #628(build.sh VERSION_INFO mismatch) | L0 | assignee非空时中止流程 | | ||
| 93 | +| T10(Phase 1验证) | #643(NULL pointer validation in API paths) | L2 | 源码自动验证:claim验证、decorator/error层审计 | | ||
| 94 | +| T11(Phase 1验证) | #647(buffer offset + write_size overflow) | L1 | 源码自动验证:memcpy_s destMax==count确认 | | ||
| 95 | +| T12(Phase 1验证) | #645(TPRT device use-after-free after close) | L1 | 源码自动验证:API名不存在但核心风险确认 → 生成修复PR #2982 | | ||
| 96 | + | ||
| 97 | +## 7. 测试中发现的问题与改进 | ||
| 98 | + | ||
| 99 | +### 问题 1:错误码与声称API不匹配(Issue #609) | ||
| 100 | + | ||
| 101 | +**现象**:用户说"aclrtMalloc返回507011",但507011是`ACL_ERROR_RT_MODEL_EXECUTE`(模型执行错误),并非内存分配错误码 | ||
| 102 | + | ||
| 103 | +**根因**:用户可能混淆了异步错误传播——实际错误发生在模型执行阶段,延迟传播到aclrtMalloc调用后的同步点 | ||
| 104 | + | ||
| 105 | +**解决**:SKILL.md 新增步骤3"错误码校验",回复模板L1部分新增"生成前检查项",faq-matcher.md错误码映射中增加507011的双重归属说明 | ||
| 106 | + | ||
| 107 | +### 问题 2:plog 描述不当(Issue #609 用户反馈) | ||
| 108 | + | ||
| 109 | +**现象**:初始草稿写"获取plog日志定位Device侧异常",用户指出有时候也是Host侧异常 | ||
| 110 | + | ||
| 111 | +**根因**:issue的异常可能来自Host侧(如Runtime下发错误)或Device侧(如AICore异常),不应限定为"Device侧" | ||
| 112 | + | ||
| 113 | +**解决**:所有plog描述改为"获取plog日志定位异常";log-analyzer.md新增slog vs plog区分章节;reply-templates.md L1模板新增此约束 | ||
| 114 | + | ||
| 115 | +### 问题 3:首报错分析缺失(Issue #609 用户反馈) | ||
| 116 | + | ||
| 117 | +**现象**:初始草稿直接给出具体定位步骤,但用户要求先查ERROR看首报错是否来自Runtime | ||
| 118 | + | ||
| 119 | +**根因**:首报错来源模块(RUNTIME/GE/DRV)决定了后续分析方向,直接定位可能走错方向 | ||
| 120 | + | ||
| 121 | +**解决**:log-analyzer.md新增"首报错分析流程";reply-templates.md L1模板的plog步骤改为先查首报错再分类定位 | ||
| 122 | + | ||
| 123 | +### 问题 4:slog vs plog 混淆(Issue #624) | ||
| 124 | + | ||
| 125 | +**现象**:用户在plog中搜block/kernel关键词搜不到——因为这些信息在Host侧slog中 | ||
| 126 | + | ||
| 127 | +**根因**:plog是Device侧日志,kernel下发信息(coreDim、blockDim等)在Host侧slog中 | ||
| 128 | + | ||
| 129 | +**解决**:log-analyzer.md新增slog vs plog关键区分章节,包含具体搜索命令示例;SKILL.md步骤6 L1场景说明中补充slog/plog区分 | ||
| 130 | + | ||
| 131 | +### 问题 5:已有评论审查缺失(Issue #571、#607) | ||
| 132 | + | ||
| 133 | +**现象**:维护者ykl999/wangtao43已回复核心问题,如果skill不检查已有评论可能重复回复 | ||
| 134 | + | ||
| 135 | +**根因**:初始skill流程没有"已有评论审查"步骤 | ||
| 136 | + | ||
| 137 | +**解决**:SKILL.md新增步骤5"已有评论审查",明确要求补充而非重复维护者回答;gitcode-issue使用时强调读取评论而非仅详情 | ||
| 138 | + | ||
| 139 | +### 问题 6:FAQ映射缺失(Issue #571、#607、#572) | ||
| 140 | + | ||
| 141 | +**现象**:大页/小页分离(#571)、核资源控制(#607)、SOMA内存池/自定义Allocator(#572)在faq-matcher.md中没有映射 | ||
| 142 | + | ||
| 143 | +**根因**:初始版本只覆盖了docs/04_FAQ/中最常见16个FAQ的映射,未覆盖开发指南和高级API参考 | ||
| 144 | + | ||
| 145 | +**解决**:faq-matcher.md补充4个缺失映射:大页/小页→aclrtGetMemInfo、核资源控制→08_运行时核资源控制.md、SOMA→11-10_Stream有序内存分配.md、自定义Allocator→11-08_自定义内存分配器.md、硬件同步→14_Kernel加载与执行.md | ||
| 146 | + | ||
| 147 | +### 问题 7:框架集成类回复无指导(Issue #572) | ||
| 148 | + | ||
| 149 | +**现象**:vLLM KV Cache问题是L2级框架集成类问题,初始L2模板只输出分析摘要,没有列出Runtime已有的相关能力 | ||
| 150 | + | ||
| 151 | +**根因**:L2模板设计为"仅分析摘要不生成回复",但框架集成类问题用户需要知道Runtime能提供什么 | ||
| 152 | + | ||
| 153 | +**解决**:SKILL.md步骤6 L2场景补充"如果是框架集成类,列出Runtime能力说明";reply-templates.md新增L2框架集成模板 | ||
| 154 | + | ||
| 155 | +### 问题 8:编译时vs运行时参数区分无指导(Issue #624) | ||
| 156 | + | ||
| 157 | +**现象**:ATC --aicore-num是编译阶段参数,rtKernelLaunch的numBlocks是运行时参数,两者关系需要澄清 | ||
| 158 | + | ||
| 159 | +**根因**:issue-classifier.md没有"编译时vs运行时参数区分"这一分类模式 | ||
| 160 | + | ||
| 161 | +**解决**:issue-classifier.md新增L1典型场景"编译时与运行时参数区分" | ||
| 162 | + | ||
| 163 | +### 问题 9:源码验证缺失(Issue #643、#647、#645)【Phase 1 新增】 | ||
| 164 | + | ||
| 165 | +**现象**:issue提到具体代码文件和函数时,skill没有自动读取源码验证的步骤,只能给出"建议验证方向" | ||
| 166 | + | ||
| 167 | +**根因**:SKILL.md 流程中没有"源码自动验证"步骤,L2 回复模板只有"技术分析+假设+建议验证方向" | ||
| 168 | + | ||
| 169 | +**实测验证结果**: | ||
| 170 | +- Issue #643:两个具体 claim ❌ 不准确(RET_CODE 不影响 NULL 检查、unlikely() 不消除分支),但 broader concern ⚠️ 部分成立(15+ double-pointer output params 无 NULL check) | ||
| 171 | +- Issue #647:`memcpy_s destMax==count` ✅ 确认高危风险(DSA args packing `api_impl.cc:2857-2899`) | ||
| 172 | +- Issue #645:`TprtDeviceRead/Write` ❌ 不存在,但核心 UAF 风险 ✅ 成立(`GetDeviceByDevId` 返回裸指针后释放 mutex 锁) | ||
| 173 | + | ||
| 174 | +**解决**:SKILL.md 新增步骤 4a"源码自动验证";L2 模板改为"源码验证结果+结论+后续行动";tool-guide.md 新增验证工具优先级 | ||
| 175 | + | ||
| 176 | +### 问题 10:FAQ 关键词匹配局限(Issue #647、#645)【Phase 1 新增】 | ||
| 177 | + | ||
| 178 | +**现象**:issue 描述"buffer offset overflow"时关键词表无法命中内存安全类 FAQ | ||
| 179 | + | ||
| 180 | +**根因**:faq-matcher.md 是静态关键词表,无法理解用户语义意图(如"buffer overflow"→内存安全→内存管理FAQ) | ||
| 181 | + | ||
| 182 | +**解决**:新增 `faq-semantic-map.md` 语义意图映射表;SKILL.md 步骤4 增加"语义意图匹配"第二层 | ||
| 183 | + | ||
| 184 | +### 问题 11:L2 回复太空泛(Issue #643、#647)【Phase 1 新增】 | ||
| 185 | + | ||
| 186 | +**现象**:L2 模板只输出"建议验证方向",没有实际验证结果和结论 | ||
| 187 | + | ||
| 188 | +**根因**:L2 模板结构是"问题概述+技术分析+假设+建议验证方向",没有源码验证结论环节 | ||
| 189 | + | ||
| 190 | +**解决**:reply-templates.md L2 模板重构为"问题概述+源码验证结果(✅/❌/⚠️)+结论+后续行动" | ||
| 191 | + | ||
| 192 | +### 问题 12:assignee 约束未验证(Issue #628)【Phase 1 新增】 | ||
| 193 | + | ||
| 194 | +**现象**:skill 有"只回复 assignee 为空的 issue"约束,但未经实际测试 | ||
| 195 | + | ||
| 196 | +**根因**:所有之前测试的 issue 都没有 assignee | ||
| 197 | + | ||
| 198 | +**验证**:Issue #628 assignee 非空 → 流程正确中止,约束有效 | ||
| 199 | + | ||
| 200 | +### 问题 13:issue 识别出真实 bug 应提交修复 PR(Issue #645)【Phase 1 新增】 | ||
| 201 | + | ||
| 202 | +**现象**:skill 分析完 issue 后只生成回复草稿,不提交修复代码 | ||
| 203 | + | ||
| 204 | +**根因**:skill 设计为"回复助手",没有"识别 bug → 提交 fix PR"的路径 | ||
| 205 | + | ||
| 206 | +**解决**:用户确认 skill 应在发现真实 bug 时提交 fix PR。Issue #645 的 UAF 风险 → 提交 PR #2982(TPRT use-after-free 修复)。测试阶段 PR 不关联 issue,生产阶段 PR 关联 issue | ||
| 207 | + | ||
| 208 | +### 问题 14:decorator/error 层 NULL 保护审计(Issue #643)【Phase 1 新增】 | ||
| 209 | + | ||
| 210 | +**现象**:Issue #643 只分析了 ACL 层的 NULL 保护,没有检查 decorator 和 error 层 | ||
| 211 | + | ||
| 212 | +**根因**:skill 没有多层保护审计的指导 | ||
| 213 | + | ||
| 214 | +**审计结果**: | ||
| 215 | +- **Error 层 (ApiErrorDecorator)**:大部分 double-pointer params 有 `NULL_PTR_RETURN_MSG_OUTER` 保护 ✅ | ||
| 216 | +- **Decorator 层 (ApiDecorator/ApiProfileDecorator)**:纯委托,无 NULL 检查 | ||
| 217 | +- **剩余 gap**:`HostMallocWithCfg(void **hostPtr)` 和 `BuffAlloc(void **buff)` 无 NULL 检查 → 已提交修复 PR #2983 | ||
| 218 | + | ||
| 219 | +## 8. 解决点汇总 | ||
| 220 | + | ||
| 221 | +| 问题 | 解决方式 | 涉及文件 | | ||
| 222 | +|------|---------|---------| | ||
| 223 | +| 错误码与API不匹配 | SKILL.md 步骤3"错误码校验" | SKILL.md, reply-templates.md | | ||
| 224 | +| plog描述不当 | 所有"Device侧异常"改为"定位异常" | SKILL.md, reply-templates.md, log-analyzer.md | | ||
| 225 | +| 首报错分析缺失 | log-analyzer.md 新增首报错分析流程 | log-analyzer.md, reply-templates.md | | ||
| 226 | +| slog/plog混淆 | log-analyzer.md 新增slog vs plog区分章节 | log-analyzer.md | | ||
| 227 | +| 已有评论审查缺失 | SKILL.md 新增步骤5"已有评论审查" | SKILL.md | | ||
| 228 | +| FAQ映射缺失 | faq-matcher.md 补充5个映射 | faq-matcher.md | | ||
| 229 | +| 框架集成类无指导 | reply-templates.md 新增L2框架集成模板 | SKILL.md, reply-templates.md | | ||
| 230 | +| 编译时vs运行时无指导 | issue-classifier.md 新增L1典型场景 | issue-classifier.md | | ||
| 231 | +| 源码验证缺失【Phase 1】 | SKILL.md 新增步骤4a"源码自动验证" | SKILL.md, tool-guide.md | | ||
| 232 | +| FAQ关键词匹配局限【Phase 1】 | 新增 faq-semantic-map.md 语义意图映射 | faq-semantic-map.md | | ||
| 233 | +| L2回复太空泛【Phase 1】 | L2模板重构为"验证结果+结论+后续行动" | reply-templates.md | | ||
| 234 | +| assignee约束验证【Phase 1】 | Issue #628 测试确认约束有效 | SKILL.md | | ||
| 235 | +| bug应提交fix PR【Phase 1】 | Issue #645 → PR #2982 | 工作流扩展 | | ||
| 236 | +| decorator/error层审计【Phase 1】 | Issue #643 完整3层审计 → PR #2983 | 审计能力扩展 | | ||
| 237 | + | ||
| 238 | +## 9. 优化点 | ||
| 239 | + | ||
| 240 | +### 已实施优化 | ||
| 241 | + | ||
| 242 | +1. **错误码校验步骤**(高优先级):验证错误码与声称API一致性,避免误导性回复 | ||
| 243 | +2. **已有评论审查步骤**(高优先级):检查维护者已有回复,补充而非重复 | ||
| 244 | +3. **slog vs plog区分**(高优先级):明确kernel/block信息在slog而非plog中 | ||
| 245 | +4. **首报错分析流程**(高优先级):先查ERROR首报错来源模块再定向分析 | ||
| 246 | +5. **plog描述修正**(中优先级):"定位异常"而非"定位Device侧异常" | ||
| 247 | +6. **FAQ映射扩充**(中优先级):5个缺失映射补充 | ||
| 248 | +7. **框架集成L2模板**(中优先级):列出Runtime能力+请求补充信息 | ||
| 249 | +8. **编译时vs运行时分类**(低优先级):issue-classifier.md新增典型场景 | ||
| 250 | +9. **源码自动验证步骤**(高优先级)【Phase 1】:issue提到代码时,用codegraph+grep自动读取验证,输出✅/❌/⚠️结论而非"建议验证" | ||
| 251 | +10. **FAQ语义意图匹配**(中优先级)【Phase 1】:关键词无命中时,语义意图映射到FAQ主题(faq-semantic-map.md) | ||
| 252 | +11. **L2回复结构强化**(高优先级)【Phase 1】:必须包含源码验证结果和具体结论,模板改为"问题→验证→结论→后续行动" | ||
| 253 | +12. **assignee约束验证**(低优先级)【Phase 1】:#628测试确认"assignee非空则中止"约束有效 | ||
| 254 | +13. **bug→fix PR路径**(高优先级)【Phase 1】:skill发现真实bug时应提交修复PR(#645→PR #2982) | ||
| 255 | +14. **多层保护审计**(高优先级)【Phase 1】:ACL+Error+Decorator三层全覆盖审计(#643→PR #2983) | ||
| 256 | + | ||
| 257 | +### 未来可优化方向 | ||
| 258 | + | ||
| 259 | +1. **通知服务集成**:L2场景自动通过wlink/邮箱通知模块负责人(当前仅输出通知模板) | ||
| 260 | +2. **L0全自动回复**:等机器人框架就绪后,L0级别无需人工确认直接提交 | ||
| 261 | +3. **RAG知识库**【Phase 2】:FAQ+历史issue向量索引,语义检索替代LLM语义匹配(rag-config.md 已占位) | ||
| 262 | +4. **回复质量自动评估**:提交后自动检查文档链接是否有效、错误码引用是否准确 | ||
| 263 | +5. **Issue历史关联**:自动搜索仓库中是否已有类似Issue及其回复,复用经验 | ||
| 264 | + | ||
| 265 | +## 10. 测试结果汇总 | ||
| 266 | + | ||
| 267 | +### 各检查项通过率 | ||
| 268 | + | ||
| 269 | +| 检查项 | 初始评测 | 真实Issue测试 | Phase 1验证后 | | ||
| 270 | +|--------|---------|-------------|-------------| | ||
| 271 | +| 分级准确性 | ✅ | ✅ | ✅ | | ||
| 272 | +| 错误码校验 | ❌(缺失) | ✅(#609触发) | ✅ | | ||
| 273 | +| FAQ匹配完整性 | ⚠️(缺失5个映射) | ✅(补充后) | ✅(+语义匹配) | | ||
| 274 | +| plog/slog区分 | ❌(混淆) | ✅(#624触发) | ✅ | | ||
| 275 | +| 首报错分析流程 | ❌(缺失) | ✅(#609触发) | ✅ | | ||
| 276 | +| 已有评论审查 | ❌(缺失) | ✅(#571/#607触发) | ✅ | | ||
| 277 | +| 源码自动验证 | ❌(缺失) | ❌(缺失) | ✅(Phase 1新增) | | ||
| 278 | +| L2回复具体结论 | ❌(只有建议方向) | ❌ | ✅(Phase 1强化) | | ||
| 279 | +| assignee约束 | ✅(有规则) | ✅(有规则) | ✅(#628实测) | | ||
| 280 | +| 回复格式一致性 | ✅ | ✅ | ✅ | | ||
| 281 | +| 用户确认流程 | ✅ | ✅ | ✅ | | ||
| 282 | +| 提交前禁止行为 | ✅ | ✅ | ✅ | | ||
| 283 | + | ||
| 284 | +### 覆盖度演进 | ||
| 285 | + | ||
| 286 | +| 评测维度 | 初版 | 真实Issue测试后 | Phase 1验证后 | | ||
| 287 | +|---------|------|----------------|-------------| | ||
| 288 | +| L0 简单FAQ | 90% | 95% | 95% | | ||
| 289 | +| L1 错误码+日志 | 70% | 90% | 95% | | ||
| 290 | +| L1 硬件概念澄清 | 60% | 85% | 95% | | ||
| 291 | +| L1 编译时vs运行时 | 60% | 85% | 95% | | ||
| 292 | +| L2 框架集成 | 50% | 85% | 95% | | ||
| 293 | +| L2 复杂分析 | 80% | 90% | 95% | | ||
| 294 | +| L2 源码验证结论 | 0%(缺失) | 0%(缺失) | 95%(Phase 1新增) | | ||
| 295 | +| **综合 skill 质量** | **70%** | **85%** | **95%** | | ||
| 296 | + | ||
| 297 | +### 各测试issue回复情况 | ||
| 298 | + | ||
| 299 | +| Issue | 分类 | 回复状态 | 核心改进触发 | | ||
| 300 | +|-------|------|---------|-------------| | ||
| 301 | +| #551 | L0 | 草稿生成,未提交 | 无(正常) | | ||
| 302 | +| #578 | L2 | 荗稿生成,未提交 | 无(正常) | | ||
| 303 | +| #624 | L1 | 草稿生成,已正式提交 | slog/plog区分、编译时vs运行时 | | ||
| 304 | +| #609 | L1 | 荗稿修改3轮,已正式提交 | 错误码校验、plog描述、首报错 | | ||
| 305 | +| #571 | L1 | 荗稿生成,未提交 | 大页/小页映射、aclrtGetMemInfo | | ||
| 306 | +| #572 | L2 | 荗稿生成,未提交 | 框架集成模板、SOMA/Allocator | | ||
| 307 | +| #607 | L1 | 荗稿生成,已正式提交 | 核资源控制映射、硬件概念澄清 | | ||
| 308 | +| #628 | L0 | assignee非空,流程中止 | assignee约束实测验证 | | ||
| 309 | +| #643 | L2 | 源码验证草稿,未提交 | 源码自动验证、decorator/error层审计 | | ||
| 310 | +| #647 | L1 | 源码验证草稿,未提交 | 源码自动验证(destMax==count确认) | | ||
| 311 | +| #645 | L1 | 源码验证草稿,未提交 → 修复PR #2982 | 源码验证(API名不存在但UAF确认) | | ||
| 312 | + | ||
| 313 | +**Phase 1 产出的修复 PR**: | ||
| 314 | +- PR #2982:TPRT设备关闭后use-after-free风险修复(Issue #645) | ||
| 315 | +- PR #2983:ApiErrorDecorator补齐HostMallocWithCfg和BuffAlloc的double-pointer NULL校验(Issue #643审计发现) | ||
| 316 | + | ||
| 317 | +## 11. 设计亮点与工具 | ||
| 318 | + | ||
| 319 | +### 设计亮点 | ||
| 320 | + | ||
| 321 | +1. **错误码校验步骤**:验证错误码与用户声称的API是否一致,避免误导(基于#609真实教训) | ||
| 322 | +2. **已有评论审查**:补充而非重复维护者回答,尊重现有回复(基于#571/#607真实教训) | ||
| 323 | +3. **slog vs plog区分**:明确kernel下发信息在Host侧slog而非Device侧plog(基于#624真实教训) | ||
| 324 | +4. **首报错分析流程**:先定位ERROR首报错来源模块再定向分析(基于#609用户反馈) | ||
| 325 | +5. **分级策略**:L0/L1/L2三级清晰,每级有对应模板和检查项 | ||
| 326 | +6. **提交前强制确认**:绝不擅自提交,尊重用户决策 | ||
| 327 | +7. **自动化演进预留**:L0级别设计为"生成但需确认",等机器人框架就绪后可无缝升级为全自动 | ||
| 328 | +8. **源码自动验证**:issue提到代码时自动读取验证,输出✅/❌/⚠️结论而非"建议验证方向"(Phase 1 新增) | ||
| 329 | +9. **bug→fix PR路径**:skill发现真实bug时不仅回复issue,还提交修复PR(Phase 1 新增,基于#645→PR #2982) | ||
| 330 | +10. **多层保护审计**:ACL+Error+Decorator三层全覆盖审计,不只看单层(Phase 1 新增,基于#643→PR #2983) | ||
| 331 | + | ||
| 332 | +### 工具使用 | ||
| 333 | + | ||
| 334 | +| 工具 | 用途 | 效果 | | ||
| 335 | +|------|------|------| | ||
| 336 | +| gitcode-issue skill | 读取issue详情和评论 | 避免重复已有回复,获取完整上下文 | | ||
| 337 | +| CodeGraph MCP | 探索代码符号、调用路径、模块关系 | 快速定位API实现、错误码定义、模块归属 | | ||
| 338 | +| Task subagent | 并行探索多个信息源 | 同时搜索FAQ、API参考、源码实现 | | ||
| 339 | +| gitcode-pr skill | 提交issue评论(通过API) | 自动化提交,避免手动复制粘贴 | | ||
| 340 | +| skill-creator | 指导skill开发全流程 | 标准化创建、评测、迭代方法论 | | ||
| 341 | +| Interactive question | 与用户逐步确认分级策略、回复内容 | 多选项快速确认,避免盲目提交 | | ||
| 342 | + | ||
| 343 | +## 12. 分类模式对比 | ||
| 344 | + | ||
| 345 | +| 维度 | L0 | L1 | L2 | | ||
| 346 | +|------|----|----|-----| | ||
| 347 | +| 典型场景 | FAQ匹配、文档问题 | 有错误码/日志、硬件概念澄清 | 框架集成、需实验验证 | | ||
| 348 | +| 回复内容 | 完整回复 | 错误码澄清 + FAQ + 排查步骤 | 源码验证结果 + 结论 + 后续行动 | | ||
| 349 | +| 错误码校验 | 不涉及 | 强制执行 | 不涉及 | | ||
| 350 | +| 源码自动验证 | 不涉及 | 步骤4a触发 | 步骤4a强制执行 | | ||
| 351 | +| plog/slog指导 | 不涉及 | 提供首报错分析流程 | 不涉及 | | ||
| 352 | +| 已有评论审查 | 补充文档链接 | 补充操作步骤和文档 | 补充Runtime能力 | | ||
| 353 | +| 提交方式 | 确认后提交评论 | 确认后提交评论 | 仅草稿+通知模板 | | ||
| 354 | +| 自动化演进 | 后续可全自动 | 后续可半自动 | 后续仅通知 | | ||
| 355 | + | ||
| 356 | +## 13. 结论 | ||
| 357 | + | ||
| 358 | +`issue-response` skill 经12轮测试(3轮初始+5轮真实Issue+4轮Phase 1验证),从初版70%覆盖度提升至95%,14个测试中发现的问题均已解决并纳入 skill 文件。Skill 现可覆盖简单FAQ、错误码+日志、硬件概念澄清、编译时vs运行时参数、框架集成、复杂分析+源码验证六种典型场景,对 CANN Runtime GitCode Issue 的回复效率和质量有显著提升。 | ||
| 359 | + | ||
| 360 | +关键价值: | ||
| 361 | +- **分级标准化**:L0/L1/L2三级+对应模板,回复格式和质量一致 | ||
| 362 | +- **错误码校验**:避免错误码与API不匹配导致的误导性回复 | ||
| 363 | +- **已有评论尊重**:补充而非重复,尊重维护者已有回答 | ||
| 364 | +- **日志分析规范**:slog/plog区分、首报错分析流程,避免定位方向错误 | ||
| 365 | +- **源码自动验证**【Phase 1】:issue提到代码时,自动读取验证,输出✅/❌/⚠️结论而非"建议验证" | ||
| 366 | +- **bug→fix PR**【Phase 1】:skill发现真实bug时不仅回复issue,还提交修复PR | ||
| 367 | +- **RAG演进预留**【Phase 1】:rag-config.md占位,等Phase 2搭建向量索引后无缝接入 | ||
| 368 | +- **自动化演进预留**:分级策略+通知模板+FAQ匹配机制,为后续机器人框架预留接口 | ||
| 369 | + | ||
| 370 | +3个Issue已正式提交评论(#609、#607、#624),2个修复PR已提交(#2982、#2983),其余草稿已生成待用户后续确认提交。 | ||
| @@ -0,0 +1,202 @@ | |||
| 1 | +--- | ||
| 2 | +name: issue-response | ||
| 3 | +description: 用于 CANN Runtime 仓库的 GitCode Issue 自动回复助手。支持 L0(简单FAQ)、L1(有日志的初版回复)、L2(复杂问题仅分析通知)三级回复策略。当用户要求回复 issue、处理 GitCode issue、查看 issue 并回复、分析 issue、issue 回复、issue 评论,或提到 "回复issue"、"处理issue"、"issue响应"、"issue-response" 时触发。也适用于 "看看这个issue"、"帮我回复issue"、"issue怎么回"、"issue #xxx" 等场景。 | ||
| 4 | +--- | ||
| 5 | + | ||
| 6 | +# Skill: Issue Response - GitCode Issue 回复助手 | ||
| 7 | + | ||
| 8 | +## 核心定位 | ||
| 9 | + | ||
| 10 | +对 CANN Runtime 仓库的 GitCode Issue 进行分级回复,从分析到生成回复草稿,**提交前必须与用户确认**,绝不擅自提交。 | ||
| 11 | + | ||
| 12 | +## 关键约束 | ||
| 13 | + | ||
| 14 | +- **文档链接格式**:回复中所有文档链接必须使用绝对URL(`https://gitcode.com/cann/runtime/blob/master/docs/...`),因为 GitCode issue 评论不支持相对路径解析。 | ||
| 15 | +- **只回复外部社区 issue**:仅对**未指派负责人(assignee 为空)**的 issue 生成回复。内部开发者自己创建并指派给自己的 issue 不需要自动回复,他们已具备内部沟通渠道。 | ||
| 16 | + | ||
| 17 | +## 回复分级策略 | ||
| 18 | + | ||
| 19 | +| 等级 | 适用场景 | 回复方式 | 是否需确认 | | ||
| 20 | +|------|----------|----------|-----------| | ||
| 21 | +| L0 | 简单FAQ类(安装、配置、环境变量) | 匹配 docs/04_FAQ/ 生成完整回复 | 需确认后再提交 | | ||
| 22 | +| L1 | 有日志/报错(ACL_ERROR_xx、运行失败)、硬件概念澄清、编译时vs运行时参数区分 | 匹配FAQ + 错误码校验 + 日志分析,生成初版回复 | 需确认后再提交 | | ||
| 23 | +| L2 | 复杂/需实验(性能异常、内存机制、框架集成) | 仅生成分析摘要 + Runtime 能力说明 | 仅摘要 + 通知建议 | | ||
| 24 | + | ||
| 25 | +## 核心工作流程 | ||
| 26 | + | ||
| 27 | +### 步骤 1:读取 Issue 详情和评论 | ||
| 28 | + | ||
| 29 | +使用 gitcode-issue skill 读取 issue **详情和所有评论**,提取: | ||
| 30 | + | ||
| 31 | +- Issue 编号和标题 | ||
| 32 | +- 问题描述和现象 | ||
| 33 | +- 环境信息(CANN版本、硬件、OS) | ||
| 34 | +- 错误日志或堆栈 | ||
| 35 | +- Issue 标签 | ||
| 36 | +- **已有评论**(维护者是否已回复、用户追问内容)— 避免重复已有回复 | ||
| 37 | +- **指派负责人(assignee)**— 有指派则中止流程(内部开发者 issue,不需回复) | ||
| 38 | + | ||
| 39 | +### 步骤 2:分类判定(L0/L1/L2) | ||
| 40 | + | ||
| 41 | +读取 `references/issue-classifier.md` 按标准判定回复等级。 | ||
| 42 | + | ||
| 43 | +关键判断维度: | ||
| 44 | + | ||
| 45 | +1. **能否直接匹配 FAQ**:能 → L0 | ||
| 46 | +2. **是否有日志/错误码**:有 → L1 或更高 | ||
| 47 | +3. **是否涉及硬件概念澄清**(AIC/AIV、编译时/运行时参数)→ L1 | ||
| 48 | +4. **是否涉及框架集成**(vLLM、PyTorch 等)→ L2 | ||
| 49 | +5. **是否需要实验/深入源码分析**:需要 → L2 | ||
| 50 | + | ||
| 51 | +### 步骤 3:错误码校验(仅当 issue 包含错误码时) | ||
| 52 | + | ||
| 53 | +验证用户声称的错误码与其描述的 API/场景是否一致: | ||
| 54 | + | ||
| 55 | +1. 查阅 `references/log-analyzer.md` 中错误码含义表,确认错误码的实际定义 | ||
| 56 | +2. 对比用户描述的失败 API 与错误码的实际含义: | ||
| 57 | + - 例:用户说 "aclrtMalloc 返回 507011",但 507011 是 `ACL_ERROR_RT_MODEL_EXECUTE`(模型执行错误),并非 malloc 类错误 → 在回复中澄清此差异 | ||
| 58 | +3. 如果不一致,在回复中明确指出错误码的实际含义,避免误导 | ||
| 59 | + | ||
| 60 | +此步骤基于 Issue #609 的经验:用户误将模型执行错误码当作内存分配错误码,回复中必须澄清。 | ||
| 61 | + | ||
| 62 | +### 步骤 4:FAQ 匹配与信息收集 | ||
| 63 | + | ||
| 64 | +**第一层:关键词快速匹配** — 读取 `references/faq-matcher.md`,根据关键词从 `docs/04_FAQ/` 和 `docs/03_api_ref/` 精确匹配相关文档。 | ||
| 65 | + | ||
| 66 | +**第二层:语义意图匹配** — 当关键词无命中时,读取 `references/faq-semantic-map.md`,理解 issue 语义意图映射到 FAQ 主题分类。例如: | ||
| 67 | +- 用户描述"内存申请返回错误"但未提到aclrtMalloc → 语义意图=内存分配 → 映射到内存管理FAQ | ||
| 68 | +- 用户描述"程序跑着越来越慢" → 语义意图=性能衰减 → 映射到性能调优FAQ | ||
| 69 | + | ||
| 70 | +L1 场景额外读取 `references/log-analyzer.md`,分析错误码和日志模式。 | ||
| 71 | + | ||
| 72 | +**工具使用建议**: | ||
| 73 | + | ||
| 74 | +- 使用 gitcode-issue skill 读取 issue 详情和评论 | ||
| 75 | +- 使用 CodeGraph MCP(codegraph_explore / codegraph_node)快速探索代码符号、调用路径 | ||
| 76 | +- 使用 Task subagent 并行探索多个信息源(FAQ、API参考、源码实现) | ||
| 77 | +- 参考 `references/tool-guide.md` 了解各工具的使用时机 | ||
| 78 | + | ||
| 79 | +### 步骤 4a:源码自动验证(当 issue 包含代码引用时) | ||
| 80 | + | ||
| 81 | +**触发条件**:issue 内容出现以下信号时执行此步骤: | ||
| 82 | +- 提到具体文件路径(`.h`, `.cc`, `.cpp`, `.hpp`) | ||
| 83 | +- 提到具体函数名、类名、宏名 | ||
| 84 | +- 提到代码片段或"在 xxx 中" | ||
| 85 | + | ||
| 86 | +**执行流程**: | ||
| 87 | + | ||
| 88 | +1. **提取代码引用** — 从 issue 描述中提取文件路径和符号名 | ||
| 89 | +2. **自动验证** — 使用 `codegraph_explore` 查找符号定义和调用链;使用 `codegraph_node` 读取文件源码;使用 `grep` 补充搜索。**必须实际读取源码,不能仅凭 issue 描述推断** | ||
| 90 | +3. **生成验证结论** — 输出具体事实而非"建议验证": | ||
| 91 | + - ✅ **确认有效**:issue claim 与源码一致,附具体行号和代码证据 | ||
| 92 | + - ❌ **不准确**:issue claim 与源码不符,附实际代码证据和正确解释 | ||
| 93 | + - ⚠️ **部分成立**:核心观点正确但细节有偏差,指出偏差部分 | ||
| 94 | +4. **注入回复** — 验证结论直接嵌入 L1/L2 回复模板,使用"客户问题 → 验证事实 → 结论"结构,让回复与客户问题之间的关联显式化 | ||
| 95 | + | ||
| 96 | +**实测经验**(基于4个 issue 验证结果): | ||
| 97 | +- Issue #643:两个具体 claim ❌ 不准确(RET_CODE 不影响 NULL 检查,unlikely() 不消除分支),但 broader concern ⚠️ 部分成立 | ||
| 98 | +- Issue #647:`destMax==count` ✅ 确认高危风险 | ||
| 99 | +- Issue #645:`TprtDeviceRead/Write` ❌ 不存在,但核心 UAF 风险 ✅ 成立 | ||
| 100 | + | ||
| 101 | +### 步骤 5:已有评论审查 | ||
| 102 | + | ||
| 103 | +**关键步骤**:检查已有评论,避免重复维护者已回复的内容。如果维护者已回答核心问题: | ||
| 104 | + | ||
| 105 | +- 补充维护者回答中缺失的**具体操作步骤**(如 plog 收集方法、aclrtGetMemInfo 用法) | ||
| 106 | +- 补充维护者回答中未涉及的**相关 FAQ 和文档链接** | ||
| 107 | +- 不要重复维护者已说明的结论 | ||
| 108 | + | ||
| 109 | +此步骤基于 Issue #571(ykl999 已说明大页/小页分离)和 Issue #607(wangtao43 已说明 Runtime 不约束 blockDim)的经验。 | ||
| 110 | + | ||
| 111 | +### 步骤 6:生成回复草稿 | ||
| 112 | + | ||
| 113 | +读取 `references/reply-templates.md`,按等级使用对应模板生成回复。 | ||
| 114 | + | ||
| 115 | +- L0:基于 FAQ 的完整回复 | ||
| 116 | +- L1:FAQ + 错误码校验澄清 + 日志分析初版回复;plog 部分写"定位异常"而非"定位Device侧异常"(因为也可能是Host侧异常);文档链接使用绝对URL | ||
| 117 | +- L2:**必须包含源码验证结果和具体结论**,而非仅"建议验证方向";如果是框架集成类,列出 Runtime 能力说明(SOMA 内存池、自定义 Allocator 等)+ 请求补充信息 | ||
| 118 | + | ||
| 119 | +### 步骤 7:回复自验证(链接可达性校验) | ||
| 120 | + | ||
| 121 | +**强制步骤**:生成回复草稿后,必须对所有文档链接进行可达性校验,确保每个链接指向的文件在主仓(origin/master)上真实存在。 | ||
| 122 | + | ||
| 123 | +校验方法: | ||
| 124 | + | ||
| 125 | +1. 从草稿中提取所有 `https://gitcode.com/cann/runtime/blob/master/docs/...` 链接 | ||
| 126 | +2. 对每个链接中的文件路径,使用 `git ls-tree origin/master <文件路径>` 或 `git show origin/master:<文件路径>` 验证文件存在 | ||
| 127 | +3. 如果文件不存在,必须: | ||
| 128 | + - 在主仓 `docs/` 中搜索实际存在的最相关文档替代 | ||
| 129 | + - 更新链接为正确的文件路径 | ||
| 130 | + - 如果找不到替代文档,移除该链接并注明"暂无对应文档" | ||
| 131 | + | ||
| 132 | +校验示例: | ||
| 133 | + | ||
| 134 | +```bash | ||
| 135 | +# 验证单个文件是否存在于主仓 | ||
| 136 | +git show origin/master:docs/04_FAQ/如何通过plog日志定位Device侧异常.md | head -1 | ||
| 137 | +# 如果输出内容 → 文件存在,链接有效 | ||
| 138 | +# 如果输出 "fatal: path not found" → 文件不存在,需修正 | ||
| 139 | + | ||
| 140 | +# 批量验证草稿中所有链接 | ||
| 141 | +for path in docs/04_FAQ/aclrtMalloc内存申请失败常见原因.md docs/03_api_ref/11_内存管理.md; do | ||
| 142 | + git show origin/master:"$path" > /dev/null 2>&1 && echo "OK: $path" || echo "FAIL: $path" | ||
| 143 | +done | ||
| 144 | +``` | ||
| 145 | + | ||
| 146 | +此步骤基于 Issue #609 的教训:skill 中引用的 plog FAQ 文件名(`如何通过plog日志定位异常.md`)与主仓真实文件名(`如何通过plog日志定位Device侧异常.md`)不一致,导致所有提交的评论中链接不可达。 | ||
| 147 | + | ||
| 148 | +### 步骤 8:与用户确认 | ||
| 149 | + | ||
| 150 | +**强制约束**:将生成的回复草稿展示给用户,等待用户确认后再决定是否提交。 | ||
| 151 | + | ||
| 152 | +确认选项: | ||
| 153 | + | ||
| 154 | +1. 确认提交 — 使用 gitcode-pr skill(通过 GitCode API 提交 issue 评论) | ||
| 155 | +2. 需修改 — 根据用户反馈调整后重新展示 | ||
| 156 | +3. 不提交 — 仅保留草稿供后续参考 | ||
| 157 | + | ||
| 158 | +**禁止行为**: | ||
| 159 | + | ||
| 160 | +- 绝不擅自提交回复到 GitCode Issue | ||
| 161 | +- 绝不在用户未确认的情况下执行任何 API 写操作 | ||
| 162 | + | ||
| 163 | +## 通知建议(L2 场景) | ||
| 164 | + | ||
| 165 | +L2 级别的复杂 issue,除了生成分析摘要,还应输出通知信息: | ||
| 166 | + | ||
| 167 | +- 模块归属(参考 classify_rule.yaml) | ||
| 168 | +- 建议通知的负责人 | ||
| 169 | +- 通知内容模板(供后续通知服务使用) | ||
| 170 | + | ||
| 171 | +通知服务本身不在 skill 内实现,后续独立建设。 | ||
| 172 | + | ||
| 173 | +## 文件结构 | ||
| 174 | + | ||
| 175 | +``` | ||
| 176 | +.claude/skills/issue-response/ | ||
| 177 | +├── SKILL.md | ||
| 178 | +├── evals/evals.json # 测试用例 | ||
| 179 | +└── references/ | ||
| 180 | + ├── issue-classifier.md # L0/L1/L2 分类标准 | ||
| 181 | + ├── reply-templates.md # 分级回复模板 | ||
| 182 | + ├── faq-matcher.md # 关键词 + docs/ 目录映射 | ||
| 183 | + ├── faq-semantic-map.md # 语义意图 → FAQ 目录映射(关键词无命中时使用) | ||
| 184 | + ├── log-analyzer.md # 错误码与日志分析(含 slog vs plog) | ||
| 185 | + ├── real-case-study.md # 真实案例参考(5个已验证issue) | ||
| 186 | + ├── tool-guide.md # 工具使用指南(CodeGraph、gitcode-issue等) | ||
| 187 | + └── rag-config.md # RAG 配置(Phase 2 占位) | ||
| 188 | +``` | ||
| 189 | + | ||
| 190 | +## 参考资源 | ||
| 191 | + | ||
| 192 | +- **分类标准**:`references/issue-classifier.md` | ||
| 193 | +- **回复模板**:`references/reply-templates.md` | ||
| 194 | +- **FAQ匹配**:`references/faq-matcher.md`(关键词快速通道) | ||
| 195 | +- **FAQ语义匹配**:`references/faq-semantic-map.md`(语义意图映射) | ||
| 196 | +- **日志分析**:`references/log-analyzer.md` | ||
| 197 | +- **真实案例**:`references/real-case-study.md` | ||
| 198 | +- **工具指南**:`references/tool-guide.md` | ||
| 199 | +- **RAG配置**:`references/rag-config.md`(Phase 2 占位) | ||
| 200 | +- **仓库FAQ**:`docs/04_FAQ/`(16个专业FAQ文档) | ||
| 201 | +- **API参考**:`docs/03_api_ref/`(26个章节) | ||
| 202 | +- **模块归属**:`classify_rule.yaml` | ||
| @@ -0,0 +1,23 @@ | |||
| 1 | +{ | ||
| 2 | + "skill_name": "issue-response", | ||
| 3 | + "evals": [ | ||
| 4 | + { | ||
| 5 | + "id": 1, | ||
| 6 | + "prompt": "帮我回复 GitCode 上的 issue #551,这是一个文档链接跳转问题,用户说 example 目录 README 中链接无法跳转", | ||
| 7 | + "expected_output": "L0 级别回复:确认文档链接问题,说明修复计划或已知原因,感谢反馈。回复格式应遵循 L0 模板。", | ||
| 8 | + "files": [] | ||
| 9 | + }, | ||
| 10 | + { | ||
| 11 | + "id": 2, | ||
| 12 | + "prompt": "帮我分析并回复 issue #609,用户报告升级 CANN 8.0 RC2 后 aclrtMalloc 返回 507011 内存分配失败", | ||
| 13 | + "expected_output": "L1 级别回复:分析错误码 507011,匹配 FAQ 文档(aclrtMalloc内存申请失败常见原因、版本不匹配),生成包含技术解释、解决建议、环境检查的初版回复。提交前需与用户确认。", | ||
| 14 | + "files": [] | ||
| 15 | + }, | ||
| 16 | + { | ||
| 17 | + "id": 3, | ||
| 18 | + "prompt": "帮我分析 issue #578,用户报告批量推理长时间运行后性能衰减、偶发OOM,怀疑GM内存碎片堆积", | ||
| 19 | + "expected_output": "L2 级别分析摘要:仅输出技术分析、假设、建议验证方向、相关文档链接、模块归属(rts),不生成完整回复。包含通知建议。", | ||
| 20 | + "files": [] | ||
| 21 | + } | ||
| 22 | + ] | ||
| 23 | +} | ||
| @@ -0,0 +1,176 @@ | |||
| 1 | +# FAQ 匹配机制 - 关键词与 docs/ 目录映射 | ||
| 2 | + | ||
| 3 | +## 匹配策略 | ||
| 4 | + | ||
| 5 | +采用"关键词 + 目录映射"机制:从 issue 中提取关键词,映射到 docs/ 中的对应文档,再从文档中提取解答内容。 | ||
| 6 | + | ||
| 7 | +匹配优先级: | ||
| 8 | + | ||
| 9 | +1. **优先匹配 `docs/04_FAQ/`** — 16个专业FAQ文档,覆盖最常见问题 | ||
| 10 | +2. **其次匹配 `docs/03_api_ref/`** — API参考文档,补充技术细节 | ||
| 11 | +3. **再匹配 `docs/02_dev_guide/`** — 开发指南,补充使用说明 | ||
| 12 | + | ||
| 13 | +## docs/04_FAQ/ 关键词映射表 | ||
| 14 | + | ||
| 15 | +| FAQ 文档 | 核心关键词 | 错误码匹配 | Issue 主题 | | ||
| 16 | +|----------|------------|------------|------------| | ||
| 17 | +| `aclInit初始化失败常见原因排查.md` | aclInit, 初始化, init, 配置文件, acl.json | 107000, 100001, 100002 | 初始化问题 | | ||
| 18 | +| `aclrtSetDevice调用失败.md` | aclrtSetDevice, setDevice, 设备, device, 卡号 | 107001, 200002 | Device 管理 | | ||
| 19 | +| `如何理解默认Device和默认Stream机制.md` | 默认Device, 默认Stream, default, 自动创建 | — | 基础概念 | | ||
| 20 | +| `Runtime版本与CANN版本不匹配导致的问题.md` | 版本, version, CANN版本, 版本不匹配, 兼容 | — | 版本兼容 | | ||
| 21 | +| `aclrtMalloc内存申请失败常见原因.md` | aclrtMalloc, malloc, 内存申请, 内存分配, OOM | 207001, 200000, 507018 | 内存分配 | | ||
| 22 | +| `aclrtMemcpyAsync在错误的Stream上下发失败.md` | memcpy, 数据复制, stream, 异步复制 | — | 数据传输 | | ||
| 23 | +| `如何选择合适的内存分配策略.md` | 内存策略, HUGE_FIRST, HUGE_ONLY, NORMAL_ONLY, 分配策略, 大页, 小页, 内存池 | — | 内存策略 | | ||
| 24 | +| *(补充映射)* 大页/小页分离 | aclrtGetMemInfo, ACL_MEM_HUGE, ACL_MEM_NORMAL, 内存充足但OOM, 剩余显存 | 207001 | 大页小页分离(#571) | | ||
| 25 | +| `Stream同步与Event同步的区别与选择.md` | 同步, synchronize, stream同步, event同步 | — | 同步机制 | | ||
| 26 | +| `多Device场景下Stream跨Device下发失败.md` | 多设备, 跨Device, P2P, multi-device | — | 多设备 | | ||
| 27 | +| `ACLGraph捕获过程中任务提交限制.md` | ACLGraph, 捕获, capture, 图捕获 | 107024-107032 | ACLGraph | | ||
| 28 | +| `进程间IPC内存共享的页表对齐要求.md` | IPC, 共享内存, 进程间, 页表对齐 | — | IPC | | ||
| 29 | +| `跨DeviceP2P数据交互配置失败.md` | P2P, 跨设备, 数据交互 | — | P2P | | ||
| 30 | +| `如何获取和解读Runtime异步错误码.md` | 错误码, error code, 异步错误, synchronize | 507xxx | 错误码解读 | | ||
| 31 | +| `算子执行输出全0的常见原因排查.md` | 输出全0, 算子执行, output zero, 全零 | — | 算子问题 | | ||
| 32 | +| `遇错即停模式下错误定位方法.md` | 遇错即停, 错误定位, stop-on-error | — | 错误定位 | | ||
| 33 | +| `如何通过plog日志定位Device侧异常.md` | plog, 日志, log, 异常, 定位 | 507014, 507015 | 日志分析 | | ||
| 34 | + | ||
| 35 | +## 补充映射:常见但未在 FAQ 文档中覆盖的场景 | ||
| 36 | + | ||
| 37 | +以下场景在 issue 中高频出现,但 FAQ 文档未单独覆盖,需从 API 参考文档和开发指南中补充: | ||
| 38 | + | ||
| 39 | +| 场景关键词 | 映射文档 | 说明 | | ||
| 40 | +|-----------|----------|------| | ||
| 41 | +| 大页/小页分离, 内存池分池, ACL_MEM_HUGE, ACL_MEM_NORMAL | `03_api_ref/11_内存管理.md` + `04_FAQ/如何选择合适的内存分配策略.md` | OOM 时 npu-smi 显示总内存充足,但实际是某一池(大页/小页)不足。用 aclrtGetMemInfo 分别查 ACL_MEM_HUGE 和 ACL_MEM_NORMAL | | ||
| 42 | +| 核资源控制, AIC/AIV, 算力核, resource limit | `02_dev_guide/08_运行时核资源控制.md` | AIC/AIV 算力核配置、aclrtSetDeviceResLimit、aclrtSetStreamResLimit | | ||
| 43 | +| 调度模式, schemMode, batch, 调度策略 | `03_api_ref/25_数据类型及其操作接口.md` | schemMode 数据类型定义(batch/sequence/pipeline等调度模式) | | ||
| 44 | +| SOMA, 内存池, 自定义内存管理, custom allocator | `03_api_ref/11-10_SOMA内存池.md` + `03_api_ref/11-08_Custom_Allocator.md` | SOMA 内存池管理和自定义 Allocator,适用于框架级自定义内存管理需求 | | ||
| 45 | +| aclrtGetHardwareSyncAddr, 硬件同步地址, sync addr | `03_api_ref/14_Kernel加载与执行.md` | Kernel 执行场景的硬件同步地址获取 | | ||
| 46 | + | ||
| 47 | +## docs/03_api_ref/ 关键词映射表 | ||
| 48 | + | ||
| 49 | +| API 参考文档 | 核心关键词 | 补充 FAQ 主题 | | ||
| 50 | +|-------------|------------|---------------| | ||
| 51 | +| `02_初始化与去初始化.md` | aclInit, aclFinalize | 初始化 | | ||
| 52 | +| `03_运行时配置.md` | 配置, config, aclrtSetConfigOpt | 配置 | | ||
| 53 | +| `04_Device管理.md` | device, aclrtSetDevice, aclrtGetDevice | Device | | ||
| 54 | +| `05_Context管理.md` | context, aclrtCreateContext | Context | | ||
| 55 | +| `06_Stream管理.md` | stream, aclrtCreateStream | Stream | | ||
| 56 | +| `07_Event管理.md` | event, aclrtCreateEvent | Event | | ||
| 57 | +| `08_Notify管理.md` | notify | Notify | | ||
| 58 | +| `11_内存管理.md`(含11个子章节) | malloc, free, memcpy, vmm, 内存, 内存池, SOMA | 内存 | | ||
| 59 | +| `11-10_Stream有序内存分配.md` | SOMA, 内存池, MemPool, aclrtMemPoolCreate, 复用 | 内存池 | | ||
| 60 | +| `11-08_自定义内存分配器.md` | 自定义Allocator, 自定义内存, Allocator, KV Cache | 自定义内存 | | ||
| 61 | +| `13_异常处理.md` | error, exception, 异常 | 异常处理 | | ||
| 62 | +| `14_Kernel加载与执行.md` | kernel, binary, launch | Kernel | | ||
| 63 | +| *(补充映射)* aclrtGetHardwareSyncAddr | Cube Core同步, Vector Core同步, AIC AIV同步, 硬件同步 | — | 硬件同步(#607) | | ||
| 64 | +| `15_模型运行实例管理.md` | model, RI, 模型 | 模型 | | ||
| 65 | +| `17_数据传输.md`(含3个子章节) | tdt, tensor, queue, buffer | 数据传输 | | ||
| 66 | +| `18_Dump配置.md` | dump, adump | Dump | | ||
| 67 | +| `19_Profiling数据采集.md`(含4个子章节) | profiling, msprof | Profiling | | ||
| 68 | +| `22_错误上报接口.md` | 错误上报, error report | 错误 | | ||
| 69 | +| `23_日志接口.md` | 日志, log, slog | 日志 | | ||
| 70 | +| `25_数据类型及其操作接口.md` | datatype, DataBuffer, aclError | 数据类型 | | ||
| 71 | + | ||
| 72 | +## docs/02_dev_guide/ 关键词映射表 | ||
| 73 | + | ||
| 74 | +| 开发指南文档 | 核心关键词 | 补充 FAQ 主题 | | ||
| 75 | +|-------------|------------|---------------| | ||
| 76 | +| `01_初始化.md` | 初始化, aclInit | 初始化 | | ||
| 77 | +| `02_内存管理.md` | 内存, malloc, 内存池 | 内存 | | ||
| 78 | +| `03_异步任务执行.md` | 异步任务, stream, task | 任务执行 | | ||
| 79 | +| `05_多设备编程.md` | 多设备, P2P | 多设备 | | ||
| 80 | +| `06_Context管理.md` | context | Context | | ||
| 81 | +| `07_进程间通信.md` | IPC, 共享内存 | IPC | | ||
| 82 | +| `10_异常处理.md` | 异常, error | 异常处理 | | ||
| 83 | +| `08_运行时核资源控制.md` | 核资源, aicore-num, Cube Core, Vector Core, aclrtSetDeviceResLimit, aclrtSetStreamResLimit, 资源抢占, 资源争抢, batch调度, schemMode | 核资源控制 | | ||
| 84 | +| `12_推荐接口与典型场景.md` | 最佳实践, 推荐 | 最佳实践 | | ||
| 85 | + | ||
| 86 | +## 匹配执行步骤 | ||
| 87 | + | ||
| 88 | +### 1. 关键词提取 | ||
| 89 | + | ||
| 90 | +从 issue 标题和描述中提取以下类型关键词: | ||
| 91 | + | ||
| 92 | +- **API 名称**:aclInit, aclrtMalloc, aclrtSetDevice 等 | ||
| 93 | +- **错误码**:107000, 207001, 507011 等 | ||
| 94 | +- **技术概念**:内存, stream, device, 初始化, 同步 等 | ||
| 95 | +- **现象描述**:失败, OOM, 超时, 全0 等 | ||
| 96 | + | ||
| 97 | +### 2. 映射匹配 | ||
| 98 | + | ||
| 99 | +按优先级搜索映射表: | ||
| 100 | + | ||
| 101 | +``` | ||
| 102 | +对于每个关键词: | ||
| 103 | + 1. 在 FAQ 映射表中查找精确匹配 | ||
| 104 | + 2. 在 API 映射表中查找精确匹配 | ||
| 105 | + 3. 在开发指南映射表中查找精确匹配 | ||
| 106 | + 4. 如果无精确匹配,查找模糊匹配(包含关键词的文档) | ||
| 107 | +``` | ||
| 108 | + | ||
| 109 | +### 3. 内容提取 | ||
| 110 | + | ||
| 111 | +从匹配的文档中提取: | ||
| 112 | + | ||
| 113 | +- **问题现象描述**:为什么用户看到这个结果 | ||
| 114 | +- **可能原因**:底层机制解释 | ||
| 115 | +- **解决步骤**:具体的操作步骤 | ||
| 116 | +- **代码示例**:正确使用方式示例 | ||
| 117 | +- **相关链接**:其他相关文档 | ||
| 118 | + | ||
| 119 | +### 4. 组合回复 | ||
| 120 | + | ||
| 121 | +将提取的内容按照 reply-templates.md 中对应等级的模板组织成回复草稿。 | ||
| 122 | + | ||
| 123 | +### 5. 链接可达性校验 | ||
| 124 | + | ||
| 125 | +**强制步骤**:组合回复后,对所有引用的文档路径进行可达性校验: | ||
| 126 | + | ||
| 127 | +```bash | ||
| 128 | +# 批量验证草稿中所有文档链接 | ||
| 129 | +for path in docs/04_FAQ/xxx.md docs/03_api_ref/xxx.md docs/02_dev_guide/xxx.md; do | ||
| 130 | + git show origin/master:"$path" > /dev/null 2>&1 && echo "OK: $path" || echo "FAIL: $path" | ||
| 131 | +done | ||
| 132 | +``` | ||
| 133 | + | ||
| 134 | +如果校验发现文件不存在: | ||
| 135 | +1. 在主仓中搜索实际存在的最相关文档(`git ls-tree origin/master docs/04_FAQ/` 等) | ||
| 136 | +2. 替换为正确路径 | ||
| 137 | +3. 如果找不到替代文档,移除该链接并注明"暂无对应文档" | ||
| 138 | + | ||
| 139 | +此步骤防止引用不存在或文件名错误的文档(如曾将 `如何通过plog日志定位Device侧异常.md` 错误引用为 `如何通过plog日志定位异常.md`)。 | ||
| 140 | + | ||
| 141 | +## 错误码快速映射 | ||
| 142 | + | ||
| 143 | +错误码是 L1 场景最重要的匹配依据,以下是常见错误码到 FAQ 的直接映射: | ||
| 144 | + | ||
| 145 | +| 错误码 | 名称 | FAQ 映射 | | ||
| 146 | +|--------|------|----------| | ||
| 147 | +| 100001 | ACL_ERROR_UNINITIALIZE | aclInit初始化失败常见原因排查 | | ||
| 148 | +| 100002 | ACL_ERROR_REPEAT_INITIALIZE | aclInit初始化失败常见原因排查 | | ||
| 149 | +| 107000 | ACL_ERROR_RT_PARAM_INVALID | aclInit初始化失败常见原因排查 | | ||
| 150 | +| 107001 | ACL_ERROR_RT_INVALID_DEVICEID | aclrtSetDevice调用失败 | | ||
| 151 | +| 107003 | ACL_ERROR_RT_STREAM_CONTEXT | 如何理解默认Device和默认Stream机制 | | ||
| 152 | +| 107019 | ACL_ERROR_RT_WAIT_TIMEOUT | Stream同步与Event同步的区别与选择 | | ||
| 153 | +| 107020 | ACL_ERROR_RT_TASK_TIMEOUT | Stream同步与Event同步的区别与选择 | | ||
| 154 | +| 200000 | ACL_ERROR_BAD_ALLOC | aclrtMalloc内存申请失败常见原因 | | ||
| 155 | +| 207001 | ACL_ERROR_RT_MEMORY_ALLOCATION | aclrtMalloc内存申请失败常见原因 | | ||
| 156 | +| 207004 | ACL_ERROR_RT_NO_DEVICE | aclrtSetDevice调用失败 | | ||
| 157 | +| 207012 | ACL_ERROR_RT_OVER_LIMIT | aclrtMalloc内存申请失败常见原因 | | ||
| 158 | +| 207018 | ACL_ERROR_RT_DEVICE_OOM | aclrtMalloc内存申请失败常见原因 | | ||
| 159 | +| 507010 | ACL_ERROR_RT_MODEL_EXECUTE | 如何获取和解读Runtime异步错误码 | | ||
| 160 | +| 507011 | ACL_ERROR_RT_MODEL_EXECUTE | 如何获取和解读Runtime异步错误码(注意:此错误码是模型执行错误,不是 malloc 错误) | | ||
| 161 | +| 507014 | ACL_ERROR_RT_AICORE_TIMEOUT | 如何通过plog日志定位Device侧异常 | | ||
| 162 | +| 507015 | ACL_ERROR_RT_AICORE_EXCEPTION | 如何通过plog日志定位Device侧异常 | | ||
| 163 | +| 507046 | ACL_ERROR_RT_STREAM_SYNC_TIMEOUT | Stream同步与Event同步的区别与选择 | | ||
| 164 | +| 507047 | ACL_ERROR_RT_EVENT_SYNC_TIMEOUT | Stream同步与Event同步的区别与选择 | | ||
| 165 | + | ||
| 166 | +当错误码不在上述映射表中时,根据错误码范围推断模块: | ||
| 167 | + | ||
| 168 | +| 错误码范围 | 模块 | 推荐文档 | | ||
| 169 | +|------------|------|----------| | ||
| 170 | +| 100xxx-148xxx | ACL 参数/配置 | `03_api_ref/` 对应章节 | | ||
| 171 | +| 107xxx | RT 参数 | `03_api_ref/` 对应章节 + `04_FAQ/如何获取和解读Runtime异步错误码.md` | | ||
| 172 | +| 200xxx | ACL 资源 | `04_FAQ/aclrtMalloc内存申请失败常见原因.md` | | ||
| 173 | +| 207xxx | RT 资源/特性 | `04_FAQ/` 对应主题 + `03_api_ref/` | | ||
| 174 | +| 300xxx | ACL 存储限制 | `04_FAQ/aclrtMalloc内存申请失败常见原因.md` | | ||
| 175 | +| 500xxx | ACL 内部/系统 | `04_FAQ/如何获取和解读Runtime异步错误码.md` | | ||
| 176 | +| 507xxx | RT 内部/硬件 | `04_FAQ/如何通过plog日志定位Device侧异常.md` | | ||
| @@ -0,0 +1,40 @@ | |||
| 1 | +# FAQ 语义意图映射 | ||
| 2 | + | ||
| 3 | +当关键词匹配无命中时,通过理解 issue 的语义意图映射到 FAQ 主题分类。 | ||
| 4 | + | ||
| 5 | +## 使用方式 | ||
| 6 | + | ||
| 7 | +1. 首先用 `faq-matcher.md` 的关键词表做精确匹配 | ||
| 8 | +2. 精确匹配无命中时,读取此映射表,理解 issue 语义意图 | ||
| 9 | +3. 按语义意图找到对应的 FAQ 目录和文档 | ||
| 10 | + | ||
| 11 | +## 语义意图 → FAQ 映射 | ||
| 12 | + | ||
| 13 | +| 语义意图 | 典型用户表述 | FAQ 文档 | | ||
| 14 | +|----------|------------|----------| | ||
| 15 | +| 初始化失败 | "初始化报错"、"aclInit不成功"、"启动失败"、"第一次调用就出错" | `aclInit初始化失败常见原因排查.md` | | ||
| 16 | +| 设备管理 | "设备打开失败"、"device打不开"、"卡号不对"、"多卡问题" | `aclrtSetDevice调用失败.md` | | ||
| 17 | +| 默认机制理解 | "为什么有默认stream"、"不创建stream也能跑"、"自动创建的设备" | `如何理解默认Device和默认Stream机制.md` | | ||
| 18 | +| 版本兼容 | "升级后出问题"、"新版本不兼容"、"换版本后报错"、"驱动不匹配" | `Runtime版本与CANN版本不匹配导致的问题.md` | | ||
| 19 | +| 内存申请失败 | "内存不够"、"申请失败"、"OOM"、"malloc报错"、"显存不足但报错" | `aclrtMalloc内存申请失败常见原因.md` | | ||
| 20 | +| 数据传输失败 | "复制数据失败"、"memcpy出错"、"数据搬移报错"、"stream上传输不对" | `aclrtMemcpyAsync在错误的Stream上下发失败.md` | | ||
| 21 | +| 内存策略选择 | "大页小页区别"、"用什么策略"、"内存池怎么选"、"性能与内存" | `如何选择合适的内存分配策略.md` | | ||
| 22 | +| 大页小页分离 | "总内存够但申请失败"、"npu-smi显示够但OOM"、"大页小页各看多少" | `如何选择合适的内存分配策略.md` + `03_api_ref/11_内存管理.md` | | ||
| 23 | +| 同步机制 | "卡住了"、"等待超时"、"stream同步vs event"、"怎么同步" | `Stream同步与Event同步的区别与选择.md` | | ||
| 24 | +| 多设备编程 | "跨卡操作失败"、"多卡通信"、"P2P不通"、"device间传输" | `多Device场景下Stream跨Device下发失败.md` + `跨DeviceP2P数据交互配置失败.md` | | ||
| 25 | +| 图捕获 | "capture报错"、"ACLGraph限制"、"捕获期间不能做什么" | `ACLGraph捕获过程中任务提交限制.md` | | ||
| 26 | +| 进程间通信 | "进程间共享内存"、"IPC失败"、"页表对齐" | `进程间IPC内存共享的页表对齐要求.md` | | ||
| 27 | +| 错误码解读 | "错误码什么意思"、"异步错误怎么查"、"507xxx是什么" | `如何获取和解读Runtime异步错误码.md` | | ||
| 28 | +| 算子输出异常 | "结果全0"、"算子输出不对"、"执行结果为零" | `算子执行输出全0的常见原因排查.md` | | ||
| 29 | +| 错误定位 | "怎么定位错误"、"遇错即停"、"stop on error" | `遇错即停模式下错误定位方法.md` | | ||
| 30 | +| 日志分析 | "怎么看日志"、"plog怎么用"、"异常在哪里" | `如何通过plog日志定位异常.md` | | ||
| 31 | +| 核资源控制 | "AIC/AIV区别"、"算力核分配"、"资源抢占"、"核数限制" | `02_dev_guide/08_运行时核资源控制.md` | | ||
| 32 | +| 内存池/自定义分配 | "SOMA内存池"、"自定义Allocator"、"KV Cache内存管理" | `03_api_ref/11-10_SOMA内存池.md` + `03_api_ref/11-08_Custom_Allocator.md` | | ||
| 33 | +| 性能调优 | "跑得慢"、"性能衰减"、"长时间运行变慢"、"延迟增加" | `04_FAQ/如何选择合适的内存分配策略.md` + profiling相关文档 | | ||
| 34 | + | ||
| 35 | +## 语义意图识别原则 | ||
| 36 | + | ||
| 37 | +1. **关注用户痛点而非技术术语** — 用户说"内存不够"不一定提到 aclrtMalloc,但语义意图=内存申请失败 | ||
| 38 | +2. **关注场景而非单个API** — 用户说"多卡训练跑不了"的语义意图=多设备编程+数据传输 | ||
| 39 | +3. **允许多意图映射** — 一个 issue 可能同时涉及多个语义意图,映射到多个 FAQ 文档 | ||
| 40 | +4. **优先 FAQ 再 API 参考** — 语义映射优先指向 FAQ(有完整解答),API 参考作为补充 | ||
| @@ -0,0 +1,162 @@ | |||
| 1 | +# Issue 分类标准 - L0/L1/L2 判定指南 | ||
| 2 | + | ||
| 3 | +## 分级原则 | ||
| 4 | + | ||
| 5 | +根据 issue 的**复杂度**和**信息完备度**判定回复等级,核心判断维度: | ||
| 6 | + | ||
| 7 | +1. **能否直接匹配 FAQ** — 有明确 FAQ 答案的归 L0 | ||
| 8 | +2. **是否有日志/错误码** — 有具体错误信息归 L1 | ||
| 9 | +3. **是否需要实验/深入源码分析** — 需要额外验证归 L2 | ||
| 10 | + | ||
| 11 | +## L0:简单 FAQ 类 | ||
| 12 | + | ||
| 13 | +### 判定条件(满足任一即可) | ||
| 14 | + | ||
| 15 | +- 问题在 `docs/04_FAQ/` 中有完整解答 | ||
| 16 | +- 仅涉及安装、配置、环境变量、版本兼容等基础问题 | ||
| 17 | +- 用户提问方式明确,无需实验验证 | ||
| 18 | +- 常见重复问题(已有多次类似 issue) | ||
| 19 | + | ||
| 20 | +### 典型场景 | ||
| 21 | + | ||
| 22 | +| 场景 | 匹配 FAQ | | ||
| 23 | +|------|----------| | ||
| 24 | +| aclInit 初始化失败 | `04_FAQ/aclInit初始化失败常见原因排查.md` | | ||
| 25 | +| aclrtSetDevice 调用失败 | `04_FAQ/aclrtSetDevice调用失败.md` | | ||
| 26 | +| CANN 版本与 Runtime 不匹配 | `04_FAQ/Runtime版本与CANN版本不匹配导致的问题.md` | | ||
| 27 | +| 如何理解默认 Device/Stream | `04_FAQ/如何理解默认Device和默认Stream机制.md` | | ||
| 28 | +| 安装配置、环境变量、编译环境 | `02_dev_guide/01_初始化.md` | | ||
| 29 | +| 询问 API 使用方法(文档已有说明) | `03_api_ref/` 对应章节 | | ||
| 30 | + | ||
| 31 | +### 排除条件 | ||
| 32 | + | ||
| 33 | +- 如果 FAQ 只能覆盖部分,但 issue 有具体日志 → 降级为 L1 | ||
| 34 | +- 如果 FAQ 答案不够准确,需要实验验证 → 降级为 L2 | ||
| 35 | + | ||
| 36 | +## L1:有日志/报错类 | ||
| 37 | + | ||
| 38 | +### 判定条件(满足任一即可) | ||
| 39 | + | ||
| 40 | +- Issue 包含错误码(ACL_ERROR_xx、507xxx、207xxx 等) | ||
| 41 | +- Issue 包含日志片段(plog、slog、daemon log) | ||
| 42 | +- Issue 描述了具体失败现象(运行失败、返回错误、输出异常) | ||
| 43 | +- FAQ 有部分答案但需要结合日志做针对性分析 | ||
| 44 | + | ||
| 45 | +### 典型场景 | ||
| 46 | + | ||
| 47 | +| 场景 | 匹配 FAQ + 日志分析 | | ||
| 48 | +|------|---------------------| | ||
| 49 | +| aclrtMalloc 内存分配失败(有错误码) | `04_FAQ/aclrtMalloc内存申请失败常见原因.md` + 错误码 207001 | | ||
| 50 | +| 升级 CANN 后内存分配失败 507011 | 错误码分析 + `04_FAQ/aclrtMalloc内存申请失败常见原因.md`(注意:507011 是模型执行错误码,非 malloc 错误) | | ||
| 51 | +| ACLGraph 捕获过程任务提交失败 | `04_FAQ/ACLGraph捕获过程中任务提交限制.md` + 错误码 107024-107032 | | ||
| 52 | +| Stream 同步失败/超时 | `04_FAQ/Stream同步与Event同步的区别与选择.md` + 错误码 507046/507047 | | ||
| 53 | +| 算子执行输出全 0 | `04_FAQ/算子执行输出全0的常见原因排查.md` + 日志模式分析 | | ||
| 54 | +| AICore timeout/exception | 错误码 507014/507015 + `04_FAQ/如何通过plog日志定位Device侧异常.md` | | ||
| 55 | +| OOM 但 npu-smi 显示内存充足 | 大页/小页分离问题 + `03_api_ref/11_内存管理.md` + aclrtGetMemInfo 分池查询 | | ||
| 56 | +| AIC/AIV 算力核资源争抢/抢占 | 硬件概念澄清 + `02_dev_guide/08_运行时核资源控制.md`(AIC/AIV 是独立单元,不存在抢占概念) | | ||
| 57 | +| 编译时 vs 运行时参数区别(aicore-num vs blockDim) | `03_api_ref/14_Kernel加载与执行.md` + slog 中确认 block 信息 | | ||
| 58 | + | ||
| 59 | +### 日志分析步骤 | ||
| 60 | + | ||
| 61 | +参考 `references/log-analyzer.md`: | ||
| 62 | + | ||
| 63 | +1. 识别错误码范围 → 定位模块(ACL/RT/GE/DRV) | ||
| 64 | +2. 搜索 `docs/04_FAQ/` 和 `docs/03_api_ref/` 匹配解答 | ||
| 65 | +3. 结合用户环境信息做针对性分析 | ||
| 66 | +4. 生成包含技术解释 + 解决建议的初版回复 | ||
| 67 | + | ||
| 68 | +### 排除条件 | ||
| 69 | + | ||
| 70 | +- 如果日志分析后仍无法确定根因 → 升级为 L2 | ||
| 71 | +- 如果需要实验验证才能确认 → 升级为 L2 | ||
| 72 | + | ||
| 73 | +### 特殊 L1 模式:硬件概念澄清 | ||
| 74 | + | ||
| 75 | +当用户对硬件架构概念有误解时(如认为 AIC/AIV 有抢占机制、混淆编译时参数与运行时参数),应归为 L1 并优先做概念澄清: | ||
| 76 | + | ||
| 77 | +1. **AIC/AIV 独立性**:AIC 和 AIV 是独立的计算单元,不存在"抢占"概念;Runtime 通过 schemMode、aclrtSetDeviceResLimit、aclrtSetStreamResLimit 控制资源分配 | ||
| 78 | +2. **编译时 vs 运行时**:ATC 编译时 aicore-num 与 rtKernelLaunch 运行时 blockDim 是不同层面的参数 | ||
| 79 | +3. **大页/小页分离**:npu-smi 显示 HBM 总量,但实际内存分为大页池(ACL_MEM_HUGE)和小页池(ACL_MEM_NORMAL),OOM 可能是某一池不足 | ||
| 80 | + | ||
| 81 | +此类问题虽无日志,但有明确的技术解答路径(文档 + 概念澄清),不需要实验验证。 | ||
| 82 | + | ||
| 83 | +## L2:复杂/需实验类 | ||
| 84 | + | ||
| 85 | +### 判定条件(满足任一即可) | ||
| 86 | + | ||
| 87 | +- 问题涉及性能异常、内存机制、底层原理 | ||
| 88 | +- 日志分析后无法确定根因 | ||
| 89 | +- 需要编写测试程序验证技术原理 | ||
| 90 | +- 涉及多模块交互、跨版本差异等复杂场景 | ||
| 91 | +- 用户疑问需要实验对比才能回答 | ||
| 92 | + | ||
| 93 | +### 典型场景 | ||
| 94 | + | ||
| 95 | +| 场景 | 原因 | | ||
| 96 | +|------|------| | ||
| 97 | +| HBM 内存容量查询与实际可用不符 | 需要实验验证内存池机制 | | ||
| 98 | +| 大页手动预留导致申请失败 | 需要实验验证大页管理 | | ||
| 99 | +| 批量推理长时间性能衰减 | 需要性能测试验证 | | ||
| 100 | +| 内存碎片堆积 OOM | 需要深入分析内存管理机制 | | ||
| 101 | +| 多 DIE 场景资源争抢 | 需要实验验证资源调度 | | ||
| 102 | +| vLLM / PyTorch 等框架集成问题 | 框架层面问题需与框架方协作,Runtime 仅提供底层能力 | | ||
| 103 | +| 外部框架的 KV Cache / 内存管理策略 | 框架内部逻辑 + Runtime SOMA/Allocator 能力结合 | | ||
| 104 | + | ||
| 105 | +### L2 输出内容 | ||
| 106 | + | ||
| 107 | +仅生成**分析摘要**,不生成完整回复: | ||
| 108 | + | ||
| 109 | +1. **问题分析**:技术原理、可能原因、假设 | ||
| 110 | +2. **建议方向**:验证思路、推荐实验 | ||
| 111 | +3. **相关文档链接**:docs/ 中相关章节 | ||
| 112 | +4. **模块归属**:根据 classify_rule.yaml 判断归属团队 | ||
| 113 | +5. **通知建议**:建议通知的负责人和通知内容模板 | ||
| 114 | + | ||
| 115 | +### 特殊 L2 模式:框架集成问题 | ||
| 116 | + | ||
| 117 | +当 issue 涉及 vLLM、PyTorch、MindSpore 等外部框架与 CANN Runtime 的交互时,归为 L2 并采用特殊处理: | ||
| 118 | + | ||
| 119 | +1. **识别框架归属**:问题核心是否在框架内部逻辑(如 vLLM KV Cache 管理策略) | ||
| 120 | +2. **列出 Runtime 能做什么**:即使完整解答需要框架方参与,也要明确 Runtime 提供的底层能力: | ||
| 121 | + - SOMA 内存池(`03_api_ref/11-10`):支持框架自定义内存管理 | ||
| 122 | + - Custom Allocator(`03_api_ref/11-08`):允许框架注入自己的内存分配逻辑 | ||
| 123 | + - 核资源控制(`02_dev_guide/08`):Stream/Device 级别的算力核配额 | ||
| 124 | +3. **建议协作方向**:指出需要框架方配合验证的部分 | ||
| 125 | + | ||
| 126 | +## 边界情况处理 | ||
| 127 | + | ||
| 128 | +### 无法确定等级 | ||
| 129 | + | ||
| 130 | +- 默认归为 L1(生成初版回复,让用户判断) | ||
| 131 | +- 如果信息不足以分析,在回复中说明需要补充的信息 | ||
| 132 | + | ||
| 133 | +### 等级调整 | ||
| 134 | + | ||
| 135 | +- 分析过程中发现比预期复杂 → 可以升级(L0→L1,L1→L2) | ||
| 136 | +- 分析过程中发现比预期简单 → 可以降级(L2→L1) | ||
| 137 | +- 调整后需要重新选择对应模板 | ||
| 138 | + | ||
| 139 | +### 信息不足 | ||
| 140 | + | ||
| 141 | +- Issue 缺少关键信息(环境、版本、日志) → 先补充信息请求,不做技术回复 | ||
| 142 | +- 使用 "信息补充模板"(见 reply-templates.md) | ||
| 143 | + | ||
| 144 | +## 快速判定流程图 | ||
| 145 | + | ||
| 146 | +``` | ||
| 147 | +Issue 进入 | ||
| 148 | + │ | ||
| 149 | + ├─ 是否能直接匹配 04_FAQ/ 中的完整解答? | ||
| 150 | + │ ├─ YES → L0 | ||
| 151 | + │ └─ NO ↓ | ||
| 152 | + │ | ||
| 153 | + ├─ 是否有错误码或日志? | ||
| 154 | + │ ├─ YES → L1(结合日志分析) | ||
| 155 | + │ ├─ NO → 是否描述了具体失败现象? | ||
| 156 | + │ ├─ YES → L1(请求补充日志) | ||
| 157 | + │ ├─ NO ↓ | ||
| 158 | + │ | ||
| 159 | + ├─ 是否需要实验验证或深入分析? | ||
| 160 | + │ ├─ YES → L2 | ||
| 161 | + │ ├─ NO → L1(默认) | ||
| 162 | +``` | ||


🟡 Medium Priority
regress.sh 第33-39行将用户传入的
$num(来自$1参数,仅经过tr -d ' '去空格)直接内插到bash -c "..."双引号字符串中。由于$num未做任何 shell 元字符转义,攻击者可以传入包含单引号的内容(如1';id;#)提前闭合内层 echo 的单引号字符串,执行任意命令。触发条件:开发者或调用方传入含 shell 元字符的 issue 编号,如
bash regress.sh "1';malicious_cmd;#"。tr -d ' '只删除空格,';&|$()等均保留。虽然该脚本是开发者工具、攻击面有限,但按 Shell 审查规则,外部输入拼接进命令属于应报告的命令注入。
建议:先对
$num做严格校验,仅允许纯数字;或将$num通过环境变量传入内层 bash,避免直接拼接。推荐方案:在 for 循环开头增加[[ "$num" =~ ^[0-9]+$ ]] || { echo "ERROR: 无效issue编号: $num"; exit 1; }校验,确保$num仅含数字后再使用。