release_notes.py: guard against stale GitHub index when checking unresolved issues

The milestone filter endpoint can return issues whose milestone was already
removed, causing a false "unresolved issues" failure. Re-fetch each open
issue individually to verify its milestone is still set before blocking.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
diff --git a/dev-tools/release_notes.py b/dev-tools/release_notes.py
index 439d566..21fcda0 100755
--- a/dev-tools/release_notes.py
+++ b/dev-tools/release_notes.py
@@ -102,7 +102,18 @@
         print("No issues found for the specified milestone.", file=sys.stderr)
         sys.exit(1)
 
-    unresolved_issues = [issue for issue in issues if issue["state"] != "closed"]
+    def is_truly_open(issue):
+        if issue["state"] == "closed":
+            return False
+        # Re-fetch the issue directly to guard against stale index returning issues
+        # whose milestone was already removed (known GitHub API inconsistency)
+        url = f"{GITHUB_API_BASE_URL}/repos/{owner}/{repo}/issues/{issue['number']}"
+        r = requests.get(url, headers=headers)
+        if r.status_code != 200:
+            return True  # conservative: treat as unresolved if we can't verify
+        return r.json().get("milestone") is not None
+
+    unresolved_issues = [issue for issue in issues if is_truly_open(issue)]
     if unresolved_issues:
         print("The release is not completed since unresolved issues were found:", file=sys.stderr)
         for issue in unresolved_issues: