fix(server): avoid macos path walks in terminal polling - #6372

Closed
t3-code[bot] wants to merge 3 commits into
mainfrom
fix/macos-terminal-poller-paths
Closed

fix(server): avoid macos path walks in terminal polling#6372
t3-code[bot] wants to merge 3 commits into
mainfrom
fix/macos-terminal-poller-paths

Conversation

@t3-code

@t3-codet3-codeBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

what changed

  • use /usr/bin/pgrep and /bin/ps for terminal subprocess polling on macos
  • retain bare utility names on linux and other posix platforms
  • cover every macos subprocess inspection path, including the command fallback probe

why

node/libuv resolves bare executable names by trying each path entry with posix_spawn on macos. because terminal subprocess activity is polled every second, this multiplied a few logical probes into hundreds of failed spawn attempts per second on machines with many terminals and a long path.

absolute paths bypass that lookup without changing the polling behavior. this removes about 94% of the reported spawn attempts in the 14-terminal, 17-entry case.

fixes#6332

verification

  • vp test run src/terminal/Manager.test.ts -t 'uses absolute utility paths' --maxWorkers=1
  • vp test run src/terminal/Manager.test.ts --maxWorkers=1
  • vp test run --maxWorkers=1 in apps/server: 229 files passed, 2 skipped; 2380 tests passed, 7 skipped
  • vp run --filter t3 typecheck
  • vp check apps/server/src/terminal/Manager.ts apps/server/src/terminal/Manager.test.ts

checklist

  • this pr is small and focused
  • i explained what changed and why

request provenance


Note

Low Risk
Behavioral change is limited to how utilities are invoked on macOS during subprocess inspection; polling logic and Linux paths are unchanged.

Overview
macOS terminal subprocess polling now invokes /usr/bin/pgrep and /bin/ps instead of resolving pgrep and ps through PATH, including the comm= and args= fallback probes in posixInspectSubprocess. Linux and other POSIX hosts still use the bare utility names.

