feat(ai_review): per-PR merge confidence 1-5 in header

This commit is contained in:
claude
2026-08-22 00:23:24 +00:00
parent 9dae850887
commit f3a125666b
2 changed files with 137 additions and 3 deletions
+78
View File
@@ -11,6 +11,7 @@ sys.path.insert(0, os.path.join(ROOT, "pilot"))
import ai_review # noqa: E402
from ai_review import ( # noqa: E402
_CONFIDENCE_BADGE,
_SEVERITY_EMOJI,
_balanced_json_substring,
_extract_first_json_object,
@@ -24,6 +25,7 @@ from ai_review import ( # noqa: E402
fmt_tokens,
format_review_body,
inline_comment_body,
merge_confidence,
parse_diff_anchors,
parse_findings,
parse_repo_config,
@@ -31,6 +33,7 @@ from ai_review import ( # noqa: E402
parse_text_blocks,
prior_review_bodies,
reviewed_shas,
REVIEW_HEADER,
SEVERITIES,
SEVERITY_RANK,
split_findings,
@@ -1821,3 +1824,78 @@ def test_parse_repo_config_compare_against_caps_at_12(monkeypatch):
assert "fake-model-13" not in cfg["compare_against"]
assert "bogus-extra" not in cfg["compare_against"]
# ---------------------------------------------------------------------------
# Task 6 — merge_confidence + REVIEW_HEADER confidence badge
# ---------------------------------------------------------------------------
def test_merge_confidence_clean_is_five():
assert merge_confidence([]) == 5
def test_merge_confidence_only_low_is_five():
f = {"severity": "low"}
assert merge_confidence([f, f, f]) == 5
def test_merge_confidence_medium_drops_one():
f = {"severity": "medium"}
assert merge_confidence([f]) == 4
def test_merge_confidence_high_drops_two():
f = {"severity": "high"}
assert merge_confidence([f]) == 3
def test_merge_confidence_critical_drops_to_one():
f = {"severity": "critical"}
assert merge_confidence([f]) == 1
def test_merge_confidence_multi_lens_drops_extra():
f = {"severity": "low", "_multi_lens": True}
assert merge_confidence([f]) == 4
def test_merge_confidence_clamped():
# Three critical findings must NOT take the score below 1.
f = {"severity": "critical"}
assert merge_confidence([f, f, f]) == 1
def test_review_header_includes_confidence():
# REVIEW_HEADER gains a {confidence} placeholder; verify the format works.
h = REVIEW_HEADER.format(model="glm-5.2:cloud", sha="abc1234567", confidence="3/5 🟡")
assert "Merge confidence: 3/5 🟡" in h
def test_confidence_badge_table_complete():
# Sanity-check the badge table the render layer reads from.
assert _CONFIDENCE_BADGE == {5: "🟢", 4: "🟢", 3: "🟡", 2: "🟠", 1: "🔴"}
def test_format_review_body_default_confidence_is_green():
# Default confidence kwarg should produce a green 5/5 badge in the header,
# matching the pre-existing "clean PR" semantics.
body = format_review_body("- [high] x:1 — bug", "glm-5.2:cloud", "abcdef1234567890")
assert "Merge confidence: 5/5 🟢" in body
def test_format_review_body_low_confidence_shows_red_badge():
body = format_review_body(
"- [critical] x:1 — bug", "glm-5.2:cloud", "abcdef1234567890",
confidence=1,
)
assert "Merge confidence: 1/5 🔴" in body
def test_format_review_body_confidence_clamps_out_of_range():
# Out-of-range confidence is clamped to [1, 5] in the badge string.
body_hi = format_review_body("- x", "glm-5.2:cloud", "abcdef1234567890", confidence=99)
assert "Merge confidence: 5/5 🟢" in body_hi
body_lo = format_review_body("- x", "glm-5.2:cloud", "abcdef1234567890", confidence=0)
assert "Merge confidence: 1/5 🔴" in body_lo