chore(upstream): sync marcode through b883fc06 - #68

Draft
maarco wants to merge 173 commits into
mainfrom
claude/gracious-bohr-gk75tw
Draft

chore(upstream): sync marcode through b883fc06#68
maarco wants to merge 173 commits into
mainfrom
claude/gracious-bohr-gk75tw

Conversation

@maarco

@maarcomaarco commented Sep 1, 2026

Copy link
Copy Markdown
Owner

What Changed

Merges pingdotgg/t3code@b883fc066ea5c9bebbe1c3e9b4bc2471aab3685f into main — 170 upstream commits over f035a0f4..b883fc06, 854 files. 45 conflicts, all resolved by hand. No whole-file ours/theirs, no force push, reset, restore, stash or clean.

Upstream SHAb883fc066ea5c9bebbe1c3e9b4bc2471aab3685f
Merge basef035a0f4cdf4abaa6704673af7b5a4a321149ba2
Target base200e1491 (origin/main)
Merge commitf1b2a407 (two parents)
Headb119e211CI green, mergeable

Conflicts — combined both intents

  • cloud/bootService.ts — keep Marcode's MARCODE_HOME plist key (the launcher's resolveLauncherBaseDir reads it and exits without it) and take upstream's new PATH export. Both now pinned by separate tests.
  • persistence/Migrations.ts — upstream's 042/043 renumbered to Marcode's 043/044. Marcode's 033_ProjectWorkspaceLayout occupies 033, so every shared migration sits one id higher; renumbering an applied id would re-run or skip it on existing installs.
  • ServerEnvironment / contracts/environment.ts — both capability flags (workspaceLayoutMutations, threadPullRequestLinking).
  • ChatView.tsx — took upstream's ComposerSurface extraction (they moved the composer glass out of index.css) and re-applied Marcode's transparency through chat-composer-glass-shell-transparent, which still overrides the --glass-opacity variable their Shell reads. Also took feat: link pull requests to threads pingdotgg/t3code#8160's move of the git PR picker from thread- to project-scope, applied to the pill-nav cluster where Marcode renders that control.
  • index.css — dropped upstream's retired .chat-composer-glass-* / -drawer-* / -context-strip / -shoulder-tab rules, kept only Marcode's own additions (composer transparency, ambient chat background).
  • OpenInPicker — dropped Marcode's inline file-manager label, now supplied by upstream's editorLabelForPlatform (identical output); kept Marcode's filled icon.
  • useHandleNewThread — Marcode's workspace placement plus upstream's project-default model resolution.
  • mobile app.config.ts / package.json / authClientMetadata — Marcode's env var, schemes, release icon and label; upstream's runtimeVersionPolicy, reworked script set and tablet/phone device detection.
  • vite.config.ts — upstream's new no-mobile-uniwind-theme-escape-hatches rule registered under Marcode's plugin namespace.
  • Settings / Keybindings / PullRequestListFilters — took upstream's refactors (searchableSetting, WarningTooltipIcon, BrowserKeybindingNotice, the new filter control) and rebranded the copy at the shared producer.

Conflicts — kept Marcode's surface

Conflicts — took upstream

Why

The dangerous part of a sync this size is not the conflicts — it is what merges cleanly and then quietly does not work on a fork. Nine such breaks were found and fixed. Seven were caught locally; the last two were caught by CI, and are called out as such.

BreakEffect if shipped
cli/theme.ts read T3CODE_HOMEt3 theme would ignore the user's Marcode home and write to the default install — every other Marcode CLI command reads MARCODE_HOME. Now pinned by a precedence test.
connection/clientMetadata.ts hardcoded "T3 Code Desktop" / "T3 Code Web"Wrong user-visible client label on every paired session. Rebranded; its test asserts it.
3 oxlint suppressions named upstream's t3code/ plugin namespaceInert on Marcode, so no-global-process-runtime fired as a lint error in preload.ts, verify-preload-bundle.mjs and externalLauncher.test.ts.
The new uniwind rule's test used the t3code/ rule idTest asserts against a rule that does not exist here.
Migration 043's test carried upstream's toMigrationInclusive bounds (41/42)Failed against Marcode's +1 numbering.
ThreadSettlementReactor.test.ts fixture lacked workspaceLayoutVersion / workspaceLayoutTypecheck failure — those are Marcode-only fields on OrchestrationProjectShell.
projectCommands.test.ts (Marcode-only) missed subscribeServerConfigTypecheck failure — RpcSession was widened by pingdotgg#8367.
(caught by CI)useEnvironmentThemeSync.test.ts seeded t3code:themeUpstream's brand-new test (pingdotgg#8569) uses their storage key; Marcode's is marcode:theme, so the stored selection was unreadable and no published theme drove the appearance — 4 assertions resolved dark instead of light. useTheme.ts and the new test came from opposite sides of the merge, so nothing marked the seam. Now also pins the key: a sync reverting it fails here instead of silently dropping every user's theme.
(caught by CI)Migrations.test.ts registry pinThe pin did its job — adding two migrations shifted its trailing window and it failed loudly. Updated, and re-anchored on migration 33 rather than slice(-10), which would slide off the Marcode-owned id as upstream keeps adding migrations.

Also restored the THREAD_SIDEBAR_DEFAULT_WIDTH export, which upstream un-exported when it deleted the test that used it — Marcode keeps that test.

Removal pins

Deletions are invisible to a merge, so upstream re-adds them silently every sync.

  • Kept threadSidebarWidth.test.ts and mobileBranding.test.ts, both pruned upstream, both asserting Marcode-specific behavior.
  • Added apps/web/src/editor/retired-right-panel-file-surfaces.test.ts so the next sync fails loudly when upstream re-adds the retired file panels. This sync is the worked example: upstream's expand/collapse-all control (feat(web): add expand/collapse all control to the files surface pingdotgg/t3code#8889) arrived as a brand-new module under a panel Marcode does not render, with no conflict.

Coupled subtrees

effect is unchanged in pnpm-workspace.yaml and infra/relay/package.json is byte-identical, so neither vendored subtree needs a sync. pnpm-workspace.yaml did move for Expo 56→57 and Clerk bumps; the lockfile was regenerated with pnpm (never hand-edited) and pnpm install --frozen-lockfile passes.

Notes for review

  • Pre-existing, deliberately not touched:apps/mobile/app.config.ts still uses "T3 Code" for appName and its iOS permission strings on main. Upstream added two more in that style (photo library, microphone) and they were left matching the file's existing convention rather than half-rebranding it. Worth a separate decision.
  • .github/workflows/desktop-macos-preview.yml is new from upstream and needs a blacksmith-12vcpu-macos-26 runner. It only fires on a preview:mac label, so it is inert by default.
  • chat-composer-horizontal-inset is referenced in ChatView.tsx but defined in no stylesheet. Pre-existing on both sides of the merge, not introduced here.

Checklist

  • Every conflict resolved by hand, combining both intents — no whole-file ours/theirs
  • Zero conflict markers, zero unmerged paths, no .bak/.orig residue
  • Fork-boundary audit for identity that merges without a conflict
  • Compatibility identifiers left upstream-shaped: T3_BOOT_SERVICE_UNIT, T3_SERVICE_LAUNCHER_CONTEXT, @t3tools/*, the t3 package/CLI name, com.t3tools.t3code.service, and the t3code:* storage keys Marcode has not deliberately migrated
  • Coupled vendored subtrees checked
  • CI green on the current head
  • UI screenshots — not applicable: no Marcode-authored UI change; the visual deltas are upstream's own

Verification

CI is green on b119e211 — all four required checks pass (Check, Test, Mobile Native Static Analysis, Release Smoke), plus Test Server 1/2/3, Rust, Mobile Native Changes, Native fingerprint diff and claude-review. No review threads open. Thread-transfer ceilings all within budget.

Two commits sit on top of the merge, each fixing one real CI failure. Both were root-caused, not re-run: the failure was reproduced locally first, then shown passing.

  • f38f3a83test(server): update the migration registry pin.
  • b119e211test(web): seed Marcode's theme key in the published-theme sync test.

Local checks alongside CI: focused tests across the touched scope, typecheck clean for contracts, shared, client-runtime, web, t3 (server), desktop and mobile, vp fmt --check clean over all changed files, and vp lint with zero errors across the touched directories.

One local-only failure, environmental: four tests in apps/server/src/cli/theme.test.ts fail in the sync container. They inject write/read failures with chmod 000 and chmod 555, and that container runs as root, which bypasses those mode bits — verified directly (root reads a 000 file and writes into a 555 directory). They are upstream-authored, untouched by this merge, and pass in CI, as the green Test Server jobs above confirm.

t3dotggand others added 30 commits August 24, 2026 12:42
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
…gg#7140)
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
juliusmarmingeand others added 22 commits August 31, 2026 17:42
Co-authored-by: Julius Marminge <julius@mac.lan>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
…pingdotgg#9024)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Theo Browne <me@t3.gg>
…g#8367)
Reuse one server config subscription for session bootstrap and live updates.
Preserve environment theme opt-in, replay, deletion, slow subscriber recovery, and config stream failure handling.
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
170 upstream commits (f035a0f..b883fc0), 45 conflicts resolved by hand.
Conflict decisions
------------------
Combined both intents (upstream fix + Marcode behavior):
- cloud/bootService.ts: keep Marcode's MARCODE_HOME plist key (the launcher's
resolveLauncherBaseDir reads it and exits without it) and take upstream's new
PATH export. Both are now pinned by separate tests.
- persistence/Migrations.ts: upstream's 042/043 renumbered to Marcode's 043/044.
Marcode's 033_ProjectWorkspaceLayout occupies 033, so every shared migration
sits one id higher; renumbering an applied id would re-run or skip it.
- ServerEnvironment / contracts environment.ts: keep both capability flags
(workspaceLayoutMutations, threadPullRequestLinking).
- ChatView.tsx: took upstream's ComposerSurface extraction (index.css no longer
carries the composer glass rules) and re-applied Marcode's transparency via
chat-composer-glass-shell-transparent, which still overrides --glass-opacity.
Also took pingdotgg#8160's move of the git PR picker from thread- to project-scope,
applied to the pill-nav cluster where Marcode renders that control.
- index.css: dropped upstream's retired .chat-composer-glass-*/-drawer-*/
-context-strip/-shoulder-tab rules, kept only Marcode's additions (composer
transparency, ambient chat background).
- OpenInPicker: dropped Marcode's inline file-manager label, now supplied by
upstream's editorLabelForPlatform; kept Marcode's filled icon.
- useHandleNewThread: Marcode's workspace placement plus upstream's project
default model resolution.
- app.config.ts / mobile package.json / authClientMetadata: Marcode's env var,
schemes, release icon and label; upstream's runtimeVersionPolicy, script set
and tablet/phone device detection.
- vite.config.ts: upstream's new no-mobile-uniwind-theme-escape-hatches rule
registered under Marcode's plugin namespace.
- Settings/KeybindingsSettings/PullRequestListFilters: took upstream's
refactors (searchableSetting, WarningTooltipIcon, BrowserKeybindingNotice,
the new filter control) and rebranded the copy at the shared producer.
Kept Marcode's surface, upstream change did not apply:
- ChatHeader.tsx / SidebarChrome.tsx: thread actions and sidebar chrome live in
FloatingPillNav. Upstream's pingdotgg#8168 back-button fix has no surface to land on;
noted at the seam.
- ThreadTerminalDrawer.tsx: Marcode keeps xterm. Upstream's pingdotgg#7488 URL-activation
fix is already covered by extractTerminalLinks' match.kind.
- components/files/: right-panel file surfaces stay retired. Upstream's new
fileTreeExpansion module only fed the deleted FileBrowserPanel.
Took upstream:
- threadSettled.test.ts deleted: its subject (effectiveSettled, canSettle,
changeRequestAutoSettles) moved server-side in pingdotgg#8600.
Fork-boundary breaks that merged without a conflict
---------------------------------------------------
- cli/theme.ts read T3CODE_HOME while every other Marcode CLI command reads
MARCODE_HOME, so `t3 theme` would have ignored the user's home and written to
the default install. Now reads MARCODE_HOME, with a test pinning the
precedence.
- connection/clientMetadata.ts hardcoded "T3 Code Desktop"/"T3 Code Web" as the
client's user-visible label. Rebranded; the test asserts it.
- Three oxlint suppressions arrived naming upstream's plugin namespace
(t3code/...), which is inert on Marcode, so no-global-process-runtime fired as
an error in preload.ts, verify-preload-bundle.mjs and externalLauncher.test.ts.
Repointed to marcode/.
- The new uniwind rule's test used the t3code/ rule id.
- Migration 043's test carried upstream's toMigrationInclusive bounds (41/42).
- ThreadSettlementReactor.test.ts's project fixture lacked Marcode's
workspaceLayoutVersion/workspaceLayout fields.
- projectCommands.test.ts (Marcode-only) missed subscribeServerConfig, added to
RpcSession by pingdotgg#8367.
- threadSidebarWidth.ts: upstream un-exported THREAD_SIDEBAR_DEFAULT_WIDTH when
it deleted the test; Marcode keeps that test, so the export is restored.
Removal pins
------------
- Kept threadSidebarWidth.test.ts and mobileBranding.test.ts, which upstream
pruned; both assert Marcode-specific behavior.
- Added apps/web/src/editor/retired-right-panel-file-surfaces.test.ts so a
future sync fails loudly when upstream re-adds the retired file panels.
Coupled subtrees: effect and infra/relay/package.json are unchanged, so neither
vendored subtree needs a sync.
Verification: focused tests across the touched scope, typecheck for contracts,
shared, client-runtime, web, server, desktop and mobile, plus fmt --check and
lint over the changed files and directories. Four chmod-based permission tests
in cli/theme.test.ts fail in this container because it runs as root, which
bypasses the mode bits they inject; they are upstream-authored and pass in CI.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TRQykYQJKmRh6UmTz2wy3a
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL labels Sep 1, 2026
@github-actionsgithub-actionsBot added the 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. label Sep 1, 2026
@github-actions

github-actionsBot commented Sep 1, 2026

Copy link
Copy Markdown

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.4 KiB13.1 KiB−314 B (−2.3%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB−2 B (−0.0%)7.3 KiB
CodexLive turn WebSocket wire6.5 KiB6.2 KiB−312 B (−4.7%)7.8 KiB
CodexLive turn WebSocket decoded55.0 KiB54.7 KiB−352 B (−0.6%)66.4 KiB
CodexLive turn messages168−8 (−50.0%)21
ClaudeTotal thread wire13.4 KiB13.3 KiB−182 B (−1.3%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB+10 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.5 KiB6.4 KiB−192 B (−2.9%)7.8 KiB
ClaudeLive turn WebSocket decoded55.8 KiB56.3 KiB+488 B (+0.9%)66.4 KiB
ClaudeLive turn messages168−8 (−50.0%)21

Baseline: 200e149 · PR result: b119e21 · 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: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

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

The registry pin in Migrations.test.ts did what it exists to do: adding
upstream's two new migrations as Marcode's 043/044 shifted its trailing
window and it failed loudly on CI (Test Server 2).
Records 043_ProjectionThreadLinkedPullRequest and
044_ProjectionThreadsUnsettledAt as the expected tail, and anchors the
assertion on migration 33 instead of a fixed `slice(-10)`. The trailing
window would slide off the Marcode-owned id once upstream adds enough
migrations, quietly dropping the pin this test exists to hold.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TRQykYQJKmRh6UmTz2wy3a
Upstream's new useEnvironmentThemeSync test (pingdotgg#8569) arrived with the
b883fc0 sync and seeds localStorage with `t3code:theme`. Marcode
deliberately renamed that key to `marcode:theme`, so the stored selection
was unreadable, no published theme ever drove the appearance, and all four
assertions resolved dark instead of light.
The merge produced no conflict here: useTheme.ts and the test come from
different sides, so nothing marked the seam. Seeds `marcode:theme` and says
why, matching the literal useTheme.test.ts and themeBoot.test.ts already
use. The test now also pins the key: a sync that reverts useTheme.ts to
upstream's name fails here instead of silently dropping every user's
stored theme.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TRQykYQJKmRh6UmTz2wy3a
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native ChangeChanges the native fingerprint; merging blocks production OTAs until a new store build ships.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@t3dotgg@tris203@flamboh@RakshithBhat03@StiensWout@lnieuwenhuis@MohtashamMurshid@SunkenInTime@luckyPipewrench@krutftw@colonelpanic8@gsimone@juliusmarminge@ipanasenko@ikifar2012@anirudhsama@none23@extoci@shivamhwp
, '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 b883fc06 - #68

Draft
maarco wants to merge 173 commits into
mainfrom
claude/gracious-bohr-gk75tw
Draft

chore(upstream): sync marcode through b883fc06#68
maarco wants to merge 173 commits into
mainfrom
claude/gracious-bohr-gk75tw

Conversation

@maarco

@maarcomaarco commented Sep 1, 2026

Copy link
Copy Markdown
Owner

What Changed

Merges pingdotgg/t3code@b883fc066ea5c9bebbe1c3e9b4bc2471aab3685f into main — 170 upstream commits over f035a0f4..b883fc06, 854 files. 45 conflicts, all resolved by hand. No whole-file ours/theirs, no force push, reset, restore, stash or clean.

Upstream SHAb883fc066ea5c9bebbe1c3e9b4bc2471aab3685f
Merge basef035a0f4cdf4abaa6704673af7b5a4a321149ba2
Target base200e1491 (origin/main)
Merge commitf1b2a407 (two parents)
Headb119e211CI green, mergeable

Conflicts — combined both intents

  • cloud/bootService.ts — keep Marcode's MARCODE_HOME plist key (the launcher's resolveLauncherBaseDir reads it and exits without it) and take upstream's new PATH export. Both now pinned by separate tests.
  • persistence/Migrations.ts — upstream's 042/043 renumbered to Marcode's 043/044. Marcode's 033_ProjectWorkspaceLayout occupies 033, so every shared migration sits one id higher; renumbering an applied id would re-run or skip it on existing installs.
  • ServerEnvironment / contracts/environment.ts — both capability flags (workspaceLayoutMutations, threadPullRequestLinking).
  • ChatView.tsx — took upstream's ComposerSurface extraction (they moved the composer glass out of index.css) and re-applied Marcode's transparency through chat-composer-glass-shell-transparent, which still overrides the --glass-opacity variable their Shell reads. Also took feat: link pull requests to threads pingdotgg/t3code#8160's move of the git PR picker from thread- to project-scope, applied to the pill-nav cluster where Marcode renders that control.
  • index.css — dropped upstream's retired .chat-composer-glass-* / -drawer-* / -context-strip / -shoulder-tab rules, kept only Marcode's own additions (composer transparency, ambient chat background).
  • OpenInPicker — dropped Marcode's inline file-manager label, now supplied by upstream's editorLabelForPlatform (identical output); kept Marcode's filled icon.
  • useHandleNewThread — Marcode's workspace placement plus upstream's project-default model resolution.
  • mobile app.config.ts / package.json / authClientMetadata — Marcode's env var, schemes, release icon and label; upstream's runtimeVersionPolicy, reworked script set and tablet/phone device detection.
  • vite.config.ts — upstream's new no-mobile-uniwind-theme-escape-hatches rule registered under Marcode's plugin namespace.
  • Settings / Keybindings / PullRequestListFilters — took upstream's refactors (searchableSetting, WarningTooltipIcon, BrowserKeybindingNotice, the new filter control) and rebranded the copy at the shared producer.

Conflicts — kept Marcode's surface

Conflicts — took upstream

Why

The dangerous part of a sync this size is not the conflicts — it is what merges cleanly and then quietly does not work on a fork. Nine such breaks were found and fixed. Seven were caught locally; the last two were caught by CI, and are called out as such.

BreakEffect if shipped
cli/theme.ts read T3CODE_HOMEt3 theme would ignore the user's Marcode home and write to the default install — every other Marcode CLI command reads MARCODE_HOME. Now pinned by a precedence test.
connection/clientMetadata.ts hardcoded "T3 Code Desktop" / "T3 Code Web"Wrong user-visible client label on every paired session. Rebranded; its test asserts it.
3 oxlint suppressions named upstream's t3code/ plugin namespaceInert on Marcode, so no-global-process-runtime fired as a lint error in preload.ts, verify-preload-bundle.mjs and externalLauncher.test.ts.
The new uniwind rule's test used the t3code/ rule idTest asserts against a rule that does not exist here.
Migration 043's test carried upstream's toMigrationInclusive bounds (41/42)Failed against Marcode's +1 numbering.
ThreadSettlementReactor.test.ts fixture lacked workspaceLayoutVersion / workspaceLayoutTypecheck failure — those are Marcode-only fields on OrchestrationProjectShell.
projectCommands.test.ts (Marcode-only) missed subscribeServerConfigTypecheck failure — RpcSession was widened by pingdotgg#8367.
(caught by CI)useEnvironmentThemeSync.test.ts seeded t3code:themeUpstream's brand-new test (pingdotgg#8569) uses their storage key; Marcode's is marcode:theme, so the stored selection was unreadable and no published theme drove the appearance — 4 assertions resolved dark instead of light. useTheme.ts and the new test came from opposite sides of the merge, so nothing marked the seam. Now also pins the key: a sync reverting it fails here instead of silently dropping every user's theme.
(caught by CI)Migrations.test.ts registry pinThe pin did its job — adding two migrations shifted its trailing window and it failed loudly. Updated, and re-anchored on migration 33 rather than slice(-10), which would slide off the Marcode-owned id as upstream keeps adding migrations.

Also restored the THREAD_SIDEBAR_DEFAULT_WIDTH export, which upstream un-exported when it deleted the test that used it — Marcode keeps that test.

Removal pins

Deletions are invisible to a merge, so upstream re-adds them silently every sync.

  • Kept threadSidebarWidth.test.ts and mobileBranding.test.ts, both pruned upstream, both asserting Marcode-specific behavior.
  • Added apps/web/src/editor/retired-right-panel-file-surfaces.test.ts so the next sync fails loudly when upstream re-adds the retired file panels. This sync is the worked example: upstream's expand/collapse-all control (feat(web): add expand/collapse all control to the files surface pingdotgg/t3code#8889) arrived as a brand-new module under a panel Marcode does not render, with no conflict.

Coupled subtrees

effect is unchanged in pnpm-workspace.yaml and infra/relay/package.json is byte-identical, so neither vendored subtree needs a sync. pnpm-workspace.yaml did move for Expo 56→57 and Clerk bumps; the lockfile was regenerated with pnpm (never hand-edited) and pnpm install --frozen-lockfile passes.

Notes for review

  • Pre-existing, deliberately not touched:apps/mobile/app.config.ts still uses "T3 Code" for appName and its iOS permission strings on main. Upstream added two more in that style (photo library, microphone) and they were left matching the file's existing convention rather than half-rebranding it. Worth a separate decision.
  • .github/workflows/desktop-macos-preview.yml is new from upstream and needs a blacksmith-12vcpu-macos-26 runner. It only fires on a preview:mac label, so it is inert by default.
  • chat-composer-horizontal-inset is referenced in ChatView.tsx but defined in no stylesheet. Pre-existing on both sides of the merge, not introduced here.

Checklist

  • Every conflict resolved by hand, combining both intents — no whole-file ours/theirs
  • Zero conflict markers, zero unmerged paths, no .bak/.orig residue
  • Fork-boundary audit for identity that merges without a conflict
  • Compatibility identifiers left upstream-shaped: T3_BOOT_SERVICE_UNIT, T3_SERVICE_LAUNCHER_CONTEXT, @t3tools/*, the t3 package/CLI name, com.t3tools.t3code.service, and the t3code:* storage keys Marcode has not deliberately migrated
  • Coupled vendored subtrees checked
  • CI green on the current head
  • UI screenshots — not applicable: no Marcode-authored UI change; the visual deltas are upstream's own

Verification

CI is green on b119e211 — all four required checks pass (Check, Test, Mobile Native Static Analysis, Release Smoke), plus Test Server 1/2/3, Rust, Mobile Native Changes, Native fingerprint diff and claude-review. No review threads open. Thread-transfer ceilings all within budget.

Two commits sit on top of the merge, each fixing one real CI failure. Both were root-caused, not re-run: the failure was reproduced locally first, then shown passing.

  • f38f3a83test(server): update the migration registry pin.
  • b119e211test(web): seed Marcode's theme key in the published-theme sync test.

Local checks alongside CI: focused tests across the touched scope, typecheck clean for contracts, shared, client-runtime, web, t3 (server), desktop and mobile, vp fmt --check clean over all changed files, and vp lint with zero errors across the touched directories.

One local-only failure, environmental: four tests in apps/server/src/cli/theme.test.ts fail in the sync container. They inject write/read failures with chmod 000 and chmod 555, and that container runs as root, which bypasses those mode bits — verified directly (root reads a 000 file and writes into a 555 directory). They are upstream-authored, untouched by this merge, and pass in CI, as the green Test Server jobs above confirm.

t3dotggand others added 30 commits August 24, 2026 12:42
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
…gg#7140)
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
juliusmarmingeand others added 22 commits August 31, 2026 17:42
Co-authored-by: Julius Marminge <julius@mac.lan>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
…pingdotgg#9024)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Theo Browne <me@t3.gg>
…g#8367)
Reuse one server config subscription for session bootstrap and live updates.
Preserve environment theme opt-in, replay, deletion, slow subscriber recovery, and config stream failure handling.
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
170 upstream commits (f035a0f..b883fc0), 45 conflicts resolved by hand.
Conflict decisions
------------------
Combined both intents (upstream fix + Marcode behavior):
- cloud/bootService.ts: keep Marcode's MARCODE_HOME plist key (the launcher's
resolveLauncherBaseDir reads it and exits without it) and take upstream's new
PATH export. Both are now pinned by separate tests.
- persistence/Migrations.ts: upstream's 042/043 renumbered to Marcode's 043/044.
Marcode's 033_ProjectWorkspaceLayout occupies 033, so every shared migration
sits one id higher; renumbering an applied id would re-run or skip it.
- ServerEnvironment / contracts environment.ts: keep both capability flags
(workspaceLayoutMutations, threadPullRequestLinking).
- ChatView.tsx: took upstream's ComposerSurface extraction (index.css no longer
carries the composer glass rules) and re-applied Marcode's transparency via
chat-composer-glass-shell-transparent, which still overrides --glass-opacity.
Also took pingdotgg#8160's move of the git PR picker from thread- to project-scope,
applied to the pill-nav cluster where Marcode renders that control.
- index.css: dropped upstream's retired .chat-composer-glass-*/-drawer-*/
-context-strip/-shoulder-tab rules, kept only Marcode's additions (composer
transparency, ambient chat background).
- OpenInPicker: dropped Marcode's inline file-manager label, now supplied by
upstream's editorLabelForPlatform; kept Marcode's filled icon.
- useHandleNewThread: Marcode's workspace placement plus upstream's project
default model resolution.
- app.config.ts / mobile package.json / authClientMetadata: Marcode's env var,
schemes, release icon and label; upstream's runtimeVersionPolicy, script set
and tablet/phone device detection.
- vite.config.ts: upstream's new no-mobile-uniwind-theme-escape-hatches rule
registered under Marcode's plugin namespace.
- Settings/KeybindingsSettings/PullRequestListFilters: took upstream's
refactors (searchableSetting, WarningTooltipIcon, BrowserKeybindingNotice,
the new filter control) and rebranded the copy at the shared producer.
Kept Marcode's surface, upstream change did not apply:
- ChatHeader.tsx / SidebarChrome.tsx: thread actions and sidebar chrome live in
FloatingPillNav. Upstream's pingdotgg#8168 back-button fix has no surface to land on;
noted at the seam.
- ThreadTerminalDrawer.tsx: Marcode keeps xterm. Upstream's pingdotgg#7488 URL-activation
fix is already covered by extractTerminalLinks' match.kind.
- components/files/: right-panel file surfaces stay retired. Upstream's new
fileTreeExpansion module only fed the deleted FileBrowserPanel.
Took upstream:
- threadSettled.test.ts deleted: its subject (effectiveSettled, canSettle,
changeRequestAutoSettles) moved server-side in pingdotgg#8600.
Fork-boundary breaks that merged without a conflict
---------------------------------------------------
- cli/theme.ts read T3CODE_HOME while every other Marcode CLI command reads
MARCODE_HOME, so `t3 theme` would have ignored the user's home and written to
the default install. Now reads MARCODE_HOME, with a test pinning the
precedence.
- connection/clientMetadata.ts hardcoded "T3 Code Desktop"/"T3 Code Web" as the
client's user-visible label. Rebranded; the test asserts it.
- Three oxlint suppressions arrived naming upstream's plugin namespace
(t3code/...), which is inert on Marcode, so no-global-process-runtime fired as
an error in preload.ts, verify-preload-bundle.mjs and externalLauncher.test.ts.
Repointed to marcode/.
- The new uniwind rule's test used the t3code/ rule id.
- Migration 043's test carried upstream's toMigrationInclusive bounds (41/42).
- ThreadSettlementReactor.test.ts's project fixture lacked Marcode's
workspaceLayoutVersion/workspaceLayout fields.
- projectCommands.test.ts (Marcode-only) missed subscribeServerConfig, added to
RpcSession by pingdotgg#8367.
- threadSidebarWidth.ts: upstream un-exported THREAD_SIDEBAR_DEFAULT_WIDTH when
it deleted the test; Marcode keeps that test, so the export is restored.
Removal pins
------------
- Kept threadSidebarWidth.test.ts and mobileBranding.test.ts, which upstream
pruned; both assert Marcode-specific behavior.
- Added apps/web/src/editor/retired-right-panel-file-surfaces.test.ts so a
future sync fails loudly when upstream re-adds the retired file panels.
Coupled subtrees: effect and infra/relay/package.json are unchanged, so neither
vendored subtree needs a sync.
Verification: focused tests across the touched scope, typecheck for contracts,
shared, client-runtime, web, server, desktop and mobile, plus fmt --check and
lint over the changed files and directories. Four chmod-based permission tests
in cli/theme.test.ts fail in this container because it runs as root, which
bypasses the mode bits they inject; they are upstream-authored and pass in CI.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TRQykYQJKmRh6UmTz2wy3a
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL labels Sep 1, 2026
@github-actionsgithub-actionsBot added the 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. label Sep 1, 2026
@github-actions

github-actionsBot commented Sep 1, 2026

