Increase Effect RPC ping timeout for large snapshots - #2885

Closed
Pearcekieser wants to merge 1 commit into
pingdotgg:mainfrom
pearce-codes:2026-05-31-effect-heartbeat-timeout
Closed

Increase Effect RPC ping timeout for large snapshots#2885
Pearcekieser wants to merge 1 commit into
pingdotgg:mainfrom
pearce-codes:2026-05-31-effect-heartbeat-timeout

Conversation

@Pearcekieser

@PearcekieserPearcekieser commented May 31, 2026

Copy link
Copy Markdown

What Changed

Increases the patched Effect RPC pinger delay from 5 seconds to 60 seconds.

This changes the existing patches/effect@4.0.0-beta.73.patch so the generated RPC client waits longer before declaring the connection unhealthy due to a missed Pong.

Why

Large thread snapshots can occupy the WebSocket long enough that the Effect RPC Pong is queued behind snapshot chunks. On slow remote connections, the current 5 second heartbeat window can expire before the Pong reaches the client, causing a reconnect. The reconnect then requests the same large snapshot again, which can repeat the failure loop.

A 60 second window gives large snapshot sends more time to drain before the client treats the connection as dead.

This is a small mitigation for #2761. It does not solve the deeper issue that large snapshots and control/heartbeat messages share the same WebSocket queue; longer term, snapshots likely need pagination, truncation, backpressure, or control-message prioritization.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • UI changes are not applicable

Note

Increase Effect RPC ping interval to 60 seconds for large snapshot support

  • Updates patches/effect@4.0.0-beta.78.patch to change the protocol worker ping interval from 5 seconds to 60 seconds.
  • Adds an hooks.onPing call (when provided) before each ping is sent, allowing pre-ping side effects.
  • Behavioral Change: ping frequency drops from every 5s to every 60s, which may affect connection keepalive behavior in environments with short idle timeouts.

Macroscope summarized 2825718.


Note

Medium Risk
Changes connection health detection for all Effect RPC WebSocket clients; a 60s window delays detection of truly dead peers but reduces false reconnect loops during heavy snapshot traffic.

Overview
Updates the vendored effect@4.0.0-beta.78 patch so the RPC socket pinger waits 60 seconds between ping attempts instead of 5 seconds, giving large WebSocket transfers (e.g. thread snapshots) more time before the client treats a missing Pong as a dead connection.

The same patch delta wires ConnectionHooks into the ping loop: onPong runs after recording a pong, onPing runs before writePing, and both default to Effect.void when unset. pnpm-lock.yaml is refreshed so every workspace consumer resolves the new effect patch hash.

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

@coderabbitai

coderabbitaiBot commented May 31, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 869b0f55-01e6-4fd4-8ceb-cad2894b8ac5

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels May 31, 2026
@Pearcekieser
Pearcekieser marked this pull request as ready for review May 31, 2026 05:53
macroscopeapp[bot]
macroscopeappBot previously approved these changes May 31, 2026
@macroscopeapp

macroscopeappBot commented May 31, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved

Simple timeout configuration change from 5 to 60 seconds in an Effect RPC patch to handle large snapshots. The lockfile changes are mechanical hash updates from the patch modification.

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

duncan4123 pushed a commit to duncan4123/t3code that referenced this pull request Jun 2, 2026
@t3dotggChatGPT Codex Connector

Copy link
Copy Markdown
Member

I resolved the rebase locally, but this PR’s branch is in the organization-owned pearce-codes/t3code fork. GitHub rejects maintainer pushes to that fork, and the Update Branch API also reports a conflict. Please rebase the branch onto current main (the patch now targets patches/effect@4.0.0-beta.78.patch) or grant push access to the fork branch.

@Pearcekieser
Pearcekieserforce-pushed the 2026-05-31-effect-heartbeat-timeout branch from 81c603e to 6e69066CompareJuly 7, 2026 19:19
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 7, 2026 19:20

Dismissing prior approval to re-evaluate 6e69066

@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:XS 0-9 changed lines (additions + deletions). labels Jul 7, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 7, 2026
@Pearcekieser
Pearcekieserforce-pushed the 2026-05-31-effect-heartbeat-timeout branch from 6e69066 to 644cc92CompareJuly 8, 2026 21:25
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 8, 2026 21:26

Dismissing prior approval to re-evaluate 644cc92

macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 8, 2026
@Pearcekieser

Pearcekieser commented Jul 8, 2026

Copy link
Copy Markdown
Author

Thank for looking at this. Sorry for the delay was out on vacation. I recently started running into this timeouts again, so I'm hopeful this will help me and others.

I updated this to main. I don't think orgs owned branches allow pushes from upstream's maintainers, so I re opened this under a different PR if you need to edit.
New PR on a maintainer-pushable branch: #3817

Also @mincua suggested the same fix here so please try to give him credit if you merge this: #3500

Seems like this could also help fix:
#3553
#3734

@Pearcekieser
Pearcekieserforce-pushed the 2026-05-31-effect-heartbeat-timeout branch from 644cc92 to 2825718CompareJuly 10, 2026 23:07
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 10, 2026 23:07

Dismissing prior approval to re-evaluate 2825718

@juliusmarminge

Copy link
Copy Markdown
Member

Closing because the author-designated maintainer-editable replacement is #3817. The replacement PR explicitly carries this work forward.

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

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

