feat: check large pull request approvals in git node land - #1173

Open
zeexzeex wants to merge 1 commit into
nodejs:mainfrom
zeexzeex:feat/large-pr-checks
Open

feat: check large pull request approvals in git node land#1173
zeexzeex wants to merge 1 commit into
nodejs:mainfrom
zeexzeex:feat/large-pr-checks

Conversation

@zeexzeex

@zeexzeexzeexzeex commented Aug 31, 2026

Copy link
Copy Markdown

Node.js requires two TSC approvals for large pull requests, but nothing enforces it at land time. This adds that check to git node land.

Whether a pull request is large is not something that can be derived from the diff. The policy counts a new subsystem as large regardless of size, and exempts routine dependency updates but not other dependency changes; neither is visible in the pull request data. An earlier revision of this PR tried a 5000 line threshold, and checking it against the 6 pull requests currently carrying the large-pr label, it missed 2 of them: nodejs/node#64429 is well under the threshold, and nodejs/node#62217 has a net negative diff.

The project already records this judgement with the large-pr label, so this checks that instead, the way semver-major is checked. The approval requirement is the same for both, so the existing branch is widened rather than duplicated, with a distinct message and reason code so a failure tells the author which rule applies. A pull request carrying both labels is reported as semver-major.

Refs: https://github.com/nodejs/node/blob/main/doc/contributing/large-pull-requests.md
Fixes: #1063

@zeexzeex
zeexzeexforce-pushed the feat/large-pr-checks branch from 2149ab7 to f8afeefCompareAugust 31, 2026 07:00
@Renegade334

Copy link
Copy Markdown
Member