Copy link
Copy Markdown

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.4 KiB13.1 KiB−314 B (−2.3%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB−2 B (−0.0%)7.3 KiB
CodexLive turn WebSocket wire6.5 KiB6.2 KiB−312 B (−4.7%)7.8 KiB
CodexLive turn WebSocket decoded55.0 KiB54.7 KiB−352 B (−0.6%)66.4 KiB
CodexLive turn messages168−8 (−50.0%)21
ClaudeTotal thread wire13.4 KiB13.3 KiB−182 B (−1.3%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB+10 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.5 KiB6.4 KiB−192 B (−2.9%)7.8 KiB
ClaudeLive turn WebSocket decoded55.8 KiB56.3 KiB+488 B (+0.9%)66.4 KiB
ClaudeLive turn messages168−8 (−50.0%)21

Baseline: 200e149 · PR result: b119e21 · 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: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

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

The registry pin in Migrations.test.ts did what it exists to do: adding
upstream's two new migrations as Marcode's 043/044 shifted its trailing
window and it failed loudly on CI (Test Server 2).
Records 043_ProjectionThreadLinkedPullRequest and
044_ProjectionThreadsUnsettledAt as the expected tail, and anchors the
assertion on migration 33 instead of a fixed `slice(-10)`. The trailing
window would slide off the Marcode-owned id once upstream adds enough
migrations, quietly dropping the pin this test exists to hold.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TRQykYQJKmRh6UmTz2wy3a
Upstream's new useEnvironmentThemeSync test (pingdotgg#8569) arrived with the
b883fc0 sync and seeds localStorage with `t3code:theme`. Marcode
deliberately renamed that key to `marcode:theme`, so the stored selection
was unreadable, no published theme ever drove the appearance, and all four
assertions resolved dark instead of light.
The merge produced no conflict here: useTheme.ts and the test come from
different sides, so nothing marked the seam. Seeds `marcode:theme` and says
why, matching the literal useTheme.test.ts and themeBoot.test.ts already
use. The test now also pins the key: a sync that reverts useTheme.ts to
upstream's name fails here instead of silently dropping every user's
stored theme.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TRQykYQJKmRh6UmTz2wy3a
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native ChangeChanges the native fingerprint; merging blocks production OTAs until a new store build ships.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@t3dotgg@tris203@flamboh@RakshithBhat03@StiensWout@lnieuwenhuis@MohtashamMurshid@SunkenInTime@luckyPipewrench@krutftw@colonelpanic8@gsimone@juliusmarminge@ipanasenko@ikifar2012@anirudhsama@none23@extoci@shivamhwp
, '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 b883fc06 - #68

Draft
maarco wants to merge 173 commits into
mainfrom
claude/gracious-bohr-gk75tw
Draft

chore(upstream): sync marcode through b883fc06#68
maarco wants to merge 173 commits into
mainfrom
claude/gracious-bohr-gk75tw

Conversation

@maarco

@maarcomaarco commented Sep 1, 2026

Copy link
Copy Markdown
Owner

What Changed

Merges pingdotgg/t3code@b883fc066ea5c9bebbe1c3e9b4bc2471aab3685f into main — 170 upstream commits over f035a0f4..b883fc06, 854 files. 45 conflicts, all resolved by hand. No whole-file ours/theirs, no force push, reset, restore, stash or clean.

Upstream SHAb883fc066ea5c9bebbe1c3e9b4bc2471aab3685f
Merge basef035a0f4cdf4abaa6704673af7b5a4a321149ba2
Target base200e1491 (origin/main)
Merge commitf1b2a407 (two parents)
Headb119e211CI green, mergeable

Conflicts — combined both intents

  • cloud/bootService.ts — keep Marcode's MARCODE_HOME plist key (the launcher's resolveLauncherBaseDir reads it and exits without it) and take upstream's new PATH export. Both now pinned by separate tests.
  • persistence/Migrations.ts — upstream's 042/043 renumbered to Marcode's 043/044. Marcode's 033_ProjectWorkspaceLayout occupies 033, so every shared migration sits one id higher; renumbering an applied id would re-run or skip it on existing installs.
  • ServerEnvironment / contracts/environment.ts — both capability flags (workspaceLayoutMutations, threadPullRequestLinking).
  • ChatView.tsx — took upstream's ComposerSurface extraction (they moved the composer glass out of index.css) and re-applied Marcode's transparency through chat-composer-glass-shell-transparent, which still overrides the --glass-opacity variable their Shell reads. Also took feat: link pull requests to threads pingdotgg/t3code#8160's move of the git PR picker from thread- to project-scope, applied to the pill-nav cluster where Marcode renders that control.
  • index.css — dropped upstream's retired .chat-composer-glass-* / -drawer-* / -context-strip / -shoulder-tab rules, kept only Marcode's own additions (composer transparency, ambient chat background).
  • OpenInPicker — dropped Marcode's inline file-manager label, now supplied by upstream's editorLabelForPlatform (identical output); kept Marcode's filled icon.
  • useHandleNewThread — Marcode's workspace placement plus upstream's project-default model resolution.
  • mobile app.config.ts / package.json / authClientMetadata — Marcode's env var, schemes, release icon and label; upstream's runtimeVersionPolicy, reworked script set and tablet/phone device detection.
  • vite.config.ts — upstream's new no-mobile-uniwind-theme-escape-hatches rule registered under Marcode's plugin namespace.
  • Settings / Keybindings / PullRequestListFilters — took upstream's refactors (searchableSetting, WarningTooltipIcon, BrowserKeybindingNotice, the new filter control) and rebranded the copy at the shared producer.

Conflicts — kept Marcode's surface

Conflicts — took upstream

Why

The dangerous part of a sync this size is not the conflicts — it is what merges cleanly and then quietly does not work on a fork. Nine such breaks were found and fixed. Seven were caught locally; the last two were caught by CI, and are called out as such.

BreakEffect if shipped
cli/theme.ts read T3CODE_HOMEt3 theme would ignore the user's Marcode home and write to the default install — every other Marcode CLI command reads MARCODE_HOME. Now pinned by a precedence test.
connection/clientMetadata.ts hardcoded "T3 Code Desktop" / "T3 Code Web"Wrong user-visible client label on every paired session. Rebranded; its test asserts it.
3 oxlint suppressions named upstream's t3code/ plugin namespaceInert on Marcode, so no-global-process-runtime fired as a lint error in preload.ts, verify-preload-bundle.mjs and externalLauncher.test.ts.
The new uniwind rule's test used the t3code/ rule idTest asserts against a rule that does not exist here.
Migration 043's test carried upstream's toMigrationInclusive bounds (41/42)Failed against Marcode's +1 numbering.
ThreadSettlementReactor.test.ts fixture lacked workspaceLayoutVersion / workspaceLayoutTypecheck failure — those are Marcode-only fields on OrchestrationProjectShell.
projectCommands.test.ts (Marcode-only) missed subscribeServerConfigTypecheck failure — RpcSession was widened by pingdotgg#8367.
(caught by CI)useEnvironmentThemeSync.test.ts seeded t3code:themeUpstream's brand-new test (pingdotgg#8569) uses their storage key; Marcode's is marcode:theme, so the stored selection was unreadable and no published theme drove the appearance — 4 assertions resolved dark instead of light. useTheme.ts and the new test came from opposite sides of the merge, so nothing marked the seam. Now also pins the key: a sync reverting it fails here instead of silently dropping every user's theme.
(caught by CI)Migrations.test.ts registry pinThe pin did its job — adding two migrations shifted its trailing window and it failed loudly. Updated, and re-anchored on migration 33 rather than slice(-10), which would slide off the Marcode-owned id as upstream keeps adding migrations.

Also restored the THREAD_SIDEBAR_DEFAULT_WIDTH export, which upstream un-exported when it deleted the test that used it — Marcode keeps that test.

Removal pins

Deletions are invisible to a merge, so upstream re-adds them silently every sync.

  • Kept threadSidebarWidth.test.ts and mobileBranding.test.ts, both pruned upstream, both asserting Marcode-specific behavior.
  • Added apps/web/src/editor/retired-right-panel-file-surfaces.test.ts so the next sync fails loudly when upstream re-adds the retired file panels. This sync is the worked example: upstream's expand/collapse-all control (feat(web): add expand/collapse all control to the files surface pingdotgg/t3code#8889) arrived as a brand-new module under a panel Marcode does not render, with no conflict.

Coupled subtrees

effect is unchanged in pnpm-workspace.yaml and infra/relay/package.json is byte-identical, so neither vendored subtree needs a sync. pnpm-workspace.yaml did move for Expo 56→57 and Clerk bumps; the lockfile was regenerated with pnpm (never hand-edited) and pnpm install --frozen-lockfile passes.

Notes for review

  • Pre-existing, deliberately not touched:apps/mobile/app.config.ts still uses "T3 Code" for appName and its iOS permission strings on main. Upstream added two more in that style (photo library, microphone) and they were left matching the file's existing convention rather than half-rebranding it. Worth a separate decision.
  • .github/workflows/desktop-macos-preview.yml is new from upstream and needs a blacksmith-12vcpu-macos-26 runner. It only fires on a preview:mac label, so it is inert by default.
  • chat-composer-horizontal-inset is referenced in ChatView.tsx but defined in no stylesheet. Pre-existing on both sides of the merge, not introduced here.

Checklist

  • Every conflict resolved by hand, combining both intents — no whole-file ours/theirs
  • Zero conflict markers, zero unmerged paths, no .bak/.orig residue
  • Fork-boundary audit for identity that merges without a conflict
  • Compatibility identifiers left upstream-shaped: T3_BOOT_SERVICE_UNIT, T3_SERVICE_LAUNCHER_CONTEXT, @t3tools/*, the t3 package/CLI name, com.t3tools.t3code.service, and the t3code:* storage keys Marcode has not deliberately migrated
  • Coupled vendored subtrees checked
  • CI green on the current head
  • UI screenshots — not applicable: no Marcode-authored UI change; the visual deltas are upstream's own

Verification

CI is green on b119e211 — all four required checks pass (Check, Test, Mobile Native Static Analysis, Release Smoke), plus Test Server 1/2/3, Rust, Mobile Native Changes, Native fingerprint diff and claude-review. No review threads open. Thread-transfer ceilings all within budget.

Two commits sit on top of the merge, each fixing one real CI failure. Both were root-caused, not re-run: the failure was reproduced locally first, then shown passing.

  • f38f3a83test(server): update the migration registry pin.
  • b119e211test(web): seed Marcode's theme key in the published-theme sync test.

Local checks alongside CI: focused tests across the touched scope, typecheck clean for contracts, shared, client-runtime, web, t3 (server), desktop and mobile, vp fmt --check clean over all changed files, and vp lint with zero errors across the touched directories.

One local-only failure, environmental: four tests in apps/server/src/cli/theme.test.ts fail in the sync container. They inject write/read failures with chmod 000 and chmod 555, and that container runs as root, which bypasses those mode bits — verified directly (root reads a 000 file and writes into a 555 directory). They are upstream-authored, untouched by this merge, and pass in CI, as the green Test Server jobs above confirm.

t3dotggand others added 30 commits August 24, 2026 12:42
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
…gg#7140)
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
juliusmarmingeand others added 22 commits August 31, 2026 17:42
Co-authored-by: Julius Marminge <julius@mac.lan>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
…pingdotgg#9024)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Theo Browne <me@t3.gg>
…g#8367)
Reuse one server config subscription for session bootstrap and live updates.
Preserve environment theme opt-in, replay, deletion, slow subscriber recovery, and config stream failure handling.
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
170 upstream commits (f035a0f..b883fc0), 45 conflicts resolved by hand.
Conflict decisions
------------------
Combined both intents (upstream fix + Marcode behavior):
- cloud/bootService.ts: keep Marcode's MARCODE_HOME plist key (the launcher's
resolveLauncherBaseDir reads it and exits without it) and take upstream's new
PATH export. Both are now pinned by separate tests.
- persistence/Migrations.ts: upstream's 042/043 renumbered to Marcode's 043/044.
Marcode's 033_ProjectWorkspaceLayout occupies 033, so every shared migration
sits one id higher; renumbering an applied id would re-run or skip it.
- ServerEnvironment / contracts environment.ts: keep both capability flags
(workspaceLayoutMutations, threadPullRequestLinking).
- ChatView.tsx: took upstream's ComposerSurface extraction (index.css no longer
carries the composer glass rules) and re-applied Marcode's transparency via
chat-composer-glass-shell-transparent, which still overrides --glass-opacity.
Also took pingdotgg#8160's move of the git PR picker from thread- to project-scope,
applied to the pill-nav cluster where Marcode renders that control.
- index.css: dropped upstream's retired .chat-composer-glass-*/-drawer-*/
-context-strip/-shoulder-tab rules, kept only Marcode's additions (composer
transparency, ambient chat background).
- OpenInPicker: dropped Marcode's inline file-manager label, now supplied by
upstream's editorLabelForPlatform; kept Marcode's filled icon.
- useHandleNewThread: Marcode's workspace placement plus upstream's project
default model resolution.
- app.config.ts / mobile package.json / authClientMetadata: Marcode's env var,
schemes, release icon and label; upstream's runtimeVersionPolicy, script set
and tablet/phone device detection.
- vite.config.ts: upstream's new no-mobile-uniwind-theme-escape-hatches rule
registered under Marcode's plugin namespace.
- Settings/KeybindingsSettings/PullRequestListFilters: took upstream's
refactors (searchableSetting, WarningTooltipIcon, BrowserKeybindingNotice,
the new filter control) and rebranded the copy at the shared producer.
Kept Marcode's surface, upstream change did not apply:
- ChatHeader.tsx / SidebarChrome.tsx: thread actions and sidebar chrome live in
FloatingPillNav. Upstream's pingdotgg#8168 back-button fix has no surface to land on;
noted at the seam.
- ThreadTerminalDrawer.tsx: Marcode keeps xterm. Upstream's pingdotgg#7488 URL-activation
fix is already covered by extractTerminalLinks' match.kind.
- components/files/: right-panel file surfaces stay retired. Upstream's new
fileTreeExpansion module only fed the deleted FileBrowserPanel.
Took upstream:
- threadSettled.test.ts deleted: its subject (effectiveSettled, canSettle,
changeRequestAutoSettles) moved server-side in pingdotgg#8600.
Fork-boundary breaks that merged without a conflict
---------------------------------------------------
- cli/theme.ts read T3CODE_HOME while every other Marcode CLI command reads
MARCODE_HOME, so `t3 theme` would have ignored the user's home and written to
the default install. Now reads MARCODE_HOME, with a test pinning the
precedence.
- connection/clientMetadata.ts hardcoded "T3 Code Desktop"/"T3 Code Web" as the
client's user-visible label. Rebranded; the test asserts it.
- Three oxlint suppressions arrived naming upstream's plugin namespace
(t3code/...), which is inert on Marcode, so no-global-process-runtime fired as
an error in preload.ts, verify-preload-bundle.mjs and externalLauncher.test.ts.
Repointed to marcode/.
- The new uniwind rule's test used the t3code/ rule id.
- Migration 043's test carried upstream's toMigrationInclusive bounds (41/42).
- ThreadSettlementReactor.test.ts's project fixture lacked Marcode's
workspaceLayoutVersion/workspaceLayout fields.
- projectCommands.test.ts (Marcode-only) missed subscribeServerConfig, added to
RpcSession by pingdotgg#8367.
- threadSidebarWidth.ts: upstream un-exported THREAD_SIDEBAR_DEFAULT_WIDTH when
it deleted the test; Marcode keeps that test, so the export is restored.
Removal pins
------------
- Kept threadSidebarWidth.test.ts and mobileBranding.test.ts, which upstream
pruned; both assert Marcode-specific behavior.
- Added apps/web/src/editor/retired-right-panel-file-surfaces.test.ts so a
future sync fails loudly when upstream re-adds the retired file panels.
Coupled subtrees: effect and infra/relay/package.json are unchanged, so neither
vendored subtree needs a sync.
Verification: focused tests across the touched scope, typecheck for contracts,
shared, client-runtime, web, server, desktop and mobile, plus fmt --check and
lint over the changed files and directories. Four chmod-based permission tests
in cli/theme.test.ts fail in this container because it runs as root, which
bypasses the mode bits they inject; they are upstream-authored and pass in CI.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TRQykYQJKmRh6UmTz2wy3a
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL labels Sep 1, 2026
@github-actionsgithub-actionsBot added the 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. label Sep 1, 2026
@github-actions

github-actionsBot commented Sep 1, 2026

