chore(upstream): sync marcode through bab4b6f02b8b - #35

Closed
maarco wants to merge 161 commits into
mainfrom
claude/gracious-bohr-y8476v
Closed

chore(upstream): sync marcode through bab4b6f02b8b#35
maarco wants to merge 161 commits into
mainfrom
claude/gracious-bohr-y8476v

Conversation

@maarco

@maarcomaarco commented Aug 16, 2026

Copy link
Copy Markdown
Owner

What Changed

Merges 158 upstream commits, b73232bd..bab4b6f0, into main as one two-parent merge commit (791d415c), plus two follow-up fixes for breaks CI caught. 41 paths conflicted and every one was resolved by hand, combining both intents — no whole-file ours/theirs, no reset/restore/stash/clean, no force push.

Supersedes #29 (through 9e201941), #31 (through 184d8ef3), and #33 (through ad117235) — all three of those SHAs are ancestors of bab4b6f0, and all four branches share the same base. Closing them in favour of this one is your call. Resolves the upstream-sync-blocked issue #34.

Conflict decisions

Retired surfaces (Marcode owns the removal)

  • files/{FileBrowserPanel,FilePreviewPanel}.tsx — kept deleted. Upstream only restyled them and added remote-open; that feature is taken in OpenInPicker instead.
  • RightPanelTabs.tsx — took upstream's desktopByTabId threading (it now feeds the preview-tab favicon) and their Button-based add-panel trigger; dropped theme/PierreEntryIcon, which exist only for the retired file surface icon. Trimmed the matching props from upstream's new RightPanelTabs.test.tsx.
  • ChatView.tsx — took upstream's PR tab-status keying fix (keyed by the shown surface, not a key rebuilt from the status) and their workspace file drag-and-drop; dropped activeFileSurface.
  • ChatMarkdown.tsx / diffFileActions.ts — kept upstream's call shape and repointed the shared producer at the floating editor. diffFileActions keeps upstream's new resolveDiffPathForWorkspace (a real fix for repository-relative diff paths in nested projects) and feeds the result to the editor rather than the right panel; its tests now assert on the editor store.

Navigation and shellAppSidebarLayout.tsx and sidebar/SidebarChrome.tsx keep Marcode's no-op SidebarControl and update-only footer; upstream's SidebarBrand/T3Wordmark/footer nav would ship a second copy of controls FloatingPillNav already renders, and threadSidebarWidth.test.ts asserts that removal. chat/ChatHeader.tsx keeps the title-only header but takes upstream's remote-open imports. ui/tooltip.tsx keeps Marcode's inline FLOATING_SURFACE_Z stacking, which subsumes upstream's z-[140] bump.

Styling refactor followed, behaviour keptindex.css adopts upstream's nested @variant dark, @layer base stage-art defaults, alert-glass utility and theme-id palettes; Marcode's monochrome .stage-blueprint override is ported onto the renamed --stage-art-* tokens, and its dark palette, sidebar surface rules and floating chrome are kept. Upstream's class retirements were followed at their call sites (.chat-composer-glasssurface-glass, .workspace-titlebar-controls and .chat-composer-horizontal-inset → inline utilities) — those classes no longer exist, so keeping them would have been a silent no-op. Pull-request panels and UsagePage take upstream's Button refactor inside Marcode's Tooltip wrappers.

Behaviour merged by hand

  • threadSettled.ts — combined upstream's new autoSettleOnMerge setting with Marcode's warm-window guard, so a merged/closed PR settles a thread only once it has gone idle. Upstream's new test was rewritten to the combined rule, plus a new test pinning the warm-window half.
  • ThreadTerminalDrawer.tsx — Marcode keeps xterm (for its search addon) where upstream runs the Ghostty WASM surface, so upstream's two fixes were ported by hand rather than merged: right-click paste (fix(terminal): right-click paste works in the terminal pingdotgg/t3code#5240) and the Ctrl+C selection-clear guard (fix(web): add copying terminal selection with ctrl+c in the web app pingdotgg/t3code#5638). Ghostty's pasteFromClipboard race claim has no xterm equivalent, so the same race is settled against the request id in the drawer, and the context menu binds to the mount element instead of a surface option.

Branding/identity conflicts (BitbucketSourceControlProvider, desktopUpdate.logic, ConnectionsSettings, MobileClientsUserProfilePage, _chat.pull-requests, README, AGENTS.md) all kept Marcode's product identity while taking the upstream fix in the same hunk — notably upstream's window.desktopBridge gate so the Connect toggle stops showing in the web app, and their removal of the Windows-only update warning (the platform parameter is gone from every caller). mobile-showcase.test.ts and infra/relay/scripts/deploy.test.ts keep the Marcode tests upstream deleted — they pin the marcode:// scheme and MARCODE_RELAY_URL — with the imports upstream removed restored. pnpm-lock.yaml was regenerated with pnpm, not hand-merged.

Fork-boundary breaks that merged cleanly (no conflict)

These are the dangerous ones — they produced no marker and would have shipped silently. Two of the nine were caught by CI rather than by the pre-push sweep.

  1. pair-client.sh — upstream's new mobile pairing helper used T3CODE_PORT, the t3code-dev scheme and com.t3tools.t3code.dev. Marcode uses MARCODE_PORT, marcode-dev, com.t3tools.marcode.dev, so it could not have paired a single device. Fixed, along with three stale t3code-dev references already sitting in that skill's SKILL.md.
  2. release.yml wired publish_aur into the release pipeline. Marcode does not own the t3code-bin AUR packages, and the PKGBUILDs fetch from pingdotgg/t3code releases — a Marcode release would have failed on the missing AUR_SSH_PRIVATE_KEY or pushed upstream's package. Removed the call site only, leaving publish-aur.yml and packaging/aur untouched so future syncs don't conflict on them, and added scripts/release-fork-boundary.test.ts to pin the removal.
  3. DesktopWslServerTree.test.ts seeded its config layer with T3CODE_HOME/T3CODE_MODE (new upstream file, so no marker). Marcode reads MARCODE_HOME/MARCODE_MODE, so marcodeHome stayed unset, the desktop state dir resolved off the test's temp tree, and its sweep assertions never saw the directories they set up. Caught by CI — fixed in 9bc1a299.
  4. Upstream added an isPublicFaviconHost guard to faviconUrlForOrigin, so it stops sending private, loopback and reserved-TLD hostnames to Google's s2 favicon endpoint. That is a privacy fix and is kept — Marcode's unified workspace tree resolves URL-shortcut icons through the same helper, so it was leaking internal hostnames too. Its capability-flag test asserted a favicon for a http://localhost:3000 shortcut, exactly the case upstream now refuses. Caught by CI — fixed in cf90a76c, with a new test pinning the behaviour because the leak is invisible in the UI (the sidebar renders its globe fallback either way). ⚠️This is user-visible: URL shortcuts pointing at a dev server or intranet host lose their favicon.
  5. DMG installer artwork — upstream's new backgrounds read "T3 CODE" / "Drag T3 Code to Applications". Rebranded.
  6. A new "T3 Connect" account page and sidebar tab (T3ConnectUserProfilePage.tsx, T3ConnectSidebarSignIn.tsx). Rebranded to Marcode Connect; the t3-connect route slug and file names stay upstream-shaped.
  7. The new mobile theme picker labelled its default palette "T3 Code." Relabelled to Marcode; the persisted t3-code id is deliberately unchanged so upgrades don't reset anyone's theme. docs/user/mobile-appearance.md rebranded to match.
  8. Issue templates and CONTRIBUTING.md moved to a Discussions-first model pointing at pingdotgg/t3code/discussions. Marcode tracks everything in its own Issues, so the issues-first wording is kept and the cross-repo contact link dropped.
  9. build-desktop-artifact.test.ts hard-coded upstream's productName in a new DMG assertion. Repointed at Marcode's.

