From be4d8ec9722f3f1aa76b2ddb9ae2922321c511d0 Mon Sep 17 00:00:00 2001 From: mateo-berri <277851410+mateo-berri@users.noreply.github.com> Date: Tue, 19 May 2026 01:58:23 +0000 Subject: [PATCH] =?UTF-8?q?fix(pr-gate):=20greptile=20=E2=80=94=20exclude?= =?UTF-8?q?=20npm=20pre-release=20tags=20from=20version=20resolver?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pre-release versions (e.g. 1.0.0-alpha.1, 2.2.0-rc.1) could otherwise win the newest-by-publish-time selection if a stable release fell inside the 3-day buffer, switching the merge-blocking PR gate to an unstable Claude Code CLI. --- .../test_pr_gate_version_resolver.py | 25 +++++++++++++++++++ tests/claude_code/pr_gate_version_resolver.py | 2 ++ 2 files changed, 27 insertions(+) diff --git a/tests/claude_code/_pr_gate_unit_tests/test_pr_gate_version_resolver.py b/tests/claude_code/_pr_gate_unit_tests/test_pr_gate_version_resolver.py index 2daf418f9b0..7ee6ffe5d8c 100644 --- a/tests/claude_code/_pr_gate_unit_tests/test_pr_gate_version_resolver.py +++ b/tests/claude_code/_pr_gate_unit_tests/test_pr_gate_version_resolver.py @@ -127,6 +127,31 @@ def test_uses_custom_min_age(): assert out == "0.9.0" +def test_excludes_prerelease_versions(): + """Pre-release tags (1.0.0-alpha.1, 2.0.0-rc.1, etc.) must never win, + even if their publish timestamp is the newest eligible one.""" + metadata = _metadata_with_times( + { + "2.1.119": _t("2026-04-21T10:00:00.000Z"), # stable, 4d old + "2.2.0-alpha.1": _t("2026-04-22T10:00:00.000Z"), # newer publish + "2.2.0-rc.1": _t("2026-04-22T11:00:00.000Z"), # newest publish + "3.0.0-beta": _t("2026-04-22T12:00:00.000Z"), # newest publish + } + ) + assert resolve_pr_gate_version(metadata=metadata, as_of=NOW) == "2.1.119" + + +def test_raises_when_only_prereleases_are_eligible(): + metadata = _metadata_with_times( + { + "2.2.0-alpha.1": _t("2026-04-22T10:00:00.000Z"), + "2.2.0-rc.1": _t("2026-04-22T11:00:00.000Z"), + } + ) + with pytest.raises(NoEligibleVersionError): + resolve_pr_gate_version(metadata=metadata, as_of=NOW) + + def test_resolver_uses_fetcher_when_metadata_not_provided(): captured = {} diff --git a/tests/claude_code/pr_gate_version_resolver.py b/tests/claude_code/pr_gate_version_resolver.py index 25baaaf2b11..c531cdc9683 100644 --- a/tests/claude_code/pr_gate_version_resolver.py +++ b/tests/claude_code/pr_gate_version_resolver.py @@ -111,6 +111,8 @@ def resolve_pr_gate_version( continue if not isinstance(raw_ts, str): continue + if "-" in version: + continue published = _parse_npm_timestamp(raw_ts) if published <= cutoff: eligible.append((published, version))