Skip to content

gh-prs-merge: stop skipping ready PRs, and stop the sweep queueing behind one - #100

Merged
ralyodio merged 1 commit into
masterfrom
worktree-fix-prs-merge
Sep 24, 2026
Merged

ralyodio merged 1 commit into
masterfrom
worktree-fix-prs-merge

Conversation

@ralyodio

Copy link
Copy Markdown
Contributor

A sweep of ready PRs came back with nothing merged. Three separate causes.

UNSTABLE was treated as a blocker

It means mergeable, with a non-required context that is not green. GitHub takes the merge, and the "every check is pass or skipping" rule is the stricter test anyway — so demanding CLEAN only ever skipped PRs that were ready. tronbrowser.dev#124 sat unmerged with two green checks and nothing wrong with it.

CLEAN, HAS_HOOKS and UNSTABLE now pass, and UNSTABLE only when there were checks to corroborate it. Checks are also judged before the aggregate state, so a red check names itself instead of hiding behind mergeStateStatus=UNSTABLE.

A settled conflict cost a round trip and two lines

update-branch merges the base into the head, which cannot work over a conflict, and DIRTY is GitHub having already decided there is one. It was asked anyway, told Cannot update PR branch due to conflicts, and the refusal printed as FIXME and then again as SKIP directly underneath. Now it is not asked, and the PR is reported once.

The wait held up the whole sweep

One unfinished test suite stood in front of every PR behind it, for up to --fix-wait each. PRs whose checks are still running are parked and judged in a second pass, so the ready ones merge immediately; --fix-wait is now the budget for that queue as a whole.

Verification

Live, against the same orgs as the failing run:

READY  profullstack/tronbrowser.dev/pull/124 — 2 checks green
MERGED profullstack/tronbrowser.dev/pull/124
FIXME  profullstack/nightcell7/pull/90 — mergeable=CONFLICTING; the branch conflicts with its base and needs resolving by hand
FIXING profullstack/crawlproof.com/pull/291 — checks still running; parked for the second pass
       … 1 PR(s) still running checks; 599s left
READY  profullstack/crawlproof.com/pull/291 — 10 checks green
MERGED profullstack/crawlproof.com/pull/291

Summary: ready=2 readied=0 fixed=1 merged=2 skipped=1 failed=0

test/prs-merge.test.ts 38 passing, typecheck clean. Six failures in test/root-ubuntu.test.ts are pre-existing — baselined at 20e6663 with the identical count and unrelated to this change.

🤖 Generated with Claude Code

…hind one

Three separate ways a sweep of ready PRs came back with nothing merged.

UNSTABLE was treated as a blocker. It means mergeable with a non-required
context that is not green — GitHub takes the merge, and the check rule is the
stricter test anyway, so demanding CLEAN only skipped PRs that were ready.
tronbrowser.dev#124 sat unmerged with two green checks and nothing wrong with
it. CLEAN, HAS_HOOKS and UNSTABLE now pass, and UNSTABLE only when there were
checks to corroborate it. Checks are judged before the aggregate state, so a
red check names itself instead of hiding behind mergeStateStatus=UNSTABLE.

A settled conflict cost a round trip and two lines. update-branch merges the
base into the head, which cannot work over a conflict, and DIRTY is GitHub
having already decided there is one. It was asked anyway, told no, and the
refusal printed as FIXME and then again as SKIP. Now it is not asked, and the
PR is reported once.

The wait held up the whole sweep. One unfinished test suite stood in front of
every PR behind it for up to --fix-wait, each. PRs whose checks are still
running are parked and judged in a second pass, so the ready ones merge now;
--fix-wait is the budget for that queue as a whole rather than per PR.

Verified against the live orgs: the sweep that skipped everything now merges
tronbrowser.dev#124 and crawlproof.com#291, and reports nightcell7#90's
conflict once.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

ThreatCrush Security Scan

23 finding(s)

HIGH/CRITICAL: 4 | MEDIUM: 10 | LOW: 9

Severity Rule Location
HIGH sh-remote-script-execution root-ubuntu.sh:3227
HIGH sh-remote-script-execution root-ubuntu.sh:3228
HIGH sh-remote-script-execution root-ubuntu.sh:4840
HIGH sh-remote-script-execution root-ubuntu.sh:4844
MEDIUM sh-remote-script-execution root-ubuntu.sh:4993
MEDIUM redos-nested-quantifier src/domain-free.ts:56
MEDIUM redos-nested-quantifier src/emoji.ts:167
MEDIUM redos-nested-quantifier src/icon.ts:166
MEDIUM redos-nested-quantifier src/mail.ts:1042
MEDIUM sql-template-interpolation src/users-dump.ts:487
MEDIUM sql-string-concatenation src/users-dump.ts:507
MEDIUM sql-template-interpolation src/users-dump.ts:540
MEDIUM sql-string-concatenation src/users-dump.ts:574
MEDIUM redos-nested-quantifier src/wcag.ts:556
LOW secret-generic-credential src/credentials.ts:36
LOW secret-generic-credential src/user-export.ts:632
LOW secret-generic-credential src/user-export.ts:638
LOW secret-generic-api-key test/credentials.test.ts:208
LOW secret-generic-credential test/mail.test.ts:141
LOW secret-generic-credential test/shorten.test.ts:36
LOW secret-database-url test/users-dump.test.ts:108
LOW secret-database-url test/users-dump.test.ts:119
LOW secret-database-url test/users-dump.test.ts:120

Snippets are redacted; ThreatCrush never prints matched credential material.

@ralyodio
ralyodio merged commit a676651 into master Sep 24, 2026
5 checks passed
ralyodio added a commit that referenced this pull request Sep 24, 2026
…et it in (#101)

`node_modules/` with a trailing slash matches directories only. A *symlink*
named node_modules is not a directory, so the rule never applied to it, and a
`git add -A` committed one in #100. Pulling that landed a symlink pointing at
the checkout's own node_modules over the real directory — a self-referential
loop, and every command in the repo that resolves a dependency fails with
ELOOP until the symlink is deleted and the install repeated.

Drop the trailing slash so the rule matches the symlink too, and untrack the
file. Verified: `git check-ignore` now claims a node_modules symlink, and one
sitting in the working tree no longer shows up in `git status`.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant