fix: keep auto-settle policy consistent across clients - #5290

Closed
PixPMusic wants to merge 1 commit into
pingdotgg:mainfrom
PixPMusic:pixpmusic/server-auto-settle-policy
Closed

fix: keep auto-settle policy consistent across clients#5290
PixPMusic wants to merge 1 commit into
pingdotgg:mainfrom
PixPMusic:pixpmusic/server-auto-settle-policy

Conversation

@PixPMusic

@PixPMusicPixPMusic commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • moved the inactivity auto-settle threshold from device-local client settings into server settings owned by each environment
  • made web, desktop, and mobile classify each thread with its owning environment's streamed policy
  • kept inactivity classification derived: clients do not send thread.settle, and the server does not schedule settlement events
  • added version-skew gating, multi-environment regression coverage, and user documentation

Why

Web/desktop read sidebarAutoSettleAfterDays from local client persistence, while mobile hard-coded the default of three days. A desktop configured for seven days and a mobile client connected to the same server could therefore put the same thread in different shelves.

The existing server-settings RPC is already remotely writable and streamed to connected clients, so the policy now lives there. Explicit settle/un-settle remains the durable server lifecycle; crossing the inactivity threshold only changes the derived list classification. This avoids clients racing automatic settle commands and lets a policy change reclassify threads immediately.

The default remains three days. The legacy client field and exported names remain decodable for downgrade/source compatibility, but local values no longer drive upgraded clients; automatically importing whichever client connects first would recreate the same ownership race. In multi-environment lists, each backend owns its own policy rather than one client silently mirroring writes to other environments.

This establishes the ownership boundary that overlaps with #5141. Its proposed additional auto-settle controls should extend the server-owned policy rather than introducing separate web and mobile preferences.

UI Changes

No layout or interaction changes. The existing General setting now updates the primary environment and is read-only against older servers that do not advertise policy updates, so screenshots/video are not applicable.

Verification

  • vp test run packages/contracts/src/settings.test.ts apps/server/src/serverSettings.test.ts packages/client-runtime/src/state/threadSettled.test.ts apps/mobile/src/features/threads/threadListV2.test.ts — 269 passed
  • targeted typechecks for contracts, client runtime, server, web, and mobile
  • targeted lint and formatting checks for all changed source and documentation files
  • git diff --check

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • Screenshots are not applicable because there is no visual layout change
  • A video is not applicable because there is no animation or timing interaction change

Model: GPT-5.6-Sol | Harness: Codex in T3 Code


Note

Medium Risk
Changes how threads appear in sidebars across clients and introduces server-streamed policy with version-skew gating; behavior can shift when local client thresholds differed from the environment default.

Overview
Moves inactive thread auto-settle from per-device client settings (sidebarAutoSettleAfterDays) to per-environment server settings (threadSettlement.autoSettleAfterDays), streamed to connected clients so web, desktop, and mobile classify the same threads the same way.

Contracts & server: Adds ThreadSettlementSettings on ServerSettings, renames the day-threshold constants to THREAD_AUTO_SETTLE_*, keeps the old client field only for downgrade decoding, and advertises a new threadSettlementPolicy capability. The server persists policy patches and tests cover enable/disable.

Clients: Web sidebar, chat view, thread actions, and General settings now read/write the primary environment’s streamed policy (controls disabled when the server lacks threadSettlementPolicy). Mobile thread list v2 takes a per-environment map instead of a single hard-coded default; classification still treats inactivity as a derived settled view, not a server settle command.

Docs: New user doc on thread settlement and a README link.

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

Note

Move auto-settle policy from client preferences to per-environment server settings

  • Adds a threadSettlement section to server settings with an autoSettleAfterDays field (default: 3 days, nullable to disable) and a threadSettlementPolicy capability flag so clients can detect support.
  • Updates buildThreadListV2Items to accept a per-environment map (autoSettleAfterDaysByEnvironment) instead of a single global value; threads fall back to DEFAULT_THREAD_AUTO_SETTLE_AFTER_DAYS when no policy is set for their environment.
  • Web sidebar, chat view, and thread action menu all now read auto-settle policy from serverConfig.settings.threadSettlement rather than a local client preference.
  • The General settings panel binds auto-settle controls to the server-side policy and disables them when the connected server does not advertise threadSettlementPolicy support.
  • Behavioral Change: sidebarAutoSettleAfterDays in client settings is deprecated but retained for downgrade compatibility; existing clients on servers without the capability will use the fixed 3-day default.

Macroscope summarized 08b6d70.

@coderabbitai

coderabbitaiBot commented Aug 3, 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 Plus

Run ID: 26f17fa4-d86c-4525-adea-03ba92866013

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

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:L 100-499 changed lines (additions + deletions). labels Aug 3, 2026
@macroscopeapp

macroscopeappBot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR moves thread auto-settlement policy from client-side settings to server-side environment configuration - a cross-cutting architectural change affecting mobile, web, and server. The author labeled it 'Medium Risk' as it changes how threads appear across connected clients.

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

@PixPMusic
PixPMusicforce-pushed the pixpmusic/server-auto-settle-policy branch from cb360a6 to 08b6d70CompareAugust 10, 2026 08:11
@t3dotggt3dotgg added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 24, 2026
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

We're closing this PR as we clean up the T3 Code backlog. Thank you for taking the time to put this together.

Merged PR #8600 moved automatic settlement to the server, with one policy per environment and saved settlement state across clients. This replaces the client-derived classification proposed here. Policy changes do not reopen settled threads. The server change is in v0.0.38.

If you believe we closed this in error, please reopen the PR and leave a comment explaining what we missed.

@t3dotggt3dotgg closed this Sep 1, 2026
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.

2 participants

