fix(pull-requests): shared state + not settling? - #9332

Merged
maria-rcks merged 11 commits into
pingdotgg:mainfrom
maria-rcks:t3code/fix-threads-after-merge
Sep 3, 2026
Merged

fix(pull-requests): shared state + not settling?#9332
maria-rcks merged 11 commits into
pingdotgg:mainfrom
maria-rcks:t3code/fix-threads-after-merge

Conversation

@maria-rcks

@maria-rcksmaria-rcks commented Sep 3, 2026

Copy link
Copy Markdown
Collaborator

Note

Written by gpt-5.6-sol on behalf of Maria

Threads could wait behind the one-minute settlement sweep and two-minute pull request cache, while transient host failures could hide a merged state already observed by the app. This sends successful in-app merges directly to settlement and safely reuses only immutable merged observations. The PR panel and both sidebar implementations now share the newest per-PR state, so a merge reaches every visible surface before paint without a second request. When that branch later exposes a different open pull request, the terminal thread link is replaced and the open panel follows it immediately. Verified with 110 focused server tests, 34 directly affected web tests, server and web typechecks, and repository-pinned formatting and lint; implemented by gpt-5.6-sol in the Codex harness.

relinked thread, view pr controls, sidebar, and pull request panel all target #9332


Note

Medium Risk
Changes auto-settlement timing, PR summary caching semantics, and cross-view client state; bounded merge-event PubSub can drop events under load, and merged observations are sticky for up to five minutes on the client.

Overview
Merges performed in-app now trigger thread settlement right away instead of waiting on the periodic sweep. PullRequestService emits merge events after a successful merge action, and ThreadSettlementReactor listens and runs a sweep scoped to threads linked to that PR—treating the event as merged state without another host lookup.

Strict settlement reads (recoverTransientFailure: false) can return a previously observed merged summary from cache instead of refreshing from the provider, so transient API failures do not undo a merge the app already knows about.

On the web, per-PR observed summaries are stored and merged across the PR panel and sidebar via useSharedPullRequestSummary, with rules that favor merged state and newer updatedAt so UI surfaces agree after a merge. threadPullRequestRefreshSource and linked-detail refresh from the panel are removed in favor of this shared state and simpler VCS refresh when the thread PR is inferred, not persisted.

Chat can relink a thread from a merged/closed linked PR to a different open PR on the same branch (persisted metadata + open panel), and skips panel onStateChange callbacks when a linked PR is already authoritative.

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

Note

Add shared pull-request state and merge-triggered settlement sweeps

  • PullRequestService publishes successful merge events to a bounded PubSub channel and strict summary reads reuse an already-observed merged result instead of refreshing the provider
  • ThreadSettlementReactor subscribes to merge events and runs a targeted sweep that settles only the matching linked thread using the event timestamp, bypassing the periodic schedule and summary lookups
  • Web client introduces observedPullRequestSummaryAtom, newestPullRequestSummary, and useSharedPullRequestSummary so linked-thread status and the detail panel reflect the newest or merged-precedent summary across components
  • ChatView can display and persist a different open pull request on the same branch when the persisted link is merged or closed, with serialized metadata writes per thread
  • Removes the threadPullRequestRefreshSource utility and narrows PullRequestDetailPanel.onStateChange to { repository, number, state }
  • Risk: PullRequestDetailPanel.onStateChange payload drops project and draft fields — any out-of-tree consumer expecting those fields will break; merge-event PubSub has capacity 64 so bursts beyond that drop events and fall back to the periodic sweep

Macroscope summarized 62fe971.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 3, 2026
Comment threadapps/web/src/components/ThreadStatusIndicators.tsx Outdated
Comment threadapps/web/src/state/pullRequests.ts Outdated
Comment threadapps/server/src/pullRequest/PullRequestService.ts Outdated
Comment threadapps/server/src/pullRequest/PullRequestService.ts Outdated
Comment threadapps/web/src/components/Sidebar.tsx Outdated
@macroscopeapp

macroscopeappBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — The change spans server settlement orchestration and multiple client state surfaces, adding automatic merge-triggered settlement and persisted pull-request relinking. These cross-component runtime and user-visible behavior changes have a broader blast radius than an auto-approvable bug fix or bounded option.

You can add or adjust custom eligibility rules. Learn more.

Comment threadapps/server/src/pullRequest/PullRequestService.ts Outdated
Comment threadapps/server/src/pullRequest/PullRequestService.ts Outdated
Comment threadapps/server/src/orchestration/ThreadSettlementReactor.ts Outdated
Comment threadapps/web/src/components/ChatView.logic.ts Outdated
Comment threadapps/web/src/components/ChatView.tsx Outdated
Comment threadapps/server/src/pullRequest/PullRequestService.ts
Comment threadapps/web/src/components/ChatView.tsx Outdated
@maria-rcksmaria-rcks changed the title fix(pull-requests): settle threads immediately after mergefix(pull-requests): shared state + not settling?Sep 3, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 1910535. Configure here.

Comment threadapps/web/src/components/ChatView.tsx Outdated
@maria-rcks
maria-rcks merged commit 854541a into pingdotgg:mainSep 3, 2026
27 checks passed
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:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@maria-rcks
, '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(pull-requests): shared state + not settling? - #9332

Merged
maria-rcks merged 11 commits into
pingdotgg:mainfrom
maria-rcks:t3code/fix-threads-after-merge
Sep 3, 2026
Merged

fix(pull-requests): shared state + not settling?#9332
maria-rcks merged 11 commits into
pingdotgg:mainfrom
maria-rcks:t3code/fix-threads-after-merge

Conversation

@maria-rcks

@maria-rcksmaria-rcks commented Sep 3, 2026

Copy link
Copy Markdown
Collaborator

Note

Written by gpt-5.6-sol on behalf of Maria

Threads could wait behind the one-minute settlement sweep and two-minute pull request cache, while transient host failures could hide a merged state already observed by the app. This sends successful in-app merges directly to settlement and safely reuses only immutable merged observations. The PR panel and both sidebar implementations now share the newest per-PR state, so a merge reaches every visible surface before paint without a second request. When that branch later exposes a different open pull request, the terminal thread link is replaced and the open panel follows it immediately. Verified with 110 focused server tests, 34 directly affected web tests, server and web typechecks, and repository-pinned formatting and lint; implemented by gpt-5.6-sol in the Codex harness.

relinked thread, view pr controls, sidebar, and pull request panel all target #9332


Note

Medium Risk
Changes auto-settlement timing, PR summary caching semantics, and cross-view client state; bounded merge-event PubSub can drop events under load, and merged observations are sticky for up to five minutes on the client.

Overview
Merges performed in-app now trigger thread settlement right away instead of waiting on the periodic sweep. PullRequestService emits merge events after a successful merge action, and ThreadSettlementReactor listens and runs a sweep scoped to threads linked to that PR—treating the event as merged state without another host lookup.

Strict settlement reads (recoverTransientFailure: false) can return a previously observed merged summary from cache instead of refreshing from the provider, so transient API failures do not undo a merge the app already knows about.

On the web, per-PR observed summaries are stored and merged across the PR panel and sidebar via useSharedPullRequestSummary, with rules that favor merged state and newer updatedAt so UI surfaces agree after a merge. threadPullRequestRefreshSource and linked-detail refresh from the panel are removed in favor of this shared state and simpler VCS refresh when the thread PR is inferred, not persisted.

Chat can relink a thread from a merged/closed linked PR to a different open PR on the same branch (persisted metadata + open panel), and skips panel onStateChange callbacks when a linked PR is already authoritative.

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

Note

Add shared pull-request state and merge-triggered settlement sweeps

  • PullRequestService publishes successful merge events to a bounded PubSub channel and strict summary reads reuse an already-observed merged result instead of refreshing the provider
  • ThreadSettlementReactor subscribes to merge events and runs a targeted sweep that settles only the matching linked thread using the event timestamp, bypassing the periodic schedule and summary lookups
  • Web client introduces observedPullRequestSummaryAtom, newestPullRequestSummary, and useSharedPullRequestSummary so linked-thread status and the detail panel reflect the newest or merged-precedent summary across components
  • ChatView can display and persist a different open pull request on the same branch when the persisted link is merged or closed, with serialized metadata writes per thread
  • Removes the threadPullRequestRefreshSource utility and narrows PullRequestDetailPanel.onStateChange to { repository, number, state }
  • Risk: PullRequestDetailPanel.onStateChange payload drops project and draft fields — any out-of-tree consumer expecting those fields will break; merge-event PubSub has capacity 64 so bursts beyond that drop events and fall back to the periodic sweep

Macroscope summarized 62fe971.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 3, 2026
Comment threadapps/web/src/components/ThreadStatusIndicators.tsx Outdated
Comment threadapps/web/src/state/pullRequests.ts Outdated
Comment threadapps/server/src/pullRequest/PullRequestService.ts Outdated
Comment threadapps/server/src/pullRequest/PullRequestService.ts Outdated
Comment threadapps/web/src/components/Sidebar.tsx Outdated
@macroscopeapp

macroscopeappBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — The change spans server settlement orchestration and multiple client state surfaces, adding automatic merge-triggered settlement and persisted pull-request relinking. These cross-component runtime and user-visible behavior changes have a broader blast radius than an auto-approvable bug fix or bounded option.

You can add or adjust custom eligibility rules. Learn more.

Comment threadapps/server/src/pullRequest/PullRequestService.ts Outdated
Comment threadapps/server/src/pullRequest/PullRequestService.ts Outdated
Comment threadapps/server/src/orchestration/ThreadSettlementReactor.ts Outdated
Comment threadapps/web/src/components/ChatView.logic.ts Outdated
Comment threadapps/web/src/components/ChatView.tsx Outdated
Comment threadapps/server/src/pullRequest/PullRequestService.ts
Comment threadapps/web/src/components/ChatView.tsx Outdated
@maria-rcksmaria-rcks changed the title fix(pull-requests): settle threads immediately after mergefix(pull-requests): shared state + not settling?Sep 3, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 1910535. Configure here.

Comment threadapps/web/src/components/ChatView.tsx Outdated
@maria-rcks
maria-rcks merged commit 854541a into pingdotgg:mainSep 3, 2026
27 checks passed
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:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@maria-rcks
, '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(pull-requests): shared state + not settling? - #9332

