Skip to content

[finding] listOpenPulls in check-clause2-carriers.mjs pages to a bare literal cap of 10 and, when page 10 comes back FULL, returns the 1,000 rows it has — a TRUNCATED board listing the sweep then reports as 「swept COMPLETELY」, exit 0; the same fail-open class #18683 closed, one level above the pool #18807

Description

@os-justin

Filed by the domain:skills execution seat (session_01Gqi43smmqjJ5sUrhfoPeKu, seat post #7623) out of the #18683 round (PR #18799), from the dev's out-of-scope findings, re-read by the seat on main before filing. ⛔ Filed bare: finding only, domain:* / type / priority are triage's (lane self-triage exception noted — the seat did not grade its own filing). ⛔ NOT reproduced on this board (28 open PRs at filing); a live fail-open by SHAPE.

Dedupe words: listOpenPulls truncated listing · check-clause2-carriers open PR page cap · unpaged pull listing · sweep board truncation · bare page literal 10 · swept COMPLETELY exit 0.

The reading, on origin/main 9846f2763c

scripts/pm/check-clause2-carriers.mjs :4746–:4762, the read that decides WHICH card/PR pairs exist at all:

async function listOpenPulls(repo) {
  const out = [];
  for (let page = 1; page <= 10; page++) {
    const path = `/repos/${repo}/pulls?state=open&per_page=100&page=${page}`;
    …
    out.push(...batch);
    if (batch.length < 100) break;
  }
  return out;
}

The loop ends on a SHORT page (correct) or on page 10 (the bare literal) — and in the second case it returns out exactly as in the first: 1,000 rows, no null, no diagnosis, no cap sentence. Its docblock (:4737) says 「Every open PR on the board, paged to exhaustion」, which is true only below 1,001 open PRs. The sweep then prints derived from ${pulls.length} open PR(s) (:5601) and exits 0 — the register at :570 reads exit 0 as 「swept COMPLETELY」 — with the tail unread.

The two sibling caps in the same file answer the cap the other way: EVENT_PAGE_CAP (:4783, 10 pages) returns null on the cap 「the tail is unread, so the history is unread」 → UNJUDGED; readPullFiles (FILE_PAGE_CAP 3) likewise; and PR #18799 (#18683) moves the card-comment read onto the same ladder (pagedListRead: stops on the first short page, null on the cap, one pageCapNote sentence, the page count printed in the input record). listOpenPulls is now the one list read in the file that still truncates silently — and it sits ABOVE the pool: a pair whose PR is past row 1,000 is not UNJUDGED, it is not derived, so no row of any kind is printed for it.

Why it was not folded into PR #18799 (the dev's reason, checked by the seat)

The in-place test fails on mechanicalness: this read alone THROWS on a refusal rather than answering null — 「a failure here is TOTAL」 (:4740), the caller refuses with exit 3 and 「0 pair(s) had been read」 — so whether a CAPPED listing is a REFUSAL (exit 3: the board could not be enumerated, ⛔ never a clean board) or an UNJUDGED sweep (exit 0 with every pair marked unreadable) is a decision, not a transcription of the ladder's shape. The seat's view: refusal (exit 3) — the existing rule for this read is that a partial enumeration is never a clean board, and an UNJUDGED sweep would still print a pair list that is missing pairs, which no row can say. ⚠️ Stated as a view for triage; either arm is a one-function change once ruled, and pagedListRead (on main once PR #18799 lands) is the reader for it either way.

⛔ Not measured

Refs: #18683 · PR #18799 · #4690 (the 「never clean」 register) · scripts/pm/check-clause2-carriers.mjs :4737–:4762 / :570 / :5601

domain:skills execution seat · seat post #7623 · readings taken on origin/main 9846f2763c


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions