news 2026/9/20 5:51:19

CANN runtime 仓库 AI 化代码审查规则详解:从规范加载到 Error Message 专项检视

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CANN runtime 仓库 AI 化代码审查规则详解:从规范加载到 Error Message 专项检视

CANN runtime 仓库 AI 化代码审查规则详解:从规范加载到 Error Message 专项检视

【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime

本指南系统解读 CANN / runtime 仓库中面向 AI Agent 与自动化工具的统一代码审查规则(.agents/skills/runtime-code-review/review-rules.md),涵盖审查前置约束、规范加载策略、八大审查维度、严重程度分级与结构化输出格式,并结合仓库内error_code.jsonerror_code_meta.h与 UT 用例给出 Error Message 专项检视的源码级依据。读完本文,你将掌握如何在 runtime 仓库中执行一次符合仓库规范、可复现、可发布的 AI 代码审查。

一、这套规则解决什么问题

runtime 仓库代码规模庞大(src/include/pkg_inc/tests/docs/等多类目录并存),人工审查难以覆盖全部规范;而 AI / 工具审查又容易出现两个极端:要么只凭主观感受输出一堆低信号意见,要么在用户没有授权的情况下擅自向代码托管平台写评论。review-rules.md正是为解决这两类问题而设计的统一规则文件:

  • 为 AI 审查定义必须加载的规范文档清单按文件类型分流的加载策略
  • 为问题分级定义高信号优先原则与三级严重程度([必须修改]/[建议修改]/[仅供参考]);
  • 为输出定义按文件组织、含维度与行号的结构化格式,以及最终的审查总结格式;
  • 为对外交互划定不可逾越的红线:未获用户明确授权,绝不向 GitCode 发布任何评论。

该文件被runtime-code-reviewskill 的两种工作模式(本地检视 local-review.md 与 PR 检视 pr-review.md)共同引用,是整套审查能力的行为基准。

二、最高优先级约束:禁止自动发布评论

规则文件开篇即声明一条绝对约束:审查完成后,绝对不能自动向 GitCode 发布评论。这既是安全底线,也是用户体验底线。

2.1 禁止事项

在用户没有明确要求时,AI / 工具不得执行任何以下操作:

  • 向 GitCode PR 发布 summary comment;
  • 向 GitCode PR 发布行内评论(inline comments);
  • 使用任何 GitCode API 执行 POST/DELETE 评论操作;
  • 调用 scripts/post_pr_summary_comment.py 或 scripts/post_pr_inline_comment.py;
  • 使用--comment--post-inline-comments参数运行脚本。

规则特别点出几个常见的"危险想法"并逐一击破:不能因为"审查完成了"就认为应该发布,不能把发布当成"流程的最后一步",不能因为"用户之前做过类似操作"就默认本次也授权,更不能因为"脚本支持--comment参数"就认为应当使用。发布属于外部系统写操作,会改变 PR 状态、触发通知、影响他人工作流,必须由用户显式控制。

2.2 触发条件与正确流程

只有当用户说出"发布评论""提交审查结果""post review""把审查结果发到 GitCode""发 inline comments"等明确指令时,才允许发布。审查完成后的正确响应是:

审查已完成。发现: - [问题统计] 是否需要将审查结果发布到 GitCode?

然后等待用户回复:用户回复"是""可以""发布""提交"才执行;回复"不用"则直接结束;无回复或答复含糊时应再次询问或直接结束,绝不能默认默许。在 pr-review.md 中,这一约束进一步落实为发布前检查清单:用户消息含明确关键词、已展示审查摘要、用户已确认、且不是在审查完成后的首次响应——任一条件不满足都必须 STOP 并询问。

三、输入规则:先加载规范,再开始审查

规则要求审查启动前必须先完成规范加载,避免"无规范可依"的随意评审:

  1. 必须先读取 docs/zh/guidelines/coding-guidelines.md,将其作为基础规范来源;
  2. 必须扫描变更文件和 diff 内容是否命中 Error Message 信号;命中时读取 docs/zh/guidelines/error_message_guide/README.md 并执行 Error Message 专项检视;
  3. 当变更涉及设计、接口、测试或文档时,还应结合 docs/zh/guidelines/design_document_template.md 和 docs/zh/guidelines/dt_guide 下的相关文档。

审查对象由调用方模式提供,可以是本地 diff(git diff origin/master...HEAD),也可以是 GitCode PR diff。从实现看,PR diff 的拉取与元信息获取分别由 scripts/fetch_pr_meta.py(调用 GitCode API 获取标题、描述、状态、base/head sha)和 scripts/fetch_pr_files.py(获取文件列表与 diff refs)完成,二者均要求环境变量GITCODE_API_TOKEN已配置。

四、文件分类与规范加载策略

不同文件适用不同的规范深度,规则将变更文件分为四类,并分别规定"必须读取"或"建议读取"的规范文档:

文件类别典型路径必须/建议读取的规范
源码文件src/**include/**pkg_inc/**cmake/**coding-guidelines.md;命中 Error Message 信号时追加读取 error_message_guide 系列
UT 文件tests/***_utest**_unittest*coding-guidelines.md(重点"通用 C/C++ 编码规范")、ut-coding-guidelines.md、dt_guide/ut_case_development_guide.md
文档文件docs/**建议读取 design_document_template.md 与 coding-guidelines.md
其他文件scripts/**、根目录配置文件等建议读取 coding-guidelines.md

这套分类逻辑在仓库中有直接实现:scripts/classify_review_files.py 通过正则.*_utest\.(cc|cpp|cxx|c)$.*_unittest\.(cc|cpp|cxx|c)$及前缀判断(docs/→ 文档、tests/→ UT、src|include|pkg_inc|cmake→ 源码,其余归入 other)输出四类分组 JSON。PR 模式下该脚本由总控脚本 scripts/run_pr_review.py 自动调用,分类结果随后交给 scripts/prepare_pr_review_context.py 聚合为审查上下文。

4.1 Error Message 相关变更的识别信号

源码文件中,命中以下任一信号就必须执行 Error Message 专项检视:

识别标志说明
调用 macro-selection-guide.md 中列出的宏Error Message 错误上报点
error_code.json 新增条目,或 error_code_meta.h 新增 X-Macro 行新增错误码
新增#define(经宏展开链追踪确认为上报宏,定义参考 macro-selection-guide.md)新增上报宏

命中后必须先读取 docs/zh/guidelines/error_message_guide/README.md,再按问题类型选择专题文档:错误码选择看 error-code-guide.md,宏选择/签名/参数数量看 macro-selection-guide.md,文案/模板/翻译口径看 message-examples.md,整改边界/参数来源/第一现场/防御性编程/重复上报看 rectification-principles.md。

五、审查优先级与高信号原则

规则明确要求优先标记高信号问题——即能够清楚说明"为什么这是问题"的缺陷,并给出了可判定的优先级条件:

应当优先输出的问题(满足至少一类):

  • 代码无法编译或解析;
  • 无论输入如何,代码都必然产生错误结果;
  • 明确、无歧义地违反仓库规范,且能指出具体规则;
  • 明确的兼容性破坏、资源泄漏或文档同步缺失。

不应优先输出的内容:

  • 主观风格偏好;
  • 需要大量上下文才能成立的猜测性问题;
  • 可由通用 lint 自动发现、且不影响正确性的低信号问题。

如果对某个问题是否成立没有足够把握,就不要将其标为高优先级。这条原则配合 scripts/should_skip_pr_review.py(对已关闭、draft、标题带wip/[wip]/draft:的 PR 直接建议跳过审查)共同保证了审查资源的有效投入。

六、八大审查维度

规则定义了覆盖代码质量全要素的八个审查维度,PR 模式下每个维度都会落到可执行的检查动作上。

A. 功能正确性

检查变更逻辑是否符合预期意图;是否遗漏分支、边界条件或异常路径;是否与设计文档、接口约束和测试预期一致。

B. 日志合理性

检查日志级别与热路径开销是否合理;日志内容是否具备足够上下文且不泄露敏感信息;格式化字符串和错误日志宏使用是否正确。

C. 公共 API 兼容性

检查公开头文件修改是否保持向后兼容;是否发生 breaking change;废弃接口、枚举和公开边界处理是否符合规范。

D. 文档同步

修改公开接口或错误码时,是否同步更新了对应文档。这一维度与仓库中docs/zh/guidelines/error_message_guide/README.md的"维护原则"相互呼应:修改错误码、宏或文案规范时须同步更新对应文档与error-code-guide.md/macro-selection-guide.md

E. 软件架构

是否破坏既有目录边界、平台隔离边界或组件职责边界;是否违反src/runtimeapi与非api目录之间的调用边界。

F. 构建规范

重点检查src/runtime目录是否新增了不允许的编译宏。

G. UT 规范

测试代码是否满足断言、mock 清理和状态恢复要求;是否存在不必要的私有成员访问、SetChipType使用或测试隔离问题。仓库 UT 中大量用例遵循GlobalMockObject::verify()式清理模式(参见 tests/ut/runtime/runtime/test/rt_error_code_test.cc 的TearDown),可作为该维度的直观参照。

H. Error Message 规范(专项)

当变更命中 Error Message 信号时,必须执行本维度检视,检查项多达 10 条,下一节详述。

七、Error Message 专项检视:双源同步与参数完备性

Error Message 维度是 runtime 仓库审查中最具特色的部分,其核心是围绕JSON 数据源 + X-Macro 头文件 + UT 校验三条链路的完备性检查。

7.1 检视要点(10 项)

  1. 用户错误 / 内部错误分类是否正确,按 rectification-principles.md 中"用户错误与内部错误""参数来源判断"两节执行;
  2. 错误码选择是否匹配场景,Arglist 数量与顺序是否与 error_code.json 及 error_code_meta.h 匹配,须按 error-code-guide.md 与对应分类的决策树逐项判断;
  3. 新增错误码的完备性——缺少以下任一项即判定不完整,推荐使用errmsg-codegenskill 更新并刷新 error-code-guide.md:
    • JSON 条目完整性:error_code.json 中的errClasserrTitleErrCodeErrMessageArglistsuggestion
    • X-Macro 表行:error_code_meta.h;
    • UT 数据:rt_error_code_test.ccallCodes数组;
  4. 宏与错误码、控制流、参数传递风格是否匹配,是否误用_INNER/_OUTER系列宏,按 macro-selection-guide.md 判断;
  5. 涉及新增宏时须同步更新 macro-selection-guide.md;
  6. 错误文案是否包含参数名、参数值、期望值或 Reason,是否可定位、可自闭环、句式完整、无语法错误;
  7. 是否存在重复结构化上报,按 rectification-principles.md 检查同一次 ErrMsg 输出及其调用栈;
  8. Error Message 整改是否误改业务逻辑、返回值、条件判断或普通日志级别
  9. 公开 API 参数错误是否漏报必要结构化错误
  10. 是否满足整改边界,按 rectification-principles.md 判断。

7.2 源码证据:双源如何同步

JSON 侧(面向文档化与错误码字典):error_code.json 中每个错误码包含errClasserrTitleErrCodeErrMessageArglistsuggestion六个字段。例如:

{ "errClass": "RTS Errors", "errTitle": "Invalid_Argument", "ErrCode": "EE1001", "ErrMessage": "The argument is invalid. Reason: %s", "Arglist": "extend_info", "suggestion": { "Possible Cause": "N/A", "Solution": "1. Check the input parameter range of the function. 2. Check the function invocation relationship." } }

X-Macro 侧(面向编译期校验与日志生成):error_code_meta.h 通过RUNTIME_ERROR_CODE_TABLE(X)定义每行格式为X(ErrorCode枚举名, 字符串名称, (参数名列表), 完整消息模板, 日志级别)。例如:

/* EE1003 - Invalid_Argument */ X(EE1003, "EE1003", ("func", "value", "param", "expect"), "%s failed because value %s for parameter %s is invalid. " "Expected value: %s. ErrorCode=EE1003.\n", DLOG_ERROR)