@PixPMusic@t3dotgg
, '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: keep auto-settle policy consistent across clients - #5290

Closed
PixPMusic wants to merge 1 commit into
pingdotgg:mainfrom
PixPMusic:pixpmusic/server-auto-settle-policy
Closed

fix: keep auto-settle policy consistent across clients#5290
PixPMusic wants to merge 1 commit into
pingdotgg:mainfrom
PixPMusic:pixpmusic/server-auto-settle-policy

Conversation

@PixPMusic

@PixPMusicPixPMusic commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • moved the inactivity auto-settle threshold from device-local client settings into server settings owned by each environment
  • made web, desktop, and mobile classify each thread with its owning environment's streamed policy
  • kept inactivity classification derived: clients do not send thread.settle, and the server does not schedule settlement events
  • added version-skew gating, multi-environment regression coverage, and user documentation

Why

Web/desktop read sidebarAutoSettleAfterDays from local client persistence, while mobile hard-coded the default of three days. A desktop configured for seven days and a mobile client connected to the same server could therefore put the same thread in different shelves.

The existing server-settings RPC is already remotely writable and streamed to connected clients, so the policy now lives there. Explicit settle/un-settle remains the durable server lifecycle; crossing the inactivity threshold only changes the derived list classification. This avoids clients racing automatic settle commands and lets a policy change reclassify threads immediately.

The default remains three days. The legacy client field and exported names remain decodable for downgrade/source compatibility, but local values no longer drive upgraded clients; automatically importing whichever client connects first would recreate the same ownership race. In multi-environment lists, each backend owns its own policy rather than one client silently mirroring writes to other environments.

This establishes the ownership boundary that overlaps with #5141. Its proposed additional auto-settle controls should extend the server-owned policy rather than introducing separate web and mobile preferences.

UI Changes

No layout or interaction changes. The existing General setting now updates the primary environment and is read-only against older servers that do not advertise policy updates, so screenshots/video are not applicable.

Verification

  • vp test run packages/contracts/src/settings.test.ts apps/server/src/serverSettings.test.ts packages/client-runtime/src/state/threadSettled.test.ts apps/mobile/src/features/threads/threadListV2.test.ts — 269 passed
  • targeted typechecks for contracts, client runtime, server, web, and mobile
  • targeted lint and formatting checks for all changed source and documentation files
  • git diff --check

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • Screenshots are not applicable because there is no visual layout change
  • A video is not applicable because there is no animation or timing interaction change

Model: GPT-5.6-Sol | Harness: Codex in T3 Code


Note

Medium Risk
Changes how threads appear in sidebars across clients and introduces server-streamed policy with version-skew gating; behavior can shift when local client thresholds differed from the environment default.

Overview
Moves inactive thread auto-settle from per-device client settings (sidebarAutoSettleAfterDays) to per-environment server settings (threadSettlement.autoSettleAfterDays), streamed to connected clients so web, desktop, and mobile classify the same threads the same way.

Contracts & server: Adds ThreadSettlementSettings on ServerSettings, renames the day-threshold constants to THREAD_AUTO_SETTLE_*, keeps the old client field only for downgrade decoding, and advertises a new threadSettlementPolicy capability. The server persists policy patches and tests cover enable/disable.

Clients: Web sidebar, chat view, thread actions, and General settings now read/write the primary environment’s streamed policy (controls disabled when the server lacks threadSettlementPolicy). Mobile thread list v2 takes a per-environment map instead of a single hard-coded default; classification still treats inactivity as a derived settled view, not a server settle command.

Docs: New user doc on thread settlement and a README link.

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

Note

Move auto-settle policy from client preferences to per-environment server settings

  • Adds a threadSettlement section to server settings with an autoSettleAfterDays field (default: 3 days, nullable to disable) and a threadSettlementPolicy capability flag so clients can detect support.
  • Updates buildThreadListV2Items to accept a per-environment map (autoSettleAfterDaysByEnvironment) instead of a single global value; threads fall back to DEFAULT_THREAD_AUTO_SETTLE_AFTER_DAYS when no policy is set for their environment.
  • Web sidebar, chat view, and thread action menu all now read auto-settle policy from serverConfig.settings.threadSettlement rather than a local client preference.
  • The General settings panel binds auto-settle controls to the server-side policy and disables them when the connected server does not advertise threadSettlementPolicy support.
  • Behavioral Change: sidebarAutoSettleAfterDays in client settings is deprecated but retained for downgrade compatibility; existing clients on servers without the capability will use the fixed 3-day default.

Macroscope summarized 08b6d70.

@coderabbitai

coderabbitaiBot commented Aug 3, 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 Plus

Run ID: 26f17fa4-d86c-4525-adea-03ba92866013

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

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:L 100-499 changed lines (additions + deletions). labels Aug 3, 2026
@macroscopeapp

macroscopeappBot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR moves thread auto-settlement policy from client-side settings to server-side environment configuration - a cross-cutting architectural change affecting mobile, web, and server. The author labeled it 'Medium Risk' as it changes how threads appear across connected clients.

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

@PixPMusic
PixPMusicforce-pushed the pixpmusic/server-auto-settle-policy branch from cb360a6 to 08b6d70CompareAugust 10, 2026 08:11
@t3dotggt3dotgg added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 24, 2026
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

We're closing this PR as we clean up the T3 Code backlog. Thank you for taking the time to put this together.

Merged PR #8600 moved automatic settlement to the server, with one policy per environment and saved settlement state across clients. This replaces the client-derived classification proposed here. Policy changes do not reopen settled threads. The server change is in v0.0.38.

If you believe we closed this in error, please reopen the PR and leave a comment explaining what we missed.

@t3dotggt3dotgg closed this Sep 1, 2026
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.

2 participants