I don't think that trying to automatically detect whether a PR falls into the policy definition of a large PR is ever going to be feasible. This can't detect whether a PR adds a new subsystem, or detect whether a non-automated dependency change PR meets the large PR threshold (it's only automated commits that are exempt), and indeed a PR only needs to touch a single gypfile in /deps for this logic to exempt it.

I think we would be much better off making this a label-based check, à la fast track or semver-major. Large PRs are not getting landed quickly, it's highly likely that a clued-in reviewer will check in to add the label long before it's in a position to land, and we can always couple it with an action to conditionally comment a reminder when the PR is opened.

@zeexzeex

Copy link
Copy Markdown
Author

You're right. I checked against the large-pr label: of the 6 PRs carrying it, my logic misses 2. #64429 is well under the threshold, and #62217 has a net negative diff plus the dependencies label, so it gets exempted twice over despite not being a routine update.

I'll rewrite this as a large-pr label check alongside the existing semver-major branch, and drop the line counting, the exemption list, and the additions/deletions query fields.

Large pull requests follow the same approval path as semver-major
changes: at least two TSC approvals. `git node land` did not check for
this, so such a pull request could land with fewer.
Whether a pull request is large is not something that can be derived
from the diff. The policy counts a new subsystem as large regardless of
size, and exempts routine dependency updates but not other dependency
changes, neither of which is visible in the pull request data. The
project already records the judgement with the `large-pr` label, so
check that, the way `semver-major` is checked.
Refs: https://github.com/nodejs/node/blob/main/doc/contributing/large-pull-requests.md
Signed-off-by: Avocado <ujubongbong@gmail.com>
Sign up for freeto 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.

Add large pull request checks in git node land

2 participants

@zeexzeex@Renegade334
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat: check large pull request approvals in git node land - #1173

Open
zeexzeex wants to merge 1 commit into
nodejs:mainfrom
zeexzeex:feat/large-pr-checks
Open

feat: check large pull request approvals in git node land#1173
zeexzeex wants to merge 1 commit into
nodejs:mainfrom
zeexzeex:feat/large-pr-checks

Conversation

@zeexzeex

@zeexzeexzeexzeex commented Aug 31, 2026

Copy link
Copy Markdown

Node.js requires two TSC approvals for large pull requests, but nothing enforces it at land time. This adds that check to git node land.

Whether a pull request is large is not something that can be derived from the diff. The policy counts a new subsystem as large regardless of size, and exempts routine dependency updates but not other dependency changes; neither is visible in the pull request data. An earlier revision of this PR tried a 5000 line threshold, and checking it against the 6 pull requests currently carrying the large-pr label, it missed 2 of them: nodejs/node#64429 is well under the threshold, and nodejs/node#62217 has a net negative diff.

The project already records this judgement with the large-pr label, so this checks that instead, the way semver-major is checked. The approval requirement is the same for both, so the existing branch is widened rather than duplicated, with a distinct message and reason code so a failure tells the author which rule applies. A pull request carrying both labels is reported as semver-major.

Refs: https://github.com/nodejs/node/blob/main/doc/contributing/large-pull-requests.md
Fixes: #1063

@zeexzeex
zeexzeexforce-pushed the feat/large-pr-checks branch from 2149ab7 to f8afeefCompareAugust 31, 2026 07:00
@Renegade334

Copy link
Copy Markdown
Member

I don't think that trying to automatically detect whether a PR falls into the policy definition of a large PR is ever going to be feasible. This can't detect whether a PR adds a new subsystem, or detect whether a non-automated dependency change PR meets the large PR threshold (it's only automated commits that are exempt), and indeed a PR only needs to touch a single gypfile in /deps for this logic to exempt it.

I think we would be much better off making this a label-based check, à la fast track or semver-major. Large PRs are not getting landed quickly, it's highly likely that a clued-in reviewer will check in to add the label long before it's in a position to land, and we can always couple it with an action to conditionally comment a reminder when the PR is opened.

@zeexzeex

Copy link
Copy Markdown
Author

You're right. I checked against the large-pr label: of the 6 PRs carrying it, my logic misses 2. #64429 is well under the threshold, and #62217 has a net negative diff plus the dependencies label, so it gets exempted twice over despite not being a routine update.

I'll rewrite this as a large-pr label check alongside the existing semver-major branch, and drop the line counting, the exemption list, and the additions/deletions query fields.

Large pull requests follow the same approval path as semver-major
changes: at least two TSC approvals. `git node land` did not check for
this, so such a pull request could land with fewer.
Whether a pull request is large is not something that can be derived
from the diff. The policy counts a new subsystem as large regardless of
size, and exempts routine dependency updates but not other dependency
changes, neither of which is visible in the pull request data. The
project already records the judgement with the `large-pr` label, so
check that, the way `semver-major` is checked.
Refs: https://github.com/nodejs/node/blob/main/doc/contributing/large-pull-requests.md
Signed-off-by: Avocado <ujubongbong@gmail.com>
Sign up for freeto 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.

Add large pull request checks in git node land

2 participants

@zeexzeex@Renegade334
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: check large pull request approvals in git node land - #1173

Open
zeexzeex wants to merge 1 commit into
nodejs:mainfrom
zeexzeex:feat/large-pr-checks
Open

feat: check large pull request approvals in git node land#1173
zeexzeex wants to merge 1 commit into
nodejs:mainfrom
zeexzeex:feat/large-pr-checks

Conversation

@zeexzeex

@zeexzeexzeexzeex commented Aug 31, 2026

Copy link
Copy Markdown

Node.js requires two TSC approvals for large pull requests, but nothing enforces it at land time. This adds that check to git node land.

Whether a pull request is large is not something that can be derived from the diff. The policy counts a new subsystem as large regardless of size, and exempts routine dependency updates but not other dependency changes; neither is visible in the pull request data. An earlier revision of this PR tried a 5000 line threshold, and checking it against the 6 pull requests currently carrying the large-pr label, it missed 2 of them: nodejs/node#64429 is well under the threshold, and nodejs/node#62217 has a net negative diff.

The project already records this judgement with the large-pr label, so this checks that instead, the way semver-major is checked. The approval requirement is the same for both, so the existing branch is widened rather than duplicated, with a distinct message and reason code so a failure tells the author which rule applies. A pull request carrying both labels is reported as semver-major.

Refs: https://github.com/nodejs/node/blob/main/doc/contributing/large-pull-requests.md
Fixes: #1063

@zeexzeex
zeexzeexforce-pushed the feat/large-pr-checks branch from 2149ab7 to f8afeefCompareAugust 31, 2026 07:00
@Renegade334

Copy link
Copy Markdown
Member

I don't think that trying to automatically detect whether a PR falls into the policy definition of a large PR is ever going to be feasible. This can't detect whether a PR adds a new subsystem, or detect whether a non-automated dependency change PR meets the large PR threshold (it's only automated commits that are exempt), and indeed a PR only needs to touch a single gypfile in /deps for this logic to exempt it.

I think we would be much better off making this a label-based check, à la fast track or semver-major. Large PRs are not getting landed quickly, it's highly likely that a clued-in reviewer will check in to add the label long before it's in a position to land, and we can always couple it with an action to conditionally comment a reminder when the PR is opened.

@zeexzeex

Copy link
Copy Markdown
Author

You're right. I checked against the large-pr label: of the 6 PRs carrying it, my logic misses 2. #64429 is well under the threshold, and #62217 has a net negative diff plus the dependencies label, so it gets exempted twice over despite not being a routine update.

I'll rewrite this as a large-pr label check alongside the existing semver-major branch, and drop the line counting, the exemption list, and the additions/deletions query fields.

Large pull requests follow the same approval path as semver-major
changes: at least two TSC approvals. `git node land` did not check for
this, so such a pull request could land with fewer.
Whether a pull request is large is not something that can be derived
from the diff. The policy counts a new subsystem as large regardless of
size, and exempts routine dependency updates but not other dependency
changes, neither of which is visible in the pull request data. The
project already records the judgement with the `large-pr` label, so
check that, the way `semver-major` is checked.
Refs: https://github.com/nodejs/node/blob/main/doc/contributing/large-pull-requests.md
Signed-off-by: Avocado <ujubongbong@gmail.com>
Sign up for freeto 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.

Add large pull request checks in git node land

2 participants

@zeexzeex@Renegade334
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: check large pull request approvals in git node land - #1173

Open
zeexzeex wants to merge 1 commit into
nodejs:mainfrom
zeexzeex:feat/large-pr-checks
Open

feat: check large pull request approvals in git node land#1173
zeexzeex wants to merge 1 commit into
nodejs:mainfrom
zeexzeex:feat/large-pr-checks

Conversation

@zeexzeex

@zeexzeexzeexzeex commented Aug 31, 2026

Copy link
Copy Markdown

Node.js requires two TSC approvals for large pull requests, but nothing enforces it at land time. This adds that check to git node land.

Whether a pull request is large is not something that can be derived from the diff. The policy counts a new subsystem as large regardless of size, and exempts routine dependency updates but not other dependency changes; neither is visible in the pull request data. An earlier revision of this PR tried a 5000 line threshold, and checking it against the 6 pull requests currently carrying the large-pr label, it missed 2 of them: nodejs/node#64429 is well under the threshold, and nodejs/node#62217 has a net negative diff.

The project already records this judgement with the large-pr label, so this checks that instead, the way semver-major is checked. The approval requirement is the same for both, so the existing branch is widened rather than duplicated, with a distinct message and reason code so a failure tells the author which rule applies. A pull request carrying both labels is reported as semver-major.

Refs: https://github.com/nodejs/node/blob/main/doc/contributing/large-pull-requests.md
Fixes: #1063

@zeexzeex
zeexzeexforce-pushed the feat/large-pr-checks branch from 2149ab7 to f8afeefCompareAugust 31, 2026 07:00
@Renegade334

Copy link
Copy Markdown
Member

I don't think that trying to automatically detect whether a PR falls into the policy definition of a large PR is ever going to be feasible. This can't detect whether a PR adds a new subsystem, or detect whether a non-automated dependency change PR meets the large PR threshold (it's only automated commits that are exempt), and indeed a PR only needs to touch a single gypfile in /deps for this logic to exempt it.

I think we would be much better off making this a label-based check, à la fast track or semver-major. Large PRs are not getting landed quickly, it's highly likely that a clued-in reviewer will check in to add the label long before it's in a position to land, and we can always couple it with an action to conditionally comment a reminder when the PR is opened.

@zeexzeex

Copy link
Copy Markdown
Author

You're right. I checked against the large-pr label: of the 6 PRs carrying it, my logic misses 2. #64429 is well under the threshold, and #62217 has a net negative diff plus the dependencies label, so it gets exempted twice over despite not being a routine update.

I'll rewrite this as a large-pr label check alongside the existing semver-major branch, and drop the line counting, the exemption list, and the additions/deletions query fields.

Large pull requests follow the same approval path as semver-major
changes: at least two TSC approvals. `git node land` did not check for
this, so such a pull request could land with fewer.
Whether a pull request is large is not something that can be derived
from the diff. The policy counts a new subsystem as large regardless of
size, and exempts routine dependency updates but not other dependency
changes, neither of which is visible in the pull request data. The
project already records the judgement with the `large-pr` label, so
check that, the way `semver-major` is checked.
Refs: https://github.com/nodejs/node/blob/main/doc/contributing/large-pull-requests.md
Signed-off-by: Avocado <ujubongbong@gmail.com>
Sign up for freeto 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.

Add large pull request checks in git node land

2 participants

@zeexzeex@Renegade334
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat: check large pull request approvals in git node land - #1173

Open
zeexzeex wants to merge 1 commit into
nodejs:mainfrom
zeexzeex:feat/large-pr-checks
Open

feat: check large pull request approvals in git node land#1173
zeexzeex wants to merge 1 commit into
nodejs:mainfrom
zeexzeex:feat/large-pr-checks

Conversation

@zeexzeex

@zeexzeexzeexzeex commented Aug 31, 2026

Copy link
Copy Markdown

Node.js requires two TSC approvals for large pull requests, but nothing enforces it at land time. This adds that check to git node land.

Whether a pull request is large is not something that can be derived from the diff. The policy counts a new subsystem as large regardless of size, and exempts routine dependency updates but not other dependency changes; neither is visible in the pull request data. An earlier revision of this PR tried a 5000 line threshold, and checking it against the 6 pull requests currently carrying the large-pr label, it missed 2 of them: nodejs/node#64429 is well under the threshold, and nodejs/node#62217 has a net negative diff.

The project already records this judgement with the large-pr label, so this checks that instead, the way semver-major is checked. The approval requirement is the same for both, so the existing branch is widened rather than duplicated, with a distinct message and reason code so a failure tells the author which rule applies. A pull request carrying both labels is reported as semver-major.

Refs: https://github.com/nodejs/node/blob/main/doc/contributing/large-pull-requests.md
Fixes: #1063

@zeexzeex
zeexzeexforce-pushed the feat/large-pr-checks branch from 2149ab7 to f8afeefCompareAugust 31, 2026 07:00
@Renegade334

Copy link
Copy Markdown
Member

I don't think that trying to automatically detect whether a PR falls into the policy definition of a large PR is ever going to be feasible. This can't detect whether a PR adds a new subsystem, or detect whether a non-automated dependency change PR meets the large PR threshold (it's only automated commits that are exempt), and indeed a PR only needs to touch a single gypfile in /deps for this logic to exempt it.

I think we would be much better off making this a label-based check, à la fast track or semver-major. Large PRs are not getting landed quickly, it's highly likely that a clued-in reviewer will check in to add the label long before it's in a position to land, and we can always couple it with an action to conditionally comment a reminder when the PR is opened.

@zeexzeex

Copy link
Copy Markdown
Author

You're right. I checked against the large-pr label: of the 6 PRs carrying it, my logic misses 2. #64429 is well under the threshold, and #62217 has a net negative diff plus the dependencies label, so it gets exempted twice over despite not being a routine update.

I'll rewrite this as a large-pr label check alongside the existing semver-major branch, and drop the line counting, the exemption list, and the additions/deletions query fields.

Large pull requests follow the same approval path as semver-major
changes: at least two TSC approvals. `git node land` did not check for
this, so such a pull request could land with fewer.
Whether a pull request is large is not something that can be derived
from the diff. The policy counts a new subsystem as large regardless of
size, and exempts routine dependency updates but not other dependency
changes, neither of which is visible in the pull request data. The
project already records the judgement with the `large-pr` label, so
check that, the way `semver-major` is checked.
Refs: https://github.com/nodejs/node/blob/main/doc/contributing/large-pull-requests.md
Signed-off-by: Avocado <ujubongbong@gmail.com>
Sign up for freeto 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.

Add large pull request checks in git node land

2 participants

@zeexzeex@Renegade334
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: check large pull request approvals in git node land - #1173

Open
zeexzeex wants to merge 1 commit into
nodejs:mainfrom
zeexzeex:feat/large-pr-checks
Open

feat: check large pull request approvals in git node land#1173
zeexzeex wants to merge 1 commit into
nodejs:mainfrom
zeexzeex:feat/large-pr-checks

Conversation

@zeexzeex

@zeexzeexzeexzeex commented Aug 31, 2026

Copy link
Copy Markdown

Node.js requires two TSC approvals for large pull requests, but nothing enforces it at land time. This adds that check to git node land.

Whether a pull request is large is not something that can be derived from the diff. The policy counts a new subsystem as large regardless of size, and exempts routine dependency updates but not other dependency changes; neither is visible in the pull request data. An earlier revision of this PR tried a 5000 line threshold, and checking it against the 6 pull requests currently carrying the large-pr label, it missed 2 of them: nodejs/node#64429 is well under the threshold, and nodejs/node#62217 has a net negative diff.

The project already records this judgement with the large-pr label, so this checks that instead, the way semver-major is checked. The approval requirement is the same for both, so the existing branch is widened rather than duplicated, with a distinct message and reason code so a failure tells the author which rule applies. A pull request carrying both labels is reported as semver-major.

Refs: https://github.com/nodejs/node/blob/main/doc/contributing/large-pull-requests.md
Fixes: #1063

@zeexzeex
zeexzeexforce-pushed the feat/large-pr-checks branch from 2149ab7 to f8afeefCompareAugust 31, 2026 07:00
@Renegade334

Copy link
Copy Markdown
Member

I don't think that trying to automatically detect whether a PR falls into the policy definition of a large PR is ever going to be feasible. This can't detect whether a PR adds a new subsystem, or detect whether a non-automated dependency change PR meets the large PR threshold (it's only automated commits that are exempt), and indeed a PR only needs to touch a single gypfile in /deps for this logic to exempt it.

I think we would be much better off making this a label-based check, à la fast track or semver-major. Large PRs are not getting landed quickly, it's highly likely that a clued-in reviewer will check in to add the label long before it's in a position to land, and we can always couple it with an action to conditionally comment a reminder when the PR is opened.

@zeexzeex

Copy link
Copy Markdown
Author

You're right. I checked against the large-pr label: of the 6 PRs carrying it, my logic misses 2. #64429 is well under the threshold, and #62217 has a net negative diff plus the dependencies label, so it gets exempted twice over despite not being a routine update.

I'll rewrite this as a large-pr label check alongside the existing semver-major branch, and drop the line counting, the exemption list, and the additions/deletions query fields.

Large pull requests follow the same approval path as semver-major
changes: at least two TSC approvals. `git node land` did not check for
this, so such a pull request could land with fewer.
Whether a pull request is large is not something that can be derived
from the diff. The policy counts a new subsystem as large regardless of
size, and exempts routine dependency updates but not other dependency
changes, neither of which is visible in the pull request data. The
project already records the judgement with the `large-pr` label, so
check that, the way `semver-major` is checked.
Refs: https://github.com/nodejs/node/blob/main/doc/contributing/large-pull-requests.md
Signed-off-by: Avocado <ujubongbong@gmail.com>
Sign up for freeto 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.

Add large pull request checks in git node land

2 participants

@zeexzeex@Renegade334
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: check large pull request approvals in git node land - #1173

Open
zeexzeex wants to merge 1 commit into
nodejs:mainfrom
zeexzeex:feat/large-pr-checks
Open

feat: check large pull request approvals in git node land#1173
zeexzeex wants to merge 1 commit into
nodejs:mainfrom
zeexzeex:feat/large-pr-checks

Conversation

@zeexzeex

@zeexzeexzeexzeex commented Aug 31, 2026

Copy link
Copy Markdown

Node.js requires two TSC approvals for large pull requests, but nothing enforces it at land time. This adds that check to git node land.

Whether a pull request is large is not something that can be derived from the diff. The policy counts a new subsystem as large regardless of size, and exempts routine dependency updates but not other dependency changes; neither is visible in the pull request data. An earlier revision of this PR tried a 5000 line threshold, and checking it against the 6 pull requests currently carrying the large-pr label, it missed 2 of them: nodejs/node#64429 is well under the threshold, and nodejs/node#62217 has a net negative diff.

The project already records this judgement with the large-pr label, so this checks that instead, the way semver-major is checked. The approval requirement is the same for both, so the existing branch is widened rather than duplicated, with a distinct message and reason code so a failure tells the author which rule applies. A pull request carrying both labels is reported as semver-major.

Refs: https://github.com/nodejs/node/blob/main/doc/contributing/large-pull-requests.md
Fixes: #1063

@zeexzeex
zeexzeexforce-pushed the feat/large-pr-checks branch from 2149ab7 to f8afeefCompareAugust 31, 2026 07:00
@Renegade334

Copy link
Copy Markdown
Member

I don't think that trying to automatically detect whether a PR falls into the policy definition of a large PR is ever going to be feasible. This can't detect whether a PR adds a new subsystem, or detect whether a non-automated dependency change PR meets the large PR threshold (it's only automated commits that are exempt), and indeed a PR only needs to touch a single gypfile in /deps for this logic to exempt it.

I think we would be much better off making this a label-based check, à la fast track or semver-major. Large PRs are not getting landed quickly, it's highly likely that a clued-in reviewer will check in to add the label long before it's in a position to land, and we can always couple it with an action to conditionally comment a reminder when the PR is opened.

@zeexzeex

Copy link
Copy Markdown
Author

You're right. I checked against the large-pr label: of the 6 PRs carrying it, my logic misses 2. #64429 is well under the threshold, and #62217 has a net negative diff plus the dependencies label, so it gets exempted twice over despite not being a routine update.

I'll rewrite this as a large-pr label check alongside the existing semver-major branch, and drop the line counting, the exemption list, and the additions/deletions query fields.

Large pull requests follow the same approval path as semver-major
changes: at least two TSC approvals. `git node land` did not check for
this, so such a pull request could land with fewer.
Whether a pull request is large is not something that can be derived
from the diff. The policy counts a new subsystem as large regardless of
size, and exempts routine dependency updates but not other dependency
changes, neither of which is visible in the pull request data. The
project already records the judgement with the `large-pr` label, so
check that, the way `semver-major` is checked.
Refs: https://github.com/nodejs/node/blob/main/doc/contributing/large-pull-requests.md
Signed-off-by: Avocado <ujubongbong@gmail.com>
Sign up for freeto 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.

Add large pull request checks in git node land

2 participants

@zeexzeex@Renegade334
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat: check large pull request approvals in git node land - #1173

Open
zeexzeex wants to merge 1 commit into
nodejs:mainfrom
zeexzeex:feat/large-pr-checks
Open

feat: check large pull request approvals in git node land#1173
zeexzeex wants to merge 1 commit into
nodejs:mainfrom
zeexzeex:feat/large-pr-checks

Conversation

@zeexzeex

@zeexzeexzeexzeex commented Aug 31, 2026

Copy link
Copy Markdown

Node.js requires two TSC approvals for large pull requests, but nothing enforces it at land time. This adds that check to git node land.

Whether a pull request is large is not something that can be derived from the diff. The policy counts a new subsystem as large regardless of size, and exempts routine dependency updates but not other dependency changes; neither is visible in the pull request data. An earlier revision of this PR tried a 5000 line threshold, and checking it against the 6 pull requests currently carrying the large-pr label, it missed 2 of them: nodejs/node#64429 is well under the threshold, and nodejs/node#62217 has a net negative diff.

The project already records this judgement with the large-pr label, so this checks that instead, the way semver-major is checked. The approval requirement is the same for both, so the existing branch is widened rather than duplicated, with a distinct message and reason code so a failure tells the author which rule applies. A pull request carrying both labels is reported as semver-major.

Refs: https://github.com/nodejs/node/blob/main/doc/contributing/large-pull-requests.md
Fixes: #1063

@zeexzeex
zeexzeexforce-pushed the feat/large-pr-checks branch from 2149ab7 to f8afeefCompareAugust 31, 2026 07:00
@Renegade334

Copy link
Copy Markdown
Member

I don't think that trying to automatically detect whether a PR falls into the policy definition of a large PR is ever going to be feasible. This can't detect whether a PR adds a new subsystem, or detect whether a non-automated dependency change PR meets the large PR threshold (it's only automated commits that are exempt), and indeed a PR only needs to touch a single gypfile in /deps for this logic to exempt it.

I think we would be much better off making this a label-based check, à la fast track or semver-major. Large PRs are not getting landed quickly, it's highly likely that a clued-in reviewer will check in to add the label long before it's in a position to land, and we can always couple it with an action to conditionally comment a reminder when the PR is opened.

@zeexzeex

Copy link
Copy Markdown
Author

You're right. I checked against the large-pr label: of the 6 PRs carrying it, my logic misses 2. #64429 is well under the threshold, and #62217 has a net negative diff plus the dependencies label, so it gets exempted twice over despite not being a routine update.

I'll rewrite this as a large-pr label check alongside the existing semver-major branch, and drop the line counting, the exemption list, and the additions/deletions query fields.

Large pull requests follow the same approval path as semver-major
changes: at least two TSC approvals. `git node land` did not check for
this, so such a pull request could land with fewer.
Whether a pull request is large is not something that can be derived
from the diff. The policy counts a new subsystem as large regardless of
size, and exempts routine dependency updates but not other dependency
changes, neither of which is visible in the pull request data. The
project already records the judgement with the `large-pr` label, so
check that, the way `semver-major` is checked.
Refs: https://github.com/nodejs/node/blob/main/doc/contributing/large-pull-requests.md
Signed-off-by: Avocado <ujubongbong@gmail.com>
Sign up for freeto 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.

Add large pull request checks in git node land

2 participants

@zeexzeex@Renegade334