Skip to content

Commit 48163e8

Browse files
authored
feat: inject CI check results into AI review prompt and clarify blocker criteria (ZhuLinsen#645)
- Pass auto-check job outputs (syntax_ok, has_py_changes, result) as env vars to ai_review.py - Add _build_ci_context() to build CI status section injected into review prompt - Update prompt: AI reviewer must reference CI status before judging validation sufficiency - Clarify blocker vs suggestion: only correctness/security/CI failure/contradiction/missing rollback are blockers - Update AGENTS.md: add CI coverage principle, blocking conditions, suggestion conditions
1 parent 8ce8d49 commit 48163e8

3 files changed

Lines changed: 68 additions & 8 deletions

File tree

.github/scripts/ai_review.py

Lines changed: 46 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,14 +74,39 @@ def classify_files(files):
7474
return py_files, doc_files, frontend_files, ci_files, config_files
7575

7676

77+
def _build_ci_context():
78+
"""Build CI context section from environment variables set by the workflow."""
79+
auto_check_result = os.environ.get('CI_AUTO_CHECK_RESULT', '')
80+
syntax_ok = os.environ.get('CI_SYNTAX_OK', '')
81+
has_py = os.environ.get('CI_HAS_PY_CHANGES', 'false')
82+
83+
if not auto_check_result:
84+
return """
85+
## CI 检查状态
86+
> ⚠️ 未获取到 CI 检查结果。审查时不得假设 CI 已通过,验证相关判断应标注为"无法确认"。
87+
"""
88+
89+
lines = ["\n## CI 检查状态(来自本次 PR 的自动化流水线)"]
90+
lines.append(f"- 静态检查总体结果: **{'✅ 通过' if auto_check_result == 'success' else '❌ 失败'}**")
91+
if has_py == 'true':
92+
lines.append(f"- Python 语法检查 (py_compile): **{'✅ 通过' if syntax_ok == 'true' else '❌ 失败' if syntax_ok == 'false' else '⏭️ 未执行'}**")
93+
lines.append("- Flake8 严重错误检查 (E9/F63/F7/F82): **✅ 通过**(若未通过则静态检查总体会失败)")
94+
else:
95+
lines.append("- Python 文件: 无变更,语法检查已跳过")
96+
lines.append("")
97+
lines.append("> 以上 CI 仅覆盖语法正确性(py_compile)和致命 lint 错误(flake8 E9/F63/F7/F82)。`./scripts/ci_gate.sh` **未包含在 CI 中**:对 Python 后端改动,若 PR 描述未说明该 gate 是否执行(或给出跳过原因),应在建议项中注明,但不构成阻断。语法/flake8 已通过则无需重复贴对应本地输出。")
98+
lines.append("")
99+
return '\n'.join(lines)
100+
101+
77102
def build_prompt(diff_content, files, truncated, pr_title, pr_body):
78103
"""Build AI review prompt aligned with AGENTS.md requirements."""
79104
truncate_notice = ''
80105
if truncated:
81106
truncate_notice = "\n\n> ⚠️ 注意:diff 过长已截断,请基于可见内容审查并标注不确定点。\n"
82107

83108
py_files, doc_files, frontend_files, ci_files, config_files = classify_files(files)
84-
109+
ci_context = _build_ci_context()
85110
return f"""你是本仓库的 PR 审查助手。请根据变更内容和 PR 描述,执行“代码 + 文档 + CI”联合审查。
86111
87112
## PR 信息
@@ -103,26 +128,41 @@ def build_prompt(diff_content, files, truncated, pr_title, pr_body):
103128
```diff
104129
{diff_content}
105130
```
106-
131+
{ci_context}
107132
## 必须对齐的审查规则(来自仓库 AGENTS.md)
108133
1. 必要性(Necessity):是否有明确问题/业务价值,避免无效重构。
109-
2. 关联性(Traceability):是否有关联 Issue(Fixes/Refs);无 Issue 时是否给出动机与验收标准。
134+
2. 关联性(Traceability):是否有关联 Issue(Fixes/Refs);自然语言关联(如"关联 issue 为 #xxx")也可接受,不因格式问题判定不通过。无 Issue 时是否给出动机与验收标准。
110135
3. 类型判定(Type):fix/feat/refactor/docs/chore/test 是否匹配。
111-
4. 描述完整性(Description Completeness):是否包含背景、范围、验证命令与结果、兼容性风险、回滚方案。
136+
4. 描述完整性(Description Completeness):是否包含背景、范围、验证命令与结果、兼容性风险、回滚方案。判断验证是否充分时,必须参考上方"CI 检查状态"段落:(a)若 py_compile 和 flake8 已通过,PR 描述中可引用 CI 结果而不必贴对应本地输出;(b)`./scripts/ci_gate.sh` 不在 CI 覆盖范围,对 Python 后端改动需检查 PR 描述是否说明了该 gate 的执行情况,若未说明应列为建议项;(c)若未提供 CI 结果,则不得假设 CI 已通过,验证充分性应标注为"无法确认"。
112137
5. 合入判定(Merge Readiness):给出 Ready / Not Ready,并列出阻断项。
113138
6. 若涉及用户可见能力,检查 README.md 与 docs/CHANGELOG.md 是否同步。
114139
140+
## 阻断 vs 建议的判定标准
141+
仅以下问题可判定为 Not Ready(阻断项/必改项):
142+
- 代码存在正确性或安全性问题(逻辑错误、异常吞没、安全漏洞等)
143+
- CI 检查未通过
144+
- PR 描述与实际改动内容存在实质性矛盾
145+
- 缺少回滚方案
146+
147+
以下问题仅放入建议项,不影响合入判定:
148+
- issue 关联格式不规范
149+
- 语法/flake8 验证证据缺失但上方"CI 检查状态"显示 py_compile 和 flake8 均通过
150+
- Python 后端改动的 PR 描述未说明 `./scripts/ci_gate.sh` 是否执行或给出跳过原因
151+
- 描述中非关键性措辞或格式问题
152+
- 注释语言风格、无关锁文件变更等
153+
115154
## 审查输出要求
116155
- 使用中文。
117-
- 先给“结论”:`Ready to Merge` 或 `Not Ready`。
156+
- 先给"结论":`Ready to Merge` 或 `Not Ready`。
118157
- 再给结构化结果:
119158
- 必要性:通过/不通过 + 理由
120159
- 关联性:通过/不通过 + 证据
121160
- 类型:建议类型
122161
- 描述完整性:完整/不完整(缺失项)
123162
- 风险级别:低/中/高 + 关键风险
124-
- 必改项(最多 5 条,按优先级)
163+
- 必改项(最多 5 条,仅限阻断条件,按优先级)
125164
- 建议项(最多 5 条)
165+
- 必改项仅包含上述阻断条件中的问题;格式、关联、验证证据等非阻断问题放入建议项。
126166
- 对发现的问题,尽量定位到文件路径并说明影响。
127167
- 如果信息不足,明确写“基于当前 diff/PR 描述无法确认”。
128168
"""

.github/workflows/pr-review.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,9 @@ jobs:
237237
OPENAI_BASE_URL: ${{ vars.OPENAI_BASE_URL }}
238238
OPENAI_MODEL: ${{ vars.OPENAI_MODEL }}
239239
AI_REVIEW_STRICT: ${{ vars.AI_REVIEW_STRICT || 'false' }}
240+
CI_SYNTAX_OK: ${{ needs.auto-check.outputs.syntax_ok || '' }}
241+
CI_HAS_PY_CHANGES: ${{ needs.auto-check.outputs.has_py_changes || 'false' }}
242+
CI_AUTO_CHECK_RESULT: ${{ needs.auto-check.result || '' }}
240243
run: python ../main-scripts/.github/scripts/ai_review.py
241244

242245
- name: 📤 上传审查结果

AGENTS.md

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131

3232
## 3. 验证矩阵
3333

34+
> **CI 覆盖原则**:本项目 CI 目前仅覆盖 Python 语法检查(`py_compile`)和致命 Flake8 错误(E9/F63/F7/F82)。对这两项,若 CI 已通过,PR 描述中可直接引用 CI 结果,无需重复贴本地输出。**`./scripts/ci_gate.sh` 不在 CI 覆盖范围内**;若该 gate 未执行,PR 描述须说明原因,否则缺失证据应在建议项中注明。
35+
3436
### Python 后端改动
3537

3638
适用范围:`main.py``src/``data_provider/``api/``bot/``tests/`
@@ -124,13 +126,28 @@ npm run build
124126
PR 默认按以下顺序审查:
125127

126128
1. 必要性:是否解决明确问题,是否避免无关改动
127-
2. 关联性:优先有 `Fixes #xxx``Refs #xxx`
129+
2. 关联性:优先使用 `Fixes #xxx``Refs #xxx`;自然语言关联(如"关联 issue 为 #xxx")也可接受,不作为阻断项
128130
3. 描述完整性:是否包含背景、范围、验证、风险、回滚
129131
4. 实现正确性:是否符合现有架构,是否存在明显回归风险
130132
5. 合入判定:是否具备直接合入条件
131133

132134
`fix` 类 PR,必须说明:原问题、根因、修复点、回归风险。
133135

136+
### 合入阻断条件(必须满足才能合入)
137+
138+
- 代码存在正确性或安全性问题(逻辑错误、异常吞没、安全漏洞等)
139+
- CI 检查未通过(语法检查、lint、构建失败等)
140+
- PR 描述与实际改动内容存在实质性矛盾(如声称更新了某文件但 diff 中没有)
141+
- 缺少回滚方案
142+
143+
### 建议条件(不阻断合入,但建议改进)
144+
145+
- issue 关联格式不规范(如自然语言关联而非 `Fixes/Refs #xxx`
146+
- 验证证据不完整但 CI 已通过对应检查
147+
- PR 描述中存在非关键性的措辞或格式问题
148+
- 注释语言风格不统一
149+
- 无关的锁文件或格式化变更(建议清理但不阻断)
150+
134151
评审输出模板:
135152

136153
- `必要性`:通过/不通过
@@ -139,7 +156,7 @@ PR 默认按以下顺序审查:
139156
- `description 完整性`:完整/不完整(缺失项)
140157
- `验证情况`:已验证/部分验证/未验证
141158
- `主要风险`:无 / 有(说明)
142-
- `是否可直接合入`:可/不可 + 必改项
159+
- `是否可直接合入`:可/不可 + 必改项(仅限阻断条件)
143160

144161
## 7. 发布规则摘要
145162

0 commit comments

Comments
 (0)