Merged
maria-rcks merged 11 commits into
pingdotgg:mainfrom
maria-rcks:t3code/fix-threads-after-merge
Sep 3, 2026
Merged

fix(pull-requests): shared state + not settling?#9332
maria-rcks merged 11 commits into
pingdotgg:mainfrom
maria-rcks:t3code/fix-threads-after-merge

Conversation

@maria-rcks

@maria-rcksmaria-rcks commented Sep 3, 2026

Copy link
Copy Markdown
Collaborator

Note

Written by gpt-5.6-sol on behalf of Maria

Threads could wait behind the one-minute settlement sweep and two-minute pull request cache, while transient host failures could hide a merged state already observed by the app. This sends successful in-app merges directly to settlement and safely reuses only immutable merged observations. The PR panel and both sidebar implementations now share the newest per-PR state, so a merge reaches every visible surface before paint without a second request. When that branch later exposes a different open pull request, the terminal thread link is replaced and the open panel follows it immediately. Verified with 110 focused server tests, 34 directly affected web tests, server and web typechecks, and repository-pinned formatting and lint; implemented by gpt-5.6-sol in the Codex harness.

relinked thread, view pr controls, sidebar, and pull request panel all target #9332


Note

Medium Risk
Changes auto-settlement timing, PR summary caching semantics, and cross-view client state; bounded merge-event PubSub can drop events under load, and merged observations are sticky for up to five minutes on the client.

Overview
Merges performed in-app now trigger thread settlement right away instead of waiting on the periodic sweep. PullRequestService emits merge events after a successful merge action, and ThreadSettlementReactor listens and runs a sweep scoped to threads linked to that PR—treating the event as merged state without another host lookup.

Strict settlement reads (recoverTransientFailure: false) can return a previously observed merged summary from cache instead of refreshing from the provider, so transient API failures do not undo a merge the app already knows about.

On the web, per-PR observed summaries are stored and merged across the PR panel and sidebar via useSharedPullRequestSummary, with rules that favor merged state and newer updatedAt so UI surfaces agree after a merge. threadPullRequestRefreshSource and linked-detail refresh from the panel are removed in favor of this shared state and simpler VCS refresh when the thread PR is inferred, not persisted.

Chat can relink a thread from a merged/closed linked PR to a different open PR on the same branch (persisted metadata + open panel), and skips panel onStateChange callbacks when a linked PR is already authoritative.

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

Note

Add shared pull-request state and merge-triggered settlement sweeps

  • PullRequestService publishes successful merge events to a bounded PubSub channel and strict summary reads reuse an already-observed merged result instead of refreshing the provider
  • ThreadSettlementReactor subscribes to merge events and runs a targeted sweep that settles only the matching linked thread using the event timestamp, bypassing the periodic schedule and summary lookups
  • Web client introduces observedPullRequestSummaryAtom, newestPullRequestSummary, and useSharedPullRequestSummary so linked-thread status and the detail panel reflect the newest or merged-precedent summary across components
  • ChatView can display and persist a different open pull request on the same branch when the persisted link is merged or closed, with serialized metadata writes per thread
  • Removes the threadPullRequestRefreshSource utility and narrows PullRequestDetailPanel.onStateChange to { repository, number, state }
  • Risk: PullRequestDetailPanel.onStateChange payload drops project and draft fields — any out-of-tree consumer expecting those fields will break; merge-event PubSub has capacity 64 so bursts beyond that drop events and fall back to the periodic sweep

Macroscope summarized 62fe971.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 3, 2026
Comment threadapps/web/src/components/ThreadStatusIndicators.tsx Outdated
Comment threadapps/web/src/state/pullRequests.ts Outdated
Comment threadapps/server/src/pullRequest/PullRequestService.ts Outdated
Comment threadapps/server/src/pullRequest/PullRequestService.ts Outdated
Comment threadapps/web/src/components/Sidebar.tsx Outdated
@macroscopeapp

macroscopeappBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — The change spans server settlement orchestration and multiple client state surfaces, adding automatic merge-triggered settlement and persisted pull-request relinking. These cross-component runtime and user-visible behavior changes have a broader blast radius than an auto-approvable bug fix or bounded option.

You can add or adjust custom eligibility rules. Learn more.

Comment threadapps/server/src/pullRequest/PullRequestService.ts Outdated
Comment threadapps/server/src/pullRequest/PullRequestService.ts Outdated
Comment threadapps/server/src/orchestration/ThreadSettlementReactor.ts Outdated
Comment threadapps/web/src/components/ChatView.logic.ts Outdated
Comment threadapps/web/src/components/ChatView.tsx Outdated
Comment threadapps/server/src/pullRequest/PullRequestService.ts
Comment threadapps/web/src/components/ChatView.tsx Outdated
@maria-rcksmaria-rcks changed the title fix(pull-requests): settle threads immediately after mergefix(pull-requests): shared state + not settling?Sep 3, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 1910535. Configure here.

Comment threadapps/web/src/components/ChatView.tsx Outdated
@maria-rcks
maria-rcks merged commit 854541a into pingdotgg:mainSep 3, 2026
27 checks passed
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:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@maria-rcks
, '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(pull-requests): shared state + not settling? - #9332