@PixPMusic@t3dotgg
, '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: keep auto-settle policy consistent across clients - #5290

Closed
PixPMusic wants to merge 1 commit into
pingdotgg:mainfrom
PixPMusic:pixpmusic/server-auto-settle-policy
Closed

fix: keep auto-settle policy consistent across clients#5290
PixPMusic wants to merge 1 commit into
pingdotgg:mainfrom
PixPMusic:pixpmusic/server-auto-settle-policy

Conversation

@PixPMusic

@PixPMusicPixPMusic commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • moved the inactivity auto-settle threshold from device-local client settings into server settings owned by each environment
  • made web, desktop, and mobile classify each thread with its owning environment's streamed policy
  • kept inactivity classification derived: clients do not send thread.settle, and the server does not schedule settlement events
  • added version-skew gating, multi-environment regression coverage, and user documentation

Why

Web/desktop read sidebarAutoSettleAfterDays from local client persistence, while mobile hard-coded the default of three days. A desktop configured for seven days and a mobile client connected to the same server could therefore put the same thread in different shelves.

The existing server-settings RPC is already remotely writable and streamed to connected clients, so the policy now lives there. Explicit settle/un-settle remains the durable server lifecycle; crossing the inactivity threshold only changes the derived list classification. This avoids clients racing automatic settle commands and lets a policy change reclassify threads immediately.

The default remains three days. The legacy client field and exported names remain decodable for downgrade/source compatibility, but local values no longer drive upgraded clients; automatically importing whichever client connects first would recreate the same ownership race. In multi-environment lists, each backend owns its own policy rather than one client silently mirroring writes to other environments.

This establishes the ownership boundary that overlaps with #5141. Its proposed additional auto-settle controls should extend the server-owned policy rather than introducing separate web and mobile preferences.

UI Changes

No layout or interaction changes. The existing General setting now updates the primary environment and is read-only against older servers that do not advertise policy updates, so screenshots/video are not applicable.

Verification

  • vp test run packages/contracts/src/settings.test.ts apps/server/src/serverSettings.test.ts packages/client-runtime/src/state/threadSettled.test.ts apps/mobile/src/features/threads/threadListV2.test.ts — 269 passed
  • targeted typechecks for contracts, client runtime, server, web, and mobile
  • targeted lint and formatting checks for all changed source and documentation files
  • git diff --check

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • Screenshots are not applicable because there is no visual layout change
  • A video is not applicable because there is no animation or timing interaction change

Model: GPT-5.6-Sol | Harness: Codex in T3 Code


Note

Medium Risk
Changes how threads appear in sidebars across clients and introduces server-streamed policy with version-skew gating; behavior can shift when local client thresholds differed from the environment default.

Overview
Moves inactive thread auto-settle from per-device client settings (sidebarAutoSettleAfterDays) to per-environment server settings (threadSettlement.autoSettleAfterDays), streamed to connected clients so web, desktop, and mobile classify the same threads the same way.

Contracts & server: Adds ThreadSettlementSettings on ServerSettings, renames the day-threshold constants to THREAD_AUTO_SETTLE_*, keeps the old client field only for downgrade decoding, and advertises a new threadSettlementPolicy capability. The server persists policy patches and tests cover enable/disable.

Clients: Web sidebar, chat view, thread actions, and General settings now read/write the primary environment’s streamed policy (controls disabled when the server lacks threadSettlementPolicy). Mobile thread list v2 takes a per-environment map instead of a single hard-coded default; classification still treats inactivity as a derived settled view, not a server settle command.

Docs: New user doc on thread settlement and a README link.

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

Note

Move auto-settle policy from client preferences to per-environment server settings

  • Adds a threadSettlement section to server settings with an autoSettleAfterDays field (default: 3 days, nullable to disable) and a threadSettlementPolicy capability flag so clients can detect support.
  • Updates buildThreadListV2Items to accept a per-environment map (autoSettleAfterDaysByEnvironment) instead of a single global value; threads fall back to DEFAULT_THREAD_AUTO_SETTLE_AFTER_DAYS when no policy is set for their environment.
  • Web sidebar, chat view, and thread action menu all now read auto-settle policy from serverConfig.settings.threadSettlement rather than a local client preference.
  • The General settings panel binds auto-settle controls to the server-side policy and disables them when the connected server does not advertise threadSettlementPolicy support.
  • Behavioral Change: sidebarAutoSettleAfterDays in client settings is deprecated but retained for downgrade compatibility; existing clients on servers without the capability will use the fixed 3-day default.

Macroscope summarized 08b6d70.

@coderabbitai

coderabbitaiBot commented Aug 3, 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 Plus

Run ID: 26f17fa4-d86c-4525-adea-03ba92866013

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

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:L 100-499 changed lines (additions + deletions). labels Aug 3, 2026
@macroscopeapp

macroscopeappBot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR moves thread auto-settlement policy from client-side settings to server-side environment configuration - a cross-cutting architectural change affecting mobile, web, and server. The author labeled it 'Medium Risk' as it changes how threads appear across connected clients.

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

@PixPMusic
PixPMusicforce-pushed the pixpmusic/server-auto-settle-policy branch from cb360a6 to 08b6d70CompareAugust 10, 2026 08:11
@t3dotggt3dotgg added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 24, 2026
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

We're closing this PR as we clean up the T3 Code backlog. Thank you for taking the time to put this together.

Merged PR #8600 moved automatic settlement to the server, with one policy per environment and saved settlement state across clients. This replaces the client-derived classification proposed here. Policy changes do not reopen settled threads. The server change is in v0.0.38.

If you believe we closed this in error, please reopen the PR and leave a comment explaining what we missed.

@t3dotggt3dotgg closed this Sep 1, 2026
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.

2 participants