Increase Effect RPC ping timeout for large snapshots - #2885

Closed
Pearcekieser wants to merge 1 commit into
pingdotgg:mainfrom
pearce-codes:2026-05-31-effect-heartbeat-timeout
Closed

Increase Effect RPC ping timeout for large snapshots#2885
Pearcekieser wants to merge 1 commit into
pingdotgg:mainfrom
pearce-codes:2026-05-31-effect-heartbeat-timeout

Conversation

@Pearcekieser

@PearcekieserPearcekieser commented May 31, 2026

Copy link
Copy Markdown

What Changed

Increases the patched Effect RPC pinger delay from 5 seconds to 60 seconds.

This changes the existing patches/effect@4.0.0-beta.73.patch so the generated RPC client waits longer before declaring the connection unhealthy due to a missed Pong.

Why

Large thread snapshots can occupy the WebSocket long enough that the Effect RPC Pong is queued behind snapshot chunks. On slow remote connections, the current 5 second heartbeat window can expire before the Pong reaches the client, causing a reconnect. The reconnect then requests the same large snapshot again, which can repeat the failure loop.

A 60 second window gives large snapshot sends more time to drain before the client treats the connection as dead.

This is a small mitigation for #2761. It does not solve the deeper issue that large snapshots and control/heartbeat messages share the same WebSocket queue; longer term, snapshots likely need pagination, truncation, backpressure, or control-message prioritization.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • UI changes are not applicable

Note

Increase Effect RPC ping interval to 60 seconds for large snapshot support

  • Updates patches/effect@4.0.0-beta.78.patch to change the protocol worker ping interval from 5 seconds to 60 seconds.
  • Adds an hooks.onPing call (when provided) before each ping is sent, allowing pre-ping side effects.
  • Behavioral Change: ping frequency drops from every 5s to every 60s, which may affect connection keepalive behavior in environments with short idle timeouts.

Macroscope summarized 2825718.


Note

Medium Risk
Changes connection health detection for all Effect RPC WebSocket clients; a 60s window delays detection of truly dead peers but reduces false reconnect loops during heavy snapshot traffic.

Overview
Updates the vendored effect@4.0.0-beta.78 patch so the RPC socket pinger waits 60 seconds between ping attempts instead of 5 seconds, giving large WebSocket transfers (e.g. thread snapshots) more time before the client treats a missing Pong as a dead connection.

The same patch delta wires ConnectionHooks into the ping loop: onPong runs after recording a pong, onPing runs before writePing, and both default to Effect.void when unset. pnpm-lock.yaml is refreshed so every workspace consumer resolves the new effect patch hash.

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

@coderabbitai

coderabbitaiBot commented May 31, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 869b0f55-01e6-4fd4-8ceb-cad2894b8ac5

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels May 31, 2026
@Pearcekieser
Pearcekieser marked this pull request as ready for review May 31, 2026 05:53
macroscopeapp[bot]
macroscopeappBot previously approved these changes May 31, 2026
@macroscopeapp

macroscopeappBot commented May 31, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved

Simple timeout configuration change from 5 to 60 seconds in an Effect RPC patch to handle large snapshots. The lockfile changes are mechanical hash updates from the patch modification.

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

duncan4123 pushed a commit to duncan4123/t3code that referenced this pull request Jun 2, 2026
@t3dotggChatGPT Codex Connector

Copy link
Copy Markdown
Member

I resolved the rebase locally, but this PR’s branch is in the organization-owned pearce-codes/t3code fork. GitHub rejects maintainer pushes to that fork, and the Update Branch API also reports a conflict. Please rebase the branch onto current main (the patch now targets patches/effect@4.0.0-beta.78.patch) or grant push access to the fork branch.

@Pearcekieser
Pearcekieserforce-pushed the 2026-05-31-effect-heartbeat-timeout branch from 81c603e to 6e69066CompareJuly 7, 2026 19:19
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 7, 2026 19:20

Dismissing prior approval to re-evaluate 6e69066

@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:XS 0-9 changed lines (additions + deletions). labels Jul 7, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 7, 2026
@Pearcekieser
Pearcekieserforce-pushed the 2026-05-31-effect-heartbeat-timeout branch from 6e69066 to 644cc92CompareJuly 8, 2026 21:25
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 8, 2026 21:26

Dismissing prior approval to re-evaluate 644cc92

macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 8, 2026
@Pearcekieser

Pearcekieser commented Jul 8, 2026

Copy link
Copy Markdown
Author

Thank for looking at this. Sorry for the delay was out on vacation. I recently started running into this timeouts again, so I'm hopeful this will help me and others.

I updated this to main. I don't think orgs owned branches allow pushes from upstream's maintainers, so I re opened this under a different PR if you need to edit.
New PR on a maintainer-pushable branch: #3817

Also @mincua suggested the same fix here so please try to give him credit if you merge this: #3500

Seems like this could also help fix:
#3553
#3734

@Pearcekieser
Pearcekieserforce-pushed the 2026-05-31-effect-heartbeat-timeout branch from 644cc92 to 2825718CompareJuly 10, 2026 23:07
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 10, 2026 23:07

Dismissing prior approval to re-evaluate 2825718

@juliusmarminge

Copy link
Copy Markdown
Member

Closing because the author-designated maintainer-editable replacement is #3817. The replacement PR explicitly carries this work forward.

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

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

Increase Effect RPC ping timeout for large snapshots - #2885