Merged
maria-rcks merged 11 commits into
pingdotgg:mainfrom
maria-rcks:t3code/fix-threads-after-merge
Sep 3, 2026
Merged

fix(pull-requests): shared state + not settling?#9332
maria-rcks merged 11 commits into
pingdotgg:mainfrom
maria-rcks:t3code/fix-threads-after-merge

Conversation

@maria-rcks

@maria-rcksmaria-rcks commented Sep 3, 2026

Copy link
Copy Markdown
Collaborator

Note

Written by gpt-5.6-sol on behalf of Maria

Threads could wait behind the one-minute settlement sweep and two-minute pull request cache, while transient host failures could hide a merged state already observed by the app. This sends successful in-app merges directly to settlement and safely reuses only immutable merged observations. The PR panel and both sidebar implementations now share the newest per-PR state, so a merge reaches every visible surface before paint without a second request. When that branch later exposes a different open pull request, the terminal thread link is replaced and the open panel follows it immediately. Verified with 110 focused server tests, 34 directly affected web tests, server and web typechecks, and repository-pinned formatting and lint; implemented by gpt-5.6-sol in the Codex harness.

relinked thread, view pr controls, sidebar, and pull request panel all target #9332


Note

Medium Risk
Changes auto-settlement timing, PR summary caching semantics, and cross-view client state; bounded merge-event PubSub can drop events under load, and merged observations are sticky for up to five minutes on the client.

Overview
Merges performed in-app now trigger thread settlement right away instead of waiting on the periodic sweep. PullRequestService emits merge events after a successful merge action, and ThreadSettlementReactor listens and runs a sweep scoped to threads linked to that PR—treating the event as merged state without another host lookup.

Strict settlement reads (recoverTransientFailure: false) can return a previously observed merged summary from cache instead of refreshing from the provider, so transient API failures do not undo a merge the app already knows about.

On the web, per-PR observed summaries are stored and merged across the PR panel and sidebar via useSharedPullRequestSummary, with rules that favor merged state and newer updatedAt so UI surfaces agree after a merge. threadPullRequestRefreshSource and linked-detail refresh from the panel are removed in favor of this shared state and simpler VCS refresh when the thread PR is inferred, not persisted.

Chat can relink a thread from a merged/closed linked PR to a different open PR on the same branch (persisted metadata + open panel), and skips panel onStateChange callbacks when a linked PR is already authoritative.

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

Note

Add shared pull-request state and merge-triggered settlement sweeps

  • PullRequestService publishes successful merge events to a bounded PubSub channel and strict summary reads reuse an already-observed merged result instead of refreshing the provider
  • ThreadSettlementReactor subscribes to merge events and runs a targeted sweep that settles only the matching linked thread using the event timestamp, bypassing the periodic schedule and summary lookups
  • Web client introduces observedPullRequestSummaryAtom, newestPullRequestSummary, and useSharedPullRequestSummary so linked-thread status and the detail panel reflect the newest or merged-precedent summary across components
  • ChatView can display and persist a different open pull request on the same branch when the persisted link is merged or closed, with serialized metadata writes per thread
  • Removes the threadPullRequestRefreshSource utility and narrows PullRequestDetailPanel.onStateChange to { repository, number, state }
  • Risk: PullRequestDetailPanel.onStateChange payload drops project and draft fields — any out-of-tree consumer expecting those fields will break; merge-event PubSub has capacity 64 so bursts beyond that drop events and fall back to the periodic sweep

Macroscope summarized 62fe971.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 3, 2026
Comment threadapps/web/src/components/ThreadStatusIndicators.tsx Outdated
Comment threadapps/web/src/state/pullRequests.ts Outdated
Comment threadapps/server/src/pullRequest/PullRequestService.ts Outdated
Comment threadapps/server/src/pullRequest/PullRequestService.ts Outdated
Comment threadapps/web/src/components/Sidebar.tsx Outdated
@macroscopeapp

macroscopeappBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — The change spans server settlement orchestration and multiple client state surfaces, adding automatic merge-triggered settlement and persisted pull-request relinking. These cross-component runtime and user-visible behavior changes have a broader blast radius than an auto-approvable bug fix or bounded option.

You can add or adjust custom eligibility rules. Learn more.

Comment threadapps/server/src/pullRequest/PullRequestService.ts Outdated
Comment threadapps/server/src/pullRequest/PullRequestService.ts Outdated
Comment threadapps/server/src/orchestration/ThreadSettlementReactor.ts Outdated
Comment threadapps/web/src/components/ChatView.logic.ts Outdated
Comment threadapps/web/src/components/ChatView.tsx Outdated
Comment threadapps/server/src/pullRequest/PullRequestService.ts
Comment threadapps/web/src/components/ChatView.tsx Outdated
@maria-rcksmaria-rcks changed the title fix(pull-requests): settle threads immediately after mergefix(pull-requests): shared state + not settling?Sep 3, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 1910535. Configure here.

Comment threadapps/web/src/components/ChatView.tsx Outdated
@maria-rcks
maria-rcks merged commit 854541a into pingdotgg:mainSep 3, 2026
27 checks passed
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:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@maria-rcks
, '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(pull-requests): shared state + not settling? - #9332