@PixPMusic@t3dotgg
, '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: keep auto-settle policy consistent across clients - #5290

Closed
PixPMusic wants to merge 1 commit into
pingdotgg:mainfrom
PixPMusic:pixpmusic/server-auto-settle-policy
Closed

fix: keep auto-settle policy consistent across clients#5290
PixPMusic wants to merge 1 commit into
pingdotgg:mainfrom
PixPMusic:pixpmusic/server-auto-settle-policy

Conversation

@PixPMusic

@PixPMusicPixPMusic commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • moved the inactivity auto-settle threshold from device-local client settings into server settings owned by each environment
  • made web, desktop, and mobile classify each thread with its owning environment's streamed policy
  • kept inactivity classification derived: clients do not send thread.settle, and the server does not schedule settlement events
  • added version-skew gating, multi-environment regression coverage, and user documentation

Why

Web/desktop read sidebarAutoSettleAfterDays from local client persistence, while mobile hard-coded the default of three days. A desktop configured for seven days and a mobile client connected to the same server could therefore put the same thread in different shelves.

The existing server-settings RPC is already remotely writable and streamed to connected clients, so the policy now lives there. Explicit settle/un-settle remains the durable server lifecycle; crossing the inactivity threshold only changes the derived list classification. This avoids clients racing automatic settle commands and lets a policy change reclassify threads immediately.

The default remains three days. The legacy client field and exported names remain decodable for downgrade/source compatibility, but local values no longer drive upgraded clients; automatically importing whichever client connects first would recreate the same ownership race. In multi-environment lists, each backend owns its own policy rather than one client silently mirroring writes to other environments.

This establishes the ownership boundary that overlaps with #5141. Its proposed additional auto-settle controls should extend the server-owned policy rather than introducing separate web and mobile preferences.

UI Changes

No layout or interaction changes. The existing General setting now updates the primary environment and is read-only against older servers that do not advertise policy updates, so screenshots/video are not applicable.

Verification

  • vp test run packages/contracts/src/settings.test.ts apps/server/src/serverSettings.test.ts packages/client-runtime/src/state/threadSettled.test.ts apps/mobile/src/features/threads/threadListV2.test.ts — 269 passed
  • targeted typechecks for contracts, client runtime, server, web, and mobile
  • targeted lint and formatting checks for all changed source and documentation files
  • git diff --check

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • Screenshots are not applicable because there is no visual layout change
  • A video is not applicable because there is no animation or timing interaction change

Model: GPT-5.6-Sol | Harness: Codex in T3 Code


Note

Medium Risk
Changes how threads appear in sidebars across clients and introduces server-streamed policy with version-skew gating; behavior can shift when local client thresholds differed from the environment default.

Overview
Moves inactive thread auto-settle from per-device client settings (sidebarAutoSettleAfterDays) to per-environment server settings (threadSettlement.autoSettleAfterDays), streamed to connected clients so web, desktop, and mobile classify the same threads the same way.

Contracts & server: Adds ThreadSettlementSettings on ServerSettings, renames the day-threshold constants to THREAD_AUTO_SETTLE_*, keeps the old client field only for downgrade decoding, and advertises a new threadSettlementPolicy capability. The server persists policy patches and tests cover enable/disable.

Clients: Web sidebar, chat view, thread actions, and General settings now read/write the primary environment’s streamed policy (controls disabled when the server lacks threadSettlementPolicy). Mobile thread list v2 takes a per-environment map instead of a single hard-coded default; classification still treats inactivity as a derived settled view, not a server settle command.

Docs: New user doc on thread settlement and a README link.

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

Note

Move auto-settle policy from client preferences to per-environment server settings

  • Adds a threadSettlement section to server settings with an autoSettleAfterDays field (default: 3 days, nullable to disable) and a threadSettlementPolicy capability flag so clients can detect support.
  • Updates buildThreadListV2Items to accept a per-environment map (autoSettleAfterDaysByEnvironment) instead of a single global value; threads fall back to DEFAULT_THREAD_AUTO_SETTLE_AFTER_DAYS when no policy is set for their environment.
  • Web sidebar, chat view, and thread action menu all now read auto-settle policy from serverConfig.settings.threadSettlement rather than a local client preference.
  • The General settings panel binds auto-settle controls to the server-side policy and disables them when the connected server does not advertise threadSettlementPolicy support.
  • Behavioral Change: sidebarAutoSettleAfterDays in client settings is deprecated but retained for downgrade compatibility; existing clients on servers without the capability will use the fixed 3-day default.

Macroscope summarized 08b6d70.

@coderabbitai

coderabbitaiBot commented Aug 3, 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 Plus

Run ID: 26f17fa4-d86c-4525-adea-03ba92866013

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

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:L 100-499 changed lines (additions + deletions). labels Aug 3, 2026
@macroscopeapp

macroscopeappBot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR moves thread auto-settlement policy from client-side settings to server-side environment configuration - a cross-cutting architectural change affecting mobile, web, and server. The author labeled it 'Medium Risk' as it changes how threads appear across connected clients.

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

@PixPMusic
PixPMusicforce-pushed the pixpmusic/server-auto-settle-policy branch from cb360a6 to 08b6d70CompareAugust 10, 2026 08:11
@t3dotggt3dotgg added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 24, 2026
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

We're closing this PR as we clean up the T3 Code backlog. Thank you for taking the time to put this together.

Merged PR #8600 moved automatic settlement to the server, with one policy per environment and saved settlement state across clients. This replaces the client-derived classification proposed here. Policy changes do not reopen settled threads. The server change is in v0.0.38.

If you believe we closed this in error, please reopen the PR and leave a comment explaining what we missed.

@t3dotggt3dotgg closed this Sep 1, 2026
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.

2 participants

