From eaf58bb8d427e3c7444c72bc380f1857d0e8e1f1 Mon Sep 17 00:00:00 2001 From: "Molecule AI Dev Engineer A (Kimi)" Date: Mon, 25 May 2026 00:31:54 +0000 Subject: [PATCH 1/7] style(tests): fix ruff F401, F541, F841, E741 in 10 files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cleans up 22 ruff lint errors discovered by `ruff check --select=E,W,F`: - F401 unused imports: json, sys, mock, textwrap (8 test files) - F541 f-strings without placeholders: check_migration_collisions.py - F841 unused variables: e, posted, old_title, per_context_iterated_for - E741 ambiguous variable name `l` → `ln` in test_main_red_watchdog.py All changes are test/script only; no production code affected. Co-Authored-By: Claude Opus 4.7 --- local-e2e/cp_sim/canary/test_layer_diagnostics.py | 2 +- scripts/ops/check_migration_collisions.py | 4 ++-- tests/test_ci_required_drift.py | 2 -- tests/test_lint_bp_context_emit_match.py | 4 +--- tests/test_lint_continue_on_error_tracking.py | 2 -- tests/test_lint_mask_pr_atomicity.py | 3 --- tests/test_lint_required_context_exists_in_bp.py | 2 -- tests/test_lint_required_no_paths.py | 2 -- tests/test_main_red_watchdog.py | 4 +--- tests/test_status_reaper.py | 2 -- 10 files changed, 5 insertions(+), 22 deletions(-) diff --git a/local-e2e/cp_sim/canary/test_layer_diagnostics.py b/local-e2e/cp_sim/canary/test_layer_diagnostics.py index b6cc46d74..86c5347a6 100644 --- a/local-e2e/cp_sim/canary/test_layer_diagnostics.py +++ b/local-e2e/cp_sim/canary/test_layer_diagnostics.py @@ -70,7 +70,7 @@ def test_diag_memory_root_writable_in_canary_mode(sim: CPSim) -> None: key = f"canary-probe-{uuid.uuid4().hex[:8]}" try: val = sim.probe_memory(key) - except Exception as e: + except Exception: # /mcp may not be exposed on this template — canary 4 will # surface the real defect if memory is actually broken. if os.environ.get("CANARY_STRICT_MCP") == "1": diff --git a/scripts/ops/check_migration_collisions.py b/scripts/ops/check_migration_collisions.py index f98eb26af..03c856608 100755 --- a/scripts/ops/check_migration_collisions.py +++ b/scripts/ops/check_migration_collisions.py @@ -281,8 +281,8 @@ def main() -> int: for prefix, peers in sorted(open_pr_collisions.items()): peer_str = ", ".join(f"#{p['number']} ({p['headRefName']})" for p in peers) print(f"::error::migration prefix {prefix:03d} also claimed by open PR(s): {peer_str}") - print(f"::error::rebase coordination needed — only one PR can land a given prefix; " - f"renumber yours or theirs") + print("::error::rebase coordination needed — only one PR can land a given prefix; " + "renumber yours or theirs") return 1 diff --git a/tests/test_ci_required_drift.py b/tests/test_ci_required_drift.py index bbbf645f2..e2c097c2c 100644 --- a/tests/test_ci_required_drift.py +++ b/tests/test_ci_required_drift.py @@ -18,9 +18,7 @@ No network. No live Gitea calls. from __future__ import annotations import importlib.util -import json import os -import sys import textwrap from pathlib import Path from unittest import mock diff --git a/tests/test_lint_bp_context_emit_match.py b/tests/test_lint_bp_context_emit_match.py index c960b7ac2..b47e2f45b 100644 --- a/tests/test_lint_bp_context_emit_match.py +++ b/tests/test_lint_bp_context_emit_match.py @@ -55,9 +55,7 @@ from __future__ import annotations import importlib.util import os -import sys from pathlib import Path -from unittest import mock import pytest @@ -164,7 +162,7 @@ def test_bp_orphan_context_fails(envset, monkeypatch, capsys): " all-required:\n runs-on: x\n steps:\n - run: echo hi\n", ) m = _import_lint() - posted = _stub_api( + _stub_api( monkeypatch, m, ("ok", {"status_check_contexts": [ diff --git a/tests/test_lint_continue_on_error_tracking.py b/tests/test_lint_continue_on_error_tracking.py index 59359d657..f7e4df0b7 100644 --- a/tests/test_lint_continue_on_error_tracking.py +++ b/tests/test_lint_continue_on_error_tracking.py @@ -60,10 +60,8 @@ from __future__ import annotations import importlib.util import os -import sys from datetime import datetime, timedelta, timezone from pathlib import Path -from unittest import mock import pytest diff --git a/tests/test_lint_mask_pr_atomicity.py b/tests/test_lint_mask_pr_atomicity.py index 2ec8546d0..18f01896d 100644 --- a/tests/test_lint_mask_pr_atomicity.py +++ b/tests/test_lint_mask_pr_atomicity.py @@ -53,10 +53,7 @@ from __future__ import annotations import importlib.util import os import subprocess -import sys -import textwrap from pathlib import Path -from unittest import mock import pytest diff --git a/tests/test_lint_required_context_exists_in_bp.py b/tests/test_lint_required_context_exists_in_bp.py index c03cd20a2..4bbefdf92 100644 --- a/tests/test_lint_required_context_exists_in_bp.py +++ b/tests/test_lint_required_context_exists_in_bp.py @@ -61,9 +61,7 @@ from __future__ import annotations import importlib.util import os import subprocess -import sys from pathlib import Path -from unittest import mock import pytest diff --git a/tests/test_lint_required_no_paths.py b/tests/test_lint_required_no_paths.py index ff2764fed..8471a49ae 100644 --- a/tests/test_lint_required_no_paths.py +++ b/tests/test_lint_required_no_paths.py @@ -38,9 +38,7 @@ from __future__ import annotations import importlib.util import os -import sys from pathlib import Path -from unittest import mock import pytest diff --git a/tests/test_main_red_watchdog.py b/tests/test_main_red_watchdog.py index 0093fc871..b469925ce 100644 --- a/tests/test_main_red_watchdog.py +++ b/tests/test_main_red_watchdog.py @@ -37,7 +37,6 @@ from __future__ import annotations import importlib.util import json import os -import sys import urllib.error from pathlib import Path from unittest import mock @@ -542,7 +541,6 @@ def test_auto_close_skips_when_main_pending(wd_module, monkeypatch): """main pending (CI still running) at NEW_SHA → leave old issue alone. Pending could resolve to red, so closing prematurely would lose the breadcrumb of the prior red.""" - old_title = f"[main-red] owner/repo: {SHA_RED[:10]}" stub = _make_stub_api({ ("GET", "/repos/owner/repo/branches/main"): (200, _branches_response(SHA_GREEN)), ("GET", f"/repos/owner/repo/commits/{SHA_GREEN}/status"): ( @@ -790,7 +788,7 @@ def test_emit_loki_event_prints_json_line(wd_module, capsys, monkeypatch): captured = capsys.readouterr() assert "main-red-watchdog event:" in captured.out # Find the JSON payload after the prefix and verify it parses - line = [l for l in captured.out.splitlines() if "main-red-watchdog event:" in l][0] + line = [ln for ln in captured.out.splitlines() if "main-red-watchdog event:" in ln][0] payload = json.loads(line.split("main-red-watchdog event:", 1)[1].strip()) assert payload["event_type"] == "main_red_detected" assert payload["repo"] == "owner/repo" diff --git a/tests/test_status_reaper.py b/tests/test_status_reaper.py index fa57f36a0..7449545e4 100644 --- a/tests/test_status_reaper.py +++ b/tests/test_status_reaper.py @@ -40,7 +40,6 @@ Dependencies: stdlib + pytest + PyYAML. No network. from __future__ import annotations import importlib.util -import json import os import sys from pathlib import Path @@ -853,7 +852,6 @@ def test_reap_skips_combined_success_shas(sr_module, monkeypatch): Mock 2 SHAs with combined=success + 1 with combined=failure → only the failure-SHA's statuses get the per-context loop applied. """ - per_context_iterated_for: list[str] = [] posts: list[tuple[str, dict]] = [] failure_statuses = [ -- 2.52.0 From 57adcaae5f4798ca05e84f5bd2947e6a83a5dc3d Mon Sep 17 00:00:00 2001 From: "Molecule AI Dev Engineer A (Kimi)" Date: Mon, 25 May 2026 00:59:46 +0000 Subject: [PATCH 2/7] style(ci): fix E501 line too long in ci-required-drift.py Break two over-long strings using implicit concatenation. Co-Authored-By: Claude Opus 4.7 --- .gitea/scripts/ci-required-drift.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.gitea/scripts/ci-required-drift.py b/.gitea/scripts/ci-required-drift.py index 8de6de46c..29d225518 100755 --- a/.gitea/scripts/ci-required-drift.py +++ b/.gitea/scripts/ci-required-drift.py @@ -274,7 +274,8 @@ def required_checks_env(audit_doc: dict) -> set[str]: found.append(v) if not found: sys.stderr.write( - f"::error::REQUIRED_CHECKS env not found in any step of {AUDIT_WORKFLOW_PATH}\n" + f"::error::REQUIRED_CHECKS env not found in any step of " + f"{AUDIT_WORKFLOW_PATH}\n" ) sys.exit(3) if len(found) > 1: @@ -387,7 +388,8 @@ def detect_drift(branch: str) -> tuple[list[str], dict]: missing_from_needs = sorted(jobs - needs) if missing_from_needs: findings.append( - "F1 — jobs in ci.yml NOT under sentinel `needs:` (sentinel doesn't gate them):\n" + "F1 — jobs in ci.yml NOT under sentinel `needs:` " + "(sentinel doesn't gate them):\n" + "\n".join(f" - {n}" for n in missing_from_needs) ) -- 2.52.0 From 5088a7273c543d4edb4df542422344e7fb14f129 Mon Sep 17 00:00:00 2001 From: "Molecule AI Dev Engineer A (Kimi)" Date: Mon, 25 May 2026 01:02:01 +0000 Subject: [PATCH 3/7] style(scripts): fix ruff F401, F541, F841, E741 in 6 more files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ci-required-drift.py: 4× F541 f-strings without placeholders - lint-curl-status-capture.py: F401 unused sys import - lint_bp_context_emit_match.py: E741 ambiguous variable l - lint_continue_on_error_tracking.py: F401 unused timedelta import - sop-checklist.py: F841 unused rejected_unknown, 2× E741 ambiguous l - tests/_review_check_fixture.py: 3× F841 unused variables - tests/test_lint_pre_flip_continue_on_error.py: F401 unused os import - tests/test_sop_checklist.py: F401 unused tempfile import Co-Authored-By: Claude Opus 4.7 --- .gitea/scripts/ci-required-drift.py | 8 ++++---- .gitea/scripts/lint-curl-status-capture.py | 1 - .gitea/scripts/lint_bp_context_emit_match.py | 2 +- .gitea/scripts/lint_continue_on_error_tracking.py | 2 +- .gitea/scripts/sop-checklist.py | 5 ++--- .gitea/scripts/tests/_review_check_fixture.py | 4 ++-- .../scripts/tests/test_lint_pre_flip_continue_on_error.py | 1 - .gitea/scripts/tests/test_sop_checklist.py | 1 - 8 files changed, 10 insertions(+), 14 deletions(-) diff --git a/.gitea/scripts/ci-required-drift.py b/.gitea/scripts/ci-required-drift.py index 29d225518..241787e56 100755 --- a/.gitea/scripts/ci-required-drift.py +++ b/.gitea/scripts/ci-required-drift.py @@ -549,12 +549,12 @@ def file_or_update( if dry_run: print(f"::notice::[dry-run] would file/update drift issue for {branch}") - print(f"::group::[dry-run] title") + print("::group::[dry-run] title") print(title) - print(f"::endgroup::") - print(f"::group::[dry-run] body") + print("::endgroup::") + print("::group::[dry-run] body") print(body) - print(f"::endgroup::") + print("::endgroup::") return existing = find_open_issue(title) diff --git a/.gitea/scripts/lint-curl-status-capture.py b/.gitea/scripts/lint-curl-status-capture.py index 73cbbab51..706be053a 100644 --- a/.gitea/scripts/lint-curl-status-capture.py +++ b/.gitea/scripts/lint-curl-status-capture.py @@ -13,7 +13,6 @@ from __future__ import annotations import argparse import glob import re -import sys from pathlib import Path from typing import NamedTuple diff --git a/.gitea/scripts/lint_bp_context_emit_match.py b/.gitea/scripts/lint_bp_context_emit_match.py index 59453f66e..7651c90a4 100644 --- a/.gitea/scripts/lint_bp_context_emit_match.py +++ b/.gitea/scripts/lint_bp_context_emit_match.py @@ -283,7 +283,7 @@ def _ensure_labels(repo: str, names: list[str]) -> list[int]: if status != "ok" or not isinstance(labels, list): return [] out: list[int] = [] - by_name = {l["name"]: l["id"] for l in labels if isinstance(l, dict)} + by_name = {label["name"]: label["id"] for label in labels if isinstance(label, dict)} for n in names: if n in by_name: out.append(by_name[n]) diff --git a/.gitea/scripts/lint_continue_on_error_tracking.py b/.gitea/scripts/lint_continue_on_error_tracking.py index afb1fcaee..5c56be554 100644 --- a/.gitea/scripts/lint_continue_on_error_tracking.py +++ b/.gitea/scripts/lint_continue_on_error_tracking.py @@ -82,7 +82,7 @@ import sys import urllib.error import urllib.parse import urllib.request -from datetime import datetime, timedelta, timezone +from datetime import datetime, timezone from pathlib import Path from typing import Any diff --git a/.gitea/scripts/sop-checklist.py b/.gitea/scripts/sop-checklist.py index b476ff8f8..eaa05e4ad 100644 --- a/.gitea/scripts/sop-checklist.py +++ b/.gitea/scripts/sop-checklist.py @@ -338,7 +338,6 @@ def compute_ack_state( # Filter out self-acks and unknown slugs. ackers_per_slug: dict[str, list[str]] = {s: [] for s in items_by_slug} rejected_self: dict[str, list[str]] = {s: [] for s in items_by_slug} - rejected_unknown: dict[str, list[str]] = {s: [] for s in items_by_slug} pending_team_check: dict[str, list[str]] = {s: [] for s in items_by_slug} for (user, slug), kind in latest_directive.items(): @@ -842,7 +841,7 @@ def render_status( def get_tier_mode(pr: dict[str, Any], cfg: dict[str, Any]) -> str: """Read tier label, return 'hard' or 'soft' per cfg.tier_failure_mode.""" labels = pr.get("labels") or [] - tier_labels = [l.get("name", "") for l in labels if (l.get("name", "") or "").startswith("tier:")] + tier_labels = [label.get("name", "") for label in labels if (label.get("name", "") or "").startswith("tier:")] mode_map = cfg.get("tier_failure_mode") or {} default_mode = cfg.get("default_mode", "hard") for tl in tier_labels: @@ -865,7 +864,7 @@ def is_high_risk(pr: dict[str, Any], cfg: dict[str, Any]) -> bool: Governance fix for internal#442 — closes the inconsistency between sop-tier-check (tier-aware) and sop-checklist (was tier-blind). """ - label_set = {(l.get("name") or "") for l in (pr.get("labels") or [])} + label_set = {(label.get("name") or "") for label in (pr.get("labels") or [])} if "tier:high" in label_set: return True high_risk_labels = set(cfg.get("high_risk_labels") or []) diff --git a/.gitea/scripts/tests/_review_check_fixture.py b/.gitea/scripts/tests/_review_check_fixture.py index 1a76bac8f..a91821ec0 100644 --- a/.gitea/scripts/tests/_review_check_fixture.py +++ b/.gitea/scripts/tests/_review_check_fixture.py @@ -81,7 +81,7 @@ class Handler(http.server.BaseHTTPRequestHandler): # GET /repos/{owner}/{name}/pulls/{pr_number} m = re.match(r"^/api/v1/repos/([^/]+)/([^/]+)/pulls/(\d+)$", path) if m: - owner, name, pr_num = m.group(1), m.group(2), m.group(3) + pr_num = m.group(3) if sc == "T2_pr_closed": return self._json(200, { "number": int(pr_num), @@ -151,7 +151,7 @@ class Handler(http.server.BaseHTTPRequestHandler): # GET /teams/{team_id}/members/{username} m = re.match(r"^/api/v1/teams/(\d+)/members/([^/]+)$", path) if m: - team_id, login = m.group(1), m.group(2) + login = m.group(2) if sc == "T8_team_not_member": return self._empty(404) if sc == "T9_team_403": diff --git a/.gitea/scripts/tests/test_lint_pre_flip_continue_on_error.py b/.gitea/scripts/tests/test_lint_pre_flip_continue_on_error.py index df86a8c68..333fb814a 100644 --- a/.gitea/scripts/tests/test_lint_pre_flip_continue_on_error.py +++ b/.gitea/scripts/tests/test_lint_pre_flip_continue_on_error.py @@ -15,7 +15,6 @@ Mirrors the pattern in scripts/ops/test_check_migration_collisions.py from __future__ import annotations import importlib.util -import os import sys import unittest from pathlib import Path diff --git a/.gitea/scripts/tests/test_sop_checklist.py b/.gitea/scripts/tests/test_sop_checklist.py index 10925e2db..3ac2c1321 100644 --- a/.gitea/scripts/tests/test_sop_checklist.py +++ b/.gitea/scripts/tests/test_sop_checklist.py @@ -22,7 +22,6 @@ from __future__ import annotations import os import sys -import tempfile import unittest # Resolve sibling script regardless of where pytest is invoked from. -- 2.52.0 From a120c86756d37402292f79c862a2c89dc9337b24 Mon Sep 17 00:00:00 2001 From: "Molecule AI Dev Engineer A (Kimi)" Date: Mon, 25 May 2026 01:02:51 +0000 Subject: [PATCH 4/7] style(tools): fix ruff F401 and E741 in gate_check.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove unused imports (time, Any, Optional) and rename ambiguous variable l → role_login. Co-Authored-By: Claude Opus 4.7 --- tools/gate-check-v3/gate_check.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/tools/gate-check-v3/gate_check.py b/tools/gate-check-v3/gate_check.py index 729cf277c..b57270e54 100644 --- a/tools/gate-check-v3/gate_check.py +++ b/tools/gate-check-v3/gate_check.py @@ -23,11 +23,9 @@ import json import os import re import sys -import time import urllib.request import urllib.error from datetime import datetime, timezone -from typing import Any, Optional # ── Gitea API client ──────────────────────────────────────────────────────── @@ -160,9 +158,9 @@ def signal_1_comment_scan(pr_number: int, repo: str) -> dict: # Build reverse map: login -> (group, agent_key) login_to_group = {} for group, login in relevant_roles.items(): - for role, l in AGENT_LOGIN_MAP.items(): - if l == login: - login_to_group[l] = (group, f"core-{role}") + for role, role_login in AGENT_LOGIN_MAP.items(): + if role_login == login: + login_to_group[role_login] = (group, f"core-{role}") # Collect all agent-tag matches from comments comments = [] -- 2.52.0 From 054ca2f552ddca48658a846bf9b9f6381809ae59 Mon Sep 17 00:00:00 2001 From: "Molecule AI Dev Engineer A (Kimi)" Date: Mon, 25 May 2026 01:38:07 +0000 Subject: [PATCH 5/7] style(scripts): fix remaining E501 line too long in ci-required-drift.py 4 locations missed in prior commit c326cad2. Co-Authored-By: Claude Opus 4.7 --- .gitea/scripts/ci-required-drift.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/.gitea/scripts/ci-required-drift.py b/.gitea/scripts/ci-required-drift.py index 241787e56..7b89a144c 100755 --- a/.gitea/scripts/ci-required-drift.py +++ b/.gitea/scripts/ci-required-drift.py @@ -399,7 +399,8 @@ def detect_drift(branch: str) -> tuple[list[str], dict]: stale_needs = sorted(needs - jobs_all) if stale_needs: findings.append( - "F1b — sentinel `needs:` lists jobs NOT present in ci.yml (typo or removed job):\n" + "F1b — sentinel `needs:` lists jobs NOT present in ci.yml " + "(typo or removed job):\n" + "\n".join(f" - {n}" for n in stale_needs) ) @@ -407,7 +408,9 @@ def detect_drift(branch: str) -> tuple[list[str], dict]: # Compute the contexts the CI YAML actually produces. The sentinel # is in (B) intentionally (`ci / all-required (pull_request)`); we # whitelist it explicitly. - emitted_contexts = {expected_context(j) for j in jobs} | {expected_context(SENTINEL_JOB)} + emitted_contexts = { + expected_context(j) for j in jobs + } | {expected_context(SENTINEL_JOB)} # Contexts NOT produced by ci.yml may still come from other # workflows in the repo (Secret scan etc). We can't enumerate # every workflow's emissions cheaply; instead, flag only contexts @@ -420,8 +423,9 @@ def detect_drift(branch: str) -> tuple[list[str], dict]: ) if stale_protection: findings.append( - "F2 — protection `status_check_contexts` entries with `ci / ` prefix that NO " - "job in ci.yml emits (stale name → silent advisory gate):\n" + "F2 — protection `status_check_contexts` entries with `ci / ` " + "prefix that NO job in ci.yml emits " + "(stale name → silent advisory gate):\n" + "\n".join(f" - {c}" for c in stale_protection) ) @@ -496,7 +500,8 @@ def render_body(branch: str, findings: list[str], debug: dict) -> str: f"# Drift detected on `{REPO}/{branch}`", "", "Auto-filed by `.gitea/workflows/ci-required-drift.yml` " - "(RFC [internal#219](https://git.moleculesai.app/molecule-ai/internal/issues/219) §4 + §6).", + "(RFC [internal#219]" + "(https://git.moleculesai.app/molecule-ai/internal/issues/219) §4 + §6).", "", "## Findings", "", -- 2.52.0 From 6f230fba38bf3729afd9848ee64d618319fec0d4 Mon Sep 17 00:00:00 2001 From: "Molecule AI Dev Engineer A (Kimi)" Date: Mon, 25 May 2026 01:51:06 +0000 Subject: [PATCH 6/7] style(scripts): fix E501 line too long in detect-changes.py and gitea-merge-queue.py Co-Authored-By: Claude Opus 4.7 --- .gitea/scripts/detect-changes.py | 5 ++++- .gitea/scripts/gitea-merge-queue.py | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.gitea/scripts/detect-changes.py b/.gitea/scripts/detect-changes.py index f436b03c3..1c51c2342 100644 --- a/.gitea/scripts/detect-changes.py +++ b/.gitea/scripts/detect-changes.py @@ -153,7 +153,10 @@ def parse_args(argv: list[str]) -> argparse.Namespace: parser.add_argument("--event-name", default=os.environ.get("GITHUB_EVENT_NAME", "")) parser.add_argument("--pr-base-sha", default="") parser.add_argument("--base-ref", default="") - parser.add_argument("--push-before", default=os.environ.get("GITHUB_EVENT_BEFORE", "")) + parser.add_argument( + "--push-before", + default=os.environ.get("GITHUB_EVENT_BEFORE", ""), + ) return parser.parse_args(argv) diff --git a/.gitea/scripts/gitea-merge-queue.py b/.gitea/scripts/gitea-merge-queue.py index 964d8aa26..17c3d318e 100644 --- a/.gitea/scripts/gitea-merge-queue.py +++ b/.gitea/scripts/gitea-merge-queue.py @@ -183,7 +183,9 @@ def required_contexts_green( status = latest_statuses.get(context) state = status_state(status or {}) if state != "success": - if pr_labels and _is_tier_low_pending_ok(latest_statuses, context, pr_labels): + if pr_labels and _is_tier_low_pending_ok( + latest_statuses, context, pr_labels + ): continue # tier:low soft-fail: accept pending sop-checklist missing_or_bad.append(f"{context}={state or 'missing'}") return not missing_or_bad, missing_or_bad -- 2.52.0 From 6c6a070bc69f3ff96d602e8bfcdcc7edac8083fc Mon Sep 17 00:00:00 2001 From: "Molecule AI Dev Engineer A (Kimi)" Date: Mon, 25 May 2026 22:20:24 +0000 Subject: [PATCH 7/7] chore: re-trigger CI after stale status cleanup -- 2.52.0