Closed
Pearcekieser wants to merge 1 commit into
pingdotgg:mainfrom
pearce-codes:2026-05-31-effect-heartbeat-timeout
Closed

Increase Effect RPC ping timeout for large snapshots#2885
Pearcekieser wants to merge 1 commit into
pingdotgg:mainfrom
pearce-codes:2026-05-31-effect-heartbeat-timeout

Conversation

@Pearcekieser

@PearcekieserPearcekieser commented May 31, 2026

Copy link
Copy Markdown

What Changed

Increases the patched Effect RPC pinger delay from 5 seconds to 60 seconds.

This changes the existing patches/effect@4.0.0-beta.73.patch so the generated RPC client waits longer before declaring the connection unhealthy due to a missed Pong.

Why

Large thread snapshots can occupy the WebSocket long enough that the Effect RPC Pong is queued behind snapshot chunks. On slow remote connections, the current 5 second heartbeat window can expire before the Pong reaches the client, causing a reconnect. The reconnect then requests the same large snapshot again, which can repeat the failure loop.

A 60 second window gives large snapshot sends more time to drain before the client treats the connection as dead.

This is a small mitigation for #2761. It does not solve the deeper issue that large snapshots and control/heartbeat messages share the same WebSocket queue; longer term, snapshots likely need pagination, truncation, backpressure, or control-message prioritization.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • UI changes are not applicable

Note

Increase Effect RPC ping interval to 60 seconds for large snapshot support

  • Updates patches/effect@4.0.0-beta.78.patch to change the protocol worker ping interval from 5 seconds to 60 seconds.
  • Adds an hooks.onPing call (when provided) before each ping is sent, allowing pre-ping side effects.
  • Behavioral Change: ping frequency drops from every 5s to every 60s, which may affect connection keepalive behavior in environments with short idle timeouts.

Macroscope summarized 2825718.


Note

Medium Risk
Changes connection health detection for all Effect RPC WebSocket clients; a 60s window delays detection of truly dead peers but reduces false reconnect loops during heavy snapshot traffic.

Overview
Updates the vendored effect@4.0.0-beta.78 patch so the RPC socket pinger waits 60 seconds between ping attempts instead of 5 seconds, giving large WebSocket transfers (e.g. thread snapshots) more time before the client treats a missing Pong as a dead connection.

The same patch delta wires ConnectionHooks into the ping loop: onPong runs after recording a pong, onPing runs before writePing, and both default to Effect.void when unset. pnpm-lock.yaml is refreshed so every workspace consumer resolves the new effect patch hash.

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

@coderabbitai

coderabbitaiBot commented May 31, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 869b0f55-01e6-4fd4-8ceb-cad2894b8ac5

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels May 31, 2026
@Pearcekieser
Pearcekieser marked this pull request as ready for review May 31, 2026 05:53
macroscopeapp[bot]
macroscopeappBot previously approved these changes May 31, 2026
@macroscopeapp

macroscopeappBot commented May 31, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved

Simple timeout configuration change from 5 to 60 seconds in an Effect RPC patch to handle large snapshots. The lockfile changes are mechanical hash updates from the patch modification.

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

duncan4123 pushed a commit to duncan4123/t3code that referenced this pull request Jun 2, 2026
@t3dotggChatGPT Codex Connector

Copy link
Copy Markdown
Member

I resolved the rebase locally, but this PR’s branch is in the organization-owned pearce-codes/t3code fork. GitHub rejects maintainer pushes to that fork, and the Update Branch API also reports a conflict. Please rebase the branch onto current main (the patch now targets patches/effect@4.0.0-beta.78.patch) or grant push access to the fork branch.

@Pearcekieser
Pearcekieserforce-pushed the 2026-05-31-effect-heartbeat-timeout branch from 81c603e to 6e69066CompareJuly 7, 2026 19:19
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 7, 2026 19:20

Dismissing prior approval to re-evaluate 6e69066

@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:XS 0-9 changed lines (additions + deletions). labels Jul 7, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 7, 2026
@Pearcekieser
Pearcekieserforce-pushed the 2026-05-31-effect-heartbeat-timeout branch from 6e69066 to 644cc92CompareJuly 8, 2026 21:25
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 8, 2026 21:26

Dismissing prior approval to re-evaluate 644cc92

macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 8, 2026
@Pearcekieser

Pearcekieser commented Jul 8, 2026

Copy link
Copy Markdown
Author

Thank for looking at this. Sorry for the delay was out on vacation. I recently started running into this timeouts again, so I'm hopeful this will help me and others.

I updated this to main. I don't think orgs owned branches allow pushes from upstream's maintainers, so I re opened this under a different PR if you need to edit.
New PR on a maintainer-pushable branch: #3817

Also @mincua suggested the same fix here so please try to give him credit if you merge this: #3500

Seems like this could also help fix:
#3553
#3734

@Pearcekieser
Pearcekieserforce-pushed the 2026-05-31-effect-heartbeat-timeout branch from 644cc92 to 2825718CompareJuly 10, 2026 23:07
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 10, 2026 23:07

Dismissing prior approval to re-evaluate 2825718

@juliusmarminge

Copy link
Copy Markdown
Member

Closing because the author-designated maintainer-editable replacement is #3817. The replacement PR explicitly carries this work forward.

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

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

Increase Effect RPC ping timeout for large snapshots - #2885