Merged
maria-rcks merged 11 commits into
pingdotgg:mainfrom
maria-rcks:t3code/fix-threads-after-merge
Sep 3, 2026
Merged

fix(pull-requests): shared state + not settling?#9332
maria-rcks merged 11 commits into
pingdotgg:mainfrom
maria-rcks:t3code/fix-threads-after-merge

Conversation

@maria-rcks

@maria-rcksmaria-rcks commented Sep 3, 2026

Copy link
Copy Markdown
Collaborator

Note

Written by gpt-5.6-sol on behalf of Maria

Threads could wait behind the one-minute settlement sweep and two-minute pull request cache, while transient host failures could hide a merged state already observed by the app. This sends successful in-app merges directly to settlement and safely reuses only immutable merged observations. The PR panel and both sidebar implementations now share the newest per-PR state, so a merge reaches every visible surface before paint without a second request. When that branch later exposes a different open pull request, the terminal thread link is replaced and the open panel follows it immediately. Verified with 110 focused server tests, 34 directly affected web tests, server and web typechecks, and repository-pinned formatting and lint; implemented by gpt-5.6-sol in the Codex harness.

relinked thread, view pr controls, sidebar, and pull request panel all target #9332


Note

Medium Risk
Changes auto-settlement timing, PR summary caching semantics, and cross-view client state; bounded merge-event PubSub can drop events under load, and merged observations are sticky for up to five minutes on the client.

Overview
Merges performed in-app now trigger thread settlement right away instead of waiting on the periodic sweep. PullRequestService emits merge events after a successful merge action, and ThreadSettlementReactor listens and runs a sweep scoped to threads linked to that PR—treating the event as merged state without another host lookup.

Strict settlement reads (recoverTransientFailure: false) can return a previously observed merged summary from cache instead of refreshing from the provider, so transient API failures do not undo a merge the app already knows about.

On the web, per-PR observed summaries are stored and merged across the PR panel and sidebar via useSharedPullRequestSummary, with rules that favor merged state and newer updatedAt so UI surfaces agree after a merge. threadPullRequestRefreshSource and linked-detail refresh from the panel are removed in favor of this shared state and simpler VCS refresh when the thread PR is inferred, not persisted.

Chat can relink a thread from a merged/closed linked PR to a different open PR on the same branch (persisted metadata + open panel), and skips panel onStateChange callbacks when a linked PR is already authoritative.

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

Note

Add shared pull-request state and merge-triggered settlement sweeps

  • PullRequestService publishes successful merge events to a bounded PubSub channel and strict summary reads reuse an already-observed merged result instead of refreshing the provider
  • ThreadSettlementReactor subscribes to merge events and runs a targeted sweep that settles only the matching linked thread using the event timestamp, bypassing the periodic schedule and summary lookups
  • Web client introduces observedPullRequestSummaryAtom, newestPullRequestSummary, and useSharedPullRequestSummary so linked-thread status and the detail panel reflect the newest or merged-precedent summary across components
  • ChatView can display and persist a different open pull request on the same branch when the persisted link is merged or closed, with serialized metadata writes per thread
  • Removes the threadPullRequestRefreshSource utility and narrows PullRequestDetailPanel.onStateChange to { repository, number, state }
  • Risk: PullRequestDetailPanel.onStateChange payload drops project and draft fields — any out-of-tree consumer expecting those fields will break; merge-event PubSub has capacity 64 so bursts beyond that drop events and fall back to the periodic sweep

Macroscope summarized 62fe971.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 3, 2026
Comment threadapps/web/src/components/ThreadStatusIndicators.tsx Outdated
Comment threadapps/web/src/state/pullRequests.ts Outdated
Comment threadapps/server/src/pullRequest/PullRequestService.ts Outdated
Comment threadapps/server/src/pullRequest/PullRequestService.ts Outdated
Comment threadapps/web/src/components/Sidebar.tsx Outdated
@macroscopeapp

macroscopeappBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — The change spans server settlement orchestration and multiple client state surfaces, adding automatic merge-triggered settlement and persisted pull-request relinking. These cross-component runtime and user-visible behavior changes have a broader blast radius than an auto-approvable bug fix or bounded option.

You can add or adjust custom eligibility rules. Learn more.

Comment threadapps/server/src/pullRequest/PullRequestService.ts Outdated
Comment threadapps/server/src/pullRequest/PullRequestService.ts Outdated
Comment threadapps/server/src/orchestration/ThreadSettlementReactor.ts Outdated
Comment threadapps/web/src/components/ChatView.logic.ts Outdated
Comment threadapps/web/src/components/ChatView.tsx Outdated
Comment threadapps/server/src/pullRequest/PullRequestService.ts
Comment threadapps/web/src/components/ChatView.tsx Outdated
@maria-rcksmaria-rcks changed the title fix(pull-requests): settle threads immediately after mergefix(pull-requests): shared state + not settling?Sep 3, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 1910535. Configure here.

Comment threadapps/web/src/components/ChatView.tsx Outdated
@maria-rcks
maria-rcks merged commit 854541a into pingdotgg:mainSep 3, 2026
27 checks passed
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:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@maria-rcks
, '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(pull-requests): shared state + not settling? - #9332

Merged
maria-rcks merged 11 commits into
pingdotgg:mainfrom
maria-rcks:t3code/fix-threads-after-merge
Sep 3, 2026
Merged

fix(pull-requests): shared state + not settling?#9332
maria-rcks merged 11 commits into
pingdotgg:mainfrom
maria-rcks:t3code/fix-threads-after-merge

Conversation

@maria-rcks

@maria-rcksmaria-rcks commented Sep 3, 2026

Copy link
Copy Markdown
Collaborator

Note

Written by gpt-5.6-sol on behalf of Maria

Threads could wait behind the one-minute settlement sweep and two-minute pull request cache, while transient host failures could hide a merged state already observed by the app. This sends successful in-app merges directly to settlement and safely reuses only immutable merged observations. The PR panel and both sidebar implementations now share the newest per-PR state, so a merge reaches every visible surface before paint without a second request. When that branch later exposes a different open pull request, the terminal thread link is replaced and the open panel follows it immediately. Verified with 110 focused server tests, 34 directly affected web tests, server and web typechecks, and repository-pinned formatting and lint; implemented by gpt-5.6-sol in the Codex harness.

relinked thread, view pr controls, sidebar, and pull request panel all target #9332


Note

Medium Risk
Changes auto-settlement timing, PR summary caching semantics, and cross-view client state; bounded merge-event PubSub can drop events under load, and merged observations are sticky for up to five minutes on the client.

Overview
Merges performed in-app now trigger thread settlement right away instead of waiting on the periodic sweep. PullRequestService emits merge events after a successful merge action, and ThreadSettlementReactor listens and runs a sweep scoped to threads linked to that PR—treating the event as merged state without another host lookup.

Strict settlement reads (recoverTransientFailure: false) can return a previously observed merged summary from cache instead of refreshing from the provider, so transient API failures do not undo a merge the app already knows about.

On the web, per-PR observed summaries are stored and merged across the PR panel and sidebar via useSharedPullRequestSummary, with rules that favor merged state and newer updatedAt so UI surfaces agree after a merge. threadPullRequestRefreshSource and linked-detail refresh from the panel are removed in favor of this shared state and simpler VCS refresh when the thread PR is inferred, not persisted.

Chat can relink a thread from a merged/closed linked PR to a different open PR on the same branch (persisted metadata + open panel), and skips panel onStateChange callbacks when a linked PR is already authoritative.

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

Note

Add shared pull-request state and merge-triggered settlement sweeps

  • PullRequestService publishes successful merge events to a bounded PubSub channel and strict summary reads reuse an already-observed merged result instead of refreshing the provider
  • ThreadSettlementReactor subscribes to merge events and runs a targeted sweep that settles only the matching linked thread using the event timestamp, bypassing the periodic schedule and summary lookups
  • Web client introduces observedPullRequestSummaryAtom, newestPullRequestSummary, and useSharedPullRequestSummary so linked-thread status and the detail panel reflect the newest or merged-precedent summary across components
  • ChatView can display and persist a different open pull request on the same branch when the persisted link is merged or closed, with serialized metadata writes per thread
  • Removes the threadPullRequestRefreshSource utility and narrows PullRequestDetailPanel.onStateChange to { repository, number, state }
  • Risk: PullRequestDetailPanel.onStateChange payload drops project and draft fields — any out-of-tree consumer expecting those fields will break; merge-event PubSub has capacity 64 so bursts beyond that drop events and fall back to the periodic sweep

Macroscope summarized 62fe971.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 3, 2026
Comment threadapps/web/src/components/ThreadStatusIndicators.tsx Outdated
Comment threadapps/web/src/state/pullRequests.ts Outdated
Comment threadapps/server/src/pullRequest/PullRequestService.ts Outdated
Comment threadapps/server/src/pullRequest/PullRequestService.ts Outdated
Comment threadapps/web/src/components/Sidebar.tsx Outdated
@macroscopeapp

macroscopeappBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — The change spans server settlement orchestration and multiple client state surfaces, adding automatic merge-triggered settlement and persisted pull-request relinking. These cross-component runtime and user-visible behavior changes have a broader blast radius than an auto-approvable bug fix or bounded option.

You can add or adjust custom eligibility rules. Learn more.

Comment threadapps/server/src/pullRequest/PullRequestService.ts Outdated
Comment threadapps/server/src/pullRequest/PullRequestService.ts Outdated
Comment threadapps/server/src/orchestration/ThreadSettlementReactor.ts Outdated
Comment threadapps/web/src/components/ChatView.logic.ts Outdated
Comment threadapps/web/src/components/ChatView.tsx Outdated
Comment threadapps/server/src/pullRequest/PullRequestService.ts
Comment threadapps/web/src/components/ChatView.tsx Outdated
@maria-rcksmaria-rcks changed the title fix(pull-requests): settle threads immediately after mergefix(pull-requests): shared state + not settling?Sep 3, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 1910535. Configure here.

Comment threadapps/web/src/components/ChatView.tsx Outdated
@maria-rcks
maria-rcks merged commit 854541a into pingdotgg:mainSep 3, 2026
27 checks passed
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:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@maria-rcks
, '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(pull-requests): shared state + not settling? - #9332

