The workflow checked out pull_request.base.sha, the base recorded when the
pull request was opened, and ran that revision's check_conventions.py. A rule
merged after a pull request was opened never ran on it: #7005 added
APS5_NO_WGI without an ENVIRONMENT.md row and passed with the checker of
07e741481, which had no env-reference rule.
Check out the current tip of the base branch and pass it as --base; the
checker already diffs from the merge base, so only the pull request's own
changes are checked. A name documented on the base branch after the branch
point now counts as documented unless the pull request removes its row.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The ci-gate check read a job's needs and if only two spaces deeper
than the job name. In a workflow indented by four spaces those keys
were never found, so a job gated with needs: eligibility and an if on
its outputs was reported as ungated. Read the keys at the indentation
of the job's first child instead.
The comment check looked at each added .py, .cmake and CMakeLists.txt
line on its own and treated any # outside a string closed on that line
as a comment. A # inside a Python triple-quoted string or a CMake
quoted or bracket argument that spans lines was reported, so adding an
#include to the C++ held in PatchSpirvTools.cmake's [=[ ]=] arguments
failed the check. An escaped \# in CMake was reported too, while the
inner lines of a multi-line #[[ ]] bracket comment were not.
Find comments over the whole file instead: Python COMMENT tokens from
tokenize, and a CMake scan that skips quoted and bracket arguments and
escapes and covers every line of a bracket comment. A Python file that
does not tokenize keeps the previous per-line check.
The comment rule only scanned C++, Python and CMake files, so a
comment added to a .comp, .frag or .vert shader passed the check.
TextureDetile.comp and ColorTransfer.comp carry such comments today.
Shaders are now masked with the same C-style lexer and report
comment on changed lines, with the same #endif allowance and the
same technical-debt exemption as C++.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_012zyXkUzTZGh3nBwNMtrLaW
An APS5_EXPORT whose name says the NID is unknown can carry the NID of a
symbol nid_patcher already produces from core/libs/prx: a _nid_postfix
helper, an APS5_VABI export or an assembly function. The NID is then not
unknown, and the stub can take the place of that symbol. #5608 exported
YNw9Xk5iNWo from libSceVideoOut as a throwing stub; it is the NID of
MouseIsOpen_nid_postfix, which libSceVideoOut imports from libSceMouse,
so presentation failed with "YNw9Xk5iNWo not implemented" (#5738, #6245).
The unknown-nid rule reports an added Unknown export with the NID of a
symbol in core/libs/prx, and an added symbol with the NID of an Unknown
export. Named aliases, such as the libc and libSceAmpr exports that share
NIDs on purpose, are not checked.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The pr-template check only accepted "Depends on: #N" or "none" on the same
line, so a checklist answering it as a bulleted list failed CI although
pr_overlap reads exactly that form (test_pr_overlap_dependencies covers
"Depends on:
- #2
- #3"). Allow one list marker before the first answer;
an empty answer is still reported.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_012zyXkUzTZGh3nBwNMtrLaW
Check read every technical debt file and every changed file with its
own git show, so each run started one process per file: 99 git
processes for a typical pull request, 311 for a 118-file range, and the
count grew with docs/dev/debt. Process start-up dominates on Windows.
Read the blobs the checks use in one git cat-file --batch process,
keyed by the object ids ls-tree already returns, and batch the files
duplicates() inspects the same way. Paths that are not cached still go
through git show, so failures are unchanged.
The doc-link check matched C++ lambdas such as `[](int a)` inside fenced
code blocks and inline code, reporting bogus missing targets. Links now
require non-empty link text, and links() strips fenced blocks and inline
code spans first. docs() also skips added lines that sit inside a fence
of the full file.
Co-Authored-By: Claude Opus 5.5 <[email protected]>