Closed
Pearcekieser wants to merge 1 commit into
pingdotgg:mainfrom
pearce-codes:2026-05-31-effect-heartbeat-timeout
Closed

Increase Effect RPC ping timeout for large snapshots#2885
Pearcekieser wants to merge 1 commit into
pingdotgg:mainfrom
pearce-codes:2026-05-31-effect-heartbeat-timeout

Conversation

@Pearcekieser

@PearcekieserPearcekieser commented May 31, 2026

Copy link
Copy Markdown

What Changed

Increases the patched Effect RPC pinger delay from 5 seconds to 60 seconds.

This changes the existing patches/effect@4.0.0-beta.73.patch so the generated RPC client waits longer before declaring the connection unhealthy due to a missed Pong.

Why

Large thread snapshots can occupy the WebSocket long enough that the Effect RPC Pong is queued behind snapshot chunks. On slow remote connections, the current 5 second heartbeat window can expire before the Pong reaches the client, causing a reconnect. The reconnect then requests the same large snapshot again, which can repeat the failure loop.

A 60 second window gives large snapshot sends more time to drain before the client treats the connection as dead.

This is a small mitigation for #2761. It does not solve the deeper issue that large snapshots and control/heartbeat messages share the same WebSocket queue; longer term, snapshots likely need pagination, truncation, backpressure, or control-message prioritization.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • UI changes are not applicable

Note

Increase Effect RPC ping interval to 60 seconds for large snapshot support

  • Updates patches/effect@4.0.0-beta.78.patch to change the protocol worker ping interval from 5 seconds to 60 seconds.
  • Adds an hooks.onPing call (when provided) before each ping is sent, allowing pre-ping side effects.
  • Behavioral Change: ping frequency drops from every 5s to every 60s, which may affect connection keepalive behavior in environments with short idle timeouts.

Macroscope summarized 2825718.


Note

Medium Risk
Changes connection health detection for all Effect RPC WebSocket clients; a 60s window delays detection of truly dead peers but reduces false reconnect loops during heavy snapshot traffic.

Overview
Updates the vendored effect@4.0.0-beta.78 patch so the RPC socket pinger waits 60 seconds between ping attempts instead of 5 seconds, giving large WebSocket transfers (e.g. thread snapshots) more time before the client treats a missing Pong as a dead connection.

The same patch delta wires ConnectionHooks into the ping loop: onPong runs after recording a pong, onPing runs before writePing, and both default to Effect.void when unset. pnpm-lock.yaml is refreshed so every workspace consumer resolves the new effect patch hash.

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

@coderabbitai

coderabbitaiBot commented May 31, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 869b0f55-01e6-4fd4-8ceb-cad2894b8ac5

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels May 31, 2026
@Pearcekieser
Pearcekieser marked this pull request as ready for review May 31, 2026 05:53
macroscopeapp[bot]
macroscopeappBot previously approved these changes May 31, 2026
@macroscopeapp

macroscopeappBot commented May 31, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved

Simple timeout configuration change from 5 to 60 seconds in an Effect RPC patch to handle large snapshots. The lockfile changes are mechanical hash updates from the patch modification.

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

duncan4123 pushed a commit to duncan4123/t3code that referenced this pull request Jun 2, 2026
@t3dotggChatGPT Codex Connector

Copy link
Copy Markdown
Member

I resolved the rebase locally, but this PR’s branch is in the organization-owned pearce-codes/t3code fork. GitHub rejects maintainer pushes to that fork, and the Update Branch API also reports a conflict. Please rebase the branch onto current main (the patch now targets patches/effect@4.0.0-beta.78.patch) or grant push access to the fork branch.

@Pearcekieser
Pearcekieserforce-pushed the 2026-05-31-effect-heartbeat-timeout branch from 81c603e to 6e69066CompareJuly 7, 2026 19:19
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 7, 2026 19:20

Dismissing prior approval to re-evaluate 6e69066

@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:XS 0-9 changed lines (additions + deletions). labels Jul 7, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 7, 2026
@Pearcekieser
Pearcekieserforce-pushed the 2026-05-31-effect-heartbeat-timeout branch from 6e69066 to 644cc92CompareJuly 8, 2026 21:25
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 8, 2026 21:26

Dismissing prior approval to re-evaluate 644cc92

macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 8, 2026
@Pearcekieser

Pearcekieser commented Jul 8, 2026

Copy link
Copy Markdown
Author

Thank for looking at this. Sorry for the delay was out on vacation. I recently started running into this timeouts again, so I'm hopeful this will help me and others.

I updated this to main. I don't think orgs owned branches allow pushes from upstream's maintainers, so I re opened this under a different PR if you need to edit.
New PR on a maintainer-pushable branch: #3817

Also @mincua suggested the same fix here so please try to give him credit if you merge this: #3500

Seems like this could also help fix:
#3553
#3734

@Pearcekieser
Pearcekieserforce-pushed the 2026-05-31-effect-heartbeat-timeout branch from 644cc92 to 2825718CompareJuly 10, 2026 23:07
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 10, 2026 23:07

Dismissing prior approval to re-evaluate 2825718

@juliusmarminge

Copy link
Copy Markdown
Member

Closing because the author-designated maintainer-editable replacement is #3817. The replacement PR explicitly carries this work forward.

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

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

Increase Effect RPC ping timeout for large snapshots - #2885