@PixPMusic@t3dotgg
, '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: keep auto-settle policy consistent across clients - #5290

Closed
PixPMusic wants to merge 1 commit into
pingdotgg:mainfrom
PixPMusic:pixpmusic/server-auto-settle-policy
Closed

fix: keep auto-settle policy consistent across clients#5290
PixPMusic wants to merge 1 commit into
pingdotgg:mainfrom
PixPMusic:pixpmusic/server-auto-settle-policy

Conversation

@PixPMusic

@PixPMusicPixPMusic commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • moved the inactivity auto-settle threshold from device-local client settings into server settings owned by each environment
  • made web, desktop, and mobile classify each thread with its owning environment's streamed policy
  • kept inactivity classification derived: clients do not send thread.settle, and the server does not schedule settlement events
  • added version-skew gating, multi-environment regression coverage, and user documentation

Why

Web/desktop read sidebarAutoSettleAfterDays from local client persistence, while mobile hard-coded the default of three days. A desktop configured for seven days and a mobile client connected to the same server could therefore put the same thread in different shelves.

The existing server-settings RPC is already remotely writable and streamed to connected clients, so the policy now lives there. Explicit settle/un-settle remains the durable server lifecycle; crossing the inactivity threshold only changes the derived list classification. This avoids clients racing automatic settle commands and lets a policy change reclassify threads immediately.

The default remains three days. The legacy client field and exported names remain decodable for downgrade/source compatibility, but local values no longer drive upgraded clients; automatically importing whichever client connects first would recreate the same ownership race. In multi-environment lists, each backend owns its own policy rather than one client silently mirroring writes to other environments.

This establishes the ownership boundary that overlaps with #5141. Its proposed additional auto-settle controls should extend the server-owned policy rather than introducing separate web and mobile preferences.

UI Changes

No layout or interaction changes. The existing General setting now updates the primary environment and is read-only against older servers that do not advertise policy updates, so screenshots/video are not applicable.

Verification

  • vp test run packages/contracts/src/settings.test.ts apps/server/src/serverSettings.test.ts packages/client-runtime/src/state/threadSettled.test.ts apps/mobile/src/features/threads/threadListV2.test.ts — 269 passed
  • targeted typechecks for contracts, client runtime, server, web, and mobile
  • targeted lint and formatting checks for all changed source and documentation files
  • git diff --check

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • Screenshots are not applicable because there is no visual layout change
  • A video is not applicable because there is no animation or timing interaction change

Model: GPT-5.6-Sol | Harness: Codex in T3 Code


Note

Medium Risk
Changes how threads appear in sidebars across clients and introduces server-streamed policy with version-skew gating; behavior can shift when local client thresholds differed from the environment default.

Overview
Moves inactive thread auto-settle from per-device client settings (sidebarAutoSettleAfterDays) to per-environment server settings (threadSettlement.autoSettleAfterDays), streamed to connected clients so web, desktop, and mobile classify the same threads the same way.

Contracts & server: Adds ThreadSettlementSettings on ServerSettings, renames the day-threshold constants to THREAD_AUTO_SETTLE_*, keeps the old client field only for downgrade decoding, and advertises a new threadSettlementPolicy capability. The server persists policy patches and tests cover enable/disable.

Clients: Web sidebar, chat view, thread actions, and General settings now read/write the primary environment’s streamed policy (controls disabled when the server lacks threadSettlementPolicy). Mobile thread list v2 takes a per-environment map instead of a single hard-coded default; classification still treats inactivity as a derived settled view, not a server settle command.

Docs: New user doc on thread settlement and a README link.

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

Note

Move auto-settle policy from client preferences to per-environment server settings

  • Adds a threadSettlement section to server settings with an autoSettleAfterDays field (default: 3 days, nullable to disable) and a threadSettlementPolicy capability flag so clients can detect support.
  • Updates buildThreadListV2Items to accept a per-environment map (autoSettleAfterDaysByEnvironment) instead of a single global value; threads fall back to DEFAULT_THREAD_AUTO_SETTLE_AFTER_DAYS when no policy is set for their environment.
  • Web sidebar, chat view, and thread action menu all now read auto-settle policy from serverConfig.settings.threadSettlement rather than a local client preference.
  • The General settings panel binds auto-settle controls to the server-side policy and disables them when the connected server does not advertise threadSettlementPolicy support.
  • Behavioral Change: sidebarAutoSettleAfterDays in client settings is deprecated but retained for downgrade compatibility; existing clients on servers without the capability will use the fixed 3-day default.

Macroscope summarized 08b6d70.

@coderabbitai

coderabbitaiBot commented Aug 3, 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 Plus

Run ID: 26f17fa4-d86c-4525-adea-03ba92866013

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

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:L 100-499 changed lines (additions + deletions). labels Aug 3, 2026
@macroscopeapp

macroscopeappBot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR moves thread auto-settlement policy from client-side settings to server-side environment configuration - a cross-cutting architectural change affecting mobile, web, and server. The author labeled it 'Medium Risk' as it changes how threads appear across connected clients.

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

@PixPMusic
PixPMusicforce-pushed the pixpmusic/server-auto-settle-policy branch from cb360a6 to 08b6d70CompareAugust 10, 2026 08:11
@t3dotggt3dotgg added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 24, 2026
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

We're closing this PR as we clean up the T3 Code backlog. Thank you for taking the time to put this together.

Merged PR #8600 moved automatic settlement to the server, with one policy per environment and saved settlement state across clients. This replaces the client-derived classification proposed here. Policy changes do not reopen settled threads. The server change is in v0.0.38.

If you believe we closed this in error, please reopen the PR and leave a comment explaining what we missed.

@t3dotggt3dotgg closed this Sep 1, 2026
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.

2 participants

@PixPMusic@t3dotgg
, '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: keep auto-settle policy consistent across clients - #5290

Closed
PixPMusic wants to merge 1 commit into
pingdotgg:mainfrom
PixPMusic:pixpmusic/server-auto-settle-policy
Closed

fix: keep auto-settle policy consistent across clients#5290
PixPMusic wants to merge 1 commit into
pingdotgg:mainfrom
PixPMusic:pixpmusic/server-auto-settle-policy

Conversation

@PixPMusic

@PixPMusicPixPMusic commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • moved the inactivity auto-settle threshold from device-local client settings into server settings owned by each environment
  • made web, desktop, and mobile classify each thread with its owning environment's streamed policy
  • kept inactivity classification derived: clients do not send thread.settle, and the server does not schedule settlement events
  • added version-skew gating, multi-environment regression coverage, and user documentation

Why

Web/desktop read sidebarAutoSettleAfterDays from local client persistence, while mobile hard-coded the default of three days. A desktop configured for seven days and a mobile client connected to the same server could therefore put the same thread in different shelves.

The existing server-settings RPC is already remotely writable and streamed to connected clients, so the policy now lives there. Explicit settle/un-settle remains the durable server lifecycle; crossing the inactivity threshold only changes the derived list classification. This avoids clients racing automatic settle commands and lets a policy change reclassify threads immediately.

The default remains three days. The legacy client field and exported names remain decodable for downgrade/source compatibility, but local values no longer drive upgraded clients; automatically importing whichever client connects first would recreate the same ownership race. In multi-environment lists, each backend owns its own policy rather than one client silently mirroring writes to other environments.

This establishes the ownership boundary that overlaps with #5141. Its proposed additional auto-settle controls should extend the server-owned policy rather than introducing separate web and mobile preferences.

UI Changes

No layout or interaction changes. The existing General setting now updates the primary environment and is read-only against older servers that do not advertise policy updates, so screenshots/video are not applicable.

Verification

  • vp test run packages/contracts/src/settings.test.ts apps/server/src/serverSettings.test.ts packages/client-runtime/src/state/threadSettled.test.ts apps/mobile/src/features/threads/threadListV2.test.ts — 269 passed
  • targeted typechecks for contracts, client runtime, server, web, and mobile
  • targeted lint and formatting checks for all changed source and documentation files
  • git diff --check

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • Screenshots are not applicable because there is no visual layout change
  • A video is not applicable because there is no animation or timing interaction change

Model: GPT-5.6-Sol | Harness: Codex in T3 Code


Note

Medium Risk
Changes how threads appear in sidebars across clients and introduces server-streamed policy with version-skew gating; behavior can shift when local client thresholds differed from the environment default.

Overview
Moves inactive thread auto-settle from per-device client settings (sidebarAutoSettleAfterDays) to per-environment server settings (threadSettlement.autoSettleAfterDays), streamed to connected clients so web, desktop, and mobile classify the same threads the same way.

Contracts & server: Adds ThreadSettlementSettings on ServerSettings, renames the day-threshold constants to THREAD_AUTO_SETTLE_*, keeps the old client field only for downgrade decoding, and advertises a new threadSettlementPolicy capability. The server persists policy patches and tests cover enable/disable.

Clients: Web sidebar, chat view, thread actions, and General settings now read/write the primary environment’s streamed policy (controls disabled when the server lacks threadSettlementPolicy). Mobile thread list v2 takes a per-environment map instead of a single hard-coded default; classification still treats inactivity as a derived settled view, not a server settle command.

Docs: New user doc on thread settlement and a README link.

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

Note

Move auto-settle policy from client preferences to per-environment server settings

  • Adds a threadSettlement section to server settings with an autoSettleAfterDays field (default: 3 days, nullable to disable) and a threadSettlementPolicy capability flag so clients can detect support.
  • Updates buildThreadListV2Items to accept a per-environment map (autoSettleAfterDaysByEnvironment) instead of a single global value; threads fall back to DEFAULT_THREAD_AUTO_SETTLE_AFTER_DAYS when no policy is set for their environment.
  • Web sidebar, chat view, and thread action menu all now read auto-settle policy from serverConfig.settings.threadSettlement rather than a local client preference.
  • The General settings panel binds auto-settle controls to the server-side policy and disables them when the connected server does not advertise threadSettlementPolicy support.
  • Behavioral Change: sidebarAutoSettleAfterDays in client settings is deprecated but retained for downgrade compatibility; existing clients on servers without the capability will use the fixed 3-day default.

Macroscope summarized 08b6d70.

@coderabbitai

coderabbitaiBot commented Aug 3, 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 Plus

Run ID: 26f17fa4-d86c-4525-adea-03ba92866013

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

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:L 100-499 changed lines (additions + deletions). labels Aug 3, 2026
@macroscopeapp

macroscopeappBot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR moves thread auto-settlement policy from client-side settings to server-side environment configuration - a cross-cutting architectural change affecting mobile, web, and server. The author labeled it 'Medium Risk' as it changes how threads appear across connected clients.

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

@PixPMusic
PixPMusicforce-pushed the pixpmusic/server-auto-settle-policy branch from cb360a6 to 08b6d70CompareAugust 10, 2026 08:11
@t3dotggt3dotgg added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 24, 2026
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

We're closing this PR as we clean up the T3 Code backlog. Thank you for taking the time to put this together.

Merged PR #8600 moved automatic settlement to the server, with one policy per environment and saved settlement state across clients. This replaces the client-derived classification proposed here. Policy changes do not reopen settled threads. The server change is in v0.0.38.

If you believe we closed this in error, please reopen the PR and leave a comment explaining what we missed.

@t3dotggt3dotgg closed this Sep 1, 2026
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.

2 participants

