Stable required status check, and make the node_modules ignore actually hold - #32
Conversation
A trailing slash in .gitignore matches a directory only, so a symlink of the same name is still picked up by `git add -A`. Demonstrated: pattern 'node_modules/' -> staged: 1 pattern 'node_modules' -> staged: 0 66bb72b untracked the symlink but left the pattern alone, so the very next `git add -A` — in f866f14, the review-fix commit — re-added it, and it reached main. The link points at an absolute path in a local worktree, so a fresh clone gets a dangling node_modules. Untracking only sticks once the pattern does, so both happen here. The other never-tracked tool directories lose their trailing slashes for the same reason. Only the index entry is removed; the local symlink stays.
Branch protection matches a status check by its literal context string, and
a matrix job reports as "<job-id> (<matrix values>)". The required check on
main is "test (22)", so the day the matrix moves off Node 22 that context
stops being reported entirely — pull requests block forever while the
ruleset still shows a green, satisfied rule. The failure mode is silence,
which is the hardest kind to diagnose.
An aggregate job named "ci" fixes the context in place. It gates on
needs.test.result, which is success only when every matrix leg succeeded, so
the matrix can grow without touching branch protection.
always() rather than !cancelled(): a check that never reports looks
identical to a blocked branch, so a cancelled run has to fail loudly.
needs.test.result reaches the shell through env rather than ${{ }}
interpolation, so the value cannot be expanded as shell syntax.
The required context must move from "test (22)" to "ci" once this is on
main; until then this job runs without being required.
|
Warning Review limit reached
Next review available in: 4 minutes You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Pro Plus Run ID: 📒 Files selected for processing (3)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Two repo-integrity fixes found while sorting out branch protection.
The required status check is a landmine
Branch protection matches a check by its literal context string. A matrix job reports as
<job-id> (<matrix values>), so the required check onmainistest (22). The day the matrix moves off Node 22, that context stops being reported at all — every pull request blocks forever while the ruleset UI still shows a green, satisfied rule. The failure mode is silence.An aggregate job named
cipins the context. It gates onneeds.test.result, which issuccessonly when every matrix leg succeeded, so the matrix can change freely without touching branch protection.always()rather than!cancelled()— a check that never reports is indistinguishable from a blocked branch, so a cancelled run must fail loudly instead of going quiet.needs.test.resultreaches the shell viaenv:, not${{ }}interpolation, so it cannot be expanded as shell syntax.Follow-up required: once this is on
main, the required context must move fromtest (22)toci. Until then the job runs without being required.node_modules is tracked on main right now
.gitignorehadnode_modules/. A trailing slash matches a directory only, so a symlink of the same name is still staged bygit add -A:66bb72b untracked the symlink but left the pattern alone, so the next
git add -A— f866f14, the review-fix commit — re-added it, and it merged tomainin #31. The link points at an absolute path inside a local worktree, so a fresh clone ofmaingets a danglingnode_modules.Untracking only sticks once the pattern does, so both happen together here. The other never-tracked tool directories lose their trailing slashes for the same reason. Only the index entry is removed; local symlinks are untouched.
Verification
npm run test:fast— 185/185, both ratchets cleancijob resolves toname: ci,needs: [test],if: always()git add -Ano longer re-stages the symlink;git check-ignoreattributes it to.gitignore:28