Repository navigation
chore(sync): absorb upstream main through 1604ccc9d (orchestrator V2) - #167
Conversation
Co-authored-by: maria-rcks <maria@kuuro.net> Co-authored-by: Bilal Bakr <62337003+Bil0000@users.noreply.github.com> Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com> Co-authored-by: Vitalii Yehorov <vitalyiegorov@gmail.com> Co-authored-by: Jake Leventhal <jakeleventhal@me.com> Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com> Co-authored-by: Alex Southwell <saphid@gmail.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Nicholas Wasmiller <derped@mineperial.com> Co-authored-by: PB <poilmb@gmail.com> Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com> Co-authored-by: Yash Singh <saiansh2525@gmail.com> Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: Theo Browne <me@t3.gg> Co-authored-by: Gabriel De Andrade <30420087+gabrielelpidio@users.noreply.github.com> Co-authored-by: Dara Adedeji <76637177+SunkenInTime@users.noreply.github.com> Co-authored-by: scratchyone <scratchywon@gmail.com> Co-authored-by: Dominic Roy <dominic@sdko.org> Co-authored-by: chukfinley <chuk@chuk.dev> Co-authored-by: Primož Ajdišek <bigpod@bigpod.si> Co-authored-by: benthecarman <benthecarman@live.com> Co-authored-by: NaveDanan <nave0712@gmail.com> Co-authored-by: aaditagrawal <103925638+aaditagrawal@users.noreply.github.com> Co-authored-by: Aditya Garud <153842990+yashranaway@users.noreply.github.com> Co-authored-by: Nick Anisimov <n.anisimov.23@gmail.com> Co-authored-by: MacKinley Smith <smithmackinley@gmail.com> Co-authored-by: Yordis Prieto <yordis.prieto@gmail.com> Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com> Co-authored-by: AKolenda <akole779@mtroyal.ca> Co-authored-by: Guillermo Casanova <75276669+Gigioxx@users.noreply.github.com> Co-authored-by: Otavio Salvador <otavio@ossystems.com.br> Co-authored-by: Shirish Pothi <183252392+shirishpothi@users.noreply.github.com> Co-authored-by: Ishaan Kothari <ishaanko.mail@gmail.com> Co-authored-by: Bob Fowler <bob@rjf.ca> Co-authored-by: Anton Bezdenezhnykh <gamer392@yandex.ru> Co-authored-by: ValeraZSD <48602572+ValeraZSD@users.noreply.github.com> Co-authored-by: Ephraim <ephraim39hr14m@gmail.com> Co-authored-by: Ryan Ilano <ryanilano@users.noreply.github.com> Co-authored-by: Alex <me@pixp.cc> Co-authored-by: maco <gosarmarcel7@gmail.com> Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: Tristan Knight <admin@snappeh.com> Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: oliver <97427849+flamboh@users.noreply.github.com> Co-authored-by: kamkm <99585688+Kamkmgamer@users.noreply.github.com> Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
Co-authored-by: codex <codex@users.noreply.github.com>
…4860) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ersion (pingdotgg#14863) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ingdotgg#14893) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…gents (pingdotgg#14726) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ngdotgg#14903) Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
…ge (pingdotgg#14915) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ingdotgg#14908) Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…wser tabs (pingdotgg#14727) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…re binaries (pingdotgg#14944) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…gdotgg#14972) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…string (pingdotgg#14950) Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
…ingdotgg#14994) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Added markflorkowski and Yash-Singh1 to exemptions list.
…connect (pingdotgg#15002) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…dotgg#15019) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…pingdotgg#15016) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… sockets (pingdotgg#14897) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ingdotgg#15029) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…dotgg#15024) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
pingdotgg#15008) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…retries back off (pingdotgg#15034) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…otgg#15041) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…otgg#15577) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ingdotgg#15219) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…le (pingdotgg#15072) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…gdotgg#15037) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Co-authored-by: Yash Singh <saiansh2525@gmail.com>
…ingdotgg#15546) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ingdotgg#14918) Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
…#15851) Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
…#15853) Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Merge upstream/main (166 commits since 024d495) into custom, including the orchestrator-V2 rewrite (pingdotgg#2829) the 2026-10-02 sync deferred. Server: the two fork customizations lost their hosts (CheckpointReactor.ts, server.test.ts, the ws.ts bootstrap block). server-local-thread-branch now hooks ThreadLaunchService's thread.create; server-local-checkout-branch-follow is a fork-owned follower (forkLocalCheckoutBranchFollow.ts) that RunFinalizationService feeds with the checkout status its observer already read, wired through runtimeLayer for production only. Desktop: the Electron profile mirrors upstream's V2 step — t3code-fork-v2, importing the fork's own t3code-fork once; the "T3 Code (Fork)" sentinel stays. The launch isolation script and its guard follow. Web: design-mode pills ride upstream's server-side queued runs (the client queue store is gone); the thread sidebar ports sweep-to-settle, the draft context menu, Working ordering and the limited status; the workspace header pills ride ActionGroup/ThreadDetailsControl toolbar-only; the override shadows absorb their upstream diffs; the lucide shim gains 14 glyphs. fork-subagent-spawn-card is parked (upstream removed its host; needs a V2 redesign). The fork lint baselines are re-measured against upstream's own ChatView. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
There was a problem hiding this comment.
Do not approve. The V2 re-homes are the right shape: the checkout follower is its own Reference with a no-op default, thread-branch fill-in sits on ThreadLaunchService.thread.create, draft rows go through presentThreadShell, the spawn tree is parked against V2SubagentGroup, and ChatComposer decides when the idle mic yields to resume. Do not decompose ChatComposer, theme.custom.css, or the yaml for this sync.
One structural miss. The new pill exception keys on a Tailwind utility the toolbar path never applies, so the 28px pin still clips the multiline git progress this PR claims to let out. Stamp a real attribute on that control and key the CSS on it.
Sent by Cursor Automation: Thermo nuke 4.6
| /* Upstream's git progress / success readouts (ThreadDetailsControl `multiline`, | ||
| class h-auto) grow a second output row while an action runs; the pin above | ||
| would clip it to one. Let that one button size to its content. */ | ||
| :root[data-fork="noahhendrickson-t3code"] [data-fork-pill] > button.h-auto { | ||
| height: auto; | ||
| } |
There was a problem hiding this comment.
this keys on a Tailwind utility the toolbar never has. ThreadDetailsControl on the toolbar (panel={false}) renders Button size="sm-multiline" — min-h-8 / sm:min-h-7, no h-auto. The panel path that does add h-auto is unmarked (data-fork-pill={isPanel ? undefined : true}). So this exception matches nothing, and the 28px pin above still clips the progress readout.
this works as a comment, but it makes the surrounding CSS more spaghetti. let's keep the behavior and restructure the hook.
Judo: stamp data-fork-pill-grow (or equivalent) on the toolbar multiline control — same last-resort fence as data-fork-pill — and key this rule on that attribute. Pin the attr + selector in the workspace-header guard; do not regex-lock .h-auto. Do not whole-file decompose theme.custom.css (3004).
| } | ||
| part="primary" | ||
| panel={isPanel} | ||
| multiline |
There was a problem hiding this comment.
this is the toolbar control the 28px pin clips. multiline here becomes Button sm-multiline, not class h-auto, so [data-fork-pill] > button.h-auto cannot see it.
Stamp data-fork-pill-grow when !isPanel (the Button already spreads leftover props). The panel success row below stays unmarked. That gives the CSS exception a real contract instead of a coincidental utility class.
Thread transfer impact✅ Thread transfer remains within every enforced ceiling.
Baseline: Scenario and decoded snapshot size10 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.
Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed. |
… broke CI on the orchestrator-V2 sync was red in three places that the merge itself did not surface. knip reported ThreadContextDragGhost as an unused file: the fork's sidebar never adopted upstream's context-drag-to-composer, so nothing mounts the ghost. Its export pass then flagged the drag helpers, the single-list drop reducer, the change-request snapshot setter and the connected-environment search hook, all of which only upstream's Sidebar.tsx calls, plus two fork exports whose callers V2 removed. The ghost and those four upstream modules are fenced knip ignores recorded against the customizations that declined them; the two fork functions lose their export. The settings-restore test runs useSettingsRestore outside React through the hook harness, which has no useSyncExternalStore for the fork palette hook; a fenced mock answers with upstream's theme. The sidebar-width test states its viewports as literal 800 and 1200, which only hold for upstream's 40rem main-content reserve; the fenced version reads them relative to the reserve the fork's shadow lowers, so both trees satisfy it. Both test files join the owning entries' watch lists. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…le pair Upstream's DesktopPreReadyFileSystem test migrates "T3 Code (Alpha)" into "t3code-v2"; the fork's packaged pair is "T3 Code (Fork)" -> "t3code-fork-v2" (fork-app-identity), so the test failed on every CI run of this branch. The directory names are fenced to the fork's and the file joins the entry's watch list. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
NoahHendrickson
left a comment
There was a problem hiding this comment.
Reviewed at 78b5c2e. Changes needed.
[P2] Make the multiline Git-progress exception match the toolbar button. theme.custom.css:204
The new selector requires button.h-auto, but GitActionsControl passes panel=false for the header toolbar. ThreadDetailsControl's non-panel path renders Button with size=sm-multiline; that variant has min-height and padding but no h-auto class. Therefore a commit/push action that receives progress.output still matches the preceding fixed height:28px rule, and its second output row cannot expand the pill. The h-auto class exists only on the panel path, where data-fork-pill is deliberately absent. Give the multiline toolbar control a matching semantic attribute (or match its actual size attribute) and cover that path in the guard. This independently confirms the earlier bot finding; it remains present on the latest head.
Scope: focused review of the fork-specific merge resolutions and V2 integration points, including server branch-follow wiring, desktop profile isolation, composer/design-send ports, sidebar ports and override changes. The imported upstream rewrite is too large for this to constitute an exhaustive audit of every upstream change. Current CI is green. No browser verification.
NoahHendrickson
left a comment
There was a problem hiding this comment.
Review: #167 orchestrator-V2 absorb
Verdict: the merge is in good shape and I'd merge it after two small fixes. Both server re-homes preserve their intent, the desktop profile step mirrors upstream slot for slot with no leak of upstream's profile names, every fork fence id is accounted for, and the sidebar/composer/header ports match upstream's behaviour where they claim to. Two regressions below are real; the rest is hygiene.
Fix before merge
-
The multiline git readout is still pinned to 28px (Cursor's finding is correct).
theme.custom.css:203keys the exception onbutton.h-auto, but the toolbar path ofThreadDetailsControl(panel={false}) returns<Button size="sm-multiline">, whose size class ismin-h-8 … sm:min-h-7with noh-auto; theh-autostring atThreadDetailsControl.tsx:59is only applied on the panel branch, which the fork leaves unmarked. So the selector matches nothing on the toolbar and the progress readout inside thedata-fork-pillActionGroup still takesheight: 28pxfrom the rule at line 190. The manifest intent ("let out of the 28px pin") is not true and no guard asserts it. Inline notes on the two lines. -
Queued runs show raw
<design_change_request>markup.customcarried d3ef0f0 (the queued-message row counts design changes like attachments). Upstream's client queue is gone and that fix went with it, but its replacement,QueuedRunsControl.tsx, has no fork fence and rendersmessage.textverbatim after stripping only context references. Sending design pills while a turn runs now yields a queued row whose summary and tooltip are the XML-ish block (a design-only queued message is the tag alone), andChatView.tsx:4626seeds the queued edit with the same raw text.fork-design-modefences went 53→38 in this merge and the manifest records the pills-stay-pending decision but not this one.
Nits (not blocking)
RunFinalizationService.ts:46-56: the fence opens inside therefreshinput type and closes afterdefaultValue, enclosing upstream lines. Cosmetic, but it makes the next hand-patch harder to read.- No test exercises the finalize→follow seam:
RunFinalizationService.test.tsmocksrefreshtonull, sofollower.followis never invoked anywhere, and the web guard only string-matches the call. OneLayer.succeed(LocalCheckoutBranchFollower, …)case assertingfollowreceives the observer'slocalwould pin the outcome the manifest lists this file as verifying. ThreadLaunchService.ts:756: the bootstrap-branch resolver runs before thereuseExistingThreadbranch, so a reuse launch pays alocalStatuscall whose result it discards.DesktopPreReadyFileSystem.test.ts:27: the pinned migration test sources from"T3 Code (Fork)", the sentinel the manifest says must never exist, so it exercises the dead branch. The live pair (t3code-fork→t3code-fork-v2) is only covered inDesktopUserData.test.ts.DesktopApp.ts:279-291: the "set userData before installIntoProcess" hunk is now redundant; upstream'sDesktopClerk.makesetsuserDataduring layer construction. Its comment still says the packaged default isn3code.- Sidebar: the PR-new sweep hunks (
SIDEBAR_DRAG_DISTANCE/sweepVerbBadgeat ~700-730,isSweptplumbing ~1261-1291, the sweep block ~3014-3103, the cleanup effect ~3105) are unfenced; thesidebar-v2-card-rowsfences nearby wrap the rationale comments but not the code. Same pattern pre-exists oncustom, so this is a trend note, not a regression. forkLocalCheckoutBranchFollow.ts:15-17says worktree threads' branch changes are recorded through V2's own flows; the manifest correctly says V2 has no drift follow at all.
Cursor bot
Its one structural finding (the .h-auto pin) is right; see above. Its praise for the re-home shapes also holds up on reading.
Verified locally (detached checkout of 78b5c2e, fresh vp i)
- Fork guards 494/494; server tests for
ThreadLaunchService,RunFinalizationService,forkLocalCheckoutBranchFollow,RunExecutionService,resolveBootstrapThreadBranch116/116; web tests for the conflicted chat/settings/custom files 289/289; desktop identity/profile/Clerk tests 34/34;.fork/lint-owned.mjsno blocking warnings. - Fence census vs
custom: ids unchanged exceptfork-subagent-spawn-card2→0 (parked, recorded),fork-design-mode53→38 (client queue removal; see fix 2),ci-runners14→13 (a fenced test file upstream deleted). The three ids without manifest entries (fork-change-scope,fork-workflow,custom-composer-layout) are docs/README prose and pre-exist. - Upstream-added lines missing from the conflict-resolved files are all deliberate fork variants (banner→pill, model strip disabled with a comment, fork profile names,
initialBranchreplaced), except the queued-row summary noted above.composer.sendAlternateand the resting-controls layout are present. - No fork workflow job runs on Blacksmith;
release.ymljobs that do are gated ongithub.repository == 'pingdotgg/t3code'.
Merge mechanics
#168 and #169 are stacked on this branch. Retarget both to custom with gh pr edit N --base custom before merging this one; merging with --delete-branch first closes them. #168's branch also predates the two follow-up commits here (d6fe721, 78b5c2e) and needs them merged in.
Reviewed by Claude Fable 5.1 via Claude Code (T3 Code), with subagents per cluster; every finding above was re-verified against the source.
| /* Upstream's git progress / success readouts (ThreadDetailsControl `multiline`, | ||
| class h-auto) grow a second output row while an action runs; the pin above | ||
| would clip it to one. Let that one button size to its content. */ | ||
| :root[data-fork="noahhendrickson-t3code"] [data-fork-pill] > button.h-auto { |
There was a problem hiding this comment.
This selector never matches on the toolbar. ThreadDetailsControl with panel={false} returns <Button size="sm-multiline" className={className}>; sm-multiline is min-h-8 gap-1.5 … whitespace-normal sm:min-h-7 (ui/button.tsx:36), no h-auto. The h-auto at ThreadDetailsControl.tsx:59 only lands on the panel branch, which is unmarked. So the progress readout keeps height: 28px from line 190. Key this on something the toolbar button actually carries, ideally a stamp such as data-fork-pill-grow set alongside data-fork-pill on the multiline control, and pin it in forkWorkspaceHeader.test.ts.
| } | ||
| part="primary" | ||
| panel={isPanel} | ||
| multiline |
There was a problem hiding this comment.
This is the control the 28px pin clips: multiline becomes Button sm-multiline, not class h-auto, so the exception in theme.custom.css:203 cannot see it. Stamp an attribute here when !isPanel (Button spreads leftover props) and key the CSS on it.
| <ComposerBanner.Scroll className={cn("max-h-32", !expanded && "hidden")}> | ||
| <ComposerBanner.Children render={<ol />} id={queueListId}> | ||
| {items.map((item) => { | ||
| const previewText = replaceComposerContextReferences(item.text, (reference) => |
There was a problem hiding this comment.
Regression vs custom (d3ef0f0): the previous queued-message row counted design changes like attachments. This row renders item.text after stripping only context references, so a message sent with design pills while a turn runs shows the raw <design_change_request> block as its summary and tooltip (a design-only queued message shows just the tag). This file is upstream-new and carries no fork fence; fork-design-mode lost 15 fences in this merge and the manifest doesn't record this drop. Either strip/summarize the blocks here (fenced) or record it as accepted.
| readonly cwd: string; | ||
| readonly threadId: ThreadId; | ||
| readonly runId: RunId; | ||
| /* fork:begin server-local-checkout-branch-follow — see .fork/customizations.yaml#server-local-checkout-branch-follow |
There was a problem hiding this comment.
Nit: this fence opens inside the refresh input type and closes after defaultValue, so it encloses upstream's }>("t3/orchestration-v2/RunFinalizationObserver", { and refreshAfterTurn: () => Effect.void, lines. Drift detection is path-based so nothing breaks, but the next hand-patch has to work out which lines are the fork's.
| const scopeId = CheckpointScopeId.make("scope_finalize"); | ||
| const capture = vi.fn(() => Effect.void); | ||
| /* fork:begin server-local-checkout-branch-follow — see .fork/customizations.yaml#server-local-checkout-branch-follow */ | ||
| const refresh = vi.fn(() => Effect.succeed(null)); |
There was a problem hiding this comment.
Nit/test gap: refresh is mocked to return null everywhere, so follower.follow is never invoked in any test, and the web guard only string-matches the call site. The manifest lists this file under verify for server-local-checkout-branch-follow; one case that provides Layer.succeed(LocalCheckoutBranchFollower, …) and asserts follow receives the observer's local would pin the seam.
| A launch that names no branch (upstream mobile's untouched "Current | ||
| checkout") records the checkout's live branch. A worktree launch | ||
| names its own branch through the provisioning flow and is left alone. */ | ||
| const initialBranch = yield* resolveBootstrapThreadBranch( |
There was a problem hiding this comment.
Nit: the resolver runs before the reuseExistingThread branch below, so a reuse launch (which keeps the client's recorded branch, per the manifest) still pays a localStatus call on the turn-start path and discards the result. Gating on input.reuseExistingThread !== true matches the stated intent.
| const root = yield* fileSystem.makeTempDirectoryScoped({ prefix: "t3-pre-ready-fs-" }); | ||
| // fork:begin fork-app-identity — see .fork/customizations.yaml#fork-app-identity | ||
| // The fork's packaged profile pair is "T3 Code (Fork)" -> "t3code-fork-v2". | ||
| yield* fileSystem.makeDirectory(path.join(root, "T3 Code (Fork)")); |
There was a problem hiding this comment.
Nit: this migrates from "T3 Code (Fork)", the directory the manifest says must never exist, so the pinned test exercises the dead branch. The live pair (t3code-fork → t3code-fork-v2) is only covered in DesktopUserData.test.ts. Sourcing from t3code-fork here would make the test reflect shipped behaviour.
| @@ -677,12 +697,42 @@ const draftPenClassName = "size-3 shrink-0 text-warning-foreground"; | |||
| they are not carried; the drag they belong to is the thing to port. */ | |||
| /* fork:end sidebar-v2-project-grouping */ | |||
|
|
|||
| // Pointer travel before a press on a row action starts a sweep. Shorter | |||
There was a problem hiding this comment.
Nit: the sweep port's new code (SIDEBAR_DRAG_DISTANCE / SidebarSweepAction / sweepVerbBadge here, the isSwept plumbing ~1261-1291, the sweep block ~3014-3103 and its cleanup effect) is unfenced; the nearby sidebar-v2-card-rows fences wrap the rationale comments but not the code they explain. The id sets are intact (131/131 balanced), this is about where the next sync's conflict markers will land.
Two regressions from the V2 absorb, both flagged in review. The multiline git-progress exception keyed on `button.h-auto`, but the toolbar path of ThreadDetailsControl renders Button size="sm-multiline", which never carries that class, so the readout stayed pinned to 28px and its output row was clipped. GitActionsControl now stamps the toolbar control with data-fork-pill-multiline and the CSS keys on that; the workspace-header guard pins both halves. Queued runs rendered the raw <design_change_request> block as their summary and tooltip (the pre-V2 client queue row counted design changes like attachments; that row is gone). QueuedRunsControl strips the trailing run first and shows "N design changes" beside the thumbnails, and the queued-run edit seeds the composer with the prose only, holding the run aside and re-appending it verbatim on save. Design-mode guard covers both. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
NoahHendrickson
left a comment
There was a problem hiding this comment.
Addressed at 8476958 (notes by path; inline anchors on this diff size are unreliable).
Fixed
GitActionsControl.tsxtoolbar progress control now carries a fenceddata-fork-pill-multiline={isPanel ? undefined : true}, and the exception intheme.custom.csskeys on[data-fork-pill] > button[data-fork-pill-multiline]withheight: autoinstead ofbutton.h-auto.forkWorkspaceHeader.test.tspins the stamp, the selector, and the absence of the class selector. This also closes the Cursor finding on the same lines.QueuedRunsControl.tsxstrips the trailing<design_change_request>run before the context-reference pass and shows a muted "N design changes" beside the attachment thumbnails, so a design-only queued message reads as such instead of the tag.ChatView.tsxseeds the queued-run edit with the prose only, holds the run oneditingQueuedRun.forkDesignChangeRun, and re-appends it verbatim on save (splitTrailingDesignChangeRunindesignChangeTranscript.ts, also used bywithDesignChangesTrailingnow). An edit that empties the prose but keeps the run still saves; a recovered edit keeps the prose only.forkDesignMode.test.tscovers the row, the seed, the save, and the split round-trip; the manifest records the decision and listsQueuedRunsControl.tsx.
Not changed: the nits (fence placement in RunFinalizationService.ts, the finalize→follow test gap, the reuse-launch localStatus call, the migration test's source dir, the redundant DesktopApp.ts hunk, the unfenced sweep hunks). They are non-blocking per the review and belong in a follow-up rather than the sync.
#166: after this sync the queued message no longer draws in the transcript (no data-queued-message-id, no dashed bubble); queued runs are banner rows in the composer that fork-composer-banner-surface already themes. The frost has nothing left to apply to, so #166 is superseded rather than ported.
Verified locally: web typecheck clean; forkWorkspaceHeader, forkDesignMode, customizationsManifest guards, QueuedRunsControl.test.tsx, queuedMessageEdit.test.ts, and the design-mode unit tests pass (167 tests); lint on the touched files 0 errors; lint-owned no blocking warnings.
…default The V2 sync (#167) absorbed new upstream surfaces as upstream drew them. This brings each one onto the fork's recipes: - Thread details panel: its inner card joins the one popup frost rule (28px blur, --fork-popup-fill, 12% hairline), takes the composer vessel's radius, the 4% row lift and the vessel hairline on section dividers. - Subagent spawn batches: ForkSubagentGroup renders the Figma tree (TreeView lead, status summary with the batch's elapsed span, member rows with the sidebar marks, activity, model and elapsed) in place of upstream's avatar-stack group, fed from the live subagent roster. Un-parks fork-subagent-spawn-card. - Liveness pill: the count opens a frosted popover naming each pending task; a subagent's row opens its thread. - Sidebar sweep badge: the card's chip recipe instead of the primary tint. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>


Problem
customwas 166 commits behind upstream (last sync point024d49520, 2026-10-02). The first commit in that range is pingdotgg#2829, the orchestrator-V2 rewrite the previous sync (#164) deliberately left out: a full server rewrite that deletes the hosts of both fork server customizations (CheckpointReactor.ts,server.test.ts, thews.tsbootstrap block), moves the client-side message queue to the server, and steps the desktop profile.What this does
Merges
upstream/mainthrough1604ccc9dintocustom. 37 conflicted files resolved (30 content, 7 modify/delete), 5 override shadows ported by hand, every fork fence accounted for in a census against the pre-merge baseline.Notable decisions, all fenced and recorded in
.fork/customizations.yaml:server-local-thread-branchre-homes atThreadLaunchService'sthread.create(root and existing-folder launches read the live checkout; a worktree launch names its own branch).server-local-checkout-branch-followbecomes a fork-owned follower (forkLocalCheckoutBranchFollow.ts): run finalization's observer hands back the checkout status it already read, finalize passes it to the follower, andruntimeLayerprovides the real follower (backed by thread management) to production only — no layer cycle, and the replay harness keeps the no-op default. V2 has noexpectedBranchcompare-and-swap; the adoption is guarded byexpectedWorktreePath: null.t3code-fork-v2, importing the fork's ownt3code-forkonce (localStorage, Windows safeStorage keys); the never-matching"T3 Code (Fork)"sentinel stays. The launch isolation script and its guard follow.queuedMessageStore,sendQueuedMessage); queued sends are server-side runs on the singlestartTurnpath, so design-change pills ride every send. Editing an already-queued run leaves pills pending (no clientcreatedAtfor preview correlation). The idle dictation mic yields the slot to upstream's new resume action; a live session never does. The composer-inset stamp moved into upstream'spublishComposerOverlayHeight.limitedstatus into the fork's card rows;SidebarBrandWidthProbere-implemented for the fork's header geometry; the model/price dialogs ride in the usage popover body.ActionGroup/ThreadDetailsControl; the fork marks are toolbar-only, the new thread-details panel stays unmarked; the multiline git progress readout is let out of the 28px pin.ChatView.tsx; upstream's dead imports in fork-owned files carryoxlint-disable-next-linerather than deletion.fork-subagent-spawn-card— upstream removedAgentSpawnRowand the agent-panel model the fork tree drew from; spawn batches render throughV2SubagentGroup. The manifest records the parked state and the guard pins it; the Figma tree needs a V2-shaped redesign, not a port.Verified
ThreadLaunchService,RunFinalizationService,RunExecutionService, runtime layer); 1455 focused web tests (chat, sidebar, usage, custom, overrides); desktop identity / Clerk / user-data testsvp lint apps/web/src0 errors;.fork/lint-owned.mjsno blocking warningsNot run in a browser. Worth a look after merge: the queued-runs control inside the fork composer shell, the sweep gesture on card rows, the thread details panel pills, and first launch of a packaged build (V1 → V2 profile import).
Follow-ups (not in this PR)
V2SubagentGroupand un-parkfork-subagent-spawn-card.DEFERRED_RULES.Claude Fable 5.1 via Claude Code (T3 Code), with four subagents for the sidebar, composer, workspace-header and override-shadow/desktop clusters.
🤖 Generated with Claude Code