From 2905ed916c50bd748346db8472967e87e9227cd1 Mon Sep 17 00:00:00 2001 From: Wild Wind Date: Sat, 2 May 2026 01:11:37 -0700 Subject: [PATCH] Ignore empty approved followup placeholders --- src/coding_review_agent_loop/protocol.py | 6 ++++- tests/test_agent_loop.py | 31 ++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/coding_review_agent_loop/protocol.py b/src/coding_review_agent_loop/protocol.py index 1e6db2d..27f9688 100644 --- a/src/coding_review_agent_loop/protocol.py +++ b/src/coding_review_agent_loop/protocol.py @@ -18,6 +18,10 @@ HTML_COMMENT_RE = re.compile(r"^\s*\s*$") SIGNATURE_RE = re.compile(r"^\s*--\s+\S") BULLET_RE = re.compile(r"^\s*(?:[-*+]\s+|\d+[.)]\s+)(?P.+?)\s*$") +EMPTY_FOLLOWUP_RE = re.compile( + r"^(?:none|n/a|no follow[- ]?ups?|no same[- ]pr follow[- ]?ups?|no future follow[- ]?ups?)\.?$", + re.I, +) @dataclass(frozen=True) @@ -64,7 +68,7 @@ def parse_approved_followups(text: str, *, reviewer: str) -> ApprovedFollowups: def flush_current() -> None: if active is not None and current: item = " ".join(part.strip() for part in current if part.strip()).strip() - if item: + if item and not EMPTY_FOLLOWUP_RE.match(item): active.append(ApprovedFollowup(reviewer=reviewer, text=item)) current.clear() diff --git a/tests/test_agent_loop.py b/tests/test_agent_loop.py index ab717a0..6f31267 100644 --- a/tests/test_agent_loop.py +++ b/tests/test_agent_loop.py @@ -482,6 +482,37 @@ def test_parse_approved_followups_extracts_same_pr_and_future_independently(): ] +@pytest.mark.parametrize( + "placeholder", + [ + "None", + "none.", + "N/A", + "No follow-ups", + "No same-PR follow-ups.", + "No future follow-ups", + ], +) +def test_parse_approved_followups_ignores_empty_placeholders(placeholder): + review = f""" + LGTM. + + ### Same-PR follow-ups + - {placeholder} + + ### Future follow-ups + - {placeholder} + + + -- Google Gemini + """ + + followups = parse_approved_followups(review, reviewer="Gemini") + + assert followups.same_pr == () + assert followups.future == () + + @pytest.mark.parametrize("terminator", ["", "-- OpenAI Codex"]) def test_parse_non_blocking_followups_stops_at_final_markers(terminator): review = f"""