Repository navigation
fix(web): a failed group title stays on screen with a retry - #1468
Merged
Merged
Conversation
donjor
force-pushed
the
t3code/investigate-group-title-failure
branch
4 times, most recently
from
September 30, 2026 20:44
bcda47e to
42867a6
Compare
Author
Requested a rerun for one exact failed CI job on the unchanged pull-request head. GitHub may also rerun dependent jobs. |
Author
Browser QA: Electron dev app, head 42867a6All five QA cases pass live against a real server. Failure injection: CDP
1. Failed title stays on screen
2. Retry while the scope hides the group
3. Regenerate over an open failure
4. Settings unmounts the sidebar
5. Dissolve closes the toastVideoCases 1 and 4 in one low frame rate take: timeout-toast-retry.mp4 |
Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no
donjor
force-pushed
the
t3code/investigate-group-title-failure
branch
from
October 1, 2026 05:26
42867a6 to
e356962
Compare
donjor
marked this pull request as ready for review
October 1, 2026 05:27
donjor
added a commit
that referenced
this pull request
Oct 1, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no Co-authored-by: donjor <[email protected]>
donjor
added a commit
that referenced
this pull request
Oct 1, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no Co-authored-by: donjor <[email protected]>
donjor
pushed a commit
that referenced
this pull request
Oct 2, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no Co-authored-by: donjor <[email protected]>
donjor
added a commit
that referenced
this pull request
Oct 2, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no Co-authored-by: donjor <[email protected]>
donjor
added a commit
that referenced
this pull request
Oct 2, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no Co-authored-by: donjor <[email protected]>
donjor
pushed a commit
that referenced
this pull request
Oct 2, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no Co-authored-by: donjor <[email protected]>
donjor
added a commit
that referenced
this pull request
Oct 3, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no Co-authored-by: donjor <[email protected]>
donjor
pushed a commit
that referenced
this pull request
Oct 3, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no Co-authored-by: donjor <[email protected]>
donjor
pushed a commit
that referenced
this pull request
Oct 3, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no Co-authored-by: donjor <[email protected]>
donjor
pushed a commit
that referenced
this pull request
Oct 4, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no Co-authored-by: donjor <[email protected]>
donjor
pushed a commit
that referenced
this pull request
Oct 4, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no Co-authored-by: donjor <[email protected]>
donjor
pushed a commit
that referenced
this pull request
Oct 4, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no Co-authored-by: donjor <[email protected]>
donjor
pushed a commit
that referenced
this pull request
Oct 4, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no Co-authored-by: donjor <[email protected]>
donjor
added a commit
that referenced
this pull request
Oct 4, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no Co-authored-by: donjor <[email protected]>
donjor
added a commit
that referenced
this pull request
Oct 6, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no Co-authored-by: donjor <[email protected]>
6 of 7 tasks
donjor
added a commit
that referenced
this pull request
Oct 18, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no Co-authored-by: donjor <[email protected]>
donjor
added a commit
that referenced
this pull request
Oct 18, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no Co-authored-by: donjor <[email protected]>
donjor
added a commit
that referenced
this pull request
Oct 18, 2026
…1468) Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no
donjor
added a commit
that referenced
this pull request
Oct 18, 2026
…1468) Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no
donjor
added a commit
that referenced
this pull request
Oct 18, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Squashes: - 8d04468 fix(web): a failed group title stays on screen with a retry (#1468) (#1468) - 43c8c0f fixup! fix(web): a failed group title stays on screen with a retry (#1468) (#1468) Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no Co-authored-by: donjor <[email protected]>
donjor
added a commit
that referenced
this pull request
Oct 19, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Squashes: - 8d04468 fix(web): a failed group title stays on screen with a retry (#1468) (#1468) - 43c8c0f fixup! fix(web): a failed group title stays on screen with a retry (#1468) (#1468) Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no Co-authored-by: donjor <[email protected]>
donjor
added a commit
that referenced
this pull request
Oct 19, 2026
…1468) Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no
donjor
added a commit
that referenced
this pull request
Oct 19, 2026
…1468) Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no
donjor
pushed a commit
that referenced
this pull request
Oct 19, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Squashes: - 0bc5740 fix(web): a failed group title stays on screen with a retry (#1468) (#1468) - a4258ae fixup! fix(web): a failed group title stays on screen with a retry (#1468) (#1468) Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no
donjor
pushed a commit
that referenced
this pull request
Oct 19, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Squashes: - 0bc5740 fix(web): a failed group title stays on screen with a retry (#1468) (#1468) - a4258ae fixup! fix(web): a failed group title stays on screen with a retry (#1468) (#1468) Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no
donjor
pushed a commit
that referenced
this pull request
Oct 20, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Squashes: - 0bc5740 fix(web): a failed group title stays on screen with a retry (#1468) (#1468) - a4258ae fixup! fix(web): a failed group title stays on screen with a retry (#1468) (#1468) Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no
donjor
pushed a commit
that referenced
this pull request
Oct 20, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Squashes: - 0bc5740 fix(web): a failed group title stays on screen with a retry (#1468) (#1468) - a4258ae fixup! fix(web): a failed group title stays on screen with a retry (#1468) (#1468) Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no
donjor
pushed a commit
that referenced
this pull request
Oct 20, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Squashes: - 0bc5740 fix(web): a failed group title stays on screen with a retry (#1468) (#1468) - a4258ae fixup! fix(web): a failed group title stays on screen with a retry (#1468) (#1468) Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no
donjor
pushed a commit
that referenced
this pull request
Oct 20, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Squashes: - 0bc5740 fix(web): a failed group title stays on screen with a retry (#1468) (#1468) - a4258ae fixup! fix(web): a failed group title stays on screen with a retry (#1468) (#1468) Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no
donjor
pushed a commit
that referenced
this pull request
Oct 20, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Squashes: - 0bc5740 fix(web): a failed group title stays on screen with a retry (#1468) (#1468) - a4258ae fixup! fix(web): a failed group title stays on screen with a retry (#1468) (#1468) Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no
donjor
pushed a commit
that referenced
this pull request
Oct 21, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Squashes: - 0bc5740 fix(web): a failed group title stays on screen with a retry (#1468) (#1468) - a4258ae fixup! fix(web): a failed group title stays on screen with a retry (#1468) (#1468) Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no
donjor
pushed a commit
that referenced
this pull request
Oct 21, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Squashes: - 0bc5740 fix(web): a failed group title stays on screen with a retry (#1468) (#1468) - a4258ae fixup! fix(web): a failed group title stays on screen with a retry (#1468) (#1468) Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no
donjor
pushed a commit
that referenced
this pull request
Oct 21, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Squashes: - 0bc5740 fix(web): a failed group title stays on screen with a retry (#1468) (#1468) - a4258ae fixup! fix(web): a failed group title stays on screen with a retry (#1468) (#1468) Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no
donjor
pushed a commit
that referenced
this pull request
Oct 21, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Squashes: - 0bc5740 fix(web): a failed group title stays on screen with a retry (#1468) (#1468) - a4258ae fixup! fix(web): a failed group title stays on screen with a retry (#1468) (#1468) Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no
donjor
pushed a commit
that referenced
this pull request
Oct 21, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Squashes: - 0bc5740 fix(web): a failed group title stays on screen with a retry (#1468) (#1468) - a4258ae fixup! fix(web): a failed group title stays on screen with a retry (#1468) (#1468) Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no
donjor
pushed a commit
that referenced
this pull request
Oct 22, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Squashes: - 0bc5740 fix(web): a failed group title stays on screen with a retry (#1468) (#1468) - a4258ae fixup! fix(web): a failed group title stays on screen with a retry (#1468) (#1468) Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no
donjor
pushed a commit
that referenced
this pull request
Oct 22, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Squashes: - 0bc5740 fix(web): a failed group title stays on screen with a retry (#1468) (#1468) - a4258ae fixup! fix(web): a failed group title stays on screen with a retry (#1468) (#1468) Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no
donjor
pushed a commit
that referenced
this pull request
Oct 23, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Squashes: - 0bc5740 fix(web): a failed group title stays on screen with a retry (#1468) (#1468) - a4258ae fixup! fix(web): a failed group title stays on screen with a retry (#1468) (#1468) Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no
donjor
pushed a commit
that referenced
this pull request
Oct 24, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Squashes: - 0bc5740 fix(web): a failed group title stays on screen with a retry (#1468) (#1468) - a4258ae fixup! fix(web): a failed group title stays on screen with a retry (#1468) (#1468) Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no
donjor
pushed a commit
that referenced
this pull request
Oct 27, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Squashes: - 0bc5740 fix(web): a failed group title stays on screen with a retry (#1468) (#1468) - a4258ae fixup! fix(web): a failed group title stays on screen with a retry (#1468) (#1468) Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no
donjor
pushed a commit
that referenced
this pull request
Oct 27, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Squashes: - 0bc5740 fix(web): a failed group title stays on screen with a retry (#1468) (#1468) - a4258ae fixup! fix(web): a failed group title stays on screen with a retry (#1468) (#1468) Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no
rsi-software-agent Bot
pushed a commit
that referenced
this pull request
Oct 27, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Squashes: - 0bc5740 fix(web): a failed group title stays on screen with a retry (#1468) (#1468) - a4258ae fixup! fix(web): a failed group title stays on screen with a retry (#1468) (#1468) Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no
rsi-software-agent Bot
pushed a commit
that referenced
this pull request
Oct 28, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Squashes: - 0bc5740 fix(web): a failed group title stays on screen with a retry (#1468) (#1468) - a4258ae fixup! fix(web): a failed group title stays on screen with a retry (#1468) (#1468) Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no
rsi-software-agent Bot
pushed a commit
that referenced
this pull request
Oct 28, 2026
Refs #1467 ## What Changed One app-wide owner handles every group title request: `SidebarThreadGroup.title.ts`. | Case | Behavior | | --- | --- | | Failure | toast stays until dismissed | | Toast title | names the group and its size | | Timeout text | names the budget in seconds | | Retry | resolves the group and live thread titles | | Scope switch | Retry still runs | | Overlap | one request per group; extras ignored | | Sidebar remount (Settings and back) | same owner; old toasts still prune and guard | | Repeat failure | one toast per group, replaced | | Rename, member change, dissolve | toast closes | | Group changed mid-request | failure dropped | | Cancellation | silent | | Group name | unchanged on failure | All three entry points share the controller: context menu, drag to a new group, header Regenerate. `Sidebar.tsx` carries three marked hook lines. ## Why A title request that times out fails after 60 s; its toast then cleared in 5 s. UAT saw "New group" with no error. A controlled repro shows the timeout fails typed (`RemoteEnvironmentAuthTimeoutError`), not interrupt-only, so the toast branch ran. That the 5 s toast was missed remains a hypothesis. Budget alignment and the OpenCode latency cause stay open on #1467; hence `Refs`. ## UI Changes Browser QA ran in the Electron dev app against a real server, on a copy of real data. CDP `Fetch` paused the title request: held past 60 s for the real timeout, released early for a transport error. ### 1. Failed title stays on screen - **Toast:** names the group, states the timeout - **Group:** keeps "New group"  ### 2. Retry while the scope hides the group - **Retry:** renamed the hidden group - **Result:** "Carve Out Thread Checkouts" <details> <summary>Scoped away, then scoped back</summary>   </details> ### 3. Regenerate over an open failure - **First Regenerate:** closed the toast - **Second, in flight:** ignored; one request <details> <summary>Before and after Regenerate</summary>   </details> ### 4. Settings unmounts the sidebar - **Settings:** toast persists - **Retry there:** "Sync and Fold Thread Checkouts" <details> <summary>Settings, then the result</summary>   </details> ### 5. Dissolve closes the toast <details> <summary>Before and after Dissolve group</summary>   </details> ### Video Cases 1 and 4, low frame rate: https://github.com/user-attachments/assets/1d09a61f-4ecf-4b51-8e02-717e179ec0cc ## Checklist - [x] This PR is small and focused - [x] I explained what changed and why - [x] I included before/after screenshots for any UI changes - [x] I included a video for animation/interaction changes <details> <summary>Checks</summary> ```text vp test run SidebarThreadGroup.title → exit 0 (13 passed) apps/web vp run typecheck → exit 0 vp run fork:ci → exit 0 apps/web vp run build → exit 0 (pre-rebase head) ``` Mutating the in-flight guard or the stale prune fails a test. </details> Claude Opus 5.5 in Claude Code, inside T3 Code. ## Fork trailers Squashes: - 0bc5740 fix(web): a failed group title stays on screen with a retry (#1468) (#1468) - a4258ae fixup! fix(web): a failed group title stays on screen with a retry (#1468) (#1468) Fork-Domain: thread-ordering Fork-Tier: bugfix Fork-Upstreamable: no
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.









Refs #1467
What Changed
One app-wide owner handles every group title request:
SidebarThreadGroup.title.ts.All three entry points share the controller: context menu, drag to a new group, header Regenerate.
Sidebar.tsxcarries three marked hook lines.Why
A title request that times out fails after 60 s; its toast then cleared in 5 s.
UAT saw "New group" with no error.
A controlled repro shows the timeout fails typed (
RemoteEnvironmentAuthTimeoutError), not interrupt-only, so the toast branch ran.That the 5 s toast was missed remains a hypothesis.
Budget alignment and the OpenCode latency cause stay open on #1467; hence
Refs.UI Changes
Browser QA ran in the Electron dev app against a real server, on a copy of real data.
CDP
Fetchpaused the title request: held past 60 s for the real timeout, released early for a transport error.1. Failed title stays on screen
2. Retry while the scope hides the group
Scoped away, then scoped back
3. Regenerate over an open failure
Before and after Regenerate
4. Settings unmounts the sidebar
Settings, then the result
5. Dissolve closes the toast
Before and after Dissolve group
Video
Cases 1 and 4, low frame rate:
timeout-toast-retry.mp4
Checklist
Checks
Mutating the in-flight guard or the stale prune fails a test.
Claude Opus 5.5 in Claude Code, inside T3 Code.
Fork trailers
Fork-Domain: thread-ordering
Fork-Tier: bugfix
Fork-Upstreamable: no