Copy link
Copy Markdown

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.4 KiB13.1 KiB−314 B (−2.3%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB−2 B (−0.0%)7.3 KiB
CodexLive turn WebSocket wire6.5 KiB6.2 KiB−312 B (−4.7%)7.8 KiB
CodexLive turn WebSocket decoded55.0 KiB54.7 KiB−352 B (−0.6%)66.4 KiB
CodexLive turn messages168−8 (−50.0%)21
ClaudeTotal thread wire13.4 KiB13.3 KiB−182 B (−1.3%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB+10 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.5 KiB6.4 KiB−192 B (−2.9%)7.8 KiB
ClaudeLive turn WebSocket decoded55.8 KiB56.3 KiB+488 B (+0.9%)66.4 KiB
ClaudeLive turn messages168−8 (−50.0%)21

Baseline: 200e149 · PR result: b119e21 · 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: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

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

The registry pin in Migrations.test.ts did what it exists to do: adding
upstream's two new migrations as Marcode's 043/044 shifted its trailing
window and it failed loudly on CI (Test Server 2).
Records 043_ProjectionThreadLinkedPullRequest and
044_ProjectionThreadsUnsettledAt as the expected tail, and anchors the
assertion on migration 33 instead of a fixed `slice(-10)`. The trailing
window would slide off the Marcode-owned id once upstream adds enough
migrations, quietly dropping the pin this test exists to hold.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TRQykYQJKmRh6UmTz2wy3a
Upstream's new useEnvironmentThemeSync test (pingdotgg#8569) arrived with the
b883fc0 sync and seeds localStorage with `t3code:theme`. Marcode
deliberately renamed that key to `marcode:theme`, so the stored selection
was unreadable, no published theme ever drove the appearance, and all four
assertions resolved dark instead of light.
The merge produced no conflict here: useTheme.ts and the test come from
different sides, so nothing marked the seam. Seeds `marcode:theme` and says
why, matching the literal useTheme.test.ts and themeBoot.test.ts already
use. The test now also pins the key: a sync that reverts useTheme.ts to
upstream's name fails here instead of silently dropping every user's
stored theme.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TRQykYQJKmRh6UmTz2wy3a
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native ChangeChanges the native fingerprint; merging blocks production OTAs until a new store build ships.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@t3dotgg@tris203@flamboh@RakshithBhat03@StiensWout@lnieuwenhuis@MohtashamMurshid@SunkenInTime@luckyPipewrench@krutftw@colonelpanic8@gsimone@juliusmarminge@ipanasenko@ikifar2012@anirudhsama@none23@extoci@shivamhwp
, '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 b883fc06 - #68

Draft
maarco wants to merge 173 commits into
mainfrom
claude/gracious-bohr-gk75tw
Draft

chore(upstream): sync marcode through b883fc06#68
maarco wants to merge 173 commits into
mainfrom
claude/gracious-bohr-gk75tw

Conversation

@maarco

@maarcomaarco commented Sep 1, 2026

Copy link
Copy Markdown
Owner

What Changed

Merges pingdotgg/t3code@b883fc066ea5c9bebbe1c3e9b4bc2471aab3685f into main — 170 upstream commits over f035a0f4..b883fc06, 854 files. 45 conflicts, all resolved by hand. No whole-file ours/theirs, no force push, reset, restore, stash or clean.

Upstream SHAb883fc066ea5c9bebbe1c3e9b4bc2471aab3685f
Merge basef035a0f4cdf4abaa6704673af7b5a4a321149ba2
Target base200e1491 (origin/main)
Merge commitf1b2a407 (two parents)
Headb119e211CI green, mergeable

Conflicts — combined both intents

  • cloud/bootService.ts — keep Marcode's MARCODE_HOME plist key (the launcher's resolveLauncherBaseDir reads it and exits without it) and take upstream's new PATH export. Both now pinned by separate tests.
  • persistence/Migrations.ts — upstream's 042/043 renumbered to Marcode's 043/044. Marcode's 033_ProjectWorkspaceLayout occupies 033, so every shared migration sits one id higher; renumbering an applied id would re-run or skip it on existing installs.
  • ServerEnvironment / contracts/environment.ts — both capability flags (workspaceLayoutMutations, threadPullRequestLinking).
  • ChatView.tsx — took upstream's ComposerSurface extraction (they moved the composer glass out of index.css) and re-applied Marcode's transparency through chat-composer-glass-shell-transparent, which still overrides the --glass-opacity variable their Shell reads. Also took feat: link pull requests to threads pingdotgg/t3code#8160's move of the git PR picker from thread- to project-scope, applied to the pill-nav cluster where Marcode renders that control.
  • index.css — dropped upstream's retired .chat-composer-glass-* / -drawer-* / -context-strip / -shoulder-tab rules, kept only Marcode's own additions (composer transparency, ambient chat background).
  • OpenInPicker — dropped Marcode's inline file-manager label, now supplied by upstream's editorLabelForPlatform (identical output); kept Marcode's filled icon.
  • useHandleNewThread — Marcode's workspace placement plus upstream's project-default model resolution.
  • mobile app.config.ts / package.json / authClientMetadata — Marcode's env var, schemes, release icon and label; upstream's runtimeVersionPolicy, reworked script set and tablet/phone device detection.
  • vite.config.ts — upstream's new no-mobile-uniwind-theme-escape-hatches rule registered under Marcode's plugin namespace.
  • Settings / Keybindings / PullRequestListFilters — took upstream's refactors (searchableSetting, WarningTooltipIcon, BrowserKeybindingNotice, the new filter control) and rebranded the copy at the shared producer.

Conflicts — kept Marcode's surface

Conflicts — took upstream

Why

The dangerous part of a sync this size is not the conflicts — it is what merges cleanly and then quietly does not work on a fork. Nine such breaks were found and fixed. Seven were caught locally; the last two were caught by CI, and are called out as such.

BreakEffect if shipped
cli/theme.ts read T3CODE_HOMEt3 theme would ignore the user's Marcode home and write to the default install — every other Marcode CLI command reads MARCODE_HOME. Now pinned by a precedence test.
connection/clientMetadata.ts hardcoded "T3 Code Desktop" / "T3 Code Web"Wrong user-visible client label on every paired session. Rebranded; its test asserts it.
3 oxlint suppressions named upstream's t3code/ plugin namespaceInert on Marcode, so no-global-process-runtime fired as a lint error in preload.ts, verify-preload-bundle.mjs and externalLauncher.test.ts.
The new uniwind rule's test used the t3code/ rule idTest asserts against a rule that does not exist here.
Migration 043's test carried upstream's toMigrationInclusive bounds (41/42)Failed against Marcode's +1 numbering.
ThreadSettlementReactor.test.ts fixture lacked workspaceLayoutVersion / workspaceLayoutTypecheck failure — those are Marcode-only fields on OrchestrationProjectShell.
projectCommands.test.ts (Marcode-only) missed subscribeServerConfigTypecheck failure — RpcSession was widened by pingdotgg#8367.
(caught by CI)useEnvironmentThemeSync.test.ts seeded t3code:themeUpstream's brand-new test (pingdotgg#8569) uses their storage key; Marcode's is marcode:theme, so the stored selection was unreadable and no published theme drove the appearance — 4 assertions resolved dark instead of light. useTheme.ts and the new test came from opposite sides of the merge, so nothing marked the seam. Now also pins the key: a sync reverting it fails here instead of silently dropping every user's theme.
(caught by CI)Migrations.test.ts registry pinThe pin did its job — adding two migrations shifted its trailing window and it failed loudly. Updated, and re-anchored on migration 33 rather than slice(-10), which would slide off the Marcode-owned id as upstream keeps adding migrations.

Also restored the THREAD_SIDEBAR_DEFAULT_WIDTH export, which upstream un-exported when it deleted the test that used it — Marcode keeps that test.

Removal pins

Deletions are invisible to a merge, so upstream re-adds them silently every sync.

  • Kept threadSidebarWidth.test.ts and mobileBranding.test.ts, both pruned upstream, both asserting Marcode-specific behavior.
  • Added apps/web/src/editor/retired-right-panel-file-surfaces.test.ts so the next sync fails loudly when upstream re-adds the retired file panels. This sync is the worked example: upstream's expand/collapse-all control (feat(web): add expand/collapse all control to the files surface pingdotgg/t3code#8889) arrived as a brand-new module under a panel Marcode does not render, with no conflict.

Coupled subtrees

effect is unchanged in pnpm-workspace.yaml and infra/relay/package.json is byte-identical, so neither vendored subtree needs a sync. pnpm-workspace.yaml did move for Expo 56→57 and Clerk bumps; the lockfile was regenerated with pnpm (never hand-edited) and pnpm install --frozen-lockfile passes.

Notes for review

  • Pre-existing, deliberately not touched:apps/mobile/app.config.ts still uses "T3 Code" for appName and its iOS permission strings on main. Upstream added two more in that style (photo library, microphone) and they were left matching the file's existing convention rather than half-rebranding it. Worth a separate decision.
  • .github/workflows/desktop-macos-preview.yml is new from upstream and needs a blacksmith-12vcpu-macos-26 runner. It only fires on a preview:mac label, so it is inert by default.
  • chat-composer-horizontal-inset is referenced in ChatView.tsx but defined in no stylesheet. Pre-existing on both sides of the merge, not introduced here.

Checklist

  • Every conflict resolved by hand, combining both intents — no whole-file ours/theirs
  • Zero conflict markers, zero unmerged paths, no .bak/.orig residue
  • Fork-boundary audit for identity that merges without a conflict
  • Compatibility identifiers left upstream-shaped: T3_BOOT_SERVICE_UNIT, T3_SERVICE_LAUNCHER_CONTEXT, @t3tools/*, the t3 package/CLI name, com.t3tools.t3code.service, and the t3code:* storage keys Marcode has not deliberately migrated
  • Coupled vendored subtrees checked
  • CI green on the current head
  • UI screenshots — not applicable: no Marcode-authored UI change; the visual deltas are upstream's own

Verification

CI is green on b119e211 — all four required checks pass (Check, Test, Mobile Native Static Analysis, Release Smoke), plus Test Server 1/2/3, Rust, Mobile Native Changes, Native fingerprint diff and claude-review. No review threads open. Thread-transfer ceilings all within budget.

Two commits sit on top of the merge, each fixing one real CI failure. Both were root-caused, not re-run: the failure was reproduced locally first, then shown passing.

  • f38f3a83test(server): update the migration registry pin.
  • b119e211test(web): seed Marcode's theme key in the published-theme sync test.

Local checks alongside CI: focused tests across the touched scope, typecheck clean for contracts, shared, client-runtime, web, t3 (server), desktop and mobile, vp fmt --check clean over all changed files, and vp lint with zero errors across the touched directories.

One local-only failure, environmental: four tests in apps/server/src/cli/theme.test.ts fail in the sync container. They inject write/read failures with chmod 000 and chmod 555, and that container runs as root, which bypasses those mode bits — verified directly (root reads a 000 file and writes into a 555 directory). They are upstream-authored, untouched by this merge, and pass in CI, as the green Test Server jobs above confirm.

t3dotggand others added 30 commits August 24, 2026 12:42
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
…gg#7140)
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
juliusmarmingeand others added 22 commits August 31, 2026 17:42
Co-authored-by: Julius Marminge <julius@mac.lan>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
…pingdotgg#9024)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Theo Browne <me@t3.gg>
…g#8367)
Reuse one server config subscription for session bootstrap and live updates.
Preserve environment theme opt-in, replay, deletion, slow subscriber recovery, and config stream failure handling.
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
170 upstream commits (f035a0f..b883fc0), 45 conflicts resolved by hand.
Conflict decisions
------------------
Combined both intents (upstream fix + Marcode behavior):
- cloud/bootService.ts: keep Marcode's MARCODE_HOME plist key (the launcher's
resolveLauncherBaseDir reads it and exits without it) and take upstream's new
PATH export. Both are now pinned by separate tests.
- persistence/Migrations.ts: upstream's 042/043 renumbered to Marcode's 043/044.
Marcode's 033_ProjectWorkspaceLayout occupies 033, so every shared migration
sits one id higher; renumbering an applied id would re-run or skip it.
- ServerEnvironment / contracts environment.ts: keep both capability flags
(workspaceLayoutMutations, threadPullRequestLinking).
- ChatView.tsx: took upstream's ComposerSurface extraction (index.css no longer
carries the composer glass rules) and re-applied Marcode's transparency via
chat-composer-glass-shell-transparent, which still overrides --glass-opacity.
Also took pingdotgg#8160's move of the git PR picker from thread- to project-scope,
applied to the pill-nav cluster where Marcode renders that control.
- index.css: dropped upstream's retired .chat-composer-glass-*/-drawer-*/
-context-strip/-shoulder-tab rules, kept only Marcode's additions (composer
transparency, ambient chat background).
- OpenInPicker: dropped Marcode's inline file-manager label, now supplied by
upstream's editorLabelForPlatform; kept Marcode's filled icon.
- useHandleNewThread: Marcode's workspace placement plus upstream's project
default model resolution.
- app.config.ts / mobile package.json / authClientMetadata: Marcode's env var,
schemes, release icon and label; upstream's runtimeVersionPolicy, script set
and tablet/phone device detection.
- vite.config.ts: upstream's new no-mobile-uniwind-theme-escape-hatches rule
registered under Marcode's plugin namespace.
- Settings/KeybindingsSettings/PullRequestListFilters: took upstream's
refactors (searchableSetting, WarningTooltipIcon, BrowserKeybindingNotice,
the new filter control) and rebranded the copy at the shared producer.
Kept Marcode's surface, upstream change did not apply:
- ChatHeader.tsx / SidebarChrome.tsx: thread actions and sidebar chrome live in
FloatingPillNav. Upstream's pingdotgg#8168 back-button fix has no surface to land on;
noted at the seam.
- ThreadTerminalDrawer.tsx: Marcode keeps xterm. Upstream's pingdotgg#7488 URL-activation
fix is already covered by extractTerminalLinks' match.kind.
- components/files/: right-panel file surfaces stay retired. Upstream's new
fileTreeExpansion module only fed the deleted FileBrowserPanel.
Took upstream:
- threadSettled.test.ts deleted: its subject (effectiveSettled, canSettle,
changeRequestAutoSettles) moved server-side in pingdotgg#8600.
Fork-boundary breaks that merged without a conflict
---------------------------------------------------
- cli/theme.ts read T3CODE_HOME while every other Marcode CLI command reads
MARCODE_HOME, so `t3 theme` would have ignored the user's home and written to
the default install. Now reads MARCODE_HOME, with a test pinning the
precedence.
- connection/clientMetadata.ts hardcoded "T3 Code Desktop"/"T3 Code Web" as the
client's user-visible label. Rebranded; the test asserts it.
- Three oxlint suppressions arrived naming upstream's plugin namespace
(t3code/...), which is inert on Marcode, so no-global-process-runtime fired as
an error in preload.ts, verify-preload-bundle.mjs and externalLauncher.test.ts.
Repointed to marcode/.
- The new uniwind rule's test used the t3code/ rule id.
- Migration 043's test carried upstream's toMigrationInclusive bounds (41/42).
- ThreadSettlementReactor.test.ts's project fixture lacked Marcode's
workspaceLayoutVersion/workspaceLayout fields.
- projectCommands.test.ts (Marcode-only) missed subscribeServerConfig, added to
RpcSession by pingdotgg#8367.
- threadSidebarWidth.ts: upstream un-exported THREAD_SIDEBAR_DEFAULT_WIDTH when
it deleted the test; Marcode keeps that test, so the export is restored.
Removal pins
------------
- Kept threadSidebarWidth.test.ts and mobileBranding.test.ts, which upstream
pruned; both assert Marcode-specific behavior.
- Added apps/web/src/editor/retired-right-panel-file-surfaces.test.ts so a
future sync fails loudly when upstream re-adds the retired file panels.
Coupled subtrees: effect and infra/relay/package.json are unchanged, so neither
vendored subtree needs a sync.
Verification: focused tests across the touched scope, typecheck for contracts,
shared, client-runtime, web, server, desktop and mobile, plus fmt --check and
lint over the changed files and directories. Four chmod-based permission tests
in cli/theme.test.ts fail in this container because it runs as root, which
bypasses the mode bits they inject; they are upstream-authored and pass in CI.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TRQykYQJKmRh6UmTz2wy3a
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL labels Sep 1, 2026
@github-actionsgithub-actionsBot added the 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. label Sep 1, 2026
@github-actions

github-actionsBot commented Sep 1, 2026