这里EE1003的 Arglist 为 4 个参数,与 JSON 中"Arglist": "func, value, param, expect"一一对应,%s占位符数量也必须与之严格一致——这正是"Arglist 数量与顺序匹配"检查的落点。

UT 侧(机器可验证的守卫):tests/ut/runtime/runtime/test/rt_error_code_test.cc 中ErrorCodeTableParamCountMatchesMessageFormat用例以allCodes数组逐项断言每个错误码的参数数量与GetParamNames(info.code)返回一致:

std::vector<CodeInfo> allCodes = { {ErrorCode::EE1001, 1}, {ErrorCode::EE1002, 1}, {ErrorCode::EE1003, 4}, {ErrorCode::EE1004, 2}, {ErrorCode::EE1005, 1}, {ErrorCode::EE1006, 3}, {ErrorCode::EE1007, 2}, {ErrorCode::EE1009, 2}, ... }; for (const auto& info : allCodes) { auto names = GetParamNames(info.code); EXPECT_EQ(names.size(), info.expectedParamCount) << "Param count mismatch for code " << static_cast<int>(info.code); }

这意味着:新增错误码时,若只改 JSON 和 X-Macro 表而未同步更新allCodes数组,UT 会直接失败。规则第 3 条要求的三处同步(JSON 条目、X-Macro 行、UT 数据)由此获得了可自动验证的强制力。