Closed
Pearcekieser wants to merge 1 commit into
pingdotgg:mainfrom
pearce-codes:2026-05-31-effect-heartbeat-timeout
Closed

Increase Effect RPC ping timeout for large snapshots#2885
Pearcekieser wants to merge 1 commit into
pingdotgg:mainfrom
pearce-codes:2026-05-31-effect-heartbeat-timeout

Conversation

@Pearcekieser

@PearcekieserPearcekieser commented May 31, 2026

Copy link
Copy Markdown

What Changed

Increases the patched Effect RPC pinger delay from 5 seconds to 60 seconds.

This changes the existing patches/effect@4.0.0-beta.73.patch so the generated RPC client waits longer before declaring the connection unhealthy due to a missed Pong.

Why

Large thread snapshots can occupy the WebSocket long enough that the Effect RPC Pong is queued behind snapshot chunks. On slow remote connections, the current 5 second heartbeat window can expire before the Pong reaches the client, causing a reconnect. The reconnect then requests the same large snapshot again, which can repeat the failure loop.

A 60 second window gives large snapshot sends more time to drain before the client treats the connection as dead.

This is a small mitigation for #2761. It does not solve the deeper issue that large snapshots and control/heartbeat messages share the same WebSocket queue; longer term, snapshots likely need pagination, truncation, backpressure, or control-message prioritization.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • UI changes are not applicable

Note

Increase Effect RPC ping interval to 60 seconds for large snapshot support

  • Updates patches/effect@4.0.0-beta.78.patch to change the protocol worker ping interval from 5 seconds to 60 seconds.
  • Adds an hooks.onPing call (when provided) before each ping is sent, allowing pre-ping side effects.
  • Behavioral Change: ping frequency drops from every 5s to every 60s, which may affect connection keepalive behavior in environments with short idle timeouts.

Macroscope summarized 2825718.


Note

Medium Risk
Changes connection health detection for all Effect RPC WebSocket clients; a 60s window delays detection of truly dead peers but reduces false reconnect loops during heavy snapshot traffic.

Overview
Updates the vendored effect@4.0.0-beta.78 patch so the RPC socket pinger waits 60 seconds between ping attempts instead of 5 seconds, giving large WebSocket transfers (e.g. thread snapshots) more time before the client treats a missing Pong as a dead connection.

The same patch delta wires ConnectionHooks into the ping loop: onPong runs after recording a pong, onPing runs before writePing, and both default to Effect.void when unset. pnpm-lock.yaml is refreshed so every workspace consumer resolves the new effect patch hash.

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

@coderabbitai

coderabbitaiBot commented May 31, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 869b0f55-01e6-4fd4-8ceb-cad2894b8ac5

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels May 31, 2026
@Pearcekieser
Pearcekieser marked this pull request as ready for review May 31, 2026 05:53
macroscopeapp[bot]
macroscopeappBot previously approved these changes May 31, 2026
@macroscopeapp

macroscopeappBot commented May 31, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved

Simple timeout configuration change from 5 to 60 seconds in an Effect RPC patch to handle large snapshots. The lockfile changes are mechanical hash updates from the patch modification.

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

duncan4123 pushed a commit to duncan4123/t3code that referenced this pull request Jun 2, 2026
@t3dotggChatGPT Codex Connector

Copy link
Copy Markdown
Member

I resolved the rebase locally, but this PR’s branch is in the organization-owned pearce-codes/t3code fork. GitHub rejects maintainer pushes to that fork, and the Update Branch API also reports a conflict. Please rebase the branch onto current main (the patch now targets patches/effect@4.0.0-beta.78.patch) or grant push access to the fork branch.

@Pearcekieser
Pearcekieserforce-pushed the 2026-05-31-effect-heartbeat-timeout branch from 81c603e to 6e69066CompareJuly 7, 2026 19:19
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 7, 2026 19:20

Dismissing prior approval to re-evaluate 6e69066

@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:XS 0-9 changed lines (additions + deletions). labels Jul 7, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 7, 2026
@Pearcekieser
Pearcekieserforce-pushed the 2026-05-31-effect-heartbeat-timeout branch from 6e69066 to 644cc92CompareJuly 8, 2026 21:25
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 8, 2026 21:26

Dismissing prior approval to re-evaluate 644cc92

macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 8, 2026
@Pearcekieser

Pearcekieser commented Jul 8, 2026

Copy link
Copy Markdown
Author

Thank for looking at this. Sorry for the delay was out on vacation. I recently started running into this timeouts again, so I'm hopeful this will help me and others.

I updated this to main. I don't think orgs owned branches allow pushes from upstream's maintainers, so I re opened this under a different PR if you need to edit.
New PR on a maintainer-pushable branch: #3817

Also @mincua suggested the same fix here so please try to give him credit if you merge this: #3500

Seems like this could also help fix:
#3553
#3734

@Pearcekieser
Pearcekieserforce-pushed the 2026-05-31-effect-heartbeat-timeout branch from 644cc92 to 2825718CompareJuly 10, 2026 23:07
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 10, 2026 23:07

Dismissing prior approval to re-evaluate 2825718

@juliusmarminge

Copy link
Copy Markdown
Member

Closing because the author-designated maintainer-editable replacement is #3817. The replacement PR explicitly carries this work forward.

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

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

Increase Effect RPC ping timeout for large snapshots - #2885