@PixPMusic@t3dotgg
, '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: keep auto-settle policy consistent across clients - #5290

Closed
PixPMusic wants to merge 1 commit into
pingdotgg:mainfrom
PixPMusic:pixpmusic/server-auto-settle-policy
Closed

fix: keep auto-settle policy consistent across clients#5290
PixPMusic wants to merge 1 commit into
pingdotgg:mainfrom
PixPMusic:pixpmusic/server-auto-settle-policy

Conversation

@PixPMusic

@PixPMusicPixPMusic commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • moved the inactivity auto-settle threshold from device-local client settings into server settings owned by each environment
  • made web, desktop, and mobile classify each thread with its owning environment's streamed policy
  • kept inactivity classification derived: clients do not send thread.settle, and the server does not schedule settlement events
  • added version-skew gating, multi-environment regression coverage, and user documentation

Why

Web/desktop read sidebarAutoSettleAfterDays from local client persistence, while mobile hard-coded the default of three days. A desktop configured for seven days and a mobile client connected to the same server could therefore put the same thread in different shelves.

The existing server-settings RPC is already remotely writable and streamed to connected clients, so the policy now lives there. Explicit settle/un-settle remains the durable server lifecycle; crossing the inactivity threshold only changes the derived list classification. This avoids clients racing automatic settle commands and lets a policy change reclassify threads immediately.

The default remains three days. The legacy client field and exported names remain decodable for downgrade/source compatibility, but local values no longer drive upgraded clients; automatically importing whichever client connects first would recreate the same ownership race. In multi-environment lists, each backend owns its own policy rather than one client silently mirroring writes to other environments.

This establishes the ownership boundary that overlaps with #5141. Its proposed additional auto-settle controls should extend the server-owned policy rather than introducing separate web and mobile preferences.

UI Changes

No layout or interaction changes. The existing General setting now updates the primary environment and is read-only against older servers that do not advertise policy updates, so screenshots/video are not applicable.

Verification

  • vp test run packages/contracts/src/settings.test.ts apps/server/src/serverSettings.test.ts packages/client-runtime/src/state/threadSettled.test.ts apps/mobile/src/features/threads/threadListV2.test.ts — 269 passed
  • targeted typechecks for contracts, client runtime, server, web, and mobile
  • targeted lint and formatting checks for all changed source and documentation files
  • git diff --check

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • Screenshots are not applicable because there is no visual layout change
  • A video is not applicable because there is no animation or timing interaction change

Model: GPT-5.6-Sol | Harness: Codex in T3 Code


Note

Medium Risk
Changes how threads appear in sidebars across clients and introduces server-streamed policy with version-skew gating; behavior can shift when local client thresholds differed from the environment default.

Overview
Moves inactive thread auto-settle from per-device client settings (sidebarAutoSettleAfterDays) to per-environment server settings (threadSettlement.autoSettleAfterDays), streamed to connected clients so web, desktop, and mobile classify the same threads the same way.

Contracts & server: Adds ThreadSettlementSettings on ServerSettings, renames the day-threshold constants to THREAD_AUTO_SETTLE_*, keeps the old client field only for downgrade decoding, and advertises a new threadSettlementPolicy capability. The server persists policy patches and tests cover enable/disable.

Clients: Web sidebar, chat view, thread actions, and General settings now read/write the primary environment’s streamed policy (controls disabled when the server lacks threadSettlementPolicy). Mobile thread list v2 takes a per-environment map instead of a single hard-coded default; classification still treats inactivity as a derived settled view, not a server settle command.

Docs: New user doc on thread settlement and a README link.

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

Note

Move auto-settle policy from client preferences to per-environment server settings

  • Adds a threadSettlement section to server settings with an autoSettleAfterDays field (default: 3 days, nullable to disable) and a threadSettlementPolicy capability flag so clients can detect support.
  • Updates buildThreadListV2Items to accept a per-environment map (autoSettleAfterDaysByEnvironment) instead of a single global value; threads fall back to DEFAULT_THREAD_AUTO_SETTLE_AFTER_DAYS when no policy is set for their environment.
  • Web sidebar, chat view, and thread action menu all now read auto-settle policy from serverConfig.settings.threadSettlement rather than a local client preference.
  • The General settings panel binds auto-settle controls to the server-side policy and disables them when the connected server does not advertise threadSettlementPolicy support.
  • Behavioral Change: sidebarAutoSettleAfterDays in client settings is deprecated but retained for downgrade compatibility; existing clients on servers without the capability will use the fixed 3-day default.

Macroscope summarized 08b6d70.

@coderabbitai

coderabbitaiBot commented Aug 3, 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 Plus

Run ID: 26f17fa4-d86c-4525-adea-03ba92866013

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

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:L 100-499 changed lines (additions + deletions). labels Aug 3, 2026
@macroscopeapp

macroscopeappBot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR moves thread auto-settlement policy from client-side settings to server-side environment configuration - a cross-cutting architectural change affecting mobile, web, and server. The author labeled it 'Medium Risk' as it changes how threads appear across connected clients.

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

@PixPMusic
PixPMusicforce-pushed the pixpmusic/server-auto-settle-policy branch from cb360a6 to 08b6d70CompareAugust 10, 2026 08:11
@t3dotggt3dotgg added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 24, 2026
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

We're closing this PR as we clean up the T3 Code backlog. Thank you for taking the time to put this together.

Merged PR #8600 moved automatic settlement to the server, with one policy per environment and saved settlement state across clients. This replaces the client-derived classification proposed here. Policy changes do not reopen settled threads. The server change is in v0.0.38.

If you believe we closed this in error, please reopen the PR and leave a comment explaining what we missed.

@t3dotggt3dotgg closed this Sep 1, 2026
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.

2 participants

