Skip to content

Commit 2d22e54

Browse files
committed
fix(cr-agent): PR#201二轮审查(_conclusion覆盖warnings桶+_bounded_int参数收紧)
Critical(static_review stdin)=误判, 未改动: 当前 static_review.py main() 已是 diff_content=sys.stdin.read() 正确读 diff, 全目录 grep file_list_input/file_paths 零匹配, reviewer 引用代码不存在(版本差异). test_static_review_script_executable(input=diff) 通过, returncode=0 且输出含 findings. 2 Warning: - _conclusion 只检查 findings 桶, 遗漏 warnings 桶(HIGH confidence=0.75 进 warnings 只得 needs_human_review) → 覆盖 findings+warnings 两桶 - _bounded_int env未设置返回 default(timeout参数) 未收紧, 调用方可绕过上限 → 返回 min(default, max_val) 加测试: test_11_conclusion_warnings_bucket_high + test_bounded_int_default_capped_to_max 验证: flake8 全绿 + 192 测试全过
1 parent fa8b04c commit 2d22e54

4 files changed

Lines changed: 42 additions & 4 deletions

File tree

examples/skills_code_review_agent/agent/pipeline.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,12 @@ def _conclusion(findings, warnings, needs_review, decisions, sandbox_runs) -> st
5050
4. 都无 → approve
5151
"""
5252
# 1. 有 critical/high finding → changes_requested (最高优先级)
53-
for finding in findings:
54-
if finding.severity in [Severity.CRITICAL, Severity.HIGH]:
55-
return "changes_requested"
53+
# Warning 修复: 覆盖 findings + warnings 两桶,避免高危安全问题(如 SEC008 SSRF
54+
# confidence=0.75 进 warnings 桶)只得出 needs_human_review 而非 changes_requested
55+
for bucket in (findings, warnings):
56+
for finding in bucket:
57+
if finding.severity in [Severity.CRITICAL, Severity.HIGH]:
58+
return "changes_requested"
5659

5760
# 2. 有 warnings 或 filter block → needs_human_review
5861
if warnings:

examples/skills_code_review_agent/sandbox/container.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ def _bounded_int(env_name: str, default: int, max_val: int) -> int:
4343
"""
4444
value = os.getenv(env_name)
4545
if value is None:
46-
return default
46+
# env 未设置:返回 default,但单向收紧到 max_val(防止调用方参数绕过上限)
47+
return min(default, max_val)
4748

4849
try:
4950
int_value = int(value)

examples/skills_code_review_agent/tests/test_pipeline.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,31 @@ def test_10_conclusion_derivation_rules(self):
317317
report4 = run_review(diff_clean, "test", "fake", True, False)
318318
self.assertEqual(report4.conclusion, "approve", "无问题应该 → approve")
319319

320+
def test_11_conclusion_warnings_bucket_high_severity(self):
321+
"""测试11: warnings 桶中 HIGH 严重级别 finding → changes_requested(修复 _conclusion 遗漏 warnings 桶)"""
322+
from agent.pipeline import _conclusion
323+
from agent.models import Finding
324+
325+
# 构造 HIGH severity、低置信度(0.75)的 finding(会被路由到 warnings 桶,如 SEC008 SSRF)
326+
high_in_warnings = Finding(
327+
severity=Severity.HIGH,
328+
category="security",
329+
file="test.py",
330+
line=10,
331+
title="SSRF",
332+
evidence="requests.get(user_url)",
333+
recommendation="校验/白名单 URL",
334+
confidence=0.75,
335+
source="rule",
336+
rule_id="SEC008",
337+
bucket=Bucket.WARNINGS,
338+
)
339+
340+
# warnings 桶有 HIGH → 应 changes_requested(修复前会走到 needs_human_review)
341+
conclusion = _conclusion([], [high_in_warnings], [], [], [])
342+
self.assertEqual(conclusion, "changes_requested",
343+
"warnings 桶的 HIGH severity 应 → changes_requested,而非 needs_human_review")
344+
320345

321346
if __name__ == "__main__":
322347
unittest.main()

examples/skills_code_review_agent/tests/test_sandbox.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,15 @@ def test_bounded_int_exceeds_max_raises(self):
192192
with pytest.raises(ValueError, match="TEST_VAR 不能超过 60"):
193193
_bounded_int("TEST_VAR", 30, 60)
194194

195+
def test_bounded_int_default_capped_to_max(self):
196+
"""测试 env 未设置时 default 超过 max_val 被收紧(防止调用方参数绕过上限)。"""
197+
from sandbox.container import _bounded_int
198+
199+
with patch.dict(os.environ, {}, clear=True):
200+
# env 未设置,default=100 > max=60 → 单向收紧到 60(修复参数绕过)
201+
result = _bounded_int("TEST_VAR", 100, 60)
202+
assert result == 60
203+
195204

196205
class TestContainerSandbox:
197206
"""测试 ContainerSandbox 的 Docker 容器执行。"""

0 commit comments

Comments
 (0)