Closed
Pearcekieser wants to merge 1 commit into
pingdotgg:mainfrom
pearce-codes:2026-05-31-effect-heartbeat-timeout
Closed

Increase Effect RPC ping timeout for large snapshots#2885
Pearcekieser wants to merge 1 commit into
pingdotgg:mainfrom
pearce-codes:2026-05-31-effect-heartbeat-timeout

Conversation

@Pearcekieser

@PearcekieserPearcekieser commented May 31, 2026

Copy link
Copy Markdown

What Changed

Increases the patched Effect RPC pinger delay from 5 seconds to 60 seconds.

This changes the existing patches/effect@4.0.0-beta.73.patch so the generated RPC client waits longer before declaring the connection unhealthy due to a missed Pong.

Why

Large thread snapshots can occupy the WebSocket long enough that the Effect RPC Pong is queued behind snapshot chunks. On slow remote connections, the current 5 second heartbeat window can expire before the Pong reaches the client, causing a reconnect. The reconnect then requests the same large snapshot again, which can repeat the failure loop.

A 60 second window gives large snapshot sends more time to drain before the client treats the connection as dead.

This is a small mitigation for #2761. It does not solve the deeper issue that large snapshots and control/heartbeat messages share the same WebSocket queue; longer term, snapshots likely need pagination, truncation, backpressure, or control-message prioritization.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • UI changes are not applicable

Note

Increase Effect RPC ping interval to 60 seconds for large snapshot support

  • Updates patches/effect@4.0.0-beta.78.patch to change the protocol worker ping interval from 5 seconds to 60 seconds.
  • Adds an hooks.onPing call (when provided) before each ping is sent, allowing pre-ping side effects.
  • Behavioral Change: ping frequency drops from every 5s to every 60s, which may affect connection keepalive behavior in environments with short idle timeouts.

Macroscope summarized 2825718.


Note

Medium Risk
Changes connection health detection for all Effect RPC WebSocket clients; a 60s window delays detection of truly dead peers but reduces false reconnect loops during heavy snapshot traffic.

Overview
Updates the vendored effect@4.0.0-beta.78 patch so the RPC socket pinger waits 60 seconds between ping attempts instead of 5 seconds, giving large WebSocket transfers (e.g. thread snapshots) more time before the client treats a missing Pong as a dead connection.

The same patch delta wires ConnectionHooks into the ping loop: onPong runs after recording a pong, onPing runs before writePing, and both default to Effect.void when unset. pnpm-lock.yaml is refreshed so every workspace consumer resolves the new effect patch hash.

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

@coderabbitai

coderabbitaiBot commented May 31, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 869b0f55-01e6-4fd4-8ceb-cad2894b8ac5

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels May 31, 2026
@Pearcekieser
Pearcekieser marked this pull request as ready for review May 31, 2026 05:53
macroscopeapp[bot]
macroscopeappBot previously approved these changes May 31, 2026
@macroscopeapp

macroscopeappBot commented May 31, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved

Simple timeout configuration change from 5 to 60 seconds in an Effect RPC patch to handle large snapshots. The lockfile changes are mechanical hash updates from the patch modification.

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

duncan4123 pushed a commit to duncan4123/t3code that referenced this pull request Jun 2, 2026
@t3dotggChatGPT Codex Connector

Copy link
Copy Markdown
Member

I resolved the rebase locally, but this PR’s branch is in the organization-owned pearce-codes/t3code fork. GitHub rejects maintainer pushes to that fork, and the Update Branch API also reports a conflict. Please rebase the branch onto current main (the patch now targets patches/effect@4.0.0-beta.78.patch) or grant push access to the fork branch.

@Pearcekieser
Pearcekieserforce-pushed the 2026-05-31-effect-heartbeat-timeout branch from 81c603e to 6e69066CompareJuly 7, 2026 19:19
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 7, 2026 19:20

Dismissing prior approval to re-evaluate 6e69066

@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:XS 0-9 changed lines (additions + deletions). labels Jul 7, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 7, 2026
@Pearcekieser
Pearcekieserforce-pushed the 2026-05-31-effect-heartbeat-timeout branch from 6e69066 to 644cc92CompareJuly 8, 2026 21:25
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 8, 2026 21:26

Dismissing prior approval to re-evaluate 644cc92

macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 8, 2026
@Pearcekieser

Pearcekieser commented Jul 8, 2026

Copy link
Copy Markdown
Author

Thank for looking at this. Sorry for the delay was out on vacation. I recently started running into this timeouts again, so I'm hopeful this will help me and others.

I updated this to main. I don't think orgs owned branches allow pushes from upstream's maintainers, so I re opened this under a different PR if you need to edit.
New PR on a maintainer-pushable branch: #3817

Also @mincua suggested the same fix here so please try to give him credit if you merge this: #3500

Seems like this could also help fix:
#3553
#3734

@Pearcekieser
Pearcekieserforce-pushed the 2026-05-31-effect-heartbeat-timeout branch from 644cc92 to 2825718CompareJuly 10, 2026 23:07
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 10, 2026 23:07

Dismissing prior approval to re-evaluate 2825718

@juliusmarminge

Copy link
Copy Markdown
Member

Closing because the author-designated maintainer-editable replacement is #3817. The replacement PR explicitly carries this work forward.

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

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

Increase Effect RPC ping timeout for large snapshots - #2885

Closed
Pearcekieser wants to merge 1 commit into
pingdotgg:mainfrom
pearce-codes:2026-05-31-effect-heartbeat-timeout
Closed

