已关闭
issue-response(#2551) #3429
rui创建于 7月6日关闭于 8月1日
issue-response(#2551) #3429
已关闭
rui创建于 7月6日关闭于 8月1日
47 个文件变更+7708-2
@@ -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: 执行超时或失败"
atomgit-bot
atomgit-botatomgit-bot7月6日

🟡 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 仅含数字后再使用。

likedislike
不准确?
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)
atomgit-bot
atomgit-botatomgit-bot7月6日

🟡 Medium Priority

check_r3_error_code() 函数(第 86 行)仅通过检查 expected_checkpoints 中是否出现 "错误码"、"error"、"107002"、"507" 关键词来判断该 issue 是否涉及错误码。但 4 条 expected_subtype == "error-code-log" 的基准项(bm-007~bm-010)的 checkpoints 中均不含这些关键词:

因此这 4 条全部被判定为 error_related=False,R3 直接返回 PASS 而不检查草稿中是否引用了错误码。这导致 R3 规则对其核心目标子类型完全失效。

触发条件:任何 benchmark item 的 expected_subtype 为 "error-code-log" 但 expected_checkpoints 中不含关键词 "错误码"/"error"/"107002"/"507" 时触发。

修复方向:在 error_related 判断中增加对 benchmark_item.get("expected_subtype") == "error-code-log" 的检查。

建议:在 error_related 判断中增加 subtype 检查:error_related = benchmark_item.get("expected_subtype") == "error-code-log" or any(...)

改动建议
86
- error_related = any("错误码" in cp or "error" in cp.lower() or "107002" in cp or "507" in cp for cp in checkpoints)
86
+ error_related = benchmark_item.get("expected_subtype") == "error-code-log" or any("错误码" in cp or "error" in cp.lower() or "107002" in cp or "507" in cp for cp in checkpoints)
应用建议
likedislike
不准确?
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)
atomgit-botatomgit-bot
atomgit-botatomgit-bot7月6日

🟡 Medium Priority

calculate_score() 函数(第 178 行)计算 LLM 均分时:

这里 sum(s.values()) 对每个 run 的 3 个维度(accuracy/actionability/adoptability,各 0-2 分)求和得到 0-6 的值,然后除以 run 次数。但设计规范(scoring-rubric.md 第 42 行)要求的是 "LLM 三维均分/2"——即先对每个 run 求三维均值(÷3),再跨 run 求平均,最后 ÷2 归一化。

以满分(两个 run 均为 {2,2,2})为例:

差距达 3 倍。一旦 LLM 裁判自动化(DEV_PROCESS.md 第 147 行的 TODO)接入,总分将被严重扭曲——规则分最高贡献 0.6,LLM 分最高贡献 1.2,LLM 分将主导评分。当前因 main() 中传 llm_scores=None 未触发此路径。

建议:修改为:先对每个 run 的三维度求均值再跨 run 平均,即 avg_llm = sum(sum(s.values()) / 3 for s in llm_scores) / len(llm_scores)

改动建议
179
+ avg_llm = sum(sum(s.values()) / 3 for s in llm_scores) / len(llm_scores)
179
180
  llm_score = (avg_llm / 2)
应用建议
likedislike
不准确?
atomgit-botatomgit-bot7月6日

🟡 Medium Priority

calculate_score() 第177-179行计算 LLM 裁判分时:

该公式将所有维度的原始分直接求和再除以运行次数(而非总维度数),导致分子缺少对每轮 3 个维度的平均。

设计公式:「LLM 三维均分 = 每轮 (accuracy+actionability+adoptability)/3,两轮取均值,再 /2 归一化」。 设 2 轮 × 3 维 = 6 个值,正确计算应为 sum(6个值) / 6 / 2 = sum / 12,当前代码计算为 sum(6个值) / 2 / 2 = sum / 4

高估倍数: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 阈值。

当前 main() 中传入 llm_scores=None 所以尚未触发,但 LLM 自动打分启用后将立即出错。

建议:将分母从 len(llm_scores)(运行次数)改为 sum(len(s) for s in llm_scores)(总维度数),使 avg_llm 正确表示所有维度分的均值。

改动建议
179
+ if llm_scores and len(llm_scores) > 0:
180
+ total_dims = sum(len(s) for s in llm_scores)
181
+ avg_llm = sum(sum(s.values()) for s in llm_scores) / total_dims
179
182
  llm_score = (avg_llm / 2)
应用建议
likedislike
不准确?
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)
atomgit-bot
atomgit-botatomgit-bot7月6日

🟡 Medium Priority

第19行 curl -s "https://api.gitcode.com/api/v5/repos/cann/runtime/issues?state=open&per_page=50&access_[REDACTED] 将 $GITCODE_API_TOKEN` 直接拼接在 URL query string 中。

风险:

  1. token 可能被中间代理/网关日志记录(URL 通常被记录)
  2. token 出现在进程命令行参数中,ps aux 可被同机其他用户看到
  3. shell history 会记录完整 URL 含 token

虽然这是开发者工具而非生产服务,但 token 泄露风险真实存在。应使用 HTTP Header(如 Authorization: BearerPRIVATE-TOKEN)传递,避免 token 进入 URL。

建议:改用 HTTP Header 传递 token:curl -s -H "Authorization: Bearer $GITCODE_API_TOKEN" "https://api.gitcode.com/..." 。如果 GitCode API v5 不支持 [REDACTED],至少应使用 `curl -s -H "PRIVATE-[REDACTED] 等 header 方式,避免 token 出现在 URL 中。

likedislike
不准确?
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+```