Merge upstream/main into fork/dev (14 commits) - #400

Merged
omegent-app[bot] merged 16 commits into
fork/devfrom
sync/upstream-2026-08-12b
Aug 13, 2026
Merged

Merge upstream/main into fork/dev (14 commits)#400
omegent-app[bot] merged 16 commits into
fork/devfrom
sync/upstream-2026-08-12b

Conversation

@omegent-app

Copy link
Copy Markdown

14 upstream commits. Six conflicts, resolved by hand; two adversarial reviews (grok-4.6, gpt-5.6-sol) then found the merge had welded two of them incompletely, fixed in the follow-up commit.

Notable incoming work: the pull request surfaces overhaul (#6039 — filters and qualifiers, all-server listing, update branch, reactions, in-place editing), T3 Connect environment deregistration (#4844), project favicons in command subtitles (#6330), and PR links that honour modifier-clicks (#6278, #6378).

Conflicts

LegacySidebar.tsx — the interesting one. Upstream reworked the PR status badge from a <button> into a real <a href> so cmd/middle-click opens the PR in the browser. The fork had already replaced that icon badge with a numeric #1234 one, so taking upstream's block verbatim would have rendered two badges per row. Upstream's block is dropped and its anchor behaviour ported onto the fork's badge — which the merged handlePrClick requires anyway, since its event type became MouseEvent<HTMLAnchorElement>.

Sidebar.logic.ts / .test.ts — both sides added independent functions and describe blocks around a shared closing brace. Unioned, with the fork's block closed explicitly so nothing ends up nested (135 it( blocks before and after).

CommandPalette.logic.ts — unioned both Pick<> field lists: the fork's originSource / participantSummaries with upstream's modelSelection / session / worktreePath.

remote-access.md kept both new sections; mobile-showcase-environment.ts took upstream's added schema-wait helpers.

What review caught

  • A dead helper. The showcase script kept upstream's waitForSeedableSchema but lost its call site to an auto-merge — the classic weld failure. That restored the exact startup race upstream added it for: the server listens before it finishes migrating, so seeding could hit a column that doesn't exist yet. Call site restored.
  • A fork lint rule upstream does not have. Upstream's new helper sleeps with a global setTimeout; the fork's Effect diagnostics reject that in scripts/. Opted out at the file header the way its sibling mobile-showcase.ts already does, rather than rewriting upstream's helper.
  • fix(web): cmd+click sidebar PR numbers open in the browser pingdotgg/t3code#6378 half-applied. The fork's second numeric badge, in Recent Threads, was still a button. useOpenPrLink only leaves the native default alone for an anchor with an href, so middle-click and "open in new tab" did nothing there while working on project rows. Now the same anchor — and that conversion needs upstream's nested-link guard, which the recents row handler never had: without it a modifier-click on the badge would open the PR and toggle the row's selection.

Known, not changed

Upstream's new command-subtitle maps key project metadata by ProjectId alone, ignoring environmentId. In this fork projects come from every connected environment, so two environments sharing a ProjectId would cross their cwd/favicon/title. ProjectId is a random UUID per environment, so that needs a collision or a copied state.sqlite — worth a follow-up, not worth restructuring upstream's new code inside a sync.

Verification

pnpm typecheck (18 packages) · pnpm test272 files, 0 failures · vp build in apps/web · vp check --fix · forkSurfaceExistence (the anti-stack-drop net) green.

Co-authored-by: Patrick Roza 42661+patroza@users.noreply.github.com

🤖 Generated with Claude Code via T3 Chat on Discord

t3-codeBotand others added 16 commits August 12, 2026 14:32
Co-authored-by: t3-code[bot] <219304759+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
…otgg#4844)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>
…isting, update branch, reactions, in-place editing, smarter diffs (pingdotgg#6039)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
…6393)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…tgg#6423)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
14 upstream commits, six conflicts. Notable incoming work: the pull request
surfaces overhaul (pingdotgg#6039), T3 Connect environment deregistration (pingdotgg#4844),
project favicons in command subtitles (pingdotgg#6330), and PR links that honour
modifier-clicks (pingdotgg#6278, pingdotgg#6378).
Resolutions:
- LegacySidebar: upstream reworked the PR badge from a button into a real
anchor so cmd/middle-click opens the PR in the browser. The fork had already
replaced that icon badge with a numeric one, so taking upstream's block
verbatim would have rendered two badges per row. Upstream's block is dropped
and its anchor behaviour ported onto the fork's numeric badge — which the
merged `handlePrClick` now requires anyway, since its event type became
MouseEvent<HTMLAnchorElement>.
- Sidebar.logic(.test): both sides added independent functions and describe
blocks around a shared closing brace; unioned, with the fork's block closed
explicitly so nothing ends up nested.
- CommandPalette.logic: unioned both Pick<> field lists (fork's originSource /
participantSummaries with upstream's modelSelection / session / worktreePath).
- remote-access.md: kept both new sections.
- mobile-showcase-environment: took upstream's added schema-wait helpers.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
…dges
Two adversarial reviews of the merge found the port was incomplete.
The showcase script kept upstream's `waitForSeedableSchema` helpers but lost
its call site to an auto-merge, leaving them dead and restoring the startup
race they were added for: the environment server listens before it finishes
migrating, so seeding could hit a table or column that does not exist yet.
The fork's second numeric PR badge, in Recent Threads, was still a button.
`useOpenPrLink` only leaves the native default alone for an anchor with an
href, so middle-click and "open in new tab" did nothing there while working on
the project rows — upstream's pingdotgg#6378 half-applied. It is now the same anchor.
That conversion needs upstream's nested-link guard, which the recents row
handler never had: without it a modifier-click on the badge would open the pull
request *and* toggle the row's selection.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@omegent-app
omegent-appBot merged commit 0bf7835 into fork/devAug 13, 2026
5 checks passed
@omegent-app
omegent-appBot deleted the sync/upstream-2026-08-12b branch August 13, 2026 05:46
omegent-appBot added a commit that referenced this pull request Aug 15, 2026
#401 was squash-merged. That kept the code and threw the lineage away:
the 23 upstream commits stopped being ancestors, so `fork/dev` read as
**29 commits behind upstream when only 6 were genuinely outstanding**,
and the next sync would have re-merged and re-resolved all 23 — on the
same mobile files that took sixteen conflicts to land the first time.
Nobody noticed for two merges. It surfaced in a deploy alert that said
**"Commits (2)"** for a range that had carried 23.
## What this adds
A `push`-triggered check on `fork/dev` that fails when a commit which
carried a sync has fewer than two parents, and prints the `-s ours`
repair in the log.
Sync commits are identified by **the head branch of the PR they came
from**, not by their subject, because subjects vary by merge method:
```
Merge pull request #400 from patroza/sync/upstream-2026-08-12b
Merge upstream/main into fork/dev (23 commits) (#401)
merge: sync upstream through b73232b
```
A merge-button commit names the branch inline, so no API call is needed;
squash and rebase commits are resolved through the API, with the subject
line as a fallback when that is unavailable. **Ordinary fork PRs are
untouched** — they are expected to squash, and are never checked.
## Verified against the real commits
| commit | what it is | result |
|---|---|---|
| `5e63531b1` | #401, squash-merged sync | **fails**, exit 1 |
| `0bf7835cc` | #400, sync merged properly | recognised as a sync,
passes (2 parents) |
| `a76069bd9` | #402, an ordinary squashed PR | not flagged |
The third row is the one that matters most: the guard has to stay silent
on your normal workflow.
## This detects, it does not prevent
Worth being explicit, since it was the first question asked: **clicking
merge does not fail.** The check runs after the merge lands, because
GitHub has no per-PR merge-method control, and a repository-wide setting
cannot allow squash for ordinary fork PRs while requiring a merge commit
for syncs. Squash merges do fire `push` — `5e63531b1` triggered Fork CI
at 08:08 — so this turns a silent, weeks-later discovery into a red
check within a minute.
Actual prevention is `gh pr merge <n> --merge`, which is how #398, #399
and #400 all landed correctly. That is now written into the sync runbook
in `AGENTS.md`.
If you would rather it be enforced at the button, the next step is a
`sync:upstream` label workflow that merges the PR through the API once
checks pass — say the word and I will add it.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code) via [T3
Chat](https://t3.chat) on Discord
---------
Co-authored-by: omegent-app[bot] <306514130+omegent-app[bot]@users.noreply.github.com>
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

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

Merge upstream/main into fork/dev (14 commits) - #400

Merged
omegent-app[bot] merged 16 commits into
fork/devfrom
sync/upstream-2026-08-12b
Aug 13, 2026
Merged

Merge upstream/main into fork/dev (14 commits)#400
omegent-app[bot] merged 16 commits into
fork/devfrom
sync/upstream-2026-08-12b

Conversation

@omegent-app

Copy link
Copy Markdown

14 upstream commits. Six conflicts, resolved by hand; two adversarial reviews (grok-4.6, gpt-5.6-sol) then found the merge had welded two of them incompletely, fixed in the follow-up commit.

Notable incoming work: the pull request surfaces overhaul (#6039 — filters and qualifiers, all-server listing, update branch, reactions, in-place editing), T3 Connect environment deregistration (#4844), project favicons in command subtitles (#6330), and PR links that honour modifier-clicks (#6278, #6378).

Conflicts

LegacySidebar.tsx — the interesting one. Upstream reworked the PR status badge from a <button> into a real <a href> so cmd/middle-click opens the PR in the browser. The fork had already replaced that icon badge with a numeric #1234 one, so taking upstream's block verbatim would have rendered two badges per row. Upstream's block is dropped and its anchor behaviour ported onto the fork's badge — which the merged handlePrClick requires anyway, since its event type became MouseEvent<HTMLAnchorElement>.

Sidebar.logic.ts / .test.ts — both sides added independent functions and describe blocks around a shared closing brace. Unioned, with the fork's block closed explicitly so nothing ends up nested (135 it( blocks before and after).

CommandPalette.logic.ts — unioned both Pick<> field lists: the fork's originSource / participantSummaries with upstream's modelSelection / session / worktreePath.

remote-access.md kept both new sections; mobile-showcase-environment.ts took upstream's added schema-wait helpers.

What review caught

  • A dead helper. The showcase script kept upstream's waitForSeedableSchema but lost its call site to an auto-merge — the classic weld failure. That restored the exact startup race upstream added it for: the server listens before it finishes migrating, so seeding could hit a column that doesn't exist yet. Call site restored.
  • A fork lint rule upstream does not have. Upstream's new helper sleeps with a global setTimeout; the fork's Effect diagnostics reject that in scripts/. Opted out at the file header the way its sibling mobile-showcase.ts already does, rather than rewriting upstream's helper.
  • fix(web): cmd+click sidebar PR numbers open in the browser pingdotgg/t3code#6378 half-applied. The fork's second numeric badge, in Recent Threads, was still a button. useOpenPrLink only leaves the native default alone for an anchor with an href, so middle-click and "open in new tab" did nothing there while working on project rows. Now the same anchor — and that conversion needs upstream's nested-link guard, which the recents row handler never had: without it a modifier-click on the badge would open the PR and toggle the row's selection.

Known, not changed

Upstream's new command-subtitle maps key project metadata by ProjectId alone, ignoring environmentId. In this fork projects come from every connected environment, so two environments sharing a ProjectId would cross their cwd/favicon/title. ProjectId is a random UUID per environment, so that needs a collision or a copied state.sqlite — worth a follow-up, not worth restructuring upstream's new code inside a sync.

Verification

pnpm typecheck (18 packages) · pnpm test272 files, 0 failures · vp build in apps/web · vp check --fix · forkSurfaceExistence (the anti-stack-drop net) green.

Co-authored-by: Patrick Roza 42661+patroza@users.noreply.github.com

🤖 Generated with Claude Code via T3 Chat on Discord

t3-codeBotand others added 16 commits August 12, 2026 14:32
Co-authored-by: t3-code[bot] <219304759+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
…otgg#4844)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>
…isting, update branch, reactions, in-place editing, smarter diffs (pingdotgg#6039)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
…6393)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…tgg#6423)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
14 upstream commits, six conflicts. Notable incoming work: the pull request
surfaces overhaul (pingdotgg#6039), T3 Connect environment deregistration (pingdotgg#4844),
project favicons in command subtitles (pingdotgg#6330), and PR links that honour
modifier-clicks (pingdotgg#6278, pingdotgg#6378).
Resolutions:
- LegacySidebar: upstream reworked the PR badge from a button into a real
anchor so cmd/middle-click opens the PR in the browser. The fork had already
replaced that icon badge with a numeric one, so taking upstream's block
verbatim would have rendered two badges per row. Upstream's block is dropped
and its anchor behaviour ported onto the fork's numeric badge — which the
merged `handlePrClick` now requires anyway, since its event type became
MouseEvent<HTMLAnchorElement>.
- Sidebar.logic(.test): both sides added independent functions and describe
blocks around a shared closing brace; unioned, with the fork's block closed
explicitly so nothing ends up nested.
- CommandPalette.logic: unioned both Pick<> field lists (fork's originSource /
participantSummaries with upstream's modelSelection / session / worktreePath).
- remote-access.md: kept both new sections.
- mobile-showcase-environment: took upstream's added schema-wait helpers.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
…dges
Two adversarial reviews of the merge found the port was incomplete.
The showcase script kept upstream's `waitForSeedableSchema` helpers but lost
its call site to an auto-merge, leaving them dead and restoring the startup
race they were added for: the environment server listens before it finishes
migrating, so seeding could hit a table or column that does not exist yet.
The fork's second numeric PR badge, in Recent Threads, was still a button.
`useOpenPrLink` only leaves the native default alone for an anchor with an
href, so middle-click and "open in new tab" did nothing there while working on
the project rows — upstream's pingdotgg#6378 half-applied. It is now the same anchor.
That conversion needs upstream's nested-link guard, which the recents row
handler never had: without it a modifier-click on the badge would open the pull
request *and* toggle the row's selection.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@omegent-app
omegent-appBot merged commit 0bf7835 into fork/devAug 13, 2026
5 checks passed
@omegent-app
omegent-appBot deleted the sync/upstream-2026-08-12b branch August 13, 2026 05:46
omegent-appBot added a commit that referenced this pull request Aug 15, 2026
#401 was squash-merged. That kept the code and threw the lineage away:
the 23 upstream commits stopped being ancestors, so `fork/dev` read as
**29 commits behind upstream when only 6 were genuinely outstanding**,
and the next sync would have re-merged and re-resolved all 23 — on the
same mobile files that took sixteen conflicts to land the first time.
Nobody noticed for two merges. It surfaced in a deploy alert that said
**"Commits (2)"** for a range that had carried 23.
## What this adds
A `push`-triggered check on `fork/dev` that fails when a commit which
carried a sync has fewer than two parents, and prints the `-s ours`
repair in the log.
Sync commits are identified by **the head branch of the PR they came
from**, not by their subject, because subjects vary by merge method:
```
Merge pull request #400 from patroza/sync/upstream-2026-08-12b
Merge upstream/main into fork/dev (23 commits) (#401)
merge: sync upstream through b73232b
```
A merge-button commit names the branch inline, so no API call is needed;
squash and rebase commits are resolved through the API, with the subject
line as a fallback when that is unavailable. **Ordinary fork PRs are
untouched** — they are expected to squash, and are never checked.
## Verified against the real commits
| commit | what it is | result |
|---|---|---|
| `5e63531b1` | #401, squash-merged sync | **fails**, exit 1 |
| `0bf7835cc` | #400, sync merged properly | recognised as a sync,
passes (2 parents) |
| `a76069bd9` | #402, an ordinary squashed PR | not flagged |
The third row is the one that matters most: the guard has to stay silent
on your normal workflow.
## This detects, it does not prevent
Worth being explicit, since it was the first question asked: **clicking
merge does not fail.** The check runs after the merge lands, because
GitHub has no per-PR merge-method control, and a repository-wide setting
cannot allow squash for ordinary fork PRs while requiring a merge commit
for syncs. Squash merges do fire `push` — `5e63531b1` triggered Fork CI
at 08:08 — so this turns a silent, weeks-later discovery into a red
check within a minute.
Actual prevention is `gh pr merge <n> --merge`, which is how #398, #399
and #400 all landed correctly. That is now written into the sync runbook
in `AGENTS.md`.
If you would rather it be enforced at the button, the next step is a
`sync:upstream` label workflow that merges the PR through the API once
checks pass — say the word and I will add it.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code) via [T3
Chat](https://t3.chat) on Discord
---------
Co-authored-by: omegent-app[bot] <306514130+omegent-app[bot]@users.noreply.github.com>
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

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

Merge upstream/main into fork/dev (14 commits) - #400

Merged
omegent-app[bot] merged 16 commits into
fork/devfrom
sync/upstream-2026-08-12b
Aug 13, 2026
Merged

Merge upstream/main into fork/dev (14 commits)#400
omegent-app[bot] merged 16 commits into
fork/devfrom
sync/upstream-2026-08-12b

Conversation

@omegent-app

Copy link
Copy Markdown

14 upstream commits. Six conflicts, resolved by hand; two adversarial reviews (grok-4.6, gpt-5.6-sol) then found the merge had welded two of them incompletely, fixed in the follow-up commit.

Notable incoming work: the pull request surfaces overhaul (#6039 — filters and qualifiers, all-server listing, update branch, reactions, in-place editing), T3 Connect environment deregistration (#4844), project favicons in command subtitles (#6330), and PR links that honour modifier-clicks (#6278, #6378).

Conflicts

LegacySidebar.tsx — the interesting one. Upstream reworked the PR status badge from a <button> into a real <a href> so cmd/middle-click opens the PR in the browser. The fork had already replaced that icon badge with a numeric #1234 one, so taking upstream's block verbatim would have rendered two badges per row. Upstream's block is dropped and its anchor behaviour ported onto the fork's badge — which the merged handlePrClick requires anyway, since its event type became MouseEvent<HTMLAnchorElement>.

Sidebar.logic.ts / .test.ts — both sides added independent functions and describe blocks around a shared closing brace. Unioned, with the fork's block closed explicitly so nothing ends up nested (135 it( blocks before and after).

CommandPalette.logic.ts — unioned both Pick<> field lists: the fork's originSource / participantSummaries with upstream's modelSelection / session / worktreePath.

remote-access.md kept both new sections; mobile-showcase-environment.ts took upstream's added schema-wait helpers.

What review caught

  • A dead helper. The showcase script kept upstream's waitForSeedableSchema but lost its call site to an auto-merge — the classic weld failure. That restored the exact startup race upstream added it for: the server listens before it finishes migrating, so seeding could hit a column that doesn't exist yet. Call site restored.
  • A fork lint rule upstream does not have. Upstream's new helper sleeps with a global setTimeout; the fork's Effect diagnostics reject that in scripts/. Opted out at the file header the way its sibling mobile-showcase.ts already does, rather than rewriting upstream's helper.
  • fix(web): cmd+click sidebar PR numbers open in the browser pingdotgg/t3code#6378 half-applied. The fork's second numeric badge, in Recent Threads, was still a button. useOpenPrLink only leaves the native default alone for an anchor with an href, so middle-click and "open in new tab" did nothing there while working on project rows. Now the same anchor — and that conversion needs upstream's nested-link guard, which the recents row handler never had: without it a modifier-click on the badge would open the PR and toggle the row's selection.

Known, not changed

Upstream's new command-subtitle maps key project metadata by ProjectId alone, ignoring environmentId. In this fork projects come from every connected environment, so two environments sharing a ProjectId would cross their cwd/favicon/title. ProjectId is a random UUID per environment, so that needs a collision or a copied state.sqlite — worth a follow-up, not worth restructuring upstream's new code inside a sync.

Verification

pnpm typecheck (18 packages) · pnpm test272 files, 0 failures · vp build in apps/web · vp check --fix · forkSurfaceExistence (the anti-stack-drop net) green.

Co-authored-by: Patrick Roza 42661+patroza@users.noreply.github.com

🤖 Generated with Claude Code via T3 Chat on Discord

t3-codeBotand others added 16 commits August 12, 2026 14:32
Co-authored-by: t3-code[bot] <219304759+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
…otgg#4844)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>
…isting, update branch, reactions, in-place editing, smarter diffs (pingdotgg#6039)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
…6393)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…tgg#6423)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
14 upstream commits, six conflicts. Notable incoming work: the pull request
surfaces overhaul (pingdotgg#6039), T3 Connect environment deregistration (pingdotgg#4844),
project favicons in command subtitles (pingdotgg#6330), and PR links that honour
modifier-clicks (pingdotgg#6278, pingdotgg#6378).
Resolutions:
- LegacySidebar: upstream reworked the PR badge from a button into a real
anchor so cmd/middle-click opens the PR in the browser. The fork had already
replaced that icon badge with a numeric one, so taking upstream's block
verbatim would have rendered two badges per row. Upstream's block is dropped
and its anchor behaviour ported onto the fork's numeric badge — which the
merged `handlePrClick` now requires anyway, since its event type became
MouseEvent<HTMLAnchorElement>.
- Sidebar.logic(.test): both sides added independent functions and describe
blocks around a shared closing brace; unioned, with the fork's block closed
explicitly so nothing ends up nested.
- CommandPalette.logic: unioned both Pick<> field lists (fork's originSource /
participantSummaries with upstream's modelSelection / session / worktreePath).
- remote-access.md: kept both new sections.
- mobile-showcase-environment: took upstream's added schema-wait helpers.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
…dges
Two adversarial reviews of the merge found the port was incomplete.
The showcase script kept upstream's `waitForSeedableSchema` helpers but lost
its call site to an auto-merge, leaving them dead and restoring the startup
race they were added for: the environment server listens before it finishes
migrating, so seeding could hit a table or column that does not exist yet.
The fork's second numeric PR badge, in Recent Threads, was still a button.
`useOpenPrLink` only leaves the native default alone for an anchor with an
href, so middle-click and "open in new tab" did nothing there while working on
the project rows — upstream's pingdotgg#6378 half-applied. It is now the same anchor.
That conversion needs upstream's nested-link guard, which the recents row
handler never had: without it a modifier-click on the badge would open the pull
request *and* toggle the row's selection.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@omegent-app
omegent-appBot merged commit 0bf7835 into fork/devAug 13, 2026
5 checks passed
@omegent-app
omegent-appBot deleted the sync/upstream-2026-08-12b branch August 13, 2026 05:46
omegent-appBot added a commit that referenced this pull request Aug 15, 2026
#401 was squash-merged. That kept the code and threw the lineage away:
the 23 upstream commits stopped being ancestors, so `fork/dev` read as
**29 commits behind upstream when only 6 were genuinely outstanding**,
and the next sync would have re-merged and re-resolved all 23 — on the
same mobile files that took sixteen conflicts to land the first time.
Nobody noticed for two merges. It surfaced in a deploy alert that said
**"Commits (2)"** for a range that had carried 23.
## What this adds
A `push`-triggered check on `fork/dev` that fails when a commit which
carried a sync has fewer than two parents, and prints the `-s ours`
repair in the log.
Sync commits are identified by **the head branch of the PR they came
from**, not by their subject, because subjects vary by merge method:
```
Merge pull request #400 from patroza/sync/upstream-2026-08-12b
Merge upstream/main into fork/dev (23 commits) (#401)
merge: sync upstream through b73232b
```
A merge-button commit names the branch inline, so no API call is needed;
squash and rebase commits are resolved through the API, with the subject
line as a fallback when that is unavailable. **Ordinary fork PRs are
untouched** — they are expected to squash, and are never checked.
## Verified against the real commits
| commit | what it is | result |
|---|---|---|
| `5e63531b1` | #401, squash-merged sync | **fails**, exit 1 |
| `0bf7835cc` | #400, sync merged properly | recognised as a sync,
passes (2 parents) |
| `a76069bd9` | #402, an ordinary squashed PR | not flagged |
The third row is the one that matters most: the guard has to stay silent
on your normal workflow.
## This detects, it does not prevent
Worth being explicit, since it was the first question asked: **clicking
merge does not fail.** The check runs after the merge lands, because
GitHub has no per-PR merge-method control, and a repository-wide setting
cannot allow squash for ordinary fork PRs while requiring a merge commit
for syncs. Squash merges do fire `push` — `5e63531b1` triggered Fork CI
at 08:08 — so this turns a silent, weeks-later discovery into a red
check within a minute.
Actual prevention is `gh pr merge <n> --merge`, which is how #398, #399
and #400 all landed correctly. That is now written into the sync runbook
in `AGENTS.md`.
If you would rather it be enforced at the button, the next step is a
`sync:upstream` label workflow that merges the PR through the API once
checks pass — say the word and I will add it.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code) via [T3
Chat](https://t3.chat) on Discord
---------
Co-authored-by: omegent-app[bot] <306514130+omegent-app[bot]@users.noreply.github.com>
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

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

Merge upstream/main into fork/dev (14 commits) - #400

Merged
omegent-app[bot] merged 16 commits into
fork/devfrom
sync/upstream-2026-08-12b
Aug 13, 2026
Merged

Merge upstream/main into fork/dev (14 commits)#400
omegent-app[bot] merged 16 commits into
fork/devfrom
sync/upstream-2026-08-12b

Conversation

@omegent-app

Copy link
Copy Markdown

14 upstream commits. Six conflicts, resolved by hand; two adversarial reviews (grok-4.6, gpt-5.6-sol) then found the merge had welded two of them incompletely, fixed in the follow-up commit.

Notable incoming work: the pull request surfaces overhaul (#6039 — filters and qualifiers, all-server listing, update branch, reactions, in-place editing), T3 Connect environment deregistration (#4844), project favicons in command subtitles (#6330), and PR links that honour modifier-clicks (#6278, #6378).

Conflicts

LegacySidebar.tsx — the interesting one. Upstream reworked the PR status badge from a <button> into a real <a href> so cmd/middle-click opens the PR in the browser. The fork had already replaced that icon badge with a numeric #1234 one, so taking upstream's block verbatim would have rendered two badges per row. Upstream's block is dropped and its anchor behaviour ported onto the fork's badge — which the merged handlePrClick requires anyway, since its event type became MouseEvent<HTMLAnchorElement>.

Sidebar.logic.ts / .test.ts — both sides added independent functions and describe blocks around a shared closing brace. Unioned, with the fork's block closed explicitly so nothing ends up nested (135 it( blocks before and after).

CommandPalette.logic.ts — unioned both Pick<> field lists: the fork's originSource / participantSummaries with upstream's modelSelection / session / worktreePath.

remote-access.md kept both new sections; mobile-showcase-environment.ts took upstream's added schema-wait helpers.

What review caught

  • A dead helper. The showcase script kept upstream's waitForSeedableSchema but lost its call site to an auto-merge — the classic weld failure. That restored the exact startup race upstream added it for: the server listens before it finishes migrating, so seeding could hit a column that doesn't exist yet. Call site restored.
  • A fork lint rule upstream does not have. Upstream's new helper sleeps with a global setTimeout; the fork's Effect diagnostics reject that in scripts/. Opted out at the file header the way its sibling mobile-showcase.ts already does, rather than rewriting upstream's helper.
  • fix(web): cmd+click sidebar PR numbers open in the browser pingdotgg/t3code#6378 half-applied. The fork's second numeric badge, in Recent Threads, was still a button. useOpenPrLink only leaves the native default alone for an anchor with an href, so middle-click and "open in new tab" did nothing there while working on project rows. Now the same anchor — and that conversion needs upstream's nested-link guard, which the recents row handler never had: without it a modifier-click on the badge would open the PR and toggle the row's selection.

Known, not changed

Upstream's new command-subtitle maps key project metadata by ProjectId alone, ignoring environmentId. In this fork projects come from every connected environment, so two environments sharing a ProjectId would cross their cwd/favicon/title. ProjectId is a random UUID per environment, so that needs a collision or a copied state.sqlite — worth a follow-up, not worth restructuring upstream's new code inside a sync.

Verification

pnpm typecheck (18 packages) · pnpm test272 files, 0 failures · vp build in apps/web · vp check --fix · forkSurfaceExistence (the anti-stack-drop net) green.

Co-authored-by: Patrick Roza 42661+patroza@users.noreply.github.com

🤖 Generated with Claude Code via T3 Chat on Discord

t3-codeBotand others added 16 commits August 12, 2026 14:32
Co-authored-by: t3-code[bot] <219304759+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
…otgg#4844)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>
…isting, update branch, reactions, in-place editing, smarter diffs (pingdotgg#6039)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
…6393)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…tgg#6423)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
14 upstream commits, six conflicts. Notable incoming work: the pull request
surfaces overhaul (pingdotgg#6039), T3 Connect environment deregistration (pingdotgg#4844),
project favicons in command subtitles (pingdotgg#6330), and PR links that honour
modifier-clicks (pingdotgg#6278, pingdotgg#6378).
Resolutions:
- LegacySidebar: upstream reworked the PR badge from a button into a real
anchor so cmd/middle-click opens the PR in the browser. The fork had already
replaced that icon badge with a numeric one, so taking upstream's block
verbatim would have rendered two badges per row. Upstream's block is dropped
and its anchor behaviour ported onto the fork's numeric badge — which the
merged `handlePrClick` now requires anyway, since its event type became
MouseEvent<HTMLAnchorElement>.
- Sidebar.logic(.test): both sides added independent functions and describe
blocks around a shared closing brace; unioned, with the fork's block closed
explicitly so nothing ends up nested.
- CommandPalette.logic: unioned both Pick<> field lists (fork's originSource /
participantSummaries with upstream's modelSelection / session / worktreePath).
- remote-access.md: kept both new sections.
- mobile-showcase-environment: took upstream's added schema-wait helpers.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
…dges
Two adversarial reviews of the merge found the port was incomplete.
The showcase script kept upstream's `waitForSeedableSchema` helpers but lost
its call site to an auto-merge, leaving them dead and restoring the startup
race they were added for: the environment server listens before it finishes
migrating, so seeding could hit a table or column that does not exist yet.
The fork's second numeric PR badge, in Recent Threads, was still a button.
`useOpenPrLink` only leaves the native default alone for an anchor with an
href, so middle-click and "open in new tab" did nothing there while working on
the project rows — upstream's pingdotgg#6378 half-applied. It is now the same anchor.
That conversion needs upstream's nested-link guard, which the recents row
handler never had: without it a modifier-click on the badge would open the pull
request *and* toggle the row's selection.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@omegent-app
omegent-appBot merged commit 0bf7835 into fork/devAug 13, 2026
5 checks passed
@omegent-app
omegent-appBot deleted the sync/upstream-2026-08-12b branch August 13, 2026 05:46
omegent-appBot added a commit that referenced this pull request Aug 15, 2026
#401 was squash-merged. That kept the code and threw the lineage away:
the 23 upstream commits stopped being ancestors, so `fork/dev` read as
**29 commits behind upstream when only 6 were genuinely outstanding**,
and the next sync would have re-merged and re-resolved all 23 — on the
same mobile files that took sixteen conflicts to land the first time.
Nobody noticed for two merges. It surfaced in a deploy alert that said
**"Commits (2)"** for a range that had carried 23.
## What this adds
A `push`-triggered check on `fork/dev` that fails when a commit which
carried a sync has fewer than two parents, and prints the `-s ours`
repair in the log.
Sync commits are identified by **the head branch of the PR they came
from**, not by their subject, because subjects vary by merge method:
```
Merge pull request #400 from patroza/sync/upstream-2026-08-12b
Merge upstream/main into fork/dev (23 commits) (#401)
merge: sync upstream through b73232b
```
A merge-button commit names the branch inline, so no API call is needed;
squash and rebase commits are resolved through the API, with the subject
line as a fallback when that is unavailable. **Ordinary fork PRs are
untouched** — they are expected to squash, and are never checked.
## Verified against the real commits
| commit | what it is | result |
|---|---|---|
| `5e63531b1` | #401, squash-merged sync | **fails**, exit 1 |
| `0bf7835cc` | #400, sync merged properly | recognised as a sync,
passes (2 parents) |
| `a76069bd9` | #402, an ordinary squashed PR | not flagged |
The third row is the one that matters most: the guard has to stay silent
on your normal workflow.
## This detects, it does not prevent
Worth being explicit, since it was the first question asked: **clicking
merge does not fail.** The check runs after the merge lands, because
GitHub has no per-PR merge-method control, and a repository-wide setting
cannot allow squash for ordinary fork PRs while requiring a merge commit
for syncs. Squash merges do fire `push` — `5e63531b1` triggered Fork CI
at 08:08 — so this turns a silent, weeks-later discovery into a red
check within a minute.
Actual prevention is `gh pr merge <n> --merge`, which is how #398, #399
and #400 all landed correctly. That is now written into the sync runbook
in `AGENTS.md`.
If you would rather it be enforced at the button, the next step is a
`sync:upstream` label workflow that merges the PR through the API once
checks pass — say the word and I will add it.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code) via [T3
Chat](https://t3.chat) on Discord
---------
Co-authored-by: omegent-app[bot] <306514130+omegent-app[bot]@users.noreply.github.com>
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

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

Merge upstream/main into fork/dev (14 commits) - #400

Merged
omegent-app[bot] merged 16 commits into
fork/devfrom
sync/upstream-2026-08-12b
Aug 13, 2026
Merged

Merge upstream/main into fork/dev (14 commits)#400
omegent-app[bot] merged 16 commits into
fork/devfrom
sync/upstream-2026-08-12b

Conversation

@omegent-app

Copy link
Copy Markdown

14 upstream commits. Six conflicts, resolved by hand; two adversarial reviews (grok-4.6, gpt-5.6-sol) then found the merge had welded two of them incompletely, fixed in the follow-up commit.

Notable incoming work: the pull request surfaces overhaul (#6039 — filters and qualifiers, all-server listing, update branch, reactions, in-place editing), T3 Connect environment deregistration (#4844), project favicons in command subtitles (#6330), and PR links that honour modifier-clicks (#6278, #6378).

Conflicts

LegacySidebar.tsx — the interesting one. Upstream reworked the PR status badge from a <button> into a real <a href> so cmd/middle-click opens the PR in the browser. The fork had already replaced that icon badge with a numeric #1234 one, so taking upstream's block verbatim would have rendered two badges per row. Upstream's block is dropped and its anchor behaviour ported onto the fork's badge — which the merged handlePrClick requires anyway, since its event type became MouseEvent<HTMLAnchorElement>.

Sidebar.logic.ts / .test.ts — both sides added independent functions and describe blocks around a shared closing brace. Unioned, with the fork's block closed explicitly so nothing ends up nested (135 it( blocks before and after).

CommandPalette.logic.ts — unioned both Pick<> field lists: the fork's originSource / participantSummaries with upstream's modelSelection / session / worktreePath.

remote-access.md kept both new sections; mobile-showcase-environment.ts took upstream's added schema-wait helpers.

What review caught

  • A dead helper. The showcase script kept upstream's waitForSeedableSchema but lost its call site to an auto-merge — the classic weld failure. That restored the exact startup race upstream added it for: the server listens before it finishes migrating, so seeding could hit a column that doesn't exist yet. Call site restored.
  • A fork lint rule upstream does not have. Upstream's new helper sleeps with a global setTimeout; the fork's Effect diagnostics reject that in scripts/. Opted out at the file header the way its sibling mobile-showcase.ts already does, rather than rewriting upstream's helper.
  • fix(web): cmd+click sidebar PR numbers open in the browser pingdotgg/t3code#6378 half-applied. The fork's second numeric badge, in Recent Threads, was still a button. useOpenPrLink only leaves the native default alone for an anchor with an href, so middle-click and "open in new tab" did nothing there while working on project rows. Now the same anchor — and that conversion needs upstream's nested-link guard, which the recents row handler never had: without it a modifier-click on the badge would open the PR and toggle the row's selection.

Known, not changed

Upstream's new command-subtitle maps key project metadata by ProjectId alone, ignoring environmentId. In this fork projects come from every connected environment, so two environments sharing a ProjectId would cross their cwd/favicon/title. ProjectId is a random UUID per environment, so that needs a collision or a copied state.sqlite — worth a follow-up, not worth restructuring upstream's new code inside a sync.

Verification

pnpm typecheck (18 packages) · pnpm test272 files, 0 failures · vp build in apps/web · vp check --fix · forkSurfaceExistence (the anti-stack-drop net) green.

Co-authored-by: Patrick Roza 42661+patroza@users.noreply.github.com

🤖 Generated with Claude Code via T3 Chat on Discord

t3-codeBotand others added 16 commits August 12, 2026 14:32
Co-authored-by: t3-code[bot] <219304759+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
…otgg#4844)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>
…isting, update branch, reactions, in-place editing, smarter diffs (pingdotgg#6039)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
…6393)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…tgg#6423)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
14 upstream commits, six conflicts. Notable incoming work: the pull request
surfaces overhaul (pingdotgg#6039), T3 Connect environment deregistration (pingdotgg#4844),
project favicons in command subtitles (pingdotgg#6330), and PR links that honour
modifier-clicks (pingdotgg#6278, pingdotgg#6378).
Resolutions:
- LegacySidebar: upstream reworked the PR badge from a button into a real
anchor so cmd/middle-click opens the PR in the browser. The fork had already
replaced that icon badge with a numeric one, so taking upstream's block
verbatim would have rendered two badges per row. Upstream's block is dropped
and its anchor behaviour ported onto the fork's numeric badge — which the
merged `handlePrClick` now requires anyway, since its event type became
MouseEvent<HTMLAnchorElement>.
- Sidebar.logic(.test): both sides added independent functions and describe
blocks around a shared closing brace; unioned, with the fork's block closed
explicitly so nothing ends up nested.
- CommandPalette.logic: unioned both Pick<> field lists (fork's originSource /
participantSummaries with upstream's modelSelection / session / worktreePath).
- remote-access.md: kept both new sections.
- mobile-showcase-environment: took upstream's added schema-wait helpers.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
…dges
Two adversarial reviews of the merge found the port was incomplete.
The showcase script kept upstream's `waitForSeedableSchema` helpers but lost
its call site to an auto-merge, leaving them dead and restoring the startup
race they were added for: the environment server listens before it finishes
migrating, so seeding could hit a table or column that does not exist yet.
The fork's second numeric PR badge, in Recent Threads, was still a button.
`useOpenPrLink` only leaves the native default alone for an anchor with an
href, so middle-click and "open in new tab" did nothing there while working on
the project rows — upstream's pingdotgg#6378 half-applied. It is now the same anchor.
That conversion needs upstream's nested-link guard, which the recents row
handler never had: without it a modifier-click on the badge would open the pull
request *and* toggle the row's selection.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@omegent-app
omegent-appBot merged commit 0bf7835 into fork/devAug 13, 2026
5 checks passed
@omegent-app
omegent-appBot deleted the sync/upstream-2026-08-12b branch August 13, 2026 05:46
omegent-appBot added a commit that referenced this pull request Aug 15, 2026
#401 was squash-merged. That kept the code and threw the lineage away:
the 23 upstream commits stopped being ancestors, so `fork/dev` read as
**29 commits behind upstream when only 6 were genuinely outstanding**,
and the next sync would have re-merged and re-resolved all 23 — on the
same mobile files that took sixteen conflicts to land the first time.
Nobody noticed for two merges. It surfaced in a deploy alert that said
**"Commits (2)"** for a range that had carried 23.
## What this adds
A `push`-triggered check on `fork/dev` that fails when a commit which
carried a sync has fewer than two parents, and prints the `-s ours`
repair in the log.
Sync commits are identified by **the head branch of the PR they came
from**, not by their subject, because subjects vary by merge method:
```
Merge pull request #400 from patroza/sync/upstream-2026-08-12b
Merge upstream/main into fork/dev (23 commits) (#401)
merge: sync upstream through b73232b
```
A merge-button commit names the branch inline, so no API call is needed;
squash and rebase commits are resolved through the API, with the subject
line as a fallback when that is unavailable. **Ordinary fork PRs are
untouched** — they are expected to squash, and are never checked.
## Verified against the real commits
| commit | what it is | result |
|---|---|---|
| `5e63531b1` | #401, squash-merged sync | **fails**, exit 1 |
| `0bf7835cc` | #400, sync merged properly | recognised as a sync,
passes (2 parents) |
| `a76069bd9` | #402, an ordinary squashed PR | not flagged |
The third row is the one that matters most: the guard has to stay silent
on your normal workflow.
## This detects, it does not prevent
Worth being explicit, since it was the first question asked: **clicking
merge does not fail.** The check runs after the merge lands, because
GitHub has no per-PR merge-method control, and a repository-wide setting
cannot allow squash for ordinary fork PRs while requiring a merge commit
for syncs. Squash merges do fire `push` — `5e63531b1` triggered Fork CI
at 08:08 — so this turns a silent, weeks-later discovery into a red
check within a minute.
Actual prevention is `gh pr merge <n> --merge`, which is how #398, #399
and #400 all landed correctly. That is now written into the sync runbook
in `AGENTS.md`.
If you would rather it be enforced at the button, the next step is a
`sync:upstream` label workflow that merges the PR through the API once
checks pass — say the word and I will add it.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code) via [T3
Chat](https://t3.chat) on Discord
---------
Co-authored-by: omegent-app[bot] <306514130+omegent-app[bot]@users.noreply.github.com>
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

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

Merge upstream/main into fork/dev (14 commits) - #400

Merged
omegent-app[bot] merged 16 commits into
fork/devfrom
sync/upstream-2026-08-12b
Aug 13, 2026
Merged

Merge upstream/main into fork/dev (14 commits)#400
omegent-app[bot] merged 16 commits into
fork/devfrom
sync/upstream-2026-08-12b

Conversation

@omegent-app

Copy link
Copy Markdown

14 upstream commits. Six conflicts, resolved by hand; two adversarial reviews (grok-4.6, gpt-5.6-sol) then found the merge had welded two of them incompletely, fixed in the follow-up commit.

Notable incoming work: the pull request surfaces overhaul (#6039 — filters and qualifiers, all-server listing, update branch, reactions, in-place editing), T3 Connect environment deregistration (#4844), project favicons in command subtitles (#6330), and PR links that honour modifier-clicks (#6278, #6378).

Conflicts

LegacySidebar.tsx — the interesting one. Upstream reworked the PR status badge from a <button> into a real <a href> so cmd/middle-click opens the PR in the browser. The fork had already replaced that icon badge with a numeric #1234 one, so taking upstream's block verbatim would have rendered two badges per row. Upstream's block is dropped and its anchor behaviour ported onto the fork's badge — which the merged handlePrClick requires anyway, since its event type became MouseEvent<HTMLAnchorElement>.

Sidebar.logic.ts / .test.ts — both sides added independent functions and describe blocks around a shared closing brace. Unioned, with the fork's block closed explicitly so nothing ends up nested (135 it( blocks before and after).

CommandPalette.logic.ts — unioned both Pick<> field lists: the fork's originSource / participantSummaries with upstream's modelSelection / session / worktreePath.

remote-access.md kept both new sections; mobile-showcase-environment.ts took upstream's added schema-wait helpers.

What review caught

  • A dead helper. The showcase script kept upstream's waitForSeedableSchema but lost its call site to an auto-merge — the classic weld failure. That restored the exact startup race upstream added it for: the server listens before it finishes migrating, so seeding could hit a column that doesn't exist yet. Call site restored.
  • A fork lint rule upstream does not have. Upstream's new helper sleeps with a global setTimeout; the fork's Effect diagnostics reject that in scripts/. Opted out at the file header the way its sibling mobile-showcase.ts already does, rather than rewriting upstream's helper.
  • fix(web): cmd+click sidebar PR numbers open in the browser pingdotgg/t3code#6378 half-applied. The fork's second numeric badge, in Recent Threads, was still a button. useOpenPrLink only leaves the native default alone for an anchor with an href, so middle-click and "open in new tab" did nothing there while working on project rows. Now the same anchor — and that conversion needs upstream's nested-link guard, which the recents row handler never had: without it a modifier-click on the badge would open the PR and toggle the row's selection.

Known, not changed

Upstream's new command-subtitle maps key project metadata by ProjectId alone, ignoring environmentId. In this fork projects come from every connected environment, so two environments sharing a ProjectId would cross their cwd/favicon/title. ProjectId is a random UUID per environment, so that needs a collision or a copied state.sqlite — worth a follow-up, not worth restructuring upstream's new code inside a sync.

Verification

pnpm typecheck (18 packages) · pnpm test272 files, 0 failures · vp build in apps/web · vp check --fix · forkSurfaceExistence (the anti-stack-drop net) green.

Co-authored-by: Patrick Roza 42661+patroza@users.noreply.github.com

🤖 Generated with Claude Code via T3 Chat on Discord

t3-codeBotand others added 16 commits August 12, 2026 14:32
Co-authored-by: t3-code[bot] <219304759+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
…otgg#4844)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>
…isting, update branch, reactions, in-place editing, smarter diffs (pingdotgg#6039)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
…6393)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…tgg#6423)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
14 upstream commits, six conflicts. Notable incoming work: the pull request
surfaces overhaul (pingdotgg#6039), T3 Connect environment deregistration (pingdotgg#4844),
project favicons in command subtitles (pingdotgg#6330), and PR links that honour
modifier-clicks (pingdotgg#6278, pingdotgg#6378).
Resolutions:
- LegacySidebar: upstream reworked the PR badge from a button into a real
anchor so cmd/middle-click opens the PR in the browser. The fork had already
replaced that icon badge with a numeric one, so taking upstream's block
verbatim would have rendered two badges per row. Upstream's block is dropped
and its anchor behaviour ported onto the fork's numeric badge — which the
merged `handlePrClick` now requires anyway, since its event type became
MouseEvent<HTMLAnchorElement>.
- Sidebar.logic(.test): both sides added independent functions and describe
blocks around a shared closing brace; unioned, with the fork's block closed
explicitly so nothing ends up nested.
- CommandPalette.logic: unioned both Pick<> field lists (fork's originSource /
participantSummaries with upstream's modelSelection / session / worktreePath).
- remote-access.md: kept both new sections.
- mobile-showcase-environment: took upstream's added schema-wait helpers.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
…dges
Two adversarial reviews of the merge found the port was incomplete.
The showcase script kept upstream's `waitForSeedableSchema` helpers but lost
its call site to an auto-merge, leaving them dead and restoring the startup
race they were added for: the environment server listens before it finishes
migrating, so seeding could hit a table or column that does not exist yet.
The fork's second numeric PR badge, in Recent Threads, was still a button.
`useOpenPrLink` only leaves the native default alone for an anchor with an
href, so middle-click and "open in new tab" did nothing there while working on
the project rows — upstream's pingdotgg#6378 half-applied. It is now the same anchor.
That conversion needs upstream's nested-link guard, which the recents row
handler never had: without it a modifier-click on the badge would open the pull
request *and* toggle the row's selection.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@omegent-app
omegent-appBot merged commit 0bf7835 into fork/devAug 13, 2026
5 checks passed
@omegent-app
omegent-appBot deleted the sync/upstream-2026-08-12b branch August 13, 2026 05:46
omegent-appBot added a commit that referenced this pull request Aug 15, 2026
#401 was squash-merged. That kept the code and threw the lineage away:
the 23 upstream commits stopped being ancestors, so `fork/dev` read as
**29 commits behind upstream when only 6 were genuinely outstanding**,
and the next sync would have re-merged and re-resolved all 23 — on the
same mobile files that took sixteen conflicts to land the first time.
Nobody noticed for two merges. It surfaced in a deploy alert that said
**"Commits (2)"** for a range that had carried 23.
## What this adds
A `push`-triggered check on `fork/dev` that fails when a commit which
carried a sync has fewer than two parents, and prints the `-s ours`
repair in the log.
Sync commits are identified by **the head branch of the PR they came
from**, not by their subject, because subjects vary by merge method:
```
Merge pull request #400 from patroza/sync/upstream-2026-08-12b
Merge upstream/main into fork/dev (23 commits) (#401)
merge: sync upstream through b73232b
```
A merge-button commit names the branch inline, so no API call is needed;
squash and rebase commits are resolved through the API, with the subject
line as a fallback when that is unavailable. **Ordinary fork PRs are
untouched** — they are expected to squash, and are never checked.
## Verified against the real commits
| commit | what it is | result |
|---|---|---|
| `5e63531b1` | #401, squash-merged sync | **fails**, exit 1 |
| `0bf7835cc` | #400, sync merged properly | recognised as a sync,
passes (2 parents) |
| `a76069bd9` | #402, an ordinary squashed PR | not flagged |
The third row is the one that matters most: the guard has to stay silent
on your normal workflow.
## This detects, it does not prevent
Worth being explicit, since it was the first question asked: **clicking
merge does not fail.** The check runs after the merge lands, because
GitHub has no per-PR merge-method control, and a repository-wide setting
cannot allow squash for ordinary fork PRs while requiring a merge commit
for syncs. Squash merges do fire `push` — `5e63531b1` triggered Fork CI
at 08:08 — so this turns a silent, weeks-later discovery into a red
check within a minute.
Actual prevention is `gh pr merge <n> --merge`, which is how #398, #399
and #400 all landed correctly. That is now written into the sync runbook
in `AGENTS.md`.
If you would rather it be enforced at the button, the next step is a
`sync:upstream` label workflow that merges the PR through the API once
checks pass — say the word and I will add it.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code) via [T3
Chat](https://t3.chat) on Discord
---------
Co-authored-by: omegent-app[bot] <306514130+omegent-app[bot]@users.noreply.github.com>
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

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

Merge upstream/main into fork/dev (14 commits) - #400

Merged
omegent-app[bot] merged 16 commits into
fork/devfrom
sync/upstream-2026-08-12b
Aug 13, 2026
Merged

Merge upstream/main into fork/dev (14 commits)#400
omegent-app[bot] merged 16 commits into
fork/devfrom
sync/upstream-2026-08-12b

Conversation

@omegent-app

Copy link
Copy Markdown

14 upstream commits. Six conflicts, resolved by hand; two adversarial reviews (grok-4.6, gpt-5.6-sol) then found the merge had welded two of them incompletely, fixed in the follow-up commit.

Notable incoming work: the pull request surfaces overhaul (#6039 — filters and qualifiers, all-server listing, update branch, reactions, in-place editing), T3 Connect environment deregistration (#4844), project favicons in command subtitles (#6330), and PR links that honour modifier-clicks (#6278, #6378).

Conflicts

LegacySidebar.tsx — the interesting one. Upstream reworked the PR status badge from a <button> into a real <a href> so cmd/middle-click opens the PR in the browser. The fork had already replaced that icon badge with a numeric #1234 one, so taking upstream's block verbatim would have rendered two badges per row. Upstream's block is dropped and its anchor behaviour ported onto the fork's badge — which the merged handlePrClick requires anyway, since its event type became MouseEvent<HTMLAnchorElement>.

Sidebar.logic.ts / .test.ts — both sides added independent functions and describe blocks around a shared closing brace. Unioned, with the fork's block closed explicitly so nothing ends up nested (135 it( blocks before and after).

CommandPalette.logic.ts — unioned both Pick<> field lists: the fork's originSource / participantSummaries with upstream's modelSelection / session / worktreePath.

remote-access.md kept both new sections; mobile-showcase-environment.ts took upstream's added schema-wait helpers.

What review caught

  • A dead helper. The showcase script kept upstream's waitForSeedableSchema but lost its call site to an auto-merge — the classic weld failure. That restored the exact startup race upstream added it for: the server listens before it finishes migrating, so seeding could hit a column that doesn't exist yet. Call site restored.
  • A fork lint rule upstream does not have. Upstream's new helper sleeps with a global setTimeout; the fork's Effect diagnostics reject that in scripts/. Opted out at the file header the way its sibling mobile-showcase.ts already does, rather than rewriting upstream's helper.
  • fix(web): cmd+click sidebar PR numbers open in the browser pingdotgg/t3code#6378 half-applied. The fork's second numeric badge, in Recent Threads, was still a button. useOpenPrLink only leaves the native default alone for an anchor with an href, so middle-click and "open in new tab" did nothing there while working on project rows. Now the same anchor — and that conversion needs upstream's nested-link guard, which the recents row handler never had: without it a modifier-click on the badge would open the PR and toggle the row's selection.

Known, not changed

Upstream's new command-subtitle maps key project metadata by ProjectId alone, ignoring environmentId. In this fork projects come from every connected environment, so two environments sharing a ProjectId would cross their cwd/favicon/title. ProjectId is a random UUID per environment, so that needs a collision or a copied state.sqlite — worth a follow-up, not worth restructuring upstream's new code inside a sync.

Verification

pnpm typecheck (18 packages) · pnpm test272 files, 0 failures · vp build in apps/web · vp check --fix · forkSurfaceExistence (the anti-stack-drop net) green.

Co-authored-by: Patrick Roza 42661+patroza@users.noreply.github.com

🤖 Generated with Claude Code via T3 Chat on Discord

t3-codeBotand others added 16 commits August 12, 2026 14:32
Co-authored-by: t3-code[bot] <219304759+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
…otgg#4844)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>
…isting, update branch, reactions, in-place editing, smarter diffs (pingdotgg#6039)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
…6393)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…tgg#6423)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
14 upstream commits, six conflicts. Notable incoming work: the pull request
surfaces overhaul (pingdotgg#6039), T3 Connect environment deregistration (pingdotgg#4844),
project favicons in command subtitles (pingdotgg#6330), and PR links that honour
modifier-clicks (pingdotgg#6278, pingdotgg#6378).
Resolutions:
- LegacySidebar: upstream reworked the PR badge from a button into a real
anchor so cmd/middle-click opens the PR in the browser. The fork had already
replaced that icon badge with a numeric one, so taking upstream's block
verbatim would have rendered two badges per row. Upstream's block is dropped
and its anchor behaviour ported onto the fork's numeric badge — which the
merged `handlePrClick` now requires anyway, since its event type became
MouseEvent<HTMLAnchorElement>.
- Sidebar.logic(.test): both sides added independent functions and describe
blocks around a shared closing brace; unioned, with the fork's block closed
explicitly so nothing ends up nested.
- CommandPalette.logic: unioned both Pick<> field lists (fork's originSource /
participantSummaries with upstream's modelSelection / session / worktreePath).
- remote-access.md: kept both new sections.
- mobile-showcase-environment: took upstream's added schema-wait helpers.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
…dges
Two adversarial reviews of the merge found the port was incomplete.
The showcase script kept upstream's `waitForSeedableSchema` helpers but lost
its call site to an auto-merge, leaving them dead and restoring the startup
race they were added for: the environment server listens before it finishes
migrating, so seeding could hit a table or column that does not exist yet.
The fork's second numeric PR badge, in Recent Threads, was still a button.
`useOpenPrLink` only leaves the native default alone for an anchor with an
href, so middle-click and "open in new tab" did nothing there while working on
the project rows — upstream's pingdotgg#6378 half-applied. It is now the same anchor.
That conversion needs upstream's nested-link guard, which the recents row
handler never had: without it a modifier-click on the badge would open the pull
request *and* toggle the row's selection.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@omegent-app
omegent-appBot merged commit 0bf7835 into fork/devAug 13, 2026
5 checks passed
@omegent-app
omegent-appBot deleted the sync/upstream-2026-08-12b branch August 13, 2026 05:46
omegent-appBot added a commit that referenced this pull request Aug 15, 2026
#401 was squash-merged. That kept the code and threw the lineage away:
the 23 upstream commits stopped being ancestors, so `fork/dev` read as
**29 commits behind upstream when only 6 were genuinely outstanding**,
and the next sync would have re-merged and re-resolved all 23 — on the
same mobile files that took sixteen conflicts to land the first time.
Nobody noticed for two merges. It surfaced in a deploy alert that said
**"Commits (2)"** for a range that had carried 23.
## What this adds
A `push`-triggered check on `fork/dev` that fails when a commit which
carried a sync has fewer than two parents, and prints the `-s ours`
repair in the log.
Sync commits are identified by **the head branch of the PR they came
from**, not by their subject, because subjects vary by merge method:
```
Merge pull request #400 from patroza/sync/upstream-2026-08-12b
Merge upstream/main into fork/dev (23 commits) (#401)
merge: sync upstream through b73232b
```
A merge-button commit names the branch inline, so no API call is needed;
squash and rebase commits are resolved through the API, with the subject
line as a fallback when that is unavailable. **Ordinary fork PRs are
untouched** — they are expected to squash, and are never checked.
## Verified against the real commits
| commit | what it is | result |
|---|---|---|
| `5e63531b1` | #401, squash-merged sync | **fails**, exit 1 |
| `0bf7835cc` | #400, sync merged properly | recognised as a sync,
passes (2 parents) |
| `a76069bd9` | #402, an ordinary squashed PR | not flagged |
The third row is the one that matters most: the guard has to stay silent
on your normal workflow.
## This detects, it does not prevent
Worth being explicit, since it was the first question asked: **clicking
merge does not fail.** The check runs after the merge lands, because
GitHub has no per-PR merge-method control, and a repository-wide setting
cannot allow squash for ordinary fork PRs while requiring a merge commit
for syncs. Squash merges do fire `push` — `5e63531b1` triggered Fork CI
at 08:08 — so this turns a silent, weeks-later discovery into a red
check within a minute.
Actual prevention is `gh pr merge <n> --merge`, which is how #398, #399
and #400 all landed correctly. That is now written into the sync runbook
in `AGENTS.md`.
If you would rather it be enforced at the button, the next step is a
`sync:upstream` label workflow that merges the PR through the API once
checks pass — say the word and I will add it.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code) via [T3
Chat](https://t3.chat) on Discord
---------
Co-authored-by: omegent-app[bot] <306514130+omegent-app[bot]@users.noreply.github.com>
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

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

Merge upstream/main into fork/dev (14 commits) - #400

Merged
omegent-app[bot] merged 16 commits into
fork/devfrom
sync/upstream-2026-08-12b
Aug 13, 2026
Merged

Merge upstream/main into fork/dev (14 commits)#400
omegent-app[bot] merged 16 commits into
fork/devfrom
sync/upstream-2026-08-12b

Conversation

@omegent-app

Copy link
Copy Markdown

14 upstream commits. Six conflicts, resolved by hand; two adversarial reviews (grok-4.6, gpt-5.6-sol) then found the merge had welded two of them incompletely, fixed in the follow-up commit.

Notable incoming work: the pull request surfaces overhaul (#6039 — filters and qualifiers, all-server listing, update branch, reactions, in-place editing), T3 Connect environment deregistration (#4844), project favicons in command subtitles (#6330), and PR links that honour modifier-clicks (#6278, #6378).

Conflicts

LegacySidebar.tsx — the interesting one. Upstream reworked the PR status badge from a <button> into a real <a href> so cmd/middle-click opens the PR in the browser. The fork had already replaced that icon badge with a numeric #1234 one, so taking upstream's block verbatim would have rendered two badges per row. Upstream's block is dropped and its anchor behaviour ported onto the fork's badge — which the merged handlePrClick requires anyway, since its event type became MouseEvent<HTMLAnchorElement>.

Sidebar.logic.ts / .test.ts — both sides added independent functions and describe blocks around a shared closing brace. Unioned, with the fork's block closed explicitly so nothing ends up nested (135 it( blocks before and after).

CommandPalette.logic.ts — unioned both Pick<> field lists: the fork's originSource / participantSummaries with upstream's modelSelection / session / worktreePath.

remote-access.md kept both new sections; mobile-showcase-environment.ts took upstream's added schema-wait helpers.

What review caught

  • A dead helper. The showcase script kept upstream's waitForSeedableSchema but lost its call site to an auto-merge — the classic weld failure. That restored the exact startup race upstream added it for: the server listens before it finishes migrating, so seeding could hit a column that doesn't exist yet. Call site restored.
  • A fork lint rule upstream does not have. Upstream's new helper sleeps with a global setTimeout; the fork's Effect diagnostics reject that in scripts/. Opted out at the file header the way its sibling mobile-showcase.ts already does, rather than rewriting upstream's helper.
  • fix(web): cmd+click sidebar PR numbers open in the browser pingdotgg/t3code#6378 half-applied. The fork's second numeric badge, in Recent Threads, was still a button. useOpenPrLink only leaves the native default alone for an anchor with an href, so middle-click and "open in new tab" did nothing there while working on project rows. Now the same anchor — and that conversion needs upstream's nested-link guard, which the recents row handler never had: without it a modifier-click on the badge would open the PR and toggle the row's selection.

Known, not changed

Upstream's new command-subtitle maps key project metadata by ProjectId alone, ignoring environmentId. In this fork projects come from every connected environment, so two environments sharing a ProjectId would cross their cwd/favicon/title. ProjectId is a random UUID per environment, so that needs a collision or a copied state.sqlite — worth a follow-up, not worth restructuring upstream's new code inside a sync.

Verification

pnpm typecheck (18 packages) · pnpm test272 files, 0 failures · vp build in apps/web · vp check --fix · forkSurfaceExistence (the anti-stack-drop net) green.

Co-authored-by: Patrick Roza 42661+patroza@users.noreply.github.com

🤖 Generated with Claude Code via T3 Chat on Discord

t3-codeBotand others added 16 commits August 12, 2026 14:32
Co-authored-by: t3-code[bot] <219304759+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
…otgg#4844)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>
…isting, update branch, reactions, in-place editing, smarter diffs (pingdotgg#6039)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
…6393)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…tgg#6423)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
14 upstream commits, six conflicts. Notable incoming work: the pull request
surfaces overhaul (pingdotgg#6039), T3 Connect environment deregistration (pingdotgg#4844),
project favicons in command subtitles (pingdotgg#6330), and PR links that honour
modifier-clicks (pingdotgg#6278, pingdotgg#6378).
Resolutions:
- LegacySidebar: upstream reworked the PR badge from a button into a real
anchor so cmd/middle-click opens the PR in the browser. The fork had already
replaced that icon badge with a numeric one, so taking upstream's block
verbatim would have rendered two badges per row. Upstream's block is dropped
and its anchor behaviour ported onto the fork's numeric badge — which the
merged `handlePrClick` now requires anyway, since its event type became
MouseEvent<HTMLAnchorElement>.
- Sidebar.logic(.test): both sides added independent functions and describe
blocks around a shared closing brace; unioned, with the fork's block closed
explicitly so nothing ends up nested.
- CommandPalette.logic: unioned both Pick<> field lists (fork's originSource /
participantSummaries with upstream's modelSelection / session / worktreePath).
- remote-access.md: kept both new sections.
- mobile-showcase-environment: took upstream's added schema-wait helpers.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
…dges
Two adversarial reviews of the merge found the port was incomplete.
The showcase script kept upstream's `waitForSeedableSchema` helpers but lost
its call site to an auto-merge, leaving them dead and restoring the startup
race they were added for: the environment server listens before it finishes
migrating, so seeding could hit a table or column that does not exist yet.
The fork's second numeric PR badge, in Recent Threads, was still a button.
`useOpenPrLink` only leaves the native default alone for an anchor with an
href, so middle-click and "open in new tab" did nothing there while working on
the project rows — upstream's pingdotgg#6378 half-applied. It is now the same anchor.
That conversion needs upstream's nested-link guard, which the recents row
handler never had: without it a modifier-click on the badge would open the pull
request *and* toggle the row's selection.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
@omegent-app
omegent-appBot merged commit 0bf7835 into fork/devAug 13, 2026
5 checks passed
@omegent-app
omegent-appBot deleted the sync/upstream-2026-08-12b branch August 13, 2026 05:46
omegent-appBot added a commit that referenced this pull request Aug 15, 2026
#401 was squash-merged. That kept the code and threw the lineage away:
the 23 upstream commits stopped being ancestors, so `fork/dev` read as
**29 commits behind upstream when only 6 were genuinely outstanding**,
and the next sync would have re-merged and re-resolved all 23 — on the
same mobile files that took sixteen conflicts to land the first time.
Nobody noticed for two merges. It surfaced in a deploy alert that said
**"Commits (2)"** for a range that had carried 23.
## What this adds
A `push`-triggered check on `fork/dev` that fails when a commit which
carried a sync has fewer than two parents, and prints the `-s ours`
repair in the log.
Sync commits are identified by **the head branch of the PR they came
from**, not by their subject, because subjects vary by merge method:
```
Merge pull request #400 from patroza/sync/upstream-2026-08-12b
Merge upstream/main into fork/dev (23 commits) (#401)
merge: sync upstream through b73232b
```
A merge-button commit names the branch inline, so no API call is needed;
squash and rebase commits are resolved through the API, with the subject
line as a fallback when that is unavailable. **Ordinary fork PRs are
untouched** — they are expected to squash, and are never checked.
## Verified against the real commits
| commit | what it is | result |
|---|---|---|
| `5e63531b1` | #401, squash-merged sync | **fails**, exit 1 |
| `0bf7835cc` | #400, sync merged properly | recognised as a sync,
passes (2 parents) |
| `a76069bd9` | #402, an ordinary squashed PR | not flagged |
The third row is the one that matters most: the guard has to stay silent
on your normal workflow.
## This detects, it does not prevent
Worth being explicit, since it was the first question asked: **clicking
merge does not fail.** The check runs after the merge lands, because
GitHub has no per-PR merge-method control, and a repository-wide setting
cannot allow squash for ordinary fork PRs while requiring a merge commit
for syncs. Squash merges do fire `push` — `5e63531b1` triggered Fork CI
at 08:08 — so this turns a silent, weeks-later discovery into a red
check within a minute.
Actual prevention is `gh pr merge <n> --merge`, which is how #398, #399
and #400 all landed correctly. That is now written into the sync runbook
in `AGENTS.md`.
If you would rather it be enforced at the button, the next step is a
`sync:upstream` label workflow that merges the PR through the API once
checks pass — say the word and I will add it.
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code) via [T3
Chat](https://t3.chat) on Discord
---------
Co-authored-by: omegent-app[bot] <306514130+omegent-app[bot]@users.noreply.github.com>
Co-authored-by: Patrick Roza <42661+patroza@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@extoci@juliusmarminge@PixPMusic@StiensWout@Bil0000@t3dotgg@gsimone@dominic-r