Copy link
Copy Markdown

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.4 KiB13.1 KiB−314 B (−2.3%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB−2 B (−0.0%)7.3 KiB
CodexLive turn WebSocket wire6.5 KiB6.2 KiB−312 B (−4.7%)7.8 KiB
CodexLive turn WebSocket decoded55.0 KiB54.7 KiB−352 B (−0.6%)66.4 KiB
CodexLive turn messages168−8 (−50.0%)21
ClaudeTotal thread wire13.4 KiB13.3 KiB−182 B (−1.3%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB+10 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.5 KiB6.4 KiB−192 B (−2.9%)7.8 KiB
ClaudeLive turn WebSocket decoded55.8 KiB56.3 KiB+488 B (+0.9%)66.4 KiB
ClaudeLive turn messages168−8 (−50.0%)21

Baseline: 200e149 · PR result: b119e21 · 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: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

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

The registry pin in Migrations.test.ts did what it exists to do: adding
upstream's two new migrations as Marcode's 043/044 shifted its trailing
window and it failed loudly on CI (Test Server 2).
Records 043_ProjectionThreadLinkedPullRequest and
044_ProjectionThreadsUnsettledAt as the expected tail, and anchors the
assertion on migration 33 instead of a fixed `slice(-10)`. The trailing
window would slide off the Marcode-owned id once upstream adds enough
migrations, quietly dropping the pin this test exists to hold.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TRQykYQJKmRh6UmTz2wy3a
Upstream's new useEnvironmentThemeSync test (pingdotgg#8569) arrived with the
b883fc0 sync and seeds localStorage with `t3code:theme`. Marcode
deliberately renamed that key to `marcode:theme`, so the stored selection
was unreadable, no published theme ever drove the appearance, and all four
assertions resolved dark instead of light.
The merge produced no conflict here: useTheme.ts and the test come from
different sides, so nothing marked the seam. Seeds `marcode:theme` and says
why, matching the literal useTheme.test.ts and themeBoot.test.ts already
use. The test now also pins the key: a sync that reverts useTheme.ts to
upstream's name fails here instead of silently dropping every user's
stored theme.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TRQykYQJKmRh6UmTz2wy3a
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native ChangeChanges the native fingerprint; merging blocks production OTAs until a new store build ships.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@t3dotgg@tris203@flamboh@RakshithBhat03@StiensWout@lnieuwenhuis@MohtashamMurshid@SunkenInTime@luckyPipewrench@krutftw@colonelpanic8@gsimone@juliusmarminge@ipanasenko@ikifar2012@anirudhsama@none23@extoci@shivamhwp
, '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 b883fc06 - #68

Draft
maarco wants to merge 173 commits into
mainfrom
claude/gracious-bohr-gk75tw
Draft

chore(upstream): sync marcode through b883fc06#68
maarco wants to merge 173 commits into
mainfrom
claude/gracious-bohr-gk75tw

Conversation

@maarco

@maarcomaarco commented Sep 1, 2026

Copy link
Copy Markdown
Owner

What Changed

Merges pingdotgg/t3code@b883fc066ea5c9bebbe1c3e9b4bc2471aab3685f into main — 170 upstream commits over f035a0f4..b883fc06, 854 files. 45 conflicts, all resolved by hand. No whole-file ours/theirs, no force push, reset, restore, stash or clean.

Upstream SHAb883fc066ea5c9bebbe1c3e9b4bc2471aab3685f
Merge basef035a0f4cdf4abaa6704673af7b5a4a321149ba2
Target base200e1491 (origin/main)
Merge commitf1b2a407 (two parents)
Headb119e211CI green, mergeable

Conflicts — combined both intents

  • cloud/bootService.ts — keep Marcode's MARCODE_HOME plist key (the launcher's resolveLauncherBaseDir reads it and exits without it) and take upstream's new PATH export. Both now pinned by separate tests.
  • persistence/Migrations.ts — upstream's 042/043 renumbered to Marcode's 043/044. Marcode's 033_ProjectWorkspaceLayout occupies 033, so every shared migration sits one id higher; renumbering an applied id would re-run or skip it on existing installs.
  • ServerEnvironment / contracts/environment.ts — both capability flags (workspaceLayoutMutations, threadPullRequestLinking).
  • ChatView.tsx — took upstream's ComposerSurface extraction (they moved the composer glass out of index.css) and re-applied Marcode's transparency through chat-composer-glass-shell-transparent, which still overrides the --glass-opacity variable their Shell reads. Also took feat: link pull requests to threads pingdotgg/t3code#8160's move of the git PR picker from thread- to project-scope, applied to the pill-nav cluster where Marcode renders that control.
  • index.css — dropped upstream's retired .chat-composer-glass-* / -drawer-* / -context-strip / -shoulder-tab rules, kept only Marcode's own additions (composer transparency, ambient chat background).
  • OpenInPicker — dropped Marcode's inline file-manager label, now supplied by upstream's editorLabelForPlatform (identical output); kept Marcode's filled icon.
  • useHandleNewThread — Marcode's workspace placement plus upstream's project-default model resolution.
  • mobile app.config.ts / package.json / authClientMetadata — Marcode's env var, schemes, release icon and label; upstream's runtimeVersionPolicy, reworked script set and tablet/phone device detection.
  • vite.config.ts — upstream's new no-mobile-uniwind-theme-escape-hatches rule registered under Marcode's plugin namespace.
  • Settings / Keybindings / PullRequestListFilters — took upstream's refactors (searchableSetting, WarningTooltipIcon, BrowserKeybindingNotice, the new filter control) and rebranded the copy at the shared producer.

Conflicts — kept Marcode's surface

Conflicts — took upstream

Why

The dangerous part of a sync this size is not the conflicts — it is what merges cleanly and then quietly does not work on a fork. Nine such breaks were found and fixed. Seven were caught locally; the last two were caught by CI, and are called out as such.

BreakEffect if shipped
cli/theme.ts read T3CODE_HOMEt3 theme would ignore the user's Marcode home and write to the default install — every other Marcode CLI command reads MARCODE_HOME. Now pinned by a precedence test.
connection/clientMetadata.ts hardcoded "T3 Code Desktop" / "T3 Code Web"Wrong user-visible client label on every paired session. Rebranded; its test asserts it.
3 oxlint suppressions named upstream's t3code/ plugin namespaceInert on Marcode, so no-global-process-runtime fired as a lint error in preload.ts, verify-preload-bundle.mjs and externalLauncher.test.ts.
The new uniwind rule's test used the t3code/ rule idTest asserts against a rule that does not exist here.
Migration 043's test carried upstream's toMigrationInclusive bounds (41/42)Failed against Marcode's +1 numbering.
ThreadSettlementReactor.test.ts fixture lacked workspaceLayoutVersion / workspaceLayoutTypecheck failure — those are Marcode-only fields on OrchestrationProjectShell.
projectCommands.test.ts (Marcode-only) missed subscribeServerConfigTypecheck failure — RpcSession was widened by pingdotgg#8367.
(caught by CI)useEnvironmentThemeSync.test.ts seeded t3code:themeUpstream's brand-new test (pingdotgg#8569) uses their storage key; Marcode's is marcode:theme, so the stored selection was unreadable and no published theme drove the appearance — 4 assertions resolved dark instead of light. useTheme.ts and the new test came from opposite sides of the merge, so nothing marked the seam. Now also pins the key: a sync reverting it fails here instead of silently dropping every user's theme.
(caught by CI)Migrations.test.ts registry pinThe pin did its job — adding two migrations shifted its trailing window and it failed loudly. Updated, and re-anchored on migration 33 rather than slice(-10), which would slide off the Marcode-owned id as upstream keeps adding migrations.

Also restored the THREAD_SIDEBAR_DEFAULT_WIDTH export, which upstream un-exported when it deleted the test that used it — Marcode keeps that test.

Removal pins

Deletions are invisible to a merge, so upstream re-adds them silently every sync.

  • Kept threadSidebarWidth.test.ts and mobileBranding.test.ts, both pruned upstream, both asserting Marcode-specific behavior.
  • Added apps/web/src/editor/retired-right-panel-file-surfaces.test.ts so the next sync fails loudly when upstream re-adds the retired file panels. This sync is the worked example: upstream's expand/collapse-all control (feat(web): add expand/collapse all control to the files surface pingdotgg/t3code#8889) arrived as a brand-new module under a panel Marcode does not render, with no conflict.

Coupled subtrees

effect is unchanged in pnpm-workspace.yaml and infra/relay/package.json is byte-identical, so neither vendored subtree needs a sync. pnpm-workspace.yaml did move for Expo 56→57 and Clerk bumps; the lockfile was regenerated with pnpm (never hand-edited) and pnpm install --frozen-lockfile passes.

Notes for review

  • Pre-existing, deliberately not touched:apps/mobile/app.config.ts still uses "T3 Code" for appName and its iOS permission strings on main. Upstream added two more in that style (photo library, microphone) and they were left matching the file's existing convention rather than half-rebranding it. Worth a separate decision.
  • .github/workflows/desktop-macos-preview.yml is new from upstream and needs a blacksmith-12vcpu-macos-26 runner. It only fires on a preview:mac label, so it is inert by default.
  • chat-composer-horizontal-inset is referenced in ChatView.tsx but defined in no stylesheet. Pre-existing on both sides of the merge, not introduced here.

Checklist

  • Every conflict resolved by hand, combining both intents — no whole-file ours/theirs
  • Zero conflict markers, zero unmerged paths, no .bak/.orig residue
  • Fork-boundary audit for identity that merges without a conflict
  • Compatibility identifiers left upstream-shaped: T3_BOOT_SERVICE_UNIT, T3_SERVICE_LAUNCHER_CONTEXT, @t3tools/*, the t3 package/CLI name, com.t3tools.t3code.service, and the t3code:* storage keys Marcode has not deliberately migrated
  • Coupled vendored subtrees checked
  • CI green on the current head
  • UI screenshots — not applicable: no Marcode-authored UI change; the visual deltas are upstream's own

Verification

CI is green on b119e211 — all four required checks pass (Check, Test, Mobile Native Static Analysis, Release Smoke), plus Test Server 1/2/3, Rust, Mobile Native Changes, Native fingerprint diff and claude-review. No review threads open. Thread-transfer ceilings all within budget.

Two commits sit on top of the merge, each fixing one real CI failure. Both were root-caused, not re-run: the failure was reproduced locally first, then shown passing.

  • f38f3a83test(server): update the migration registry pin.
  • b119e211test(web): seed Marcode's theme key in the published-theme sync test.

Local checks alongside CI: focused tests across the touched scope, typecheck clean for contracts, shared, client-runtime, web, t3 (server), desktop and mobile, vp fmt --check clean over all changed files, and vp lint with zero errors across the touched directories.

One local-only failure, environmental: four tests in apps/server/src/cli/theme.test.ts fail in the sync container. They inject write/read failures with chmod 000 and chmod 555, and that container runs as root, which bypasses those mode bits — verified directly (root reads a 000 file and writes into a 555 directory). They are upstream-authored, untouched by this merge, and pass in CI, as the green Test Server jobs above confirm.

t3dotggand others added 30 commits August 24, 2026 12:42
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
…gg#7140)
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
juliusmarmingeand others added 22 commits August 31, 2026 17:42
Co-authored-by: Julius Marminge <julius@mac.lan>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
…pingdotgg#9024)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Theo Browne <me@t3.gg>
…g#8367)
Reuse one server config subscription for session bootstrap and live updates.
Preserve environment theme opt-in, replay, deletion, slow subscriber recovery, and config stream failure handling.
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
170 upstream commits (f035a0f..b883fc0), 45 conflicts resolved by hand.
Conflict decisions
------------------
Combined both intents (upstream fix + Marcode behavior):
- cloud/bootService.ts: keep Marcode's MARCODE_HOME plist key (the launcher's
resolveLauncherBaseDir reads it and exits without it) and take upstream's new
PATH export. Both are now pinned by separate tests.
- persistence/Migrations.ts: upstream's 042/043 renumbered to Marcode's 043/044.
Marcode's 033_ProjectWorkspaceLayout occupies 033, so every shared migration
sits one id higher; renumbering an applied id would re-run or skip it.
- ServerEnvironment / contracts environment.ts: keep both capability flags
(workspaceLayoutMutations, threadPullRequestLinking).
- ChatView.tsx: took upstream's ComposerSurface extraction (index.css no longer
carries the composer glass rules) and re-applied Marcode's transparency via
chat-composer-glass-shell-transparent, which still overrides --glass-opacity.
Also took pingdotgg#8160's move of the git PR picker from thread- to project-scope,
applied to the pill-nav cluster where Marcode renders that control.
- index.css: dropped upstream's retired .chat-composer-glass-*/-drawer-*/
-context-strip/-shoulder-tab rules, kept only Marcode's additions (composer
transparency, ambient chat background).
- OpenInPicker: dropped Marcode's inline file-manager label, now supplied by
upstream's editorLabelForPlatform; kept Marcode's filled icon.
- useHandleNewThread: Marcode's workspace placement plus upstream's project
default model resolution.
- app.config.ts / mobile package.json / authClientMetadata: Marcode's env var,
schemes, release icon and label; upstream's runtimeVersionPolicy, script set
and tablet/phone device detection.
- vite.config.ts: upstream's new no-mobile-uniwind-theme-escape-hatches rule
registered under Marcode's plugin namespace.
- Settings/KeybindingsSettings/PullRequestListFilters: took upstream's
refactors (searchableSetting, WarningTooltipIcon, BrowserKeybindingNotice,
the new filter control) and rebranded the copy at the shared producer.
Kept Marcode's surface, upstream change did not apply:
- ChatHeader.tsx / SidebarChrome.tsx: thread actions and sidebar chrome live in
FloatingPillNav. Upstream's pingdotgg#8168 back-button fix has no surface to land on;
noted at the seam.
- ThreadTerminalDrawer.tsx: Marcode keeps xterm. Upstream's pingdotgg#7488 URL-activation
fix is already covered by extractTerminalLinks' match.kind.
- components/files/: right-panel file surfaces stay retired. Upstream's new
fileTreeExpansion module only fed the deleted FileBrowserPanel.
Took upstream:
- threadSettled.test.ts deleted: its subject (effectiveSettled, canSettle,
changeRequestAutoSettles) moved server-side in pingdotgg#8600.
Fork-boundary breaks that merged without a conflict
---------------------------------------------------
- cli/theme.ts read T3CODE_HOME while every other Marcode CLI command reads
MARCODE_HOME, so `t3 theme` would have ignored the user's home and written to
the default install. Now reads MARCODE_HOME, with a test pinning the
precedence.
- connection/clientMetadata.ts hardcoded "T3 Code Desktop"/"T3 Code Web" as the
client's user-visible label. Rebranded; the test asserts it.
- Three oxlint suppressions arrived naming upstream's plugin namespace
(t3code/...), which is inert on Marcode, so no-global-process-runtime fired as
an error in preload.ts, verify-preload-bundle.mjs and externalLauncher.test.ts.
Repointed to marcode/.
- The new uniwind rule's test used the t3code/ rule id.
- Migration 043's test carried upstream's toMigrationInclusive bounds (41/42).
- ThreadSettlementReactor.test.ts's project fixture lacked Marcode's
workspaceLayoutVersion/workspaceLayout fields.
- projectCommands.test.ts (Marcode-only) missed subscribeServerConfig, added to
RpcSession by pingdotgg#8367.
- threadSidebarWidth.ts: upstream un-exported THREAD_SIDEBAR_DEFAULT_WIDTH when
it deleted the test; Marcode keeps that test, so the export is restored.
Removal pins
------------
- Kept threadSidebarWidth.test.ts and mobileBranding.test.ts, which upstream
pruned; both assert Marcode-specific behavior.
- Added apps/web/src/editor/retired-right-panel-file-surfaces.test.ts so a
future sync fails loudly when upstream re-adds the retired file panels.
Coupled subtrees: effect and infra/relay/package.json are unchanged, so neither
vendored subtree needs a sync.
Verification: focused tests across the touched scope, typecheck for contracts,
shared, client-runtime, web, server, desktop and mobile, plus fmt --check and
lint over the changed files and directories. Four chmod-based permission tests
in cli/theme.test.ts fail in this container because it runs as root, which
bypasses the mode bits they inject; they are upstream-authored and pass in CI.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TRQykYQJKmRh6UmTz2wy3a
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL labels Sep 1, 2026
@github-actionsgithub-actionsBot added the 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. label Sep 1, 2026
@github-actions

github-actionsBot commented Sep 1, 2026

