The eligibility job enabled the relinker matrix for a pull request only
when repos.listCommits on main with the author's login returned a
commit. That filter misses authors whose commits in main are not
matched to their login. On 2026-10-13 it found no commit for 26 authors
of open pull requests who have 1 to 44 pull requests merged into main,
so their pull requests skip the relinker, against CONTRIBUTING.md ("if
its author already has a commit in main").
When listCommits finds nothing, the job now also searches for the
author's merged pull requests into main, with the query pr-intake.yml
uses. Incomplete search results count as none. A failed search, such as
the search API's own rate limit, skips the relinker with a warning
instead of failing the job. Both requests now run only when the pull
request changes a relinker file, so other pull requests make neither.
test_build_eligibility.py runs the step's script in node with a mocked
github object and skips when node is missing.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
What
The
eligibilityjob in.github/workflows/build.ymlenables the relinker matrix for a pull request only whenrepos.listCommits({ sha: 'main', author: <login>, per_page: 1 })returns a commit. CONTRIBUTING.md says the matrix runs automatically "if its author already has a commit inmain". Theauthorfilter misses authors whose commits inmainit does not match to their login, so their pull requests skip the relinker although they have merged pull requests.Two pull requests where this happened, both open on 2026-10-13. Both change paths the gate lists, so the author check is what skipped them:
core/relinker/relinker/src/parsing/ElfReader.cpp. Itsrelinkercheck isskippingin run 38397615480, on the head it was merged with on 2026-10-14.CMakeLists.txtandtools/. Itsrelinkercheck isskippingin run 38410359241, and again in run 38551986982 on the head it was merged with on 2026-10-14.Why the filter misses them:
main, andGET repos/boykopovar/AnyPS5/commits/84d851bf8reports author loginDextroid17with ausers.noreply.github.comaddress.commits?sha=main&author=Dextroid17returns 0 commits, and the same request with that noreply address asauthorreturns 1.GET repos/boykopovar/AnyPS5/pulls/<n>/commits. For 18 authors at least one of these commits is linked to their own login, and each such commit has ausers.noreply.github.comaddress, as for Dextroid17. That address alone does not hide a commit:listCommitsfinds the commits of 0xRickx, which use one too. For 5, among them Mouad-Scriptz-0 (feat(libSceNpAuth): return the signed-out error from sceNpAuthGetAuthorizedAppCode #4218), they are not linked to any account. For 3, among them mrzacarias (feat(libSceRudp): implement sceRudpGetStatus #2359), they are linked only to other accounts.Both queries, run with
gh apion 2026-10-13 between 23:22 and 23:32 UTC:listCommitsisGET repos/boykopovar/AnyPS5/commits?sha=main&author=<login>&per_page=1, counted by the length of the result.GET search/issueswithq=repo:boykopovar/AnyPS5 is:pr is:merged base:main author:<login>andper_page=1. The table showstotal_count.incomplete_resultswasfalsefor every login.At 23:22 UTC the 721 open pull requests into
mainhad 203 authors.listCommitsreturned 0 for 89 of them, and the search found merged pull requests for 26 of those 89:115 of the open pull requests are by these authors. 25 of those change a path the relinker gate lists, checked against the file paths
gh pr list --json filesreturns. On 24 of the 25 therelinkercheck of the latest head is skipped; #1614 has no build checks.Change, in the
eligibilityscript:pull_requestrun whose files match, so other pull requests make neither request. A dispatch run still enables the relinker on the paths alone.listCommitsstays as the first check.pr-intake.ymluses,repo:<owner>/<repo> is:pr is:merged base:main author:<login>. Atotal_countabove 0 enables the relinker.pr-intake.ymlrejects them too. The search API has its own limit:gh api rate_limitshows 30 requests per minute forsearch. A failed search or incomplete results skip the relinker with acore.warning, and the job continues instead of failing.skipped: no relinker file changed, or no commit or merged pull request in main was found for the author.CONTRIBUTING.md is unchanged. An author with a pull request merged into
mainhas a commit inmain, which is what it says.pr.author_associationwould need no extra request, but it cannot replace either check. In the open pull request list at 23:48 UTC it wasCONTRIBUTORfor the 18 authors whose commits are linked to their login andNONEfor the other 8. It was alsoNONEfor 3 authors whose commitslistCommitsfinds (sherySJ, thuanquang, nabilfp).Neither check finds an author whose only commit in
maincame through someone else's pull request. Swastik-51 has 9f06176 inmainthrough #4395 and no merged pull request. Their open #4767 changes no relinker path.#5228 also edits this script: it moves the path checks into a
selecthelper and keeps the author check as it is. The two conflict inbuild.yml, so whichever is merged second needs a rebase.Tested
New
tools/tests/test_build_eligibility.py, registered as ctestbuild_eligibilitynext to the othertools/testsscripts:gatestep'sscript: |block frombuild.ymland runs it in node as an async function ofgithub,contextandcore, the way github-script calls it.githubis a mock that records thelistCommitsand search calls.corerecords the outputs, warnings and summary.nodeis not on PATH. The runner-images README mapsubuntu-latest,windows-latestandmacos-latestto Ubuntu 24.04, Windows Server 2025 with VS 2026, and macOS 26 arm64, and their image READMEs list Node.js 22.23.3, 22.23.3 and 24.20.0.The seven cases:
mainruns the relinker without a search.total_count3 skip it with one warning.README.mdchanged.Results, on
mainat d167000:python -I tools/tests/test_build_eligibility.pyruns 7 tests and they pass.main'sbuild.ymland the same test file, 5 of the 7 fail. The commit case and the dispatch case pass.cmake -S . -B build-relinker -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=g++ -DANYPS5_RELINKER_ONLY=ON -DBUILD_TESTING=ONregistersbuild_eligibility.ctest --test-dir build-relinker -R '^(build_eligibility|conventions_ci_gate)$'runs both: 7 and 10 tests, all pass.cmake --build build-relinker --parallel 4andctest --test-dir build-relinker --output-on-failure --timeout 120 -j 4. 156 of 156 tests pass, andbuild_eligibilityreports its 7 tests skipped.Also:
build.ymlparses with PyYAML 6.0.3, and thescriptvalue it gives for thegatestep equals the text the test extracts.main'stools/check_conventions.pypasses, including--titleand--body.Not run on Actions with the search path.
listCommitsreturns 1 for my login, so this pull request's own run takes the first check only.Rebase (2026-10-14)
Rebased onto
mainat 5a6ad0e. Since d167000, #5801 runs the checks of each pull request in a loop so that a dispatch can build up to 8, #5807 ends the run early when the pull request is already closed, #5822 moves the Linux job to a self-hosted runner, and #5839 limits its build and test parallelism to one. The change is the same: the paths are checked first, and the author checks run after the loop, only in apull_requestrun, which has one pull request.prnow exists only inside the loop, so the login comes fromcontext.payload.pull_request.user.login, and the test's payload has auser.login. The early return for a closed pull request comes before any author request, and the Linux job depends onfull, which this does not change.On the rebased head 8232380:
main'sbuild.yml5 of them fail, and the commit and dispatch cases pass. A scratch variant of the harness shows the same results asmainfor a closed pull request (no outputs, no author request) and for a dispatch of two pull requests (relinker from their paths alone).build_eligibility,tools/check_test_registration.py build-relinkerpasses, andctest -R '^(build_eligibility|conventions_ci_gate|test_registration)$'passes.ctest -j 4, 164 of 164 pass,build_eligibilityskipped without node.build.ymlparses with PyYAML 6.0.3 and thegatescript equals the extracted text.main'stools/check_conventions.pypasses with--titleand--body.The two queries again on 2026-10-14 between 13:44 and 13:46 UTC:
listCommitsstill returns 0 for 25 of the 26 logins in the table, Dextroid17 and AaravMehta-07 included after their merges. xXPBSXx now returns 1, for 79e1621, merged through #4796 at 02:37 UTC. The search finds 1 to 48 merged pull requests for each of the 25, with complete results.Checklist
main; no other open PR implements the same functionsNotImplemented_nid_no_patch); silent stubs are listed under Silent stubs in their library's technical debt file.mdfiles or images added to the repository (attach them to this PR)🤖 Generated with Claude Code