chore(upstream): hand off blocked sync through t3code@ba9c9ae81dce - #17
Closed
maarco wants to merge 3 commits into
Closed
chore(upstream): hand off blocked sync through t3code@ba9c9ae81dce#17maarco wants to merge 3 commits into
maarco wants to merge 3 commits into
Conversation
The scheduled sync has been failing since Aug 3 (issues #10-#15): `main` never advanced past the last successful merge, so every run re-plans the same growing delta. Eight days of drift accumulated - 140 upstream commits, 41 conflicted files, ~150 hunks. Resolved and verified 27 of the 41 conflicted files plus 16 more files carrying silent fork-boundary breaks, then stopped. Upstream promoted sidebar v2 to the default and deleted the v1/v2 split, which collides head-on with Marcode's unified workspace tree; the settings contract now carries both `legacySidebarEnabled` and `unifiedWorkspaceSidebar` as overlapping opt-out axes. Reconciling them is a product decision, taking either side wholesale is forbidden by AGENTS.md and the runbook, and the runbook requires driving the real UI at 390px/820px before trusting any resolution there - which a headless container cannot do. This commit carries no source changes. It adds the blocker writeup and a conflict-marker-free patch of every resolution already made and verified, so the merge can be resumed without redoing that work. Verified before stopping: contracts, client-runtime, and server typecheck clean; 44 focused server tests and 18 client-runtime pagination/grouping tests pass. Highlights captured in the writeup: nine silent fork-boundary breaks that merged without conflict (theme boot storage key, appearance font mirror, bundled-dev env var, two desktop home-dir paths, `t3 pair` home lookup, migrate-dev-db source db, boot-service unit name, and a mis-aligned projector hunk that would have dropped two upstream fields), plus the migration renumbering needed because Marcode owns id 33. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HR4z1PYYsw3DHuWoqSWL46
`vp check` flagged markdown table alignment in the handoff README. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HR4z1PYYsw3DHuWoqSWL46
The resolutions.patch this branch first carried did not apply. It was a HEAD-relative diff, and `git apply --3way` cannot target the unmerged index a conflicted merge leaves behind: every conflicted path failed with "does not exist in index", and files new from upstream collided the other way with "already exists in index". Testing the recipe caught it. Replaced with the final content of all 48 hand-resolved files as a tarball plus their path list. Verified end to end in a scratch worktree: reproduce the merge (41 conflicts), unpack, drop the retired FilePreviewPanel and upstream's pre-renumbering migration filenames, stage, and exactly the 14 web files needing the sidebar decision remain. Every unpacked file is byte-identical to the tree the typechecks and 62 passing tests were run against. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HR4z1PYYsw3DHuWoqSWL46
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains no source changes and must not be merged as-is. It carries a blocker writeup and a verified resume artifact, so the sync can continue without redoing work already done.
The scheduled sync has been failing since Aug 3 — issues #10, #11, #12, #13, #14, #15 are all the same blockage.
mainnever advanced past the last successful merge (5192f777f), so every daily run re-plans the same growing delta from the same merge base. Eight days of drift accumulated: 140 upstream commits, 41 conflicted files, ~150 hunks.ba9c9ae81dce4e554b4dd52abfd28d0c01b5c651main5192f777fe54c2a2a359f6c25ecf5fbde46d49b0d0c01668c0f87b10bf952f929c55c7a8ca818fdfPR #9 (bot sync through
e60821f0e0d8) is a strict subset of this delta and should be closed in favour of whatever lands from this work.Why it's blocked
Upstream
0de95407 feat: sidebar v2 is now the default sidebarrestructured the whole sidebar: oldSidebar.tsx→LegacySidebar.tsx,SidebarV2.tsx→Sidebar.tsx, and thesidebarV2Enabledopt-in flipped to alegacySidebarEnabledopt-out.Marcode's
Sidebar.tsxis the unified workspace tree — a documented product contract and a manifest hotspot. Git therefore aligns Marcode's ~8,000-line sidebar against upstream's newly-promoted v2. Sidebar.tsx alone has ~5,100 lines inside conflict regions, including one hunk of 921 Marcode lines vs 2 upstream lines and another of 39 vs 527.The settings contract now cleanly merges to carry both
legacySidebarEnabled(upstream, defaultfalse) andunifiedWorkspaceSidebar(Marcode, defaulttrue) — two overlapping "which sidebar do I get" axes — while Marcode'suseSidebarV2Enabledhook is gone. Deciding what those mean together is a product decision. Taking either side wholesale is forbidden byAGENTS.mdand the runbook, and the runbook requires driving the real UI at 390px/820px before trusting a resolution here, which a headless container cannot do. So it stops rather than guessing.14 files need your decision —
Sidebar.tsx(18 hunks),RightPanelTabs.tsx(12),ChatView.tsx(10),ProjectScriptsControl.tsx(9),ThreadTerminalDrawer.tsx(7),index.css(7),rightPanelStore.ts(6),ChatHeader.tsx(5),AppSidebarLayout.tsx(5),SidebarChrome.tsx(3),mobile-showcase-environment.ts(3), plusrightPanelStore.test.ts,useHandleNewThread.ts,SettingsPanels.tsx(1 each).What's resolved and verified
48 files hand-resolved — the other 27 conflicted files plus 16 carrying silent fork-boundary breaks and the renumbered migrations.
vp run --filter @t3tools/contracts typecheck— cleanvp run --filter @t3tools/client-runtime typecheck— cleanvp run --filter t3 typecheck— cleanNo UI verification was performed. The web package cannot typecheck while the 14 files above still hold markers.
Silent fork-boundary breaks found (merged clean, NO conflict)
The dangerous class — each would have shipped a quietly broken Marcode:
localStorage["t3code:theme"]; Marcode renamed it to"marcode:theme". Every load would flash the wrong theme.appearanceFonts.tsdidn't mirror Marcode's fonts — it documents its stacks as mirroringindex.cssand shows the resolved family to users; upstream's are system fonts, Marcode's are Inter/JetBrains.--sharebundled-dev speedup inert — dev-runner setsT3CODE_BUNDLED_DEV, Marcode's vite config readsMARCODE_BUNDLED_DEV.DesktopEarlyElectronStartup.tsreadT3CODE_HOMEwhile every Marcode writer setsMARCODE_HOME.DesktopStatePaths.tsdefaulted to~/.t3instead of~/.marcode, feeding both the early-startup path andDesktopEnvironment.t3 pairreadT3CODE_HOME— the documented pairing-token recovery command.migrate-dev-dbscript imported the pre-renameresolveWorktreeT3Home(didn't compile) and defaulted its source db to~/.t3/userdata/state.sqlite, which doesn't exist here.t3code.service; Marcode's unit ismarcode.service.projector.tshunks mis-aligned — upstream's newdefaultThreadEnvMode/faviconPathwere aligned against Marcode's differentproject.workspace-layout-appliedhandler, so either side alone would have silently dropped them from the project-updated path.Migration renumbering (correctness-critical)
Marcode owns id 33 =
ProjectWorkspaceLayout, so shared migrations sit one higher. Upstream's new 36–40 collided with Marcode's 36 and were shifted to 37–41 (filesgit mvd, registry + test label updated). Renumbering an applied id would re-run or skip it on existing installs.Other decisions worth a look
http.ts— took upstream'sHttpMiddleware.compression()refactor, kept Marcode'smarcode://apporigins (Marcode really registers that scheme, so CORS must carry it).bootService.test.ts— upstream's headline fix this sync isKillMode=mixed+OOMPolicy=continue. Kept Marcode's identity test and added upstream's new OOM test.T3_BOOT_SERVICE_UNITstays upstream-shaped.threadSnapshotHttp.ts/threads.ts— both sides changed the same signature (Marcode's three-statefound|missing|unavailableresult vs upstream's paginationwindow). Combined, adapted upstream'sloadOlderTurnscall site and test harness; upstream's 18 pagination tests pass.tooltip.tsx— upstream bumpedz-50→z-70so tooltips overlay popovers/menus, but Marcode routes z through the inlinefloating-surface-zscale where a class is inert. Preserved the intent by addingportalOverlayTooltip: 13150. This touches Marcode's floating-surface z contract..env.example— took upstream's now-default production Connect config, renamedT3CODE_*→MARCODE_*to match consumers.FilePreviewPanel.tsx— modify/delete; Marcode's deletion stands (retired surface, no importers).pnpm-lock.yamlregenerated viapnpm install. No coupled vendored subtree sync was needed.Resuming
resolved-files.tar.gzholds the final content of all 48 hand-resolved files. Unpacking it over a freshly reproduced merge takes the conflict count from 41 down to exactly the 14 above.This was verified end-to-end in a scratch worktree — the resulting tree is byte-identical to the state the typechecks and 62 passing tests ran against. (An earlier
resolutions.patchon this branch did not apply: a HEAD-relative diff cannot target the unmerged index a conflicted merge leaves behind. Testing the recipe caught it; it has been replaced.)Full recipe and writeup:
docs/operations/upstream-sync-handoffs/ba9c9ae81dce/README.md