Skip to content

chore(sync): absorb upstream main through 1604ccc9d (orchestrator V2) - #167

Merged
NoahHendrickson merged 170 commits into
customfrom
claude/sync-2026-10-05
Oct 10, 2026
Merged

NoahHendrickson merged 170 commits into
customfrom
claude/sync-2026-10-05

Conversation

@NoahHendrickson

Copy link
Copy Markdown
Owner

Problem

custom was 166 commits behind upstream (last sync point 024d49520, 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, the ws.ts bootstrap block), moves the client-side message queue to the server, and steps the desktop profile.

What this does

Merges upstream/main through 1604ccc9d into custom. 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 — server-local-thread-branch re-homes at ThreadLaunchService's thread.create (root and existing-folder launches read the live checkout; a worktree launch names its own branch). server-local-checkout-branch-follow becomes a fork-owned follower (forkLocalCheckoutBranchFollow.ts): run finalization's observer hands back the checkout status it already read, finalize passes it to the follower, and runtimeLayer provides the real follower (backed by thread management) to production only — no layer cycle, and the replay harness keeps the no-op default. V2 has no expectedBranch compare-and-swap; the adoption is guarded by expectedWorktreePath: null.
  • Desktop — the Electron profile mirrors upstream's V2 step slot for slot: t3code-fork-v2, importing the fork's own t3code-fork once (localStorage, Windows safeStorage keys); the never-matching "T3 Code (Fork)" sentinel stays. The launch isolation script and its guard follow.
  • Composer / design mode — upstream removed the client queue (queuedMessageStore, sendQueuedMessage); queued sends are server-side runs on the single startTurn path, so design-change pills ride every send. Editing an already-queued run leaves pills pending (no client createdAt for 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's publishComposerOverlayHeight.
  • Sidebar — ported sweep-to-settle/un-settle/wake (feat(web): sweep sidebar buttons to settle, un-settle, and wake threads pingdotgg/t3code#14768), the draft context menu (fix(web): add context menu to draft threads in the sidebar pingdotgg/t3code#10637), Working-section ordering (fix(clients): Working section keeps its order while agents finish and wake pingdotgg/t3code#15418), secondary-pointer reveal (fix(web): reveal sidebar actions for secondary hovering pointers pingdotgg/t3code#15536) and the new limited status into the fork's card rows; SidebarBrandWidthProbe re-implemented for the fork's header geometry; the model/price dialogs ride in the usage popover body.
  • Workspace header — pills sit on upstream's 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.
  • Icons — 14 new lucide names mapped in the Phosphor shim.
  • Lint — the fork React-compiler baselines re-measured against upstream's own ChatView.tsx; upstream's dead imports in fork-owned files carry oxlint-disable-next-line rather than deletion.
  • Parked: fork-subagent-spawn-card — upstream removed AgentSpawnRow and the agent-panel model the fork tree drew from; spawn batches render through V2SubagentGroup. The manifest records the parked state and the guard pins it; the Figma tree needs a V2-shaped redesign, not a port.

Verified

  • web / server / desktop / mobile / contracts / client-runtime / shared typecheck: 0 errors
  • fork guard suite 494/494; 116 server tests around the re-homed customizations (incl. ThreadLaunchService, RunFinalizationService, RunExecutionService, runtime layer); 1455 focused web tests (chat, sidebar, usage, custom, overrides); desktop identity / Clerk / user-data tests
  • vp lint apps/web/src 0 errors; .fork/lint-owned.mjs no blocking warnings
  • Known host-dependent failure only: the Windows cross-arch artifact test on Apple Silicon (pre-existing)

Not 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)

  • Redesign the subagent spawn CTA against V2SubagentGroup and un-park fork-subagent-spawn-card.
  • The fork liveness pill shows only a count; upstream's dropped banner listed per-task links to subagent threads.
  • 125 deferred fork lint warnings remain under 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

juliusmarminge and others added 30 commits October 2, 2026 12:22
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>
)

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ge (pingdotgg#14915)

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.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>
)

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.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>
Yash-Singh1 and others added 12 commits October 4, 2026 23:31
…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>
@github-actions github-actions Bot added 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL labels Oct 5, 2026

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Open in Web View Automation 

Sent by Cursor Automation: Thermo nuke 4.6