Increase Effect RPC ping timeout for large snapshots#2885
Pearcekieser wants to merge 1 commit into
pingdotgg:mainfrom
pearce-codes:2026-05-31-effect-heartbeat-timeout

Conversation

@Pearcekieser

@PearcekieserPearcekieser commented May 31, 2026

Copy link
Copy Markdown

What Changed

Increases the patched Effect RPC pinger delay from 5 seconds to 60 seconds.

This changes the existing patches/effect@4.0.0-beta.73.patch so the generated RPC client waits longer before declaring the connection unhealthy due to a missed Pong.

Why

Large thread snapshots can occupy the WebSocket long enough that the Effect RPC Pong is queued behind snapshot chunks. On slow remote connections, the current 5 second heartbeat window can expire before the Pong reaches the client, causing a reconnect. The reconnect then requests the same large snapshot again, which can repeat the failure loop.

A 60 second window gives large snapshot sends more time to drain before the client treats the connection as dead.

This is a small mitigation for #2761. It does not solve the deeper issue that large snapshots and control/heartbeat messages share the same WebSocket queue; longer term, snapshots likely need pagination, truncation, backpressure, or control-message prioritization.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • UI changes are not applicable

Note

Increase Effect RPC ping interval to 60 seconds for large snapshot support

  • Updates patches/effect@4.0.0-beta.78.patch to change the protocol worker ping interval from 5 seconds to 60 seconds.
  • Adds an hooks.onPing call (when provided) before each ping is sent, allowing pre-ping side effects.
  • Behavioral Change: ping frequency drops from every 5s to every 60s, which may affect connection keepalive behavior in environments with short idle timeouts.

Macroscope summarized 2825718.


Note

Medium Risk
Changes connection health detection for all Effect RPC WebSocket clients; a 60s window delays detection of truly dead peers but reduces false reconnect loops during heavy snapshot traffic.

Overview
Updates the vendored effect@4.0.0-beta.78 patch so the RPC socket pinger waits 60 seconds between ping attempts instead of 5 seconds, giving large WebSocket transfers (e.g. thread snapshots) more time before the client treats a missing Pong as a dead connection.

The same patch delta wires ConnectionHooks into the ping loop: onPong runs after recording a pong, onPing runs before writePing, and both default to Effect.void when unset. pnpm-lock.yaml is refreshed so every workspace consumer resolves the new effect patch hash.

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

@coderabbitai

coderabbitaiBot commented May 31, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 869b0f55-01e6-4fd4-8ceb-cad2894b8ac5

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels May 31, 2026
@Pearcekieser
Pearcekieser marked this pull request as ready for review May 31, 2026 05:53
macroscopeapp[bot]
macroscopeappBot previously approved these changes May 31, 2026
@macroscopeapp

macroscopeappBot commented May 31, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved

Simple timeout configuration change from 5 to 60 seconds in an Effect RPC patch to handle large snapshots. The lockfile changes are mechanical hash updates from the patch modification.

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

duncan4123 pushed a commit to duncan4123/t3code that referenced this pull request Jun 2, 2026
@t3dotggChatGPT Codex Connector

Copy link
Copy Markdown
Member

I resolved the rebase locally, but this PR’s branch is in the organization-owned pearce-codes/t3code fork. GitHub rejects maintainer pushes to that fork, and the Update Branch API also reports a conflict. Please rebase the branch onto current main (the patch now targets patches/effect@4.0.0-beta.78.patch) or grant push access to the fork branch.

@Pearcekieser
Pearcekieserforce-pushed the 2026-05-31-effect-heartbeat-timeout branch from 81c603e to 6e69066CompareJuly 7, 2026 19:19
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 7, 2026 19:20

Dismissing prior approval to re-evaluate 6e69066

@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:XS 0-9 changed lines (additions + deletions). labels Jul 7, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 7, 2026
@Pearcekieser
Pearcekieserforce-pushed the 2026-05-31-effect-heartbeat-timeout branch from 6e69066 to 644cc92CompareJuly 8, 2026 21:25
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 8, 2026 21:26

Dismissing prior approval to re-evaluate 644cc92

macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 8, 2026
@Pearcekieser

Pearcekieser commented Jul 8, 2026

Copy link
Copy Markdown
Author

Thank for looking at this. Sorry for the delay was out on vacation. I recently started running into this timeouts again, so I'm hopeful this will help me and others.

I updated this to main. I don't think orgs owned branches allow pushes from upstream's maintainers, so I re opened this under a different PR if you need to edit.
New PR on a maintainer-pushable branch: #3817

Also @mincua suggested the same fix here so please try to give him credit if you merge this: #3500

Seems like this could also help fix:
#3553
#3734

@Pearcekieser
Pearcekieserforce-pushed the 2026-05-31-effect-heartbeat-timeout branch from 644cc92 to 2825718CompareJuly 10, 2026 23:07
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 10, 2026 23:07

Dismissing prior approval to re-evaluate 2825718

@juliusmarminge

Copy link
Copy Markdown
Member

Closing because the author-designated maintainer-editable replacement is #3817. The replacement PR explicitly carries this work forward.

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

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

Increase Effect RPC ping timeout for large snapshots - #2885

Closed
Pearcekieser wants to merge 1 commit into
pingdotgg:mainfrom
pearce-codes:2026-05-31-effect-heartbeat-timeout
Closed

