Repository navigation
Hold a Rollup of Only Unreadable Nodes as an Empty One - #3632
Conversation
`held_checks_open` and `checks_never_ran` read an empty rollup as `not nodes`, so a rollup holding only nodes of a type the reader cannot parse released a BLOCKED, BEHIND, or DRAFT merge and exited 0 under DIRTY. Both now count readable checks through `checks_tally`, and the DIRTY release names the unread types. The `wait` help and `scripts/README.md` say so. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The `wait` help's exit-45 and exit-0 paragraphs and the CHECKS_PENDING status line now say a rollup of only unreadable types is read as having no check posted. The DIRTY release names each unread type once, as the digest does, and the README's exit-45 row is split under the sentence bound. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`checks_unread` now returns each unread typename once, sorted, so the DIRTY release and the CHECKS PARTIALLY UNREAD line share one form rather than each deduping. The `wait` help and status line name the reader as "this", in present tense, and the exit-45 paragraph is split under the sentence bound. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
A recorded local strict-review pass covers head |
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars.
|
Splitting the exit-45 sentence dropped "Either", so the payload case read as true of every exit 45. The paragraph now names each case as one of three, the form scripts/README.md uses. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
A recorded local strict-review pass covers head |
There was a problem hiding this comment.
🟡 Changes recommended
Two active nit-level issues remain: the exit-code help is ambiguous, and the sorted-order contract lacks a regression test covering multiple typenames.
2 open issues
What changed in this PR
This pull request makes rollups containing only unreadable GraphQL node types behave like empty rollups during held-merge evaluation and wait, while aligning diagnostics, documentation, and regression coverage.
Changes:
- Counts only readable checks when evaluating rollup state.
- Deduplicates and sorts unreadable typename reporting.
- Updates status output, help text, and README documentation.
- Adds end-to-end and unit coverage for unreadable-only rollups.
| File | Review findings |
|---|---|
tests/test_pr_review.py |
[nit] Add coverage asserting that unreadable typenames are deduplicated and sorted, including multiple types in reverse order. (1 vote) |
scripts/README.md |
[nit] Keep the checks=0/0 documentation consistent by distinguishing unreadable-only rollups from other unreadable cases. (1 vote) |
scripts/pr_review.py |
[nit] Preserve the first-case qualifier in exit-45 help text. (3 votes) [nit] Use a grammatical phrase for the unread-check status message. (1 vote) |
scripts/pr_review_checks.py |
[nit] Add a regression test covering sorted output for multiple distinct unreadable typenames. (2 votes) |
Review effort: Lite
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## develop #3632 +/- ##
========================================
Coverage 81.62% 81.63%
========================================
Files 26 26
Lines 9078 9081 +3
========================================
+ Hits 7410 7413 +3
Misses 1668 1668
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
Every unread-only case used one typename, so a dedupe that kept input order would still pass. Two distinct types given in reverse order now pin the helper's result and the DIRTY message. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
A recorded local strict-review pass covers head |
…ne (#3633) Promotes the #3488 unread-only rollup hold from `develop` to `main`. - [#3632](#3632) Holds a rollup of only unreadable nodes as an empty one, so `wait` holds a `BLOCKED`, `BEHIND`, or `DRAFT` merge and exits `45` under `DIRTY` rather than releasing on checks it never read. Closes #3488 🤖 Generated with [Claude Code](https://claude.com/claude-code)

Summary
check_nodesinscripts/pr_review_checks.pyreads a rollup node of an unrecognized GraphQL union member as a node with empty values and anunreadablekey.held_checks_openandchecks_never_rantested for an empty rollup withnot nodes. So a rollup holding only such nodes was not read as empty. It released aBLOCKED,BEHIND, orDRAFTmerge that an empty rollup holds, and underDIRTYit letwaitexit0rather than45.Both readers now count readable checks through the existing
checks_tally, so a rollup of only unreadable types is judged as one with no check. TheDIRTYrelease names the unread types.checks_unreadnow returns each unread typename once, sorted, so that message and the digest'sCHECKS PARTIALLY UNREADline share one form. Thewaithelp, theCHECKS_PENDINGstatus line, andscripts/README.mdsay the same.scripts/pr_review_checks.pyis at 447 lines against its 450 ceiling.Refs #3488
Verification
30underBLOCKED,BEHIND, andDRAFT, and exits it45underDIRTYwith the unread type named. It fails on the unfixed code for all four merges.checks_never_ranunit test adds a mixed rollup, which still releases, and an unread-only one of two nodes, which names the type once.frontiertier. Round one found a stale status line, two stale help paragraphs, a repeated type name, and two sentences over the bound. Round two found the fix's wording problems and a duplicated dedupe. All were fixed. Round three found one, which spent the edit budget and was listed here as open. Splitting the exit-45 help sentence had dropped "Either", so the payload case read as true of every exit45. It is fixed in 1b86688, which names each case as one of three, and its own recorded pass found nothing.🤖 Generated with Claude Code