7.3 严重程度判定

Error Message 维度的严重程度单独细化:

  • [必须修改]:用户错误和内部错误分类明显错误;错误码明显选错;Arglist 数量或顺序与error_code.json/error_code_meta.h不匹配;一次 ErrMsg 输出中存在完全相同或实质相同的结构化消息;删除或迁移上报导致本应结构化上报的路径漏报;Error Message 整改引入业务逻辑、返回值、条件判断、清理顺序或日志级别变化;公开 API 参数错误漏报必要结构化错误。
  • [建议修改]:宏可工作但不是推荐专用宏;文案不够自闭环;Reason、Expected、参数名或参数值表达不清;第一现场日志上下文不足;调用栈中存在可由首错点和 acl/rt 接口层完整覆盖的冗余中间层上报。
  • [仅供参考]:非关键措辞优化,或不影响定位的问题说明。

八、通用严重程度定义与输出格式

除 Error Message 专项外,规则给出了全局通用的三级严重程度:

  • [必须修改]:功能缺陷、安全漏洞、资源泄漏、兼容性破坏、缺失必要文档同步等必须修复的问题;
  • [建议修改]:编码风格、日志合理性、可维护性、测试完备性等建议改进的问题;
  • [仅供参考]:风格偏好、可选优化和低风险提醒。

输出按文件组织审查结果,每个问题包含严重程度、审查维度、行号、问题描述与修改建议:

### <文件路径> - **[严重程度]** <审查维度> | 行号:<行号> <问题描述> <修改建议>(如适用)

8.1 审查总结格式

所有文件审查完成后,必须输出三段式总结:

  1. 变更概要:本次变更的目的和范围;
  2. 问题统计:各严重程度的问题数量;
  3. 总体评价:代码质量评估及是否建议合入。

在 PR 模式下,这套总结可以通过 scripts/render_pr_review_summary.py 渲染为summary.md,并可(在用户授权后)由 scripts/post_pr_summary_comment.py 发布。

九、结构化审查结果的机器可读表达

对于希望将审查结果交给脚本自动渲染与发布(仅在授权时)的场景,review-result-schema.md 定义了--review-resultJSON 的结构。顶层包含change_summary(变更概要)、problem_statsmust_fix/suggested/reference计数)、overall_assessment(总体评价)和findings(逐问题明细)四个必需字段;每个 finding 至少含fileseveritydimensionsummary,可选linesuggestioninline_comment(内含pathpositionstart_positionbody,供行内评论发布使用)。

scripts/run_pr_review.py 的validate_review_result函数会强校验:顶层四字段必须齐全、problem_stats三项必须存在、findings必须是数组且每个 finding 的severity只能是三个合法值之一;若inline_comment未提供body,脚本会依据severitydimensionsummarysuggestion自动拼装行内评论正文。整个校验链路保证了"结构化审查结果 → 可渲染摘要 → 可定位行内评论"的端到端一致性。

十、实战落地:一条完整的 PR 审查流水线

将上述规则落到仓库中,一次合规的 PR 审查遵循如下流水线(详见 pr-review.md):

  1. 准备:确认GITCODE_API_TOKEN已配置(echo $GITCODE_API_TOKEN);
  2. 拉取 PR 信息fetch_pr_meta.py获取标题、描述、状态、base/head sha;fetch_pr_files.py获取文件列表与 diff refs;
  3. 前置检查should_skip_pr_review.py判断 PR 是否已关闭、是否为 draft、是否无需审查;
  4. 读取共享规则:review-rules.md;
  5. 文件分类classify_review_files.py按四类分组;
  6. 聚合上下文prepare_pr_review_context.py汇总 PR 元信息、diff 与分类结果;
  7. 加载规范文档:按分类结果分别加载 coding-guidelines、error_message_guide 系列、ut-coding-guidelines、design_document_template;
  8. 逐文件审查并验证、过滤误报;
  9. 输出结果(默认必须执行,在终端完整输出;无问题时明确输出"未发现问题");
  10. 发布(仅用户明确要求):先渲染 summary,再发布 summary comment,仅对高信号、可复现、可准确定位的少量问题发布行内评论,避免噪声过大。

单入口命令(仅编排,不代跑模型审查):

python3 .agents/skills/runtime-code-review/scripts/run_pr_review.py \ --owner <owner> \ --repo <repo> \ --pr <number>

如需在已有结构化结果review-result.json的基础上渲染并发布(需用户确认授权):

python3 .agents/skills/runtime-code-review/scripts/run_pr_review.py \ --owner <owner> --repo <repo> --pr <number> \ --review-result review-result.json --comment

行内评论发布前必须确认精确行号:先用 PR diff 定位 hunk,再用fetch_pr_raw_file.py获取 raw 文件,必要时以grep -n确认目标代码行号,避免仅凭 patch hunk 起始位置估算。本地场景则直接以 local-review.md 为流程基线,审查范围默认为git diff origin/master...HEAD涉及的本地改动。

十一、总结

review-rules.md的价值在于把"高质量代码审查"从经验行为固化为可执行、可验证的工程规范:以禁止自动发布守住外部交互边界,以分类加载规范保证审查依据充分,以高信号优先提升问题信噪比,以Error Message 双源同步 + UT 强制校验确保错误码体系不出错,最终以三级严重程度 + 结构化输出 + 三段式总结交付可读、可机器消费的审查产物。无论是人工 review 还是 AI 辅助审查,遵循这套规则都能让每次审查有据可依、结论可信、边界清晰。

【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/20 5:50:36

浏览器自动化利器Playwright:动态渲染处理与pytest实践

入行做浏览器自动化这些年&#xff0c;我一直有个很深的感触&#xff1a;很多人一提到爬虫或者自动化&#xff0c;第一反应还是“直接抓接口、解参数”&#xff0c;觉得这才是高效的正道。但真到了生产环境你会发现&#xff0c;页面上随便一个动态Token、一段JS加密、一层嵌套i…

作者头像 李华
网站建设 2026/9/20 5:50:17

AI辅助Web接口逆向解析实战:从抓包到结构化数据提取

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/20 5:49:13

AI工具价格差异解析:从算力成本到选型策略

1. 价格差异背后的行业现状AI工具市场近年来呈现爆发式增长&#xff0c;各类产品价格从完全免费到每年数万元不等。作为从业者&#xff0c;我见过太多用户在选型时陷入困惑&#xff1a;同样是图像识别API&#xff0c;为什么A厂商每千次调用收费0.5元&#xff0c;B厂商却要5元&a…

作者头像 李华
网站建设 2026/9/20 5:46:43

AI时代Git工作流重构:让commit和diff成为AI行为审计链

1. 当AI开始写代码&#xff0c;Git就不再是“提交记录仪”了我第一次在团队里用Copilot补全一个Vue组件的setup函数时&#xff0c;顺手敲下git commit -m "feat: add user profile card"&#xff0c;结果旁边同事盯着终端看了三秒&#xff0c;突然说&#xff1a;“你…

作者头像 李华