Merged
maria-rcks merged 11 commits into
pingdotgg:mainfrom
maria-rcks:t3code/fix-threads-after-merge
Sep 3, 2026
Merged

fix(pull-requests): shared state + not settling?#9332
maria-rcks merged 11 commits into
pingdotgg:mainfrom
maria-rcks:t3code/fix-threads-after-merge

Conversation

@maria-rcks

@maria-rcksmaria-rcks commented Sep 3, 2026

Copy link
Copy Markdown
Collaborator

Note

Written by gpt-5.6-sol on behalf of Maria

Threads could wait behind the one-minute settlement sweep and two-minute pull request cache, while transient host failures could hide a merged state already observed by the app. This sends successful in-app merges directly to settlement and safely reuses only immutable merged observations. The PR panel and both sidebar implementations now share the newest per-PR state, so a merge reaches every visible surface before paint without a second request. When that branch later exposes a different open pull request, the terminal thread link is replaced and the open panel follows it immediately. Verified with 110 focused server tests, 34 directly affected web tests, server and web typechecks, and repository-pinned formatting and lint; implemented by gpt-5.6-sol in the Codex harness.

relinked thread, view pr controls, sidebar, and pull request panel all target #9332


Note

Medium Risk
Changes auto-settlement timing, PR summary caching semantics, and cross-view client state; bounded merge-event PubSub can drop events under load, and merged observations are sticky for up to five minutes on the client.

Overview
Merges performed in-app now trigger thread settlement right away instead of waiting on the periodic sweep. PullRequestService emits merge events after a successful merge action, and ThreadSettlementReactor listens and runs a sweep scoped to threads linked to that PR—treating the event as merged state without another host lookup.

Strict settlement reads (recoverTransientFailure: false) can return a previously observed merged summary from cache instead of refreshing from the provider, so transient API failures do not undo a merge the app already knows about.

On the web, per-PR observed summaries are stored and merged across the PR panel and sidebar via useSharedPullRequestSummary, with rules that favor merged state and newer updatedAt so UI surfaces agree after a merge. threadPullRequestRefreshSource and linked-detail refresh from the panel are removed in favor of this shared state and simpler VCS refresh when the thread PR is inferred, not persisted.

Chat can relink a thread from a merged/closed linked PR to a different open PR on the same branch (persisted metadata + open panel), and skips panel onStateChange callbacks when a linked PR is already authoritative.

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

Note

Add shared pull-request state and merge-triggered settlement sweeps

  • PullRequestService publishes successful merge events to a bounded PubSub channel and strict summary reads reuse an already-observed merged result instead of refreshing the provider
  • ThreadSettlementReactor subscribes to merge events and runs a targeted sweep that settles only the matching linked thread using the event timestamp, bypassing the periodic schedule and summary lookups
  • Web client introduces observedPullRequestSummaryAtom, newestPullRequestSummary, and useSharedPullRequestSummary so linked-thread status and the detail panel reflect the newest or merged-precedent summary across components
  • ChatView can display and persist a different open pull request on the same branch when the persisted link is merged or closed, with serialized metadata writes per thread
  • Removes the threadPullRequestRefreshSource utility and narrows PullRequestDetailPanel.onStateChange to { repository, number, state }
  • Risk: PullRequestDetailPanel.onStateChange payload drops project and draft fields — any out-of-tree consumer expecting those fields will break; merge-event PubSub has capacity 64 so bursts beyond that drop events and fall back to the periodic sweep

Macroscope summarized 62fe971.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 3, 2026
Comment threadapps/web/src/components/ThreadStatusIndicators.tsx Outdated
Comment threadapps/web/src/state/pullRequests.ts Outdated
Comment threadapps/server/src/pullRequest/PullRequestService.ts Outdated
Comment threadapps/server/src/pullRequest/PullRequestService.ts Outdated
Comment threadapps/web/src/components/Sidebar.tsx Outdated
@macroscopeapp

macroscopeappBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — The change spans server settlement orchestration and multiple client state surfaces, adding automatic merge-triggered settlement and persisted pull-request relinking. These cross-component runtime and user-visible behavior changes have a broader blast radius than an auto-approvable bug fix or bounded option.

You can add or adjust custom eligibility rules. Learn more.

Comment threadapps/server/src/pullRequest/PullRequestService.ts Outdated
Comment threadapps/server/src/pullRequest/PullRequestService.ts Outdated
Comment threadapps/server/src/orchestration/ThreadSettlementReactor.ts Outdated
Comment threadapps/web/src/components/ChatView.logic.ts Outdated
Comment threadapps/web/src/components/ChatView.tsx Outdated
Comment threadapps/server/src/pullRequest/PullRequestService.ts
Comment threadapps/web/src/components/ChatView.tsx Outdated
@maria-rcksmaria-rcks changed the title fix(pull-requests): settle threads immediately after mergefix(pull-requests): shared state + not settling?Sep 3, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 1910535. Configure here.

Comment threadapps/web/src/components/ChatView.tsx Outdated
@maria-rcks
maria-rcks merged commit 854541a into pingdotgg:mainSep 3, 2026
27 checks passed
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:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@maria-rcks
, '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(pull-requests): shared state + not settling? - #9332