Copy link
Copy Markdown

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.4 KiB13.1 KiB−314 B (−2.3%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB−2 B (−0.0%)7.3 KiB
CodexLive turn WebSocket wire6.5 KiB6.2 KiB−312 B (−4.7%)7.8 KiB
CodexLive turn WebSocket decoded55.0 KiB54.7 KiB−352 B (−0.6%)66.4 KiB
CodexLive turn messages168−8 (−50.0%)21
ClaudeTotal thread wire13.4 KiB13.3 KiB−182 B (−1.3%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB+10 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.5 KiB6.4 KiB−192 B (−2.9%)7.8 KiB
ClaudeLive turn WebSocket decoded55.8 KiB56.3 KiB+488 B (+0.9%)66.4 KiB
ClaudeLive turn messages168−8 (−50.0%)21

Baseline: 200e149 · PR result: b119e21 · 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: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

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

The registry pin in Migrations.test.ts did what it exists to do: adding
upstream's two new migrations as Marcode's 043/044 shifted its trailing
window and it failed loudly on CI (Test Server 2).
Records 043_ProjectionThreadLinkedPullRequest and
044_ProjectionThreadsUnsettledAt as the expected tail, and anchors the
assertion on migration 33 instead of a fixed `slice(-10)`. The trailing
window would slide off the Marcode-owned id once upstream adds enough
migrations, quietly dropping the pin this test exists to hold.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TRQykYQJKmRh6UmTz2wy3a
Upstream's new useEnvironmentThemeSync test (pingdotgg#8569) arrived with the
b883fc0 sync and seeds localStorage with `t3code:theme`. Marcode
deliberately renamed that key to `marcode:theme`, so the stored selection
was unreadable, no published theme ever drove the appearance, and all four
assertions resolved dark instead of light.
The merge produced no conflict here: useTheme.ts and the test come from
different sides, so nothing marked the seam. Seeds `marcode:theme` and says
why, matching the literal useTheme.test.ts and themeBoot.test.ts already
use. The test now also pins the key: a sync that reverts useTheme.ts to
upstream's name fails here instead of silently dropping every user's
stored theme.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TRQykYQJKmRh6UmTz2wy3a
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native ChangeChanges the native fingerprint; merging blocks production OTAs until a new store build ships.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@t3dotgg@tris203@flamboh@RakshithBhat03@StiensWout@lnieuwenhuis@MohtashamMurshid@SunkenInTime@luckyPipewrench@krutftw@colonelpanic8@gsimone@juliusmarminge@ipanasenko@ikifar2012@anirudhsama@none23@extoci@shivamhwp
, '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 b883fc06 - #68

Draft
maarco wants to merge 173 commits into
mainfrom
claude/gracious-bohr-gk75tw
Draft

chore(upstream): sync marcode through b883fc06#68
maarco wants to merge 173 commits into
mainfrom
claude/gracious-bohr-gk75tw

Conversation

@maarco

@maarcomaarco commented Sep 1, 2026

Copy link
Copy Markdown
Owner

What Changed

Merges pingdotgg/t3code@b883fc066ea5c9bebbe1c3e9b4bc2471aab3685f into main — 170 upstream commits over f035a0f4..b883fc06, 854 files. 45 conflicts, all resolved by hand. No whole-file ours/theirs, no force push, reset, restore, stash or clean.

Upstream SHAb883fc066ea5c9bebbe1c3e9b4bc2471aab3685f
Merge basef035a0f4cdf4abaa6704673af7b5a4a321149ba2
Target base200e1491 (origin/main)
Merge commitf1b2a407 (two parents)
Headb119e211CI green, mergeable

Conflicts — combined both intents

  • cloud/bootService.ts — keep Marcode's MARCODE_HOME plist key (the launcher's resolveLauncherBaseDir reads it and exits without it) and take upstream's new PATH export. Both now pinned by separate tests.
  • persistence/Migrations.ts — upstream's 042/043 renumbered to Marcode's 043/044. Marcode's 033_ProjectWorkspaceLayout occupies 033, so every shared migration sits one id higher; renumbering an applied id would re-run or skip it on existing installs.
  • ServerEnvironment / contracts/environment.ts — both capability flags (workspaceLayoutMutations, threadPullRequestLinking).
  • ChatView.tsx — took upstream's ComposerSurface extraction (they moved the composer glass out of index.css) and re-applied Marcode's transparency through chat-composer-glass-shell-transparent, which still overrides the --glass-opacity variable their Shell reads. Also took feat: link pull requests to threads pingdotgg/t3code#8160's move of the git PR picker from thread- to project-scope, applied to the pill-nav cluster where Marcode renders that control.
  • index.css — dropped upstream's retired .chat-composer-glass-* / -drawer-* / -context-strip / -shoulder-tab rules, kept only Marcode's own additions (composer transparency, ambient chat background).
  • OpenInPicker — dropped Marcode's inline file-manager label, now supplied by upstream's editorLabelForPlatform (identical output); kept Marcode's filled icon.
  • useHandleNewThread — Marcode's workspace placement plus upstream's project-default model resolution.
  • mobile app.config.ts / package.json / authClientMetadata — Marcode's env var, schemes, release icon and label; upstream's runtimeVersionPolicy, reworked script set and tablet/phone device detection.
  • vite.config.ts — upstream's new no-mobile-uniwind-theme-escape-hatches rule registered under Marcode's plugin namespace.
  • Settings / Keybindings / PullRequestListFilters — took upstream's refactors (searchableSetting, WarningTooltipIcon, BrowserKeybindingNotice, the new filter control) and rebranded the copy at the shared producer.

Conflicts — kept Marcode's surface

Conflicts — took upstream

Why

The dangerous part of a sync this size is not the conflicts — it is what merges cleanly and then quietly does not work on a fork. Nine such breaks were found and fixed. Seven were caught locally; the last two were caught by CI, and are called out as such.

BreakEffect if shipped
cli/theme.ts read T3CODE_HOMEt3 theme would ignore the user's Marcode home and write to the default install — every other Marcode CLI command reads MARCODE_HOME. Now pinned by a precedence test.
connection/clientMetadata.ts hardcoded "T3 Code Desktop" / "T3 Code Web"Wrong user-visible client label on every paired session. Rebranded; its test asserts it.
3 oxlint suppressions named upstream's t3code/ plugin namespaceInert on Marcode, so no-global-process-runtime fired as a lint error in preload.ts, verify-preload-bundle.mjs and externalLauncher.test.ts.
The new uniwind rule's test used the t3code/ rule idTest asserts against a rule that does not exist here.
Migration 043's test carried upstream's toMigrationInclusive bounds (41/42)Failed against Marcode's +1 numbering.
ThreadSettlementReactor.test.ts fixture lacked workspaceLayoutVersion / workspaceLayoutTypecheck failure — those are Marcode-only fields on OrchestrationProjectShell.
projectCommands.test.ts (Marcode-only) missed subscribeServerConfigTypecheck failure — RpcSession was widened by pingdotgg#8367.
(caught by CI)useEnvironmentThemeSync.test.ts seeded t3code:themeUpstream's brand-new test (pingdotgg#8569) uses their storage key; Marcode's is marcode:theme, so the stored selection was unreadable and no published theme drove the appearance — 4 assertions resolved dark instead of light. useTheme.ts and the new test came from opposite sides of the merge, so nothing marked the seam. Now also pins the key: a sync reverting it fails here instead of silently dropping every user's theme.
(caught by CI)Migrations.test.ts registry pinThe pin did its job — adding two migrations shifted its trailing window and it failed loudly. Updated, and re-anchored on migration 33 rather than slice(-10), which would slide off the Marcode-owned id as upstream keeps adding migrations.

Also restored the THREAD_SIDEBAR_DEFAULT_WIDTH export, which upstream un-exported when it deleted the test that used it — Marcode keeps that test.

Removal pins

Deletions are invisible to a merge, so upstream re-adds them silently every sync.

  • Kept threadSidebarWidth.test.ts and mobileBranding.test.ts, both pruned upstream, both asserting Marcode-specific behavior.
  • Added apps/web/src/editor/retired-right-panel-file-surfaces.test.ts so the next sync fails loudly when upstream re-adds the retired file panels. This sync is the worked example: upstream's expand/collapse-all control (feat(web): add expand/collapse all control to the files surface pingdotgg/t3code#8889) arrived as a brand-new module under a panel Marcode does not render, with no conflict.

Coupled subtrees

effect is unchanged in pnpm-workspace.yaml and infra/relay/package.json is byte-identical, so neither vendored subtree needs a sync. pnpm-workspace.yaml did move for Expo 56→57 and Clerk bumps; the lockfile was regenerated with pnpm (never hand-edited) and pnpm install --frozen-lockfile passes.

Notes for review

  • Pre-existing, deliberately not touched:apps/mobile/app.config.ts still uses "T3 Code" for appName and its iOS permission strings on main. Upstream added two more in that style (photo library, microphone) and they were left matching the file's existing convention rather than half-rebranding it. Worth a separate decision.
  • .github/workflows/desktop-macos-preview.yml is new from upstream and needs a blacksmith-12vcpu-macos-26 runner. It only fires on a preview:mac label, so it is inert by default.
  • chat-composer-horizontal-inset is referenced in ChatView.tsx but defined in no stylesheet. Pre-existing on both sides of the merge, not introduced here.

Checklist

  • Every conflict resolved by hand, combining both intents — no whole-file ours/theirs
  • Zero conflict markers, zero unmerged paths, no .bak/.orig residue
  • Fork-boundary audit for identity that merges without a conflict
  • Compatibility identifiers left upstream-shaped: T3_BOOT_SERVICE_UNIT, T3_SERVICE_LAUNCHER_CONTEXT, @t3tools/*, the t3 package/CLI name, com.t3tools.t3code.service, and the t3code:* storage keys Marcode has not deliberately migrated
  • Coupled vendored subtrees checked
  • CI green on the current head
  • UI screenshots — not applicable: no Marcode-authored UI change; the visual deltas are upstream's own

Verification

CI is green on b119e211 — all four required checks pass (Check, Test, Mobile Native Static Analysis, Release Smoke), plus Test Server 1/2/3, Rust, Mobile Native Changes, Native fingerprint diff and claude-review. No review threads open. Thread-transfer ceilings all within budget.

Two commits sit on top of the merge, each fixing one real CI failure. Both were root-caused, not re-run: the failure was reproduced locally first, then shown passing.

  • f38f3a83test(server): update the migration registry pin.
  • b119e211test(web): seed Marcode's theme key in the published-theme sync test.

Local checks alongside CI: focused tests across the touched scope, typecheck clean for contracts, shared, client-runtime, web, t3 (server), desktop and mobile, vp fmt --check clean over all changed files, and vp lint with zero errors across the touched directories.

One local-only failure, environmental: four tests in apps/server/src/cli/theme.test.ts fail in the sync container. They inject write/read failures with chmod 000 and chmod 555, and that container runs as root, which bypasses those mode bits — verified directly (root reads a 000 file and writes into a 555 directory). They are upstream-authored, untouched by this merge, and pass in CI, as the green Test Server jobs above confirm.

t3dotggand others added 30 commits August 24, 2026 12:42
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
…gg#7140)
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
juliusmarmingeand others added 22 commits August 31, 2026 17:42
Co-authored-by: Julius Marminge <julius@mac.lan>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
…pingdotgg#9024)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Theo Browne <me@t3.gg>
…g#8367)
Reuse one server config subscription for session bootstrap and live updates.
Preserve environment theme opt-in, replay, deletion, slow subscriber recovery, and config stream failure handling.
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
170 upstream commits (f035a0f..b883fc0), 45 conflicts resolved by hand.
Conflict decisions
------------------
Combined both intents (upstream fix + Marcode behavior):
- cloud/bootService.ts: keep Marcode's MARCODE_HOME plist key (the launcher's
resolveLauncherBaseDir reads it and exits without it) and take upstream's new
PATH export. Both are now pinned by separate tests.
- persistence/Migrations.ts: upstream's 042/043 renumbered to Marcode's 043/044.
Marcode's 033_ProjectWorkspaceLayout occupies 033, so every shared migration
sits one id higher; renumbering an applied id would re-run or skip it.
- ServerEnvironment / contracts environment.ts: keep both capability flags
(workspaceLayoutMutations, threadPullRequestLinking).
- ChatView.tsx: took upstream's ComposerSurface extraction (index.css no longer
carries the composer glass rules) and re-applied Marcode's transparency via
chat-composer-glass-shell-transparent, which still overrides --glass-opacity.
Also took pingdotgg#8160's move of the git PR picker from thread- to project-scope,
applied to the pill-nav cluster where Marcode renders that control.
- index.css: dropped upstream's retired .chat-composer-glass-*/-drawer-*/
-context-strip/-shoulder-tab rules, kept only Marcode's additions (composer
transparency, ambient chat background).
- OpenInPicker: dropped Marcode's inline file-manager label, now supplied by
upstream's editorLabelForPlatform; kept Marcode's filled icon.
- useHandleNewThread: Marcode's workspace placement plus upstream's project
default model resolution.
- app.config.ts / mobile package.json / authClientMetadata: Marcode's env var,
schemes, release icon and label; upstream's runtimeVersionPolicy, script set
and tablet/phone device detection.
- vite.config.ts: upstream's new no-mobile-uniwind-theme-escape-hatches rule
registered under Marcode's plugin namespace.
- Settings/KeybindingsSettings/PullRequestListFilters: took upstream's
refactors (searchableSetting, WarningTooltipIcon, BrowserKeybindingNotice,
the new filter control) and rebranded the copy at the shared producer.
Kept Marcode's surface, upstream change did not apply:
- ChatHeader.tsx / SidebarChrome.tsx: thread actions and sidebar chrome live in
FloatingPillNav. Upstream's pingdotgg#8168 back-button fix has no surface to land on;
noted at the seam.
- ThreadTerminalDrawer.tsx: Marcode keeps xterm. Upstream's pingdotgg#7488 URL-activation
fix is already covered by extractTerminalLinks' match.kind.
- components/files/: right-panel file surfaces stay retired. Upstream's new
fileTreeExpansion module only fed the deleted FileBrowserPanel.
Took upstream:
- threadSettled.test.ts deleted: its subject (effectiveSettled, canSettle,
changeRequestAutoSettles) moved server-side in pingdotgg#8600.
Fork-boundary breaks that merged without a conflict
---------------------------------------------------
- cli/theme.ts read T3CODE_HOME while every other Marcode CLI command reads
MARCODE_HOME, so `t3 theme` would have ignored the user's home and written to
the default install. Now reads MARCODE_HOME, with a test pinning the
precedence.
- connection/clientMetadata.ts hardcoded "T3 Code Desktop"/"T3 Code Web" as the
client's user-visible label. Rebranded; the test asserts it.
- Three oxlint suppressions arrived naming upstream's plugin namespace
(t3code/...), which is inert on Marcode, so no-global-process-runtime fired as
an error in preload.ts, verify-preload-bundle.mjs and externalLauncher.test.ts.
Repointed to marcode/.
- The new uniwind rule's test used the t3code/ rule id.
- Migration 043's test carried upstream's toMigrationInclusive bounds (41/42).
- ThreadSettlementReactor.test.ts's project fixture lacked Marcode's
workspaceLayoutVersion/workspaceLayout fields.
- projectCommands.test.ts (Marcode-only) missed subscribeServerConfig, added to
RpcSession by pingdotgg#8367.
- threadSidebarWidth.ts: upstream un-exported THREAD_SIDEBAR_DEFAULT_WIDTH when
it deleted the test; Marcode keeps that test, so the export is restored.
Removal pins
------------
- Kept threadSidebarWidth.test.ts and mobileBranding.test.ts, which upstream
pruned; both assert Marcode-specific behavior.
- Added apps/web/src/editor/retired-right-panel-file-surfaces.test.ts so a
future sync fails loudly when upstream re-adds the retired file panels.
Coupled subtrees: effect and infra/relay/package.json are unchanged, so neither
vendored subtree needs a sync.
Verification: focused tests across the touched scope, typecheck for contracts,
shared, client-runtime, web, server, desktop and mobile, plus fmt --check and
lint over the changed files and directories. Four chmod-based permission tests
in cli/theme.test.ts fail in this container because it runs as root, which
bypasses the mode bits they inject; they are upstream-authored and pass in CI.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TRQykYQJKmRh6UmTz2wy3a
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL labels Sep 1, 2026
@github-actionsgithub-actionsBot added the 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. label Sep 1, 2026
@github-actions

github-actionsBot commented Sep 1, 2026