Verified still correct on purpose: T3_BOOT_SERVICE_UNIT, T3_SERVICE_LAUNCHER_CONTEXT, @t3tools/*, the t3 package name and t3code: storage keys remain upstream-shaped; MARCODE_HOME still drives the service launcher; no t3code/<hex> branch fixtures leaked past the renamed WORKTREE_BRANCH_PREFIX. After #3, every file this merge touched was re-swept for a T3CODE_* name whose MARCODE_* twin is what actually gets read — the only remaining mismatches are in electron-launcher.mjs and dev-electron.mjs, both byte-identical to main and listed under pre-existing findings below.

Why

Scheduled upstream sync. The delta was too large to land as a clean auto-merge, and several of the resolutions are product decisions (which surface owns file editing, whether a merged PR buries a warm thread, which terminal implementation Marcode carries) rather than mechanical ones.

UI Changes

Not captured — the sync container has no display, and the touched surfaces (sidebar chrome, floating editor entry points, PR panels, terminal drawer, usage page, Connect account page) need a real client. Per the runbook this needs a test-t3-app pass at 390px and 820px before the PR leaves draft.

Checklist

  • This PR is small and focused — no. It is a 158-commit upstream merge; that is the unit of work.
  • I explained what changed and why
  • I included before/after screenshots for any UI changes — see above, not possible from the sync container
  • I included a video for animation/interaction changes

Verification

CI is green on cf90a76c — all four required checks passed: Check, Test, Mobile Native Static Analysis, Release Smoke (plus claude-review). Thread transfer stays within every enforced ceiling. Native fingerprint diff is queued rather than complete; it is not a required check.

Locally: typecheck clean across web, server, desktop, mobile, contracts, shared and client-runtime; the full web suite passes (274 files, 2795 tests); vp fmt --check and vp lint clean on the changed files and directories (warnings only, all pre-existing).

Still unverified — please read before marking ready

  • No live client pass on any UI surface. This is the gap that matters, given how much of the merge lands in web chrome.
  • The hand-ported terminal right-click paste is covered by ThreadTerminalDrawer.test.ts, but has never been exercised interactively against a real pty.

One local-only failure, named so nobody chases it: packages/sharedNet.test.ts › "findAvailablePort returns preferred when it is free" fails in the sync container. It reserves an ephemeral port, releases it, then asserts the same port comes back — inherently racy under parallel test load. CI passes packages/shared on this commit, and this merge only adds a method to Net.ts without touching findAvailablePort.

Pre-existing findings, deliberately not fixed here

Not caused by this merge; flagging rather than widening the diff:

  • build-desktop-artifact.ts registers schemes: ["t3code", "t3code-dev"] and name: "T3 Code" for packaged Linux builds, while macOS uses marcode. Changing it is an OAuth deep-link migration for existing installs, not a rename.
  • electron-launcher.mjs and dev-electron.mjs forward T3CODE_PORT, T3CODE_HOME, T3CODE_COMMIT_HASH, T3CODE_OTLP_* and T3CODE_DESKTOP_APP_USER_MODEL_ID, while the server and DesktopConfig read the MARCODE_* names. Same class of bug as upstream sync blocked: pingdotgg/t3code@6154b46cb86b #3 above, but it predates this merge.
  • desktopUpdate.logic.ts points DESKTOP_RELEASE_TAG_URL at pingdotgg/t3code/releases/tag.
  • ThemePreviewCircles.tsx labels the web standard theme "T3 Code" (the mobile twin was fixed here because this merge introduced it).
  • docs/user/** still says "T3 Code" throughout, and install.md points at upstream's Homebrew cask and AUR packages.

t3-codeBotand others added 30 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>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
…ngdotgg#6495)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
Co-authored-by: t3-code[bot] <236186684+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Wout Stiens <71498452+StiensWout@users.noreply.github.com>
)
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: maria <254055478+maria-rcks@users.noreply.github.com>
yashranawayand others added 18 commits August 15, 2026 12:31
…gdotgg#5989)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>
…7081)
Co-authored-by: codex <codex@users.noreply.github.com>
)
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: maria <maria@kuuro.net>
…#6392)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Merges 158 upstream commits (b73232b..bab4b6f) into Marcode. 41 paths
conflicted; every one was resolved by hand, combining both intents.
Conflict decisions
------------------
Retired surfaces (Marcode owns the removal)
- apps/web/src/components/files/{FileBrowserPanel,FilePreviewPanel}.tsx:
kept deleted. Upstream only restyled them and added remote-open; that
feature is taken in OpenInPicker instead.
- RightPanelTabs.tsx: took upstream's `desktopByTabId` threading (it now
feeds the preview-tab favicon) and its Button-based add-panel trigger;
dropped `theme`/`PierreEntryIcon`, which exist only for the retired
`file` surface icon. Trimmed the matching props from upstream's new
RightPanelTabs.test.tsx.
- ChatView.tsx: took upstream's pull-request tab-status keying fix
(keyed by the shown surface, not a key rebuilt from the status) and
their workspace file drag-and-drop; dropped `activeFileSurface`.
- ChatMarkdown.tsx / diffFileActions.ts: kept upstream's call shape and
repointed the shared producer at the floating editor. diffFileActions
keeps upstream's new `resolveDiffPathForWorkspace` (a real fix for
repository-relative diff paths in nested projects) and feeds the
result to the editor rather than the right panel; its tests now assert
on the editor store.
Navigation and shell (FloatingPillNav owns brand/nav/settings)
- AppSidebarLayout.tsx, sidebar/SidebarChrome.tsx: kept Marcode's
no-op SidebarControl and update-only footer. Upstream's SidebarBrand /
T3Wordmark / footer nav would ship a second copy of controls the pill
nav already renders, and threadSidebarWidth.test.ts asserts that
removal.
- threadSidebarWidth.test.ts: kept Marcode's brand-removal assertion
over upstream's wordmark assertion.
- chat/ChatHeader.tsx: kept Marcode's title-only header (no thread
action menu / inline rename); took upstream's remote-open imports.
- ui/tooltip.tsx: kept Marcode's inline FLOATING_SURFACE_Z stacking;
upstream's `z-[140]` utility bump is subsumed by it.
Styling refactor followed, behavior kept (index.css)
- Adopted upstream's nested `@variant dark`, `@layer base` stage-art
defaults, `alert-glass` utility and theme-id palettes. Ported
Marcode's monochrome `.stage-blueprint` override onto the renamed
`--stage-art-*` tokens; kept Marcode's dark palette, sidebar surface
rules and floating chrome. Dropped the now-dead `.workspace-topbar`.
- Followed upstream's class retirements at their call sites:
`.chat-composer-glass` -> `surface-glass` (ChatComposer,
PullRequestCodeTab), `.workspace-titlebar-controls` and
`.chat-composer-horizontal-inset` -> inline utilities (ChatView).
Those classes no longer exist, so keeping them would have been a
silent no-op.
- Pull-request panels/UsagePage: took upstream's Button refactor inside
Marcode's Tooltip wrappers rather than choosing one side.
Behavior merged by hand
- threadSettled.ts: combined upstream's new `autoSettleOnMerge` setting
with Marcode's warm-window guard, so a merged/closed PR settles a
thread only once it has been idle. Rewrote upstream's new test to the
combined rule and added a test pinning the warm-window half.
- ThreadTerminalDrawer.tsx: Marcode keeps xterm (for its search addon)
where upstream runs the Ghostty WASM surface, so upstream's two fixes
were ported by hand rather than merged: right-click paste (pingdotgg#5240) and
the Ctrl+C selection-clear guard (pingdotgg#5638). Ghostty's
`pasteFromClipboard` race claim has no xterm equivalent, so the same
race is settled against the request id in the drawer; the context
menu is bound to the mount element instead of a surface option.
Branding and identity
- BitbucketSourceControlProvider.ts: kept MARCODE_* env names, took
upstream's added "user read" scope wording.
- desktopUpdate.logic.ts: took upstream's removal of the Windows-only
install warning (their copy decision, and the `platform` parameter is
gone from every caller); kept Marcode wording.
- ConnectionsSettings.tsx: took upstream's `window.desktopBridge` gate
(the toggle should not show in the web app); kept "Marcode Connect".
- MobileClientsUserProfilePage.tsx: adopted upstream's shared
ClerkUserProfilePage/Row primitives, rebranded to Marcode.
- _chat.pull-requests.tsx: took upstream's plural copy for the new
multi-environment view, rebranded.
- README.md / AGENTS.md: kept Marcode's. Upstream's additions were
either their distribution channel (AUR) or duplicates of sections
Marcode already has.
- docs/internals/scripts.md, packages/shared/package.json,
commandInvariants.test.ts, build-desktop-artifact.ts: additive on both
sides, combined.
- mobile-showcase.test.ts, infra/relay/scripts/deploy.test.ts: kept the
Marcode tests upstream deleted — they pin the `marcode://` scheme and
MARCODE_RELAY_URL — and restored the imports upstream removed.
- pnpm-lock.yaml: regenerated with pnpm, not hand-merged.
Fork-boundary breaks that merged cleanly (no conflict)
--------------------------------------------------------
- .agents/skills/test-t3-mobile/scripts/pair-client.sh: upstream's new
pairing helper used T3CODE_PORT, the `t3code-dev` scheme and
`com.t3tools.t3code.dev`. Marcode uses MARCODE_PORT, `marcode-dev`
and `com.t3tools.marcode.dev`, so the helper could not have paired a
single device. Fixed, along with three stale `t3code-dev` references
already in that skill's SKILL.md.
- .github/workflows/release.yml: upstream wired publish_aur into the
release pipeline. Marcode does not own the `t3code-bin` AUR packages
and the PKGBUILDs fetch from pingdotgg/t3code releases, so a Marcode
release would have failed on the missing secret or pushed upstream's
package. Removed the call site only, leaving publish-aur.yml and
packaging/aur untouched so future syncs do not conflict on them, and
added scripts/release-fork-boundary.test.ts to pin the removal.
- apps/desktop/resources/dmg/*.svg: upstream's new DMG installer
artwork read "T3 CODE" / "Drag T3 Code to Applications". Rebranded.
- clerk/T3ConnectUserProfilePage.tsx + T3ConnectSidebarSignIn.tsx:
a new user-visible account page and tab labelled "T3 Connect".
Rebranded to Marcode Connect; the `t3-connect` route slug and file
names stay upstream-shaped.
- apps/mobile/src/lib/mobileTheme.ts: the new built-in theme picker
labelled the default palette "T3 Code". Relabelled to Marcode; the
persisted `t3-code` id is deliberately unchanged.
- docs/user/mobile-appearance.md: new doc, rebranded to match.
- .github/ISSUE_TEMPLATE/* and CONTRIBUTING.md: upstream moved to a
Discussions-first model and pointed contributors at
pingdotgg/t3code/discussions. Marcode tracks everything in its own
Issues, so the issues-first wording is kept and the cross-repo
contact link dropped.
- scripts/build-desktop-artifact.test.ts: upstream's new DMG assertion
hard-coded their productName. Repointed at Marcode's.
- Verified clean: T3_BOOT_SERVICE_UNIT, T3_SERVICE_LAUNCHER_CONTEXT,
@t3tools/*, the `t3` package name and `t3code:` storage keys remain
upstream-shaped on purpose; MARCODE_HOME still drives the service
launcher; no `t3code/<hex>` branch fixtures leaked past the renamed
WORKTREE_BRANCH_PREFIX.
Verification
------------
- typecheck: web, server, desktop, mobile, contracts, shared,
client-runtime — all clean.
- vp test run over the touched surfaces: 435 tests pass.
- vp fmt --check and vp lint on the changed files/dirs: clean
(warnings only, all pre-existing).
- Not run here: ThreadTerminalDrawer.test.ts and
FloatingTerminalShell.test.ts. Both fail to resolve @aliimam/icons in
this container; the same failure reproduces on origin/main, and that
import is unchanged by this merge. CI covers them, and the hand-ported
terminal paste path has had no runtime verification.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Spcc6CDhDkR7wWAor5829P
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL labels Aug 16, 2026
@github-actions

github-actionsBot commented Aug 16, 2026

Copy link
Copy Markdown

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB12.6 KiB+1.3 KiB (+11.3%)15.1 KiB
CodexThread snapshot wire5.5 KiB6.3 KiB+838 B (+15.0%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB6.3 KiB+472 B (+7.9%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB51.8 KiB+2.1 KiB (+4.2%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB12.6 KiB+1.3 KiB (+11.3%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB6.3 KiB+817 B (+14.6%)7.3 KiB
ClaudeLive turn WebSocket wire5.8 KiB6.3 KiB+497 B (+8.3%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB52.7 KiB+2.1 KiB (+4.2%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 1af3478 · PR result: cf90a76 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 99.9 KiB
  • Claude decoded thread snapshot: 100.6 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

Upstream's new DesktopWslServerTree test seeds its DesktopConfig layer
with T3CODE_HOME and T3CODE_MODE. Marcode reads MARCODE_HOME and
MARCODE_MODE, so `marcodeHome` stayed unset, the desktop state dir
resolved off the test's temp tree, and the sweep assertions never saw
the stale version directory they set up.
Another clean-merge fork-boundary break from the bab4b6f sync: the file
is new upstream, so it arrived without a conflict marker.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Spcc6CDhDkR7wWAor5829P
Upstream added an `isPublicFaviconHost` guard to `faviconUrlForOrigin`,
so it no longer sends private, loopback, or reserved-TLD hostnames to
Google's s2 favicon endpoint. That guard is a privacy fix and is kept.
Marcode's unified workspace tree resolves URL shortcut icons through the
same helper, and its capability-flag test asserted a favicon for a
`http://localhost:3000` shortcut — which is exactly the case upstream
now refuses. Repointed that assertion at a public host and added a test
pinning the new behaviour, since a leaked hostname is invisible in the
UI: the sidebar renders its globe fallback either way.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Spcc6CDhDkR7wWAor5829P
@maarcoClaude

Copy link
Copy Markdown
OwnerAuthor

Two CI rounds, two more clean-merge fork-boundary breaks — both fixed, and one correction to the description above.

9bc1a299DesktopWslServerTree.test.ts seeded its config layer with T3CODE_HOME/T3CODE_MODE. Marcode reads MARCODE_HOME/MARCODE_MODE, so marcodeHome stayed unset and the sweep assertions never saw the temp tree they set up. New upstream file, so no conflict marker.

cf90a76c — favicon privacy guard. Upstream added isPublicFaviconHost to faviconUrlForOrigin, so it no longer sends private, loopback, or reserved-TLD hostnames to Google's s2 endpoint. That is a real privacy fix and is kept. Marcode's unified workspace tree resolves URL shortcut icons through the same helper, and its capability-flag test asserted a favicon for a http://localhost:3000 shortcut — precisely the case upstream now refuses. Repointed at a public host, and added a test pinning the new behaviour, because the leak is invisible in the UI: the sidebar renders its globe fallback either way.

That second one is worth a look during review. It is a behaviour change for anyone who has a URL shortcut pointing at a dev server or an intranet host — those rows lose their favicon and fall back to the globe. That is the correct outcome, but it is user-visible.

Correction to the "Not verified" section

I reported that ThreadTerminalDrawer.test.ts and FloatingTerminalShell.test.ts could not run. That was wrong — it was an artifact of invoking the runner from the repo root instead of the package, which is what broke @aliimam/icons resolution. Run properly they pass, and the full web suite is green locally: 274 files, 2795 tests. So the hand-ported terminal right-click paste is covered by ThreadTerminalDrawer.test.ts, including the pure helpers it adds.

What remains genuinely unverified is narrower than I said: no live client pass on any UI surface, and no interactive exercise of the right-click paste path against a real pty.

One local-only failure worth naming so nobody chases it: packages/sharedNet.test.ts › "findAvailablePort returns preferred when it is free" fails in the sync container. It reserves an ephemeral port, releases it, then asserts the same port comes back — inherently racy under parallel test load. CI passed packages/shared on this exact commit, and this merge only adds a new method to Net.ts without touching findAvailablePort.


Generated by Claude Code

@maarco

Copy link
Copy Markdown
OwnerAuthor

Superseded by #39 (merged, includes 82b8a93).

@maarcomaarco closed this Aug 19, 2026
@maarco
maarco deleted the claude/gracious-bohr-y8476v branch August 19, 2026 05:20
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXLvouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

20 participants

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

chore(upstream): sync marcode through bab4b6f02b8b - #35

Closed
maarco wants to merge 161 commits into
mainfrom
claude/gracious-bohr-y8476v
Closed

chore(upstream): sync marcode through bab4b6f02b8b#35
maarco wants to merge 161 commits into
mainfrom
claude/gracious-bohr-y8476v

Conversation

@maarco

@maarcomaarco commented Aug 16, 2026

Copy link
Copy Markdown
Owner

What Changed

Merges 158 upstream commits, b73232bd..bab4b6f0, into main as one two-parent merge commit (791d415c), plus two follow-up fixes for breaks CI caught. 41 paths conflicted and every one was resolved by hand, combining both intents — no whole-file ours/theirs, no reset/restore/stash/clean, no force push.

Supersedes #29 (through 9e201941), #31 (through 184d8ef3), and #33 (through ad117235) — all three of those SHAs are ancestors of bab4b6f0, and all four branches share the same base. Closing them in favour of this one is your call. Resolves the upstream-sync-blocked issue #34.

Conflict decisions

Retired surfaces (Marcode owns the removal)

  • files/{FileBrowserPanel,FilePreviewPanel}.tsx — kept deleted. Upstream only restyled them and added remote-open; that feature is taken in OpenInPicker instead.
  • RightPanelTabs.tsx — took upstream's desktopByTabId threading (it now feeds the preview-tab favicon) and their Button-based add-panel trigger; dropped theme/PierreEntryIcon, which exist only for the retired file surface icon. Trimmed the matching props from upstream's new RightPanelTabs.test.tsx.
  • ChatView.tsx — took upstream's PR tab-status keying fix (keyed by the shown surface, not a key rebuilt from the status) and their workspace file drag-and-drop; dropped activeFileSurface.
  • ChatMarkdown.tsx / diffFileActions.ts — kept upstream's call shape and repointed the shared producer at the floating editor. diffFileActions keeps upstream's new resolveDiffPathForWorkspace (a real fix for repository-relative diff paths in nested projects) and feeds the result to the editor rather than the right panel; its tests now assert on the editor store.

Navigation and shellAppSidebarLayout.tsx and sidebar/SidebarChrome.tsx keep Marcode's no-op SidebarControl and update-only footer; upstream's SidebarBrand/T3Wordmark/footer nav would ship a second copy of controls FloatingPillNav already renders, and threadSidebarWidth.test.ts asserts that removal. chat/ChatHeader.tsx keeps the title-only header but takes upstream's remote-open imports. ui/tooltip.tsx keeps Marcode's inline FLOATING_SURFACE_Z stacking, which subsumes upstream's z-[140] bump.

Styling refactor followed, behaviour keptindex.css adopts upstream's nested @variant dark, @layer base stage-art defaults, alert-glass utility and theme-id palettes; Marcode's monochrome .stage-blueprint override is ported onto the renamed --stage-art-* tokens, and its dark palette, sidebar surface rules and floating chrome are kept. Upstream's class retirements were followed at their call sites (.chat-composer-glasssurface-glass, .workspace-titlebar-controls and .chat-composer-horizontal-inset → inline utilities) — those classes no longer exist, so keeping them would have been a silent no-op. Pull-request panels and UsagePage take upstream's Button refactor inside Marcode's Tooltip wrappers.

Behaviour merged by hand

  • threadSettled.ts — combined upstream's new autoSettleOnMerge setting with Marcode's warm-window guard, so a merged/closed PR settles a thread only once it has gone idle. Upstream's new test was rewritten to the combined rule, plus a new test pinning the warm-window half.
  • ThreadTerminalDrawer.tsx — Marcode keeps xterm (for its search addon) where upstream runs the Ghostty WASM surface, so upstream's two fixes were ported by hand rather than merged: right-click paste (fix(terminal): right-click paste works in the terminal pingdotgg/t3code#5240) and the Ctrl+C selection-clear guard (fix(web): add copying terminal selection with ctrl+c in the web app pingdotgg/t3code#5638). Ghostty's pasteFromClipboard race claim has no xterm equivalent, so the same race is settled against the request id in the drawer, and the context menu binds to the mount element instead of a surface option.

Branding/identity conflicts (BitbucketSourceControlProvider, desktopUpdate.logic, ConnectionsSettings, MobileClientsUserProfilePage, _chat.pull-requests, README, AGENTS.md) all kept Marcode's product identity while taking the upstream fix in the same hunk — notably upstream's window.desktopBridge gate so the Connect toggle stops showing in the web app, and their removal of the Windows-only update warning (the platform parameter is gone from every caller). mobile-showcase.test.ts and infra/relay/scripts/deploy.test.ts keep the Marcode tests upstream deleted — they pin the marcode:// scheme and MARCODE_RELAY_URL — with the imports upstream removed restored. pnpm-lock.yaml was regenerated with pnpm, not hand-merged.

Fork-boundary breaks that merged cleanly (no conflict)

These are the dangerous ones — they produced no marker and would have shipped silently. Two of the nine were caught by CI rather than by the pre-push sweep.

  1. pair-client.sh — upstream's new mobile pairing helper used T3CODE_PORT, the t3code-dev scheme and com.t3tools.t3code.dev. Marcode uses MARCODE_PORT, marcode-dev, com.t3tools.marcode.dev, so it could not have paired a single device. Fixed, along with three stale t3code-dev references already sitting in that skill's SKILL.md.
  2. release.yml wired publish_aur into the release pipeline. Marcode does not own the t3code-bin AUR packages, and the PKGBUILDs fetch from pingdotgg/t3code releases — a Marcode release would have failed on the missing AUR_SSH_PRIVATE_KEY or pushed upstream's package. Removed the call site only, leaving publish-aur.yml and packaging/aur untouched so future syncs don't conflict on them, and added scripts/release-fork-boundary.test.ts to pin the removal.
  3. DesktopWslServerTree.test.ts seeded its config layer with T3CODE_HOME/T3CODE_MODE (new upstream file, so no marker). Marcode reads MARCODE_HOME/MARCODE_MODE, so marcodeHome stayed unset, the desktop state dir resolved off the test's temp tree, and its sweep assertions never saw the directories they set up. Caught by CI — fixed in 9bc1a299.
  4. Upstream added an isPublicFaviconHost guard to faviconUrlForOrigin, so it stops sending private, loopback and reserved-TLD hostnames to Google's s2 favicon endpoint. That is a privacy fix and is kept — Marcode's unified workspace tree resolves URL-shortcut icons through the same helper, so it was leaking internal hostnames too. Its capability-flag test asserted a favicon for a http://localhost:3000 shortcut, exactly the case upstream now refuses. Caught by CI — fixed in cf90a76c, with a new test pinning the behaviour because the leak is invisible in the UI (the sidebar renders its globe fallback either way). ⚠️This is user-visible: URL shortcuts pointing at a dev server or intranet host lose their favicon.
  5. DMG installer artwork — upstream's new backgrounds read "T3 CODE" / "Drag T3 Code to Applications". Rebranded.
  6. A new "T3 Connect" account page and sidebar tab (T3ConnectUserProfilePage.tsx, T3ConnectSidebarSignIn.tsx). Rebranded to Marcode Connect; the t3-connect route slug and file names stay upstream-shaped.
  7. The new mobile theme picker labelled its default palette "T3 Code." Relabelled to Marcode; the persisted t3-code id is deliberately unchanged so upgrades don't reset anyone's theme. docs/user/mobile-appearance.md rebranded to match.
  8. Issue templates and CONTRIBUTING.md moved to a Discussions-first model pointing at pingdotgg/t3code/discussions. Marcode tracks everything in its own Issues, so the issues-first wording is kept and the cross-repo contact link dropped.
  9. build-desktop-artifact.test.ts hard-coded upstream's productName in a new DMG assertion. Repointed at Marcode's.

Verified still correct on purpose: T3_BOOT_SERVICE_UNIT, T3_SERVICE_LAUNCHER_CONTEXT, @t3tools/*, the t3 package name and t3code: storage keys remain upstream-shaped; MARCODE_HOME still drives the service launcher; no t3code/<hex> branch fixtures leaked past the renamed WORKTREE_BRANCH_PREFIX. After #3, every file this merge touched was re-swept for a T3CODE_* name whose MARCODE_* twin is what actually gets read — the only remaining mismatches are in electron-launcher.mjs and dev-electron.mjs, both byte-identical to main and listed under pre-existing findings below.

Why

Scheduled upstream sync. The delta was too large to land as a clean auto-merge, and several of the resolutions are product decisions (which surface owns file editing, whether a merged PR buries a warm thread, which terminal implementation Marcode carries) rather than mechanical ones.

UI Changes

Not captured — the sync container has no display, and the touched surfaces (sidebar chrome, floating editor entry points, PR panels, terminal drawer, usage page, Connect account page) need a real client. Per the runbook this needs a test-t3-app pass at 390px and 820px before the PR leaves draft.

Checklist

  • This PR is small and focused — no. It is a 158-commit upstream merge; that is the unit of work.
  • I explained what changed and why
  • I included before/after screenshots for any UI changes — see above, not possible from the sync container
  • I included a video for animation/interaction changes

Verification

CI is green on cf90a76c — all four required checks passed: Check, Test, Mobile Native Static Analysis, Release Smoke (plus claude-review). Thread transfer stays within every enforced ceiling. Native fingerprint diff is queued rather than complete; it is not a required check.

Locally: typecheck clean across web, server, desktop, mobile, contracts, shared and client-runtime; the full web suite passes (274 files, 2795 tests); vp fmt --check and vp lint clean on the changed files and directories (warnings only, all pre-existing).

Still unverified — please read before marking ready

  • No live client pass on any UI surface. This is the gap that matters, given how much of the merge lands in web chrome.
  • The hand-ported terminal right-click paste is covered by ThreadTerminalDrawer.test.ts, but has never been exercised interactively against a real pty.

One local-only failure, named so nobody chases it: packages/sharedNet.test.ts › "findAvailablePort returns preferred when it is free" fails in the sync container. It reserves an ephemeral port, releases it, then asserts the same port comes back — inherently racy under parallel test load. CI passes packages/shared on this commit, and this merge only adds a method to Net.ts without touching findAvailablePort.

Pre-existing findings, deliberately not fixed here

Not caused by this merge; flagging rather than widening the diff:

  • build-desktop-artifact.ts registers schemes: ["t3code", "t3code-dev"] and name: "T3 Code" for packaged Linux builds, while macOS uses marcode. Changing it is an OAuth deep-link migration for existing installs, not a rename.
  • electron-launcher.mjs and dev-electron.mjs forward T3CODE_PORT, T3CODE_HOME, T3CODE_COMMIT_HASH, T3CODE_OTLP_* and T3CODE_DESKTOP_APP_USER_MODEL_ID, while the server and DesktopConfig read the MARCODE_* names. Same class of bug as upstream sync blocked: pingdotgg/t3code@6154b46cb86b #3 above, but it predates this merge.
  • desktopUpdate.logic.ts points DESKTOP_RELEASE_TAG_URL at pingdotgg/t3code/releases/tag.
  • ThemePreviewCircles.tsx labels the web standard theme "T3 Code" (the mobile twin was fixed here because this merge introduced it).
  • docs/user/** still says "T3 Code" throughout, and install.md points at upstream's Homebrew cask and AUR packages.

t3-codeBotand others added 30 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>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
…ngdotgg#6495)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
Co-authored-by: t3-code[bot] <236186684+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Wout Stiens <71498452+StiensWout@users.noreply.github.com>
)
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: maria <254055478+maria-rcks@users.noreply.github.com>
yashranawayand others added 18 commits August 15, 2026 12:31
…gdotgg#5989)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>
…7081)
Co-authored-by: codex <codex@users.noreply.github.com>
)
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: maria <maria@kuuro.net>
…#6392)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Merges 158 upstream commits (b73232b..bab4b6f) into Marcode. 41 paths
conflicted; every one was resolved by hand, combining both intents.
Conflict decisions
------------------
Retired surfaces (Marcode owns the removal)
- apps/web/src/components/files/{FileBrowserPanel,FilePreviewPanel}.tsx:
kept deleted. Upstream only restyled them and added remote-open; that
feature is taken in OpenInPicker instead.
- RightPanelTabs.tsx: took upstream's `desktopByTabId` threading (it now
feeds the preview-tab favicon) and its Button-based add-panel trigger;
dropped `theme`/`PierreEntryIcon`, which exist only for the retired
`file` surface icon. Trimmed the matching props from upstream's new
RightPanelTabs.test.tsx.
- ChatView.tsx: took upstream's pull-request tab-status keying fix
(keyed by the shown surface, not a key rebuilt from the status) and
their workspace file drag-and-drop; dropped `activeFileSurface`.
- ChatMarkdown.tsx / diffFileActions.ts: kept upstream's call shape and
repointed the shared producer at the floating editor. diffFileActions
keeps upstream's new `resolveDiffPathForWorkspace` (a real fix for
repository-relative diff paths in nested projects) and feeds the
result to the editor rather than the right panel; its tests now assert
on the editor store.
Navigation and shell (FloatingPillNav owns brand/nav/settings)
- AppSidebarLayout.tsx, sidebar/SidebarChrome.tsx: kept Marcode's
no-op SidebarControl and update-only footer. Upstream's SidebarBrand /
T3Wordmark / footer nav would ship a second copy of controls the pill
nav already renders, and threadSidebarWidth.test.ts asserts that
removal.
- threadSidebarWidth.test.ts: kept Marcode's brand-removal assertion
over upstream's wordmark assertion.
- chat/ChatHeader.tsx: kept Marcode's title-only header (no thread
action menu / inline rename); took upstream's remote-open imports.
- ui/tooltip.tsx: kept Marcode's inline FLOATING_SURFACE_Z stacking;
upstream's `z-[140]` utility bump is subsumed by it.
Styling refactor followed, behavior kept (index.css)
- Adopted upstream's nested `@variant dark`, `@layer base` stage-art
defaults, `alert-glass` utility and theme-id palettes. Ported
Marcode's monochrome `.stage-blueprint` override onto the renamed
`--stage-art-*` tokens; kept Marcode's dark palette, sidebar surface
rules and floating chrome. Dropped the now-dead `.workspace-topbar`.
- Followed upstream's class retirements at their call sites:
`.chat-composer-glass` -> `surface-glass` (ChatComposer,
PullRequestCodeTab), `.workspace-titlebar-controls` and
`.chat-composer-horizontal-inset` -> inline utilities (ChatView).
Those classes no longer exist, so keeping them would have been a
silent no-op.
- Pull-request panels/UsagePage: took upstream's Button refactor inside
Marcode's Tooltip wrappers rather than choosing one side.
Behavior merged by hand
- threadSettled.ts: combined upstream's new `autoSettleOnMerge` setting
with Marcode's warm-window guard, so a merged/closed PR settles a
thread only once it has been idle. Rewrote upstream's new test to the
combined rule and added a test pinning the warm-window half.
- ThreadTerminalDrawer.tsx: Marcode keeps xterm (for its search addon)
where upstream runs the Ghostty WASM surface, so upstream's two fixes
were ported by hand rather than merged: right-click paste (pingdotgg#5240) and
the Ctrl+C selection-clear guard (pingdotgg#5638). Ghostty's
`pasteFromClipboard` race claim has no xterm equivalent, so the same
race is settled against the request id in the drawer; the context
menu is bound to the mount element instead of a surface option.
Branding and identity
- BitbucketSourceControlProvider.ts: kept MARCODE_* env names, took
upstream's added "user read" scope wording.
- desktopUpdate.logic.ts: took upstream's removal of the Windows-only
install warning (their copy decision, and the `platform` parameter is
gone from every caller); kept Marcode wording.
- ConnectionsSettings.tsx: took upstream's `window.desktopBridge` gate
(the toggle should not show in the web app); kept "Marcode Connect".
- MobileClientsUserProfilePage.tsx: adopted upstream's shared
ClerkUserProfilePage/Row primitives, rebranded to Marcode.
- _chat.pull-requests.tsx: took upstream's plural copy for the new
multi-environment view, rebranded.
- README.md / AGENTS.md: kept Marcode's. Upstream's additions were
either their distribution channel (AUR) or duplicates of sections
Marcode already has.
- docs/internals/scripts.md, packages/shared/package.json,
commandInvariants.test.ts, build-desktop-artifact.ts: additive on both
sides, combined.
- mobile-showcase.test.ts, infra/relay/scripts/deploy.test.ts: kept the
Marcode tests upstream deleted — they pin the `marcode://` scheme and
MARCODE_RELAY_URL — and restored the imports upstream removed.
- pnpm-lock.yaml: regenerated with pnpm, not hand-merged.
Fork-boundary breaks that merged cleanly (no conflict)
--------------------------------------------------------
- .agents/skills/test-t3-mobile/scripts/pair-client.sh: upstream's new
pairing helper used T3CODE_PORT, the `t3code-dev` scheme and
`com.t3tools.t3code.dev`. Marcode uses MARCODE_PORT, `marcode-dev`
and `com.t3tools.marcode.dev`, so the helper could not have paired a
single device. Fixed, along with three stale `t3code-dev` references
already in that skill's SKILL.md.
- .github/workflows/release.yml: upstream wired publish_aur into the
release pipeline. Marcode does not own the `t3code-bin` AUR packages
and the PKGBUILDs fetch from pingdotgg/t3code releases, so a Marcode
release would have failed on the missing secret or pushed upstream's
package. Removed the call site only, leaving publish-aur.yml and
packaging/aur untouched so future syncs do not conflict on them, and
added scripts/release-fork-boundary.test.ts to pin the removal.
- apps/desktop/resources/dmg/*.svg: upstream's new DMG installer
artwork read "T3 CODE" / "Drag T3 Code to Applications". Rebranded.
- clerk/T3ConnectUserProfilePage.tsx + T3ConnectSidebarSignIn.tsx:
a new user-visible account page and tab labelled "T3 Connect".
Rebranded to Marcode Connect; the `t3-connect` route slug and file
names stay upstream-shaped.
- apps/mobile/src/lib/mobileTheme.ts: the new built-in theme picker
labelled the default palette "T3 Code". Relabelled to Marcode; the
persisted `t3-code` id is deliberately unchanged.
- docs/user/mobile-appearance.md: new doc, rebranded to match.
- .github/ISSUE_TEMPLATE/* and CONTRIBUTING.md: upstream moved to a
Discussions-first model and pointed contributors at
pingdotgg/t3code/discussions. Marcode tracks everything in its own
Issues, so the issues-first wording is kept and the cross-repo
contact link dropped.
- scripts/build-desktop-artifact.test.ts: upstream's new DMG assertion
hard-coded their productName. Repointed at Marcode's.
- Verified clean: T3_BOOT_SERVICE_UNIT, T3_SERVICE_LAUNCHER_CONTEXT,
@t3tools/*, the `t3` package name and `t3code:` storage keys remain
upstream-shaped on purpose; MARCODE_HOME still drives the service
launcher; no `t3code/<hex>` branch fixtures leaked past the renamed
WORKTREE_BRANCH_PREFIX.
Verification
------------
- typecheck: web, server, desktop, mobile, contracts, shared,
client-runtime — all clean.
- vp test run over the touched surfaces: 435 tests pass.
- vp fmt --check and vp lint on the changed files/dirs: clean
(warnings only, all pre-existing).
- Not run here: ThreadTerminalDrawer.test.ts and
FloatingTerminalShell.test.ts. Both fail to resolve @aliimam/icons in
this container; the same failure reproduces on origin/main, and that
import is unchanged by this merge. CI covers them, and the hand-ported
terminal paste path has had no runtime verification.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Spcc6CDhDkR7wWAor5829P
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL labels Aug 16, 2026
@github-actions

github-actionsBot commented Aug 16, 2026

Copy link
Copy Markdown

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB12.6 KiB+1.3 KiB (+11.3%)15.1 KiB
CodexThread snapshot wire5.5 KiB6.3 KiB+838 B (+15.0%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB6.3 KiB+472 B (+7.9%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB51.8 KiB+2.1 KiB (+4.2%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB12.6 KiB+1.3 KiB (+11.3%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB6.3 KiB+817 B (+14.6%)7.3 KiB
ClaudeLive turn WebSocket wire5.8 KiB6.3 KiB+497 B (+8.3%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB52.7 KiB+2.1 KiB (+4.2%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 1af3478 · PR result: cf90a76 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 99.9 KiB
  • Claude decoded thread snapshot: 100.6 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

Upstream's new DesktopWslServerTree test seeds its DesktopConfig layer
with T3CODE_HOME and T3CODE_MODE. Marcode reads MARCODE_HOME and
MARCODE_MODE, so `marcodeHome` stayed unset, the desktop state dir
resolved off the test's temp tree, and the sweep assertions never saw
the stale version directory they set up.
Another clean-merge fork-boundary break from the bab4b6f sync: the file
is new upstream, so it arrived without a conflict marker.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Spcc6CDhDkR7wWAor5829P
Upstream added an `isPublicFaviconHost` guard to `faviconUrlForOrigin`,
so it no longer sends private, loopback, or reserved-TLD hostnames to
Google's s2 favicon endpoint. That guard is a privacy fix and is kept.
Marcode's unified workspace tree resolves URL shortcut icons through the
same helper, and its capability-flag test asserted a favicon for a
`http://localhost:3000` shortcut — which is exactly the case upstream
now refuses. Repointed that assertion at a public host and added a test
pinning the new behaviour, since a leaked hostname is invisible in the
UI: the sidebar renders its globe fallback either way.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Spcc6CDhDkR7wWAor5829P
@maarcoClaude

Copy link
Copy Markdown
OwnerAuthor

Two CI rounds, two more clean-merge fork-boundary breaks — both fixed, and one correction to the description above.

9bc1a299DesktopWslServerTree.test.ts seeded its config layer with T3CODE_HOME/T3CODE_MODE. Marcode reads MARCODE_HOME/MARCODE_MODE, so marcodeHome stayed unset and the sweep assertions never saw the temp tree they set up. New upstream file, so no conflict marker.

cf90a76c — favicon privacy guard. Upstream added isPublicFaviconHost to faviconUrlForOrigin, so it no longer sends private, loopback, or reserved-TLD hostnames to Google's s2 endpoint. That is a real privacy fix and is kept. Marcode's unified workspace tree resolves URL shortcut icons through the same helper, and its capability-flag test asserted a favicon for a http://localhost:3000 shortcut — precisely the case upstream now refuses. Repointed at a public host, and added a test pinning the new behaviour, because the leak is invisible in the UI: the sidebar renders its globe fallback either way.

That second one is worth a look during review. It is a behaviour change for anyone who has a URL shortcut pointing at a dev server or an intranet host — those rows lose their favicon and fall back to the globe. That is the correct outcome, but it is user-visible.

Correction to the "Not verified" section

I reported that ThreadTerminalDrawer.test.ts and FloatingTerminalShell.test.ts could not run. That was wrong — it was an artifact of invoking the runner from the repo root instead of the package, which is what broke @aliimam/icons resolution. Run properly they pass, and the full web suite is green locally: 274 files, 2795 tests. So the hand-ported terminal right-click paste is covered by ThreadTerminalDrawer.test.ts, including the pure helpers it adds.

What remains genuinely unverified is narrower than I said: no live client pass on any UI surface, and no interactive exercise of the right-click paste path against a real pty.

One local-only failure worth naming so nobody chases it: packages/sharedNet.test.ts › "findAvailablePort returns preferred when it is free" fails in the sync container. It reserves an ephemeral port, releases it, then asserts the same port comes back — inherently racy under parallel test load. CI passed packages/shared on this exact commit, and this merge only adds a new method to Net.ts without touching findAvailablePort.


Generated by Claude Code

@maarco

Copy link
Copy Markdown
OwnerAuthor

Superseded by #39 (merged, includes 82b8a93).

@maarcomaarco closed this Aug 19, 2026
@maarco
maarco deleted the claude/gracious-bohr-y8476v branch August 19, 2026 05:20
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXLvouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

20 participants

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

chore(upstream): sync marcode through bab4b6f02b8b - #35

Closed
maarco wants to merge 161 commits into
mainfrom
claude/gracious-bohr-y8476v
Closed

chore(upstream): sync marcode through bab4b6f02b8b#35
maarco wants to merge 161 commits into
mainfrom
claude/gracious-bohr-y8476v

Conversation

@maarco

@maarcomaarco commented Aug 16, 2026

Copy link
Copy Markdown
Owner

What Changed

Merges 158 upstream commits, b73232bd..bab4b6f0, into main as one two-parent merge commit (791d415c), plus two follow-up fixes for breaks CI caught. 41 paths conflicted and every one was resolved by hand, combining both intents — no whole-file ours/theirs, no reset/restore/stash/clean, no force push.

Supersedes #29 (through 9e201941), #31 (through 184d8ef3), and #33 (through ad117235) — all three of those SHAs are ancestors of bab4b6f0, and all four branches share the same base. Closing them in favour of this one is your call. Resolves the upstream-sync-blocked issue #34.

Conflict decisions

Retired surfaces (Marcode owns the removal)

  • files/{FileBrowserPanel,FilePreviewPanel}.tsx — kept deleted. Upstream only restyled them and added remote-open; that feature is taken in OpenInPicker instead.
  • RightPanelTabs.tsx — took upstream's desktopByTabId threading (it now feeds the preview-tab favicon) and their Button-based add-panel trigger; dropped theme/PierreEntryIcon, which exist only for the retired file surface icon. Trimmed the matching props from upstream's new RightPanelTabs.test.tsx.
  • ChatView.tsx — took upstream's PR tab-status keying fix (keyed by the shown surface, not a key rebuilt from the status) and their workspace file drag-and-drop; dropped activeFileSurface.
  • ChatMarkdown.tsx / diffFileActions.ts — kept upstream's call shape and repointed the shared producer at the floating editor. diffFileActions keeps upstream's new resolveDiffPathForWorkspace (a real fix for repository-relative diff paths in nested projects) and feeds the result to the editor rather than the right panel; its tests now assert on the editor store.

Navigation and shellAppSidebarLayout.tsx and sidebar/SidebarChrome.tsx keep Marcode's no-op SidebarControl and update-only footer; upstream's SidebarBrand/T3Wordmark/footer nav would ship a second copy of controls FloatingPillNav already renders, and threadSidebarWidth.test.ts asserts that removal. chat/ChatHeader.tsx keeps the title-only header but takes upstream's remote-open imports. ui/tooltip.tsx keeps Marcode's inline FLOATING_SURFACE_Z stacking, which subsumes upstream's z-[140] bump.

Styling refactor followed, behaviour keptindex.css adopts upstream's nested @variant dark, @layer base stage-art defaults, alert-glass utility and theme-id palettes; Marcode's monochrome .stage-blueprint override is ported onto the renamed --stage-art-* tokens, and its dark palette, sidebar surface rules and floating chrome are kept. Upstream's class retirements were followed at their call sites (.chat-composer-glasssurface-glass, .workspace-titlebar-controls and .chat-composer-horizontal-inset → inline utilities) — those classes no longer exist, so keeping them would have been a silent no-op. Pull-request panels and UsagePage take upstream's Button refactor inside Marcode's Tooltip wrappers.

Behaviour merged by hand

  • threadSettled.ts — combined upstream's new autoSettleOnMerge setting with Marcode's warm-window guard, so a merged/closed PR settles a thread only once it has gone idle. Upstream's new test was rewritten to the combined rule, plus a new test pinning the warm-window half.
  • ThreadTerminalDrawer.tsx — Marcode keeps xterm (for its search addon) where upstream runs the Ghostty WASM surface, so upstream's two fixes were ported by hand rather than merged: right-click paste (fix(terminal): right-click paste works in the terminal pingdotgg/t3code#5240) and the Ctrl+C selection-clear guard (fix(web): add copying terminal selection with ctrl+c in the web app pingdotgg/t3code#5638). Ghostty's pasteFromClipboard race claim has no xterm equivalent, so the same race is settled against the request id in the drawer, and the context menu binds to the mount element instead of a surface option.

Branding/identity conflicts (BitbucketSourceControlProvider, desktopUpdate.logic, ConnectionsSettings, MobileClientsUserProfilePage, _chat.pull-requests, README, AGENTS.md) all kept Marcode's product identity while taking the upstream fix in the same hunk — notably upstream's window.desktopBridge gate so the Connect toggle stops showing in the web app, and their removal of the Windows-only update warning (the platform parameter is gone from every caller). mobile-showcase.test.ts and infra/relay/scripts/deploy.test.ts keep the Marcode tests upstream deleted — they pin the marcode:// scheme and MARCODE_RELAY_URL — with the imports upstream removed restored. pnpm-lock.yaml was regenerated with pnpm, not hand-merged.

Fork-boundary breaks that merged cleanly (no conflict)

These are the dangerous ones — they produced no marker and would have shipped silently. Two of the nine were caught by CI rather than by the pre-push sweep.

  1. pair-client.sh — upstream's new mobile pairing helper used T3CODE_PORT, the t3code-dev scheme and com.t3tools.t3code.dev. Marcode uses MARCODE_PORT, marcode-dev, com.t3tools.marcode.dev, so it could not have paired a single device. Fixed, along with three stale t3code-dev references already sitting in that skill's SKILL.md.
  2. release.yml wired publish_aur into the release pipeline. Marcode does not own the t3code-bin AUR packages, and the PKGBUILDs fetch from pingdotgg/t3code releases — a Marcode release would have failed on the missing AUR_SSH_PRIVATE_KEY or pushed upstream's package. Removed the call site only, leaving publish-aur.yml and packaging/aur untouched so future syncs don't conflict on them, and added scripts/release-fork-boundary.test.ts to pin the removal.
  3. DesktopWslServerTree.test.ts seeded its config layer with T3CODE_HOME/T3CODE_MODE (new upstream file, so no marker). Marcode reads MARCODE_HOME/MARCODE_MODE, so marcodeHome stayed unset, the desktop state dir resolved off the test's temp tree, and its sweep assertions never saw the directories they set up. Caught by CI — fixed in 9bc1a299.
  4. Upstream added an isPublicFaviconHost guard to faviconUrlForOrigin, so it stops sending private, loopback and reserved-TLD hostnames to Google's s2 favicon endpoint. That is a privacy fix and is kept — Marcode's unified workspace tree resolves URL-shortcut icons through the same helper, so it was leaking internal hostnames too. Its capability-flag test asserted a favicon for a http://localhost:3000 shortcut, exactly the case upstream now refuses. Caught by CI — fixed in cf90a76c, with a new test pinning the behaviour because the leak is invisible in the UI (the sidebar renders its globe fallback either way). ⚠️This is user-visible: URL shortcuts pointing at a dev server or intranet host lose their favicon.
  5. DMG installer artwork — upstream's new backgrounds read "T3 CODE" / "Drag T3 Code to Applications". Rebranded.
  6. A new "T3 Connect" account page and sidebar tab (T3ConnectUserProfilePage.tsx, T3ConnectSidebarSignIn.tsx). Rebranded to Marcode Connect; the t3-connect route slug and file names stay upstream-shaped.
  7. The new mobile theme picker labelled its default palette "T3 Code." Relabelled to Marcode; the persisted t3-code id is deliberately unchanged so upgrades don't reset anyone's theme. docs/user/mobile-appearance.md rebranded to match.
  8. Issue templates and CONTRIBUTING.md moved to a Discussions-first model pointing at pingdotgg/t3code/discussions. Marcode tracks everything in its own Issues, so the issues-first wording is kept and the cross-repo contact link dropped.
  9. build-desktop-artifact.test.ts hard-coded upstream's productName in a new DMG assertion. Repointed at Marcode's.

Verified still correct on purpose: T3_BOOT_SERVICE_UNIT, T3_SERVICE_LAUNCHER_CONTEXT, @t3tools/*, the t3 package name and t3code: storage keys remain upstream-shaped; MARCODE_HOME still drives the service launcher; no t3code/<hex> branch fixtures leaked past the renamed WORKTREE_BRANCH_PREFIX. After #3, every file this merge touched was re-swept for a T3CODE_* name whose MARCODE_* twin is what actually gets read — the only remaining mismatches are in electron-launcher.mjs and dev-electron.mjs, both byte-identical to main and listed under pre-existing findings below.

Why

Scheduled upstream sync. The delta was too large to land as a clean auto-merge, and several of the resolutions are product decisions (which surface owns file editing, whether a merged PR buries a warm thread, which terminal implementation Marcode carries) rather than mechanical ones.

UI Changes

Not captured — the sync container has no display, and the touched surfaces (sidebar chrome, floating editor entry points, PR panels, terminal drawer, usage page, Connect account page) need a real client. Per the runbook this needs a test-t3-app pass at 390px and 820px before the PR leaves draft.

Checklist

  • This PR is small and focused — no. It is a 158-commit upstream merge; that is the unit of work.
  • I explained what changed and why
  • I included before/after screenshots for any UI changes — see above, not possible from the sync container
  • I included a video for animation/interaction changes

Verification

CI is green on cf90a76c — all four required checks passed: Check, Test, Mobile Native Static Analysis, Release Smoke (plus claude-review). Thread transfer stays within every enforced ceiling. Native fingerprint diff is queued rather than complete; it is not a required check.

Locally: typecheck clean across web, server, desktop, mobile, contracts, shared and client-runtime; the full web suite passes (274 files, 2795 tests); vp fmt --check and vp lint clean on the changed files and directories (warnings only, all pre-existing).

Still unverified — please read before marking ready

  • No live client pass on any UI surface. This is the gap that matters, given how much of the merge lands in web chrome.
  • The hand-ported terminal right-click paste is covered by ThreadTerminalDrawer.test.ts, but has never been exercised interactively against a real pty.

One local-only failure, named so nobody chases it: packages/sharedNet.test.ts › "findAvailablePort returns preferred when it is free" fails in the sync container. It reserves an ephemeral port, releases it, then asserts the same port comes back — inherently racy under parallel test load. CI passes packages/shared on this commit, and this merge only adds a method to Net.ts without touching findAvailablePort.

Pre-existing findings, deliberately not fixed here

Not caused by this merge; flagging rather than widening the diff:

  • build-desktop-artifact.ts registers schemes: ["t3code", "t3code-dev"] and name: "T3 Code" for packaged Linux builds, while macOS uses marcode. Changing it is an OAuth deep-link migration for existing installs, not a rename.
  • electron-launcher.mjs and dev-electron.mjs forward T3CODE_PORT, T3CODE_HOME, T3CODE_COMMIT_HASH, T3CODE_OTLP_* and T3CODE_DESKTOP_APP_USER_MODEL_ID, while the server and DesktopConfig read the MARCODE_* names. Same class of bug as upstream sync blocked: pingdotgg/t3code@6154b46cb86b #3 above, but it predates this merge.
  • desktopUpdate.logic.ts points DESKTOP_RELEASE_TAG_URL at pingdotgg/t3code/releases/tag.
  • ThemePreviewCircles.tsx labels the web standard theme "T3 Code" (the mobile twin was fixed here because this merge introduced it).
  • docs/user/** still says "T3 Code" throughout, and install.md points at upstream's Homebrew cask and AUR packages.

t3-codeBotand others added 30 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>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
…ngdotgg#6495)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
Co-authored-by: t3-code[bot] <236186684+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Wout Stiens <71498452+StiensWout@users.noreply.github.com>
)
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: maria <254055478+maria-rcks@users.noreply.github.com>
yashranawayand others added 18 commits August 15, 2026 12:31
…gdotgg#5989)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>
…7081)
Co-authored-by: codex <codex@users.noreply.github.com>
)
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: maria <maria@kuuro.net>
…#6392)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Merges 158 upstream commits (b73232b..bab4b6f) into Marcode. 41 paths
conflicted; every one was resolved by hand, combining both intents.
Conflict decisions
------------------
Retired surfaces (Marcode owns the removal)
- apps/web/src/components/files/{FileBrowserPanel,FilePreviewPanel}.tsx:
kept deleted. Upstream only restyled them and added remote-open; that
feature is taken in OpenInPicker instead.
- RightPanelTabs.tsx: took upstream's `desktopByTabId` threading (it now
feeds the preview-tab favicon) and its Button-based add-panel trigger;
dropped `theme`/`PierreEntryIcon`, which exist only for the retired
`file` surface icon. Trimmed the matching props from upstream's new
RightPanelTabs.test.tsx.
- ChatView.tsx: took upstream's pull-request tab-status keying fix
(keyed by the shown surface, not a key rebuilt from the status) and
their workspace file drag-and-drop; dropped `activeFileSurface`.
- ChatMarkdown.tsx / diffFileActions.ts: kept upstream's call shape and
repointed the shared producer at the floating editor. diffFileActions
keeps upstream's new `resolveDiffPathForWorkspace` (a real fix for
repository-relative diff paths in nested projects) and feeds the
result to the editor rather than the right panel; its tests now assert
on the editor store.
Navigation and shell (FloatingPillNav owns brand/nav/settings)
- AppSidebarLayout.tsx, sidebar/SidebarChrome.tsx: kept Marcode's
no-op SidebarControl and update-only footer. Upstream's SidebarBrand /
T3Wordmark / footer nav would ship a second copy of controls the pill
nav already renders, and threadSidebarWidth.test.ts asserts that
removal.
- threadSidebarWidth.test.ts: kept Marcode's brand-removal assertion
over upstream's wordmark assertion.
- chat/ChatHeader.tsx: kept Marcode's title-only header (no thread
action menu / inline rename); took upstream's remote-open imports.
- ui/tooltip.tsx: kept Marcode's inline FLOATING_SURFACE_Z stacking;
upstream's `z-[140]` utility bump is subsumed by it.
Styling refactor followed, behavior kept (index.css)
- Adopted upstream's nested `@variant dark`, `@layer base` stage-art
defaults, `alert-glass` utility and theme-id palettes. Ported
Marcode's monochrome `.stage-blueprint` override onto the renamed
`--stage-art-*` tokens; kept Marcode's dark palette, sidebar surface
rules and floating chrome. Dropped the now-dead `.workspace-topbar`.
- Followed upstream's class retirements at their call sites:
`.chat-composer-glass` -> `surface-glass` (ChatComposer,
PullRequestCodeTab), `.workspace-titlebar-controls` and
`.chat-composer-horizontal-inset` -> inline utilities (ChatView).
Those classes no longer exist, so keeping them would have been a
silent no-op.
- Pull-request panels/UsagePage: took upstream's Button refactor inside
Marcode's Tooltip wrappers rather than choosing one side.
Behavior merged by hand
- threadSettled.ts: combined upstream's new `autoSettleOnMerge` setting
with Marcode's warm-window guard, so a merged/closed PR settles a
thread only once it has been idle. Rewrote upstream's new test to the
combined rule and added a test pinning the warm-window half.
- ThreadTerminalDrawer.tsx: Marcode keeps xterm (for its search addon)
where upstream runs the Ghostty WASM surface, so upstream's two fixes
were ported by hand rather than merged: right-click paste (pingdotgg#5240) and
the Ctrl+C selection-clear guard (pingdotgg#5638). Ghostty's
`pasteFromClipboard` race claim has no xterm equivalent, so the same
race is settled against the request id in the drawer; the context
menu is bound to the mount element instead of a surface option.
Branding and identity
- BitbucketSourceControlProvider.ts: kept MARCODE_* env names, took
upstream's added "user read" scope wording.
- desktopUpdate.logic.ts: took upstream's removal of the Windows-only
install warning (their copy decision, and the `platform` parameter is
gone from every caller); kept Marcode wording.
- ConnectionsSettings.tsx: took upstream's `window.desktopBridge` gate
(the toggle should not show in the web app); kept "Marcode Connect".
- MobileClientsUserProfilePage.tsx: adopted upstream's shared
ClerkUserProfilePage/Row primitives, rebranded to Marcode.
- _chat.pull-requests.tsx: took upstream's plural copy for the new
multi-environment view, rebranded.
- README.md / AGENTS.md: kept Marcode's. Upstream's additions were
either their distribution channel (AUR) or duplicates of sections
Marcode already has.
- docs/internals/scripts.md, packages/shared/package.json,
commandInvariants.test.ts, build-desktop-artifact.ts: additive on both
sides, combined.
- mobile-showcase.test.ts, infra/relay/scripts/deploy.test.ts: kept the
Marcode tests upstream deleted — they pin the `marcode://` scheme and
MARCODE_RELAY_URL — and restored the imports upstream removed.
- pnpm-lock.yaml: regenerated with pnpm, not hand-merged.
Fork-boundary breaks that merged cleanly (no conflict)
--------------------------------------------------------
- .agents/skills/test-t3-mobile/scripts/pair-client.sh: upstream's new
pairing helper used T3CODE_PORT, the `t3code-dev` scheme and
`com.t3tools.t3code.dev`. Marcode uses MARCODE_PORT, `marcode-dev`
and `com.t3tools.marcode.dev`, so the helper could not have paired a
single device. Fixed, along with three stale `t3code-dev` references
already in that skill's SKILL.md.
- .github/workflows/release.yml: upstream wired publish_aur into the
release pipeline. Marcode does not own the `t3code-bin` AUR packages
and the PKGBUILDs fetch from pingdotgg/t3code releases, so a Marcode
release would have failed on the missing secret or pushed upstream's
package. Removed the call site only, leaving publish-aur.yml and
packaging/aur untouched so future syncs do not conflict on them, and
added scripts/release-fork-boundary.test.ts to pin the removal.
- apps/desktop/resources/dmg/*.svg: upstream's new DMG installer
artwork read "T3 CODE" / "Drag T3 Code to Applications". Rebranded.
- clerk/T3ConnectUserProfilePage.tsx + T3ConnectSidebarSignIn.tsx:
a new user-visible account page and tab labelled "T3 Connect".
Rebranded to Marcode Connect; the `t3-connect` route slug and file
names stay upstream-shaped.
- apps/mobile/src/lib/mobileTheme.ts: the new built-in theme picker
labelled the default palette "T3 Code". Relabelled to Marcode; the
persisted `t3-code` id is deliberately unchanged.
- docs/user/mobile-appearance.md: new doc, rebranded to match.
- .github/ISSUE_TEMPLATE/* and CONTRIBUTING.md: upstream moved to a
Discussions-first model and pointed contributors at
pingdotgg/t3code/discussions. Marcode tracks everything in its own
Issues, so the issues-first wording is kept and the cross-repo
contact link dropped.
- scripts/build-desktop-artifact.test.ts: upstream's new DMG assertion
hard-coded their productName. Repointed at Marcode's.
- Verified clean: T3_BOOT_SERVICE_UNIT, T3_SERVICE_LAUNCHER_CONTEXT,
@t3tools/*, the `t3` package name and `t3code:` storage keys remain
upstream-shaped on purpose; MARCODE_HOME still drives the service
launcher; no `t3code/<hex>` branch fixtures leaked past the renamed
WORKTREE_BRANCH_PREFIX.
Verification
------------
- typecheck: web, server, desktop, mobile, contracts, shared,
client-runtime — all clean.
- vp test run over the touched surfaces: 435 tests pass.
- vp fmt --check and vp lint on the changed files/dirs: clean
(warnings only, all pre-existing).
- Not run here: ThreadTerminalDrawer.test.ts and
FloatingTerminalShell.test.ts. Both fail to resolve @aliimam/icons in
this container; the same failure reproduces on origin/main, and that
import is unchanged by this merge. CI covers them, and the hand-ported
terminal paste path has had no runtime verification.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Spcc6CDhDkR7wWAor5829P
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL labels Aug 16, 2026
@github-actions

github-actionsBot commented Aug 16, 2026

Copy link
Copy Markdown

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB12.6 KiB+1.3 KiB (+11.3%)15.1 KiB
CodexThread snapshot wire5.5 KiB6.3 KiB+838 B (+15.0%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB6.3 KiB+472 B (+7.9%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB51.8 KiB+2.1 KiB (+4.2%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB12.6 KiB+1.3 KiB (+11.3%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB6.3 KiB+817 B (+14.6%)7.3 KiB
ClaudeLive turn WebSocket wire5.8 KiB6.3 KiB+497 B (+8.3%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB52.7 KiB+2.1 KiB (+4.2%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 1af3478 · PR result: cf90a76 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 99.9 KiB
  • Claude decoded thread snapshot: 100.6 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

Upstream's new DesktopWslServerTree test seeds its DesktopConfig layer
with T3CODE_HOME and T3CODE_MODE. Marcode reads MARCODE_HOME and
MARCODE_MODE, so `marcodeHome` stayed unset, the desktop state dir
resolved off the test's temp tree, and the sweep assertions never saw
the stale version directory they set up.
Another clean-merge fork-boundary break from the bab4b6f sync: the file
is new upstream, so it arrived without a conflict marker.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Spcc6CDhDkR7wWAor5829P
Upstream added an `isPublicFaviconHost` guard to `faviconUrlForOrigin`,
so it no longer sends private, loopback, or reserved-TLD hostnames to
Google's s2 favicon endpoint. That guard is a privacy fix and is kept.
Marcode's unified workspace tree resolves URL shortcut icons through the
same helper, and its capability-flag test asserted a favicon for a
`http://localhost:3000` shortcut — which is exactly the case upstream
now refuses. Repointed that assertion at a public host and added a test
pinning the new behaviour, since a leaked hostname is invisible in the
UI: the sidebar renders its globe fallback either way.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Spcc6CDhDkR7wWAor5829P
@maarcoClaude

Copy link
Copy Markdown
OwnerAuthor

Two CI rounds, two more clean-merge fork-boundary breaks — both fixed, and one correction to the description above.

9bc1a299DesktopWslServerTree.test.ts seeded its config layer with T3CODE_HOME/T3CODE_MODE. Marcode reads MARCODE_HOME/MARCODE_MODE, so marcodeHome stayed unset and the sweep assertions never saw the temp tree they set up. New upstream file, so no conflict marker.

cf90a76c — favicon privacy guard. Upstream added isPublicFaviconHost to faviconUrlForOrigin, so it no longer sends private, loopback, or reserved-TLD hostnames to Google's s2 endpoint. That is a real privacy fix and is kept. Marcode's unified workspace tree resolves URL shortcut icons through the same helper, and its capability-flag test asserted a favicon for a http://localhost:3000 shortcut — precisely the case upstream now refuses. Repointed at a public host, and added a test pinning the new behaviour, because the leak is invisible in the UI: the sidebar renders its globe fallback either way.

That second one is worth a look during review. It is a behaviour change for anyone who has a URL shortcut pointing at a dev server or an intranet host — those rows lose their favicon and fall back to the globe. That is the correct outcome, but it is user-visible.

Correction to the "Not verified" section

I reported that ThreadTerminalDrawer.test.ts and FloatingTerminalShell.test.ts could not run. That was wrong — it was an artifact of invoking the runner from the repo root instead of the package, which is what broke @aliimam/icons resolution. Run properly they pass, and the full web suite is green locally: 274 files, 2795 tests. So the hand-ported terminal right-click paste is covered by ThreadTerminalDrawer.test.ts, including the pure helpers it adds.

What remains genuinely unverified is narrower than I said: no live client pass on any UI surface, and no interactive exercise of the right-click paste path against a real pty.

One local-only failure worth naming so nobody chases it: packages/sharedNet.test.ts › "findAvailablePort returns preferred when it is free" fails in the sync container. It reserves an ephemeral port, releases it, then asserts the same port comes back — inherently racy under parallel test load. CI passed packages/shared on this exact commit, and this merge only adds a new method to Net.ts without touching findAvailablePort.


Generated by Claude Code

@maarco

Copy link
Copy Markdown
OwnerAuthor

Superseded by #39 (merged, includes 82b8a93).

@maarcomaarco closed this Aug 19, 2026
@maarco
maarco deleted the claude/gracious-bohr-y8476v branch August 19, 2026 05:20
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXLvouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

20 participants

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

chore(upstream): sync marcode through bab4b6f02b8b - #35

Closed
maarco wants to merge 161 commits into
mainfrom
claude/gracious-bohr-y8476v
Closed

chore(upstream): sync marcode through bab4b6f02b8b#35
maarco wants to merge 161 commits into
mainfrom
claude/gracious-bohr-y8476v

Conversation

@maarco

@maarcomaarco commented Aug 16, 2026

Copy link
Copy Markdown
Owner

What Changed

Merges 158 upstream commits, b73232bd..bab4b6f0, into main as one two-parent merge commit (791d415c), plus two follow-up fixes for breaks CI caught. 41 paths conflicted and every one was resolved by hand, combining both intents — no whole-file ours/theirs, no reset/restore/stash/clean, no force push.

Supersedes #29 (through 9e201941), #31 (through 184d8ef3), and #33 (through ad117235) — all three of those SHAs are ancestors of bab4b6f0, and all four branches share the same base. Closing them in favour of this one is your call. Resolves the upstream-sync-blocked issue #34.

Conflict decisions

Retired surfaces (Marcode owns the removal)

  • files/{FileBrowserPanel,FilePreviewPanel}.tsx — kept deleted. Upstream only restyled them and added remote-open; that feature is taken in OpenInPicker instead.
  • RightPanelTabs.tsx — took upstream's desktopByTabId threading (it now feeds the preview-tab favicon) and their Button-based add-panel trigger; dropped theme/PierreEntryIcon, which exist only for the retired file surface icon. Trimmed the matching props from upstream's new RightPanelTabs.test.tsx.
  • ChatView.tsx — took upstream's PR tab-status keying fix (keyed by the shown surface, not a key rebuilt from the status) and their workspace file drag-and-drop; dropped activeFileSurface.
  • ChatMarkdown.tsx / diffFileActions.ts — kept upstream's call shape and repointed the shared producer at the floating editor. diffFileActions keeps upstream's new resolveDiffPathForWorkspace (a real fix for repository-relative diff paths in nested projects) and feeds the result to the editor rather than the right panel; its tests now assert on the editor store.

Navigation and shellAppSidebarLayout.tsx and sidebar/SidebarChrome.tsx keep Marcode's no-op SidebarControl and update-only footer; upstream's SidebarBrand/T3Wordmark/footer nav would ship a second copy of controls FloatingPillNav already renders, and threadSidebarWidth.test.ts asserts that removal. chat/ChatHeader.tsx keeps the title-only header but takes upstream's remote-open imports. ui/tooltip.tsx keeps Marcode's inline FLOATING_SURFACE_Z stacking, which subsumes upstream's z-[140] bump.

Styling refactor followed, behaviour keptindex.css adopts upstream's nested @variant dark, @layer base stage-art defaults, alert-glass utility and theme-id palettes; Marcode's monochrome .stage-blueprint override is ported onto the renamed --stage-art-* tokens, and its dark palette, sidebar surface rules and floating chrome are kept. Upstream's class retirements were followed at their call sites (.chat-composer-glasssurface-glass, .workspace-titlebar-controls and .chat-composer-horizontal-inset → inline utilities) — those classes no longer exist, so keeping them would have been a silent no-op. Pull-request panels and UsagePage take upstream's Button refactor inside Marcode's Tooltip wrappers.

Behaviour merged by hand

  • threadSettled.ts — combined upstream's new autoSettleOnMerge setting with Marcode's warm-window guard, so a merged/closed PR settles a thread only once it has gone idle. Upstream's new test was rewritten to the combined rule, plus a new test pinning the warm-window half.
  • ThreadTerminalDrawer.tsx — Marcode keeps xterm (for its search addon) where upstream runs the Ghostty WASM surface, so upstream's two fixes were ported by hand rather than merged: right-click paste (fix(terminal): right-click paste works in the terminal pingdotgg/t3code#5240) and the Ctrl+C selection-clear guard (fix(web): add copying terminal selection with ctrl+c in the web app pingdotgg/t3code#5638). Ghostty's pasteFromClipboard race claim has no xterm equivalent, so the same race is settled against the request id in the drawer, and the context menu binds to the mount element instead of a surface option.

Branding/identity conflicts (BitbucketSourceControlProvider, desktopUpdate.logic, ConnectionsSettings, MobileClientsUserProfilePage, _chat.pull-requests, README, AGENTS.md) all kept Marcode's product identity while taking the upstream fix in the same hunk — notably upstream's window.desktopBridge gate so the Connect toggle stops showing in the web app, and their removal of the Windows-only update warning (the platform parameter is gone from every caller). mobile-showcase.test.ts and infra/relay/scripts/deploy.test.ts keep the Marcode tests upstream deleted — they pin the marcode:// scheme and MARCODE_RELAY_URL — with the imports upstream removed restored. pnpm-lock.yaml was regenerated with pnpm, not hand-merged.

Fork-boundary breaks that merged cleanly (no conflict)

These are the dangerous ones — they produced no marker and would have shipped silently. Two of the nine were caught by CI rather than by the pre-push sweep.

  1. pair-client.sh — upstream's new mobile pairing helper used T3CODE_PORT, the t3code-dev scheme and com.t3tools.t3code.dev. Marcode uses MARCODE_PORT, marcode-dev, com.t3tools.marcode.dev, so it could not have paired a single device. Fixed, along with three stale t3code-dev references already sitting in that skill's SKILL.md.
  2. release.yml wired publish_aur into the release pipeline. Marcode does not own the t3code-bin AUR packages, and the PKGBUILDs fetch from pingdotgg/t3code releases — a Marcode release would have failed on the missing AUR_SSH_PRIVATE_KEY or pushed upstream's package. Removed the call site only, leaving publish-aur.yml and packaging/aur untouched so future syncs don't conflict on them, and added scripts/release-fork-boundary.test.ts to pin the removal.
  3. DesktopWslServerTree.test.ts seeded its config layer with T3CODE_HOME/T3CODE_MODE (new upstream file, so no marker). Marcode reads MARCODE_HOME/MARCODE_MODE, so marcodeHome stayed unset, the desktop state dir resolved off the test's temp tree, and its sweep assertions never saw the directories they set up. Caught by CI — fixed in 9bc1a299.
  4. Upstream added an isPublicFaviconHost guard to faviconUrlForOrigin, so it stops sending private, loopback and reserved-TLD hostnames to Google's s2 favicon endpoint. That is a privacy fix and is kept — Marcode's unified workspace tree resolves URL-shortcut icons through the same helper, so it was leaking internal hostnames too. Its capability-flag test asserted a favicon for a http://localhost:3000 shortcut, exactly the case upstream now refuses. Caught by CI — fixed in cf90a76c, with a new test pinning the behaviour because the leak is invisible in the UI (the sidebar renders its globe fallback either way). ⚠️This is user-visible: URL shortcuts pointing at a dev server or intranet host lose their favicon.
  5. DMG installer artwork — upstream's new backgrounds read "T3 CODE" / "Drag T3 Code to Applications". Rebranded.
  6. A new "T3 Connect" account page and sidebar tab (T3ConnectUserProfilePage.tsx, T3ConnectSidebarSignIn.tsx). Rebranded to Marcode Connect; the t3-connect route slug and file names stay upstream-shaped.
  7. The new mobile theme picker labelled its default palette "T3 Code." Relabelled to Marcode; the persisted t3-code id is deliberately unchanged so upgrades don't reset anyone's theme. docs/user/mobile-appearance.md rebranded to match.
  8. Issue templates and CONTRIBUTING.md moved to a Discussions-first model pointing at pingdotgg/t3code/discussions. Marcode tracks everything in its own Issues, so the issues-first wording is kept and the cross-repo contact link dropped.
  9. build-desktop-artifact.test.ts hard-coded upstream's productName in a new DMG assertion. Repointed at Marcode's.

Verified still correct on purpose: T3_BOOT_SERVICE_UNIT, T3_SERVICE_LAUNCHER_CONTEXT, @t3tools/*, the t3 package name and t3code: storage keys remain upstream-shaped; MARCODE_HOME still drives the service launcher; no t3code/<hex> branch fixtures leaked past the renamed WORKTREE_BRANCH_PREFIX. After #3, every file this merge touched was re-swept for a T3CODE_* name whose MARCODE_* twin is what actually gets read — the only remaining mismatches are in electron-launcher.mjs and dev-electron.mjs, both byte-identical to main and listed under pre-existing findings below.

Why

Scheduled upstream sync. The delta was too large to land as a clean auto-merge, and several of the resolutions are product decisions (which surface owns file editing, whether a merged PR buries a warm thread, which terminal implementation Marcode carries) rather than mechanical ones.

UI Changes

Not captured — the sync container has no display, and the touched surfaces (sidebar chrome, floating editor entry points, PR panels, terminal drawer, usage page, Connect account page) need a real client. Per the runbook this needs a test-t3-app pass at 390px and 820px before the PR leaves draft.

Checklist

  • This PR is small and focused — no. It is a 158-commit upstream merge; that is the unit of work.
  • I explained what changed and why
  • I included before/after screenshots for any UI changes — see above, not possible from the sync container
  • I included a video for animation/interaction changes

Verification

CI is green on cf90a76c — all four required checks passed: Check, Test, Mobile Native Static Analysis, Release Smoke (plus claude-review). Thread transfer stays within every enforced ceiling. Native fingerprint diff is queued rather than complete; it is not a required check.

Locally: typecheck clean across web, server, desktop, mobile, contracts, shared and client-runtime; the full web suite passes (274 files, 2795 tests); vp fmt --check and vp lint clean on the changed files and directories (warnings only, all pre-existing).

Still unverified — please read before marking ready

  • No live client pass on any UI surface. This is the gap that matters, given how much of the merge lands in web chrome.
  • The hand-ported terminal right-click paste is covered by ThreadTerminalDrawer.test.ts, but has never been exercised interactively against a real pty.

One local-only failure, named so nobody chases it: packages/sharedNet.test.ts › "findAvailablePort returns preferred when it is free" fails in the sync container. It reserves an ephemeral port, releases it, then asserts the same port comes back — inherently racy under parallel test load. CI passes packages/shared on this commit, and this merge only adds a method to Net.ts without touching findAvailablePort.

Pre-existing findings, deliberately not fixed here

Not caused by this merge; flagging rather than widening the diff:

  • build-desktop-artifact.ts registers schemes: ["t3code", "t3code-dev"] and name: "T3 Code" for packaged Linux builds, while macOS uses marcode. Changing it is an OAuth deep-link migration for existing installs, not a rename.
  • electron-launcher.mjs and dev-electron.mjs forward T3CODE_PORT, T3CODE_HOME, T3CODE_COMMIT_HASH, T3CODE_OTLP_* and T3CODE_DESKTOP_APP_USER_MODEL_ID, while the server and DesktopConfig read the MARCODE_* names. Same class of bug as upstream sync blocked: pingdotgg/t3code@6154b46cb86b #3 above, but it predates this merge.
  • desktopUpdate.logic.ts points DESKTOP_RELEASE_TAG_URL at pingdotgg/t3code/releases/tag.
  • ThemePreviewCircles.tsx labels the web standard theme "T3 Code" (the mobile twin was fixed here because this merge introduced it).
  • docs/user/** still says "T3 Code" throughout, and install.md points at upstream's Homebrew cask and AUR packages.

t3-codeBotand others added 30 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>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
…ngdotgg#6495)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
Co-authored-by: t3-code[bot] <236186684+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Wout Stiens <71498452+StiensWout@users.noreply.github.com>
)
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: maria <254055478+maria-rcks@users.noreply.github.com>
yashranawayand others added 18 commits August 15, 2026 12:31
…gdotgg#5989)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>
…7081)
Co-authored-by: codex <codex@users.noreply.github.com>
)
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: maria <maria@kuuro.net>
…#6392)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Merges 158 upstream commits (b73232b..bab4b6f) into Marcode. 41 paths
conflicted; every one was resolved by hand, combining both intents.
Conflict decisions
------------------
Retired surfaces (Marcode owns the removal)
- apps/web/src/components/files/{FileBrowserPanel,FilePreviewPanel}.tsx:
kept deleted. Upstream only restyled them and added remote-open; that
feature is taken in OpenInPicker instead.
- RightPanelTabs.tsx: took upstream's `desktopByTabId` threading (it now
feeds the preview-tab favicon) and its Button-based add-panel trigger;
dropped `theme`/`PierreEntryIcon`, which exist only for the retired
`file` surface icon. Trimmed the matching props from upstream's new
RightPanelTabs.test.tsx.
- ChatView.tsx: took upstream's pull-request tab-status keying fix
(keyed by the shown surface, not a key rebuilt from the status) and
their workspace file drag-and-drop; dropped `activeFileSurface`.
- ChatMarkdown.tsx / diffFileActions.ts: kept upstream's call shape and
repointed the shared producer at the floating editor. diffFileActions
keeps upstream's new `resolveDiffPathForWorkspace` (a real fix for
repository-relative diff paths in nested projects) and feeds the
result to the editor rather than the right panel; its tests now assert
on the editor store.
Navigation and shell (FloatingPillNav owns brand/nav/settings)
- AppSidebarLayout.tsx, sidebar/SidebarChrome.tsx: kept Marcode's
no-op SidebarControl and update-only footer. Upstream's SidebarBrand /
T3Wordmark / footer nav would ship a second copy of controls the pill
nav already renders, and threadSidebarWidth.test.ts asserts that
removal.
- threadSidebarWidth.test.ts: kept Marcode's brand-removal assertion
over upstream's wordmark assertion.
- chat/ChatHeader.tsx: kept Marcode's title-only header (no thread
action menu / inline rename); took upstream's remote-open imports.
- ui/tooltip.tsx: kept Marcode's inline FLOATING_SURFACE_Z stacking;
upstream's `z-[140]` utility bump is subsumed by it.
Styling refactor followed, behavior kept (index.css)
- Adopted upstream's nested `@variant dark`, `@layer base` stage-art
defaults, `alert-glass` utility and theme-id palettes. Ported
Marcode's monochrome `.stage-blueprint` override onto the renamed
`--stage-art-*` tokens; kept Marcode's dark palette, sidebar surface
rules and floating chrome. Dropped the now-dead `.workspace-topbar`.
- Followed upstream's class retirements at their call sites:
`.chat-composer-glass` -> `surface-glass` (ChatComposer,
PullRequestCodeTab), `.workspace-titlebar-controls` and
`.chat-composer-horizontal-inset` -> inline utilities (ChatView).
Those classes no longer exist, so keeping them would have been a
silent no-op.
- Pull-request panels/UsagePage: took upstream's Button refactor inside
Marcode's Tooltip wrappers rather than choosing one side.
Behavior merged by hand
- threadSettled.ts: combined upstream's new `autoSettleOnMerge` setting
with Marcode's warm-window guard, so a merged/closed PR settles a
thread only once it has been idle. Rewrote upstream's new test to the
combined rule and added a test pinning the warm-window half.
- ThreadTerminalDrawer.tsx: Marcode keeps xterm (for its search addon)
where upstream runs the Ghostty WASM surface, so upstream's two fixes
were ported by hand rather than merged: right-click paste (pingdotgg#5240) and
the Ctrl+C selection-clear guard (pingdotgg#5638). Ghostty's
`pasteFromClipboard` race claim has no xterm equivalent, so the same
race is settled against the request id in the drawer; the context
menu is bound to the mount element instead of a surface option.
Branding and identity
- BitbucketSourceControlProvider.ts: kept MARCODE_* env names, took
upstream's added "user read" scope wording.
- desktopUpdate.logic.ts: took upstream's removal of the Windows-only
install warning (their copy decision, and the `platform` parameter is
gone from every caller); kept Marcode wording.
- ConnectionsSettings.tsx: took upstream's `window.desktopBridge` gate
(the toggle should not show in the web app); kept "Marcode Connect".
- MobileClientsUserProfilePage.tsx: adopted upstream's shared
ClerkUserProfilePage/Row primitives, rebranded to Marcode.
- _chat.pull-requests.tsx: took upstream's plural copy for the new
multi-environment view, rebranded.
- README.md / AGENTS.md: kept Marcode's. Upstream's additions were
either their distribution channel (AUR) or duplicates of sections
Marcode already has.
- docs/internals/scripts.md, packages/shared/package.json,
commandInvariants.test.ts, build-desktop-artifact.ts: additive on both
sides, combined.
- mobile-showcase.test.ts, infra/relay/scripts/deploy.test.ts: kept the
Marcode tests upstream deleted — they pin the `marcode://` scheme and
MARCODE_RELAY_URL — and restored the imports upstream removed.
- pnpm-lock.yaml: regenerated with pnpm, not hand-merged.
Fork-boundary breaks that merged cleanly (no conflict)
--------------------------------------------------------
- .agents/skills/test-t3-mobile/scripts/pair-client.sh: upstream's new
pairing helper used T3CODE_PORT, the `t3code-dev` scheme and
`com.t3tools.t3code.dev`. Marcode uses MARCODE_PORT, `marcode-dev`
and `com.t3tools.marcode.dev`, so the helper could not have paired a
single device. Fixed, along with three stale `t3code-dev` references
already in that skill's SKILL.md.
- .github/workflows/release.yml: upstream wired publish_aur into the
release pipeline. Marcode does not own the `t3code-bin` AUR packages
and the PKGBUILDs fetch from pingdotgg/t3code releases, so a Marcode
release would have failed on the missing secret or pushed upstream's
package. Removed the call site only, leaving publish-aur.yml and
packaging/aur untouched so future syncs do not conflict on them, and
added scripts/release-fork-boundary.test.ts to pin the removal.
- apps/desktop/resources/dmg/*.svg: upstream's new DMG installer
artwork read "T3 CODE" / "Drag T3 Code to Applications". Rebranded.
- clerk/T3ConnectUserProfilePage.tsx + T3ConnectSidebarSignIn.tsx:
a new user-visible account page and tab labelled "T3 Connect".
Rebranded to Marcode Connect; the `t3-connect` route slug and file
names stay upstream-shaped.
- apps/mobile/src/lib/mobileTheme.ts: the new built-in theme picker
labelled the default palette "T3 Code". Relabelled to Marcode; the
persisted `t3-code` id is deliberately unchanged.
- docs/user/mobile-appearance.md: new doc, rebranded to match.
- .github/ISSUE_TEMPLATE/* and CONTRIBUTING.md: upstream moved to a
Discussions-first model and pointed contributors at
pingdotgg/t3code/discussions. Marcode tracks everything in its own
Issues, so the issues-first wording is kept and the cross-repo
contact link dropped.
- scripts/build-desktop-artifact.test.ts: upstream's new DMG assertion
hard-coded their productName. Repointed at Marcode's.
- Verified clean: T3_BOOT_SERVICE_UNIT, T3_SERVICE_LAUNCHER_CONTEXT,
@t3tools/*, the `t3` package name and `t3code:` storage keys remain
upstream-shaped on purpose; MARCODE_HOME still drives the service
launcher; no `t3code/<hex>` branch fixtures leaked past the renamed
WORKTREE_BRANCH_PREFIX.
Verification
------------
- typecheck: web, server, desktop, mobile, contracts, shared,
client-runtime — all clean.
- vp test run over the touched surfaces: 435 tests pass.
- vp fmt --check and vp lint on the changed files/dirs: clean
(warnings only, all pre-existing).
- Not run here: ThreadTerminalDrawer.test.ts and
FloatingTerminalShell.test.ts. Both fail to resolve @aliimam/icons in
this container; the same failure reproduces on origin/main, and that
import is unchanged by this merge. CI covers them, and the hand-ported
terminal paste path has had no runtime verification.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Spcc6CDhDkR7wWAor5829P
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL labels Aug 16, 2026
@github-actions

github-actionsBot commented Aug 16, 2026

Copy link
Copy Markdown

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB12.6 KiB+1.3 KiB (+11.3%)15.1 KiB
CodexThread snapshot wire5.5 KiB6.3 KiB+838 B (+15.0%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB6.3 KiB+472 B (+7.9%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB51.8 KiB+2.1 KiB (+4.2%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB12.6 KiB+1.3 KiB (+11.3%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB6.3 KiB+817 B (+14.6%)7.3 KiB
ClaudeLive turn WebSocket wire5.8 KiB6.3 KiB+497 B (+8.3%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB52.7 KiB+2.1 KiB (+4.2%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 1af3478 · PR result: cf90a76 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 99.9 KiB
  • Claude decoded thread snapshot: 100.6 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

Upstream's new DesktopWslServerTree test seeds its DesktopConfig layer
with T3CODE_HOME and T3CODE_MODE. Marcode reads MARCODE_HOME and
MARCODE_MODE, so `marcodeHome` stayed unset, the desktop state dir
resolved off the test's temp tree, and the sweep assertions never saw
the stale version directory they set up.
Another clean-merge fork-boundary break from the bab4b6f sync: the file
is new upstream, so it arrived without a conflict marker.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Spcc6CDhDkR7wWAor5829P
Upstream added an `isPublicFaviconHost` guard to `faviconUrlForOrigin`,
so it no longer sends private, loopback, or reserved-TLD hostnames to
Google's s2 favicon endpoint. That guard is a privacy fix and is kept.
Marcode's unified workspace tree resolves URL shortcut icons through the
same helper, and its capability-flag test asserted a favicon for a
`http://localhost:3000` shortcut — which is exactly the case upstream
now refuses. Repointed that assertion at a public host and added a test
pinning the new behaviour, since a leaked hostname is invisible in the
UI: the sidebar renders its globe fallback either way.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Spcc6CDhDkR7wWAor5829P
@maarcoClaude

Copy link
Copy Markdown
OwnerAuthor

Two CI rounds, two more clean-merge fork-boundary breaks — both fixed, and one correction to the description above.

9bc1a299DesktopWslServerTree.test.ts seeded its config layer with T3CODE_HOME/T3CODE_MODE. Marcode reads MARCODE_HOME/MARCODE_MODE, so marcodeHome stayed unset and the sweep assertions never saw the temp tree they set up. New upstream file, so no conflict marker.

cf90a76c — favicon privacy guard. Upstream added isPublicFaviconHost to faviconUrlForOrigin, so it no longer sends private, loopback, or reserved-TLD hostnames to Google's s2 endpoint. That is a real privacy fix and is kept. Marcode's unified workspace tree resolves URL shortcut icons through the same helper, and its capability-flag test asserted a favicon for a http://localhost:3000 shortcut — precisely the case upstream now refuses. Repointed at a public host, and added a test pinning the new behaviour, because the leak is invisible in the UI: the sidebar renders its globe fallback either way.

That second one is worth a look during review. It is a behaviour change for anyone who has a URL shortcut pointing at a dev server or an intranet host — those rows lose their favicon and fall back to the globe. That is the correct outcome, but it is user-visible.

Correction to the "Not verified" section

I reported that ThreadTerminalDrawer.test.ts and FloatingTerminalShell.test.ts could not run. That was wrong — it was an artifact of invoking the runner from the repo root instead of the package, which is what broke @aliimam/icons resolution. Run properly they pass, and the full web suite is green locally: 274 files, 2795 tests. So the hand-ported terminal right-click paste is covered by ThreadTerminalDrawer.test.ts, including the pure helpers it adds.

What remains genuinely unverified is narrower than I said: no live client pass on any UI surface, and no interactive exercise of the right-click paste path against a real pty.

One local-only failure worth naming so nobody chases it: packages/sharedNet.test.ts › "findAvailablePort returns preferred when it is free" fails in the sync container. It reserves an ephemeral port, releases it, then asserts the same port comes back — inherently racy under parallel test load. CI passed packages/shared on this exact commit, and this merge only adds a new method to Net.ts without touching findAvailablePort.


Generated by Claude Code

@maarco

Copy link
Copy Markdown
OwnerAuthor

Superseded by #39 (merged, includes 82b8a93).

@maarcomaarco closed this Aug 19, 2026
@maarco
maarco deleted the claude/gracious-bohr-y8476v branch August 19, 2026 05:20
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXLvouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

20 participants

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

chore(upstream): sync marcode through bab4b6f02b8b - #35

Closed
maarco wants to merge 161 commits into
mainfrom
claude/gracious-bohr-y8476v
Closed

chore(upstream): sync marcode through bab4b6f02b8b#35
maarco wants to merge 161 commits into
mainfrom
claude/gracious-bohr-y8476v

Conversation

@maarco

@maarcomaarco commented Aug 16, 2026

Copy link
Copy Markdown
Owner

What Changed

Merges 158 upstream commits, b73232bd..bab4b6f0, into main as one two-parent merge commit (791d415c), plus two follow-up fixes for breaks CI caught. 41 paths conflicted and every one was resolved by hand, combining both intents — no whole-file ours/theirs, no reset/restore/stash/clean, no force push.

Supersedes #29 (through 9e201941), #31 (through 184d8ef3), and #33 (through ad117235) — all three of those SHAs are ancestors of bab4b6f0, and all four branches share the same base. Closing them in favour of this one is your call. Resolves the upstream-sync-blocked issue #34.

Conflict decisions

Retired surfaces (Marcode owns the removal)

  • files/{FileBrowserPanel,FilePreviewPanel}.tsx — kept deleted. Upstream only restyled them and added remote-open; that feature is taken in OpenInPicker instead.
  • RightPanelTabs.tsx — took upstream's desktopByTabId threading (it now feeds the preview-tab favicon) and their Button-based add-panel trigger; dropped theme/PierreEntryIcon, which exist only for the retired file surface icon. Trimmed the matching props from upstream's new RightPanelTabs.test.tsx.
  • ChatView.tsx — took upstream's PR tab-status keying fix (keyed by the shown surface, not a key rebuilt from the status) and their workspace file drag-and-drop; dropped activeFileSurface.
  • ChatMarkdown.tsx / diffFileActions.ts — kept upstream's call shape and repointed the shared producer at the floating editor. diffFileActions keeps upstream's new resolveDiffPathForWorkspace (a real fix for repository-relative diff paths in nested projects) and feeds the result to the editor rather than the right panel; its tests now assert on the editor store.

Navigation and shellAppSidebarLayout.tsx and sidebar/SidebarChrome.tsx keep Marcode's no-op SidebarControl and update-only footer; upstream's SidebarBrand/T3Wordmark/footer nav would ship a second copy of controls FloatingPillNav already renders, and threadSidebarWidth.test.ts asserts that removal. chat/ChatHeader.tsx keeps the title-only header but takes upstream's remote-open imports. ui/tooltip.tsx keeps Marcode's inline FLOATING_SURFACE_Z stacking, which subsumes upstream's z-[140] bump.

Styling refactor followed, behaviour keptindex.css adopts upstream's nested @variant dark, @layer base stage-art defaults, alert-glass utility and theme-id palettes; Marcode's monochrome .stage-blueprint override is ported onto the renamed --stage-art-* tokens, and its dark palette, sidebar surface rules and floating chrome are kept. Upstream's class retirements were followed at their call sites (.chat-composer-glasssurface-glass, .workspace-titlebar-controls and .chat-composer-horizontal-inset → inline utilities) — those classes no longer exist, so keeping them would have been a silent no-op. Pull-request panels and UsagePage take upstream's Button refactor inside Marcode's Tooltip wrappers.

Behaviour merged by hand

  • threadSettled.ts — combined upstream's new autoSettleOnMerge setting with Marcode's warm-window guard, so a merged/closed PR settles a thread only once it has gone idle. Upstream's new test was rewritten to the combined rule, plus a new test pinning the warm-window half.
  • ThreadTerminalDrawer.tsx — Marcode keeps xterm (for its search addon) where upstream runs the Ghostty WASM surface, so upstream's two fixes were ported by hand rather than merged: right-click paste (fix(terminal): right-click paste works in the terminal pingdotgg/t3code#5240) and the Ctrl+C selection-clear guard (fix(web): add copying terminal selection with ctrl+c in the web app pingdotgg/t3code#5638). Ghostty's pasteFromClipboard race claim has no xterm equivalent, so the same race is settled against the request id in the drawer, and the context menu binds to the mount element instead of a surface option.

Branding/identity conflicts (BitbucketSourceControlProvider, desktopUpdate.logic, ConnectionsSettings, MobileClientsUserProfilePage, _chat.pull-requests, README, AGENTS.md) all kept Marcode's product identity while taking the upstream fix in the same hunk — notably upstream's window.desktopBridge gate so the Connect toggle stops showing in the web app, and their removal of the Windows-only update warning (the platform parameter is gone from every caller). mobile-showcase.test.ts and infra/relay/scripts/deploy.test.ts keep the Marcode tests upstream deleted — they pin the marcode:// scheme and MARCODE_RELAY_URL — with the imports upstream removed restored. pnpm-lock.yaml was regenerated with pnpm, not hand-merged.

Fork-boundary breaks that merged cleanly (no conflict)

These are the dangerous ones — they produced no marker and would have shipped silently. Two of the nine were caught by CI rather than by the pre-push sweep.

  1. pair-client.sh — upstream's new mobile pairing helper used T3CODE_PORT, the t3code-dev scheme and com.t3tools.t3code.dev. Marcode uses MARCODE_PORT, marcode-dev, com.t3tools.marcode.dev, so it could not have paired a single device. Fixed, along with three stale t3code-dev references already sitting in that skill's SKILL.md.
  2. release.yml wired publish_aur into the release pipeline. Marcode does not own the t3code-bin AUR packages, and the PKGBUILDs fetch from pingdotgg/t3code releases — a Marcode release would have failed on the missing AUR_SSH_PRIVATE_KEY or pushed upstream's package. Removed the call site only, leaving publish-aur.yml and packaging/aur untouched so future syncs don't conflict on them, and added scripts/release-fork-boundary.test.ts to pin the removal.
  3. DesktopWslServerTree.test.ts seeded its config layer with T3CODE_HOME/T3CODE_MODE (new upstream file, so no marker). Marcode reads MARCODE_HOME/MARCODE_MODE, so marcodeHome stayed unset, the desktop state dir resolved off the test's temp tree, and its sweep assertions never saw the directories they set up. Caught by CI — fixed in 9bc1a299.
  4. Upstream added an isPublicFaviconHost guard to faviconUrlForOrigin, so it stops sending private, loopback and reserved-TLD hostnames to Google's s2 favicon endpoint. That is a privacy fix and is kept — Marcode's unified workspace tree resolves URL-shortcut icons through the same helper, so it was leaking internal hostnames too. Its capability-flag test asserted a favicon for a http://localhost:3000 shortcut, exactly the case upstream now refuses. Caught by CI — fixed in cf90a76c, with a new test pinning the behaviour because the leak is invisible in the UI (the sidebar renders its globe fallback either way). ⚠️This is user-visible: URL shortcuts pointing at a dev server or intranet host lose their favicon.
  5. DMG installer artwork — upstream's new backgrounds read "T3 CODE" / "Drag T3 Code to Applications". Rebranded.
  6. A new "T3 Connect" account page and sidebar tab (T3ConnectUserProfilePage.tsx, T3ConnectSidebarSignIn.tsx). Rebranded to Marcode Connect; the t3-connect route slug and file names stay upstream-shaped.
  7. The new mobile theme picker labelled its default palette "T3 Code." Relabelled to Marcode; the persisted t3-code id is deliberately unchanged so upgrades don't reset anyone's theme. docs/user/mobile-appearance.md rebranded to match.
  8. Issue templates and CONTRIBUTING.md moved to a Discussions-first model pointing at pingdotgg/t3code/discussions. Marcode tracks everything in its own Issues, so the issues-first wording is kept and the cross-repo contact link dropped.
  9. build-desktop-artifact.test.ts hard-coded upstream's productName in a new DMG assertion. Repointed at Marcode's.

Verified still correct on purpose: T3_BOOT_SERVICE_UNIT, T3_SERVICE_LAUNCHER_CONTEXT, @t3tools/*, the t3 package name and t3code: storage keys remain upstream-shaped; MARCODE_HOME still drives the service launcher; no t3code/<hex> branch fixtures leaked past the renamed WORKTREE_BRANCH_PREFIX. After #3, every file this merge touched was re-swept for a T3CODE_* name whose MARCODE_* twin is what actually gets read — the only remaining mismatches are in electron-launcher.mjs and dev-electron.mjs, both byte-identical to main and listed under pre-existing findings below.

Why

Scheduled upstream sync. The delta was too large to land as a clean auto-merge, and several of the resolutions are product decisions (which surface owns file editing, whether a merged PR buries a warm thread, which terminal implementation Marcode carries) rather than mechanical ones.

UI Changes

Not captured — the sync container has no display, and the touched surfaces (sidebar chrome, floating editor entry points, PR panels, terminal drawer, usage page, Connect account page) need a real client. Per the runbook this needs a test-t3-app pass at 390px and 820px before the PR leaves draft.

Checklist

  • This PR is small and focused — no. It is a 158-commit upstream merge; that is the unit of work.
  • I explained what changed and why
  • I included before/after screenshots for any UI changes — see above, not possible from the sync container
  • I included a video for animation/interaction changes

Verification

CI is green on cf90a76c — all four required checks passed: Check, Test, Mobile Native Static Analysis, Release Smoke (plus claude-review). Thread transfer stays within every enforced ceiling. Native fingerprint diff is queued rather than complete; it is not a required check.

Locally: typecheck clean across web, server, desktop, mobile, contracts, shared and client-runtime; the full web suite passes (274 files, 2795 tests); vp fmt --check and vp lint clean on the changed files and directories (warnings only, all pre-existing).

Still unverified — please read before marking ready

  • No live client pass on any UI surface. This is the gap that matters, given how much of the merge lands in web chrome.
  • The hand-ported terminal right-click paste is covered by ThreadTerminalDrawer.test.ts, but has never been exercised interactively against a real pty.

One local-only failure, named so nobody chases it: packages/sharedNet.test.ts › "findAvailablePort returns preferred when it is free" fails in the sync container. It reserves an ephemeral port, releases it, then asserts the same port comes back — inherently racy under parallel test load. CI passes packages/shared on this commit, and this merge only adds a method to Net.ts without touching findAvailablePort.

Pre-existing findings, deliberately not fixed here

Not caused by this merge; flagging rather than widening the diff:

  • build-desktop-artifact.ts registers schemes: ["t3code", "t3code-dev"] and name: "T3 Code" for packaged Linux builds, while macOS uses marcode. Changing it is an OAuth deep-link migration for existing installs, not a rename.
  • electron-launcher.mjs and dev-electron.mjs forward T3CODE_PORT, T3CODE_HOME, T3CODE_COMMIT_HASH, T3CODE_OTLP_* and T3CODE_DESKTOP_APP_USER_MODEL_ID, while the server and DesktopConfig read the MARCODE_* names. Same class of bug as upstream sync blocked: pingdotgg/t3code@6154b46cb86b #3 above, but it predates this merge.
  • desktopUpdate.logic.ts points DESKTOP_RELEASE_TAG_URL at pingdotgg/t3code/releases/tag.
  • ThemePreviewCircles.tsx labels the web standard theme "T3 Code" (the mobile twin was fixed here because this merge introduced it).
  • docs/user/** still says "T3 Code" throughout, and install.md points at upstream's Homebrew cask and AUR packages.

t3-codeBotand others added 30 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>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
…ngdotgg#6495)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
Co-authored-by: t3-code[bot] <236186684+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Wout Stiens <71498452+StiensWout@users.noreply.github.com>
)
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: maria <254055478+maria-rcks@users.noreply.github.com>
yashranawayand others added 18 commits August 15, 2026 12:31
…gdotgg#5989)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>
…7081)
Co-authored-by: codex <codex@users.noreply.github.com>
)
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: maria <maria@kuuro.net>
…#6392)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Merges 158 upstream commits (b73232b..bab4b6f) into Marcode. 41 paths
conflicted; every one was resolved by hand, combining both intents.
Conflict decisions
------------------
Retired surfaces (Marcode owns the removal)
- apps/web/src/components/files/{FileBrowserPanel,FilePreviewPanel}.tsx:
kept deleted. Upstream only restyled them and added remote-open; that
feature is taken in OpenInPicker instead.
- RightPanelTabs.tsx: took upstream's `desktopByTabId` threading (it now
feeds the preview-tab favicon) and its Button-based add-panel trigger;
dropped `theme`/`PierreEntryIcon`, which exist only for the retired
`file` surface icon. Trimmed the matching props from upstream's new
RightPanelTabs.test.tsx.
- ChatView.tsx: took upstream's pull-request tab-status keying fix
(keyed by the shown surface, not a key rebuilt from the status) and
their workspace file drag-and-drop; dropped `activeFileSurface`.
- ChatMarkdown.tsx / diffFileActions.ts: kept upstream's call shape and
repointed the shared producer at the floating editor. diffFileActions
keeps upstream's new `resolveDiffPathForWorkspace` (a real fix for
repository-relative diff paths in nested projects) and feeds the
result to the editor rather than the right panel; its tests now assert
on the editor store.
Navigation and shell (FloatingPillNav owns brand/nav/settings)
- AppSidebarLayout.tsx, sidebar/SidebarChrome.tsx: kept Marcode's
no-op SidebarControl and update-only footer. Upstream's SidebarBrand /
T3Wordmark / footer nav would ship a second copy of controls the pill
nav already renders, and threadSidebarWidth.test.ts asserts that
removal.
- threadSidebarWidth.test.ts: kept Marcode's brand-removal assertion
over upstream's wordmark assertion.
- chat/ChatHeader.tsx: kept Marcode's title-only header (no thread
action menu / inline rename); took upstream's remote-open imports.
- ui/tooltip.tsx: kept Marcode's inline FLOATING_SURFACE_Z stacking;
upstream's `z-[140]` utility bump is subsumed by it.
Styling refactor followed, behavior kept (index.css)
- Adopted upstream's nested `@variant dark`, `@layer base` stage-art
defaults, `alert-glass` utility and theme-id palettes. Ported
Marcode's monochrome `.stage-blueprint` override onto the renamed
`--stage-art-*` tokens; kept Marcode's dark palette, sidebar surface
rules and floating chrome. Dropped the now-dead `.workspace-topbar`.
- Followed upstream's class retirements at their call sites:
`.chat-composer-glass` -> `surface-glass` (ChatComposer,
PullRequestCodeTab), `.workspace-titlebar-controls` and
`.chat-composer-horizontal-inset` -> inline utilities (ChatView).
Those classes no longer exist, so keeping them would have been a
silent no-op.
- Pull-request panels/UsagePage: took upstream's Button refactor inside
Marcode's Tooltip wrappers rather than choosing one side.
Behavior merged by hand
- threadSettled.ts: combined upstream's new `autoSettleOnMerge` setting
with Marcode's warm-window guard, so a merged/closed PR settles a
thread only once it has been idle. Rewrote upstream's new test to the
combined rule and added a test pinning the warm-window half.
- ThreadTerminalDrawer.tsx: Marcode keeps xterm (for its search addon)
where upstream runs the Ghostty WASM surface, so upstream's two fixes
were ported by hand rather than merged: right-click paste (pingdotgg#5240) and
the Ctrl+C selection-clear guard (pingdotgg#5638). Ghostty's
`pasteFromClipboard` race claim has no xterm equivalent, so the same
race is settled against the request id in the drawer; the context
menu is bound to the mount element instead of a surface option.
Branding and identity
- BitbucketSourceControlProvider.ts: kept MARCODE_* env names, took
upstream's added "user read" scope wording.
- desktopUpdate.logic.ts: took upstream's removal of the Windows-only
install warning (their copy decision, and the `platform` parameter is
gone from every caller); kept Marcode wording.
- ConnectionsSettings.tsx: took upstream's `window.desktopBridge` gate
(the toggle should not show in the web app); kept "Marcode Connect".
- MobileClientsUserProfilePage.tsx: adopted upstream's shared
ClerkUserProfilePage/Row primitives, rebranded to Marcode.
- _chat.pull-requests.tsx: took upstream's plural copy for the new
multi-environment view, rebranded.
- README.md / AGENTS.md: kept Marcode's. Upstream's additions were
either their distribution channel (AUR) or duplicates of sections
Marcode already has.
- docs/internals/scripts.md, packages/shared/package.json,
commandInvariants.test.ts, build-desktop-artifact.ts: additive on both
sides, combined.
- mobile-showcase.test.ts, infra/relay/scripts/deploy.test.ts: kept the
Marcode tests upstream deleted — they pin the `marcode://` scheme and
MARCODE_RELAY_URL — and restored the imports upstream removed.
- pnpm-lock.yaml: regenerated with pnpm, not hand-merged.
Fork-boundary breaks that merged cleanly (no conflict)
--------------------------------------------------------
- .agents/skills/test-t3-mobile/scripts/pair-client.sh: upstream's new
pairing helper used T3CODE_PORT, the `t3code-dev` scheme and
`com.t3tools.t3code.dev`. Marcode uses MARCODE_PORT, `marcode-dev`
and `com.t3tools.marcode.dev`, so the helper could not have paired a
single device. Fixed, along with three stale `t3code-dev` references
already in that skill's SKILL.md.
- .github/workflows/release.yml: upstream wired publish_aur into the
release pipeline. Marcode does not own the `t3code-bin` AUR packages
and the PKGBUILDs fetch from pingdotgg/t3code releases, so a Marcode
release would have failed on the missing secret or pushed upstream's
package. Removed the call site only, leaving publish-aur.yml and
packaging/aur untouched so future syncs do not conflict on them, and
added scripts/release-fork-boundary.test.ts to pin the removal.
- apps/desktop/resources/dmg/*.svg: upstream's new DMG installer
artwork read "T3 CODE" / "Drag T3 Code to Applications". Rebranded.
- clerk/T3ConnectUserProfilePage.tsx + T3ConnectSidebarSignIn.tsx:
a new user-visible account page and tab labelled "T3 Connect".
Rebranded to Marcode Connect; the `t3-connect` route slug and file
names stay upstream-shaped.
- apps/mobile/src/lib/mobileTheme.ts: the new built-in theme picker
labelled the default palette "T3 Code". Relabelled to Marcode; the
persisted `t3-code` id is deliberately unchanged.
- docs/user/mobile-appearance.md: new doc, rebranded to match.
- .github/ISSUE_TEMPLATE/* and CONTRIBUTING.md: upstream moved to a
Discussions-first model and pointed contributors at
pingdotgg/t3code/discussions. Marcode tracks everything in its own
Issues, so the issues-first wording is kept and the cross-repo
contact link dropped.
- scripts/build-desktop-artifact.test.ts: upstream's new DMG assertion
hard-coded their productName. Repointed at Marcode's.
- Verified clean: T3_BOOT_SERVICE_UNIT, T3_SERVICE_LAUNCHER_CONTEXT,
@t3tools/*, the `t3` package name and `t3code:` storage keys remain
upstream-shaped on purpose; MARCODE_HOME still drives the service
launcher; no `t3code/<hex>` branch fixtures leaked past the renamed
WORKTREE_BRANCH_PREFIX.
Verification
------------
- typecheck: web, server, desktop, mobile, contracts, shared,
client-runtime — all clean.
- vp test run over the touched surfaces: 435 tests pass.
- vp fmt --check and vp lint on the changed files/dirs: clean
(warnings only, all pre-existing).
- Not run here: ThreadTerminalDrawer.test.ts and
FloatingTerminalShell.test.ts. Both fail to resolve @aliimam/icons in
this container; the same failure reproduces on origin/main, and that
import is unchanged by this merge. CI covers them, and the hand-ported
terminal paste path has had no runtime verification.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Spcc6CDhDkR7wWAor5829P
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL labels Aug 16, 2026
@github-actions

github-actionsBot commented Aug 16, 2026

Copy link
Copy Markdown

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB12.6 KiB+1.3 KiB (+11.3%)15.1 KiB
CodexThread snapshot wire5.5 KiB6.3 KiB+838 B (+15.0%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB6.3 KiB+472 B (+7.9%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB51.8 KiB+2.1 KiB (+4.2%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB12.6 KiB+1.3 KiB (+11.3%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB6.3 KiB+817 B (+14.6%)7.3 KiB
ClaudeLive turn WebSocket wire5.8 KiB6.3 KiB+497 B (+8.3%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB52.7 KiB+2.1 KiB (+4.2%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 1af3478 · PR result: cf90a76 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 99.9 KiB
  • Claude decoded thread snapshot: 100.6 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

Upstream's new DesktopWslServerTree test seeds its DesktopConfig layer
with T3CODE_HOME and T3CODE_MODE. Marcode reads MARCODE_HOME and
MARCODE_MODE, so `marcodeHome` stayed unset, the desktop state dir
resolved off the test's temp tree, and the sweep assertions never saw
the stale version directory they set up.
Another clean-merge fork-boundary break from the bab4b6f sync: the file
is new upstream, so it arrived without a conflict marker.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Spcc6CDhDkR7wWAor5829P
Upstream added an `isPublicFaviconHost` guard to `faviconUrlForOrigin`,
so it no longer sends private, loopback, or reserved-TLD hostnames to
Google's s2 favicon endpoint. That guard is a privacy fix and is kept.
Marcode's unified workspace tree resolves URL shortcut icons through the
same helper, and its capability-flag test asserted a favicon for a
`http://localhost:3000` shortcut — which is exactly the case upstream
now refuses. Repointed that assertion at a public host and added a test
pinning the new behaviour, since a leaked hostname is invisible in the
UI: the sidebar renders its globe fallback either way.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Spcc6CDhDkR7wWAor5829P
@maarcoClaude

Copy link
Copy Markdown
OwnerAuthor

Two CI rounds, two more clean-merge fork-boundary breaks — both fixed, and one correction to the description above.

9bc1a299DesktopWslServerTree.test.ts seeded its config layer with T3CODE_HOME/T3CODE_MODE. Marcode reads MARCODE_HOME/MARCODE_MODE, so marcodeHome stayed unset and the sweep assertions never saw the temp tree they set up. New upstream file, so no conflict marker.

cf90a76c — favicon privacy guard. Upstream added isPublicFaviconHost to faviconUrlForOrigin, so it no longer sends private, loopback, or reserved-TLD hostnames to Google's s2 endpoint. That is a real privacy fix and is kept. Marcode's unified workspace tree resolves URL shortcut icons through the same helper, and its capability-flag test asserted a favicon for a http://localhost:3000 shortcut — precisely the case upstream now refuses. Repointed at a public host, and added a test pinning the new behaviour, because the leak is invisible in the UI: the sidebar renders its globe fallback either way.

That second one is worth a look during review. It is a behaviour change for anyone who has a URL shortcut pointing at a dev server or an intranet host — those rows lose their favicon and fall back to the globe. That is the correct outcome, but it is user-visible.

Correction to the "Not verified" section

I reported that ThreadTerminalDrawer.test.ts and FloatingTerminalShell.test.ts could not run. That was wrong — it was an artifact of invoking the runner from the repo root instead of the package, which is what broke @aliimam/icons resolution. Run properly they pass, and the full web suite is green locally: 274 files, 2795 tests. So the hand-ported terminal right-click paste is covered by ThreadTerminalDrawer.test.ts, including the pure helpers it adds.

What remains genuinely unverified is narrower than I said: no live client pass on any UI surface, and no interactive exercise of the right-click paste path against a real pty.

One local-only failure worth naming so nobody chases it: packages/sharedNet.test.ts › "findAvailablePort returns preferred when it is free" fails in the sync container. It reserves an ephemeral port, releases it, then asserts the same port comes back — inherently racy under parallel test load. CI passed packages/shared on this exact commit, and this merge only adds a new method to Net.ts without touching findAvailablePort.


Generated by Claude Code

@maarco

Copy link
Copy Markdown
OwnerAuthor

Superseded by #39 (merged, includes 82b8a93).

@maarcomaarco closed this Aug 19, 2026
@maarco
maarco deleted the claude/gracious-bohr-y8476v branch August 19, 2026 05:20
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXLvouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

20 participants

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

chore(upstream): sync marcode through bab4b6f02b8b - #35

Closed
maarco wants to merge 161 commits into
mainfrom
claude/gracious-bohr-y8476v
Closed

chore(upstream): sync marcode through bab4b6f02b8b#35
maarco wants to merge 161 commits into
mainfrom
claude/gracious-bohr-y8476v

Conversation

@maarco

@maarcomaarco commented Aug 16, 2026

Copy link
Copy Markdown
Owner

What Changed

Merges 158 upstream commits, b73232bd..bab4b6f0, into main as one two-parent merge commit (791d415c), plus two follow-up fixes for breaks CI caught. 41 paths conflicted and every one was resolved by hand, combining both intents — no whole-file ours/theirs, no reset/restore/stash/clean, no force push.

Supersedes #29 (through 9e201941), #31 (through 184d8ef3), and #33 (through ad117235) — all three of those SHAs are ancestors of bab4b6f0, and all four branches share the same base. Closing them in favour of this one is your call. Resolves the upstream-sync-blocked issue #34.

Conflict decisions

Retired surfaces (Marcode owns the removal)

  • files/{FileBrowserPanel,FilePreviewPanel}.tsx — kept deleted. Upstream only restyled them and added remote-open; that feature is taken in OpenInPicker instead.
  • RightPanelTabs.tsx — took upstream's desktopByTabId threading (it now feeds the preview-tab favicon) and their Button-based add-panel trigger; dropped theme/PierreEntryIcon, which exist only for the retired file surface icon. Trimmed the matching props from upstream's new RightPanelTabs.test.tsx.
  • ChatView.tsx — took upstream's PR tab-status keying fix (keyed by the shown surface, not a key rebuilt from the status) and their workspace file drag-and-drop; dropped activeFileSurface.
  • ChatMarkdown.tsx / diffFileActions.ts — kept upstream's call shape and repointed the shared producer at the floating editor. diffFileActions keeps upstream's new resolveDiffPathForWorkspace (a real fix for repository-relative diff paths in nested projects) and feeds the result to the editor rather than the right panel; its tests now assert on the editor store.

Navigation and shellAppSidebarLayout.tsx and sidebar/SidebarChrome.tsx keep Marcode's no-op SidebarControl and update-only footer; upstream's SidebarBrand/T3Wordmark/footer nav would ship a second copy of controls FloatingPillNav already renders, and threadSidebarWidth.test.ts asserts that removal. chat/ChatHeader.tsx keeps the title-only header but takes upstream's remote-open imports. ui/tooltip.tsx keeps Marcode's inline FLOATING_SURFACE_Z stacking, which subsumes upstream's z-[140] bump.

Styling refactor followed, behaviour keptindex.css adopts upstream's nested @variant dark, @layer base stage-art defaults, alert-glass utility and theme-id palettes; Marcode's monochrome .stage-blueprint override is ported onto the renamed --stage-art-* tokens, and its dark palette, sidebar surface rules and floating chrome are kept. Upstream's class retirements were followed at their call sites (.chat-composer-glasssurface-glass, .workspace-titlebar-controls and .chat-composer-horizontal-inset → inline utilities) — those classes no longer exist, so keeping them would have been a silent no-op. Pull-request panels and UsagePage take upstream's Button refactor inside Marcode's Tooltip wrappers.

Behaviour merged by hand

  • threadSettled.ts — combined upstream's new autoSettleOnMerge setting with Marcode's warm-window guard, so a merged/closed PR settles a thread only once it has gone idle. Upstream's new test was rewritten to the combined rule, plus a new test pinning the warm-window half.
  • ThreadTerminalDrawer.tsx — Marcode keeps xterm (for its search addon) where upstream runs the Ghostty WASM surface, so upstream's two fixes were ported by hand rather than merged: right-click paste (fix(terminal): right-click paste works in the terminal pingdotgg/t3code#5240) and the Ctrl+C selection-clear guard (fix(web): add copying terminal selection with ctrl+c in the web app pingdotgg/t3code#5638). Ghostty's pasteFromClipboard race claim has no xterm equivalent, so the same race is settled against the request id in the drawer, and the context menu binds to the mount element instead of a surface option.

Branding/identity conflicts (BitbucketSourceControlProvider, desktopUpdate.logic, ConnectionsSettings, MobileClientsUserProfilePage, _chat.pull-requests, README, AGENTS.md) all kept Marcode's product identity while taking the upstream fix in the same hunk — notably upstream's window.desktopBridge gate so the Connect toggle stops showing in the web app, and their removal of the Windows-only update warning (the platform parameter is gone from every caller). mobile-showcase.test.ts and infra/relay/scripts/deploy.test.ts keep the Marcode tests upstream deleted — they pin the marcode:// scheme and MARCODE_RELAY_URL — with the imports upstream removed restored. pnpm-lock.yaml was regenerated with pnpm, not hand-merged.

Fork-boundary breaks that merged cleanly (no conflict)

These are the dangerous ones — they produced no marker and would have shipped silently. Two of the nine were caught by CI rather than by the pre-push sweep.

  1. pair-client.sh — upstream's new mobile pairing helper used T3CODE_PORT, the t3code-dev scheme and com.t3tools.t3code.dev. Marcode uses MARCODE_PORT, marcode-dev, com.t3tools.marcode.dev, so it could not have paired a single device. Fixed, along with three stale t3code-dev references already sitting in that skill's SKILL.md.
  2. release.yml wired publish_aur into the release pipeline. Marcode does not own the t3code-bin AUR packages, and the PKGBUILDs fetch from pingdotgg/t3code releases — a Marcode release would have failed on the missing AUR_SSH_PRIVATE_KEY or pushed upstream's package. Removed the call site only, leaving publish-aur.yml and packaging/aur untouched so future syncs don't conflict on them, and added scripts/release-fork-boundary.test.ts to pin the removal.
  3. DesktopWslServerTree.test.ts seeded its config layer with T3CODE_HOME/T3CODE_MODE (new upstream file, so no marker). Marcode reads MARCODE_HOME/MARCODE_MODE, so marcodeHome stayed unset, the desktop state dir resolved off the test's temp tree, and its sweep assertions never saw the directories they set up. Caught by CI — fixed in 9bc1a299.
  4. Upstream added an isPublicFaviconHost guard to faviconUrlForOrigin, so it stops sending private, loopback and reserved-TLD hostnames to Google's s2 favicon endpoint. That is a privacy fix and is kept — Marcode's unified workspace tree resolves URL-shortcut icons through the same helper, so it was leaking internal hostnames too. Its capability-flag test asserted a favicon for a http://localhost:3000 shortcut, exactly the case upstream now refuses. Caught by CI — fixed in cf90a76c, with a new test pinning the behaviour because the leak is invisible in the UI (the sidebar renders its globe fallback either way). ⚠️This is user-visible: URL shortcuts pointing at a dev server or intranet host lose their favicon.
  5. DMG installer artwork — upstream's new backgrounds read "T3 CODE" / "Drag T3 Code to Applications". Rebranded.
  6. A new "T3 Connect" account page and sidebar tab (T3ConnectUserProfilePage.tsx, T3ConnectSidebarSignIn.tsx). Rebranded to Marcode Connect; the t3-connect route slug and file names stay upstream-shaped.
  7. The new mobile theme picker labelled its default palette "T3 Code." Relabelled to Marcode; the persisted t3-code id is deliberately unchanged so upgrades don't reset anyone's theme. docs/user/mobile-appearance.md rebranded to match.
  8. Issue templates and CONTRIBUTING.md moved to a Discussions-first model pointing at pingdotgg/t3code/discussions. Marcode tracks everything in its own Issues, so the issues-first wording is kept and the cross-repo contact link dropped.
  9. build-desktop-artifact.test.ts hard-coded upstream's productName in a new DMG assertion. Repointed at Marcode's.

Verified still correct on purpose: T3_BOOT_SERVICE_UNIT, T3_SERVICE_LAUNCHER_CONTEXT, @t3tools/*, the t3 package name and t3code: storage keys remain upstream-shaped; MARCODE_HOME still drives the service launcher; no t3code/<hex> branch fixtures leaked past the renamed WORKTREE_BRANCH_PREFIX. After #3, every file this merge touched was re-swept for a T3CODE_* name whose MARCODE_* twin is what actually gets read — the only remaining mismatches are in electron-launcher.mjs and dev-electron.mjs, both byte-identical to main and listed under pre-existing findings below.

Why

Scheduled upstream sync. The delta was too large to land as a clean auto-merge, and several of the resolutions are product decisions (which surface owns file editing, whether a merged PR buries a warm thread, which terminal implementation Marcode carries) rather than mechanical ones.

UI Changes

Not captured — the sync container has no display, and the touched surfaces (sidebar chrome, floating editor entry points, PR panels, terminal drawer, usage page, Connect account page) need a real client. Per the runbook this needs a test-t3-app pass at 390px and 820px before the PR leaves draft.

Checklist

  • This PR is small and focused — no. It is a 158-commit upstream merge; that is the unit of work.
  • I explained what changed and why
  • I included before/after screenshots for any UI changes — see above, not possible from the sync container
  • I included a video for animation/interaction changes

Verification

CI is green on cf90a76c — all four required checks passed: Check, Test, Mobile Native Static Analysis, Release Smoke (plus claude-review). Thread transfer stays within every enforced ceiling. Native fingerprint diff is queued rather than complete; it is not a required check.

Locally: typecheck clean across web, server, desktop, mobile, contracts, shared and client-runtime; the full web suite passes (274 files, 2795 tests); vp fmt --check and vp lint clean on the changed files and directories (warnings only, all pre-existing).

Still unverified — please read before marking ready

  • No live client pass on any UI surface. This is the gap that matters, given how much of the merge lands in web chrome.
  • The hand-ported terminal right-click paste is covered by ThreadTerminalDrawer.test.ts, but has never been exercised interactively against a real pty.

One local-only failure, named so nobody chases it: packages/sharedNet.test.ts › "findAvailablePort returns preferred when it is free" fails in the sync container. It reserves an ephemeral port, releases it, then asserts the same port comes back — inherently racy under parallel test load. CI passes packages/shared on this commit, and this merge only adds a method to Net.ts without touching findAvailablePort.

Pre-existing findings, deliberately not fixed here

Not caused by this merge; flagging rather than widening the diff:

  • build-desktop-artifact.ts registers schemes: ["t3code", "t3code-dev"] and name: "T3 Code" for packaged Linux builds, while macOS uses marcode. Changing it is an OAuth deep-link migration for existing installs, not a rename.
  • electron-launcher.mjs and dev-electron.mjs forward T3CODE_PORT, T3CODE_HOME, T3CODE_COMMIT_HASH, T3CODE_OTLP_* and T3CODE_DESKTOP_APP_USER_MODEL_ID, while the server and DesktopConfig read the MARCODE_* names. Same class of bug as upstream sync blocked: pingdotgg/t3code@6154b46cb86b #3 above, but it predates this merge.
  • desktopUpdate.logic.ts points DESKTOP_RELEASE_TAG_URL at pingdotgg/t3code/releases/tag.
  • ThemePreviewCircles.tsx labels the web standard theme "T3 Code" (the mobile twin was fixed here because this merge introduced it).
  • docs/user/** still says "T3 Code" throughout, and install.md points at upstream's Homebrew cask and AUR packages.

t3-codeBotand others added 30 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>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
…ngdotgg#6495)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
Co-authored-by: t3-code[bot] <236186684+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Wout Stiens <71498452+StiensWout@users.noreply.github.com>
)
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: maria <254055478+maria-rcks@users.noreply.github.com>
yashranawayand others added 18 commits August 15, 2026 12:31
…gdotgg#5989)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>
…7081)
Co-authored-by: codex <codex@users.noreply.github.com>
)
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: maria <maria@kuuro.net>
…#6392)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Merges 158 upstream commits (b73232b..bab4b6f) into Marcode. 41 paths
conflicted; every one was resolved by hand, combining both intents.
Conflict decisions
------------------
Retired surfaces (Marcode owns the removal)
- apps/web/src/components/files/{FileBrowserPanel,FilePreviewPanel}.tsx:
kept deleted. Upstream only restyled them and added remote-open; that
feature is taken in OpenInPicker instead.
- RightPanelTabs.tsx: took upstream's `desktopByTabId` threading (it now
feeds the preview-tab favicon) and its Button-based add-panel trigger;
dropped `theme`/`PierreEntryIcon`, which exist only for the retired
`file` surface icon. Trimmed the matching props from upstream's new
RightPanelTabs.test.tsx.
- ChatView.tsx: took upstream's pull-request tab-status keying fix
(keyed by the shown surface, not a key rebuilt from the status) and
their workspace file drag-and-drop; dropped `activeFileSurface`.
- ChatMarkdown.tsx / diffFileActions.ts: kept upstream's call shape and
repointed the shared producer at the floating editor. diffFileActions
keeps upstream's new `resolveDiffPathForWorkspace` (a real fix for
repository-relative diff paths in nested projects) and feeds the
result to the editor rather than the right panel; its tests now assert
on the editor store.
Navigation and shell (FloatingPillNav owns brand/nav/settings)
- AppSidebarLayout.tsx, sidebar/SidebarChrome.tsx: kept Marcode's
no-op SidebarControl and update-only footer. Upstream's SidebarBrand /
T3Wordmark / footer nav would ship a second copy of controls the pill
nav already renders, and threadSidebarWidth.test.ts asserts that
removal.
- threadSidebarWidth.test.ts: kept Marcode's brand-removal assertion
over upstream's wordmark assertion.
- chat/ChatHeader.tsx: kept Marcode's title-only header (no thread
action menu / inline rename); took upstream's remote-open imports.
- ui/tooltip.tsx: kept Marcode's inline FLOATING_SURFACE_Z stacking;
upstream's `z-[140]` utility bump is subsumed by it.
Styling refactor followed, behavior kept (index.css)
- Adopted upstream's nested `@variant dark`, `@layer base` stage-art
defaults, `alert-glass` utility and theme-id palettes. Ported
Marcode's monochrome `.stage-blueprint` override onto the renamed
`--stage-art-*` tokens; kept Marcode's dark palette, sidebar surface
rules and floating chrome. Dropped the now-dead `.workspace-topbar`.
- Followed upstream's class retirements at their call sites:
`.chat-composer-glass` -> `surface-glass` (ChatComposer,
PullRequestCodeTab), `.workspace-titlebar-controls` and
`.chat-composer-horizontal-inset` -> inline utilities (ChatView).
Those classes no longer exist, so keeping them would have been a
silent no-op.
- Pull-request panels/UsagePage: took upstream's Button refactor inside
Marcode's Tooltip wrappers rather than choosing one side.
Behavior merged by hand
- threadSettled.ts: combined upstream's new `autoSettleOnMerge` setting
with Marcode's warm-window guard, so a merged/closed PR settles a
thread only once it has been idle. Rewrote upstream's new test to the
combined rule and added a test pinning the warm-window half.
- ThreadTerminalDrawer.tsx: Marcode keeps xterm (for its search addon)
where upstream runs the Ghostty WASM surface, so upstream's two fixes
were ported by hand rather than merged: right-click paste (pingdotgg#5240) and
the Ctrl+C selection-clear guard (pingdotgg#5638). Ghostty's
`pasteFromClipboard` race claim has no xterm equivalent, so the same
race is settled against the request id in the drawer; the context
menu is bound to the mount element instead of a surface option.
Branding and identity
- BitbucketSourceControlProvider.ts: kept MARCODE_* env names, took
upstream's added "user read" scope wording.
- desktopUpdate.logic.ts: took upstream's removal of the Windows-only
install warning (their copy decision, and the `platform` parameter is
gone from every caller); kept Marcode wording.
- ConnectionsSettings.tsx: took upstream's `window.desktopBridge` gate
(the toggle should not show in the web app); kept "Marcode Connect".
- MobileClientsUserProfilePage.tsx: adopted upstream's shared
ClerkUserProfilePage/Row primitives, rebranded to Marcode.
- _chat.pull-requests.tsx: took upstream's plural copy for the new
multi-environment view, rebranded.
- README.md / AGENTS.md: kept Marcode's. Upstream's additions were
either their distribution channel (AUR) or duplicates of sections
Marcode already has.
- docs/internals/scripts.md, packages/shared/package.json,
commandInvariants.test.ts, build-desktop-artifact.ts: additive on both
sides, combined.
- mobile-showcase.test.ts, infra/relay/scripts/deploy.test.ts: kept the
Marcode tests upstream deleted — they pin the `marcode://` scheme and
MARCODE_RELAY_URL — and restored the imports upstream removed.
- pnpm-lock.yaml: regenerated with pnpm, not hand-merged.
Fork-boundary breaks that merged cleanly (no conflict)
--------------------------------------------------------
- .agents/skills/test-t3-mobile/scripts/pair-client.sh: upstream's new
pairing helper used T3CODE_PORT, the `t3code-dev` scheme and
`com.t3tools.t3code.dev`. Marcode uses MARCODE_PORT, `marcode-dev`
and `com.t3tools.marcode.dev`, so the helper could not have paired a
single device. Fixed, along with three stale `t3code-dev` references
already in that skill's SKILL.md.
- .github/workflows/release.yml: upstream wired publish_aur into the
release pipeline. Marcode does not own the `t3code-bin` AUR packages
and the PKGBUILDs fetch from pingdotgg/t3code releases, so a Marcode
release would have failed on the missing secret or pushed upstream's
package. Removed the call site only, leaving publish-aur.yml and
packaging/aur untouched so future syncs do not conflict on them, and
added scripts/release-fork-boundary.test.ts to pin the removal.
- apps/desktop/resources/dmg/*.svg: upstream's new DMG installer
artwork read "T3 CODE" / "Drag T3 Code to Applications". Rebranded.
- clerk/T3ConnectUserProfilePage.tsx + T3ConnectSidebarSignIn.tsx:
a new user-visible account page and tab labelled "T3 Connect".
Rebranded to Marcode Connect; the `t3-connect` route slug and file
names stay upstream-shaped.
- apps/mobile/src/lib/mobileTheme.ts: the new built-in theme picker
labelled the default palette "T3 Code". Relabelled to Marcode; the
persisted `t3-code` id is deliberately unchanged.
- docs/user/mobile-appearance.md: new doc, rebranded to match.
- .github/ISSUE_TEMPLATE/* and CONTRIBUTING.md: upstream moved to a
Discussions-first model and pointed contributors at
pingdotgg/t3code/discussions. Marcode tracks everything in its own
Issues, so the issues-first wording is kept and the cross-repo
contact link dropped.
- scripts/build-desktop-artifact.test.ts: upstream's new DMG assertion
hard-coded their productName. Repointed at Marcode's.
- Verified clean: T3_BOOT_SERVICE_UNIT, T3_SERVICE_LAUNCHER_CONTEXT,
@t3tools/*, the `t3` package name and `t3code:` storage keys remain
upstream-shaped on purpose; MARCODE_HOME still drives the service
launcher; no `t3code/<hex>` branch fixtures leaked past the renamed
WORKTREE_BRANCH_PREFIX.
Verification
------------
- typecheck: web, server, desktop, mobile, contracts, shared,
client-runtime — all clean.
- vp test run over the touched surfaces: 435 tests pass.
- vp fmt --check and vp lint on the changed files/dirs: clean
(warnings only, all pre-existing).
- Not run here: ThreadTerminalDrawer.test.ts and
FloatingTerminalShell.test.ts. Both fail to resolve @aliimam/icons in
this container; the same failure reproduces on origin/main, and that
import is unchanged by this merge. CI covers them, and the hand-ported
terminal paste path has had no runtime verification.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Spcc6CDhDkR7wWAor5829P
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL labels Aug 16, 2026
@github-actions

github-actionsBot commented Aug 16, 2026

Copy link
Copy Markdown

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB12.6 KiB+1.3 KiB (+11.3%)15.1 KiB
CodexThread snapshot wire5.5 KiB6.3 KiB+838 B (+15.0%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB6.3 KiB+472 B (+7.9%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB51.8 KiB+2.1 KiB (+4.2%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB12.6 KiB+1.3 KiB (+11.3%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB6.3 KiB+817 B (+14.6%)7.3 KiB
ClaudeLive turn WebSocket wire5.8 KiB6.3 KiB+497 B (+8.3%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB52.7 KiB+2.1 KiB (+4.2%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 1af3478 · PR result: cf90a76 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 99.9 KiB
  • Claude decoded thread snapshot: 100.6 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

Upstream's new DesktopWslServerTree test seeds its DesktopConfig layer
with T3CODE_HOME and T3CODE_MODE. Marcode reads MARCODE_HOME and
MARCODE_MODE, so `marcodeHome` stayed unset, the desktop state dir
resolved off the test's temp tree, and the sweep assertions never saw
the stale version directory they set up.
Another clean-merge fork-boundary break from the bab4b6f sync: the file
is new upstream, so it arrived without a conflict marker.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Spcc6CDhDkR7wWAor5829P
Upstream added an `isPublicFaviconHost` guard to `faviconUrlForOrigin`,
so it no longer sends private, loopback, or reserved-TLD hostnames to
Google's s2 favicon endpoint. That guard is a privacy fix and is kept.
Marcode's unified workspace tree resolves URL shortcut icons through the
same helper, and its capability-flag test asserted a favicon for a
`http://localhost:3000` shortcut — which is exactly the case upstream
now refuses. Repointed that assertion at a public host and added a test
pinning the new behaviour, since a leaked hostname is invisible in the
UI: the sidebar renders its globe fallback either way.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Spcc6CDhDkR7wWAor5829P
@maarcoClaude

Copy link
Copy Markdown
OwnerAuthor

Two CI rounds, two more clean-merge fork-boundary breaks — both fixed, and one correction to the description above.

9bc1a299DesktopWslServerTree.test.ts seeded its config layer with T3CODE_HOME/T3CODE_MODE. Marcode reads MARCODE_HOME/MARCODE_MODE, so marcodeHome stayed unset and the sweep assertions never saw the temp tree they set up. New upstream file, so no conflict marker.

cf90a76c — favicon privacy guard. Upstream added isPublicFaviconHost to faviconUrlForOrigin, so it no longer sends private, loopback, or reserved-TLD hostnames to Google's s2 endpoint. That is a real privacy fix and is kept. Marcode's unified workspace tree resolves URL shortcut icons through the same helper, and its capability-flag test asserted a favicon for a http://localhost:3000 shortcut — precisely the case upstream now refuses. Repointed at a public host, and added a test pinning the new behaviour, because the leak is invisible in the UI: the sidebar renders its globe fallback either way.

That second one is worth a look during review. It is a behaviour change for anyone who has a URL shortcut pointing at a dev server or an intranet host — those rows lose their favicon and fall back to the globe. That is the correct outcome, but it is user-visible.

Correction to the "Not verified" section

I reported that ThreadTerminalDrawer.test.ts and FloatingTerminalShell.test.ts could not run. That was wrong — it was an artifact of invoking the runner from the repo root instead of the package, which is what broke @aliimam/icons resolution. Run properly they pass, and the full web suite is green locally: 274 files, 2795 tests. So the hand-ported terminal right-click paste is covered by ThreadTerminalDrawer.test.ts, including the pure helpers it adds.

What remains genuinely unverified is narrower than I said: no live client pass on any UI surface, and no interactive exercise of the right-click paste path against a real pty.

One local-only failure worth naming so nobody chases it: packages/sharedNet.test.ts › "findAvailablePort returns preferred when it is free" fails in the sync container. It reserves an ephemeral port, releases it, then asserts the same port comes back — inherently racy under parallel test load. CI passed packages/shared on this exact commit, and this merge only adds a new method to Net.ts without touching findAvailablePort.


Generated by Claude Code

@maarco

Copy link
Copy Markdown
OwnerAuthor

Superseded by #39 (merged, includes 82b8a93).

@maarcomaarco closed this Aug 19, 2026
@maarco
maarco deleted the claude/gracious-bohr-y8476v branch August 19, 2026 05:20
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXLvouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

20 participants

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

chore(upstream): sync marcode through bab4b6f02b8b - #35

Closed
maarco wants to merge 161 commits into
mainfrom
claude/gracious-bohr-y8476v
Closed

chore(upstream): sync marcode through bab4b6f02b8b#35
maarco wants to merge 161 commits into
mainfrom
claude/gracious-bohr-y8476v

Conversation

@maarco

@maarcomaarco commented Aug 16, 2026

Copy link
Copy Markdown
Owner

What Changed

Merges 158 upstream commits, b73232bd..bab4b6f0, into main as one two-parent merge commit (791d415c), plus two follow-up fixes for breaks CI caught. 41 paths conflicted and every one was resolved by hand, combining both intents — no whole-file ours/theirs, no reset/restore/stash/clean, no force push.

Supersedes #29 (through 9e201941), #31 (through 184d8ef3), and #33 (through ad117235) — all three of those SHAs are ancestors of bab4b6f0, and all four branches share the same base. Closing them in favour of this one is your call. Resolves the upstream-sync-blocked issue #34.

Conflict decisions

Retired surfaces (Marcode owns the removal)

  • files/{FileBrowserPanel,FilePreviewPanel}.tsx — kept deleted. Upstream only restyled them and added remote-open; that feature is taken in OpenInPicker instead.
  • RightPanelTabs.tsx — took upstream's desktopByTabId threading (it now feeds the preview-tab favicon) and their Button-based add-panel trigger; dropped theme/PierreEntryIcon, which exist only for the retired file surface icon. Trimmed the matching props from upstream's new RightPanelTabs.test.tsx.
  • ChatView.tsx — took upstream's PR tab-status keying fix (keyed by the shown surface, not a key rebuilt from the status) and their workspace file drag-and-drop; dropped activeFileSurface.
  • ChatMarkdown.tsx / diffFileActions.ts — kept upstream's call shape and repointed the shared producer at the floating editor. diffFileActions keeps upstream's new resolveDiffPathForWorkspace (a real fix for repository-relative diff paths in nested projects) and feeds the result to the editor rather than the right panel; its tests now assert on the editor store.

Navigation and shellAppSidebarLayout.tsx and sidebar/SidebarChrome.tsx keep Marcode's no-op SidebarControl and update-only footer; upstream's SidebarBrand/T3Wordmark/footer nav would ship a second copy of controls FloatingPillNav already renders, and threadSidebarWidth.test.ts asserts that removal. chat/ChatHeader.tsx keeps the title-only header but takes upstream's remote-open imports. ui/tooltip.tsx keeps Marcode's inline FLOATING_SURFACE_Z stacking, which subsumes upstream's z-[140] bump.

Styling refactor followed, behaviour keptindex.css adopts upstream's nested @variant dark, @layer base stage-art defaults, alert-glass utility and theme-id palettes; Marcode's monochrome .stage-blueprint override is ported onto the renamed --stage-art-* tokens, and its dark palette, sidebar surface rules and floating chrome are kept. Upstream's class retirements were followed at their call sites (.chat-composer-glasssurface-glass, .workspace-titlebar-controls and .chat-composer-horizontal-inset → inline utilities) — those classes no longer exist, so keeping them would have been a silent no-op. Pull-request panels and UsagePage take upstream's Button refactor inside Marcode's Tooltip wrappers.

Behaviour merged by hand

  • threadSettled.ts — combined upstream's new autoSettleOnMerge setting with Marcode's warm-window guard, so a merged/closed PR settles a thread only once it has gone idle. Upstream's new test was rewritten to the combined rule, plus a new test pinning the warm-window half.
  • ThreadTerminalDrawer.tsx — Marcode keeps xterm (for its search addon) where upstream runs the Ghostty WASM surface, so upstream's two fixes were ported by hand rather than merged: right-click paste (fix(terminal): right-click paste works in the terminal pingdotgg/t3code#5240) and the Ctrl+C selection-clear guard (fix(web): add copying terminal selection with ctrl+c in the web app pingdotgg/t3code#5638). Ghostty's pasteFromClipboard race claim has no xterm equivalent, so the same race is settled against the request id in the drawer, and the context menu binds to the mount element instead of a surface option.

Branding/identity conflicts (BitbucketSourceControlProvider, desktopUpdate.logic, ConnectionsSettings, MobileClientsUserProfilePage, _chat.pull-requests, README, AGENTS.md) all kept Marcode's product identity while taking the upstream fix in the same hunk — notably upstream's window.desktopBridge gate so the Connect toggle stops showing in the web app, and their removal of the Windows-only update warning (the platform parameter is gone from every caller). mobile-showcase.test.ts and infra/relay/scripts/deploy.test.ts keep the Marcode tests upstream deleted — they pin the marcode:// scheme and MARCODE_RELAY_URL — with the imports upstream removed restored. pnpm-lock.yaml was regenerated with pnpm, not hand-merged.

Fork-boundary breaks that merged cleanly (no conflict)

These are the dangerous ones — they produced no marker and would have shipped silently. Two of the nine were caught by CI rather than by the pre-push sweep.

  1. pair-client.sh — upstream's new mobile pairing helper used T3CODE_PORT, the t3code-dev scheme and com.t3tools.t3code.dev. Marcode uses MARCODE_PORT, marcode-dev, com.t3tools.marcode.dev, so it could not have paired a single device. Fixed, along with three stale t3code-dev references already sitting in that skill's SKILL.md.
  2. release.yml wired publish_aur into the release pipeline. Marcode does not own the t3code-bin AUR packages, and the PKGBUILDs fetch from pingdotgg/t3code releases — a Marcode release would have failed on the missing AUR_SSH_PRIVATE_KEY or pushed upstream's package. Removed the call site only, leaving publish-aur.yml and packaging/aur untouched so future syncs don't conflict on them, and added scripts/release-fork-boundary.test.ts to pin the removal.
  3. DesktopWslServerTree.test.ts seeded its config layer with T3CODE_HOME/T3CODE_MODE (new upstream file, so no marker). Marcode reads MARCODE_HOME/MARCODE_MODE, so marcodeHome stayed unset, the desktop state dir resolved off the test's temp tree, and its sweep assertions never saw the directories they set up. Caught by CI — fixed in 9bc1a299.
  4. Upstream added an isPublicFaviconHost guard to faviconUrlForOrigin, so it stops sending private, loopback and reserved-TLD hostnames to Google's s2 favicon endpoint. That is a privacy fix and is kept — Marcode's unified workspace tree resolves URL-shortcut icons through the same helper, so it was leaking internal hostnames too. Its capability-flag test asserted a favicon for a http://localhost:3000 shortcut, exactly the case upstream now refuses. Caught by CI — fixed in cf90a76c, with a new test pinning the behaviour because the leak is invisible in the UI (the sidebar renders its globe fallback either way). ⚠️This is user-visible: URL shortcuts pointing at a dev server or intranet host lose their favicon.
  5. DMG installer artwork — upstream's new backgrounds read "T3 CODE" / "Drag T3 Code to Applications". Rebranded.
  6. A new "T3 Connect" account page and sidebar tab (T3ConnectUserProfilePage.tsx, T3ConnectSidebarSignIn.tsx). Rebranded to Marcode Connect; the t3-connect route slug and file names stay upstream-shaped.
  7. The new mobile theme picker labelled its default palette "T3 Code." Relabelled to Marcode; the persisted t3-code id is deliberately unchanged so upgrades don't reset anyone's theme. docs/user/mobile-appearance.md rebranded to match.
  8. Issue templates and CONTRIBUTING.md moved to a Discussions-first model pointing at pingdotgg/t3code/discussions. Marcode tracks everything in its own Issues, so the issues-first wording is kept and the cross-repo contact link dropped.
  9. build-desktop-artifact.test.ts hard-coded upstream's productName in a new DMG assertion. Repointed at Marcode's.

Verified still correct on purpose: T3_BOOT_SERVICE_UNIT, T3_SERVICE_LAUNCHER_CONTEXT, @t3tools/*, the t3 package name and t3code: storage keys remain upstream-shaped; MARCODE_HOME still drives the service launcher; no t3code/<hex> branch fixtures leaked past the renamed WORKTREE_BRANCH_PREFIX. After #3, every file this merge touched was re-swept for a T3CODE_* name whose MARCODE_* twin is what actually gets read — the only remaining mismatches are in electron-launcher.mjs and dev-electron.mjs, both byte-identical to main and listed under pre-existing findings below.

Why

Scheduled upstream sync. The delta was too large to land as a clean auto-merge, and several of the resolutions are product decisions (which surface owns file editing, whether a merged PR buries a warm thread, which terminal implementation Marcode carries) rather than mechanical ones.

UI Changes

Not captured — the sync container has no display, and the touched surfaces (sidebar chrome, floating editor entry points, PR panels, terminal drawer, usage page, Connect account page) need a real client. Per the runbook this needs a test-t3-app pass at 390px and 820px before the PR leaves draft.

Checklist

  • This PR is small and focused — no. It is a 158-commit upstream merge; that is the unit of work.
  • I explained what changed and why
  • I included before/after screenshots for any UI changes — see above, not possible from the sync container
  • I included a video for animation/interaction changes

Verification

CI is green on cf90a76c — all four required checks passed: Check, Test, Mobile Native Static Analysis, Release Smoke (plus claude-review). Thread transfer stays within every enforced ceiling. Native fingerprint diff is queued rather than complete; it is not a required check.

Locally: typecheck clean across web, server, desktop, mobile, contracts, shared and client-runtime; the full web suite passes (274 files, 2795 tests); vp fmt --check and vp lint clean on the changed files and directories (warnings only, all pre-existing).

Still unverified — please read before marking ready

  • No live client pass on any UI surface. This is the gap that matters, given how much of the merge lands in web chrome.
  • The hand-ported terminal right-click paste is covered by ThreadTerminalDrawer.test.ts, but has never been exercised interactively against a real pty.

One local-only failure, named so nobody chases it: packages/sharedNet.test.ts › "findAvailablePort returns preferred when it is free" fails in the sync container. It reserves an ephemeral port, releases it, then asserts the same port comes back — inherently racy under parallel test load. CI passes packages/shared on this commit, and this merge only adds a method to Net.ts without touching findAvailablePort.

Pre-existing findings, deliberately not fixed here

Not caused by this merge; flagging rather than widening the diff:

  • build-desktop-artifact.ts registers schemes: ["t3code", "t3code-dev"] and name: "T3 Code" for packaged Linux builds, while macOS uses marcode. Changing it is an OAuth deep-link migration for existing installs, not a rename.
  • electron-launcher.mjs and dev-electron.mjs forward T3CODE_PORT, T3CODE_HOME, T3CODE_COMMIT_HASH, T3CODE_OTLP_* and T3CODE_DESKTOP_APP_USER_MODEL_ID, while the server and DesktopConfig read the MARCODE_* names. Same class of bug as upstream sync blocked: pingdotgg/t3code@6154b46cb86b #3 above, but it predates this merge.
  • desktopUpdate.logic.ts points DESKTOP_RELEASE_TAG_URL at pingdotgg/t3code/releases/tag.
  • ThemePreviewCircles.tsx labels the web standard theme "T3 Code" (the mobile twin was fixed here because this merge introduced it).
  • docs/user/** still says "T3 Code" throughout, and install.md points at upstream's Homebrew cask and AUR packages.

t3-codeBotand others added 30 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>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
…ngdotgg#6495)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
Co-authored-by: t3-code[bot] <236186684+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Wout Stiens <71498452+StiensWout@users.noreply.github.com>
)
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: maria <254055478+maria-rcks@users.noreply.github.com>
yashranawayand others added 18 commits August 15, 2026 12:31
…gdotgg#5989)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>
…7081)
Co-authored-by: codex <codex@users.noreply.github.com>
)
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: maria <maria@kuuro.net>
…#6392)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Merges 158 upstream commits (b73232b..bab4b6f) into Marcode. 41 paths
conflicted; every one was resolved by hand, combining both intents.
Conflict decisions
------------------
Retired surfaces (Marcode owns the removal)
- apps/web/src/components/files/{FileBrowserPanel,FilePreviewPanel}.tsx:
kept deleted. Upstream only restyled them and added remote-open; that
feature is taken in OpenInPicker instead.
- RightPanelTabs.tsx: took upstream's `desktopByTabId` threading (it now
feeds the preview-tab favicon) and its Button-based add-panel trigger;
dropped `theme`/`PierreEntryIcon`, which exist only for the retired
`file` surface icon. Trimmed the matching props from upstream's new
RightPanelTabs.test.tsx.
- ChatView.tsx: took upstream's pull-request tab-status keying fix
(keyed by the shown surface, not a key rebuilt from the status) and
their workspace file drag-and-drop; dropped `activeFileSurface`.
- ChatMarkdown.tsx / diffFileActions.ts: kept upstream's call shape and
repointed the shared producer at the floating editor. diffFileActions
keeps upstream's new `resolveDiffPathForWorkspace` (a real fix for
repository-relative diff paths in nested projects) and feeds the
result to the editor rather than the right panel; its tests now assert
on the editor store.
Navigation and shell (FloatingPillNav owns brand/nav/settings)
- AppSidebarLayout.tsx, sidebar/SidebarChrome.tsx: kept Marcode's
no-op SidebarControl and update-only footer. Upstream's SidebarBrand /
T3Wordmark / footer nav would ship a second copy of controls the pill
nav already renders, and threadSidebarWidth.test.ts asserts that
removal.
- threadSidebarWidth.test.ts: kept Marcode's brand-removal assertion
over upstream's wordmark assertion.
- chat/ChatHeader.tsx: kept Marcode's title-only header (no thread
action menu / inline rename); took upstream's remote-open imports.
- ui/tooltip.tsx: kept Marcode's inline FLOATING_SURFACE_Z stacking;
upstream's `z-[140]` utility bump is subsumed by it.
Styling refactor followed, behavior kept (index.css)
- Adopted upstream's nested `@variant dark`, `@layer base` stage-art
defaults, `alert-glass` utility and theme-id palettes. Ported
Marcode's monochrome `.stage-blueprint` override onto the renamed
`--stage-art-*` tokens; kept Marcode's dark palette, sidebar surface
rules and floating chrome. Dropped the now-dead `.workspace-topbar`.
- Followed upstream's class retirements at their call sites:
`.chat-composer-glass` -> `surface-glass` (ChatComposer,
PullRequestCodeTab), `.workspace-titlebar-controls` and
`.chat-composer-horizontal-inset` -> inline utilities (ChatView).
Those classes no longer exist, so keeping them would have been a
silent no-op.
- Pull-request panels/UsagePage: took upstream's Button refactor inside
Marcode's Tooltip wrappers rather than choosing one side.
Behavior merged by hand
- threadSettled.ts: combined upstream's new `autoSettleOnMerge` setting
with Marcode's warm-window guard, so a merged/closed PR settles a
thread only once it has been idle. Rewrote upstream's new test to the
combined rule and added a test pinning the warm-window half.
- ThreadTerminalDrawer.tsx: Marcode keeps xterm (for its search addon)
where upstream runs the Ghostty WASM surface, so upstream's two fixes
were ported by hand rather than merged: right-click paste (pingdotgg#5240) and
the Ctrl+C selection-clear guard (pingdotgg#5638). Ghostty's
`pasteFromClipboard` race claim has no xterm equivalent, so the same
race is settled against the request id in the drawer; the context
menu is bound to the mount element instead of a surface option.
Branding and identity
- BitbucketSourceControlProvider.ts: kept MARCODE_* env names, took
upstream's added "user read" scope wording.
- desktopUpdate.logic.ts: took upstream's removal of the Windows-only
install warning (their copy decision, and the `platform` parameter is
gone from every caller); kept Marcode wording.
- ConnectionsSettings.tsx: took upstream's `window.desktopBridge` gate
(the toggle should not show in the web app); kept "Marcode Connect".
- MobileClientsUserProfilePage.tsx: adopted upstream's shared
ClerkUserProfilePage/Row primitives, rebranded to Marcode.
- _chat.pull-requests.tsx: took upstream's plural copy for the new
multi-environment view, rebranded.
- README.md / AGENTS.md: kept Marcode's. Upstream's additions were
either their distribution channel (AUR) or duplicates of sections
Marcode already has.
- docs/internals/scripts.md, packages/shared/package.json,
commandInvariants.test.ts, build-desktop-artifact.ts: additive on both
sides, combined.
- mobile-showcase.test.ts, infra/relay/scripts/deploy.test.ts: kept the
Marcode tests upstream deleted — they pin the `marcode://` scheme and
MARCODE_RELAY_URL — and restored the imports upstream removed.
- pnpm-lock.yaml: regenerated with pnpm, not hand-merged.
Fork-boundary breaks that merged cleanly (no conflict)
--------------------------------------------------------
- .agents/skills/test-t3-mobile/scripts/pair-client.sh: upstream's new
pairing helper used T3CODE_PORT, the `t3code-dev` scheme and
`com.t3tools.t3code.dev`. Marcode uses MARCODE_PORT, `marcode-dev`
and `com.t3tools.marcode.dev`, so the helper could not have paired a
single device. Fixed, along with three stale `t3code-dev` references
already in that skill's SKILL.md.
- .github/workflows/release.yml: upstream wired publish_aur into the
release pipeline. Marcode does not own the `t3code-bin` AUR packages
and the PKGBUILDs fetch from pingdotgg/t3code releases, so a Marcode
release would have failed on the missing secret or pushed upstream's
package. Removed the call site only, leaving publish-aur.yml and
packaging/aur untouched so future syncs do not conflict on them, and
added scripts/release-fork-boundary.test.ts to pin the removal.
- apps/desktop/resources/dmg/*.svg: upstream's new DMG installer
artwork read "T3 CODE" / "Drag T3 Code to Applications". Rebranded.
- clerk/T3ConnectUserProfilePage.tsx + T3ConnectSidebarSignIn.tsx:
a new user-visible account page and tab labelled "T3 Connect".
Rebranded to Marcode Connect; the `t3-connect` route slug and file
names stay upstream-shaped.
- apps/mobile/src/lib/mobileTheme.ts: the new built-in theme picker
labelled the default palette "T3 Code". Relabelled to Marcode; the
persisted `t3-code` id is deliberately unchanged.
- docs/user/mobile-appearance.md: new doc, rebranded to match.
- .github/ISSUE_TEMPLATE/* and CONTRIBUTING.md: upstream moved to a
Discussions-first model and pointed contributors at
pingdotgg/t3code/discussions. Marcode tracks everything in its own
Issues, so the issues-first wording is kept and the cross-repo
contact link dropped.
- scripts/build-desktop-artifact.test.ts: upstream's new DMG assertion
hard-coded their productName. Repointed at Marcode's.
- Verified clean: T3_BOOT_SERVICE_UNIT, T3_SERVICE_LAUNCHER_CONTEXT,
@t3tools/*, the `t3` package name and `t3code:` storage keys remain
upstream-shaped on purpose; MARCODE_HOME still drives the service
launcher; no `t3code/<hex>` branch fixtures leaked past the renamed
WORKTREE_BRANCH_PREFIX.
Verification
------------
- typecheck: web, server, desktop, mobile, contracts, shared,
client-runtime — all clean.
- vp test run over the touched surfaces: 435 tests pass.
- vp fmt --check and vp lint on the changed files/dirs: clean
(warnings only, all pre-existing).
- Not run here: ThreadTerminalDrawer.test.ts and
FloatingTerminalShell.test.ts. Both fail to resolve @aliimam/icons in
this container; the same failure reproduces on origin/main, and that
import is unchanged by this merge. CI covers them, and the hand-ported
terminal paste path has had no runtime verification.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Spcc6CDhDkR7wWAor5829P
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL labels Aug 16, 2026
@github-actions

github-actionsBot commented Aug 16, 2026

Copy link
Copy Markdown

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB12.6 KiB+1.3 KiB (+11.3%)15.1 KiB
CodexThread snapshot wire5.5 KiB6.3 KiB+838 B (+15.0%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB6.3 KiB+472 B (+7.9%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB51.8 KiB+2.1 KiB (+4.2%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB12.6 KiB+1.3 KiB (+11.3%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB6.3 KiB+817 B (+14.6%)7.3 KiB
ClaudeLive turn WebSocket wire5.8 KiB6.3 KiB+497 B (+8.3%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB52.7 KiB+2.1 KiB (+4.2%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 1af3478 · PR result: cf90a76 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 99.9 KiB
  • Claude decoded thread snapshot: 100.6 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

Upstream's new DesktopWslServerTree test seeds its DesktopConfig layer
with T3CODE_HOME and T3CODE_MODE. Marcode reads MARCODE_HOME and
MARCODE_MODE, so `marcodeHome` stayed unset, the desktop state dir
resolved off the test's temp tree, and the sweep assertions never saw
the stale version directory they set up.
Another clean-merge fork-boundary break from the bab4b6f sync: the file
is new upstream, so it arrived without a conflict marker.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Spcc6CDhDkR7wWAor5829P
Upstream added an `isPublicFaviconHost` guard to `faviconUrlForOrigin`,
so it no longer sends private, loopback, or reserved-TLD hostnames to
Google's s2 favicon endpoint. That guard is a privacy fix and is kept.
Marcode's unified workspace tree resolves URL shortcut icons through the
same helper, and its capability-flag test asserted a favicon for a
`http://localhost:3000` shortcut — which is exactly the case upstream
now refuses. Repointed that assertion at a public host and added a test
pinning the new behaviour, since a leaked hostname is invisible in the
UI: the sidebar renders its globe fallback either way.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Spcc6CDhDkR7wWAor5829P
@maarcoClaude

Copy link
Copy Markdown
OwnerAuthor

Two CI rounds, two more clean-merge fork-boundary breaks — both fixed, and one correction to the description above.

9bc1a299DesktopWslServerTree.test.ts seeded its config layer with T3CODE_HOME/T3CODE_MODE. Marcode reads MARCODE_HOME/MARCODE_MODE, so marcodeHome stayed unset and the sweep assertions never saw the temp tree they set up. New upstream file, so no conflict marker.

cf90a76c — favicon privacy guard. Upstream added isPublicFaviconHost to faviconUrlForOrigin, so it no longer sends private, loopback, or reserved-TLD hostnames to Google's s2 endpoint. That is a real privacy fix and is kept. Marcode's unified workspace tree resolves URL shortcut icons through the same helper, and its capability-flag test asserted a favicon for a http://localhost:3000 shortcut — precisely the case upstream now refuses. Repointed at a public host, and added a test pinning the new behaviour, because the leak is invisible in the UI: the sidebar renders its globe fallback either way.

That second one is worth a look during review. It is a behaviour change for anyone who has a URL shortcut pointing at a dev server or an intranet host — those rows lose their favicon and fall back to the globe. That is the correct outcome, but it is user-visible.

Correction to the "Not verified" section

I reported that ThreadTerminalDrawer.test.ts and FloatingTerminalShell.test.ts could not run. That was wrong — it was an artifact of invoking the runner from the repo root instead of the package, which is what broke @aliimam/icons resolution. Run properly they pass, and the full web suite is green locally: 274 files, 2795 tests. So the hand-ported terminal right-click paste is covered by ThreadTerminalDrawer.test.ts, including the pure helpers it adds.

What remains genuinely unverified is narrower than I said: no live client pass on any UI surface, and no interactive exercise of the right-click paste path against a real pty.

One local-only failure worth naming so nobody chases it: packages/sharedNet.test.ts › "findAvailablePort returns preferred when it is free" fails in the sync container. It reserves an ephemeral port, releases it, then asserts the same port comes back — inherently racy under parallel test load. CI passed packages/shared on this exact commit, and this merge only adds a new method to Net.ts without touching findAvailablePort.


Generated by Claude Code

@maarco

Copy link
Copy Markdown
OwnerAuthor

Superseded by #39 (merged, includes 82b8a93).

@maarcomaarco closed this Aug 19, 2026
@maarco
maarco deleted the claude/gracious-bohr-y8476v branch August 19, 2026 05:20
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXLvouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

20 participants

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

chore(upstream): sync marcode through bab4b6f02b8b - #35

Closed
maarco wants to merge 161 commits into
mainfrom
claude/gracious-bohr-y8476v
Closed

chore(upstream): sync marcode through bab4b6f02b8b#35
maarco wants to merge 161 commits into
mainfrom
claude/gracious-bohr-y8476v

Conversation

@maarco

@maarcomaarco commented Aug 16, 2026

Copy link
Copy Markdown
Owner

What Changed

Merges 158 upstream commits, b73232bd..bab4b6f0, into main as one two-parent merge commit (791d415c), plus two follow-up fixes for breaks CI caught. 41 paths conflicted and every one was resolved by hand, combining both intents — no whole-file ours/theirs, no reset/restore/stash/clean, no force push.

Supersedes #29 (through 9e201941), #31 (through 184d8ef3), and #33 (through ad117235) — all three of those SHAs are ancestors of bab4b6f0, and all four branches share the same base. Closing them in favour of this one is your call. Resolves the upstream-sync-blocked issue #34.

Conflict decisions

Retired surfaces (Marcode owns the removal)

  • files/{FileBrowserPanel,FilePreviewPanel}.tsx — kept deleted. Upstream only restyled them and added remote-open; that feature is taken in OpenInPicker instead.
  • RightPanelTabs.tsx — took upstream's desktopByTabId threading (it now feeds the preview-tab favicon) and their Button-based add-panel trigger; dropped theme/PierreEntryIcon, which exist only for the retired file surface icon. Trimmed the matching props from upstream's new RightPanelTabs.test.tsx.
  • ChatView.tsx — took upstream's PR tab-status keying fix (keyed by the shown surface, not a key rebuilt from the status) and their workspace file drag-and-drop; dropped activeFileSurface.
  • ChatMarkdown.tsx / diffFileActions.ts — kept upstream's call shape and repointed the shared producer at the floating editor. diffFileActions keeps upstream's new resolveDiffPathForWorkspace (a real fix for repository-relative diff paths in nested projects) and feeds the result to the editor rather than the right panel; its tests now assert on the editor store.

Navigation and shellAppSidebarLayout.tsx and sidebar/SidebarChrome.tsx keep Marcode's no-op SidebarControl and update-only footer; upstream's SidebarBrand/T3Wordmark/footer nav would ship a second copy of controls FloatingPillNav already renders, and threadSidebarWidth.test.ts asserts that removal. chat/ChatHeader.tsx keeps the title-only header but takes upstream's remote-open imports. ui/tooltip.tsx keeps Marcode's inline FLOATING_SURFACE_Z stacking, which subsumes upstream's z-[140] bump.

Styling refactor followed, behaviour keptindex.css adopts upstream's nested @variant dark, @layer base stage-art defaults, alert-glass utility and theme-id palettes; Marcode's monochrome .stage-blueprint override is ported onto the renamed --stage-art-* tokens, and its dark palette, sidebar surface rules and floating chrome are kept. Upstream's class retirements were followed at their call sites (.chat-composer-glasssurface-glass, .workspace-titlebar-controls and .chat-composer-horizontal-inset → inline utilities) — those classes no longer exist, so keeping them would have been a silent no-op. Pull-request panels and UsagePage take upstream's Button refactor inside Marcode's Tooltip wrappers.

Behaviour merged by hand

  • threadSettled.ts — combined upstream's new autoSettleOnMerge setting with Marcode's warm-window guard, so a merged/closed PR settles a thread only once it has gone idle. Upstream's new test was rewritten to the combined rule, plus a new test pinning the warm-window half.
  • ThreadTerminalDrawer.tsx — Marcode keeps xterm (for its search addon) where upstream runs the Ghostty WASM surface, so upstream's two fixes were ported by hand rather than merged: right-click paste (fix(terminal): right-click paste works in the terminal pingdotgg/t3code#5240) and the Ctrl+C selection-clear guard (fix(web): add copying terminal selection with ctrl+c in the web app pingdotgg/t3code#5638). Ghostty's pasteFromClipboard race claim has no xterm equivalent, so the same race is settled against the request id in the drawer, and the context menu binds to the mount element instead of a surface option.

Branding/identity conflicts (BitbucketSourceControlProvider, desktopUpdate.logic, ConnectionsSettings, MobileClientsUserProfilePage, _chat.pull-requests, README, AGENTS.md) all kept Marcode's product identity while taking the upstream fix in the same hunk — notably upstream's window.desktopBridge gate so the Connect toggle stops showing in the web app, and their removal of the Windows-only update warning (the platform parameter is gone from every caller). mobile-showcase.test.ts and infra/relay/scripts/deploy.test.ts keep the Marcode tests upstream deleted — they pin the marcode:// scheme and MARCODE_RELAY_URL — with the imports upstream removed restored. pnpm-lock.yaml was regenerated with pnpm, not hand-merged.

Fork-boundary breaks that merged cleanly (no conflict)

These are the dangerous ones — they produced no marker and would have shipped silently. Two of the nine were caught by CI rather than by the pre-push sweep.

  1. pair-client.sh — upstream's new mobile pairing helper used T3CODE_PORT, the t3code-dev scheme and com.t3tools.t3code.dev. Marcode uses MARCODE_PORT, marcode-dev, com.t3tools.marcode.dev, so it could not have paired a single device. Fixed, along with three stale t3code-dev references already sitting in that skill's SKILL.md.
  2. release.yml wired publish_aur into the release pipeline. Marcode does not own the t3code-bin AUR packages, and the PKGBUILDs fetch from pingdotgg/t3code releases — a Marcode release would have failed on the missing AUR_SSH_PRIVATE_KEY or pushed upstream's package. Removed the call site only, leaving publish-aur.yml and packaging/aur untouched so future syncs don't conflict on them, and added scripts/release-fork-boundary.test.ts to pin the removal.
  3. DesktopWslServerTree.test.ts seeded its config layer with T3CODE_HOME/T3CODE_MODE (new upstream file, so no marker). Marcode reads MARCODE_HOME/MARCODE_MODE, so marcodeHome stayed unset, the desktop state dir resolved off the test's temp tree, and its sweep assertions never saw the directories they set up. Caught by CI — fixed in 9bc1a299.
  4. Upstream added an isPublicFaviconHost guard to faviconUrlForOrigin, so it stops sending private, loopback and reserved-TLD hostnames to Google's s2 favicon endpoint. That is a privacy fix and is kept — Marcode's unified workspace tree resolves URL-shortcut icons through the same helper, so it was leaking internal hostnames too. Its capability-flag test asserted a favicon for a http://localhost:3000 shortcut, exactly the case upstream now refuses. Caught by CI — fixed in cf90a76c, with a new test pinning the behaviour because the leak is invisible in the UI (the sidebar renders its globe fallback either way). ⚠️This is user-visible: URL shortcuts pointing at a dev server or intranet host lose their favicon.
  5. DMG installer artwork — upstream's new backgrounds read "T3 CODE" / "Drag T3 Code to Applications". Rebranded.
  6. A new "T3 Connect" account page and sidebar tab (T3ConnectUserProfilePage.tsx, T3ConnectSidebarSignIn.tsx). Rebranded to Marcode Connect; the t3-connect route slug and file names stay upstream-shaped.
  7. The new mobile theme picker labelled its default palette "T3 Code." Relabelled to Marcode; the persisted t3-code id is deliberately unchanged so upgrades don't reset anyone's theme. docs/user/mobile-appearance.md rebranded to match.
  8. Issue templates and CONTRIBUTING.md moved to a Discussions-first model pointing at pingdotgg/t3code/discussions. Marcode tracks everything in its own Issues, so the issues-first wording is kept and the cross-repo contact link dropped.
  9. build-desktop-artifact.test.ts hard-coded upstream's productName in a new DMG assertion. Repointed at Marcode's.

Verified still correct on purpose: T3_BOOT_SERVICE_UNIT, T3_SERVICE_LAUNCHER_CONTEXT, @t3tools/*, the t3 package name and t3code: storage keys remain upstream-shaped; MARCODE_HOME still drives the service launcher; no t3code/<hex> branch fixtures leaked past the renamed WORKTREE_BRANCH_PREFIX. After #3, every file this merge touched was re-swept for a T3CODE_* name whose MARCODE_* twin is what actually gets read — the only remaining mismatches are in electron-launcher.mjs and dev-electron.mjs, both byte-identical to main and listed under pre-existing findings below.

Why

Scheduled upstream sync. The delta was too large to land as a clean auto-merge, and several of the resolutions are product decisions (which surface owns file editing, whether a merged PR buries a warm thread, which terminal implementation Marcode carries) rather than mechanical ones.

UI Changes

Not captured — the sync container has no display, and the touched surfaces (sidebar chrome, floating editor entry points, PR panels, terminal drawer, usage page, Connect account page) need a real client. Per the runbook this needs a test-t3-app pass at 390px and 820px before the PR leaves draft.

Checklist

  • This PR is small and focused — no. It is a 158-commit upstream merge; that is the unit of work.
  • I explained what changed and why
  • I included before/after screenshots for any UI changes — see above, not possible from the sync container
  • I included a video for animation/interaction changes

Verification

CI is green on cf90a76c — all four required checks passed: Check, Test, Mobile Native Static Analysis, Release Smoke (plus claude-review). Thread transfer stays within every enforced ceiling. Native fingerprint diff is queued rather than complete; it is not a required check.

Locally: typecheck clean across web, server, desktop, mobile, contracts, shared and client-runtime; the full web suite passes (274 files, 2795 tests); vp fmt --check and vp lint clean on the changed files and directories (warnings only, all pre-existing).

Still unverified — please read before marking ready

  • No live client pass on any UI surface. This is the gap that matters, given how much of the merge lands in web chrome.
  • The hand-ported terminal right-click paste is covered by ThreadTerminalDrawer.test.ts, but has never been exercised interactively against a real pty.

One local-only failure, named so nobody chases it: packages/sharedNet.test.ts › "findAvailablePort returns preferred when it is free" fails in the sync container. It reserves an ephemeral port, releases it, then asserts the same port comes back — inherently racy under parallel test load. CI passes packages/shared on this commit, and this merge only adds a method to Net.ts without touching findAvailablePort.

Pre-existing findings, deliberately not fixed here

Not caused by this merge; flagging rather than widening the diff:

  • build-desktop-artifact.ts registers schemes: ["t3code", "t3code-dev"] and name: "T3 Code" for packaged Linux builds, while macOS uses marcode. Changing it is an OAuth deep-link migration for existing installs, not a rename.
  • electron-launcher.mjs and dev-electron.mjs forward T3CODE_PORT, T3CODE_HOME, T3CODE_COMMIT_HASH, T3CODE_OTLP_* and T3CODE_DESKTOP_APP_USER_MODEL_ID, while the server and DesktopConfig read the MARCODE_* names. Same class of bug as upstream sync blocked: pingdotgg/t3code@6154b46cb86b #3 above, but it predates this merge.
  • desktopUpdate.logic.ts points DESKTOP_RELEASE_TAG_URL at pingdotgg/t3code/releases/tag.
  • ThemePreviewCircles.tsx labels the web standard theme "T3 Code" (the mobile twin was fixed here because this merge introduced it).
  • docs/user/** still says "T3 Code" throughout, and install.md points at upstream's Homebrew cask and AUR packages.

t3-codeBotand others added 30 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>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
…ngdotgg#6495)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
Co-authored-by: t3-code[bot] <236186684+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Wout Stiens <71498452+StiensWout@users.noreply.github.com>
)
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: maria <254055478+maria-rcks@users.noreply.github.com>
yashranawayand others added 18 commits August 15, 2026 12:31
…gdotgg#5989)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>
…7081)
Co-authored-by: codex <codex@users.noreply.github.com>
)
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: maria <maria@kuuro.net>
…#6392)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Merges 158 upstream commits (b73232b..bab4b6f) into Marcode. 41 paths
conflicted; every one was resolved by hand, combining both intents.
Conflict decisions
------------------
Retired surfaces (Marcode owns the removal)
- apps/web/src/components/files/{FileBrowserPanel,FilePreviewPanel}.tsx:
kept deleted. Upstream only restyled them and added remote-open; that
feature is taken in OpenInPicker instead.
- RightPanelTabs.tsx: took upstream's `desktopByTabId` threading (it now
feeds the preview-tab favicon) and its Button-based add-panel trigger;
dropped `theme`/`PierreEntryIcon`, which exist only for the retired
`file` surface icon. Trimmed the matching props from upstream's new
RightPanelTabs.test.tsx.
- ChatView.tsx: took upstream's pull-request tab-status keying fix
(keyed by the shown surface, not a key rebuilt from the status) and
their workspace file drag-and-drop; dropped `activeFileSurface`.
- ChatMarkdown.tsx / diffFileActions.ts: kept upstream's call shape and
repointed the shared producer at the floating editor. diffFileActions
keeps upstream's new `resolveDiffPathForWorkspace` (a real fix for
repository-relative diff paths in nested projects) and feeds the
result to the editor rather than the right panel; its tests now assert
on the editor store.
Navigation and shell (FloatingPillNav owns brand/nav/settings)
- AppSidebarLayout.tsx, sidebar/SidebarChrome.tsx: kept Marcode's
no-op SidebarControl and update-only footer. Upstream's SidebarBrand /
T3Wordmark / footer nav would ship a second copy of controls the pill
nav already renders, and threadSidebarWidth.test.ts asserts that
removal.
- threadSidebarWidth.test.ts: kept Marcode's brand-removal assertion
over upstream's wordmark assertion.
- chat/ChatHeader.tsx: kept Marcode's title-only header (no thread
action menu / inline rename); took upstream's remote-open imports.
- ui/tooltip.tsx: kept Marcode's inline FLOATING_SURFACE_Z stacking;
upstream's `z-[140]` utility bump is subsumed by it.
Styling refactor followed, behavior kept (index.css)
- Adopted upstream's nested `@variant dark`, `@layer base` stage-art
defaults, `alert-glass` utility and theme-id palettes. Ported
Marcode's monochrome `.stage-blueprint` override onto the renamed
`--stage-art-*` tokens; kept Marcode's dark palette, sidebar surface
rules and floating chrome. Dropped the now-dead `.workspace-topbar`.
- Followed upstream's class retirements at their call sites:
`.chat-composer-glass` -> `surface-glass` (ChatComposer,
PullRequestCodeTab), `.workspace-titlebar-controls` and
`.chat-composer-horizontal-inset` -> inline utilities (ChatView).
Those classes no longer exist, so keeping them would have been a
silent no-op.
- Pull-request panels/UsagePage: took upstream's Button refactor inside
Marcode's Tooltip wrappers rather than choosing one side.
Behavior merged by hand
- threadSettled.ts: combined upstream's new `autoSettleOnMerge` setting
with Marcode's warm-window guard, so a merged/closed PR settles a
thread only once it has been idle. Rewrote upstream's new test to the
combined rule and added a test pinning the warm-window half.
- ThreadTerminalDrawer.tsx: Marcode keeps xterm (for its search addon)
where upstream runs the Ghostty WASM surface, so upstream's two fixes
were ported by hand rather than merged: right-click paste (pingdotgg#5240) and
the Ctrl+C selection-clear guard (pingdotgg#5638). Ghostty's
`pasteFromClipboard` race claim has no xterm equivalent, so the same
race is settled against the request id in the drawer; the context
menu is bound to the mount element instead of a surface option.
Branding and identity
- BitbucketSourceControlProvider.ts: kept MARCODE_* env names, took
upstream's added "user read" scope wording.
- desktopUpdate.logic.ts: took upstream's removal of the Windows-only
install warning (their copy decision, and the `platform` parameter is
gone from every caller); kept Marcode wording.
- ConnectionsSettings.tsx: took upstream's `window.desktopBridge` gate
(the toggle should not show in the web app); kept "Marcode Connect".
- MobileClientsUserProfilePage.tsx: adopted upstream's shared
ClerkUserProfilePage/Row primitives, rebranded to Marcode.
- _chat.pull-requests.tsx: took upstream's plural copy for the new
multi-environment view, rebranded.
- README.md / AGENTS.md: kept Marcode's. Upstream's additions were
either their distribution channel (AUR) or duplicates of sections
Marcode already has.
- docs/internals/scripts.md, packages/shared/package.json,
commandInvariants.test.ts, build-desktop-artifact.ts: additive on both
sides, combined.
- mobile-showcase.test.ts, infra/relay/scripts/deploy.test.ts: kept the
Marcode tests upstream deleted — they pin the `marcode://` scheme and
MARCODE_RELAY_URL — and restored the imports upstream removed.
- pnpm-lock.yaml: regenerated with pnpm, not hand-merged.
Fork-boundary breaks that merged cleanly (no conflict)
--------------------------------------------------------
- .agents/skills/test-t3-mobile/scripts/pair-client.sh: upstream's new
pairing helper used T3CODE_PORT, the `t3code-dev` scheme and
`com.t3tools.t3code.dev`. Marcode uses MARCODE_PORT, `marcode-dev`
and `com.t3tools.marcode.dev`, so the helper could not have paired a
single device. Fixed, along with three stale `t3code-dev` references
already in that skill's SKILL.md.
- .github/workflows/release.yml: upstream wired publish_aur into the
release pipeline. Marcode does not own the `t3code-bin` AUR packages
and the PKGBUILDs fetch from pingdotgg/t3code releases, so a Marcode
release would have failed on the missing secret or pushed upstream's
package. Removed the call site only, leaving publish-aur.yml and
packaging/aur untouched so future syncs do not conflict on them, and
added scripts/release-fork-boundary.test.ts to pin the removal.
- apps/desktop/resources/dmg/*.svg: upstream's new DMG installer
artwork read "T3 CODE" / "Drag T3 Code to Applications". Rebranded.
- clerk/T3ConnectUserProfilePage.tsx + T3ConnectSidebarSignIn.tsx:
a new user-visible account page and tab labelled "T3 Connect".
Rebranded to Marcode Connect; the `t3-connect` route slug and file
names stay upstream-shaped.
- apps/mobile/src/lib/mobileTheme.ts: the new built-in theme picker
labelled the default palette "T3 Code". Relabelled to Marcode; the
persisted `t3-code` id is deliberately unchanged.
- docs/user/mobile-appearance.md: new doc, rebranded to match.
- .github/ISSUE_TEMPLATE/* and CONTRIBUTING.md: upstream moved to a
Discussions-first model and pointed contributors at
pingdotgg/t3code/discussions. Marcode tracks everything in its own
Issues, so the issues-first wording is kept and the cross-repo
contact link dropped.
- scripts/build-desktop-artifact.test.ts: upstream's new DMG assertion
hard-coded their productName. Repointed at Marcode's.
- Verified clean: T3_BOOT_SERVICE_UNIT, T3_SERVICE_LAUNCHER_CONTEXT,
@t3tools/*, the `t3` package name and `t3code:` storage keys remain
upstream-shaped on purpose; MARCODE_HOME still drives the service
launcher; no `t3code/<hex>` branch fixtures leaked past the renamed
WORKTREE_BRANCH_PREFIX.
Verification
------------
- typecheck: web, server, desktop, mobile, contracts, shared,
client-runtime — all clean.
- vp test run over the touched surfaces: 435 tests pass.
- vp fmt --check and vp lint on the changed files/dirs: clean
(warnings only, all pre-existing).
- Not run here: ThreadTerminalDrawer.test.ts and
FloatingTerminalShell.test.ts. Both fail to resolve @aliimam/icons in
this container; the same failure reproduces on origin/main, and that
import is unchanged by this merge. CI covers them, and the hand-ported
terminal paste path has had no runtime verification.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Spcc6CDhDkR7wWAor5829P
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL labels Aug 16, 2026
@github-actions

github-actionsBot commented Aug 16, 2026

Copy link
Copy Markdown

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB12.6 KiB+1.3 KiB (+11.3%)15.1 KiB
CodexThread snapshot wire5.5 KiB6.3 KiB+838 B (+15.0%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB6.3 KiB+472 B (+7.9%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB51.8 KiB+2.1 KiB (+4.2%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB12.6 KiB+1.3 KiB (+11.3%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB6.3 KiB+817 B (+14.6%)7.3 KiB
ClaudeLive turn WebSocket wire5.8 KiB6.3 KiB+497 B (+8.3%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB52.7 KiB+2.1 KiB (+4.2%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 1af3478 · PR result: cf90a76 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 99.9 KiB
  • Claude decoded thread snapshot: 100.6 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

Upstream's new DesktopWslServerTree test seeds its DesktopConfig layer
with T3CODE_HOME and T3CODE_MODE. Marcode reads MARCODE_HOME and
MARCODE_MODE, so `marcodeHome` stayed unset, the desktop state dir
resolved off the test's temp tree, and the sweep assertions never saw
the stale version directory they set up.
Another clean-merge fork-boundary break from the bab4b6f sync: the file
is new upstream, so it arrived without a conflict marker.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Spcc6CDhDkR7wWAor5829P
Upstream added an `isPublicFaviconHost` guard to `faviconUrlForOrigin`,
so it no longer sends private, loopback, or reserved-TLD hostnames to
Google's s2 favicon endpoint. That guard is a privacy fix and is kept.
Marcode's unified workspace tree resolves URL shortcut icons through the
same helper, and its capability-flag test asserted a favicon for a
`http://localhost:3000` shortcut — which is exactly the case upstream
now refuses. Repointed that assertion at a public host and added a test
pinning the new behaviour, since a leaked hostname is invisible in the
UI: the sidebar renders its globe fallback either way.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Spcc6CDhDkR7wWAor5829P
@maarcoClaude

Copy link
Copy Markdown
OwnerAuthor

Two CI rounds, two more clean-merge fork-boundary breaks — both fixed, and one correction to the description above.

9bc1a299DesktopWslServerTree.test.ts seeded its config layer with T3CODE_HOME/T3CODE_MODE. Marcode reads MARCODE_HOME/MARCODE_MODE, so marcodeHome stayed unset and the sweep assertions never saw the temp tree they set up. New upstream file, so no conflict marker.

cf90a76c — favicon privacy guard. Upstream added isPublicFaviconHost to faviconUrlForOrigin, so it no longer sends private, loopback, or reserved-TLD hostnames to Google's s2 endpoint. That is a real privacy fix and is kept. Marcode's unified workspace tree resolves URL shortcut icons through the same helper, and its capability-flag test asserted a favicon for a http://localhost:3000 shortcut — precisely the case upstream now refuses. Repointed at a public host, and added a test pinning the new behaviour, because the leak is invisible in the UI: the sidebar renders its globe fallback either way.

That second one is worth a look during review. It is a behaviour change for anyone who has a URL shortcut pointing at a dev server or an intranet host — those rows lose their favicon and fall back to the globe. That is the correct outcome, but it is user-visible.

Correction to the "Not verified" section

I reported that ThreadTerminalDrawer.test.ts and FloatingTerminalShell.test.ts could not run. That was wrong — it was an artifact of invoking the runner from the repo root instead of the package, which is what broke @aliimam/icons resolution. Run properly they pass, and the full web suite is green locally: 274 files, 2795 tests. So the hand-ported terminal right-click paste is covered by ThreadTerminalDrawer.test.ts, including the pure helpers it adds.

What remains genuinely unverified is narrower than I said: no live client pass on any UI surface, and no interactive exercise of the right-click paste path against a real pty.

One local-only failure worth naming so nobody chases it: packages/sharedNet.test.ts › "findAvailablePort returns preferred when it is free" fails in the sync container. It reserves an ephemeral port, releases it, then asserts the same port comes back — inherently racy under parallel test load. CI passed packages/shared on this exact commit, and this merge only adds a new method to Net.ts without touching findAvailablePort.


Generated by Claude Code

@maarco

Copy link
Copy Markdown
OwnerAuthor

Superseded by #39 (merged, includes 82b8a93).

@maarcomaarco closed this Aug 19, 2026
@maarco
maarco deleted the claude/gracious-bohr-y8476v branch August 19, 2026 05:20
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXLvouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

20 participants

@maarco@extoci@juliusmarminge@PixPMusic@StiensWout@Bil0000@t3dotgg@gsimone@dominic-r@none23@maria-rcks@chrisdeeming@Lucenx9@UtkarshUsername@Adamulek123@paul-vd@WarheadTaylor@RakshithBhat03@davidhu2000@tsouth89