@PixPMusic@t3dotgg
, '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: keep auto-settle policy consistent across clients - #5290

Closed
PixPMusic wants to merge 1 commit into
pingdotgg:mainfrom
PixPMusic:pixpmusic/server-auto-settle-policy
Closed

fix: keep auto-settle policy consistent across clients#5290
PixPMusic wants to merge 1 commit into
pingdotgg:mainfrom
PixPMusic:pixpmusic/server-auto-settle-policy

Conversation

@PixPMusic

@PixPMusicPixPMusic commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • moved the inactivity auto-settle threshold from device-local client settings into server settings owned by each environment
  • made web, desktop, and mobile classify each thread with its owning environment's streamed policy
  • kept inactivity classification derived: clients do not send thread.settle, and the server does not schedule settlement events
  • added version-skew gating, multi-environment regression coverage, and user documentation

Why

Web/desktop read sidebarAutoSettleAfterDays from local client persistence, while mobile hard-coded the default of three days. A desktop configured for seven days and a mobile client connected to the same server could therefore put the same thread in different shelves.

The existing server-settings RPC is already remotely writable and streamed to connected clients, so the policy now lives there. Explicit settle/un-settle remains the durable server lifecycle; crossing the inactivity threshold only changes the derived list classification. This avoids clients racing automatic settle commands and lets a policy change reclassify threads immediately.

The default remains three days. The legacy client field and exported names remain decodable for downgrade/source compatibility, but local values no longer drive upgraded clients; automatically importing whichever client connects first would recreate the same ownership race. In multi-environment lists, each backend owns its own policy rather than one client silently mirroring writes to other environments.

This establishes the ownership boundary that overlaps with #5141. Its proposed additional auto-settle controls should extend the server-owned policy rather than introducing separate web and mobile preferences.

UI Changes

No layout or interaction changes. The existing General setting now updates the primary environment and is read-only against older servers that do not advertise policy updates, so screenshots/video are not applicable.

Verification

  • vp test run packages/contracts/src/settings.test.ts apps/server/src/serverSettings.test.ts packages/client-runtime/src/state/threadSettled.test.ts apps/mobile/src/features/threads/threadListV2.test.ts — 269 passed
  • targeted typechecks for contracts, client runtime, server, web, and mobile
  • targeted lint and formatting checks for all changed source and documentation files
  • git diff --check

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • Screenshots are not applicable because there is no visual layout change
  • A video is not applicable because there is no animation or timing interaction change

Model: GPT-5.6-Sol | Harness: Codex in T3 Code


Note

Medium Risk
Changes how threads appear in sidebars across clients and introduces server-streamed policy with version-skew gating; behavior can shift when local client thresholds differed from the environment default.

Overview
Moves inactive thread auto-settle from per-device client settings (sidebarAutoSettleAfterDays) to per-environment server settings (threadSettlement.autoSettleAfterDays), streamed to connected clients so web, desktop, and mobile classify the same threads the same way.

Contracts & server: Adds ThreadSettlementSettings on ServerSettings, renames the day-threshold constants to THREAD_AUTO_SETTLE_*, keeps the old client field only for downgrade decoding, and advertises a new threadSettlementPolicy capability. The server persists policy patches and tests cover enable/disable.

Clients: Web sidebar, chat view, thread actions, and General settings now read/write the primary environment’s streamed policy (controls disabled when the server lacks threadSettlementPolicy). Mobile thread list v2 takes a per-environment map instead of a single hard-coded default; classification still treats inactivity as a derived settled view, not a server settle command.

Docs: New user doc on thread settlement and a README link.

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

Note

Move auto-settle policy from client preferences to per-environment server settings

  • Adds a threadSettlement section to server settings with an autoSettleAfterDays field (default: 3 days, nullable to disable) and a threadSettlementPolicy capability flag so clients can detect support.
  • Updates buildThreadListV2Items to accept a per-environment map (autoSettleAfterDaysByEnvironment) instead of a single global value; threads fall back to DEFAULT_THREAD_AUTO_SETTLE_AFTER_DAYS when no policy is set for their environment.
  • Web sidebar, chat view, and thread action menu all now read auto-settle policy from serverConfig.settings.threadSettlement rather than a local client preference.
  • The General settings panel binds auto-settle controls to the server-side policy and disables them when the connected server does not advertise threadSettlementPolicy support.
  • Behavioral Change: sidebarAutoSettleAfterDays in client settings is deprecated but retained for downgrade compatibility; existing clients on servers without the capability will use the fixed 3-day default.

Macroscope summarized 08b6d70.

@coderabbitai

coderabbitaiBot commented Aug 3, 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 Plus

Run ID: 26f17fa4-d86c-4525-adea-03ba92866013

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

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:L 100-499 changed lines (additions + deletions). labels Aug 3, 2026
@macroscopeapp

macroscopeappBot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR moves thread auto-settlement policy from client-side settings to server-side environment configuration - a cross-cutting architectural change affecting mobile, web, and server. The author labeled it 'Medium Risk' as it changes how threads appear across connected clients.

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

@PixPMusic
PixPMusicforce-pushed the pixpmusic/server-auto-settle-policy branch from cb360a6 to 08b6d70CompareAugust 10, 2026 08:11
@t3dotggt3dotgg added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 24, 2026
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

We're closing this PR as we clean up the T3 Code backlog. Thank you for taking the time to put this together.

Merged PR #8600 moved automatic settlement to the server, with one policy per environment and saved settlement state across clients. This replaces the client-derived classification proposed here. Policy changes do not reopen settled threads. The server change is in v0.0.38.

If you believe we closed this in error, please reopen the PR and leave a comment explaining what we missed.

@t3dotggt3dotgg closed this Sep 1, 2026
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.

2 participants

@PixPMusic@t3dotgg