Increase Effect RPC ping timeout for large snapshots#2885
Pearcekieser wants to merge 1 commit into
pingdotgg:mainfrom
pearce-codes:2026-05-31-effect-heartbeat-timeout

Conversation

@Pearcekieser

@PearcekieserPearcekieser commented May 31, 2026

Copy link
Copy Markdown

What Changed

Increases the patched Effect RPC pinger delay from 5 seconds to 60 seconds.

This changes the existing patches/effect@4.0.0-beta.73.patch so the generated RPC client waits longer before declaring the connection unhealthy due to a missed Pong.

Why

Large thread snapshots can occupy the WebSocket long enough that the Effect RPC Pong is queued behind snapshot chunks. On slow remote connections, the current 5 second heartbeat window can expire before the Pong reaches the client, causing a reconnect. The reconnect then requests the same large snapshot again, which can repeat the failure loop.

A 60 second window gives large snapshot sends more time to drain before the client treats the connection as dead.

This is a small mitigation for #2761. It does not solve the deeper issue that large snapshots and control/heartbeat messages share the same WebSocket queue; longer term, snapshots likely need pagination, truncation, backpressure, or control-message prioritization.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • UI changes are not applicable

Note

Increase Effect RPC ping interval to 60 seconds for large snapshot support

  • Updates patches/effect@4.0.0-beta.78.patch to change the protocol worker ping interval from 5 seconds to 60 seconds.
  • Adds an hooks.onPing call (when provided) before each ping is sent, allowing pre-ping side effects.
  • Behavioral Change: ping frequency drops from every 5s to every 60s, which may affect connection keepalive behavior in environments with short idle timeouts.

Macroscope summarized 2825718.


Note

Medium Risk
Changes connection health detection for all Effect RPC WebSocket clients; a 60s window delays detection of truly dead peers but reduces false reconnect loops during heavy snapshot traffic.

Overview
Updates the vendored effect@4.0.0-beta.78 patch so the RPC socket pinger waits 60 seconds between ping attempts instead of 5 seconds, giving large WebSocket transfers (e.g. thread snapshots) more time before the client treats a missing Pong as a dead connection.

The same patch delta wires ConnectionHooks into the ping loop: onPong runs after recording a pong, onPing runs before writePing, and both default to Effect.void when unset. pnpm-lock.yaml is refreshed so every workspace consumer resolves the new effect patch hash.

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

@coderabbitai

coderabbitaiBot commented May 31, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 869b0f55-01e6-4fd4-8ceb-cad2894b8ac5

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels May 31, 2026
@Pearcekieser
Pearcekieser marked this pull request as ready for review May 31, 2026 05:53
macroscopeapp[bot]
macroscopeappBot previously approved these changes May 31, 2026
@macroscopeapp

macroscopeappBot commented May 31, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved

Simple timeout configuration change from 5 to 60 seconds in an Effect RPC patch to handle large snapshots. The lockfile changes are mechanical hash updates from the patch modification.

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

duncan4123 pushed a commit to duncan4123/t3code that referenced this pull request Jun 2, 2026
@t3dotggChatGPT Codex Connector

Copy link
Copy Markdown
Member

I resolved the rebase locally, but this PR’s branch is in the organization-owned pearce-codes/t3code fork. GitHub rejects maintainer pushes to that fork, and the Update Branch API also reports a conflict. Please rebase the branch onto current main (the patch now targets patches/effect@4.0.0-beta.78.patch) or grant push access to the fork branch.

@Pearcekieser
Pearcekieserforce-pushed the 2026-05-31-effect-heartbeat-timeout branch from 81c603e to 6e69066CompareJuly 7, 2026 19:19
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 7, 2026 19:20

Dismissing prior approval to re-evaluate 6e69066

@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:XS 0-9 changed lines (additions + deletions). labels Jul 7, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 7, 2026
@Pearcekieser
Pearcekieserforce-pushed the 2026-05-31-effect-heartbeat-timeout branch from 6e69066 to 644cc92CompareJuly 8, 2026 21:25
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 8, 2026 21:26

Dismissing prior approval to re-evaluate 644cc92

macroscopeapp[bot]
macroscopeappBot previously approved these changes Jul 8, 2026
@Pearcekieser

Pearcekieser commented Jul 8, 2026

Copy link
Copy Markdown
Author

Thank for looking at this. Sorry for the delay was out on vacation. I recently started running into this timeouts again, so I'm hopeful this will help me and others.

I updated this to main. I don't think orgs owned branches allow pushes from upstream's maintainers, so I re opened this under a different PR if you need to edit.
New PR on a maintainer-pushable branch: #3817

Also @mincua suggested the same fix here so please try to give him credit if you merge this: #3500

Seems like this could also help fix:
#3553
#3734

@Pearcekieser
Pearcekieserforce-pushed the 2026-05-31-effect-heartbeat-timeout branch from 644cc92 to 2825718CompareJuly 10, 2026 23:07
@macroscopeapp
macroscopeappBot dismissed their stale reviewJuly 10, 2026 23:07

Dismissing prior approval to re-evaluate 2825718

@juliusmarminge

Copy link
Copy Markdown
Member

Closing because the author-designated maintainer-editable replacement is #3817. The replacement PR explicitly carries this work forward.

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

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Pearcekieser@t3dotgg@juliusmarminge@jamesx0416