Copy link
Copy Markdown

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.4 KiB13.1 KiB−314 B (−2.3%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB−2 B (−0.0%)7.3 KiB
CodexLive turn WebSocket wire6.5 KiB6.2 KiB−312 B (−4.7%)7.8 KiB
CodexLive turn WebSocket decoded55.0 KiB54.7 KiB−352 B (−0.6%)66.4 KiB
CodexLive turn messages168−8 (−50.0%)21
ClaudeTotal thread wire13.4 KiB13.3 KiB−182 B (−1.3%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB+10 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.5 KiB6.4 KiB−192 B (−2.9%)7.8 KiB
ClaudeLive turn WebSocket decoded55.8 KiB56.3 KiB+488 B (+0.9%)66.4 KiB
ClaudeLive turn messages168−8 (−50.0%)21

Baseline: 200e149 · PR result: b119e21 · 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: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

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

The registry pin in Migrations.test.ts did what it exists to do: adding
upstream's two new migrations as Marcode's 043/044 shifted its trailing
window and it failed loudly on CI (Test Server 2).
Records 043_ProjectionThreadLinkedPullRequest and
044_ProjectionThreadsUnsettledAt as the expected tail, and anchors the
assertion on migration 33 instead of a fixed `slice(-10)`. The trailing
window would slide off the Marcode-owned id once upstream adds enough
migrations, quietly dropping the pin this test exists to hold.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TRQykYQJKmRh6UmTz2wy3a
Upstream's new useEnvironmentThemeSync test (pingdotgg#8569) arrived with the
b883fc0 sync and seeds localStorage with `t3code:theme`. Marcode
deliberately renamed that key to `marcode:theme`, so the stored selection
was unreadable, no published theme ever drove the appearance, and all four
assertions resolved dark instead of light.
The merge produced no conflict here: useTheme.ts and the test come from
different sides, so nothing marked the seam. Seeds `marcode:theme` and says
why, matching the literal useTheme.test.ts and themeBoot.test.ts already
use. The test now also pins the key: a sync that reverts useTheme.ts to
upstream's name fails here instead of silently dropping every user's
stored theme.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TRQykYQJKmRh6UmTz2wy3a
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native ChangeChanges the native fingerprint; merging blocks production OTAs until a new store build ships.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@t3dotgg@tris203@flamboh@RakshithBhat03@StiensWout@lnieuwenhuis@MohtashamMurshid@SunkenInTime@luckyPipewrench@krutftw@colonelpanic8@gsimone@juliusmarminge@ipanasenko@ikifar2012@anirudhsama@none23@extoci@shivamhwp
, '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 b883fc06 - #68

Draft
maarco wants to merge 173 commits into
mainfrom
claude/gracious-bohr-gk75tw
Draft

chore(upstream): sync marcode through b883fc06#68
maarco wants to merge 173 commits into
mainfrom
claude/gracious-bohr-gk75tw

Conversation

@maarco

@maarcomaarco commented Sep 1, 2026

Copy link
Copy Markdown
Owner

What Changed

Merges pingdotgg/t3code@b883fc066ea5c9bebbe1c3e9b4bc2471aab3685f into main — 170 upstream commits over f035a0f4..b883fc06, 854 files. 45 conflicts, all resolved by hand. No whole-file ours/theirs, no force push, reset, restore, stash or clean.

Upstream SHAb883fc066ea5c9bebbe1c3e9b4bc2471aab3685f
Merge basef035a0f4cdf4abaa6704673af7b5a4a321149ba2
Target base200e1491 (origin/main)
Merge commitf1b2a407 (two parents)
Headb119e211CI green, mergeable

Conflicts — combined both intents

  • cloud/bootService.ts — keep Marcode's MARCODE_HOME plist key (the launcher's resolveLauncherBaseDir reads it and exits without it) and take upstream's new PATH export. Both now pinned by separate tests.
  • persistence/Migrations.ts — upstream's 042/043 renumbered to Marcode's 043/044. Marcode's 033_ProjectWorkspaceLayout occupies 033, so every shared migration sits one id higher; renumbering an applied id would re-run or skip it on existing installs.
  • ServerEnvironment / contracts/environment.ts — both capability flags (workspaceLayoutMutations, threadPullRequestLinking).
  • ChatView.tsx — took upstream's ComposerSurface extraction (they moved the composer glass out of index.css) and re-applied Marcode's transparency through chat-composer-glass-shell-transparent, which still overrides the --glass-opacity variable their Shell reads. Also took feat: link pull requests to threads pingdotgg/t3code#8160's move of the git PR picker from thread- to project-scope, applied to the pill-nav cluster where Marcode renders that control.
  • index.css — dropped upstream's retired .chat-composer-glass-* / -drawer-* / -context-strip / -shoulder-tab rules, kept only Marcode's own additions (composer transparency, ambient chat background).
  • OpenInPicker — dropped Marcode's inline file-manager label, now supplied by upstream's editorLabelForPlatform (identical output); kept Marcode's filled icon.
  • useHandleNewThread — Marcode's workspace placement plus upstream's project-default model resolution.
  • mobile app.config.ts / package.json / authClientMetadata — Marcode's env var, schemes, release icon and label; upstream's runtimeVersionPolicy, reworked script set and tablet/phone device detection.
  • vite.config.ts — upstream's new no-mobile-uniwind-theme-escape-hatches rule registered under Marcode's plugin namespace.
  • Settings / Keybindings / PullRequestListFilters — took upstream's refactors (searchableSetting, WarningTooltipIcon, BrowserKeybindingNotice, the new filter control) and rebranded the copy at the shared producer.

Conflicts — kept Marcode's surface

Conflicts — took upstream

Why

The dangerous part of a sync this size is not the conflicts — it is what merges cleanly and then quietly does not work on a fork. Nine such breaks were found and fixed. Seven were caught locally; the last two were caught by CI, and are called out as such.

BreakEffect if shipped
cli/theme.ts read T3CODE_HOMEt3 theme would ignore the user's Marcode home and write to the default install — every other Marcode CLI command reads MARCODE_HOME. Now pinned by a precedence test.
connection/clientMetadata.ts hardcoded "T3 Code Desktop" / "T3 Code Web"Wrong user-visible client label on every paired session. Rebranded; its test asserts it.
3 oxlint suppressions named upstream's t3code/ plugin namespaceInert on Marcode, so no-global-process-runtime fired as a lint error in preload.ts, verify-preload-bundle.mjs and externalLauncher.test.ts.
The new uniwind rule's test used the t3code/ rule idTest asserts against a rule that does not exist here.
Migration 043's test carried upstream's toMigrationInclusive bounds (41/42)Failed against Marcode's +1 numbering.
ThreadSettlementReactor.test.ts fixture lacked workspaceLayoutVersion / workspaceLayoutTypecheck failure — those are Marcode-only fields on OrchestrationProjectShell.
projectCommands.test.ts (Marcode-only) missed subscribeServerConfigTypecheck failure — RpcSession was widened by pingdotgg#8367.
(caught by CI)useEnvironmentThemeSync.test.ts seeded t3code:themeUpstream's brand-new test (pingdotgg#8569) uses their storage key; Marcode's is marcode:theme, so the stored selection was unreadable and no published theme drove the appearance — 4 assertions resolved dark instead of light. useTheme.ts and the new test came from opposite sides of the merge, so nothing marked the seam. Now also pins the key: a sync reverting it fails here instead of silently dropping every user's theme.
(caught by CI)Migrations.test.ts registry pinThe pin did its job — adding two migrations shifted its trailing window and it failed loudly. Updated, and re-anchored on migration 33 rather than slice(-10), which would slide off the Marcode-owned id as upstream keeps adding migrations.

Also restored the THREAD_SIDEBAR_DEFAULT_WIDTH export, which upstream un-exported when it deleted the test that used it — Marcode keeps that test.

Removal pins

Deletions are invisible to a merge, so upstream re-adds them silently every sync.

  • Kept threadSidebarWidth.test.ts and mobileBranding.test.ts, both pruned upstream, both asserting Marcode-specific behavior.
  • Added apps/web/src/editor/retired-right-panel-file-surfaces.test.ts so the next sync fails loudly when upstream re-adds the retired file panels. This sync is the worked example: upstream's expand/collapse-all control (feat(web): add expand/collapse all control to the files surface pingdotgg/t3code#8889) arrived as a brand-new module under a panel Marcode does not render, with no conflict.

Coupled subtrees

effect is unchanged in pnpm-workspace.yaml and infra/relay/package.json is byte-identical, so neither vendored subtree needs a sync. pnpm-workspace.yaml did move for Expo 56→57 and Clerk bumps; the lockfile was regenerated with pnpm (never hand-edited) and pnpm install --frozen-lockfile passes.

Notes for review

  • Pre-existing, deliberately not touched:apps/mobile/app.config.ts still uses "T3 Code" for appName and its iOS permission strings on main. Upstream added two more in that style (photo library, microphone) and they were left matching the file's existing convention rather than half-rebranding it. Worth a separate decision.
  • .github/workflows/desktop-macos-preview.yml is new from upstream and needs a blacksmith-12vcpu-macos-26 runner. It only fires on a preview:mac label, so it is inert by default.
  • chat-composer-horizontal-inset is referenced in ChatView.tsx but defined in no stylesheet. Pre-existing on both sides of the merge, not introduced here.

Checklist

  • Every conflict resolved by hand, combining both intents — no whole-file ours/theirs
  • Zero conflict markers, zero unmerged paths, no .bak/.orig residue
  • Fork-boundary audit for identity that merges without a conflict
  • Compatibility identifiers left upstream-shaped: T3_BOOT_SERVICE_UNIT, T3_SERVICE_LAUNCHER_CONTEXT, @t3tools/*, the t3 package/CLI name, com.t3tools.t3code.service, and the t3code:* storage keys Marcode has not deliberately migrated
  • Coupled vendored subtrees checked
  • CI green on the current head
  • UI screenshots — not applicable: no Marcode-authored UI change; the visual deltas are upstream's own

Verification

CI is green on b119e211 — all four required checks pass (Check, Test, Mobile Native Static Analysis, Release Smoke), plus Test Server 1/2/3, Rust, Mobile Native Changes, Native fingerprint diff and claude-review. No review threads open. Thread-transfer ceilings all within budget.

Two commits sit on top of the merge, each fixing one real CI failure. Both were root-caused, not re-run: the failure was reproduced locally first, then shown passing.

  • f38f3a83test(server): update the migration registry pin.
  • b119e211test(web): seed Marcode's theme key in the published-theme sync test.

Local checks alongside CI: focused tests across the touched scope, typecheck clean for contracts, shared, client-runtime, web, t3 (server), desktop and mobile, vp fmt --check clean over all changed files, and vp lint with zero errors across the touched directories.

One local-only failure, environmental: four tests in apps/server/src/cli/theme.test.ts fail in the sync container. They inject write/read failures with chmod 000 and chmod 555, and that container runs as root, which bypasses those mode bits — verified directly (root reads a 000 file and writes into a 555 directory). They are upstream-authored, untouched by this merge, and pass in CI, as the green Test Server jobs above confirm.

t3dotggand others added 30 commits August 24, 2026 12:42
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
…gg#7140)
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
juliusmarmingeand others added 22 commits August 31, 2026 17:42
Co-authored-by: Julius Marminge <julius@mac.lan>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
…pingdotgg#9024)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Theo Browne <me@t3.gg>
…g#8367)
Reuse one server config subscription for session bootstrap and live updates.
Preserve environment theme opt-in, replay, deletion, slow subscriber recovery, and config stream failure handling.
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
170 upstream commits (f035a0f..b883fc0), 45 conflicts resolved by hand.
Conflict decisions
------------------
Combined both intents (upstream fix + Marcode behavior):
- cloud/bootService.ts: keep Marcode's MARCODE_HOME plist key (the launcher's
resolveLauncherBaseDir reads it and exits without it) and take upstream's new
PATH export. Both are now pinned by separate tests.
- persistence/Migrations.ts: upstream's 042/043 renumbered to Marcode's 043/044.
Marcode's 033_ProjectWorkspaceLayout occupies 033, so every shared migration
sits one id higher; renumbering an applied id would re-run or skip it.
- ServerEnvironment / contracts environment.ts: keep both capability flags
(workspaceLayoutMutations, threadPullRequestLinking).
- ChatView.tsx: took upstream's ComposerSurface extraction (index.css no longer
carries the composer glass rules) and re-applied Marcode's transparency via
chat-composer-glass-shell-transparent, which still overrides --glass-opacity.
Also took pingdotgg#8160's move of the git PR picker from thread- to project-scope,
applied to the pill-nav cluster where Marcode renders that control.
- index.css: dropped upstream's retired .chat-composer-glass-*/-drawer-*/
-context-strip/-shoulder-tab rules, kept only Marcode's additions (composer
transparency, ambient chat background).
- OpenInPicker: dropped Marcode's inline file-manager label, now supplied by
upstream's editorLabelForPlatform; kept Marcode's filled icon.
- useHandleNewThread: Marcode's workspace placement plus upstream's project
default model resolution.
- app.config.ts / mobile package.json / authClientMetadata: Marcode's env var,
schemes, release icon and label; upstream's runtimeVersionPolicy, script set
and tablet/phone device detection.
- vite.config.ts: upstream's new no-mobile-uniwind-theme-escape-hatches rule
registered under Marcode's plugin namespace.
- Settings/KeybindingsSettings/PullRequestListFilters: took upstream's
refactors (searchableSetting, WarningTooltipIcon, BrowserKeybindingNotice,
the new filter control) and rebranded the copy at the shared producer.
Kept Marcode's surface, upstream change did not apply:
- ChatHeader.tsx / SidebarChrome.tsx: thread actions and sidebar chrome live in
FloatingPillNav. Upstream's pingdotgg#8168 back-button fix has no surface to land on;
noted at the seam.
- ThreadTerminalDrawer.tsx: Marcode keeps xterm. Upstream's pingdotgg#7488 URL-activation
fix is already covered by extractTerminalLinks' match.kind.
- components/files/: right-panel file surfaces stay retired. Upstream's new
fileTreeExpansion module only fed the deleted FileBrowserPanel.
Took upstream:
- threadSettled.test.ts deleted: its subject (effectiveSettled, canSettle,
changeRequestAutoSettles) moved server-side in pingdotgg#8600.
Fork-boundary breaks that merged without a conflict
---------------------------------------------------
- cli/theme.ts read T3CODE_HOME while every other Marcode CLI command reads
MARCODE_HOME, so `t3 theme` would have ignored the user's home and written to
the default install. Now reads MARCODE_HOME, with a test pinning the
precedence.
- connection/clientMetadata.ts hardcoded "T3 Code Desktop"/"T3 Code Web" as the
client's user-visible label. Rebranded; the test asserts it.
- Three oxlint suppressions arrived naming upstream's plugin namespace
(t3code/...), which is inert on Marcode, so no-global-process-runtime fired as
an error in preload.ts, verify-preload-bundle.mjs and externalLauncher.test.ts.
Repointed to marcode/.
- The new uniwind rule's test used the t3code/ rule id.
- Migration 043's test carried upstream's toMigrationInclusive bounds (41/42).
- ThreadSettlementReactor.test.ts's project fixture lacked Marcode's
workspaceLayoutVersion/workspaceLayout fields.
- projectCommands.test.ts (Marcode-only) missed subscribeServerConfig, added to
RpcSession by pingdotgg#8367.
- threadSidebarWidth.ts: upstream un-exported THREAD_SIDEBAR_DEFAULT_WIDTH when
it deleted the test; Marcode keeps that test, so the export is restored.
Removal pins
------------
- Kept threadSidebarWidth.test.ts and mobileBranding.test.ts, which upstream
pruned; both assert Marcode-specific behavior.
- Added apps/web/src/editor/retired-right-panel-file-surfaces.test.ts so a
future sync fails loudly when upstream re-adds the retired file panels.
Coupled subtrees: effect and infra/relay/package.json are unchanged, so neither
vendored subtree needs a sync.
Verification: focused tests across the touched scope, typecheck for contracts,
shared, client-runtime, web, server, desktop and mobile, plus fmt --check and
lint over the changed files and directories. Four chmod-based permission tests
in cli/theme.test.ts fail in this container because it runs as root, which
bypasses the mode bits they inject; they are upstream-authored and pass in CI.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TRQykYQJKmRh6UmTz2wy3a
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL labels Sep 1, 2026
@github-actionsgithub-actionsBot added the 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. label Sep 1, 2026
@github-actions

github-actionsBot commented Sep 1, 2026

Copy link
Copy Markdown

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.4 KiB13.1 KiB−314 B (−2.3%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB−2 B (−0.0%)7.3 KiB
CodexLive turn WebSocket wire6.5 KiB6.2 KiB−312 B (−4.7%)7.8 KiB
CodexLive turn WebSocket decoded55.0 KiB54.7 KiB−352 B (−0.6%)66.4 KiB
CodexLive turn messages168−8 (−50.0%)21
ClaudeTotal thread wire13.4 KiB13.3 KiB−182 B (−1.3%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB+10 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.5 KiB6.4 KiB−192 B (−2.9%)7.8 KiB
ClaudeLive turn WebSocket decoded55.8 KiB56.3 KiB+488 B (+0.9%)66.4 KiB
ClaudeLive turn messages168−8 (−50.0%)21

Baseline: 200e149 · PR result: b119e21 · 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: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

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

The registry pin in Migrations.test.ts did what it exists to do: adding
upstream's two new migrations as Marcode's 043/044 shifted its trailing
window and it failed loudly on CI (Test Server 2).
Records 043_ProjectionThreadLinkedPullRequest and
044_ProjectionThreadsUnsettledAt as the expected tail, and anchors the
assertion on migration 33 instead of a fixed `slice(-10)`. The trailing
window would slide off the Marcode-owned id once upstream adds enough
migrations, quietly dropping the pin this test exists to hold.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TRQykYQJKmRh6UmTz2wy3a
Upstream's new useEnvironmentThemeSync test (pingdotgg#8569) arrived with the
b883fc0 sync and seeds localStorage with `t3code:theme`. Marcode
deliberately renamed that key to `marcode:theme`, so the stored selection
was unreadable, no published theme ever drove the appearance, and all four
assertions resolved dark instead of light.
The merge produced no conflict here: useTheme.ts and the test come from
different sides, so nothing marked the seam. Seeds `marcode:theme` and says
why, matching the literal useTheme.test.ts and themeBoot.test.ts already
use. The test now also pins the key: a sync that reverts useTheme.ts to
upstream's name fails here instead of silently dropping every user's
stored theme.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TRQykYQJKmRh6UmTz2wy3a
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native ChangeChanges the native fingerprint; merging blocks production OTAs until a new store build ships.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@t3dotgg@tris203@flamboh@RakshithBhat03@StiensWout@lnieuwenhuis@MohtashamMurshid@SunkenInTime@luckyPipewrench@krutftw@colonelpanic8@gsimone@juliusmarminge@ipanasenko@ikifar2012@anirudhsama@none23@extoci@shivamhwp
, '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 b883fc06 - #68

Draft
maarco wants to merge 173 commits into
mainfrom
claude/gracious-bohr-gk75tw
Draft

chore(upstream): sync marcode through b883fc06#68
maarco wants to merge 173 commits into
mainfrom
claude/gracious-bohr-gk75tw

Conversation

@maarco

@maarcomaarco commented Sep 1, 2026

Copy link
Copy Markdown
Owner

What Changed

Merges pingdotgg/t3code@b883fc066ea5c9bebbe1c3e9b4bc2471aab3685f into main — 170 upstream commits over f035a0f4..b883fc06, 854 files. 45 conflicts, all resolved by hand. No whole-file ours/theirs, no force push, reset, restore, stash or clean.

Upstream SHAb883fc066ea5c9bebbe1c3e9b4bc2471aab3685f
Merge basef035a0f4cdf4abaa6704673af7b5a4a321149ba2
Target base200e1491 (origin/main)
Merge commitf1b2a407 (two parents)
Headb119e211CI green, mergeable

Conflicts — combined both intents

  • cloud/bootService.ts — keep Marcode's MARCODE_HOME plist key (the launcher's resolveLauncherBaseDir reads it and exits without it) and take upstream's new PATH export. Both now pinned by separate tests.
  • persistence/Migrations.ts — upstream's 042/043 renumbered to Marcode's 043/044. Marcode's 033_ProjectWorkspaceLayout occupies 033, so every shared migration sits one id higher; renumbering an applied id would re-run or skip it on existing installs.
  • ServerEnvironment / contracts/environment.ts — both capability flags (workspaceLayoutMutations, threadPullRequestLinking).
  • ChatView.tsx — took upstream's ComposerSurface extraction (they moved the composer glass out of index.css) and re-applied Marcode's transparency through chat-composer-glass-shell-transparent, which still overrides the --glass-opacity variable their Shell reads. Also took feat: link pull requests to threads pingdotgg/t3code#8160's move of the git PR picker from thread- to project-scope, applied to the pill-nav cluster where Marcode renders that control.
  • index.css — dropped upstream's retired .chat-composer-glass-* / -drawer-* / -context-strip / -shoulder-tab rules, kept only Marcode's own additions (composer transparency, ambient chat background).
  • OpenInPicker — dropped Marcode's inline file-manager label, now supplied by upstream's editorLabelForPlatform (identical output); kept Marcode's filled icon.
  • useHandleNewThread — Marcode's workspace placement plus upstream's project-default model resolution.
  • mobile app.config.ts / package.json / authClientMetadata — Marcode's env var, schemes, release icon and label; upstream's runtimeVersionPolicy, reworked script set and tablet/phone device detection.
  • vite.config.ts — upstream's new no-mobile-uniwind-theme-escape-hatches rule registered under Marcode's plugin namespace.
  • Settings / Keybindings / PullRequestListFilters — took upstream's refactors (searchableSetting, WarningTooltipIcon, BrowserKeybindingNotice, the new filter control) and rebranded the copy at the shared producer.

Conflicts — kept Marcode's surface

Conflicts — took upstream

Why

The dangerous part of a sync this size is not the conflicts — it is what merges cleanly and then quietly does not work on a fork. Nine such breaks were found and fixed. Seven were caught locally; the last two were caught by CI, and are called out as such.

BreakEffect if shipped
cli/theme.ts read T3CODE_HOMEt3 theme would ignore the user's Marcode home and write to the default install — every other Marcode CLI command reads MARCODE_HOME. Now pinned by a precedence test.
connection/clientMetadata.ts hardcoded "T3 Code Desktop" / "T3 Code Web"Wrong user-visible client label on every paired session. Rebranded; its test asserts it.
3 oxlint suppressions named upstream's t3code/ plugin namespaceInert on Marcode, so no-global-process-runtime fired as a lint error in preload.ts, verify-preload-bundle.mjs and externalLauncher.test.ts.
The new uniwind rule's test used the t3code/ rule idTest asserts against a rule that does not exist here.
Migration 043's test carried upstream's toMigrationInclusive bounds (41/42)Failed against Marcode's +1 numbering.
ThreadSettlementReactor.test.ts fixture lacked workspaceLayoutVersion / workspaceLayoutTypecheck failure — those are Marcode-only fields on OrchestrationProjectShell.
projectCommands.test.ts (Marcode-only) missed subscribeServerConfigTypecheck failure — RpcSession was widened by pingdotgg#8367.
(caught by CI)useEnvironmentThemeSync.test.ts seeded t3code:themeUpstream's brand-new test (pingdotgg#8569) uses their storage key; Marcode's is marcode:theme, so the stored selection was unreadable and no published theme drove the appearance — 4 assertions resolved dark instead of light. useTheme.ts and the new test came from opposite sides of the merge, so nothing marked the seam. Now also pins the key: a sync reverting it fails here instead of silently dropping every user's theme.
(caught by CI)Migrations.test.ts registry pinThe pin did its job — adding two migrations shifted its trailing window and it failed loudly. Updated, and re-anchored on migration 33 rather than slice(-10), which would slide off the Marcode-owned id as upstream keeps adding migrations.

Also restored the THREAD_SIDEBAR_DEFAULT_WIDTH export, which upstream un-exported when it deleted the test that used it — Marcode keeps that test.

Removal pins

Deletions are invisible to a merge, so upstream re-adds them silently every sync.

  • Kept threadSidebarWidth.test.ts and mobileBranding.test.ts, both pruned upstream, both asserting Marcode-specific behavior.
  • Added apps/web/src/editor/retired-right-panel-file-surfaces.test.ts so the next sync fails loudly when upstream re-adds the retired file panels. This sync is the worked example: upstream's expand/collapse-all control (feat(web): add expand/collapse all control to the files surface pingdotgg/t3code#8889) arrived as a brand-new module under a panel Marcode does not render, with no conflict.

Coupled subtrees

effect is unchanged in pnpm-workspace.yaml and infra/relay/package.json is byte-identical, so neither vendored subtree needs a sync. pnpm-workspace.yaml did move for Expo 56→57 and Clerk bumps; the lockfile was regenerated with pnpm (never hand-edited) and pnpm install --frozen-lockfile passes.

Notes for review

  • Pre-existing, deliberately not touched:apps/mobile/app.config.ts still uses "T3 Code" for appName and its iOS permission strings on main. Upstream added two more in that style (photo library, microphone) and they were left matching the file's existing convention rather than half-rebranding it. Worth a separate decision.
  • .github/workflows/desktop-macos-preview.yml is new from upstream and needs a blacksmith-12vcpu-macos-26 runner. It only fires on a preview:mac label, so it is inert by default.
  • chat-composer-horizontal-inset is referenced in ChatView.tsx but defined in no stylesheet. Pre-existing on both sides of the merge, not introduced here.

Checklist

  • Every conflict resolved by hand, combining both intents — no whole-file ours/theirs
  • Zero conflict markers, zero unmerged paths, no .bak/.orig residue
  • Fork-boundary audit for identity that merges without a conflict
  • Compatibility identifiers left upstream-shaped: T3_BOOT_SERVICE_UNIT, T3_SERVICE_LAUNCHER_CONTEXT, @t3tools/*, the t3 package/CLI name, com.t3tools.t3code.service, and the t3code:* storage keys Marcode has not deliberately migrated
  • Coupled vendored subtrees checked
  • CI green on the current head
  • UI screenshots — not applicable: no Marcode-authored UI change; the visual deltas are upstream's own

Verification

CI is green on b119e211 — all four required checks pass (Check, Test, Mobile Native Static Analysis, Release Smoke), plus Test Server 1/2/3, Rust, Mobile Native Changes, Native fingerprint diff and claude-review. No review threads open. Thread-transfer ceilings all within budget.

Two commits sit on top of the merge, each fixing one real CI failure. Both were root-caused, not re-run: the failure was reproduced locally first, then shown passing.

  • f38f3a83test(server): update the migration registry pin.
  • b119e211test(web): seed Marcode's theme key in the published-theme sync test.

Local checks alongside CI: focused tests across the touched scope, typecheck clean for contracts, shared, client-runtime, web, t3 (server), desktop and mobile, vp fmt --check clean over all changed files, and vp lint with zero errors across the touched directories.

One local-only failure, environmental: four tests in apps/server/src/cli/theme.test.ts fail in the sync container. They inject write/read failures with chmod 000 and chmod 555, and that container runs as root, which bypasses those mode bits — verified directly (root reads a 000 file and writes into a 555 directory). They are upstream-authored, untouched by this merge, and pass in CI, as the green Test Server jobs above confirm.

t3dotggand others added 30 commits August 24, 2026 12:42
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
…gg#7140)
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
juliusmarmingeand others added 22 commits August 31, 2026 17:42
Co-authored-by: Julius Marminge <julius@mac.lan>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
…pingdotgg#9024)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Theo Browne <me@t3.gg>
…g#8367)
Reuse one server config subscription for session bootstrap and live updates.
Preserve environment theme opt-in, replay, deletion, slow subscriber recovery, and config stream failure handling.
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
170 upstream commits (f035a0f..b883fc0), 45 conflicts resolved by hand.
Conflict decisions
------------------
Combined both intents (upstream fix + Marcode behavior):
- cloud/bootService.ts: keep Marcode's MARCODE_HOME plist key (the launcher's
resolveLauncherBaseDir reads it and exits without it) and take upstream's new
PATH export. Both are now pinned by separate tests.
- persistence/Migrations.ts: upstream's 042/043 renumbered to Marcode's 043/044.
Marcode's 033_ProjectWorkspaceLayout occupies 033, so every shared migration
sits one id higher; renumbering an applied id would re-run or skip it.
- ServerEnvironment / contracts environment.ts: keep both capability flags
(workspaceLayoutMutations, threadPullRequestLinking).
- ChatView.tsx: took upstream's ComposerSurface extraction (index.css no longer
carries the composer glass rules) and re-applied Marcode's transparency via
chat-composer-glass-shell-transparent, which still overrides --glass-opacity.
Also took pingdotgg#8160's move of the git PR picker from thread- to project-scope,
applied to the pill-nav cluster where Marcode renders that control.
- index.css: dropped upstream's retired .chat-composer-glass-*/-drawer-*/
-context-strip/-shoulder-tab rules, kept only Marcode's additions (composer
transparency, ambient chat background).
- OpenInPicker: dropped Marcode's inline file-manager label, now supplied by
upstream's editorLabelForPlatform; kept Marcode's filled icon.
- useHandleNewThread: Marcode's workspace placement plus upstream's project
default model resolution.
- app.config.ts / mobile package.json / authClientMetadata: Marcode's env var,
schemes, release icon and label; upstream's runtimeVersionPolicy, script set
and tablet/phone device detection.
- vite.config.ts: upstream's new no-mobile-uniwind-theme-escape-hatches rule
registered under Marcode's plugin namespace.
- Settings/KeybindingsSettings/PullRequestListFilters: took upstream's
refactors (searchableSetting, WarningTooltipIcon, BrowserKeybindingNotice,
the new filter control) and rebranded the copy at the shared producer.
Kept Marcode's surface, upstream change did not apply:
- ChatHeader.tsx / SidebarChrome.tsx: thread actions and sidebar chrome live in
FloatingPillNav. Upstream's pingdotgg#8168 back-button fix has no surface to land on;
noted at the seam.
- ThreadTerminalDrawer.tsx: Marcode keeps xterm. Upstream's pingdotgg#7488 URL-activation
fix is already covered by extractTerminalLinks' match.kind.
- components/files/: right-panel file surfaces stay retired. Upstream's new
fileTreeExpansion module only fed the deleted FileBrowserPanel.
Took upstream:
- threadSettled.test.ts deleted: its subject (effectiveSettled, canSettle,
changeRequestAutoSettles) moved server-side in pingdotgg#8600.
Fork-boundary breaks that merged without a conflict
---------------------------------------------------
- cli/theme.ts read T3CODE_HOME while every other Marcode CLI command reads
MARCODE_HOME, so `t3 theme` would have ignored the user's home and written to
the default install. Now reads MARCODE_HOME, with a test pinning the
precedence.
- connection/clientMetadata.ts hardcoded "T3 Code Desktop"/"T3 Code Web" as the
client's user-visible label. Rebranded; the test asserts it.
- Three oxlint suppressions arrived naming upstream's plugin namespace
(t3code/...), which is inert on Marcode, so no-global-process-runtime fired as
an error in preload.ts, verify-preload-bundle.mjs and externalLauncher.test.ts.
Repointed to marcode/.
- The new uniwind rule's test used the t3code/ rule id.
- Migration 043's test carried upstream's toMigrationInclusive bounds (41/42).
- ThreadSettlementReactor.test.ts's project fixture lacked Marcode's
workspaceLayoutVersion/workspaceLayout fields.
- projectCommands.test.ts (Marcode-only) missed subscribeServerConfig, added to
RpcSession by pingdotgg#8367.
- threadSidebarWidth.ts: upstream un-exported THREAD_SIDEBAR_DEFAULT_WIDTH when
it deleted the test; Marcode keeps that test, so the export is restored.
Removal pins
------------
- Kept threadSidebarWidth.test.ts and mobileBranding.test.ts, which upstream
pruned; both assert Marcode-specific behavior.
- Added apps/web/src/editor/retired-right-panel-file-surfaces.test.ts so a
future sync fails loudly when upstream re-adds the retired file panels.
Coupled subtrees: effect and infra/relay/package.json are unchanged, so neither
vendored subtree needs a sync.
Verification: focused tests across the touched scope, typecheck for contracts,
shared, client-runtime, web, server, desktop and mobile, plus fmt --check and
lint over the changed files and directories. Four chmod-based permission tests
in cli/theme.test.ts fail in this container because it runs as root, which
bypasses the mode bits they inject; they are upstream-authored and pass in CI.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TRQykYQJKmRh6UmTz2wy3a
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL labels Sep 1, 2026
@github-actionsgithub-actionsBot added the 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. label Sep 1, 2026
@github-actions

github-actionsBot commented Sep 1, 2026

Copy link
Copy Markdown

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.4 KiB13.1 KiB−314 B (−2.3%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB−2 B (−0.0%)7.3 KiB
CodexLive turn WebSocket wire6.5 KiB6.2 KiB−312 B (−4.7%)7.8 KiB
CodexLive turn WebSocket decoded55.0 KiB54.7 KiB−352 B (−0.6%)66.4 KiB
CodexLive turn messages168−8 (−50.0%)21
ClaudeTotal thread wire13.4 KiB13.3 KiB−182 B (−1.3%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB+10 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.5 KiB6.4 KiB−192 B (−2.9%)7.8 KiB
ClaudeLive turn WebSocket decoded55.8 KiB56.3 KiB+488 B (+0.9%)66.4 KiB
ClaudeLive turn messages168−8 (−50.0%)21

Baseline: 200e149 · PR result: b119e21 · 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: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

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

The registry pin in Migrations.test.ts did what it exists to do: adding
upstream's two new migrations as Marcode's 043/044 shifted its trailing
window and it failed loudly on CI (Test Server 2).
Records 043_ProjectionThreadLinkedPullRequest and
044_ProjectionThreadsUnsettledAt as the expected tail, and anchors the
assertion on migration 33 instead of a fixed `slice(-10)`. The trailing
window would slide off the Marcode-owned id once upstream adds enough
migrations, quietly dropping the pin this test exists to hold.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TRQykYQJKmRh6UmTz2wy3a
Upstream's new useEnvironmentThemeSync test (pingdotgg#8569) arrived with the
b883fc0 sync and seeds localStorage with `t3code:theme`. Marcode
deliberately renamed that key to `marcode:theme`, so the stored selection
was unreadable, no published theme ever drove the appearance, and all four
assertions resolved dark instead of light.
The merge produced no conflict here: useTheme.ts and the test come from
different sides, so nothing marked the seam. Seeds `marcode:theme` and says
why, matching the literal useTheme.test.ts and themeBoot.test.ts already
use. The test now also pins the key: a sync that reverts useTheme.ts to
upstream's name fails here instead of silently dropping every user's
stored theme.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TRQykYQJKmRh6UmTz2wy3a
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native ChangeChanges the native fingerprint; merging blocks production OTAs until a new store build ships.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@t3dotgg@tris203@flamboh@RakshithBhat03@StiensWout@lnieuwenhuis@MohtashamMurshid@SunkenInTime@luckyPipewrench@krutftw@colonelpanic8@gsimone@juliusmarminge@ipanasenko@ikifar2012@anirudhsama@none23@extoci@shivamhwp