diff --git a/.github/scripts/check-pr-description.js b/.github/scripts/check-pr-description.js index 2e60be574..d817d453a 100644 --- a/.github/scripts/check-pr-description.js +++ b/.github/scripts/check-pr-description.js @@ -96,7 +96,11 @@ module.exports = async ({ github, context, core }) => { const appRan = /- \[x\]\s+I actually ran the app\b/i.test(body); const appNotRun = /- \[x\]\s+I did not run the app\/runtime validation\b/i.test(body); - const screenshotChecked = /- \[x\]\s+\*\*Screenshot or short clip\*\*/i.test(body); + // Anchor on the wording, not the template's emphasis: a ticked box the author + // retyped without the surrounding ** renders identically on the PR page, so + // treating it as unchecked is invisible from their side. Matches the two + // attestations above, which already ignore formatting. + const screenshotChecked = /- \[x\]\s+[*_]{0,2}Screenshot or short clip[*_]{0,2}/i.test(body); const screenshotSection = section('Screenshots / clips'); const hasVisualEvidence = /!\[[^\]]*\]\([^)]+\)|<(?:img|video|source)\b[^>]*(?:src|href)=|https?:\/\/[^\s)]+/i.test(screenshotSection); const evidenceGaps = []; diff --git a/tests/test_pr_description_check.py b/tests/test_pr_description_check.py index b8413b4d6..399095787 100644 --- a/tests/test_pr_description_check.py +++ b/tests/test_pr_description_check.py @@ -169,6 +169,20 @@ def test_ui_checkbox_without_media_still_needs_visual_evidence(): assert not any(call["method"] == "setFailed" for call in calls) +def test_ticked_screenshot_box_counts_without_the_template_bolding(): + body = _body( + app_ran=True, + screenshot=True, + media="https://github.com/user-attachments/assets/example", + ).replace("**Screenshot or short clip**", "Screenshot or short clip") + + calls = _run_checker(["static/js/example.js"], body) + + assert _added_labels(calls) == {"ready for review"} + assert not _comment(calls) + assert not any(call["method"] == "setFailed" for call in calls) + + def test_explicit_not_run_is_honest_but_not_ready(): calls = _run_checker( ["services/example.py"],