Comment thread apps/web/src/theme.custom.css Outdated
Comment on lines +200 to +205
/* 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;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@github-actions

github-actions Bot commented Oct 5, 2026 •

Copy link
Copy Markdown

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

⚠️ The thread fixture changed, so impact percentages are not directly comparable to the main baseline.

Provider Metric Main baseline This PR Impact PR ceiling
Codex Total thread wire — 5.0 KiB — 6.8 KiB ✅
Codex Thread snapshot wire — 3.8 KiB — 4.9 KiB ✅
Codex Live turn WebSocket wire — 1.2 KiB — 2.0 KiB ✅
Codex Live turn WebSocket decoded — 20.9 KiB — 29.3 KiB ✅
Codex Live turn messages — 2 — 8 ✅
Claude Total thread wire — 5.0 KiB — 6.8 KiB ✅
Claude Thread snapshot wire — 3.8 KiB — 4.9 KiB ✅
Claude Live turn WebSocket wire — 1.2 KiB — 2.0 KiB ✅
Claude Live turn WebSocket decoded — 21.2 KiB — 29.3 KiB ✅
Claude Live turn messages — 2 — 8 ✅

Baseline: ef5d6a9 · PR result: 8476958 · 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: 108.5 KiB
  • Claude decoded thread snapshot: 108.8 KiB

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

xxxxxxxxxxxxx and others added 2 commits October 7, 2026 10:25
… 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 NoahHendrickson left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 NoahHendrickson left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

  1. The multiline git readout is still pinned to 28px (Cursor's finding is correct). theme.custom.css:203 keys the exception on button.h-auto, but the toolbar path of ThreadDetailsControl (panel={false}) returns <Button size="sm-multiline">, whose size class is min-h-8 … sm:min-h-7 with no h-auto; the h-auto string at ThreadDetailsControl.tsx:59 is only applied on the panel branch, which the fork leaves unmarked. So the selector matches nothing on the toolbar and the progress readout inside the data-fork-pill ActionGroup still takes height: 28px from 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.

  2. Queued runs show raw <design_change_request> markup. custom carried 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 renders message.text verbatim 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), and ChatView.tsx:4626 seeds the queued edit with the same raw text. fork-design-mode fences 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 the refresh input type and closes after defaultValue, enclosing upstream lines. Cosmetic, but it makes the next hand-patch harder to read.
  • No test exercises the finalize→follow seam: RunFinalizationService.test.ts mocks refresh to null, so follower.follow is never invoked anywhere, and the web guard only string-matches the call. One Layer.succeed(LocalCheckoutBranchFollower, …) case asserting follow receives the observer's local would pin the outcome the manifest lists this file as verifying.
  • ThreadLaunchService.ts:756: the bootstrap-branch resolver runs before the reuseExistingThread branch, so a reuse launch pays a localStatus call 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 in DesktopUserData.test.ts.
  • DesktopApp.ts:279-291: the "set userData before installIntoProcess" hunk is now redundant; upstream's DesktopClerk.make sets userData during layer construction. Its comment still says the packaged default is n3code.
  • Sidebar: the PR-new sweep hunks (SIDEBAR_DRAG_DISTANCE / sweepVerbBadge at ~700-730, isSwept plumbing ~1261-1291, the sweep block ~3014-3103, the cleanup effect ~3105) are unfenced; the sidebar-v2-card-rows fences nearby wrap the rationale comments but not the code. Same pattern pre-exists on custom, so this is a trend note, not a regression.
  • forkLocalCheckoutBranchFollow.ts:15-17 says 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, resolveBootstrapThreadBranch 116/116; web tests for the conflicted chat/settings/custom files 289/289; desktop identity/profile/Clerk tests 34/34; .fork/lint-owned.mjs no blocking warnings.
  • Fence census vs custom: ids unchanged except fork-subagent-spawn-card 2→0 (parked, recorded), fork-design-mode 53→38 (client queue removal; see fix 2), ci-runners 14→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, initialBranch replaced), except the queued-row summary noted above. composer.sendAlternate and the resting-controls layout are present.
  • No fork workflow job runs on Blacksmith; release.yml jobs that do are gated on github.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.

Comment thread apps/web/src/theme.custom.css Outdated
/* 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 {

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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) =>

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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));

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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(

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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)"));

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 NoahHendrickson left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed at 8476958 (notes by path; inline anchors on this diff size are unreliable).

Fixed

  1. GitActionsControl.tsx toolbar progress control now carries a fenced data-fork-pill-multiline={isPanel ? undefined : true}, and the exception in theme.custom.css keys on [data-fork-pill] > button[data-fork-pill-multiline] with height: auto instead of button.h-auto. forkWorkspaceHeader.test.ts pins the stamp, the selector, and the absence of the class selector. This also closes the Cursor finding on the same lines.
  2. QueuedRunsControl.tsx strips 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.tsx seeds the queued-run edit with the prose only, holds the run on editingQueuedRun.forkDesignChangeRun, and re-appends it verbatim on save (splitTrailingDesignChangeRun in designChangeTranscript.ts, also used by withDesignChangesTrailing now). An edit that empties the prose but keeps the run still saves; a recovered edit keeps the prose only. forkDesignMode.test.ts covers the row, the seed, the save, and the split round-trip; the manifest records the decision and lists QueuedRunsControl.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.

NoahHendrickson pushed a commit that referenced this pull request Oct 10, 2026
…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>
@NoahHendrickson
NoahHendrickson merged commit 30db12a into custom Oct 10, 2026
25 checks passed
@NoahHendrickson
NoahHendrickson deleted the claude/sync-2026-10-05 branch October 10, 2026 04:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. size:XXL vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.