Merged
maria-rcks merged 11 commits into
pingdotgg:mainfrom
maria-rcks:t3code/fix-threads-after-merge
Sep 3, 2026
Merged

fix(pull-requests): shared state + not settling?#9332
maria-rcks merged 11 commits into
pingdotgg:mainfrom
maria-rcks:t3code/fix-threads-after-merge

Conversation

@maria-rcks

@maria-rcksmaria-rcks commented Sep 3, 2026

Copy link
Copy Markdown
Collaborator

Note

Written by gpt-5.6-sol on behalf of Maria

Threads could wait behind the one-minute settlement sweep and two-minute pull request cache, while transient host failures could hide a merged state already observed by the app. This sends successful in-app merges directly to settlement and safely reuses only immutable merged observations. The PR panel and both sidebar implementations now share the newest per-PR state, so a merge reaches every visible surface before paint without a second request. When that branch later exposes a different open pull request, the terminal thread link is replaced and the open panel follows it immediately. Verified with 110 focused server tests, 34 directly affected web tests, server and web typechecks, and repository-pinned formatting and lint; implemented by gpt-5.6-sol in the Codex harness.

relinked thread, view pr controls, sidebar, and pull request panel all target #9332


Note

Medium Risk
Changes auto-settlement timing, PR summary caching semantics, and cross-view client state; bounded merge-event PubSub can drop events under load, and merged observations are sticky for up to five minutes on the client.

Overview
Merges performed in-app now trigger thread settlement right away instead of waiting on the periodic sweep. PullRequestService emits merge events after a successful merge action, and ThreadSettlementReactor listens and runs a sweep scoped to threads linked to that PR—treating the event as merged state without another host lookup.

Strict settlement reads (recoverTransientFailure: false) can return a previously observed merged summary from cache instead of refreshing from the provider, so transient API failures do not undo a merge the app already knows about.

On the web, per-PR observed summaries are stored and merged across the PR panel and sidebar via useSharedPullRequestSummary, with rules that favor merged state and newer updatedAt so UI surfaces agree after a merge. threadPullRequestRefreshSource and linked-detail refresh from the panel are removed in favor of this shared state and simpler VCS refresh when the thread PR is inferred, not persisted.

Chat can relink a thread from a merged/closed linked PR to a different open PR on the same branch (persisted metadata + open panel), and skips panel onStateChange callbacks when a linked PR is already authoritative.

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

Note

Add shared pull-request state and merge-triggered settlement sweeps

  • PullRequestService publishes successful merge events to a bounded PubSub channel and strict summary reads reuse an already-observed merged result instead of refreshing the provider
  • ThreadSettlementReactor subscribes to merge events and runs a targeted sweep that settles only the matching linked thread using the event timestamp, bypassing the periodic schedule and summary lookups
  • Web client introduces observedPullRequestSummaryAtom, newestPullRequestSummary, and useSharedPullRequestSummary so linked-thread status and the detail panel reflect the newest or merged-precedent summary across components
  • ChatView can display and persist a different open pull request on the same branch when the persisted link is merged or closed, with serialized metadata writes per thread
  • Removes the threadPullRequestRefreshSource utility and narrows PullRequestDetailPanel.onStateChange to { repository, number, state }
  • Risk: PullRequestDetailPanel.onStateChange payload drops project and draft fields — any out-of-tree consumer expecting those fields will break; merge-event PubSub has capacity 64 so bursts beyond that drop events and fall back to the periodic sweep

Macroscope summarized 62fe971.

@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 3, 2026
Comment threadapps/web/src/components/ThreadStatusIndicators.tsx Outdated
Comment threadapps/web/src/state/pullRequests.ts Outdated
Comment threadapps/server/src/pullRequest/PullRequestService.ts Outdated
Comment threadapps/server/src/pullRequest/PullRequestService.ts Outdated
Comment threadapps/web/src/components/Sidebar.tsx Outdated
@macroscopeapp

macroscopeappBot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — The change spans server settlement orchestration and multiple client state surfaces, adding automatic merge-triggered settlement and persisted pull-request relinking. These cross-component runtime and user-visible behavior changes have a broader blast radius than an auto-approvable bug fix or bounded option.

You can add or adjust custom eligibility rules. Learn more.

Comment threadapps/server/src/pullRequest/PullRequestService.ts Outdated
Comment threadapps/server/src/pullRequest/PullRequestService.ts Outdated
Comment threadapps/server/src/orchestration/ThreadSettlementReactor.ts Outdated
Comment threadapps/web/src/components/ChatView.logic.ts Outdated
Comment threadapps/web/src/components/ChatView.tsx Outdated
Comment threadapps/server/src/pullRequest/PullRequestService.ts
Comment threadapps/web/src/components/ChatView.tsx Outdated
@maria-rcksmaria-rcks changed the title fix(pull-requests): settle threads immediately after mergefix(pull-requests): shared state + not settling?Sep 3, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 1910535. Configure here.

Comment threadapps/web/src/components/ChatView.tsx Outdated
@maria-rcks
maria-rcks merged commit 854541a into pingdotgg:mainSep 3, 2026
27 checks passed
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:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@maria-rcks