sync(upstream): merge upstream/main 48aa875c0 into fork/dev - #372

Merged
patroza merged 11 commits into
fork/devfrom
sync/upstream-48aa875c0
Aug 7, 2026
Merged

sync(upstream): merge upstream/main 48aa875c0 into fork/dev#372
patroza merged 11 commits into
fork/devfrom
sync/upstream-48aa875c0

Conversation

@omegent-app

@omegent-appomegent-appBot commented Aug 7, 2026

Copy link
Copy Markdown

Adopts upstream through 48aa875c0 — the ten commits that landed after #368, headlined by
pingdotgg#5566 (timeline live-follow), pingdotgg#5561 (reconnect loops during server stalls) and
pingdotgg#5558/pingdotgg#5551 (plans fold into chat, Build/Plan toggle removed).

Important

Merge with a merge commit, not squash. Squashing collapses the second parent and discards
upstream's commits as ancestors — the thing that keeps "commits behind upstream" honest.

Upstream commits entering the product

Commit
48aa875c0feat(web): remove Build/Plan toggle from the composer (pingdotgg#5551)
a8cd2ad2efix(web): plans stop hijacking the UI, fold into chat instead (pingdotgg#5558)
4a07c1ca9docs: ship production T3 Connect public config in .env.example (pingdotgg#5573)
cf5c9948cfix(web): keep agent panel rows stable (pingdotgg#5569)
2288d416afix(web): stop the "requests are slow" warning firing on every provider update (pingdotgg#5570)
ddfe45c66test(server): catch client transfer regressions in CI (pingdotgg#5350)
9547cf246fix(server): one disconnecting client no longer blocks every reconnect (pingdotgg#5572)
1c7d059f5fix: scrolling up during a running thread no longer snaps back to the bottom (pingdotgg#5566)
6fa457607fix(server): settle stopped Claude subagents (pingdotgg#5568)
ae7b27de8fix: prevent reconnect loops during server stalls (pingdotgg#5561)

Behavioural decision you should know about

The fork's "keep the open WebSocket lease when a foreground liveness probe fails" is replaced by
upstream's probe model.
Both address the same symptom — reconnect churn while the server is
stalled. The fork swallowed the probe failure; upstream pingdotgg#5561 instead splits the wake reasons
(application-active-probe vs application-active-reconnect), adds tolerance windows, and lets the
first post-probe attempt skip a backoff rung.

Keeping both was not an option: the auto-merge produced exactly that, and the fork's swallow made
upstream's wakeProbeFailed machinery unreachable dead code. I took upstream's model and kept the
fork's additions around it (connection diagnostics log, labelled ping-timeout errors,
followNetworkStatus resume handling). Say the word and I'll restore the lease-keeping behaviour
on top of upstream's model instead.

Resolutions

13 conflicted files. What actually needed judgement:

WhereSituationResolution
supervisor.tsfork's probe swallow welded onto upstream's new wakeProbeFailed path — the swallow made it deadprobe failure propagates; log kept as tapCause (see above)
session.test.tsupstream's patched pinger now tolerates two missed pong windows, so the fork's ping-timeout test fired too early and upstream's new test expected a bare transport closefork's labelled timeout reporting kept; both tests re-timed to the new window
ChatView.tsxfork's steering-queue send branch vs upstream's rebuilt anchoring; two follow-state variables coexisting after auto-merge (maintainTimelineAtEnd + timelineLiveFollowEnabled)queue-chip branch kept, live-edge branch rebased onto upstream's follow state; the fork's superseded variable removed
ThreadFeed.tsxsame collision on mobile: upstream's follow latch vs the fork's isAtEnd, with the fork's stale handlers surviving as duplicatesupstream's latch adopted; the fork's unread-activity dot rebuilt on it rather than dropped
plan surfacesupstream deleted PlanSidebar.tsx and folded plans into chat; the fork carried sidebar auto-open, dismissal and a togglesidebar wiring removed with the surface; the fork's settle-independent follow-up composer gate and findSidebarProposedPlan kept (the latter was silently dropped by the auto-merge while ChatView still called it)
MessagesTimeline.logic.tstwo row-union members merged into one malformed member; resolveOlderHistoryAutoLoad left over from the superseded pagination candidate, referenced only by its own testsunion split; dead helper and its tests removed
Omegent deep linkfork's #message-{id} scroll effect sat inside a block upstream rewrotekept, retargeted at upstream's follow state
grokSegments.test.tsupstream's new ThreadPlanProgressService missing from a fork test's layerlayer provided

Adversarial review

Both reviewers ran over the git show --cc resolution surface with the merged worktree available.

grok-4.5 — no high or medium findings; races/ordering, React effects and test-assertion integrity all reported clean. Four low findings, all fixed:

FindingDisposition
supervisor test kept the fork's keep-lease title on upstream's reconnect body — a later "fix" could reintroduce keep-lease to match the nameFixed. Renamed to quickly replaces a stalled mobile session after a probe timeout, plus a releaseCount === 1 assertion matching the desktop-side test
ThreadFeed: isAtEndRef never read or written after init; userNavigationInProgressRef write-only — leftovers of the retired fork latchFixed. Both removed
ThreadFeed: contentInset still destructured from the scroll event, unused since upstream's latch uses getState()Fixed. Removed from the destructure
SidebarV2: upstream's role="status" sr-only "Regenerating title" absent from both title rowsFixed, though not caused by this merge — the v2 rows are a fork rewrite of upstream's row, so this never came across with the surface. Derived locally from thread.titleRegeneration and restored in both rows

gpt-5.6-sol — two findings, both fixed:

FindingDisposition
MEDfindSidebarProposedPlan lost its only production consumer: it was restored during the merge because ChatView called it, but the plan-sidebar resolution removed that callFixed. Helper and its tests removed; activeProposedPlan uses findLatestProposedPlan directly
LOW — same misnamed supervisor test as aboveFixed as above

Both independently confirmed the intentional keep/drop surface is coherent: probe failures now reach wakeProbeFailed (tapCause, not swallowed), the live-follow rename is consistent through ChatView → MessagesTimeline → tests, steering-queue chips skip the live-edge re-arm, mobile unread only latches while follow is broken, and the transfer-budget test adds the omegent-t3 handshake rather than loosening the gate.

Verification

  • Full recursive typecheck clean across 17 packages.
  • 2,277 tests pass; the only failure is the pre-existing CodexTextGeneration launch-args one,
    which reproduces on unmerged fork/dev.
  • pnpm-lock.yaml regenerated rather than hand-merged.

Co-authored by @patroza

opened by Patrick Roza in chat thread Discord · Discord · T3

gfsaaser24and others added 10 commits August 6, 2026 21:14
Co-authored-by: t3-turbo-simulation <simulation@t3turbo.local>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Theo Browne <me@t3.gg>
… bottom (pingdotgg#5566)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…rovider update (pingdotgg#5570)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…otgg#5573)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…tgg#5558)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Adopts the ten upstream commits after #368: timeline live-follow (pingdotgg#5566),
reconnect-loop handling during server stalls (pingdotgg#5561), plans folded into chat
(pingdotgg#5558/pingdotgg#5551), plus server settle/reconnect fixes and the transfer-budget CI
test (pingdotgg#5350).
The fork's "keep the open WebSocket lease when a foreground liveness probe
fails" is replaced by upstream's probe model. Both target reconnect churn during
server stalls; upstream splits the wake reasons (probe vs reconnect), adds
tolerance windows and a first-attempt ladder skip. Keeping both was incoherent:
the auto-merge left the fork's swallow in front of upstream's wakeProbeFailed
path, making it dead code. The fork's diagnostics log, labelled ping-timeout
errors and followNetworkStatus resume handling are kept around it.
Welds found by typecheck and tests, not by conflict markers:
- ChatView and ThreadFeed each ended up with two follow-state variables, the
fork's superseded one still being written; converged on upstream's.
- findSidebarProposedPlan was dropped from session-logic while ChatView still
called it; restored.
- Two timeline row-union members merged into one malformed member.
- The fork's pre-latch ThreadFeed handlers survived as duplicates alongside
upstream's; removed, with the fork's unread-activity dot rebuilt on the latch.
- resolveOlderHistoryAutoLoad, left over from the superseded pagination
candidate, was referenced only by its own tests; removed with them.
- Upstream's transfer-budget test opened a socket without the fork's omegent-t3
product handshake, so the environment rejected it.
Plan sidebar wiring is removed with the surface upstream deleted; the fork's
settle-independent follow-up composer gate is kept.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@omegent-app
omegent-appBotforce-pushed the sync/upstream-48aa875c0 branch from 7280ad1 to d5ac3b9CompareAugust 7, 2026 08:37
@patroza
patroza merged commit 95aea55 into fork/devAug 7, 2026
4 checks passed
omegent-appBot added a commit that referenced this pull request Aug 7, 2026
Adopts the six upstream commits after #372: per-device provider settings
(pingdotgg#4479), the modular theme library and theme editor (pingdotgg#5226), Done/Woke sidebar
semantics (pingdotgg#5579), the non-pulsing Working label (pingdotgg#5580), mobile T3 Connect
device cleanup (pingdotgg#5563), and a download-page copy fix (pingdotgg#4511).
Upstream's new filePicker/projectSearch/themeEditor shortcuts arrive with an
overlay-mode host for the command palette. The fork rewrote that component, so
the host was ported rather than taken: the palette reducer gains `mode` and
`ToggleMode`, and the two overlays bring their own popup instead of the popup
being lifted out of OpenCommandPaletteDialog. Without that the new default
keybindings would have been dead.
Welds found by typecheck and tests, not by conflict markers:
- SidebarV2 ended up with two per-row VCS status queries: upstream's full-mode
`vcsEnvironment.status` auto-merged in above the fork's budgeted
`listStatus`. Upstream's new isWoke reads prState, so the fork's query and its
pr/prState derivation are hoisted above it and the duplicate dropped. Keeping
the fork's list mode matters: full mode is one poller per worktree.
- ElectronDialog: the fork's pickApplication and upstream's pickFiles are
independent additions that collided at every declaration site.
- The keybindings test fixture kept the fork's list, silently dropping
upstream's two new bindings while its new assertions expected them.
The v1 sidebar body is a fork rewrite; upstream restructured the same region for
its own layout, so both sides were whole-body alternatives and the fork's is
kept.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@patroza@gfsaaser24@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

sync(upstream): merge upstream/main 48aa875c0 into fork/dev - #372

Merged
patroza merged 11 commits into
fork/devfrom
sync/upstream-48aa875c0
Aug 7, 2026
Merged

sync(upstream): merge upstream/main 48aa875c0 into fork/dev#372
patroza merged 11 commits into
fork/devfrom
sync/upstream-48aa875c0

Conversation

@omegent-app

@omegent-appomegent-appBot commented Aug 7, 2026

Copy link
Copy Markdown

Adopts upstream through 48aa875c0 — the ten commits that landed after #368, headlined by
pingdotgg#5566 (timeline live-follow), pingdotgg#5561 (reconnect loops during server stalls) and
pingdotgg#5558/pingdotgg#5551 (plans fold into chat, Build/Plan toggle removed).

Important

Merge with a merge commit, not squash. Squashing collapses the second parent and discards
upstream's commits as ancestors — the thing that keeps "commits behind upstream" honest.

Upstream commits entering the product

Commit
48aa875c0feat(web): remove Build/Plan toggle from the composer (pingdotgg#5551)
a8cd2ad2efix(web): plans stop hijacking the UI, fold into chat instead (pingdotgg#5558)
4a07c1ca9docs: ship production T3 Connect public config in .env.example (pingdotgg#5573)
cf5c9948cfix(web): keep agent panel rows stable (pingdotgg#5569)
2288d416afix(web): stop the "requests are slow" warning firing on every provider update (pingdotgg#5570)
ddfe45c66test(server): catch client transfer regressions in CI (pingdotgg#5350)
9547cf246fix(server): one disconnecting client no longer blocks every reconnect (pingdotgg#5572)
1c7d059f5fix: scrolling up during a running thread no longer snaps back to the bottom (pingdotgg#5566)
6fa457607fix(server): settle stopped Claude subagents (pingdotgg#5568)
ae7b27de8fix: prevent reconnect loops during server stalls (pingdotgg#5561)

Behavioural decision you should know about

The fork's "keep the open WebSocket lease when a foreground liveness probe fails" is replaced by
upstream's probe model.
Both address the same symptom — reconnect churn while the server is
stalled. The fork swallowed the probe failure; upstream pingdotgg#5561 instead splits the wake reasons
(application-active-probe vs application-active-reconnect), adds tolerance windows, and lets the
first post-probe attempt skip a backoff rung.

Keeping both was not an option: the auto-merge produced exactly that, and the fork's swallow made
upstream's wakeProbeFailed machinery unreachable dead code. I took upstream's model and kept the
fork's additions around it (connection diagnostics log, labelled ping-timeout errors,
followNetworkStatus resume handling). Say the word and I'll restore the lease-keeping behaviour
on top of upstream's model instead.

Resolutions

13 conflicted files. What actually needed judgement:

WhereSituationResolution
supervisor.tsfork's probe swallow welded onto upstream's new wakeProbeFailed path — the swallow made it deadprobe failure propagates; log kept as tapCause (see above)
session.test.tsupstream's patched pinger now tolerates two missed pong windows, so the fork's ping-timeout test fired too early and upstream's new test expected a bare transport closefork's labelled timeout reporting kept; both tests re-timed to the new window
ChatView.tsxfork's steering-queue send branch vs upstream's rebuilt anchoring; two follow-state variables coexisting after auto-merge (maintainTimelineAtEnd + timelineLiveFollowEnabled)queue-chip branch kept, live-edge branch rebased onto upstream's follow state; the fork's superseded variable removed
ThreadFeed.tsxsame collision on mobile: upstream's follow latch vs the fork's isAtEnd, with the fork's stale handlers surviving as duplicatesupstream's latch adopted; the fork's unread-activity dot rebuilt on it rather than dropped
plan surfacesupstream deleted PlanSidebar.tsx and folded plans into chat; the fork carried sidebar auto-open, dismissal and a togglesidebar wiring removed with the surface; the fork's settle-independent follow-up composer gate and findSidebarProposedPlan kept (the latter was silently dropped by the auto-merge while ChatView still called it)
MessagesTimeline.logic.tstwo row-union members merged into one malformed member; resolveOlderHistoryAutoLoad left over from the superseded pagination candidate, referenced only by its own testsunion split; dead helper and its tests removed
Omegent deep linkfork's #message-{id} scroll effect sat inside a block upstream rewrotekept, retargeted at upstream's follow state
grokSegments.test.tsupstream's new ThreadPlanProgressService missing from a fork test's layerlayer provided

Adversarial review

Both reviewers ran over the git show --cc resolution surface with the merged worktree available.

grok-4.5 — no high or medium findings; races/ordering, React effects and test-assertion integrity all reported clean. Four low findings, all fixed:

FindingDisposition
supervisor test kept the fork's keep-lease title on upstream's reconnect body — a later "fix" could reintroduce keep-lease to match the nameFixed. Renamed to quickly replaces a stalled mobile session after a probe timeout, plus a releaseCount === 1 assertion matching the desktop-side test
ThreadFeed: isAtEndRef never read or written after init; userNavigationInProgressRef write-only — leftovers of the retired fork latchFixed. Both removed
ThreadFeed: contentInset still destructured from the scroll event, unused since upstream's latch uses getState()Fixed. Removed from the destructure
SidebarV2: upstream's role="status" sr-only "Regenerating title" absent from both title rowsFixed, though not caused by this merge — the v2 rows are a fork rewrite of upstream's row, so this never came across with the surface. Derived locally from thread.titleRegeneration and restored in both rows

gpt-5.6-sol — two findings, both fixed:

FindingDisposition
MEDfindSidebarProposedPlan lost its only production consumer: it was restored during the merge because ChatView called it, but the plan-sidebar resolution removed that callFixed. Helper and its tests removed; activeProposedPlan uses findLatestProposedPlan directly
LOW — same misnamed supervisor test as aboveFixed as above

Both independently confirmed the intentional keep/drop surface is coherent: probe failures now reach wakeProbeFailed (tapCause, not swallowed), the live-follow rename is consistent through ChatView → MessagesTimeline → tests, steering-queue chips skip the live-edge re-arm, mobile unread only latches while follow is broken, and the transfer-budget test adds the omegent-t3 handshake rather than loosening the gate.

Verification

  • Full recursive typecheck clean across 17 packages.
  • 2,277 tests pass; the only failure is the pre-existing CodexTextGeneration launch-args one,
    which reproduces on unmerged fork/dev.
  • pnpm-lock.yaml regenerated rather than hand-merged.

Co-authored by @patroza

opened by Patrick Roza in chat thread Discord · Discord · T3

gfsaaser24and others added 10 commits August 6, 2026 21:14
Co-authored-by: t3-turbo-simulation <simulation@t3turbo.local>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Theo Browne <me@t3.gg>
… bottom (pingdotgg#5566)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…rovider update (pingdotgg#5570)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…otgg#5573)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…tgg#5558)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Adopts the ten upstream commits after #368: timeline live-follow (pingdotgg#5566),
reconnect-loop handling during server stalls (pingdotgg#5561), plans folded into chat
(pingdotgg#5558/pingdotgg#5551), plus server settle/reconnect fixes and the transfer-budget CI
test (pingdotgg#5350).
The fork's "keep the open WebSocket lease when a foreground liveness probe
fails" is replaced by upstream's probe model. Both target reconnect churn during
server stalls; upstream splits the wake reasons (probe vs reconnect), adds
tolerance windows and a first-attempt ladder skip. Keeping both was incoherent:
the auto-merge left the fork's swallow in front of upstream's wakeProbeFailed
path, making it dead code. The fork's diagnostics log, labelled ping-timeout
errors and followNetworkStatus resume handling are kept around it.
Welds found by typecheck and tests, not by conflict markers:
- ChatView and ThreadFeed each ended up with two follow-state variables, the
fork's superseded one still being written; converged on upstream's.
- findSidebarProposedPlan was dropped from session-logic while ChatView still
called it; restored.
- Two timeline row-union members merged into one malformed member.
- The fork's pre-latch ThreadFeed handlers survived as duplicates alongside
upstream's; removed, with the fork's unread-activity dot rebuilt on the latch.
- resolveOlderHistoryAutoLoad, left over from the superseded pagination
candidate, was referenced only by its own tests; removed with them.
- Upstream's transfer-budget test opened a socket without the fork's omegent-t3
product handshake, so the environment rejected it.
Plan sidebar wiring is removed with the surface upstream deleted; the fork's
settle-independent follow-up composer gate is kept.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@omegent-app
omegent-appBotforce-pushed the sync/upstream-48aa875c0 branch from 7280ad1 to d5ac3b9CompareAugust 7, 2026 08:37
@patroza
patroza merged commit 95aea55 into fork/devAug 7, 2026
4 checks passed
omegent-appBot added a commit that referenced this pull request Aug 7, 2026
Adopts the six upstream commits after #372: per-device provider settings
(pingdotgg#4479), the modular theme library and theme editor (pingdotgg#5226), Done/Woke sidebar
semantics (pingdotgg#5579), the non-pulsing Working label (pingdotgg#5580), mobile T3 Connect
device cleanup (pingdotgg#5563), and a download-page copy fix (pingdotgg#4511).
Upstream's new filePicker/projectSearch/themeEditor shortcuts arrive with an
overlay-mode host for the command palette. The fork rewrote that component, so
the host was ported rather than taken: the palette reducer gains `mode` and
`ToggleMode`, and the two overlays bring their own popup instead of the popup
being lifted out of OpenCommandPaletteDialog. Without that the new default
keybindings would have been dead.
Welds found by typecheck and tests, not by conflict markers:
- SidebarV2 ended up with two per-row VCS status queries: upstream's full-mode
`vcsEnvironment.status` auto-merged in above the fork's budgeted
`listStatus`. Upstream's new isWoke reads prState, so the fork's query and its
pr/prState derivation are hoisted above it and the duplicate dropped. Keeping
the fork's list mode matters: full mode is one poller per worktree.
- ElectronDialog: the fork's pickApplication and upstream's pickFiles are
independent additions that collided at every declaration site.
- The keybindings test fixture kept the fork's list, silently dropping
upstream's two new bindings while its new assertions expected them.
The v1 sidebar body is a fork rewrite; upstream restructured the same region for
its own layout, so both sides were whole-body alternatives and the fork's is
kept.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@patroza@gfsaaser24@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

sync(upstream): merge upstream/main 48aa875c0 into fork/dev - #372

Merged
patroza merged 11 commits into
fork/devfrom
sync/upstream-48aa875c0
Aug 7, 2026
Merged

sync(upstream): merge upstream/main 48aa875c0 into fork/dev#372
patroza merged 11 commits into
fork/devfrom
sync/upstream-48aa875c0

Conversation

@omegent-app

@omegent-appomegent-appBot commented Aug 7, 2026

Copy link
Copy Markdown

Adopts upstream through 48aa875c0 — the ten commits that landed after #368, headlined by
pingdotgg#5566 (timeline live-follow), pingdotgg#5561 (reconnect loops during server stalls) and
pingdotgg#5558/pingdotgg#5551 (plans fold into chat, Build/Plan toggle removed).

Important

Merge with a merge commit, not squash. Squashing collapses the second parent and discards
upstream's commits as ancestors — the thing that keeps "commits behind upstream" honest.

Upstream commits entering the product

Commit
48aa875c0feat(web): remove Build/Plan toggle from the composer (pingdotgg#5551)
a8cd2ad2efix(web): plans stop hijacking the UI, fold into chat instead (pingdotgg#5558)
4a07c1ca9docs: ship production T3 Connect public config in .env.example (pingdotgg#5573)
cf5c9948cfix(web): keep agent panel rows stable (pingdotgg#5569)
2288d416afix(web): stop the "requests are slow" warning firing on every provider update (pingdotgg#5570)
ddfe45c66test(server): catch client transfer regressions in CI (pingdotgg#5350)
9547cf246fix(server): one disconnecting client no longer blocks every reconnect (pingdotgg#5572)
1c7d059f5fix: scrolling up during a running thread no longer snaps back to the bottom (pingdotgg#5566)
6fa457607fix(server): settle stopped Claude subagents (pingdotgg#5568)
ae7b27de8fix: prevent reconnect loops during server stalls (pingdotgg#5561)

Behavioural decision you should know about

The fork's "keep the open WebSocket lease when a foreground liveness probe fails" is replaced by
upstream's probe model.
Both address the same symptom — reconnect churn while the server is
stalled. The fork swallowed the probe failure; upstream pingdotgg#5561 instead splits the wake reasons
(application-active-probe vs application-active-reconnect), adds tolerance windows, and lets the
first post-probe attempt skip a backoff rung.

Keeping both was not an option: the auto-merge produced exactly that, and the fork's swallow made
upstream's wakeProbeFailed machinery unreachable dead code. I took upstream's model and kept the
fork's additions around it (connection diagnostics log, labelled ping-timeout errors,
followNetworkStatus resume handling). Say the word and I'll restore the lease-keeping behaviour
on top of upstream's model instead.

Resolutions

13 conflicted files. What actually needed judgement:

WhereSituationResolution
supervisor.tsfork's probe swallow welded onto upstream's new wakeProbeFailed path — the swallow made it deadprobe failure propagates; log kept as tapCause (see above)
session.test.tsupstream's patched pinger now tolerates two missed pong windows, so the fork's ping-timeout test fired too early and upstream's new test expected a bare transport closefork's labelled timeout reporting kept; both tests re-timed to the new window
ChatView.tsxfork's steering-queue send branch vs upstream's rebuilt anchoring; two follow-state variables coexisting after auto-merge (maintainTimelineAtEnd + timelineLiveFollowEnabled)queue-chip branch kept, live-edge branch rebased onto upstream's follow state; the fork's superseded variable removed
ThreadFeed.tsxsame collision on mobile: upstream's follow latch vs the fork's isAtEnd, with the fork's stale handlers surviving as duplicatesupstream's latch adopted; the fork's unread-activity dot rebuilt on it rather than dropped
plan surfacesupstream deleted PlanSidebar.tsx and folded plans into chat; the fork carried sidebar auto-open, dismissal and a togglesidebar wiring removed with the surface; the fork's settle-independent follow-up composer gate and findSidebarProposedPlan kept (the latter was silently dropped by the auto-merge while ChatView still called it)
MessagesTimeline.logic.tstwo row-union members merged into one malformed member; resolveOlderHistoryAutoLoad left over from the superseded pagination candidate, referenced only by its own testsunion split; dead helper and its tests removed
Omegent deep linkfork's #message-{id} scroll effect sat inside a block upstream rewrotekept, retargeted at upstream's follow state
grokSegments.test.tsupstream's new ThreadPlanProgressService missing from a fork test's layerlayer provided

Adversarial review

Both reviewers ran over the git show --cc resolution surface with the merged worktree available.

grok-4.5 — no high or medium findings; races/ordering, React effects and test-assertion integrity all reported clean. Four low findings, all fixed:

FindingDisposition
supervisor test kept the fork's keep-lease title on upstream's reconnect body — a later "fix" could reintroduce keep-lease to match the nameFixed. Renamed to quickly replaces a stalled mobile session after a probe timeout, plus a releaseCount === 1 assertion matching the desktop-side test
ThreadFeed: isAtEndRef never read or written after init; userNavigationInProgressRef write-only — leftovers of the retired fork latchFixed. Both removed
ThreadFeed: contentInset still destructured from the scroll event, unused since upstream's latch uses getState()Fixed. Removed from the destructure
SidebarV2: upstream's role="status" sr-only "Regenerating title" absent from both title rowsFixed, though not caused by this merge — the v2 rows are a fork rewrite of upstream's row, so this never came across with the surface. Derived locally from thread.titleRegeneration and restored in both rows

gpt-5.6-sol — two findings, both fixed:

FindingDisposition
MEDfindSidebarProposedPlan lost its only production consumer: it was restored during the merge because ChatView called it, but the plan-sidebar resolution removed that callFixed. Helper and its tests removed; activeProposedPlan uses findLatestProposedPlan directly
LOW — same misnamed supervisor test as aboveFixed as above

Both independently confirmed the intentional keep/drop surface is coherent: probe failures now reach wakeProbeFailed (tapCause, not swallowed), the live-follow rename is consistent through ChatView → MessagesTimeline → tests, steering-queue chips skip the live-edge re-arm, mobile unread only latches while follow is broken, and the transfer-budget test adds the omegent-t3 handshake rather than loosening the gate.

Verification

  • Full recursive typecheck clean across 17 packages.
  • 2,277 tests pass; the only failure is the pre-existing CodexTextGeneration launch-args one,
    which reproduces on unmerged fork/dev.
  • pnpm-lock.yaml regenerated rather than hand-merged.

Co-authored by @patroza

opened by Patrick Roza in chat thread Discord · Discord · T3

gfsaaser24and others added 10 commits August 6, 2026 21:14
Co-authored-by: t3-turbo-simulation <simulation@t3turbo.local>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Theo Browne <me@t3.gg>
… bottom (pingdotgg#5566)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…rovider update (pingdotgg#5570)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…otgg#5573)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…tgg#5558)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Adopts the ten upstream commits after #368: timeline live-follow (pingdotgg#5566),
reconnect-loop handling during server stalls (pingdotgg#5561), plans folded into chat
(pingdotgg#5558/pingdotgg#5551), plus server settle/reconnect fixes and the transfer-budget CI
test (pingdotgg#5350).
The fork's "keep the open WebSocket lease when a foreground liveness probe
fails" is replaced by upstream's probe model. Both target reconnect churn during
server stalls; upstream splits the wake reasons (probe vs reconnect), adds
tolerance windows and a first-attempt ladder skip. Keeping both was incoherent:
the auto-merge left the fork's swallow in front of upstream's wakeProbeFailed
path, making it dead code. The fork's diagnostics log, labelled ping-timeout
errors and followNetworkStatus resume handling are kept around it.
Welds found by typecheck and tests, not by conflict markers:
- ChatView and ThreadFeed each ended up with two follow-state variables, the
fork's superseded one still being written; converged on upstream's.
- findSidebarProposedPlan was dropped from session-logic while ChatView still
called it; restored.
- Two timeline row-union members merged into one malformed member.
- The fork's pre-latch ThreadFeed handlers survived as duplicates alongside
upstream's; removed, with the fork's unread-activity dot rebuilt on the latch.
- resolveOlderHistoryAutoLoad, left over from the superseded pagination
candidate, was referenced only by its own tests; removed with them.
- Upstream's transfer-budget test opened a socket without the fork's omegent-t3
product handshake, so the environment rejected it.
Plan sidebar wiring is removed with the surface upstream deleted; the fork's
settle-independent follow-up composer gate is kept.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@omegent-app
omegent-appBotforce-pushed the sync/upstream-48aa875c0 branch from 7280ad1 to d5ac3b9CompareAugust 7, 2026 08:37
@patroza
patroza merged commit 95aea55 into fork/devAug 7, 2026
4 checks passed
omegent-appBot added a commit that referenced this pull request Aug 7, 2026
Adopts the six upstream commits after #372: per-device provider settings
(pingdotgg#4479), the modular theme library and theme editor (pingdotgg#5226), Done/Woke sidebar
semantics (pingdotgg#5579), the non-pulsing Working label (pingdotgg#5580), mobile T3 Connect
device cleanup (pingdotgg#5563), and a download-page copy fix (pingdotgg#4511).
Upstream's new filePicker/projectSearch/themeEditor shortcuts arrive with an
overlay-mode host for the command palette. The fork rewrote that component, so
the host was ported rather than taken: the palette reducer gains `mode` and
`ToggleMode`, and the two overlays bring their own popup instead of the popup
being lifted out of OpenCommandPaletteDialog. Without that the new default
keybindings would have been dead.
Welds found by typecheck and tests, not by conflict markers:
- SidebarV2 ended up with two per-row VCS status queries: upstream's full-mode
`vcsEnvironment.status` auto-merged in above the fork's budgeted
`listStatus`. Upstream's new isWoke reads prState, so the fork's query and its
pr/prState derivation are hoisted above it and the duplicate dropped. Keeping
the fork's list mode matters: full mode is one poller per worktree.
- ElectronDialog: the fork's pickApplication and upstream's pickFiles are
independent additions that collided at every declaration site.
- The keybindings test fixture kept the fork's list, silently dropping
upstream's two new bindings while its new assertions expected them.
The v1 sidebar body is a fork rewrite; upstream restructured the same region for
its own layout, so both sides were whole-body alternatives and the fork's is
kept.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@patroza@gfsaaser24@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

sync(upstream): merge upstream/main 48aa875c0 into fork/dev - #372

Merged
patroza merged 11 commits into
fork/devfrom
sync/upstream-48aa875c0
Aug 7, 2026
Merged

sync(upstream): merge upstream/main 48aa875c0 into fork/dev#372
patroza merged 11 commits into
fork/devfrom
sync/upstream-48aa875c0

Conversation

@omegent-app

@omegent-appomegent-appBot commented Aug 7, 2026

Copy link
Copy Markdown

Adopts upstream through 48aa875c0 — the ten commits that landed after #368, headlined by
pingdotgg#5566 (timeline live-follow), pingdotgg#5561 (reconnect loops during server stalls) and
pingdotgg#5558/pingdotgg#5551 (plans fold into chat, Build/Plan toggle removed).

Important

Merge with a merge commit, not squash. Squashing collapses the second parent and discards
upstream's commits as ancestors — the thing that keeps "commits behind upstream" honest.

Upstream commits entering the product

Commit
48aa875c0feat(web): remove Build/Plan toggle from the composer (pingdotgg#5551)
a8cd2ad2efix(web): plans stop hijacking the UI, fold into chat instead (pingdotgg#5558)
4a07c1ca9docs: ship production T3 Connect public config in .env.example (pingdotgg#5573)
cf5c9948cfix(web): keep agent panel rows stable (pingdotgg#5569)
2288d416afix(web): stop the "requests are slow" warning firing on every provider update (pingdotgg#5570)
ddfe45c66test(server): catch client transfer regressions in CI (pingdotgg#5350)
9547cf246fix(server): one disconnecting client no longer blocks every reconnect (pingdotgg#5572)
1c7d059f5fix: scrolling up during a running thread no longer snaps back to the bottom (pingdotgg#5566)
6fa457607fix(server): settle stopped Claude subagents (pingdotgg#5568)
ae7b27de8fix: prevent reconnect loops during server stalls (pingdotgg#5561)

Behavioural decision you should know about

The fork's "keep the open WebSocket lease when a foreground liveness probe fails" is replaced by
upstream's probe model.
Both address the same symptom — reconnect churn while the server is
stalled. The fork swallowed the probe failure; upstream pingdotgg#5561 instead splits the wake reasons
(application-active-probe vs application-active-reconnect), adds tolerance windows, and lets the
first post-probe attempt skip a backoff rung.

Keeping both was not an option: the auto-merge produced exactly that, and the fork's swallow made
upstream's wakeProbeFailed machinery unreachable dead code. I took upstream's model and kept the
fork's additions around it (connection diagnostics log, labelled ping-timeout errors,
followNetworkStatus resume handling). Say the word and I'll restore the lease-keeping behaviour
on top of upstream's model instead.

Resolutions

13 conflicted files. What actually needed judgement:

WhereSituationResolution
supervisor.tsfork's probe swallow welded onto upstream's new wakeProbeFailed path — the swallow made it deadprobe failure propagates; log kept as tapCause (see above)
session.test.tsupstream's patched pinger now tolerates two missed pong windows, so the fork's ping-timeout test fired too early and upstream's new test expected a bare transport closefork's labelled timeout reporting kept; both tests re-timed to the new window
ChatView.tsxfork's steering-queue send branch vs upstream's rebuilt anchoring; two follow-state variables coexisting after auto-merge (maintainTimelineAtEnd + timelineLiveFollowEnabled)queue-chip branch kept, live-edge branch rebased onto upstream's follow state; the fork's superseded variable removed
ThreadFeed.tsxsame collision on mobile: upstream's follow latch vs the fork's isAtEnd, with the fork's stale handlers surviving as duplicatesupstream's latch adopted; the fork's unread-activity dot rebuilt on it rather than dropped
plan surfacesupstream deleted PlanSidebar.tsx and folded plans into chat; the fork carried sidebar auto-open, dismissal and a togglesidebar wiring removed with the surface; the fork's settle-independent follow-up composer gate and findSidebarProposedPlan kept (the latter was silently dropped by the auto-merge while ChatView still called it)
MessagesTimeline.logic.tstwo row-union members merged into one malformed member; resolveOlderHistoryAutoLoad left over from the superseded pagination candidate, referenced only by its own testsunion split; dead helper and its tests removed
Omegent deep linkfork's #message-{id} scroll effect sat inside a block upstream rewrotekept, retargeted at upstream's follow state
grokSegments.test.tsupstream's new ThreadPlanProgressService missing from a fork test's layerlayer provided

Adversarial review

Both reviewers ran over the git show --cc resolution surface with the merged worktree available.

grok-4.5 — no high or medium findings; races/ordering, React effects and test-assertion integrity all reported clean. Four low findings, all fixed:

FindingDisposition
supervisor test kept the fork's keep-lease title on upstream's reconnect body — a later "fix" could reintroduce keep-lease to match the nameFixed. Renamed to quickly replaces a stalled mobile session after a probe timeout, plus a releaseCount === 1 assertion matching the desktop-side test
ThreadFeed: isAtEndRef never read or written after init; userNavigationInProgressRef write-only — leftovers of the retired fork latchFixed. Both removed
ThreadFeed: contentInset still destructured from the scroll event, unused since upstream's latch uses getState()Fixed. Removed from the destructure
SidebarV2: upstream's role="status" sr-only "Regenerating title" absent from both title rowsFixed, though not caused by this merge — the v2 rows are a fork rewrite of upstream's row, so this never came across with the surface. Derived locally from thread.titleRegeneration and restored in both rows

gpt-5.6-sol — two findings, both fixed:

FindingDisposition
MEDfindSidebarProposedPlan lost its only production consumer: it was restored during the merge because ChatView called it, but the plan-sidebar resolution removed that callFixed. Helper and its tests removed; activeProposedPlan uses findLatestProposedPlan directly
LOW — same misnamed supervisor test as aboveFixed as above

Both independently confirmed the intentional keep/drop surface is coherent: probe failures now reach wakeProbeFailed (tapCause, not swallowed), the live-follow rename is consistent through ChatView → MessagesTimeline → tests, steering-queue chips skip the live-edge re-arm, mobile unread only latches while follow is broken, and the transfer-budget test adds the omegent-t3 handshake rather than loosening the gate.

Verification

  • Full recursive typecheck clean across 17 packages.
  • 2,277 tests pass; the only failure is the pre-existing CodexTextGeneration launch-args one,
    which reproduces on unmerged fork/dev.
  • pnpm-lock.yaml regenerated rather than hand-merged.

Co-authored by @patroza

opened by Patrick Roza in chat thread Discord · Discord · T3

gfsaaser24and others added 10 commits August 6, 2026 21:14
Co-authored-by: t3-turbo-simulation <simulation@t3turbo.local>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Theo Browne <me@t3.gg>
… bottom (pingdotgg#5566)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…rovider update (pingdotgg#5570)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…otgg#5573)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…tgg#5558)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Adopts the ten upstream commits after #368: timeline live-follow (pingdotgg#5566),
reconnect-loop handling during server stalls (pingdotgg#5561), plans folded into chat
(pingdotgg#5558/pingdotgg#5551), plus server settle/reconnect fixes and the transfer-budget CI
test (pingdotgg#5350).
The fork's "keep the open WebSocket lease when a foreground liveness probe
fails" is replaced by upstream's probe model. Both target reconnect churn during
server stalls; upstream splits the wake reasons (probe vs reconnect), adds
tolerance windows and a first-attempt ladder skip. Keeping both was incoherent:
the auto-merge left the fork's swallow in front of upstream's wakeProbeFailed
path, making it dead code. The fork's diagnostics log, labelled ping-timeout
errors and followNetworkStatus resume handling are kept around it.
Welds found by typecheck and tests, not by conflict markers:
- ChatView and ThreadFeed each ended up with two follow-state variables, the
fork's superseded one still being written; converged on upstream's.
- findSidebarProposedPlan was dropped from session-logic while ChatView still
called it; restored.
- Two timeline row-union members merged into one malformed member.
- The fork's pre-latch ThreadFeed handlers survived as duplicates alongside
upstream's; removed, with the fork's unread-activity dot rebuilt on the latch.
- resolveOlderHistoryAutoLoad, left over from the superseded pagination
candidate, was referenced only by its own tests; removed with them.
- Upstream's transfer-budget test opened a socket without the fork's omegent-t3
product handshake, so the environment rejected it.
Plan sidebar wiring is removed with the surface upstream deleted; the fork's
settle-independent follow-up composer gate is kept.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@omegent-app
omegent-appBotforce-pushed the sync/upstream-48aa875c0 branch from 7280ad1 to d5ac3b9CompareAugust 7, 2026 08:37
@patroza
patroza merged commit 95aea55 into fork/devAug 7, 2026
4 checks passed
omegent-appBot added a commit that referenced this pull request Aug 7, 2026
Adopts the six upstream commits after #372: per-device provider settings
(pingdotgg#4479), the modular theme library and theme editor (pingdotgg#5226), Done/Woke sidebar
semantics (pingdotgg#5579), the non-pulsing Working label (pingdotgg#5580), mobile T3 Connect
device cleanup (pingdotgg#5563), and a download-page copy fix (pingdotgg#4511).
Upstream's new filePicker/projectSearch/themeEditor shortcuts arrive with an
overlay-mode host for the command palette. The fork rewrote that component, so
the host was ported rather than taken: the palette reducer gains `mode` and
`ToggleMode`, and the two overlays bring their own popup instead of the popup
being lifted out of OpenCommandPaletteDialog. Without that the new default
keybindings would have been dead.
Welds found by typecheck and tests, not by conflict markers:
- SidebarV2 ended up with two per-row VCS status queries: upstream's full-mode
`vcsEnvironment.status` auto-merged in above the fork's budgeted
`listStatus`. Upstream's new isWoke reads prState, so the fork's query and its
pr/prState derivation are hoisted above it and the duplicate dropped. Keeping
the fork's list mode matters: full mode is one poller per worktree.
- ElectronDialog: the fork's pickApplication and upstream's pickFiles are
independent additions that collided at every declaration site.
- The keybindings test fixture kept the fork's list, silently dropping
upstream's two new bindings while its new assertions expected them.
The v1 sidebar body is a fork rewrite; upstream restructured the same region for
its own layout, so both sides were whole-body alternatives and the fork's is
kept.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@patroza@gfsaaser24@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

sync(upstream): merge upstream/main 48aa875c0 into fork/dev - #372

Merged
patroza merged 11 commits into
fork/devfrom
sync/upstream-48aa875c0
Aug 7, 2026
Merged

sync(upstream): merge upstream/main 48aa875c0 into fork/dev#372
patroza merged 11 commits into
fork/devfrom
sync/upstream-48aa875c0

Conversation

@omegent-app

@omegent-appomegent-appBot commented Aug 7, 2026

Copy link
Copy Markdown

Adopts upstream through 48aa875c0 — the ten commits that landed after #368, headlined by
pingdotgg#5566 (timeline live-follow), pingdotgg#5561 (reconnect loops during server stalls) and
pingdotgg#5558/pingdotgg#5551 (plans fold into chat, Build/Plan toggle removed).

Important

Merge with a merge commit, not squash. Squashing collapses the second parent and discards
upstream's commits as ancestors — the thing that keeps "commits behind upstream" honest.

Upstream commits entering the product

Commit
48aa875c0feat(web): remove Build/Plan toggle from the composer (pingdotgg#5551)
a8cd2ad2efix(web): plans stop hijacking the UI, fold into chat instead (pingdotgg#5558)
4a07c1ca9docs: ship production T3 Connect public config in .env.example (pingdotgg#5573)
cf5c9948cfix(web): keep agent panel rows stable (pingdotgg#5569)
2288d416afix(web): stop the "requests are slow" warning firing on every provider update (pingdotgg#5570)
ddfe45c66test(server): catch client transfer regressions in CI (pingdotgg#5350)
9547cf246fix(server): one disconnecting client no longer blocks every reconnect (pingdotgg#5572)
1c7d059f5fix: scrolling up during a running thread no longer snaps back to the bottom (pingdotgg#5566)
6fa457607fix(server): settle stopped Claude subagents (pingdotgg#5568)
ae7b27de8fix: prevent reconnect loops during server stalls (pingdotgg#5561)

Behavioural decision you should know about

The fork's "keep the open WebSocket lease when a foreground liveness probe fails" is replaced by
upstream's probe model.
Both address the same symptom — reconnect churn while the server is
stalled. The fork swallowed the probe failure; upstream pingdotgg#5561 instead splits the wake reasons
(application-active-probe vs application-active-reconnect), adds tolerance windows, and lets the
first post-probe attempt skip a backoff rung.

Keeping both was not an option: the auto-merge produced exactly that, and the fork's swallow made
upstream's wakeProbeFailed machinery unreachable dead code. I took upstream's model and kept the
fork's additions around it (connection diagnostics log, labelled ping-timeout errors,
followNetworkStatus resume handling). Say the word and I'll restore the lease-keeping behaviour
on top of upstream's model instead.

Resolutions

13 conflicted files. What actually needed judgement:

WhereSituationResolution
supervisor.tsfork's probe swallow welded onto upstream's new wakeProbeFailed path — the swallow made it deadprobe failure propagates; log kept as tapCause (see above)
session.test.tsupstream's patched pinger now tolerates two missed pong windows, so the fork's ping-timeout test fired too early and upstream's new test expected a bare transport closefork's labelled timeout reporting kept; both tests re-timed to the new window
ChatView.tsxfork's steering-queue send branch vs upstream's rebuilt anchoring; two follow-state variables coexisting after auto-merge (maintainTimelineAtEnd + timelineLiveFollowEnabled)queue-chip branch kept, live-edge branch rebased onto upstream's follow state; the fork's superseded variable removed
ThreadFeed.tsxsame collision on mobile: upstream's follow latch vs the fork's isAtEnd, with the fork's stale handlers surviving as duplicatesupstream's latch adopted; the fork's unread-activity dot rebuilt on it rather than dropped
plan surfacesupstream deleted PlanSidebar.tsx and folded plans into chat; the fork carried sidebar auto-open, dismissal and a togglesidebar wiring removed with the surface; the fork's settle-independent follow-up composer gate and findSidebarProposedPlan kept (the latter was silently dropped by the auto-merge while ChatView still called it)
MessagesTimeline.logic.tstwo row-union members merged into one malformed member; resolveOlderHistoryAutoLoad left over from the superseded pagination candidate, referenced only by its own testsunion split; dead helper and its tests removed
Omegent deep linkfork's #message-{id} scroll effect sat inside a block upstream rewrotekept, retargeted at upstream's follow state
grokSegments.test.tsupstream's new ThreadPlanProgressService missing from a fork test's layerlayer provided

Adversarial review

Both reviewers ran over the git show --cc resolution surface with the merged worktree available.

grok-4.5 — no high or medium findings; races/ordering, React effects and test-assertion integrity all reported clean. Four low findings, all fixed:

FindingDisposition
supervisor test kept the fork's keep-lease title on upstream's reconnect body — a later "fix" could reintroduce keep-lease to match the nameFixed. Renamed to quickly replaces a stalled mobile session after a probe timeout, plus a releaseCount === 1 assertion matching the desktop-side test
ThreadFeed: isAtEndRef never read or written after init; userNavigationInProgressRef write-only — leftovers of the retired fork latchFixed. Both removed
ThreadFeed: contentInset still destructured from the scroll event, unused since upstream's latch uses getState()Fixed. Removed from the destructure
SidebarV2: upstream's role="status" sr-only "Regenerating title" absent from both title rowsFixed, though not caused by this merge — the v2 rows are a fork rewrite of upstream's row, so this never came across with the surface. Derived locally from thread.titleRegeneration and restored in both rows

gpt-5.6-sol — two findings, both fixed:

FindingDisposition
MEDfindSidebarProposedPlan lost its only production consumer: it was restored during the merge because ChatView called it, but the plan-sidebar resolution removed that callFixed. Helper and its tests removed; activeProposedPlan uses findLatestProposedPlan directly
LOW — same misnamed supervisor test as aboveFixed as above

Both independently confirmed the intentional keep/drop surface is coherent: probe failures now reach wakeProbeFailed (tapCause, not swallowed), the live-follow rename is consistent through ChatView → MessagesTimeline → tests, steering-queue chips skip the live-edge re-arm, mobile unread only latches while follow is broken, and the transfer-budget test adds the omegent-t3 handshake rather than loosening the gate.

Verification

  • Full recursive typecheck clean across 17 packages.
  • 2,277 tests pass; the only failure is the pre-existing CodexTextGeneration launch-args one,
    which reproduces on unmerged fork/dev.
  • pnpm-lock.yaml regenerated rather than hand-merged.

Co-authored by @patroza

opened by Patrick Roza in chat thread Discord · Discord · T3

gfsaaser24and others added 10 commits August 6, 2026 21:14
Co-authored-by: t3-turbo-simulation <simulation@t3turbo.local>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Theo Browne <me@t3.gg>
… bottom (pingdotgg#5566)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…rovider update (pingdotgg#5570)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…otgg#5573)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…tgg#5558)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Adopts the ten upstream commits after #368: timeline live-follow (pingdotgg#5566),
reconnect-loop handling during server stalls (pingdotgg#5561), plans folded into chat
(pingdotgg#5558/pingdotgg#5551), plus server settle/reconnect fixes and the transfer-budget CI
test (pingdotgg#5350).
The fork's "keep the open WebSocket lease when a foreground liveness probe
fails" is replaced by upstream's probe model. Both target reconnect churn during
server stalls; upstream splits the wake reasons (probe vs reconnect), adds
tolerance windows and a first-attempt ladder skip. Keeping both was incoherent:
the auto-merge left the fork's swallow in front of upstream's wakeProbeFailed
path, making it dead code. The fork's diagnostics log, labelled ping-timeout
errors and followNetworkStatus resume handling are kept around it.
Welds found by typecheck and tests, not by conflict markers:
- ChatView and ThreadFeed each ended up with two follow-state variables, the
fork's superseded one still being written; converged on upstream's.
- findSidebarProposedPlan was dropped from session-logic while ChatView still
called it; restored.
- Two timeline row-union members merged into one malformed member.
- The fork's pre-latch ThreadFeed handlers survived as duplicates alongside
upstream's; removed, with the fork's unread-activity dot rebuilt on the latch.
- resolveOlderHistoryAutoLoad, left over from the superseded pagination
candidate, was referenced only by its own tests; removed with them.
- Upstream's transfer-budget test opened a socket without the fork's omegent-t3
product handshake, so the environment rejected it.
Plan sidebar wiring is removed with the surface upstream deleted; the fork's
settle-independent follow-up composer gate is kept.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@omegent-app
omegent-appBotforce-pushed the sync/upstream-48aa875c0 branch from 7280ad1 to d5ac3b9CompareAugust 7, 2026 08:37
@patroza
patroza merged commit 95aea55 into fork/devAug 7, 2026
4 checks passed
omegent-appBot added a commit that referenced this pull request Aug 7, 2026
Adopts the six upstream commits after #372: per-device provider settings
(pingdotgg#4479), the modular theme library and theme editor (pingdotgg#5226), Done/Woke sidebar
semantics (pingdotgg#5579), the non-pulsing Working label (pingdotgg#5580), mobile T3 Connect
device cleanup (pingdotgg#5563), and a download-page copy fix (pingdotgg#4511).
Upstream's new filePicker/projectSearch/themeEditor shortcuts arrive with an
overlay-mode host for the command palette. The fork rewrote that component, so
the host was ported rather than taken: the palette reducer gains `mode` and
`ToggleMode`, and the two overlays bring their own popup instead of the popup
being lifted out of OpenCommandPaletteDialog. Without that the new default
keybindings would have been dead.
Welds found by typecheck and tests, not by conflict markers:
- SidebarV2 ended up with two per-row VCS status queries: upstream's full-mode
`vcsEnvironment.status` auto-merged in above the fork's budgeted
`listStatus`. Upstream's new isWoke reads prState, so the fork's query and its
pr/prState derivation are hoisted above it and the duplicate dropped. Keeping
the fork's list mode matters: full mode is one poller per worktree.
- ElectronDialog: the fork's pickApplication and upstream's pickFiles are
independent additions that collided at every declaration site.
- The keybindings test fixture kept the fork's list, silently dropping
upstream's two new bindings while its new assertions expected them.
The v1 sidebar body is a fork rewrite; upstream restructured the same region for
its own layout, so both sides were whole-body alternatives and the fork's is
kept.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@patroza@gfsaaser24@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

sync(upstream): merge upstream/main 48aa875c0 into fork/dev - #372

Merged
patroza merged 11 commits into
fork/devfrom
sync/upstream-48aa875c0
Aug 7, 2026
Merged

sync(upstream): merge upstream/main 48aa875c0 into fork/dev#372
patroza merged 11 commits into
fork/devfrom
sync/upstream-48aa875c0

Conversation

@omegent-app

@omegent-appomegent-appBot commented Aug 7, 2026

Copy link
Copy Markdown

Adopts upstream through 48aa875c0 — the ten commits that landed after #368, headlined by
pingdotgg#5566 (timeline live-follow), pingdotgg#5561 (reconnect loops during server stalls) and
pingdotgg#5558/pingdotgg#5551 (plans fold into chat, Build/Plan toggle removed).

Important

Merge with a merge commit, not squash. Squashing collapses the second parent and discards
upstream's commits as ancestors — the thing that keeps "commits behind upstream" honest.

Upstream commits entering the product

Commit
48aa875c0feat(web): remove Build/Plan toggle from the composer (pingdotgg#5551)
a8cd2ad2efix(web): plans stop hijacking the UI, fold into chat instead (pingdotgg#5558)
4a07c1ca9docs: ship production T3 Connect public config in .env.example (pingdotgg#5573)
cf5c9948cfix(web): keep agent panel rows stable (pingdotgg#5569)
2288d416afix(web): stop the "requests are slow" warning firing on every provider update (pingdotgg#5570)
ddfe45c66test(server): catch client transfer regressions in CI (pingdotgg#5350)
9547cf246fix(server): one disconnecting client no longer blocks every reconnect (pingdotgg#5572)
1c7d059f5fix: scrolling up during a running thread no longer snaps back to the bottom (pingdotgg#5566)
6fa457607fix(server): settle stopped Claude subagents (pingdotgg#5568)
ae7b27de8fix: prevent reconnect loops during server stalls (pingdotgg#5561)

Behavioural decision you should know about

The fork's "keep the open WebSocket lease when a foreground liveness probe fails" is replaced by
upstream's probe model.
Both address the same symptom — reconnect churn while the server is
stalled. The fork swallowed the probe failure; upstream pingdotgg#5561 instead splits the wake reasons
(application-active-probe vs application-active-reconnect), adds tolerance windows, and lets the
first post-probe attempt skip a backoff rung.

Keeping both was not an option: the auto-merge produced exactly that, and the fork's swallow made
upstream's wakeProbeFailed machinery unreachable dead code. I took upstream's model and kept the
fork's additions around it (connection diagnostics log, labelled ping-timeout errors,
followNetworkStatus resume handling). Say the word and I'll restore the lease-keeping behaviour
on top of upstream's model instead.

Resolutions

13 conflicted files. What actually needed judgement:

WhereSituationResolution
supervisor.tsfork's probe swallow welded onto upstream's new wakeProbeFailed path — the swallow made it deadprobe failure propagates; log kept as tapCause (see above)
session.test.tsupstream's patched pinger now tolerates two missed pong windows, so the fork's ping-timeout test fired too early and upstream's new test expected a bare transport closefork's labelled timeout reporting kept; both tests re-timed to the new window
ChatView.tsxfork's steering-queue send branch vs upstream's rebuilt anchoring; two follow-state variables coexisting after auto-merge (maintainTimelineAtEnd + timelineLiveFollowEnabled)queue-chip branch kept, live-edge branch rebased onto upstream's follow state; the fork's superseded variable removed
ThreadFeed.tsxsame collision on mobile: upstream's follow latch vs the fork's isAtEnd, with the fork's stale handlers surviving as duplicatesupstream's latch adopted; the fork's unread-activity dot rebuilt on it rather than dropped
plan surfacesupstream deleted PlanSidebar.tsx and folded plans into chat; the fork carried sidebar auto-open, dismissal and a togglesidebar wiring removed with the surface; the fork's settle-independent follow-up composer gate and findSidebarProposedPlan kept (the latter was silently dropped by the auto-merge while ChatView still called it)
MessagesTimeline.logic.tstwo row-union members merged into one malformed member; resolveOlderHistoryAutoLoad left over from the superseded pagination candidate, referenced only by its own testsunion split; dead helper and its tests removed
Omegent deep linkfork's #message-{id} scroll effect sat inside a block upstream rewrotekept, retargeted at upstream's follow state
grokSegments.test.tsupstream's new ThreadPlanProgressService missing from a fork test's layerlayer provided

Adversarial review

Both reviewers ran over the git show --cc resolution surface with the merged worktree available.

grok-4.5 — no high or medium findings; races/ordering, React effects and test-assertion integrity all reported clean. Four low findings, all fixed:

FindingDisposition
supervisor test kept the fork's keep-lease title on upstream's reconnect body — a later "fix" could reintroduce keep-lease to match the nameFixed. Renamed to quickly replaces a stalled mobile session after a probe timeout, plus a releaseCount === 1 assertion matching the desktop-side test
ThreadFeed: isAtEndRef never read or written after init; userNavigationInProgressRef write-only — leftovers of the retired fork latchFixed. Both removed
ThreadFeed: contentInset still destructured from the scroll event, unused since upstream's latch uses getState()Fixed. Removed from the destructure
SidebarV2: upstream's role="status" sr-only "Regenerating title" absent from both title rowsFixed, though not caused by this merge — the v2 rows are a fork rewrite of upstream's row, so this never came across with the surface. Derived locally from thread.titleRegeneration and restored in both rows

gpt-5.6-sol — two findings, both fixed:

FindingDisposition
MEDfindSidebarProposedPlan lost its only production consumer: it was restored during the merge because ChatView called it, but the plan-sidebar resolution removed that callFixed. Helper and its tests removed; activeProposedPlan uses findLatestProposedPlan directly
LOW — same misnamed supervisor test as aboveFixed as above

Both independently confirmed the intentional keep/drop surface is coherent: probe failures now reach wakeProbeFailed (tapCause, not swallowed), the live-follow rename is consistent through ChatView → MessagesTimeline → tests, steering-queue chips skip the live-edge re-arm, mobile unread only latches while follow is broken, and the transfer-budget test adds the omegent-t3 handshake rather than loosening the gate.

Verification

  • Full recursive typecheck clean across 17 packages.
  • 2,277 tests pass; the only failure is the pre-existing CodexTextGeneration launch-args one,
    which reproduces on unmerged fork/dev.
  • pnpm-lock.yaml regenerated rather than hand-merged.

Co-authored by @patroza

opened by Patrick Roza in chat thread Discord · Discord · T3

gfsaaser24and others added 10 commits August 6, 2026 21:14
Co-authored-by: t3-turbo-simulation <simulation@t3turbo.local>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Theo Browne <me@t3.gg>
… bottom (pingdotgg#5566)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…rovider update (pingdotgg#5570)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…otgg#5573)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…tgg#5558)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Adopts the ten upstream commits after #368: timeline live-follow (pingdotgg#5566),
reconnect-loop handling during server stalls (pingdotgg#5561), plans folded into chat
(pingdotgg#5558/pingdotgg#5551), plus server settle/reconnect fixes and the transfer-budget CI
test (pingdotgg#5350).
The fork's "keep the open WebSocket lease when a foreground liveness probe
fails" is replaced by upstream's probe model. Both target reconnect churn during
server stalls; upstream splits the wake reasons (probe vs reconnect), adds
tolerance windows and a first-attempt ladder skip. Keeping both was incoherent:
the auto-merge left the fork's swallow in front of upstream's wakeProbeFailed
path, making it dead code. The fork's diagnostics log, labelled ping-timeout
errors and followNetworkStatus resume handling are kept around it.
Welds found by typecheck and tests, not by conflict markers:
- ChatView and ThreadFeed each ended up with two follow-state variables, the
fork's superseded one still being written; converged on upstream's.
- findSidebarProposedPlan was dropped from session-logic while ChatView still
called it; restored.
- Two timeline row-union members merged into one malformed member.
- The fork's pre-latch ThreadFeed handlers survived as duplicates alongside
upstream's; removed, with the fork's unread-activity dot rebuilt on the latch.
- resolveOlderHistoryAutoLoad, left over from the superseded pagination
candidate, was referenced only by its own tests; removed with them.
- Upstream's transfer-budget test opened a socket without the fork's omegent-t3
product handshake, so the environment rejected it.
Plan sidebar wiring is removed with the surface upstream deleted; the fork's
settle-independent follow-up composer gate is kept.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@omegent-app
omegent-appBotforce-pushed the sync/upstream-48aa875c0 branch from 7280ad1 to d5ac3b9CompareAugust 7, 2026 08:37
@patroza
patroza merged commit 95aea55 into fork/devAug 7, 2026
4 checks passed
omegent-appBot added a commit that referenced this pull request Aug 7, 2026
Adopts the six upstream commits after #372: per-device provider settings
(pingdotgg#4479), the modular theme library and theme editor (pingdotgg#5226), Done/Woke sidebar
semantics (pingdotgg#5579), the non-pulsing Working label (pingdotgg#5580), mobile T3 Connect
device cleanup (pingdotgg#5563), and a download-page copy fix (pingdotgg#4511).
Upstream's new filePicker/projectSearch/themeEditor shortcuts arrive with an
overlay-mode host for the command palette. The fork rewrote that component, so
the host was ported rather than taken: the palette reducer gains `mode` and
`ToggleMode`, and the two overlays bring their own popup instead of the popup
being lifted out of OpenCommandPaletteDialog. Without that the new default
keybindings would have been dead.
Welds found by typecheck and tests, not by conflict markers:
- SidebarV2 ended up with two per-row VCS status queries: upstream's full-mode
`vcsEnvironment.status` auto-merged in above the fork's budgeted
`listStatus`. Upstream's new isWoke reads prState, so the fork's query and its
pr/prState derivation are hoisted above it and the duplicate dropped. Keeping
the fork's list mode matters: full mode is one poller per worktree.
- ElectronDialog: the fork's pickApplication and upstream's pickFiles are
independent additions that collided at every declaration site.
- The keybindings test fixture kept the fork's list, silently dropping
upstream's two new bindings while its new assertions expected them.
The v1 sidebar body is a fork rewrite; upstream restructured the same region for
its own layout, so both sides were whole-body alternatives and the fork's is
kept.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@patroza@gfsaaser24@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

sync(upstream): merge upstream/main 48aa875c0 into fork/dev - #372

Merged
patroza merged 11 commits into
fork/devfrom
sync/upstream-48aa875c0
Aug 7, 2026
Merged

sync(upstream): merge upstream/main 48aa875c0 into fork/dev#372
patroza merged 11 commits into
fork/devfrom
sync/upstream-48aa875c0

Conversation

@omegent-app

@omegent-appomegent-appBot commented Aug 7, 2026

Copy link
Copy Markdown

Adopts upstream through 48aa875c0 — the ten commits that landed after #368, headlined by
pingdotgg#5566 (timeline live-follow), pingdotgg#5561 (reconnect loops during server stalls) and
pingdotgg#5558/pingdotgg#5551 (plans fold into chat, Build/Plan toggle removed).

Important

Merge with a merge commit, not squash. Squashing collapses the second parent and discards
upstream's commits as ancestors — the thing that keeps "commits behind upstream" honest.

Upstream commits entering the product

Commit
48aa875c0feat(web): remove Build/Plan toggle from the composer (pingdotgg#5551)
a8cd2ad2efix(web): plans stop hijacking the UI, fold into chat instead (pingdotgg#5558)
4a07c1ca9docs: ship production T3 Connect public config in .env.example (pingdotgg#5573)
cf5c9948cfix(web): keep agent panel rows stable (pingdotgg#5569)
2288d416afix(web): stop the "requests are slow" warning firing on every provider update (pingdotgg#5570)
ddfe45c66test(server): catch client transfer regressions in CI (pingdotgg#5350)
9547cf246fix(server): one disconnecting client no longer blocks every reconnect (pingdotgg#5572)
1c7d059f5fix: scrolling up during a running thread no longer snaps back to the bottom (pingdotgg#5566)
6fa457607fix(server): settle stopped Claude subagents (pingdotgg#5568)
ae7b27de8fix: prevent reconnect loops during server stalls (pingdotgg#5561)

Behavioural decision you should know about

The fork's "keep the open WebSocket lease when a foreground liveness probe fails" is replaced by
upstream's probe model.
Both address the same symptom — reconnect churn while the server is
stalled. The fork swallowed the probe failure; upstream pingdotgg#5561 instead splits the wake reasons
(application-active-probe vs application-active-reconnect), adds tolerance windows, and lets the
first post-probe attempt skip a backoff rung.

Keeping both was not an option: the auto-merge produced exactly that, and the fork's swallow made
upstream's wakeProbeFailed machinery unreachable dead code. I took upstream's model and kept the
fork's additions around it (connection diagnostics log, labelled ping-timeout errors,
followNetworkStatus resume handling). Say the word and I'll restore the lease-keeping behaviour
on top of upstream's model instead.

Resolutions

13 conflicted files. What actually needed judgement:

WhereSituationResolution
supervisor.tsfork's probe swallow welded onto upstream's new wakeProbeFailed path — the swallow made it deadprobe failure propagates; log kept as tapCause (see above)
session.test.tsupstream's patched pinger now tolerates two missed pong windows, so the fork's ping-timeout test fired too early and upstream's new test expected a bare transport closefork's labelled timeout reporting kept; both tests re-timed to the new window
ChatView.tsxfork's steering-queue send branch vs upstream's rebuilt anchoring; two follow-state variables coexisting after auto-merge (maintainTimelineAtEnd + timelineLiveFollowEnabled)queue-chip branch kept, live-edge branch rebased onto upstream's follow state; the fork's superseded variable removed
ThreadFeed.tsxsame collision on mobile: upstream's follow latch vs the fork's isAtEnd, with the fork's stale handlers surviving as duplicatesupstream's latch adopted; the fork's unread-activity dot rebuilt on it rather than dropped
plan surfacesupstream deleted PlanSidebar.tsx and folded plans into chat; the fork carried sidebar auto-open, dismissal and a togglesidebar wiring removed with the surface; the fork's settle-independent follow-up composer gate and findSidebarProposedPlan kept (the latter was silently dropped by the auto-merge while ChatView still called it)
MessagesTimeline.logic.tstwo row-union members merged into one malformed member; resolveOlderHistoryAutoLoad left over from the superseded pagination candidate, referenced only by its own testsunion split; dead helper and its tests removed
Omegent deep linkfork's #message-{id} scroll effect sat inside a block upstream rewrotekept, retargeted at upstream's follow state
grokSegments.test.tsupstream's new ThreadPlanProgressService missing from a fork test's layerlayer provided

Adversarial review

Both reviewers ran over the git show --cc resolution surface with the merged worktree available.

grok-4.5 — no high or medium findings; races/ordering, React effects and test-assertion integrity all reported clean. Four low findings, all fixed:

FindingDisposition
supervisor test kept the fork's keep-lease title on upstream's reconnect body — a later "fix" could reintroduce keep-lease to match the nameFixed. Renamed to quickly replaces a stalled mobile session after a probe timeout, plus a releaseCount === 1 assertion matching the desktop-side test
ThreadFeed: isAtEndRef never read or written after init; userNavigationInProgressRef write-only — leftovers of the retired fork latchFixed. Both removed
ThreadFeed: contentInset still destructured from the scroll event, unused since upstream's latch uses getState()Fixed. Removed from the destructure
SidebarV2: upstream's role="status" sr-only "Regenerating title" absent from both title rowsFixed, though not caused by this merge — the v2 rows are a fork rewrite of upstream's row, so this never came across with the surface. Derived locally from thread.titleRegeneration and restored in both rows

gpt-5.6-sol — two findings, both fixed:

FindingDisposition
MEDfindSidebarProposedPlan lost its only production consumer: it was restored during the merge because ChatView called it, but the plan-sidebar resolution removed that callFixed. Helper and its tests removed; activeProposedPlan uses findLatestProposedPlan directly
LOW — same misnamed supervisor test as aboveFixed as above

Both independently confirmed the intentional keep/drop surface is coherent: probe failures now reach wakeProbeFailed (tapCause, not swallowed), the live-follow rename is consistent through ChatView → MessagesTimeline → tests, steering-queue chips skip the live-edge re-arm, mobile unread only latches while follow is broken, and the transfer-budget test adds the omegent-t3 handshake rather than loosening the gate.

Verification

  • Full recursive typecheck clean across 17 packages.
  • 2,277 tests pass; the only failure is the pre-existing CodexTextGeneration launch-args one,
    which reproduces on unmerged fork/dev.
  • pnpm-lock.yaml regenerated rather than hand-merged.

Co-authored by @patroza

opened by Patrick Roza in chat thread Discord · Discord · T3

gfsaaser24and others added 10 commits August 6, 2026 21:14
Co-authored-by: t3-turbo-simulation <simulation@t3turbo.local>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Theo Browne <me@t3.gg>
… bottom (pingdotgg#5566)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…rovider update (pingdotgg#5570)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…otgg#5573)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…tgg#5558)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Adopts the ten upstream commits after #368: timeline live-follow (pingdotgg#5566),
reconnect-loop handling during server stalls (pingdotgg#5561), plans folded into chat
(pingdotgg#5558/pingdotgg#5551), plus server settle/reconnect fixes and the transfer-budget CI
test (pingdotgg#5350).
The fork's "keep the open WebSocket lease when a foreground liveness probe
fails" is replaced by upstream's probe model. Both target reconnect churn during
server stalls; upstream splits the wake reasons (probe vs reconnect), adds
tolerance windows and a first-attempt ladder skip. Keeping both was incoherent:
the auto-merge left the fork's swallow in front of upstream's wakeProbeFailed
path, making it dead code. The fork's diagnostics log, labelled ping-timeout
errors and followNetworkStatus resume handling are kept around it.
Welds found by typecheck and tests, not by conflict markers:
- ChatView and ThreadFeed each ended up with two follow-state variables, the
fork's superseded one still being written; converged on upstream's.
- findSidebarProposedPlan was dropped from session-logic while ChatView still
called it; restored.
- Two timeline row-union members merged into one malformed member.
- The fork's pre-latch ThreadFeed handlers survived as duplicates alongside
upstream's; removed, with the fork's unread-activity dot rebuilt on the latch.
- resolveOlderHistoryAutoLoad, left over from the superseded pagination
candidate, was referenced only by its own tests; removed with them.
- Upstream's transfer-budget test opened a socket without the fork's omegent-t3
product handshake, so the environment rejected it.
Plan sidebar wiring is removed with the surface upstream deleted; the fork's
settle-independent follow-up composer gate is kept.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@omegent-app
omegent-appBotforce-pushed the sync/upstream-48aa875c0 branch from 7280ad1 to d5ac3b9CompareAugust 7, 2026 08:37
@patroza
patroza merged commit 95aea55 into fork/devAug 7, 2026
4 checks passed
omegent-appBot added a commit that referenced this pull request Aug 7, 2026
Adopts the six upstream commits after #372: per-device provider settings
(pingdotgg#4479), the modular theme library and theme editor (pingdotgg#5226), Done/Woke sidebar
semantics (pingdotgg#5579), the non-pulsing Working label (pingdotgg#5580), mobile T3 Connect
device cleanup (pingdotgg#5563), and a download-page copy fix (pingdotgg#4511).
Upstream's new filePicker/projectSearch/themeEditor shortcuts arrive with an
overlay-mode host for the command palette. The fork rewrote that component, so
the host was ported rather than taken: the palette reducer gains `mode` and
`ToggleMode`, and the two overlays bring their own popup instead of the popup
being lifted out of OpenCommandPaletteDialog. Without that the new default
keybindings would have been dead.
Welds found by typecheck and tests, not by conflict markers:
- SidebarV2 ended up with two per-row VCS status queries: upstream's full-mode
`vcsEnvironment.status` auto-merged in above the fork's budgeted
`listStatus`. Upstream's new isWoke reads prState, so the fork's query and its
pr/prState derivation are hoisted above it and the duplicate dropped. Keeping
the fork's list mode matters: full mode is one poller per worktree.
- ElectronDialog: the fork's pickApplication and upstream's pickFiles are
independent additions that collided at every declaration site.
- The keybindings test fixture kept the fork's list, silently dropping
upstream's two new bindings while its new assertions expected them.
The v1 sidebar body is a fork rewrite; upstream restructured the same region for
its own layout, so both sides were whole-body alternatives and the fork's is
kept.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@patroza@gfsaaser24@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

sync(upstream): merge upstream/main 48aa875c0 into fork/dev - #372

Merged
patroza merged 11 commits into
fork/devfrom
sync/upstream-48aa875c0
Aug 7, 2026
Merged

sync(upstream): merge upstream/main 48aa875c0 into fork/dev#372
patroza merged 11 commits into
fork/devfrom
sync/upstream-48aa875c0

Conversation

@omegent-app

@omegent-appomegent-appBot commented Aug 7, 2026

Copy link
Copy Markdown

Adopts upstream through 48aa875c0 — the ten commits that landed after #368, headlined by
pingdotgg#5566 (timeline live-follow), pingdotgg#5561 (reconnect loops during server stalls) and
pingdotgg#5558/pingdotgg#5551 (plans fold into chat, Build/Plan toggle removed).

Important

Merge with a merge commit, not squash. Squashing collapses the second parent and discards
upstream's commits as ancestors — the thing that keeps "commits behind upstream" honest.

Upstream commits entering the product

Commit
48aa875c0feat(web): remove Build/Plan toggle from the composer (pingdotgg#5551)
a8cd2ad2efix(web): plans stop hijacking the UI, fold into chat instead (pingdotgg#5558)
4a07c1ca9docs: ship production T3 Connect public config in .env.example (pingdotgg#5573)
cf5c9948cfix(web): keep agent panel rows stable (pingdotgg#5569)
2288d416afix(web): stop the "requests are slow" warning firing on every provider update (pingdotgg#5570)
ddfe45c66test(server): catch client transfer regressions in CI (pingdotgg#5350)
9547cf246fix(server): one disconnecting client no longer blocks every reconnect (pingdotgg#5572)
1c7d059f5fix: scrolling up during a running thread no longer snaps back to the bottom (pingdotgg#5566)
6fa457607fix(server): settle stopped Claude subagents (pingdotgg#5568)
ae7b27de8fix: prevent reconnect loops during server stalls (pingdotgg#5561)

Behavioural decision you should know about

The fork's "keep the open WebSocket lease when a foreground liveness probe fails" is replaced by
upstream's probe model.
Both address the same symptom — reconnect churn while the server is
stalled. The fork swallowed the probe failure; upstream pingdotgg#5561 instead splits the wake reasons
(application-active-probe vs application-active-reconnect), adds tolerance windows, and lets the
first post-probe attempt skip a backoff rung.

Keeping both was not an option: the auto-merge produced exactly that, and the fork's swallow made
upstream's wakeProbeFailed machinery unreachable dead code. I took upstream's model and kept the
fork's additions around it (connection diagnostics log, labelled ping-timeout errors,
followNetworkStatus resume handling). Say the word and I'll restore the lease-keeping behaviour
on top of upstream's model instead.

Resolutions

13 conflicted files. What actually needed judgement:

WhereSituationResolution
supervisor.tsfork's probe swallow welded onto upstream's new wakeProbeFailed path — the swallow made it deadprobe failure propagates; log kept as tapCause (see above)
session.test.tsupstream's patched pinger now tolerates two missed pong windows, so the fork's ping-timeout test fired too early and upstream's new test expected a bare transport closefork's labelled timeout reporting kept; both tests re-timed to the new window
ChatView.tsxfork's steering-queue send branch vs upstream's rebuilt anchoring; two follow-state variables coexisting after auto-merge (maintainTimelineAtEnd + timelineLiveFollowEnabled)queue-chip branch kept, live-edge branch rebased onto upstream's follow state; the fork's superseded variable removed
ThreadFeed.tsxsame collision on mobile: upstream's follow latch vs the fork's isAtEnd, with the fork's stale handlers surviving as duplicatesupstream's latch adopted; the fork's unread-activity dot rebuilt on it rather than dropped
plan surfacesupstream deleted PlanSidebar.tsx and folded plans into chat; the fork carried sidebar auto-open, dismissal and a togglesidebar wiring removed with the surface; the fork's settle-independent follow-up composer gate and findSidebarProposedPlan kept (the latter was silently dropped by the auto-merge while ChatView still called it)
MessagesTimeline.logic.tstwo row-union members merged into one malformed member; resolveOlderHistoryAutoLoad left over from the superseded pagination candidate, referenced only by its own testsunion split; dead helper and its tests removed
Omegent deep linkfork's #message-{id} scroll effect sat inside a block upstream rewrotekept, retargeted at upstream's follow state
grokSegments.test.tsupstream's new ThreadPlanProgressService missing from a fork test's layerlayer provided

Adversarial review

Both reviewers ran over the git show --cc resolution surface with the merged worktree available.

grok-4.5 — no high or medium findings; races/ordering, React effects and test-assertion integrity all reported clean. Four low findings, all fixed:

FindingDisposition
supervisor test kept the fork's keep-lease title on upstream's reconnect body — a later "fix" could reintroduce keep-lease to match the nameFixed. Renamed to quickly replaces a stalled mobile session after a probe timeout, plus a releaseCount === 1 assertion matching the desktop-side test
ThreadFeed: isAtEndRef never read or written after init; userNavigationInProgressRef write-only — leftovers of the retired fork latchFixed. Both removed
ThreadFeed: contentInset still destructured from the scroll event, unused since upstream's latch uses getState()Fixed. Removed from the destructure
SidebarV2: upstream's role="status" sr-only "Regenerating title" absent from both title rowsFixed, though not caused by this merge — the v2 rows are a fork rewrite of upstream's row, so this never came across with the surface. Derived locally from thread.titleRegeneration and restored in both rows

gpt-5.6-sol — two findings, both fixed:

FindingDisposition
MEDfindSidebarProposedPlan lost its only production consumer: it was restored during the merge because ChatView called it, but the plan-sidebar resolution removed that callFixed. Helper and its tests removed; activeProposedPlan uses findLatestProposedPlan directly
LOW — same misnamed supervisor test as aboveFixed as above

Both independently confirmed the intentional keep/drop surface is coherent: probe failures now reach wakeProbeFailed (tapCause, not swallowed), the live-follow rename is consistent through ChatView → MessagesTimeline → tests, steering-queue chips skip the live-edge re-arm, mobile unread only latches while follow is broken, and the transfer-budget test adds the omegent-t3 handshake rather than loosening the gate.

Verification

  • Full recursive typecheck clean across 17 packages.
  • 2,277 tests pass; the only failure is the pre-existing CodexTextGeneration launch-args one,
    which reproduces on unmerged fork/dev.
  • pnpm-lock.yaml regenerated rather than hand-merged.

Co-authored by @patroza

opened by Patrick Roza in chat thread Discord · Discord · T3

gfsaaser24and others added 10 commits August 6, 2026 21:14
Co-authored-by: t3-turbo-simulation <simulation@t3turbo.local>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Theo Browne <me@t3.gg>
… bottom (pingdotgg#5566)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…rovider update (pingdotgg#5570)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…otgg#5573)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…tgg#5558)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Adopts the ten upstream commits after #368: timeline live-follow (pingdotgg#5566),
reconnect-loop handling during server stalls (pingdotgg#5561), plans folded into chat
(pingdotgg#5558/pingdotgg#5551), plus server settle/reconnect fixes and the transfer-budget CI
test (pingdotgg#5350).
The fork's "keep the open WebSocket lease when a foreground liveness probe
fails" is replaced by upstream's probe model. Both target reconnect churn during
server stalls; upstream splits the wake reasons (probe vs reconnect), adds
tolerance windows and a first-attempt ladder skip. Keeping both was incoherent:
the auto-merge left the fork's swallow in front of upstream's wakeProbeFailed
path, making it dead code. The fork's diagnostics log, labelled ping-timeout
errors and followNetworkStatus resume handling are kept around it.
Welds found by typecheck and tests, not by conflict markers:
- ChatView and ThreadFeed each ended up with two follow-state variables, the
fork's superseded one still being written; converged on upstream's.
- findSidebarProposedPlan was dropped from session-logic while ChatView still
called it; restored.
- Two timeline row-union members merged into one malformed member.
- The fork's pre-latch ThreadFeed handlers survived as duplicates alongside
upstream's; removed, with the fork's unread-activity dot rebuilt on the latch.
- resolveOlderHistoryAutoLoad, left over from the superseded pagination
candidate, was referenced only by its own tests; removed with them.
- Upstream's transfer-budget test opened a socket without the fork's omegent-t3
product handshake, so the environment rejected it.
Plan sidebar wiring is removed with the surface upstream deleted; the fork's
settle-independent follow-up composer gate is kept.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@omegent-app
omegent-appBotforce-pushed the sync/upstream-48aa875c0 branch from 7280ad1 to d5ac3b9CompareAugust 7, 2026 08:37
@patroza
patroza merged commit 95aea55 into fork/devAug 7, 2026
4 checks passed
omegent-appBot added a commit that referenced this pull request Aug 7, 2026
Adopts the six upstream commits after #372: per-device provider settings
(pingdotgg#4479), the modular theme library and theme editor (pingdotgg#5226), Done/Woke sidebar
semantics (pingdotgg#5579), the non-pulsing Working label (pingdotgg#5580), mobile T3 Connect
device cleanup (pingdotgg#5563), and a download-page copy fix (pingdotgg#4511).
Upstream's new filePicker/projectSearch/themeEditor shortcuts arrive with an
overlay-mode host for the command palette. The fork rewrote that component, so
the host was ported rather than taken: the palette reducer gains `mode` and
`ToggleMode`, and the two overlays bring their own popup instead of the popup
being lifted out of OpenCommandPaletteDialog. Without that the new default
keybindings would have been dead.
Welds found by typecheck and tests, not by conflict markers:
- SidebarV2 ended up with two per-row VCS status queries: upstream's full-mode
`vcsEnvironment.status` auto-merged in above the fork's budgeted
`listStatus`. Upstream's new isWoke reads prState, so the fork's query and its
pr/prState derivation are hoisted above it and the duplicate dropped. Keeping
the fork's list mode matters: full mode is one poller per worktree.
- ElectronDialog: the fork's pickApplication and upstream's pickFiles are
independent additions that collided at every declaration site.
- The keybindings test fixture kept the fork's list, silently dropping
upstream's two new bindings while its new assertions expected them.
The v1 sidebar body is a fork rewrite; upstream restructured the same region for
its own layout, so both sides were whole-body alternatives and the fork's is
kept.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@patroza@gfsaaser24@t3dotgg