From cc42f38a892ee0f73bb5a76716d69dbcfdfb5fc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o?= Date: Sun, 16 Aug 2026 17:26:08 +0200 Subject: [PATCH] fix(ci): match the screenshot checkbox by wording, not emphasis (#6073) The PR-description check folded the template's asterisks into the pattern, so a ticked box written without them read as unchecked while rendering identically on the PR page. `ready for review` was silently withheld and the bot reported missing visual evidence even with screenshots attached, with no way to tell from the rendered PR what was wrong. The two attestations directly above it already anchor on the wording alone. This one now does the same, accepting `**bold**`, `*italic*`, `__underscores__` and plain text. Fixes #6071 --- .github/scripts/check-pr-description.js | 6 +++++- tests/test_pr_description_check.py | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) 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"],