This avoids libuv’s per-PATH-entry posix_spawn lookup on macOS, which was amplifying each ~1s poll into many failed spawns when many terminals were open (fixes#6332).

A new Manager.test case asserts the first four process-runner commands per platform: absolute paths on darwin, bare names on linux.

Reviewed by Cursor Bugbot for commit 16eedd9. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Use absolute binary paths for pgrep and ps in terminal polling on macOS

On macOS, posixInspectSubprocess in Manager.ts now calls /usr/bin/pgrep and /bin/ps directly instead of relying on PATH resolution. On Linux, bare command names are still used. A new test in Manager.test.ts verifies the correct command is invoked per platform.

Macroscope summarized 16eedd9.

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@github-actionsgithub-actionsBot added the size:S 10-29 changed lines (additions + deletions). label Aug 12, 2026
@github-actions

github-actionsBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB11.3 KiB+12 B (+0.1%)15.1 KiB
CodexThread snapshot wire5.5 KiB5.5 KiB+10 B (+0.2%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB5.9 KiB+2 B (+0.0%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB49.7 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB11.3 KiB0 B (0.0%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB5.5 KiB−3 B (−0.1%)7.3 KiB
ClaudeLive turn WebSocket wire5.9 KiB5.9 KiB+3 B (+0.0%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB50.6 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 18918d1 · PR result: 16eedd9 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 94.6 KiB
  • Claude decoded thread snapshot: 95.4 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 12, 2026
@macroscopeapp

macroscopeappBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 4b71bac

Performance optimization that uses absolute paths for pgrep and ps on macOS to avoid libuv PATH search overhead. The change is small, self-contained, and well-tested with no functional impact.

No code changes detected at 16eedd9. Prior analysis still applies.

You can customize Macroscope's approvability policy. Learn more.

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 12, 2026 20:30

Dismissing prior approval to re-evaluate 972740d

@github-actionsgithub-actionsBot added the vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. label Aug 12, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 12, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 12, 2026 20:35

Dismissing prior approval to re-evaluate 4b71bac

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@t3-code
t3-codeBotforce-pushed the fix/macos-terminal-poller-paths branch from 4b71bac to 16eedd9CompareAugust 12, 2026 20:40
@juliusmarminge

Copy link
Copy Markdown
Member

Closing as superseded by #6377, which has merged and covers this change on the current architecture. Thanks for the contribution.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug?]: Terminal subprocess poller spawns ~455 processes/sec (bare-name pgrep/ps against long PATH), exhausting the macOS PID space

1 participant

@juliusmarminge
, '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

fix(server): avoid macos path walks in terminal polling - #6372

Closed
t3-code[bot] wants to merge 3 commits into
mainfrom
fix/macos-terminal-poller-paths
Closed

fix(server): avoid macos path walks in terminal polling#6372
t3-code[bot] wants to merge 3 commits into
mainfrom
fix/macos-terminal-poller-paths

Conversation

@t3-code

@t3-codet3-codeBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

what changed

  • use /usr/bin/pgrep and /bin/ps for terminal subprocess polling on macos
  • retain bare utility names on linux and other posix platforms
  • cover every macos subprocess inspection path, including the command fallback probe

why

node/libuv resolves bare executable names by trying each path entry with posix_spawn on macos. because terminal subprocess activity is polled every second, this multiplied a few logical probes into hundreds of failed spawn attempts per second on machines with many terminals and a long path.

absolute paths bypass that lookup without changing the polling behavior. this removes about 94% of the reported spawn attempts in the 14-terminal, 17-entry case.

fixes#6332

verification

  • vp test run src/terminal/Manager.test.ts -t 'uses absolute utility paths' --maxWorkers=1
  • vp test run src/terminal/Manager.test.ts --maxWorkers=1
  • vp test run --maxWorkers=1 in apps/server: 229 files passed, 2 skipped; 2380 tests passed, 7 skipped
  • vp run --filter t3 typecheck
  • vp check apps/server/src/terminal/Manager.ts apps/server/src/terminal/Manager.test.ts

checklist

  • this pr is small and focused
  • i explained what changed and why

request provenance


Note

Low Risk
Behavioral change is limited to how utilities are invoked on macOS during subprocess inspection; polling logic and Linux paths are unchanged.

Overview
macOS terminal subprocess polling now invokes /usr/bin/pgrep and /bin/ps instead of resolving pgrep and ps through PATH, including the comm= and args= fallback probes in posixInspectSubprocess. Linux and other POSIX hosts still use the bare utility names.

This avoids libuv’s per-PATH-entry posix_spawn lookup on macOS, which was amplifying each ~1s poll into many failed spawns when many terminals were open (fixes#6332).

A new Manager.test case asserts the first four process-runner commands per platform: absolute paths on darwin, bare names on linux.

Reviewed by Cursor Bugbot for commit 16eedd9. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Use absolute binary paths for pgrep and ps in terminal polling on macOS

On macOS, posixInspectSubprocess in Manager.ts now calls /usr/bin/pgrep and /bin/ps directly instead of relying on PATH resolution. On Linux, bare command names are still used. A new test in Manager.test.ts verifies the correct command is invoked per platform.

Macroscope summarized 16eedd9.

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@github-actionsgithub-actionsBot added the size:S 10-29 changed lines (additions + deletions). label Aug 12, 2026
@github-actions

github-actionsBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB11.3 KiB+12 B (+0.1%)15.1 KiB
CodexThread snapshot wire5.5 KiB5.5 KiB+10 B (+0.2%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB5.9 KiB+2 B (+0.0%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB49.7 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB11.3 KiB0 B (0.0%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB5.5 KiB−3 B (−0.1%)7.3 KiB
ClaudeLive turn WebSocket wire5.9 KiB5.9 KiB+3 B (+0.0%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB50.6 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 18918d1 · PR result: 16eedd9 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 94.6 KiB
  • Claude decoded thread snapshot: 95.4 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 12, 2026
@macroscopeapp

macroscopeappBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 4b71bac

Performance optimization that uses absolute paths for pgrep and ps on macOS to avoid libuv PATH search overhead. The change is small, self-contained, and well-tested with no functional impact.

No code changes detected at 16eedd9. Prior analysis still applies.

You can customize Macroscope's approvability policy. Learn more.

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 12, 2026 20:30

Dismissing prior approval to re-evaluate 972740d

@github-actionsgithub-actionsBot added the vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. label Aug 12, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 12, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 12, 2026 20:35

Dismissing prior approval to re-evaluate 4b71bac

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@t3-code
t3-codeBotforce-pushed the fix/macos-terminal-poller-paths branch from 4b71bac to 16eedd9CompareAugust 12, 2026 20:40
@juliusmarminge

Copy link
Copy Markdown
Member

Closing as superseded by #6377, which has merged and covers this change on the current architecture. Thanks for the contribution.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug?]: Terminal subprocess poller spawns ~455 processes/sec (bare-name pgrep/ps against long PATH), exhausting the macOS PID space

1 participant

@juliusmarminge
, '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

fix(server): avoid macos path walks in terminal polling - #6372

Closed
t3-code[bot] wants to merge 3 commits into
mainfrom
fix/macos-terminal-poller-paths
Closed

fix(server): avoid macos path walks in terminal polling#6372
t3-code[bot] wants to merge 3 commits into
mainfrom
fix/macos-terminal-poller-paths

Conversation

@t3-code

@t3-codet3-codeBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

what changed

  • use /usr/bin/pgrep and /bin/ps for terminal subprocess polling on macos
  • retain bare utility names on linux and other posix platforms
  • cover every macos subprocess inspection path, including the command fallback probe

why

node/libuv resolves bare executable names by trying each path entry with posix_spawn on macos. because terminal subprocess activity is polled every second, this multiplied a few logical probes into hundreds of failed spawn attempts per second on machines with many terminals and a long path.

absolute paths bypass that lookup without changing the polling behavior. this removes about 94% of the reported spawn attempts in the 14-terminal, 17-entry case.

fixes#6332

verification

  • vp test run src/terminal/Manager.test.ts -t 'uses absolute utility paths' --maxWorkers=1
  • vp test run src/terminal/Manager.test.ts --maxWorkers=1
  • vp test run --maxWorkers=1 in apps/server: 229 files passed, 2 skipped; 2380 tests passed, 7 skipped
  • vp run --filter t3 typecheck
  • vp check apps/server/src/terminal/Manager.ts apps/server/src/terminal/Manager.test.ts

checklist

  • this pr is small and focused
  • i explained what changed and why

request provenance


Note

Low Risk
Behavioral change is limited to how utilities are invoked on macOS during subprocess inspection; polling logic and Linux paths are unchanged.

Overview
macOS terminal subprocess polling now invokes /usr/bin/pgrep and /bin/ps instead of resolving pgrep and ps through PATH, including the comm= and args= fallback probes in posixInspectSubprocess. Linux and other POSIX hosts still use the bare utility names.

This avoids libuv’s per-PATH-entry posix_spawn lookup on macOS, which was amplifying each ~1s poll into many failed spawns when many terminals were open (fixes#6332).

A new Manager.test case asserts the first four process-runner commands per platform: absolute paths on darwin, bare names on linux.

Reviewed by Cursor Bugbot for commit 16eedd9. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Use absolute binary paths for pgrep and ps in terminal polling on macOS

On macOS, posixInspectSubprocess in Manager.ts now calls /usr/bin/pgrep and /bin/ps directly instead of relying on PATH resolution. On Linux, bare command names are still used. A new test in Manager.test.ts verifies the correct command is invoked per platform.

Macroscope summarized 16eedd9.

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@github-actionsgithub-actionsBot added the size:S 10-29 changed lines (additions + deletions). label Aug 12, 2026
@github-actions

github-actionsBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB11.3 KiB+12 B (+0.1%)15.1 KiB
CodexThread snapshot wire5.5 KiB5.5 KiB+10 B (+0.2%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB5.9 KiB+2 B (+0.0%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB49.7 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB11.3 KiB0 B (0.0%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB5.5 KiB−3 B (−0.1%)7.3 KiB
ClaudeLive turn WebSocket wire5.9 KiB5.9 KiB+3 B (+0.0%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB50.6 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 18918d1 · PR result: 16eedd9 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 94.6 KiB
  • Claude decoded thread snapshot: 95.4 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 12, 2026
@macroscopeapp

macroscopeappBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 4b71bac

Performance optimization that uses absolute paths for pgrep and ps on macOS to avoid libuv PATH search overhead. The change is small, self-contained, and well-tested with no functional impact.

No code changes detected at 16eedd9. Prior analysis still applies.

You can customize Macroscope's approvability policy. Learn more.

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 12, 2026 20:30

Dismissing prior approval to re-evaluate 972740d

@github-actionsgithub-actionsBot added the vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. label Aug 12, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 12, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 12, 2026 20:35

Dismissing prior approval to re-evaluate 4b71bac

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@t3-code
t3-codeBotforce-pushed the fix/macos-terminal-poller-paths branch from 4b71bac to 16eedd9CompareAugust 12, 2026 20:40
@juliusmarminge

Copy link
Copy Markdown
Member

Closing as superseded by #6377, which has merged and covers this change on the current architecture. Thanks for the contribution.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug?]: Terminal subprocess poller spawns ~455 processes/sec (bare-name pgrep/ps against long PATH), exhausting the macOS PID space

1 participant

@juliusmarminge
, '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

fix(server): avoid macos path walks in terminal polling - #6372

Closed
t3-code[bot] wants to merge 3 commits into
mainfrom
fix/macos-terminal-poller-paths
Closed

fix(server): avoid macos path walks in terminal polling#6372
t3-code[bot] wants to merge 3 commits into
mainfrom
fix/macos-terminal-poller-paths

Conversation

@t3-code

@t3-codet3-codeBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

what changed

  • use /usr/bin/pgrep and /bin/ps for terminal subprocess polling on macos
  • retain bare utility names on linux and other posix platforms
  • cover every macos subprocess inspection path, including the command fallback probe

why

node/libuv resolves bare executable names by trying each path entry with posix_spawn on macos. because terminal subprocess activity is polled every second, this multiplied a few logical probes into hundreds of failed spawn attempts per second on machines with many terminals and a long path.

absolute paths bypass that lookup without changing the polling behavior. this removes about 94% of the reported spawn attempts in the 14-terminal, 17-entry case.

fixes#6332

verification

  • vp test run src/terminal/Manager.test.ts -t 'uses absolute utility paths' --maxWorkers=1
  • vp test run src/terminal/Manager.test.ts --maxWorkers=1
  • vp test run --maxWorkers=1 in apps/server: 229 files passed, 2 skipped; 2380 tests passed, 7 skipped
  • vp run --filter t3 typecheck
  • vp check apps/server/src/terminal/Manager.ts apps/server/src/terminal/Manager.test.ts

checklist

  • this pr is small and focused
  • i explained what changed and why

request provenance


Note

Low Risk
Behavioral change is limited to how utilities are invoked on macOS during subprocess inspection; polling logic and Linux paths are unchanged.

Overview
macOS terminal subprocess polling now invokes /usr/bin/pgrep and /bin/ps instead of resolving pgrep and ps through PATH, including the comm= and args= fallback probes in posixInspectSubprocess. Linux and other POSIX hosts still use the bare utility names.

This avoids libuv’s per-PATH-entry posix_spawn lookup on macOS, which was amplifying each ~1s poll into many failed spawns when many terminals were open (fixes#6332).

A new Manager.test case asserts the first four process-runner commands per platform: absolute paths on darwin, bare names on linux.

Reviewed by Cursor Bugbot for commit 16eedd9. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Use absolute binary paths for pgrep and ps in terminal polling on macOS

On macOS, posixInspectSubprocess in Manager.ts now calls /usr/bin/pgrep and /bin/ps directly instead of relying on PATH resolution. On Linux, bare command names are still used. A new test in Manager.test.ts verifies the correct command is invoked per platform.

Macroscope summarized 16eedd9.

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@github-actionsgithub-actionsBot added the size:S 10-29 changed lines (additions + deletions). label Aug 12, 2026
@github-actions

github-actionsBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB11.3 KiB+12 B (+0.1%)15.1 KiB
CodexThread snapshot wire5.5 KiB5.5 KiB+10 B (+0.2%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB5.9 KiB+2 B (+0.0%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB49.7 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB11.3 KiB0 B (0.0%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB5.5 KiB−3 B (−0.1%)7.3 KiB
ClaudeLive turn WebSocket wire5.9 KiB5.9 KiB+3 B (+0.0%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB50.6 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 18918d1 · PR result: 16eedd9 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 94.6 KiB
  • Claude decoded thread snapshot: 95.4 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 12, 2026
@macroscopeapp

macroscopeappBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 4b71bac

Performance optimization that uses absolute paths for pgrep and ps on macOS to avoid libuv PATH search overhead. The change is small, self-contained, and well-tested with no functional impact.

No code changes detected at 16eedd9. Prior analysis still applies.

You can customize Macroscope's approvability policy. Learn more.

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 12, 2026 20:30

Dismissing prior approval to re-evaluate 972740d

@github-actionsgithub-actionsBot added the vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. label Aug 12, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 12, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 12, 2026 20:35

Dismissing prior approval to re-evaluate 4b71bac

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@t3-code
t3-codeBotforce-pushed the fix/macos-terminal-poller-paths branch from 4b71bac to 16eedd9CompareAugust 12, 2026 20:40
@juliusmarminge

Copy link
Copy Markdown
Member

Closing as superseded by #6377, which has merged and covers this change on the current architecture. Thanks for the contribution.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug?]: Terminal subprocess poller spawns ~455 processes/sec (bare-name pgrep/ps against long PATH), exhausting the macOS PID space

1 participant

@juliusmarminge
, '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

fix(server): avoid macos path walks in terminal polling - #6372

Closed
t3-code[bot] wants to merge 3 commits into
mainfrom
fix/macos-terminal-poller-paths
Closed

fix(server): avoid macos path walks in terminal polling#6372
t3-code[bot] wants to merge 3 commits into
mainfrom
fix/macos-terminal-poller-paths

Conversation

@t3-code

@t3-codet3-codeBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

what changed

  • use /usr/bin/pgrep and /bin/ps for terminal subprocess polling on macos
  • retain bare utility names on linux and other posix platforms
  • cover every macos subprocess inspection path, including the command fallback probe

why

node/libuv resolves bare executable names by trying each path entry with posix_spawn on macos. because terminal subprocess activity is polled every second, this multiplied a few logical probes into hundreds of failed spawn attempts per second on machines with many terminals and a long path.

absolute paths bypass that lookup without changing the polling behavior. this removes about 94% of the reported spawn attempts in the 14-terminal, 17-entry case.

fixes#6332

verification

  • vp test run src/terminal/Manager.test.ts -t 'uses absolute utility paths' --maxWorkers=1
  • vp test run src/terminal/Manager.test.ts --maxWorkers=1
  • vp test run --maxWorkers=1 in apps/server: 229 files passed, 2 skipped; 2380 tests passed, 7 skipped
  • vp run --filter t3 typecheck
  • vp check apps/server/src/terminal/Manager.ts apps/server/src/terminal/Manager.test.ts

checklist

  • this pr is small and focused
  • i explained what changed and why

request provenance


Note

Low Risk
Behavioral change is limited to how utilities are invoked on macOS during subprocess inspection; polling logic and Linux paths are unchanged.

Overview
macOS terminal subprocess polling now invokes /usr/bin/pgrep and /bin/ps instead of resolving pgrep and ps through PATH, including the comm= and args= fallback probes in posixInspectSubprocess. Linux and other POSIX hosts still use the bare utility names.

This avoids libuv’s per-PATH-entry posix_spawn lookup on macOS, which was amplifying each ~1s poll into many failed spawns when many terminals were open (fixes#6332).

A new Manager.test case asserts the first four process-runner commands per platform: absolute paths on darwin, bare names on linux.

Reviewed by Cursor Bugbot for commit 16eedd9. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Use absolute binary paths for pgrep and ps in terminal polling on macOS

On macOS, posixInspectSubprocess in Manager.ts now calls /usr/bin/pgrep and /bin/ps directly instead of relying on PATH resolution. On Linux, bare command names are still used. A new test in Manager.test.ts verifies the correct command is invoked per platform.

Macroscope summarized 16eedd9.

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@github-actionsgithub-actionsBot added the size:S 10-29 changed lines (additions + deletions). label Aug 12, 2026
@github-actions

github-actionsBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB11.3 KiB+12 B (+0.1%)15.1 KiB
CodexThread snapshot wire5.5 KiB5.5 KiB+10 B (+0.2%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB5.9 KiB+2 B (+0.0%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB49.7 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB11.3 KiB0 B (0.0%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB5.5 KiB−3 B (−0.1%)7.3 KiB
ClaudeLive turn WebSocket wire5.9 KiB5.9 KiB+3 B (+0.0%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB50.6 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 18918d1 · PR result: 16eedd9 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 94.6 KiB
  • Claude decoded thread snapshot: 95.4 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 12, 2026
@macroscopeapp

macroscopeappBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 4b71bac

Performance optimization that uses absolute paths for pgrep and ps on macOS to avoid libuv PATH search overhead. The change is small, self-contained, and well-tested with no functional impact.

No code changes detected at 16eedd9. Prior analysis still applies.

You can customize Macroscope's approvability policy. Learn more.

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 12, 2026 20:30

Dismissing prior approval to re-evaluate 972740d

@github-actionsgithub-actionsBot added the vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. label Aug 12, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 12, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 12, 2026 20:35

Dismissing prior approval to re-evaluate 4b71bac

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@t3-code
t3-codeBotforce-pushed the fix/macos-terminal-poller-paths branch from 4b71bac to 16eedd9CompareAugust 12, 2026 20:40
@juliusmarminge

Copy link
Copy Markdown
Member

Closing as superseded by #6377, which has merged and covers this change on the current architecture. Thanks for the contribution.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug?]: Terminal subprocess poller spawns ~455 processes/sec (bare-name pgrep/ps against long PATH), exhausting the macOS PID space

1 participant

@juliusmarminge
, '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

fix(server): avoid macos path walks in terminal polling - #6372

Closed
t3-code[bot] wants to merge 3 commits into
mainfrom
fix/macos-terminal-poller-paths
Closed

fix(server): avoid macos path walks in terminal polling#6372
t3-code[bot] wants to merge 3 commits into
mainfrom
fix/macos-terminal-poller-paths

Conversation

@t3-code

@t3-codet3-codeBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

what changed

  • use /usr/bin/pgrep and /bin/ps for terminal subprocess polling on macos
  • retain bare utility names on linux and other posix platforms
  • cover every macos subprocess inspection path, including the command fallback probe

why

node/libuv resolves bare executable names by trying each path entry with posix_spawn on macos. because terminal subprocess activity is polled every second, this multiplied a few logical probes into hundreds of failed spawn attempts per second on machines with many terminals and a long path.

absolute paths bypass that lookup without changing the polling behavior. this removes about 94% of the reported spawn attempts in the 14-terminal, 17-entry case.

fixes#6332

verification

  • vp test run src/terminal/Manager.test.ts -t 'uses absolute utility paths' --maxWorkers=1
  • vp test run src/terminal/Manager.test.ts --maxWorkers=1
  • vp test run --maxWorkers=1 in apps/server: 229 files passed, 2 skipped; 2380 tests passed, 7 skipped
  • vp run --filter t3 typecheck
  • vp check apps/server/src/terminal/Manager.ts apps/server/src/terminal/Manager.test.ts

checklist

  • this pr is small and focused
  • i explained what changed and why

request provenance


Note

Low Risk
Behavioral change is limited to how utilities are invoked on macOS during subprocess inspection; polling logic and Linux paths are unchanged.

Overview
macOS terminal subprocess polling now invokes /usr/bin/pgrep and /bin/ps instead of resolving pgrep and ps through PATH, including the comm= and args= fallback probes in posixInspectSubprocess. Linux and other POSIX hosts still use the bare utility names.

This avoids libuv’s per-PATH-entry posix_spawn lookup on macOS, which was amplifying each ~1s poll into many failed spawns when many terminals were open (fixes#6332).

A new Manager.test case asserts the first four process-runner commands per platform: absolute paths on darwin, bare names on linux.

Reviewed by Cursor Bugbot for commit 16eedd9. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Use absolute binary paths for pgrep and ps in terminal polling on macOS

On macOS, posixInspectSubprocess in Manager.ts now calls /usr/bin/pgrep and /bin/ps directly instead of relying on PATH resolution. On Linux, bare command names are still used. A new test in Manager.test.ts verifies the correct command is invoked per platform.

Macroscope summarized 16eedd9.

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@github-actionsgithub-actionsBot added the size:S 10-29 changed lines (additions + deletions). label Aug 12, 2026
@github-actions

github-actionsBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB11.3 KiB+12 B (+0.1%)15.1 KiB
CodexThread snapshot wire5.5 KiB5.5 KiB+10 B (+0.2%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB5.9 KiB+2 B (+0.0%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB49.7 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB11.3 KiB0 B (0.0%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB5.5 KiB−3 B (−0.1%)7.3 KiB
ClaudeLive turn WebSocket wire5.9 KiB5.9 KiB+3 B (+0.0%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB50.6 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 18918d1 · PR result: 16eedd9 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 94.6 KiB
  • Claude decoded thread snapshot: 95.4 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 12, 2026
@macroscopeapp

macroscopeappBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 4b71bac

Performance optimization that uses absolute paths for pgrep and ps on macOS to avoid libuv PATH search overhead. The change is small, self-contained, and well-tested with no functional impact.

No code changes detected at 16eedd9. Prior analysis still applies.

You can customize Macroscope's approvability policy. Learn more.

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 12, 2026 20:30

Dismissing prior approval to re-evaluate 972740d

@github-actionsgithub-actionsBot added the vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. label Aug 12, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 12, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 12, 2026 20:35

Dismissing prior approval to re-evaluate 4b71bac

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@t3-code
t3-codeBotforce-pushed the fix/macos-terminal-poller-paths branch from 4b71bac to 16eedd9CompareAugust 12, 2026 20:40
@juliusmarminge

Copy link
Copy Markdown
Member

Closing as superseded by #6377, which has merged and covers this change on the current architecture. Thanks for the contribution.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug?]: Terminal subprocess poller spawns ~455 processes/sec (bare-name pgrep/ps against long PATH), exhausting the macOS PID space

1 participant

@juliusmarminge
, '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

fix(server): avoid macos path walks in terminal polling - #6372

Closed
t3-code[bot] wants to merge 3 commits into
mainfrom
fix/macos-terminal-poller-paths
Closed

fix(server): avoid macos path walks in terminal polling#6372
t3-code[bot] wants to merge 3 commits into
mainfrom
fix/macos-terminal-poller-paths

Conversation

@t3-code

@t3-codet3-codeBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

what changed

  • use /usr/bin/pgrep and /bin/ps for terminal subprocess polling on macos
  • retain bare utility names on linux and other posix platforms
  • cover every macos subprocess inspection path, including the command fallback probe

why

node/libuv resolves bare executable names by trying each path entry with posix_spawn on macos. because terminal subprocess activity is polled every second, this multiplied a few logical probes into hundreds of failed spawn attempts per second on machines with many terminals and a long path.

absolute paths bypass that lookup without changing the polling behavior. this removes about 94% of the reported spawn attempts in the 14-terminal, 17-entry case.

fixes#6332

verification

  • vp test run src/terminal/Manager.test.ts -t 'uses absolute utility paths' --maxWorkers=1
  • vp test run src/terminal/Manager.test.ts --maxWorkers=1
  • vp test run --maxWorkers=1 in apps/server: 229 files passed, 2 skipped; 2380 tests passed, 7 skipped
  • vp run --filter t3 typecheck
  • vp check apps/server/src/terminal/Manager.ts apps/server/src/terminal/Manager.test.ts

checklist

  • this pr is small and focused
  • i explained what changed and why

request provenance


Note

Low Risk
Behavioral change is limited to how utilities are invoked on macOS during subprocess inspection; polling logic and Linux paths are unchanged.

Overview
macOS terminal subprocess polling now invokes /usr/bin/pgrep and /bin/ps instead of resolving pgrep and ps through PATH, including the comm= and args= fallback probes in posixInspectSubprocess. Linux and other POSIX hosts still use the bare utility names.

This avoids libuv’s per-PATH-entry posix_spawn lookup on macOS, which was amplifying each ~1s poll into many failed spawns when many terminals were open (fixes#6332).

A new Manager.test case asserts the first four process-runner commands per platform: absolute paths on darwin, bare names on linux.

Reviewed by Cursor Bugbot for commit 16eedd9. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Use absolute binary paths for pgrep and ps in terminal polling on macOS

On macOS, posixInspectSubprocess in Manager.ts now calls /usr/bin/pgrep and /bin/ps directly instead of relying on PATH resolution. On Linux, bare command names are still used. A new test in Manager.test.ts verifies the correct command is invoked per platform.

Macroscope summarized 16eedd9.

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@github-actionsgithub-actionsBot added the size:S 10-29 changed lines (additions + deletions). label Aug 12, 2026
@github-actions

github-actionsBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB11.3 KiB+12 B (+0.1%)15.1 KiB
CodexThread snapshot wire5.5 KiB5.5 KiB+10 B (+0.2%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB5.9 KiB+2 B (+0.0%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB49.7 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB11.3 KiB0 B (0.0%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB5.5 KiB−3 B (−0.1%)7.3 KiB
ClaudeLive turn WebSocket wire5.9 KiB5.9 KiB+3 B (+0.0%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB50.6 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 18918d1 · PR result: 16eedd9 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 94.6 KiB
  • Claude decoded thread snapshot: 95.4 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 12, 2026
@macroscopeapp

macroscopeappBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 4b71bac

Performance optimization that uses absolute paths for pgrep and ps on macOS to avoid libuv PATH search overhead. The change is small, self-contained, and well-tested with no functional impact.

No code changes detected at 16eedd9. Prior analysis still applies.

You can customize Macroscope's approvability policy. Learn more.

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 12, 2026 20:30

Dismissing prior approval to re-evaluate 972740d

@github-actionsgithub-actionsBot added the vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. label Aug 12, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 12, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 12, 2026 20:35

Dismissing prior approval to re-evaluate 4b71bac

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@t3-code
t3-codeBotforce-pushed the fix/macos-terminal-poller-paths branch from 4b71bac to 16eedd9CompareAugust 12, 2026 20:40
@juliusmarminge

Copy link
Copy Markdown
Member

Closing as superseded by #6377, which has merged and covers this change on the current architecture. Thanks for the contribution.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug?]: Terminal subprocess poller spawns ~455 processes/sec (bare-name pgrep/ps against long PATH), exhausting the macOS PID space

1 participant

@juliusmarminge
, '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

fix(server): avoid macos path walks in terminal polling - #6372

Closed
t3-code[bot] wants to merge 3 commits into
mainfrom
fix/macos-terminal-poller-paths
Closed

fix(server): avoid macos path walks in terminal polling#6372
t3-code[bot] wants to merge 3 commits into
mainfrom
fix/macos-terminal-poller-paths

Conversation

@t3-code

@t3-codet3-codeBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

what changed

  • use /usr/bin/pgrep and /bin/ps for terminal subprocess polling on macos
  • retain bare utility names on linux and other posix platforms
  • cover every macos subprocess inspection path, including the command fallback probe

why

node/libuv resolves bare executable names by trying each path entry with posix_spawn on macos. because terminal subprocess activity is polled every second, this multiplied a few logical probes into hundreds of failed spawn attempts per second on machines with many terminals and a long path.

absolute paths bypass that lookup without changing the polling behavior. this removes about 94% of the reported spawn attempts in the 14-terminal, 17-entry case.

fixes#6332

verification

  • vp test run src/terminal/Manager.test.ts -t 'uses absolute utility paths' --maxWorkers=1
  • vp test run src/terminal/Manager.test.ts --maxWorkers=1
  • vp test run --maxWorkers=1 in apps/server: 229 files passed, 2 skipped; 2380 tests passed, 7 skipped
  • vp run --filter t3 typecheck
  • vp check apps/server/src/terminal/Manager.ts apps/server/src/terminal/Manager.test.ts

checklist

  • this pr is small and focused
  • i explained what changed and why

request provenance


Note

Low Risk
Behavioral change is limited to how utilities are invoked on macOS during subprocess inspection; polling logic and Linux paths are unchanged.

Overview
macOS terminal subprocess polling now invokes /usr/bin/pgrep and /bin/ps instead of resolving pgrep and ps through PATH, including the comm= and args= fallback probes in posixInspectSubprocess. Linux and other POSIX hosts still use the bare utility names.

This avoids libuv’s per-PATH-entry posix_spawn lookup on macOS, which was amplifying each ~1s poll into many failed spawns when many terminals were open (fixes#6332).

A new Manager.test case asserts the first four process-runner commands per platform: absolute paths on darwin, bare names on linux.

Reviewed by Cursor Bugbot for commit 16eedd9. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Use absolute binary paths for pgrep and ps in terminal polling on macOS

On macOS, posixInspectSubprocess in Manager.ts now calls /usr/bin/pgrep and /bin/ps directly instead of relying on PATH resolution. On Linux, bare command names are still used. A new test in Manager.test.ts verifies the correct command is invoked per platform.

Macroscope summarized 16eedd9.

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@github-actionsgithub-actionsBot added the size:S 10-29 changed lines (additions + deletions). label Aug 12, 2026
@github-actions

github-actionsBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB11.3 KiB+12 B (+0.1%)15.1 KiB
CodexThread snapshot wire5.5 KiB5.5 KiB+10 B (+0.2%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB5.9 KiB+2 B (+0.0%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB49.7 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB11.3 KiB0 B (0.0%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB5.5 KiB−3 B (−0.1%)7.3 KiB
ClaudeLive turn WebSocket wire5.9 KiB5.9 KiB+3 B (+0.0%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB50.6 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 18918d1 · PR result: 16eedd9 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 94.6 KiB
  • Claude decoded thread snapshot: 95.4 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 12, 2026
@macroscopeapp

macroscopeappBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 4b71bac

Performance optimization that uses absolute paths for pgrep and ps on macOS to avoid libuv PATH search overhead. The change is small, self-contained, and well-tested with no functional impact.

No code changes detected at 16eedd9. Prior analysis still applies.

You can customize Macroscope's approvability policy. Learn more.

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 12, 2026 20:30

Dismissing prior approval to re-evaluate 972740d

@github-actionsgithub-actionsBot added the vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. label Aug 12, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 12, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 12, 2026 20:35

Dismissing prior approval to re-evaluate 4b71bac

Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
@t3-code
t3-codeBotforce-pushed the fix/macos-terminal-poller-paths branch from 4b71bac to 16eedd9CompareAugust 12, 2026 20:40
@juliusmarminge

Copy link
Copy Markdown
Member

Closing as superseded by #6377, which has merged and covers this change on the current architecture. Thanks for the contribution.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug?]: Terminal subprocess poller spawns ~455 processes/sec (bare-name pgrep/ps against long PATH), exhausting the macOS PID space

1 participant

@juliusmarminge