merge: sync upstream through ba9c9ae81 (19 commits) - #383

Merged
patroza merged 21 commits into
fork/devfrom
sync/upstream-ba9c9ae81
Aug 9, 2026
Merged

merge: sync upstream through ba9c9ae81 (19 commits)#383
patroza merged 21 commits into
fork/devfrom
sync/upstream-ba9c9ae81

Conversation

@omegent-app

Copy link
Copy Markdown

Adopts upstream through ba9c9ae81 — the 19 commits that landed after 48aa875c0, headlined by
pingdotgg#5768 (project settings become a real settings page), pingdotgg#5766 (worktree or current checkout,
per project)
, pingdotgg#5777 (unsent drafts in the sidebar) and pingdotgg#5774 (settle stops monitors and dev
servers)
.

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
ba9c9ae81fix(server): one greedy agent process no longer takes down the whole server (pingdotgg#5788)
076e9048dfeat(web): project icons can be chosen manually (pingdotgg#5775)
05eb05118feat(web): keep unsent drafts one click away in the sidebar (pingdotgg#5777)
ddaa6afeffeat(server): vp run migrate-dev-db seeds worktree dev dbs with real data (pingdotgg#5773)
6f69b4407fix(web): sidebar rows show the branch again, not a truncated plan step (pingdotgg#5776)
6dbffa022feat: pick worktree or current checkout per project (pingdotgg#5766)
5bb8c0366fix(server): settle no longer leaves monitors and dev servers running (pingdotgg#5774)
886195ec1fix(web): usage totals no longer jump while devices report in (pingdotgg#5772)
288d8e345feat(web): overhaul project settings into a real settings page (pingdotgg#5768)
5208bdeb0fix(web): pinned reorder no longer reshuffles while writes land (pingdotgg#5767)
a6c9b41f9feat(server): agents can now open the images you paste into chat (pingdotgg#5757)
70c423a5efix(web): usage page loses the cost quality panel, gains a back button (pingdotgg#5756)
89c320df0fix(server): stop Codex threads with queued follow-ups (pingdotgg#5762)
e70cdb478fix(server): stop Claude resume handshakes from completing turns that never ran (pingdotgg#5710)
be01b287bfix(web): add missing cursor-pointer styling to dropdowns and buttons (pingdotgg#5716)
c2f8cb7cafeat(web): show how many subagents are running at a glance (pingdotgg#5745)
89ee692bffix(web): persist diff view mode (pingdotgg#5731)
7b2cf4374 · 49964e38cchore: vouch saphid / gfsaaser24 (the fork's .github/VOUCHED.td deletion stands)

Resolutions

15 conflicted files. What actually needed judgement:

WhereSituationResolution
ws.tsupstream pingdotgg#5774 stops the provider session when a thread parks; the fork's identity claim gate and stampOrchestrationCommandSource sit on the same dispatch, and the fork owns thread.unarchive worktree restorewoven: claim gate → source stamp → pre-stop read → dispatch → parking stop. Parking covers archive and settle; settle is gated onlyIfSettled so a re-engaged thread is not killed
ProjectScriptsControl.tsxupstream pingdotgg#5768 extracted the whole editor into projectScriptEditor.tsx; the fork had added two lifecycle hooks and a menu-label helper to the inline dialogupstream's extraction adopted; the fork's runOnWorktreeRemove / runOnPrMerged rebuilt inside the extracted dialog (type, empty input, hydration, submit, two switches) and projectScriptMenuLabel restored on the menu row
AssetAccess.tsfork's canonical-path + preview-type checks vs upstream's content-revisioned favicon filenames and 30-minute token bucketingboth — the auto-merge silently dropped upstream's revision block and bucketing; restored beside the fork's checks (5 upstream tests were failing on it)
Sidebar.tsxupstream added a drafts block and settled-tail paging to the row builder the fork rewroteunioned; the fork's appendRecencyRows grouping kept under upstream's draft-then-pinned ordering, and the duplicated SETTLED_TAIL_* consts collapsed onto the fork's Sidebar.logic exports
projector.tsupstream's new defaultThreadEnvMode and faviconPath land on a read model the fork moved to HashMapboth fields rebuilt on the fork's updateProject helper
useHandleNewThread.tsupstream extracted pickExplicitWorkspaceOptions and made the default-mode resolution asyncfork's reuseBaseBranch folded into the helper and into the reset gate
ClaudeAdapter.tsupstream pingdotgg#5757 grants the attachments dir; the fork passes a resolved cwd and a session environmentboth, with the grant naming the resolved cwd (see below)
decider.projectThreadEnvMode.test.tsupstream's new test indexes readModel.projects[0] — an array the fork replaced with a HashMapadapted via a local projectFromModel accessor rather than weakening the assertion
migration ledgersupstream added migrations 39/40, so five fork ledger tests asserted a stale tipfixed-size tail windows slid (not grown), keeping the upstream/fork ledger-separation assertions intact
Codex collab fixtureupstream's new queued-stop test drives a second sendTurn, which in the fork goes through turn/steer — a method the mock peer did not speakpeer taught turn/steer (+ a rejectSteer switch and a turn-start sidecar). Upstream's test sets rejectSteer so it still exercises the turn/start path its fix is about; a second fork test covers the accepted-steer path and asserts no second provider turn opens

Adversarial review

Both reviewers ran over the git show --cc resolution surface with the merged worktree available.
Between them they found four real welds and one nit. All are fixed in 885b287f2.

grok-4.5 — 2 HIGH, 2 MEDIUM, 2 LOW:

FindingDisposition
HIGH — mobile ProjectFavicon kept the fork's older loaded-URL set, orphaning upstream's projectFaviconCache module (request identity, memory-disk cache policy, recycling key). Its tests stayed green while nothing imported it — passing for the wrong reasonFixed. Upstream's component is a strict superset now that it carries faviconPath, so it is adopted wholesale
HIGH — upstream's new settings page enforces single-owner for runOnWorktreeCreate only; the fork has three lifecycle hooks. Two scripts could both claim runOnWorktreeRemove, and only the first would ever runFixed. Both write paths now use the fork's clearConflictingLifecycleFlags, matching the chat header
MEDIUM — empty-draft reset lost reuseBaseBranch: false, so a stale reuse flag survived a reset that clears branch, worktree, env mode and origin policyFixed (found independently by gpt-5.6-sol)
MEDIUMClaudeAdapter granted the raw input.cwd while the query runs in the resolved cwd, so the tool allowlist and the process cwd could disagreeFixed. The grant names the resolved cwd
LOW — the script editor kept a delete confirm open across a request swap, naming the previous scriptFixed
LOW — migration ledger tests only bumped tip expectationsNot a defect; verified the slid windows still assert ledger separation

gpt-5.6-sol — 1 HIGH, 1 MEDIUM:

FindingDisposition
HIGH — mobile can submit on a provisional workspace mode: buildPendingTask reads workspaceSelection?.mode ?? workspaceMode with no settle gate, so submitting before t3.json loads freezes local over a project that requires worktreeInherited from upstream, not fixed here. The line is byte-identical to HEAD^2 (pingdotgg#5766); the fork's resolution kept upstream's gate exactly where upstream put it. Worth a follow-up PR against the behaviour itself rather than a divergence smuggled into a sync
MEDIUMreuseBaseBranch: false dropped from the empty-draft resetFixed as above

Both independently confirmed the intentional keep/drop surface is coherent: ws.ts keeps the fork's
claim gate reachable while upstream's parking stop runs, the favicon path hint stays advisory
(server-side projection is authoritative), the extracted script editor carries all three fork
lifecycle hooks through hydration/import/submit, and no assertion was renamed or relaxed into
passing for an unrelated reason.

Verification

  • Recursive typecheck clean across all 17 packages.
  • 2,345 tests pass; the only failure is the pre-existing CodexTextGeneration launch-args one,
    which reproduces on unmerged fork/dev (this merge touches nothing under textGeneration/).
  • forkSurfaceExistence (the anti-stack-drop net) green at 17/17.
  • pnpm-lock.yaml regenerated rather than hand-merged.

Co-authored by @patroza

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

Leonel Rivasand others added 21 commits August 8, 2026 17:02
…#5745)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
… never ran (pingdotgg#5710)
Co-authored-by: t3-turbo-simulation <simulation@t3turbo.local>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…otgg#5768)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…tgg#5772)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…ep (pingdotgg#5776)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…data (pingdotgg#5773)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…g#5777)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…server (pingdotgg#5788)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Adopts the 19 upstream commits that landed after 48aa875, headlined by the
project settings overhaul (pingdotgg#5768), per-project worktree/checkout selection
(pingdotgg#5766), sidebar drafts (pingdotgg#5777), manual project icons (pingdotgg#5775) and settle no
longer leaving monitors and dev servers running (pingdotgg#5774).
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
- mobile ProjectFavicon kept the fork's older loaded-URL set and orphaned
upstream's projectFaviconCache module (request identity, disk cache,
recycling key). Upstream's component is a strict superset now that it
carries faviconPath, so it is adopted wholesale.
- upstream's new project settings page enforced single-owner only for
runOnWorktreeCreate; the fork has three lifecycle hooks. It now uses the
fork's clearConflictingLifecycleFlags, matching the chat header path.
- the empty-draft workspace reset lost the fork's reuseBaseBranch: false, so
a stale reuse flag survived a reset that clears everything else.
- ClaudeAdapter granted the raw input.cwd while the query runs in the
resolved cwd; the grant now names the same path.
- the script editor kept a delete confirm open across a request swap.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@patroza
patroza merged commit 0b23962 into fork/devAug 9, 2026
4 checks passed
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.

4 participants

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

merge: sync upstream through ba9c9ae81 (19 commits) - #383

Merged
patroza merged 21 commits into
fork/devfrom
sync/upstream-ba9c9ae81
Aug 9, 2026
Merged

merge: sync upstream through ba9c9ae81 (19 commits)#383
patroza merged 21 commits into
fork/devfrom
sync/upstream-ba9c9ae81

Conversation

@omegent-app

Copy link
Copy Markdown

Adopts upstream through ba9c9ae81 — the 19 commits that landed after 48aa875c0, headlined by
pingdotgg#5768 (project settings become a real settings page), pingdotgg#5766 (worktree or current checkout,
per project)
, pingdotgg#5777 (unsent drafts in the sidebar) and pingdotgg#5774 (settle stops monitors and dev
servers)
.

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
ba9c9ae81fix(server): one greedy agent process no longer takes down the whole server (pingdotgg#5788)
076e9048dfeat(web): project icons can be chosen manually (pingdotgg#5775)
05eb05118feat(web): keep unsent drafts one click away in the sidebar (pingdotgg#5777)
ddaa6afeffeat(server): vp run migrate-dev-db seeds worktree dev dbs with real data (pingdotgg#5773)
6f69b4407fix(web): sidebar rows show the branch again, not a truncated plan step (pingdotgg#5776)
6dbffa022feat: pick worktree or current checkout per project (pingdotgg#5766)
5bb8c0366fix(server): settle no longer leaves monitors and dev servers running (pingdotgg#5774)
886195ec1fix(web): usage totals no longer jump while devices report in (pingdotgg#5772)
288d8e345feat(web): overhaul project settings into a real settings page (pingdotgg#5768)
5208bdeb0fix(web): pinned reorder no longer reshuffles while writes land (pingdotgg#5767)
a6c9b41f9feat(server): agents can now open the images you paste into chat (pingdotgg#5757)
70c423a5efix(web): usage page loses the cost quality panel, gains a back button (pingdotgg#5756)
89c320df0fix(server): stop Codex threads with queued follow-ups (pingdotgg#5762)
e70cdb478fix(server): stop Claude resume handshakes from completing turns that never ran (pingdotgg#5710)
be01b287bfix(web): add missing cursor-pointer styling to dropdowns and buttons (pingdotgg#5716)
c2f8cb7cafeat(web): show how many subagents are running at a glance (pingdotgg#5745)
89ee692bffix(web): persist diff view mode (pingdotgg#5731)
7b2cf4374 · 49964e38cchore: vouch saphid / gfsaaser24 (the fork's .github/VOUCHED.td deletion stands)

Resolutions

15 conflicted files. What actually needed judgement:

WhereSituationResolution
ws.tsupstream pingdotgg#5774 stops the provider session when a thread parks; the fork's identity claim gate and stampOrchestrationCommandSource sit on the same dispatch, and the fork owns thread.unarchive worktree restorewoven: claim gate → source stamp → pre-stop read → dispatch → parking stop. Parking covers archive and settle; settle is gated onlyIfSettled so a re-engaged thread is not killed
ProjectScriptsControl.tsxupstream pingdotgg#5768 extracted the whole editor into projectScriptEditor.tsx; the fork had added two lifecycle hooks and a menu-label helper to the inline dialogupstream's extraction adopted; the fork's runOnWorktreeRemove / runOnPrMerged rebuilt inside the extracted dialog (type, empty input, hydration, submit, two switches) and projectScriptMenuLabel restored on the menu row
AssetAccess.tsfork's canonical-path + preview-type checks vs upstream's content-revisioned favicon filenames and 30-minute token bucketingboth — the auto-merge silently dropped upstream's revision block and bucketing; restored beside the fork's checks (5 upstream tests were failing on it)
Sidebar.tsxupstream added a drafts block and settled-tail paging to the row builder the fork rewroteunioned; the fork's appendRecencyRows grouping kept under upstream's draft-then-pinned ordering, and the duplicated SETTLED_TAIL_* consts collapsed onto the fork's Sidebar.logic exports
projector.tsupstream's new defaultThreadEnvMode and faviconPath land on a read model the fork moved to HashMapboth fields rebuilt on the fork's updateProject helper
useHandleNewThread.tsupstream extracted pickExplicitWorkspaceOptions and made the default-mode resolution asyncfork's reuseBaseBranch folded into the helper and into the reset gate
ClaudeAdapter.tsupstream pingdotgg#5757 grants the attachments dir; the fork passes a resolved cwd and a session environmentboth, with the grant naming the resolved cwd (see below)
decider.projectThreadEnvMode.test.tsupstream's new test indexes readModel.projects[0] — an array the fork replaced with a HashMapadapted via a local projectFromModel accessor rather than weakening the assertion
migration ledgersupstream added migrations 39/40, so five fork ledger tests asserted a stale tipfixed-size tail windows slid (not grown), keeping the upstream/fork ledger-separation assertions intact
Codex collab fixtureupstream's new queued-stop test drives a second sendTurn, which in the fork goes through turn/steer — a method the mock peer did not speakpeer taught turn/steer (+ a rejectSteer switch and a turn-start sidecar). Upstream's test sets rejectSteer so it still exercises the turn/start path its fix is about; a second fork test covers the accepted-steer path and asserts no second provider turn opens

Adversarial review

Both reviewers ran over the git show --cc resolution surface with the merged worktree available.
Between them they found four real welds and one nit. All are fixed in 885b287f2.

grok-4.5 — 2 HIGH, 2 MEDIUM, 2 LOW:

FindingDisposition
HIGH — mobile ProjectFavicon kept the fork's older loaded-URL set, orphaning upstream's projectFaviconCache module (request identity, memory-disk cache policy, recycling key). Its tests stayed green while nothing imported it — passing for the wrong reasonFixed. Upstream's component is a strict superset now that it carries faviconPath, so it is adopted wholesale
HIGH — upstream's new settings page enforces single-owner for runOnWorktreeCreate only; the fork has three lifecycle hooks. Two scripts could both claim runOnWorktreeRemove, and only the first would ever runFixed. Both write paths now use the fork's clearConflictingLifecycleFlags, matching the chat header
MEDIUM — empty-draft reset lost reuseBaseBranch: false, so a stale reuse flag survived a reset that clears branch, worktree, env mode and origin policyFixed (found independently by gpt-5.6-sol)
MEDIUMClaudeAdapter granted the raw input.cwd while the query runs in the resolved cwd, so the tool allowlist and the process cwd could disagreeFixed. The grant names the resolved cwd
LOW — the script editor kept a delete confirm open across a request swap, naming the previous scriptFixed
LOW — migration ledger tests only bumped tip expectationsNot a defect; verified the slid windows still assert ledger separation

gpt-5.6-sol — 1 HIGH, 1 MEDIUM:

FindingDisposition
HIGH — mobile can submit on a provisional workspace mode: buildPendingTask reads workspaceSelection?.mode ?? workspaceMode with no settle gate, so submitting before t3.json loads freezes local over a project that requires worktreeInherited from upstream, not fixed here. The line is byte-identical to HEAD^2 (pingdotgg#5766); the fork's resolution kept upstream's gate exactly where upstream put it. Worth a follow-up PR against the behaviour itself rather than a divergence smuggled into a sync
MEDIUMreuseBaseBranch: false dropped from the empty-draft resetFixed as above

Both independently confirmed the intentional keep/drop surface is coherent: ws.ts keeps the fork's
claim gate reachable while upstream's parking stop runs, the favicon path hint stays advisory
(server-side projection is authoritative), the extracted script editor carries all three fork
lifecycle hooks through hydration/import/submit, and no assertion was renamed or relaxed into
passing for an unrelated reason.

Verification

  • Recursive typecheck clean across all 17 packages.
  • 2,345 tests pass; the only failure is the pre-existing CodexTextGeneration launch-args one,
    which reproduces on unmerged fork/dev (this merge touches nothing under textGeneration/).
  • forkSurfaceExistence (the anti-stack-drop net) green at 17/17.
  • pnpm-lock.yaml regenerated rather than hand-merged.

Co-authored by @patroza

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

Leonel Rivasand others added 21 commits August 8, 2026 17:02
…#5745)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
… never ran (pingdotgg#5710)
Co-authored-by: t3-turbo-simulation <simulation@t3turbo.local>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…otgg#5768)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…tgg#5772)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…ep (pingdotgg#5776)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…data (pingdotgg#5773)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…g#5777)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…server (pingdotgg#5788)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Adopts the 19 upstream commits that landed after 48aa875, headlined by the
project settings overhaul (pingdotgg#5768), per-project worktree/checkout selection
(pingdotgg#5766), sidebar drafts (pingdotgg#5777), manual project icons (pingdotgg#5775) and settle no
longer leaving monitors and dev servers running (pingdotgg#5774).
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
- mobile ProjectFavicon kept the fork's older loaded-URL set and orphaned
upstream's projectFaviconCache module (request identity, disk cache,
recycling key). Upstream's component is a strict superset now that it
carries faviconPath, so it is adopted wholesale.
- upstream's new project settings page enforced single-owner only for
runOnWorktreeCreate; the fork has three lifecycle hooks. It now uses the
fork's clearConflictingLifecycleFlags, matching the chat header path.
- the empty-draft workspace reset lost the fork's reuseBaseBranch: false, so
a stale reuse flag survived a reset that clears everything else.
- ClaudeAdapter granted the raw input.cwd while the query runs in the
resolved cwd; the grant now names the same path.
- the script editor kept a delete confirm open across a request swap.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@patroza
patroza merged commit 0b23962 into fork/devAug 9, 2026
4 checks passed
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.

4 participants

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

merge: sync upstream through ba9c9ae81 (19 commits) - #383

Merged
patroza merged 21 commits into
fork/devfrom
sync/upstream-ba9c9ae81
Aug 9, 2026
Merged

merge: sync upstream through ba9c9ae81 (19 commits)#383
patroza merged 21 commits into
fork/devfrom
sync/upstream-ba9c9ae81

Conversation

@omegent-app

Copy link
Copy Markdown

Adopts upstream through ba9c9ae81 — the 19 commits that landed after 48aa875c0, headlined by
pingdotgg#5768 (project settings become a real settings page), pingdotgg#5766 (worktree or current checkout,
per project)
, pingdotgg#5777 (unsent drafts in the sidebar) and pingdotgg#5774 (settle stops monitors and dev
servers)
.

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
ba9c9ae81fix(server): one greedy agent process no longer takes down the whole server (pingdotgg#5788)
076e9048dfeat(web): project icons can be chosen manually (pingdotgg#5775)
05eb05118feat(web): keep unsent drafts one click away in the sidebar (pingdotgg#5777)
ddaa6afeffeat(server): vp run migrate-dev-db seeds worktree dev dbs with real data (pingdotgg#5773)
6f69b4407fix(web): sidebar rows show the branch again, not a truncated plan step (pingdotgg#5776)
6dbffa022feat: pick worktree or current checkout per project (pingdotgg#5766)
5bb8c0366fix(server): settle no longer leaves monitors and dev servers running (pingdotgg#5774)
886195ec1fix(web): usage totals no longer jump while devices report in (pingdotgg#5772)
288d8e345feat(web): overhaul project settings into a real settings page (pingdotgg#5768)
5208bdeb0fix(web): pinned reorder no longer reshuffles while writes land (pingdotgg#5767)
a6c9b41f9feat(server): agents can now open the images you paste into chat (pingdotgg#5757)
70c423a5efix(web): usage page loses the cost quality panel, gains a back button (pingdotgg#5756)
89c320df0fix(server): stop Codex threads with queued follow-ups (pingdotgg#5762)
e70cdb478fix(server): stop Claude resume handshakes from completing turns that never ran (pingdotgg#5710)
be01b287bfix(web): add missing cursor-pointer styling to dropdowns and buttons (pingdotgg#5716)
c2f8cb7cafeat(web): show how many subagents are running at a glance (pingdotgg#5745)
89ee692bffix(web): persist diff view mode (pingdotgg#5731)
7b2cf4374 · 49964e38cchore: vouch saphid / gfsaaser24 (the fork's .github/VOUCHED.td deletion stands)

Resolutions

15 conflicted files. What actually needed judgement:

WhereSituationResolution
ws.tsupstream pingdotgg#5774 stops the provider session when a thread parks; the fork's identity claim gate and stampOrchestrationCommandSource sit on the same dispatch, and the fork owns thread.unarchive worktree restorewoven: claim gate → source stamp → pre-stop read → dispatch → parking stop. Parking covers archive and settle; settle is gated onlyIfSettled so a re-engaged thread is not killed
ProjectScriptsControl.tsxupstream pingdotgg#5768 extracted the whole editor into projectScriptEditor.tsx; the fork had added two lifecycle hooks and a menu-label helper to the inline dialogupstream's extraction adopted; the fork's runOnWorktreeRemove / runOnPrMerged rebuilt inside the extracted dialog (type, empty input, hydration, submit, two switches) and projectScriptMenuLabel restored on the menu row
AssetAccess.tsfork's canonical-path + preview-type checks vs upstream's content-revisioned favicon filenames and 30-minute token bucketingboth — the auto-merge silently dropped upstream's revision block and bucketing; restored beside the fork's checks (5 upstream tests were failing on it)
Sidebar.tsxupstream added a drafts block and settled-tail paging to the row builder the fork rewroteunioned; the fork's appendRecencyRows grouping kept under upstream's draft-then-pinned ordering, and the duplicated SETTLED_TAIL_* consts collapsed onto the fork's Sidebar.logic exports
projector.tsupstream's new defaultThreadEnvMode and faviconPath land on a read model the fork moved to HashMapboth fields rebuilt on the fork's updateProject helper
useHandleNewThread.tsupstream extracted pickExplicitWorkspaceOptions and made the default-mode resolution asyncfork's reuseBaseBranch folded into the helper and into the reset gate
ClaudeAdapter.tsupstream pingdotgg#5757 grants the attachments dir; the fork passes a resolved cwd and a session environmentboth, with the grant naming the resolved cwd (see below)
decider.projectThreadEnvMode.test.tsupstream's new test indexes readModel.projects[0] — an array the fork replaced with a HashMapadapted via a local projectFromModel accessor rather than weakening the assertion
migration ledgersupstream added migrations 39/40, so five fork ledger tests asserted a stale tipfixed-size tail windows slid (not grown), keeping the upstream/fork ledger-separation assertions intact
Codex collab fixtureupstream's new queued-stop test drives a second sendTurn, which in the fork goes through turn/steer — a method the mock peer did not speakpeer taught turn/steer (+ a rejectSteer switch and a turn-start sidecar). Upstream's test sets rejectSteer so it still exercises the turn/start path its fix is about; a second fork test covers the accepted-steer path and asserts no second provider turn opens

Adversarial review

Both reviewers ran over the git show --cc resolution surface with the merged worktree available.
Between them they found four real welds and one nit. All are fixed in 885b287f2.

grok-4.5 — 2 HIGH, 2 MEDIUM, 2 LOW:

FindingDisposition
HIGH — mobile ProjectFavicon kept the fork's older loaded-URL set, orphaning upstream's projectFaviconCache module (request identity, memory-disk cache policy, recycling key). Its tests stayed green while nothing imported it — passing for the wrong reasonFixed. Upstream's component is a strict superset now that it carries faviconPath, so it is adopted wholesale
HIGH — upstream's new settings page enforces single-owner for runOnWorktreeCreate only; the fork has three lifecycle hooks. Two scripts could both claim runOnWorktreeRemove, and only the first would ever runFixed. Both write paths now use the fork's clearConflictingLifecycleFlags, matching the chat header
MEDIUM — empty-draft reset lost reuseBaseBranch: false, so a stale reuse flag survived a reset that clears branch, worktree, env mode and origin policyFixed (found independently by gpt-5.6-sol)
MEDIUMClaudeAdapter granted the raw input.cwd while the query runs in the resolved cwd, so the tool allowlist and the process cwd could disagreeFixed. The grant names the resolved cwd
LOW — the script editor kept a delete confirm open across a request swap, naming the previous scriptFixed
LOW — migration ledger tests only bumped tip expectationsNot a defect; verified the slid windows still assert ledger separation

gpt-5.6-sol — 1 HIGH, 1 MEDIUM:

FindingDisposition
HIGH — mobile can submit on a provisional workspace mode: buildPendingTask reads workspaceSelection?.mode ?? workspaceMode with no settle gate, so submitting before t3.json loads freezes local over a project that requires worktreeInherited from upstream, not fixed here. The line is byte-identical to HEAD^2 (pingdotgg#5766); the fork's resolution kept upstream's gate exactly where upstream put it. Worth a follow-up PR against the behaviour itself rather than a divergence smuggled into a sync
MEDIUMreuseBaseBranch: false dropped from the empty-draft resetFixed as above

Both independently confirmed the intentional keep/drop surface is coherent: ws.ts keeps the fork's
claim gate reachable while upstream's parking stop runs, the favicon path hint stays advisory
(server-side projection is authoritative), the extracted script editor carries all three fork
lifecycle hooks through hydration/import/submit, and no assertion was renamed or relaxed into
passing for an unrelated reason.

Verification

  • Recursive typecheck clean across all 17 packages.
  • 2,345 tests pass; the only failure is the pre-existing CodexTextGeneration launch-args one,
    which reproduces on unmerged fork/dev (this merge touches nothing under textGeneration/).
  • forkSurfaceExistence (the anti-stack-drop net) green at 17/17.
  • pnpm-lock.yaml regenerated rather than hand-merged.

Co-authored by @patroza

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

Leonel Rivasand others added 21 commits August 8, 2026 17:02
…#5745)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
… never ran (pingdotgg#5710)
Co-authored-by: t3-turbo-simulation <simulation@t3turbo.local>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…otgg#5768)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…tgg#5772)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…ep (pingdotgg#5776)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…data (pingdotgg#5773)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…g#5777)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…server (pingdotgg#5788)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Adopts the 19 upstream commits that landed after 48aa875, headlined by the
project settings overhaul (pingdotgg#5768), per-project worktree/checkout selection
(pingdotgg#5766), sidebar drafts (pingdotgg#5777), manual project icons (pingdotgg#5775) and settle no
longer leaving monitors and dev servers running (pingdotgg#5774).
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
- mobile ProjectFavicon kept the fork's older loaded-URL set and orphaned
upstream's projectFaviconCache module (request identity, disk cache,
recycling key). Upstream's component is a strict superset now that it
carries faviconPath, so it is adopted wholesale.
- upstream's new project settings page enforced single-owner only for
runOnWorktreeCreate; the fork has three lifecycle hooks. It now uses the
fork's clearConflictingLifecycleFlags, matching the chat header path.
- the empty-draft workspace reset lost the fork's reuseBaseBranch: false, so
a stale reuse flag survived a reset that clears everything else.
- ClaudeAdapter granted the raw input.cwd while the query runs in the
resolved cwd; the grant now names the same path.
- the script editor kept a delete confirm open across a request swap.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@patroza
patroza merged commit 0b23962 into fork/devAug 9, 2026
4 checks passed
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.

4 participants

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

merge: sync upstream through ba9c9ae81 (19 commits) - #383

Merged
patroza merged 21 commits into
fork/devfrom
sync/upstream-ba9c9ae81
Aug 9, 2026
Merged

merge: sync upstream through ba9c9ae81 (19 commits)#383
patroza merged 21 commits into
fork/devfrom
sync/upstream-ba9c9ae81

Conversation

@omegent-app

Copy link
Copy Markdown

Adopts upstream through ba9c9ae81 — the 19 commits that landed after 48aa875c0, headlined by
pingdotgg#5768 (project settings become a real settings page), pingdotgg#5766 (worktree or current checkout,
per project)
, pingdotgg#5777 (unsent drafts in the sidebar) and pingdotgg#5774 (settle stops monitors and dev
servers)
.

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
ba9c9ae81fix(server): one greedy agent process no longer takes down the whole server (pingdotgg#5788)
076e9048dfeat(web): project icons can be chosen manually (pingdotgg#5775)
05eb05118feat(web): keep unsent drafts one click away in the sidebar (pingdotgg#5777)
ddaa6afeffeat(server): vp run migrate-dev-db seeds worktree dev dbs with real data (pingdotgg#5773)
6f69b4407fix(web): sidebar rows show the branch again, not a truncated plan step (pingdotgg#5776)
6dbffa022feat: pick worktree or current checkout per project (pingdotgg#5766)
5bb8c0366fix(server): settle no longer leaves monitors and dev servers running (pingdotgg#5774)
886195ec1fix(web): usage totals no longer jump while devices report in (pingdotgg#5772)
288d8e345feat(web): overhaul project settings into a real settings page (pingdotgg#5768)
5208bdeb0fix(web): pinned reorder no longer reshuffles while writes land (pingdotgg#5767)
a6c9b41f9feat(server): agents can now open the images you paste into chat (pingdotgg#5757)
70c423a5efix(web): usage page loses the cost quality panel, gains a back button (pingdotgg#5756)
89c320df0fix(server): stop Codex threads with queued follow-ups (pingdotgg#5762)
e70cdb478fix(server): stop Claude resume handshakes from completing turns that never ran (pingdotgg#5710)
be01b287bfix(web): add missing cursor-pointer styling to dropdowns and buttons (pingdotgg#5716)
c2f8cb7cafeat(web): show how many subagents are running at a glance (pingdotgg#5745)
89ee692bffix(web): persist diff view mode (pingdotgg#5731)
7b2cf4374 · 49964e38cchore: vouch saphid / gfsaaser24 (the fork's .github/VOUCHED.td deletion stands)

Resolutions

15 conflicted files. What actually needed judgement:

WhereSituationResolution
ws.tsupstream pingdotgg#5774 stops the provider session when a thread parks; the fork's identity claim gate and stampOrchestrationCommandSource sit on the same dispatch, and the fork owns thread.unarchive worktree restorewoven: claim gate → source stamp → pre-stop read → dispatch → parking stop. Parking covers archive and settle; settle is gated onlyIfSettled so a re-engaged thread is not killed
ProjectScriptsControl.tsxupstream pingdotgg#5768 extracted the whole editor into projectScriptEditor.tsx; the fork had added two lifecycle hooks and a menu-label helper to the inline dialogupstream's extraction adopted; the fork's runOnWorktreeRemove / runOnPrMerged rebuilt inside the extracted dialog (type, empty input, hydration, submit, two switches) and projectScriptMenuLabel restored on the menu row
AssetAccess.tsfork's canonical-path + preview-type checks vs upstream's content-revisioned favicon filenames and 30-minute token bucketingboth — the auto-merge silently dropped upstream's revision block and bucketing; restored beside the fork's checks (5 upstream tests were failing on it)
Sidebar.tsxupstream added a drafts block and settled-tail paging to the row builder the fork rewroteunioned; the fork's appendRecencyRows grouping kept under upstream's draft-then-pinned ordering, and the duplicated SETTLED_TAIL_* consts collapsed onto the fork's Sidebar.logic exports
projector.tsupstream's new defaultThreadEnvMode and faviconPath land on a read model the fork moved to HashMapboth fields rebuilt on the fork's updateProject helper
useHandleNewThread.tsupstream extracted pickExplicitWorkspaceOptions and made the default-mode resolution asyncfork's reuseBaseBranch folded into the helper and into the reset gate
ClaudeAdapter.tsupstream pingdotgg#5757 grants the attachments dir; the fork passes a resolved cwd and a session environmentboth, with the grant naming the resolved cwd (see below)
decider.projectThreadEnvMode.test.tsupstream's new test indexes readModel.projects[0] — an array the fork replaced with a HashMapadapted via a local projectFromModel accessor rather than weakening the assertion
migration ledgersupstream added migrations 39/40, so five fork ledger tests asserted a stale tipfixed-size tail windows slid (not grown), keeping the upstream/fork ledger-separation assertions intact
Codex collab fixtureupstream's new queued-stop test drives a second sendTurn, which in the fork goes through turn/steer — a method the mock peer did not speakpeer taught turn/steer (+ a rejectSteer switch and a turn-start sidecar). Upstream's test sets rejectSteer so it still exercises the turn/start path its fix is about; a second fork test covers the accepted-steer path and asserts no second provider turn opens

Adversarial review

Both reviewers ran over the git show --cc resolution surface with the merged worktree available.
Between them they found four real welds and one nit. All are fixed in 885b287f2.

grok-4.5 — 2 HIGH, 2 MEDIUM, 2 LOW:

FindingDisposition
HIGH — mobile ProjectFavicon kept the fork's older loaded-URL set, orphaning upstream's projectFaviconCache module (request identity, memory-disk cache policy, recycling key). Its tests stayed green while nothing imported it — passing for the wrong reasonFixed. Upstream's component is a strict superset now that it carries faviconPath, so it is adopted wholesale
HIGH — upstream's new settings page enforces single-owner for runOnWorktreeCreate only; the fork has three lifecycle hooks. Two scripts could both claim runOnWorktreeRemove, and only the first would ever runFixed. Both write paths now use the fork's clearConflictingLifecycleFlags, matching the chat header
MEDIUM — empty-draft reset lost reuseBaseBranch: false, so a stale reuse flag survived a reset that clears branch, worktree, env mode and origin policyFixed (found independently by gpt-5.6-sol)
MEDIUMClaudeAdapter granted the raw input.cwd while the query runs in the resolved cwd, so the tool allowlist and the process cwd could disagreeFixed. The grant names the resolved cwd
LOW — the script editor kept a delete confirm open across a request swap, naming the previous scriptFixed
LOW — migration ledger tests only bumped tip expectationsNot a defect; verified the slid windows still assert ledger separation

gpt-5.6-sol — 1 HIGH, 1 MEDIUM:

FindingDisposition
HIGH — mobile can submit on a provisional workspace mode: buildPendingTask reads workspaceSelection?.mode ?? workspaceMode with no settle gate, so submitting before t3.json loads freezes local over a project that requires worktreeInherited from upstream, not fixed here. The line is byte-identical to HEAD^2 (pingdotgg#5766); the fork's resolution kept upstream's gate exactly where upstream put it. Worth a follow-up PR against the behaviour itself rather than a divergence smuggled into a sync
MEDIUMreuseBaseBranch: false dropped from the empty-draft resetFixed as above

Both independently confirmed the intentional keep/drop surface is coherent: ws.ts keeps the fork's
claim gate reachable while upstream's parking stop runs, the favicon path hint stays advisory
(server-side projection is authoritative), the extracted script editor carries all three fork
lifecycle hooks through hydration/import/submit, and no assertion was renamed or relaxed into
passing for an unrelated reason.

Verification

  • Recursive typecheck clean across all 17 packages.
  • 2,345 tests pass; the only failure is the pre-existing CodexTextGeneration launch-args one,
    which reproduces on unmerged fork/dev (this merge touches nothing under textGeneration/).
  • forkSurfaceExistence (the anti-stack-drop net) green at 17/17.
  • pnpm-lock.yaml regenerated rather than hand-merged.

Co-authored by @patroza

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

Leonel Rivasand others added 21 commits August 8, 2026 17:02
…#5745)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
… never ran (pingdotgg#5710)
Co-authored-by: t3-turbo-simulation <simulation@t3turbo.local>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…otgg#5768)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…tgg#5772)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…ep (pingdotgg#5776)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…data (pingdotgg#5773)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…g#5777)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…server (pingdotgg#5788)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Adopts the 19 upstream commits that landed after 48aa875, headlined by the
project settings overhaul (pingdotgg#5768), per-project worktree/checkout selection
(pingdotgg#5766), sidebar drafts (pingdotgg#5777), manual project icons (pingdotgg#5775) and settle no
longer leaving monitors and dev servers running (pingdotgg#5774).
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
- mobile ProjectFavicon kept the fork's older loaded-URL set and orphaned
upstream's projectFaviconCache module (request identity, disk cache,
recycling key). Upstream's component is a strict superset now that it
carries faviconPath, so it is adopted wholesale.
- upstream's new project settings page enforced single-owner only for
runOnWorktreeCreate; the fork has three lifecycle hooks. It now uses the
fork's clearConflictingLifecycleFlags, matching the chat header path.
- the empty-draft workspace reset lost the fork's reuseBaseBranch: false, so
a stale reuse flag survived a reset that clears everything else.
- ClaudeAdapter granted the raw input.cwd while the query runs in the
resolved cwd; the grant now names the same path.
- the script editor kept a delete confirm open across a request swap.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@patroza
patroza merged commit 0b23962 into fork/devAug 9, 2026
4 checks passed
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.

4 participants

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

merge: sync upstream through ba9c9ae81 (19 commits) - #383

Merged
patroza merged 21 commits into
fork/devfrom
sync/upstream-ba9c9ae81
Aug 9, 2026
Merged

merge: sync upstream through ba9c9ae81 (19 commits)#383
patroza merged 21 commits into
fork/devfrom
sync/upstream-ba9c9ae81

Conversation

@omegent-app

Copy link
Copy Markdown

Adopts upstream through ba9c9ae81 — the 19 commits that landed after 48aa875c0, headlined by
pingdotgg#5768 (project settings become a real settings page), pingdotgg#5766 (worktree or current checkout,
per project)
, pingdotgg#5777 (unsent drafts in the sidebar) and pingdotgg#5774 (settle stops monitors and dev
servers)
.

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
ba9c9ae81fix(server): one greedy agent process no longer takes down the whole server (pingdotgg#5788)
076e9048dfeat(web): project icons can be chosen manually (pingdotgg#5775)
05eb05118feat(web): keep unsent drafts one click away in the sidebar (pingdotgg#5777)
ddaa6afeffeat(server): vp run migrate-dev-db seeds worktree dev dbs with real data (pingdotgg#5773)
6f69b4407fix(web): sidebar rows show the branch again, not a truncated plan step (pingdotgg#5776)
6dbffa022feat: pick worktree or current checkout per project (pingdotgg#5766)
5bb8c0366fix(server): settle no longer leaves monitors and dev servers running (pingdotgg#5774)
886195ec1fix(web): usage totals no longer jump while devices report in (pingdotgg#5772)
288d8e345feat(web): overhaul project settings into a real settings page (pingdotgg#5768)
5208bdeb0fix(web): pinned reorder no longer reshuffles while writes land (pingdotgg#5767)
a6c9b41f9feat(server): agents can now open the images you paste into chat (pingdotgg#5757)
70c423a5efix(web): usage page loses the cost quality panel, gains a back button (pingdotgg#5756)
89c320df0fix(server): stop Codex threads with queued follow-ups (pingdotgg#5762)
e70cdb478fix(server): stop Claude resume handshakes from completing turns that never ran (pingdotgg#5710)
be01b287bfix(web): add missing cursor-pointer styling to dropdowns and buttons (pingdotgg#5716)
c2f8cb7cafeat(web): show how many subagents are running at a glance (pingdotgg#5745)
89ee692bffix(web): persist diff view mode (pingdotgg#5731)
7b2cf4374 · 49964e38cchore: vouch saphid / gfsaaser24 (the fork's .github/VOUCHED.td deletion stands)

Resolutions

15 conflicted files. What actually needed judgement:

WhereSituationResolution
ws.tsupstream pingdotgg#5774 stops the provider session when a thread parks; the fork's identity claim gate and stampOrchestrationCommandSource sit on the same dispatch, and the fork owns thread.unarchive worktree restorewoven: claim gate → source stamp → pre-stop read → dispatch → parking stop. Parking covers archive and settle; settle is gated onlyIfSettled so a re-engaged thread is not killed
ProjectScriptsControl.tsxupstream pingdotgg#5768 extracted the whole editor into projectScriptEditor.tsx; the fork had added two lifecycle hooks and a menu-label helper to the inline dialogupstream's extraction adopted; the fork's runOnWorktreeRemove / runOnPrMerged rebuilt inside the extracted dialog (type, empty input, hydration, submit, two switches) and projectScriptMenuLabel restored on the menu row
AssetAccess.tsfork's canonical-path + preview-type checks vs upstream's content-revisioned favicon filenames and 30-minute token bucketingboth — the auto-merge silently dropped upstream's revision block and bucketing; restored beside the fork's checks (5 upstream tests were failing on it)
Sidebar.tsxupstream added a drafts block and settled-tail paging to the row builder the fork rewroteunioned; the fork's appendRecencyRows grouping kept under upstream's draft-then-pinned ordering, and the duplicated SETTLED_TAIL_* consts collapsed onto the fork's Sidebar.logic exports
projector.tsupstream's new defaultThreadEnvMode and faviconPath land on a read model the fork moved to HashMapboth fields rebuilt on the fork's updateProject helper
useHandleNewThread.tsupstream extracted pickExplicitWorkspaceOptions and made the default-mode resolution asyncfork's reuseBaseBranch folded into the helper and into the reset gate
ClaudeAdapter.tsupstream pingdotgg#5757 grants the attachments dir; the fork passes a resolved cwd and a session environmentboth, with the grant naming the resolved cwd (see below)
decider.projectThreadEnvMode.test.tsupstream's new test indexes readModel.projects[0] — an array the fork replaced with a HashMapadapted via a local projectFromModel accessor rather than weakening the assertion
migration ledgersupstream added migrations 39/40, so five fork ledger tests asserted a stale tipfixed-size tail windows slid (not grown), keeping the upstream/fork ledger-separation assertions intact
Codex collab fixtureupstream's new queued-stop test drives a second sendTurn, which in the fork goes through turn/steer — a method the mock peer did not speakpeer taught turn/steer (+ a rejectSteer switch and a turn-start sidecar). Upstream's test sets rejectSteer so it still exercises the turn/start path its fix is about; a second fork test covers the accepted-steer path and asserts no second provider turn opens

Adversarial review

Both reviewers ran over the git show --cc resolution surface with the merged worktree available.
Between them they found four real welds and one nit. All are fixed in 885b287f2.

grok-4.5 — 2 HIGH, 2 MEDIUM, 2 LOW:

FindingDisposition
HIGH — mobile ProjectFavicon kept the fork's older loaded-URL set, orphaning upstream's projectFaviconCache module (request identity, memory-disk cache policy, recycling key). Its tests stayed green while nothing imported it — passing for the wrong reasonFixed. Upstream's component is a strict superset now that it carries faviconPath, so it is adopted wholesale
HIGH — upstream's new settings page enforces single-owner for runOnWorktreeCreate only; the fork has three lifecycle hooks. Two scripts could both claim runOnWorktreeRemove, and only the first would ever runFixed. Both write paths now use the fork's clearConflictingLifecycleFlags, matching the chat header
MEDIUM — empty-draft reset lost reuseBaseBranch: false, so a stale reuse flag survived a reset that clears branch, worktree, env mode and origin policyFixed (found independently by gpt-5.6-sol)
MEDIUMClaudeAdapter granted the raw input.cwd while the query runs in the resolved cwd, so the tool allowlist and the process cwd could disagreeFixed. The grant names the resolved cwd
LOW — the script editor kept a delete confirm open across a request swap, naming the previous scriptFixed
LOW — migration ledger tests only bumped tip expectationsNot a defect; verified the slid windows still assert ledger separation

gpt-5.6-sol — 1 HIGH, 1 MEDIUM:

FindingDisposition
HIGH — mobile can submit on a provisional workspace mode: buildPendingTask reads workspaceSelection?.mode ?? workspaceMode with no settle gate, so submitting before t3.json loads freezes local over a project that requires worktreeInherited from upstream, not fixed here. The line is byte-identical to HEAD^2 (pingdotgg#5766); the fork's resolution kept upstream's gate exactly where upstream put it. Worth a follow-up PR against the behaviour itself rather than a divergence smuggled into a sync
MEDIUMreuseBaseBranch: false dropped from the empty-draft resetFixed as above

Both independently confirmed the intentional keep/drop surface is coherent: ws.ts keeps the fork's
claim gate reachable while upstream's parking stop runs, the favicon path hint stays advisory
(server-side projection is authoritative), the extracted script editor carries all three fork
lifecycle hooks through hydration/import/submit, and no assertion was renamed or relaxed into
passing for an unrelated reason.

Verification

  • Recursive typecheck clean across all 17 packages.
  • 2,345 tests pass; the only failure is the pre-existing CodexTextGeneration launch-args one,
    which reproduces on unmerged fork/dev (this merge touches nothing under textGeneration/).
  • forkSurfaceExistence (the anti-stack-drop net) green at 17/17.
  • pnpm-lock.yaml regenerated rather than hand-merged.

Co-authored by @patroza

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

Leonel Rivasand others added 21 commits August 8, 2026 17:02
…#5745)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
… never ran (pingdotgg#5710)
Co-authored-by: t3-turbo-simulation <simulation@t3turbo.local>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…otgg#5768)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…tgg#5772)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…ep (pingdotgg#5776)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…data (pingdotgg#5773)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…g#5777)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…server (pingdotgg#5788)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Adopts the 19 upstream commits that landed after 48aa875, headlined by the
project settings overhaul (pingdotgg#5768), per-project worktree/checkout selection
(pingdotgg#5766), sidebar drafts (pingdotgg#5777), manual project icons (pingdotgg#5775) and settle no
longer leaving monitors and dev servers running (pingdotgg#5774).
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
- mobile ProjectFavicon kept the fork's older loaded-URL set and orphaned
upstream's projectFaviconCache module (request identity, disk cache,
recycling key). Upstream's component is a strict superset now that it
carries faviconPath, so it is adopted wholesale.
- upstream's new project settings page enforced single-owner only for
runOnWorktreeCreate; the fork has three lifecycle hooks. It now uses the
fork's clearConflictingLifecycleFlags, matching the chat header path.
- the empty-draft workspace reset lost the fork's reuseBaseBranch: false, so
a stale reuse flag survived a reset that clears everything else.
- ClaudeAdapter granted the raw input.cwd while the query runs in the
resolved cwd; the grant now names the same path.
- the script editor kept a delete confirm open across a request swap.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@patroza
patroza merged commit 0b23962 into fork/devAug 9, 2026
4 checks passed
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.

4 participants

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

merge: sync upstream through ba9c9ae81 (19 commits) - #383

Merged
patroza merged 21 commits into
fork/devfrom
sync/upstream-ba9c9ae81
Aug 9, 2026
Merged

merge: sync upstream through ba9c9ae81 (19 commits)#383
patroza merged 21 commits into
fork/devfrom
sync/upstream-ba9c9ae81

Conversation

@omegent-app

Copy link
Copy Markdown

Adopts upstream through ba9c9ae81 — the 19 commits that landed after 48aa875c0, headlined by
pingdotgg#5768 (project settings become a real settings page), pingdotgg#5766 (worktree or current checkout,
per project)
, pingdotgg#5777 (unsent drafts in the sidebar) and pingdotgg#5774 (settle stops monitors and dev
servers)
.

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
ba9c9ae81fix(server): one greedy agent process no longer takes down the whole server (pingdotgg#5788)
076e9048dfeat(web): project icons can be chosen manually (pingdotgg#5775)
05eb05118feat(web): keep unsent drafts one click away in the sidebar (pingdotgg#5777)
ddaa6afeffeat(server): vp run migrate-dev-db seeds worktree dev dbs with real data (pingdotgg#5773)
6f69b4407fix(web): sidebar rows show the branch again, not a truncated plan step (pingdotgg#5776)
6dbffa022feat: pick worktree or current checkout per project (pingdotgg#5766)
5bb8c0366fix(server): settle no longer leaves monitors and dev servers running (pingdotgg#5774)
886195ec1fix(web): usage totals no longer jump while devices report in (pingdotgg#5772)
288d8e345feat(web): overhaul project settings into a real settings page (pingdotgg#5768)
5208bdeb0fix(web): pinned reorder no longer reshuffles while writes land (pingdotgg#5767)
a6c9b41f9feat(server): agents can now open the images you paste into chat (pingdotgg#5757)
70c423a5efix(web): usage page loses the cost quality panel, gains a back button (pingdotgg#5756)
89c320df0fix(server): stop Codex threads with queued follow-ups (pingdotgg#5762)
e70cdb478fix(server): stop Claude resume handshakes from completing turns that never ran (pingdotgg#5710)
be01b287bfix(web): add missing cursor-pointer styling to dropdowns and buttons (pingdotgg#5716)
c2f8cb7cafeat(web): show how many subagents are running at a glance (pingdotgg#5745)
89ee692bffix(web): persist diff view mode (pingdotgg#5731)
7b2cf4374 · 49964e38cchore: vouch saphid / gfsaaser24 (the fork's .github/VOUCHED.td deletion stands)

Resolutions

15 conflicted files. What actually needed judgement:

WhereSituationResolution
ws.tsupstream pingdotgg#5774 stops the provider session when a thread parks; the fork's identity claim gate and stampOrchestrationCommandSource sit on the same dispatch, and the fork owns thread.unarchive worktree restorewoven: claim gate → source stamp → pre-stop read → dispatch → parking stop. Parking covers archive and settle; settle is gated onlyIfSettled so a re-engaged thread is not killed
ProjectScriptsControl.tsxupstream pingdotgg#5768 extracted the whole editor into projectScriptEditor.tsx; the fork had added two lifecycle hooks and a menu-label helper to the inline dialogupstream's extraction adopted; the fork's runOnWorktreeRemove / runOnPrMerged rebuilt inside the extracted dialog (type, empty input, hydration, submit, two switches) and projectScriptMenuLabel restored on the menu row
AssetAccess.tsfork's canonical-path + preview-type checks vs upstream's content-revisioned favicon filenames and 30-minute token bucketingboth — the auto-merge silently dropped upstream's revision block and bucketing; restored beside the fork's checks (5 upstream tests were failing on it)
Sidebar.tsxupstream added a drafts block and settled-tail paging to the row builder the fork rewroteunioned; the fork's appendRecencyRows grouping kept under upstream's draft-then-pinned ordering, and the duplicated SETTLED_TAIL_* consts collapsed onto the fork's Sidebar.logic exports
projector.tsupstream's new defaultThreadEnvMode and faviconPath land on a read model the fork moved to HashMapboth fields rebuilt on the fork's updateProject helper
useHandleNewThread.tsupstream extracted pickExplicitWorkspaceOptions and made the default-mode resolution asyncfork's reuseBaseBranch folded into the helper and into the reset gate
ClaudeAdapter.tsupstream pingdotgg#5757 grants the attachments dir; the fork passes a resolved cwd and a session environmentboth, with the grant naming the resolved cwd (see below)
decider.projectThreadEnvMode.test.tsupstream's new test indexes readModel.projects[0] — an array the fork replaced with a HashMapadapted via a local projectFromModel accessor rather than weakening the assertion
migration ledgersupstream added migrations 39/40, so five fork ledger tests asserted a stale tipfixed-size tail windows slid (not grown), keeping the upstream/fork ledger-separation assertions intact
Codex collab fixtureupstream's new queued-stop test drives a second sendTurn, which in the fork goes through turn/steer — a method the mock peer did not speakpeer taught turn/steer (+ a rejectSteer switch and a turn-start sidecar). Upstream's test sets rejectSteer so it still exercises the turn/start path its fix is about; a second fork test covers the accepted-steer path and asserts no second provider turn opens

Adversarial review

Both reviewers ran over the git show --cc resolution surface with the merged worktree available.
Between them they found four real welds and one nit. All are fixed in 885b287f2.

grok-4.5 — 2 HIGH, 2 MEDIUM, 2 LOW:

FindingDisposition
HIGH — mobile ProjectFavicon kept the fork's older loaded-URL set, orphaning upstream's projectFaviconCache module (request identity, memory-disk cache policy, recycling key). Its tests stayed green while nothing imported it — passing for the wrong reasonFixed. Upstream's component is a strict superset now that it carries faviconPath, so it is adopted wholesale
HIGH — upstream's new settings page enforces single-owner for runOnWorktreeCreate only; the fork has three lifecycle hooks. Two scripts could both claim runOnWorktreeRemove, and only the first would ever runFixed. Both write paths now use the fork's clearConflictingLifecycleFlags, matching the chat header
MEDIUM — empty-draft reset lost reuseBaseBranch: false, so a stale reuse flag survived a reset that clears branch, worktree, env mode and origin policyFixed (found independently by gpt-5.6-sol)
MEDIUMClaudeAdapter granted the raw input.cwd while the query runs in the resolved cwd, so the tool allowlist and the process cwd could disagreeFixed. The grant names the resolved cwd
LOW — the script editor kept a delete confirm open across a request swap, naming the previous scriptFixed
LOW — migration ledger tests only bumped tip expectationsNot a defect; verified the slid windows still assert ledger separation

gpt-5.6-sol — 1 HIGH, 1 MEDIUM:

FindingDisposition
HIGH — mobile can submit on a provisional workspace mode: buildPendingTask reads workspaceSelection?.mode ?? workspaceMode with no settle gate, so submitting before t3.json loads freezes local over a project that requires worktreeInherited from upstream, not fixed here. The line is byte-identical to HEAD^2 (pingdotgg#5766); the fork's resolution kept upstream's gate exactly where upstream put it. Worth a follow-up PR against the behaviour itself rather than a divergence smuggled into a sync
MEDIUMreuseBaseBranch: false dropped from the empty-draft resetFixed as above

Both independently confirmed the intentional keep/drop surface is coherent: ws.ts keeps the fork's
claim gate reachable while upstream's parking stop runs, the favicon path hint stays advisory
(server-side projection is authoritative), the extracted script editor carries all three fork
lifecycle hooks through hydration/import/submit, and no assertion was renamed or relaxed into
passing for an unrelated reason.

Verification

  • Recursive typecheck clean across all 17 packages.
  • 2,345 tests pass; the only failure is the pre-existing CodexTextGeneration launch-args one,
    which reproduces on unmerged fork/dev (this merge touches nothing under textGeneration/).
  • forkSurfaceExistence (the anti-stack-drop net) green at 17/17.
  • pnpm-lock.yaml regenerated rather than hand-merged.

Co-authored by @patroza

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

Leonel Rivasand others added 21 commits August 8, 2026 17:02
…#5745)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
… never ran (pingdotgg#5710)
Co-authored-by: t3-turbo-simulation <simulation@t3turbo.local>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…otgg#5768)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…tgg#5772)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…ep (pingdotgg#5776)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…data (pingdotgg#5773)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…g#5777)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…server (pingdotgg#5788)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Adopts the 19 upstream commits that landed after 48aa875, headlined by the
project settings overhaul (pingdotgg#5768), per-project worktree/checkout selection
(pingdotgg#5766), sidebar drafts (pingdotgg#5777), manual project icons (pingdotgg#5775) and settle no
longer leaving monitors and dev servers running (pingdotgg#5774).
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
- mobile ProjectFavicon kept the fork's older loaded-URL set and orphaned
upstream's projectFaviconCache module (request identity, disk cache,
recycling key). Upstream's component is a strict superset now that it
carries faviconPath, so it is adopted wholesale.
- upstream's new project settings page enforced single-owner only for
runOnWorktreeCreate; the fork has three lifecycle hooks. It now uses the
fork's clearConflictingLifecycleFlags, matching the chat header path.
- the empty-draft workspace reset lost the fork's reuseBaseBranch: false, so
a stale reuse flag survived a reset that clears everything else.
- ClaudeAdapter granted the raw input.cwd while the query runs in the
resolved cwd; the grant now names the same path.
- the script editor kept a delete confirm open across a request swap.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@patroza
patroza merged commit 0b23962 into fork/devAug 9, 2026
4 checks passed
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.

4 participants

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

merge: sync upstream through ba9c9ae81 (19 commits) - #383

Merged
patroza merged 21 commits into
fork/devfrom
sync/upstream-ba9c9ae81
Aug 9, 2026
Merged

merge: sync upstream through ba9c9ae81 (19 commits)#383
patroza merged 21 commits into
fork/devfrom
sync/upstream-ba9c9ae81

Conversation

@omegent-app

Copy link
Copy Markdown

Adopts upstream through ba9c9ae81 — the 19 commits that landed after 48aa875c0, headlined by
pingdotgg#5768 (project settings become a real settings page), pingdotgg#5766 (worktree or current checkout,
per project)
, pingdotgg#5777 (unsent drafts in the sidebar) and pingdotgg#5774 (settle stops monitors and dev
servers)
.

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
ba9c9ae81fix(server): one greedy agent process no longer takes down the whole server (pingdotgg#5788)
076e9048dfeat(web): project icons can be chosen manually (pingdotgg#5775)
05eb05118feat(web): keep unsent drafts one click away in the sidebar (pingdotgg#5777)
ddaa6afeffeat(server): vp run migrate-dev-db seeds worktree dev dbs with real data (pingdotgg#5773)
6f69b4407fix(web): sidebar rows show the branch again, not a truncated plan step (pingdotgg#5776)
6dbffa022feat: pick worktree or current checkout per project (pingdotgg#5766)
5bb8c0366fix(server): settle no longer leaves monitors and dev servers running (pingdotgg#5774)
886195ec1fix(web): usage totals no longer jump while devices report in (pingdotgg#5772)
288d8e345feat(web): overhaul project settings into a real settings page (pingdotgg#5768)
5208bdeb0fix(web): pinned reorder no longer reshuffles while writes land (pingdotgg#5767)
a6c9b41f9feat(server): agents can now open the images you paste into chat (pingdotgg#5757)
70c423a5efix(web): usage page loses the cost quality panel, gains a back button (pingdotgg#5756)
89c320df0fix(server): stop Codex threads with queued follow-ups (pingdotgg#5762)
e70cdb478fix(server): stop Claude resume handshakes from completing turns that never ran (pingdotgg#5710)
be01b287bfix(web): add missing cursor-pointer styling to dropdowns and buttons (pingdotgg#5716)
c2f8cb7cafeat(web): show how many subagents are running at a glance (pingdotgg#5745)
89ee692bffix(web): persist diff view mode (pingdotgg#5731)
7b2cf4374 · 49964e38cchore: vouch saphid / gfsaaser24 (the fork's .github/VOUCHED.td deletion stands)

Resolutions

15 conflicted files. What actually needed judgement:

WhereSituationResolution
ws.tsupstream pingdotgg#5774 stops the provider session when a thread parks; the fork's identity claim gate and stampOrchestrationCommandSource sit on the same dispatch, and the fork owns thread.unarchive worktree restorewoven: claim gate → source stamp → pre-stop read → dispatch → parking stop. Parking covers archive and settle; settle is gated onlyIfSettled so a re-engaged thread is not killed
ProjectScriptsControl.tsxupstream pingdotgg#5768 extracted the whole editor into projectScriptEditor.tsx; the fork had added two lifecycle hooks and a menu-label helper to the inline dialogupstream's extraction adopted; the fork's runOnWorktreeRemove / runOnPrMerged rebuilt inside the extracted dialog (type, empty input, hydration, submit, two switches) and projectScriptMenuLabel restored on the menu row
AssetAccess.tsfork's canonical-path + preview-type checks vs upstream's content-revisioned favicon filenames and 30-minute token bucketingboth — the auto-merge silently dropped upstream's revision block and bucketing; restored beside the fork's checks (5 upstream tests were failing on it)
Sidebar.tsxupstream added a drafts block and settled-tail paging to the row builder the fork rewroteunioned; the fork's appendRecencyRows grouping kept under upstream's draft-then-pinned ordering, and the duplicated SETTLED_TAIL_* consts collapsed onto the fork's Sidebar.logic exports
projector.tsupstream's new defaultThreadEnvMode and faviconPath land on a read model the fork moved to HashMapboth fields rebuilt on the fork's updateProject helper
useHandleNewThread.tsupstream extracted pickExplicitWorkspaceOptions and made the default-mode resolution asyncfork's reuseBaseBranch folded into the helper and into the reset gate
ClaudeAdapter.tsupstream pingdotgg#5757 grants the attachments dir; the fork passes a resolved cwd and a session environmentboth, with the grant naming the resolved cwd (see below)
decider.projectThreadEnvMode.test.tsupstream's new test indexes readModel.projects[0] — an array the fork replaced with a HashMapadapted via a local projectFromModel accessor rather than weakening the assertion
migration ledgersupstream added migrations 39/40, so five fork ledger tests asserted a stale tipfixed-size tail windows slid (not grown), keeping the upstream/fork ledger-separation assertions intact
Codex collab fixtureupstream's new queued-stop test drives a second sendTurn, which in the fork goes through turn/steer — a method the mock peer did not speakpeer taught turn/steer (+ a rejectSteer switch and a turn-start sidecar). Upstream's test sets rejectSteer so it still exercises the turn/start path its fix is about; a second fork test covers the accepted-steer path and asserts no second provider turn opens

Adversarial review

Both reviewers ran over the git show --cc resolution surface with the merged worktree available.
Between them they found four real welds and one nit. All are fixed in 885b287f2.

grok-4.5 — 2 HIGH, 2 MEDIUM, 2 LOW:

FindingDisposition
HIGH — mobile ProjectFavicon kept the fork's older loaded-URL set, orphaning upstream's projectFaviconCache module (request identity, memory-disk cache policy, recycling key). Its tests stayed green while nothing imported it — passing for the wrong reasonFixed. Upstream's component is a strict superset now that it carries faviconPath, so it is adopted wholesale
HIGH — upstream's new settings page enforces single-owner for runOnWorktreeCreate only; the fork has three lifecycle hooks. Two scripts could both claim runOnWorktreeRemove, and only the first would ever runFixed. Both write paths now use the fork's clearConflictingLifecycleFlags, matching the chat header
MEDIUM — empty-draft reset lost reuseBaseBranch: false, so a stale reuse flag survived a reset that clears branch, worktree, env mode and origin policyFixed (found independently by gpt-5.6-sol)
MEDIUMClaudeAdapter granted the raw input.cwd while the query runs in the resolved cwd, so the tool allowlist and the process cwd could disagreeFixed. The grant names the resolved cwd
LOW — the script editor kept a delete confirm open across a request swap, naming the previous scriptFixed
LOW — migration ledger tests only bumped tip expectationsNot a defect; verified the slid windows still assert ledger separation

gpt-5.6-sol — 1 HIGH, 1 MEDIUM:

FindingDisposition
HIGH — mobile can submit on a provisional workspace mode: buildPendingTask reads workspaceSelection?.mode ?? workspaceMode with no settle gate, so submitting before t3.json loads freezes local over a project that requires worktreeInherited from upstream, not fixed here. The line is byte-identical to HEAD^2 (pingdotgg#5766); the fork's resolution kept upstream's gate exactly where upstream put it. Worth a follow-up PR against the behaviour itself rather than a divergence smuggled into a sync
MEDIUMreuseBaseBranch: false dropped from the empty-draft resetFixed as above

Both independently confirmed the intentional keep/drop surface is coherent: ws.ts keeps the fork's
claim gate reachable while upstream's parking stop runs, the favicon path hint stays advisory
(server-side projection is authoritative), the extracted script editor carries all three fork
lifecycle hooks through hydration/import/submit, and no assertion was renamed or relaxed into
passing for an unrelated reason.

Verification

  • Recursive typecheck clean across all 17 packages.
  • 2,345 tests pass; the only failure is the pre-existing CodexTextGeneration launch-args one,
    which reproduces on unmerged fork/dev (this merge touches nothing under textGeneration/).
  • forkSurfaceExistence (the anti-stack-drop net) green at 17/17.
  • pnpm-lock.yaml regenerated rather than hand-merged.

Co-authored by @patroza

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

Leonel Rivasand others added 21 commits August 8, 2026 17:02
…#5745)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
… never ran (pingdotgg#5710)
Co-authored-by: t3-turbo-simulation <simulation@t3turbo.local>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…otgg#5768)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…tgg#5772)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…ep (pingdotgg#5776)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…data (pingdotgg#5773)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…g#5777)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…server (pingdotgg#5788)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Adopts the 19 upstream commits that landed after 48aa875, headlined by the
project settings overhaul (pingdotgg#5768), per-project worktree/checkout selection
(pingdotgg#5766), sidebar drafts (pingdotgg#5777), manual project icons (pingdotgg#5775) and settle no
longer leaving monitors and dev servers running (pingdotgg#5774).
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
- mobile ProjectFavicon kept the fork's older loaded-URL set and orphaned
upstream's projectFaviconCache module (request identity, disk cache,
recycling key). Upstream's component is a strict superset now that it
carries faviconPath, so it is adopted wholesale.
- upstream's new project settings page enforced single-owner only for
runOnWorktreeCreate; the fork has three lifecycle hooks. It now uses the
fork's clearConflictingLifecycleFlags, matching the chat header path.
- the empty-draft workspace reset lost the fork's reuseBaseBranch: false, so
a stale reuse flag survived a reset that clears everything else.
- ClaudeAdapter granted the raw input.cwd while the query runs in the
resolved cwd; the grant now names the same path.
- the script editor kept a delete confirm open across a request swap.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@patroza
patroza merged commit 0b23962 into fork/devAug 9, 2026
4 checks passed
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.

4 participants

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

merge: sync upstream through ba9c9ae81 (19 commits) - #383

Merged
patroza merged 21 commits into
fork/devfrom
sync/upstream-ba9c9ae81
Aug 9, 2026
Merged

merge: sync upstream through ba9c9ae81 (19 commits)#383
patroza merged 21 commits into
fork/devfrom
sync/upstream-ba9c9ae81

Conversation

@omegent-app

Copy link
Copy Markdown

Adopts upstream through ba9c9ae81 — the 19 commits that landed after 48aa875c0, headlined by
pingdotgg#5768 (project settings become a real settings page), pingdotgg#5766 (worktree or current checkout,
per project)
, pingdotgg#5777 (unsent drafts in the sidebar) and pingdotgg#5774 (settle stops monitors and dev
servers)
.

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
ba9c9ae81fix(server): one greedy agent process no longer takes down the whole server (pingdotgg#5788)
076e9048dfeat(web): project icons can be chosen manually (pingdotgg#5775)
05eb05118feat(web): keep unsent drafts one click away in the sidebar (pingdotgg#5777)
ddaa6afeffeat(server): vp run migrate-dev-db seeds worktree dev dbs with real data (pingdotgg#5773)
6f69b4407fix(web): sidebar rows show the branch again, not a truncated plan step (pingdotgg#5776)
6dbffa022feat: pick worktree or current checkout per project (pingdotgg#5766)
5bb8c0366fix(server): settle no longer leaves monitors and dev servers running (pingdotgg#5774)
886195ec1fix(web): usage totals no longer jump while devices report in (pingdotgg#5772)
288d8e345feat(web): overhaul project settings into a real settings page (pingdotgg#5768)
5208bdeb0fix(web): pinned reorder no longer reshuffles while writes land (pingdotgg#5767)
a6c9b41f9feat(server): agents can now open the images you paste into chat (pingdotgg#5757)
70c423a5efix(web): usage page loses the cost quality panel, gains a back button (pingdotgg#5756)
89c320df0fix(server): stop Codex threads with queued follow-ups (pingdotgg#5762)
e70cdb478fix(server): stop Claude resume handshakes from completing turns that never ran (pingdotgg#5710)
be01b287bfix(web): add missing cursor-pointer styling to dropdowns and buttons (pingdotgg#5716)
c2f8cb7cafeat(web): show how many subagents are running at a glance (pingdotgg#5745)
89ee692bffix(web): persist diff view mode (pingdotgg#5731)
7b2cf4374 · 49964e38cchore: vouch saphid / gfsaaser24 (the fork's .github/VOUCHED.td deletion stands)

Resolutions

15 conflicted files. What actually needed judgement:

WhereSituationResolution
ws.tsupstream pingdotgg#5774 stops the provider session when a thread parks; the fork's identity claim gate and stampOrchestrationCommandSource sit on the same dispatch, and the fork owns thread.unarchive worktree restorewoven: claim gate → source stamp → pre-stop read → dispatch → parking stop. Parking covers archive and settle; settle is gated onlyIfSettled so a re-engaged thread is not killed
ProjectScriptsControl.tsxupstream pingdotgg#5768 extracted the whole editor into projectScriptEditor.tsx; the fork had added two lifecycle hooks and a menu-label helper to the inline dialogupstream's extraction adopted; the fork's runOnWorktreeRemove / runOnPrMerged rebuilt inside the extracted dialog (type, empty input, hydration, submit, two switches) and projectScriptMenuLabel restored on the menu row
AssetAccess.tsfork's canonical-path + preview-type checks vs upstream's content-revisioned favicon filenames and 30-minute token bucketingboth — the auto-merge silently dropped upstream's revision block and bucketing; restored beside the fork's checks (5 upstream tests were failing on it)
Sidebar.tsxupstream added a drafts block and settled-tail paging to the row builder the fork rewroteunioned; the fork's appendRecencyRows grouping kept under upstream's draft-then-pinned ordering, and the duplicated SETTLED_TAIL_* consts collapsed onto the fork's Sidebar.logic exports
projector.tsupstream's new defaultThreadEnvMode and faviconPath land on a read model the fork moved to HashMapboth fields rebuilt on the fork's updateProject helper
useHandleNewThread.tsupstream extracted pickExplicitWorkspaceOptions and made the default-mode resolution asyncfork's reuseBaseBranch folded into the helper and into the reset gate
ClaudeAdapter.tsupstream pingdotgg#5757 grants the attachments dir; the fork passes a resolved cwd and a session environmentboth, with the grant naming the resolved cwd (see below)
decider.projectThreadEnvMode.test.tsupstream's new test indexes readModel.projects[0] — an array the fork replaced with a HashMapadapted via a local projectFromModel accessor rather than weakening the assertion
migration ledgersupstream added migrations 39/40, so five fork ledger tests asserted a stale tipfixed-size tail windows slid (not grown), keeping the upstream/fork ledger-separation assertions intact
Codex collab fixtureupstream's new queued-stop test drives a second sendTurn, which in the fork goes through turn/steer — a method the mock peer did not speakpeer taught turn/steer (+ a rejectSteer switch and a turn-start sidecar). Upstream's test sets rejectSteer so it still exercises the turn/start path its fix is about; a second fork test covers the accepted-steer path and asserts no second provider turn opens

Adversarial review

Both reviewers ran over the git show --cc resolution surface with the merged worktree available.
Between them they found four real welds and one nit. All are fixed in 885b287f2.

grok-4.5 — 2 HIGH, 2 MEDIUM, 2 LOW:

FindingDisposition
HIGH — mobile ProjectFavicon kept the fork's older loaded-URL set, orphaning upstream's projectFaviconCache module (request identity, memory-disk cache policy, recycling key). Its tests stayed green while nothing imported it — passing for the wrong reasonFixed. Upstream's component is a strict superset now that it carries faviconPath, so it is adopted wholesale
HIGH — upstream's new settings page enforces single-owner for runOnWorktreeCreate only; the fork has three lifecycle hooks. Two scripts could both claim runOnWorktreeRemove, and only the first would ever runFixed. Both write paths now use the fork's clearConflictingLifecycleFlags, matching the chat header
MEDIUM — empty-draft reset lost reuseBaseBranch: false, so a stale reuse flag survived a reset that clears branch, worktree, env mode and origin policyFixed (found independently by gpt-5.6-sol)
MEDIUMClaudeAdapter granted the raw input.cwd while the query runs in the resolved cwd, so the tool allowlist and the process cwd could disagreeFixed. The grant names the resolved cwd
LOW — the script editor kept a delete confirm open across a request swap, naming the previous scriptFixed
LOW — migration ledger tests only bumped tip expectationsNot a defect; verified the slid windows still assert ledger separation

gpt-5.6-sol — 1 HIGH, 1 MEDIUM:

FindingDisposition
HIGH — mobile can submit on a provisional workspace mode: buildPendingTask reads workspaceSelection?.mode ?? workspaceMode with no settle gate, so submitting before t3.json loads freezes local over a project that requires worktreeInherited from upstream, not fixed here. The line is byte-identical to HEAD^2 (pingdotgg#5766); the fork's resolution kept upstream's gate exactly where upstream put it. Worth a follow-up PR against the behaviour itself rather than a divergence smuggled into a sync
MEDIUMreuseBaseBranch: false dropped from the empty-draft resetFixed as above

Both independently confirmed the intentional keep/drop surface is coherent: ws.ts keeps the fork's
claim gate reachable while upstream's parking stop runs, the favicon path hint stays advisory
(server-side projection is authoritative), the extracted script editor carries all three fork
lifecycle hooks through hydration/import/submit, and no assertion was renamed or relaxed into
passing for an unrelated reason.

Verification

  • Recursive typecheck clean across all 17 packages.
  • 2,345 tests pass; the only failure is the pre-existing CodexTextGeneration launch-args one,
    which reproduces on unmerged fork/dev (this merge touches nothing under textGeneration/).
  • forkSurfaceExistence (the anti-stack-drop net) green at 17/17.
  • pnpm-lock.yaml regenerated rather than hand-merged.

Co-authored by @patroza

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

Leonel Rivasand others added 21 commits August 8, 2026 17:02
…#5745)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
… never ran (pingdotgg#5710)
Co-authored-by: t3-turbo-simulation <simulation@t3turbo.local>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…otgg#5768)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…tgg#5772)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…ep (pingdotgg#5776)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…data (pingdotgg#5773)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…g#5777)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…server (pingdotgg#5788)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Adopts the 19 upstream commits that landed after 48aa875, headlined by the
project settings overhaul (pingdotgg#5768), per-project worktree/checkout selection
(pingdotgg#5766), sidebar drafts (pingdotgg#5777), manual project icons (pingdotgg#5775) and settle no
longer leaving monitors and dev servers running (pingdotgg#5774).
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
- mobile ProjectFavicon kept the fork's older loaded-URL set and orphaned
upstream's projectFaviconCache module (request identity, disk cache,
recycling key). Upstream's component is a strict superset now that it
carries faviconPath, so it is adopted wholesale.
- upstream's new project settings page enforced single-owner only for
runOnWorktreeCreate; the fork has three lifecycle hooks. It now uses the
fork's clearConflictingLifecycleFlags, matching the chat header path.
- the empty-draft workspace reset lost the fork's reuseBaseBranch: false, so
a stale reuse flag survived a reset that clears everything else.
- ClaudeAdapter granted the raw input.cwd while the query runs in the
resolved cwd; the grant now names the same path.
- the script editor kept a delete confirm open across a request swap.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@patroza
patroza merged commit 0b23962 into fork/devAug 9, 2026
4 checks passed
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.

4 participants

@patroza@t3dotgg@naMqe-h@gfsaaser24