Skip to content

chore(v2): merge main into the V2 branch (48 commits) - #13800

Merged
juliusmarminge merged 80 commits into
t3code/codex-turn-mappingfrom
v2/rebase-onto-main-20260926
Sep 26, 2026
Merged

juliusmarminge merged 80 commits into
t3code/codex-turn-mappingfrom
v2/rebase-onto-main-20260926

Conversation

@juliusmarminge

@juliusmarminge juliusmarminge commented Sep 26, 2026 •

Copy link
Copy Markdown
Member

Merges origin/main at a21b42cec4, 48 commits past the merge base a107f8a079, into the V2 branch. It keeps main's fixes, carries main's performance work over to V2's replacement code, and keeps everything V2 added.

Merge, not rebase. The request was a rebase. This PR is one merge commit plus follow-up port commits. A rebase would rewrite all 715 V2 commits, break every open stacked PR on t3code/codex-turn-mapping, and need a force-push to a shared branch. Nothing here needs a real rebase.

Commits:

Each port commit covers one main PR, so each can be reverted on its own.

Refresh (second batch). The branch now also includes:

Pushes were fast-forward only. #13742 (mobile PR icon, one file) landed on main after the second merge and is not included; it belongs in the next merge.

Decisions

First batch (main a107f8a..a21b42c)

Legend: A = ACCEPT, P = PORT, S = SUPERSEDED, D = NEEDS-DISCUSSION. Paths are relative to apps/server/src/ unless they start with apps/ or packages/.

PR Title Decision Reason / V2 evidence Port commit
#11477 keep nested task states out of parent bullets A Web-only markdown clipboard fix; merged cleanly.
#13575 ship a Linux .deb that updates itself A Release and desktop updater; not touched by V2.
#13501 cache compiled JavaScript between launches A compileCache.ts is new. The flushCompileCache call conflicted with V2's imports in serverRuntimeStartup.ts and is kept.
#13589 one t3.json setup action for every OS A Dev tooling.
#13590 new worktree threads no longer say "checkout" A + P in merge Logic merged cleanly. V2's thread details panel still passed the old effectiveEnvModeOverride prop. The merge wires envMode through ChatView → ThreadDetailsPanel → BranchToolbar and applies main's label and icon rules to V2's env-mode selector markup. in e42ccbddfa
#13585 t3 app survives a second desktop quit A Desktop only.
#13599 price Claude fast mode at the fast rate A usage/*; not touched by V2.
#13611 update OpenAI logo A Icons.
#12810 render project icons in mobile chat list A Mobile; merged cleanly.
#10409 read cursor, opencode, antigravity usage history A + conflict fixes See "V2 changes altered" below: Cursor keychain opt-in, a file-name case collision, usage presentation, and the usageSummary refresh trigger.
#10584 retry failed statement preparations A packages/shared/nodeSqliteClient; applies to V2's SQLite too.
#13356 Android controls scale with text size A Mobile. One conflict in ThreadComposer.tsx: V2's iconUrl moved onto main's renderIcon(size) API.
#13450 focus returns to composer after citation note A Web.
#13492 honor standard OTLP env vars A CLI config and shared.
#13673 settling a thread closes its idle shells P TerminalManager.closeIdle and the setup-script cleanup merged cleanly (shared code). The settle trigger lived in V1 ProviderCommandReactor, which V2 deleted, and V2's settle only detached the provider session. ThreadSettlementServiceV2 now handles thread.settled: it re-reads the thread and calls closeIdle only if the thread is still settled. ace70caecc
#13678 load Cursor keyring with createRequire A Came in with the renamed provider/cursorKeychainToken.ts (see below).
#13395 avoid rereading unchanged review-preview files A vcs/GitVcsDriverCore; shared by V2.
#13641 OTLP vars in desktop main process and WSL A Desktop.
#13700 restore compact provider instance badges A The Sidebar conflict is resolved to V2's SidebarProviderStack. V2's one-off .provider-stack-badge-text { font-size: 7px } is replaced with main's new text-5xs token (same 7px), and the one-off class is removed.
#13702 lighter mobile Home rows off-screen A Mobile.
#13731 price Cursor cache savings by base model A Usage.
#13705 render mobile Home rows further ahead A Mobile.
#13699 name each service after its application A Also removed the now-deleted otlpServiceName field from V2 testkits (CodexAdapterV2.testkit.ts, CursorAdapterV2.testkit.ts, testkit/ProviderReplayHarness.ts, cli/project.test.ts).
#13720 stop remapping every thread on each thread event A (V1 file) / S for V2 Applied to orchestration/projector.ts, which still backs V1 OrchestrationEngine: V2's runtimeLayer.ts:86 still wires it for ProjectService commands. V2's own read side has no in-memory list of all threads. ProjectionStoreV2.apply writes one row per event, and shell streams re-read only changed threads (orchestration-v2/ProjectionStore.ts getThreadShell). The client still has a cheaper version of this cost (memory notes below).
#13718 remove unused items tracking from Claude adapter S V1 provider/Layers/ClaudeAdapter.ts is deleted in V2. ClaudeAdapterV2 never collected per-turn SDK messages: readThreadSnapshot fails with "does not implement snapshots" (orchestration-v2/Adapters/ClaudeAdapterV2.ts:6832), and there is no turns[].items state.
#13701 name the command on subprocess spans A processRunner; shared.
#13685 t3 triage points at log files that exist A CLI.
#13684 SQLite WAL file shrinks after large writes A persistence/Layers/Sqlite.ts; applies to the V2 database. Sqlite.test.ts passes.
#13698 summarize the server trace file from the CLI P V2 moved the command list out of bin.ts into binCli.ts, so traceCommand was left unregistered (knip flagged it). Registered in binCli.ts:78. 433ee8b640
#13704 PR sync reads only threads with linked PRs P V2's PullRequestSyncReactor called OrchestratorV2.getShellSnapshot() every minute. That call builds every thread's shell, archived ones included, then everything unlinked was dropped. Added ProjectionStoreV2.getThreadsWithPullRequests (orchestration-v2/ProjectionStore.ts:5046): one SELECT with json_array_length(payload_json,'$.pullRequests') > 0, plus a matching in-memory store implementation. Main's listThreadsWithPullRequests on V1 ProjectionSnapshotQuery was not taken: it queries projection_thread_pull_requests, which V2 never writes (links live in the V2 thread payload). af6754b1f1
#13694 server heap snapshot on SIGUSR2 A HeapSnapshot.layer is wired into V2's server.ts. Useful for the V2 memory work below.
#13688 shutdown no longer rewrites every stopped session row S V1 ProviderService.ts is deleted in V2. ProviderSessionManagerV2.shutdown (orchestration-v2/ProviderSessionManager.ts:1515) iterates only live in-memory sessions; stopped rows are never touched.
#13693 thread list snapshot without decoding twice A (V1 file) / S for V2 Applied to V1 ProjectionSnapshotQuery (still used for projects and some reads). V2's ProjectionStore.getShellSnapshot decodes each payload once and builds plain objects (shellFromState); there is no whole-snapshot re-decode.
#13683 slow servers load the thread list once A client-runtime HTTP snapshot timeouts; the V2 client uses these loaders.
#13686 hidden terminal drawers don't keep full history S V2's drawer already reads only the shell: const serverThread = useThreadShell(threadRef) (apps/web/src/components/ChatView.tsx:942). Main's active-drawer useThread fallback exists for archived V1 threads without a shell. V2 needs only the worktree path and project, so V2's side is kept.
#13691 per-thread settlement and PR checks don't rebuild the list P Both V2 services read every thread for a one-thread request. getSettlementCandidates(threadId?) now filters in SQL (ProjectionStore.ts:4944), and a sweep with no candidates stops early. ThreadPullRequestServiceV2 reads getThreadEventSequence then getThreadShell for one thread (ThreadPullRequestService.ts:126), and a one-thread read only clears that thread's pending backfill (as on main). 437b334c0c
#13530 running threads open at the latest message A Mobile.
#13697 record event loop stalls in the trace A EventLoopMonitor.layer is wired into V2's ApplicationObservabilityLive.
#13689 stop re-running git for every project each minute A + P The 15-minute identity cache TTL and the publish-repository refresh in ws.ts merged cleanly. V2's ThreadPullRequestService resolved identities without refresh, so after a turn it could miss a newly added remote for up to 15 minutes. Discovery requests already marked refresh: true now pass it through to the resolver. 2b9af8fe71
#13714 hide the Cursor keychain prompt when Cursor isn't set up A Web, mobile, and client-runtime usage state.
#11594 chat width setting for wide screens A + P The settings row, contract field, root data-chat-width, and minimap gutter logic merged; the minimap tests are ported onto V2's test. V2 sizes the lane with --chat-content-max-width rather than main's --chat-max-width, so the setting did nothing until the port. Wide and Full now override V2's token. D: V2's comfortable width stays 46rem, not main's 48rem. fe76961c94
#13651 accept opencode v2 serve ready line A provider/opencodeRuntime.ts is shared with OpenCodeAdapterV2.
#7079 stop treating agy CLI as Antigravity IDE A Editor contract; editors are not stored, so decoding is safe.
#13713 empty workspace draggable on desktop A Web.
#13669 editors don't vanish when discovery is slow A Shared.
#12537 exclude SSH ports from provider URLs A Shared.
#13409 Mod+B bolds on non-Latin layouts A Web.
#13695 prune expired replay-protection files A ReplayMarkers.layer is added to V2's RuntimeCoreDependenciesBaseLive (server.ts:525) because main's ReactorLayerLive chain doesn't exist in V2.

Second batch (main a21b42c..95030dc)

PR Title Decision Reason / V2 evidence Port commit
#13408 terminal links drop a trailing colon A Web; merged cleanly.
#13748 bump node-pty to 1.2.0-beta.15 A The lockfile was regenerated with vp i from main's lockfile, keeping V2's deps (@cursor/sdk, @napi-rs/keyring).
#13344 focus ring on sidebar thread rows A Merged into V2's Sidebar.tsx.
#13310 mobile composer stays within folded screen A Mobile.
#13368 let OpenCode generate session titles P V1 ProviderCommandReactor is deleted. V2's OpenCodeAdapterV2 sent a placeholder title: "T3 Code <threadId>" on every session.create, which stops OpenCode from generating a title. It now sends no title. D: main also forwards a hand-renamed title; V2 has no title-provenance field and never sent the thread title, so that part is left out. df06b8b97b
#13339 Antigravity inspects unsupported files by path S (code) + P (docs) V1 AntigravityAdapter is deleted. The shared buildAntigravityPrompt merged, but V2 has no production caller for it. V2's Antigravity runs through AcpAdapterV2, which embeds only images and passes every other file as a saved path (AttachmentPrompt.providerMessageTextWithAttachmentPaths). Reads are confined by AntigravityClientFiles (#13613). Main's doc text described V1's native PDF/text/audio limits, so providers-antigravity.md now describes V2. d45989af57
#13795 link URLs with ports and single-label hosts A Mobile markdown patch.
#10158 keyboard navigation for Usage A + P Merged; usagePageOpen added to V2's keybindings doc list. Main left usage.open unranked in the settings sort, which made the comparator inconsistent. With V2's extra default bindings, main's own test failed. usage.open now ranks first, and the test checks both input orders. 1b10d0874c
#13756 stop writing empty spans A (shared) / S for V2 The processRunner, shell, GitVcsDriverCore and PortScanner changes merged. Main's skip of the empty attachment-cleanup span is kept in V1 ProjectionPipeline. V2's ProjectionStoreV2.apply is a plain untraced Effect.gen, so it writes no per-event span.
#13763 Diagnostics no longer loads the whole trace ring A diagnostics/TraceDiagnostics and cli/trace are shared with V2.
#13759 sort without re-parsing dates per comparison A The shared sortSettledThreads (client-runtime) and precomputed project sort apply to V2. V2's duplicate sortSettledThreadsForSidebar is dropped for main's shared one (same resolver). Its tests now live in client-runtime/threadSort.test.ts, converted to V2's latestRun.
#13761 renderer trace proxy stops tracing itself A untracedRequestsLayer is added last in V2's makeRoutesLayer, after V2's MCP wiring.
#13765 background sweeps only read threads that can still settle P / S for settlement Settlement is superseded: getSettlementCandidates already filters settled, pinned, archived and busy threads in SQL (ProjectionStore.ts, #13691 port). PR discovery was not: its minutely sweep read every thread, active and archived. getShellSnapshot gains unsettledOnly (SQL and memory store), and discovery reads active, unsettled threads unless backfill is pending, as on main. 11acae1f2f
#13767 saving the thread list cache no longer freezes the UI S / D Main skips Schema encoding for thread shells because V1 shells are already in encoded form. V2 shells hold DateTime values, so that shortcut would write the wrong format. V2 encodes through its V2 cache schema, and mobile already yields during large saves (apps/mobile/src/connection/shell-cache-encoding.ts, #12117). Main's IndexedDB abort listener fix is kept. D: the V2 web encoder still does not yield (see memory notes).
#13774 idle wakeups from Connect relay and session reaper A (relay, in merge) / S (reaper) Relay: V2 keeps its publish worker and drain, and adds main's unlinked backoff (5s → 60s) and requestCatchUp, which cloud/http now calls. Main's three catch-up tests are rewritten against V2's relay harness. Reaper: V1 ProviderSessionReaper is deleted, and V2 has no polling reaper; idle release is one timer per live session (ProviderSessionManager.ts scheduleIdleReleaseInternal). The repository's new excludeStopped option merged; V2's only list() caller (AgentSessionImporter) needs stopped rows. in 8119814a66
#13807 trailing underscores and tildes in URLs A Mobile patch.
#13764 queued messages send while their thread isn't open S V2 deleted the client-side queue (queuedMessageStore, f7a764c8ee). Queued messages are server runs, and Orchestrator.startNextQueuedRun starts the next queued run when a run ends, whether or not any client has the thread open. resumeQueuedRuns also recovers them after restart. Main's QueuedMessageSender, sendQueuedMessage and root mount are not taken.
#13812 background git fetches no longer fill the disk A vcs/GitVcsDriverCore is shared with V2.

Migrations

Second batch: main still has no new migration (latest 054), and its only contract change is keybindings.ts (new commands and usagePageOpen, all additive). Both upgrade paths are unchanged, and the migration and import tests still pass.

At merge time, and rechecked against origin/main at 2679d279ce: main has no new migration files. Its latest is still 054_ProjectionThreadsAutoSettleDisabledAt, and V2 adds 055_OrchestrationV2 and 056_RemoveRedundantProjectionIndexes, so numbers don't collide. No migration was added here.

  1. V1 users (at 054) upgrading to V2. 055 and 056 run in order. Main changed no V1 projection table or column, so LegacyV1ThreadImporter and LegacyV1Cutover see the same schema they were written against. Main's Sqlite.ts change is a WAL checkpoint after large writes, which only helps the import. The 055/056 migration tests and the LegacyV1Cutover/Importer tests pass.
  2. V2 users (at 056) upgrading. Nothing re-runs or reorders. The new getThreadsWithPullRequests and the getSettlementCandidates filter only read existing V2 columns (payload_json, deleted_at, updated_at) and need no index change.
  3. Contracts decode. ClientSettings.chatWidth and ServerSettings.cursorKeychainUsageEnabled both have decoding defaults, so stored V2 settings still decode. usage.ts bumps USAGE_CONTRACT_VERSION to 6 with added provider literals and optional fields. Usage is computed per request, not stored. The editor.ts change edits a static list only.

V2 changes altered during conflict resolution

  • bin.ts: kept V2's thin entry. Main's command list edit went into binCli.ts (port commit).
  • server.ts: kept V2's layer graph and added ReplayMarkers.layer. The PR sync worker now also gets ProjectionStoreV2.layer (from the perf(server): pull request sync reads only threads with linked pull requests #13704 port).
  • V1 ProjectionSnapshotQuery (still in V2): dropped the whole-snapshot decode (perf(server): build the thread list snapshot without decoding it twice #13693). Did not add listThreadsWithPullRequests.
  • CursorDriver.ts / cursorUsageLimits.ts: kept V2's SDK-based driver and passed main's cursorKeychainUsageEnabled through. Main's provider/cursorCredentialStore.ts differs only by case from V2's provider/CursorCredentialStore.ts: tsc fails with TS1149, and it would break on macOS. It is renamed to provider/cursorKeychainToken.ts, with its test and imports updated. Main's Cursor usage tests moved from the V1-shaped CursorProvider.test.ts into V2's cursorUsageLimits.test.ts, with labels updated to main's "Overall / Cursor Models / Other Models".
  • apps/web/.../usage/usageProviders.ts: kept V2's driverKind-based presentation instead of main's mark icons, and added cursor, opencode and antigravity in V2's shape.
  • packages/client-runtime/.../server.ts: kept V2's searchAcpRegistry. The single usageSummary atom now uses main's usageScanSettingsAtom trigger.
  • MessagesTimeline*, ChatComposer, ComposerSurface, ChatView: kept V2's chat-content-lane markup and dropped main's TimelineLoadEarlierHeader, which V2 already removed. The drawer keeps V2's shell-only read.
  • SettingsPanels.tsx: both rows kept (V2's composer-context row and main's chat-width row).
  • scripts/lib/cli-external-packages.test.ts: the expected list now has both @cursor/sdk (V2) and @napi-rs/keyring (main).
  • Files V2 deleted and main modified: all kept deleted. The main-side changes are ported where they matter (above). These are the V1 ClaudeAdapter, ProviderService, ProviderCommandReactor, ThreadSettlementReactor, ThreadPullRequestReactor, and OrchestrationEngine/ProjectionSnapshotQuery/ProviderSessionReaper tests, plus bin.test.ts, server.test.ts, and integration/OrchestrationEngineHarness.
  • V2 test fixtures that mocked V1 ProjectionSnapshotQuery kept V2's versions. The one auto-merged mock that gained listThreadsWithPullRequests (AgentSessionScanner.test.ts) had it removed.

Second batch

  • AgentAwarenessRelay: the service has both drain (V2) and requestCatchUp (main). cloud/http.test stubs drain.
  • server.ts: untracedRequestsLayer goes after V2's MCP route layer.
  • Sidebar.logic.ts: V2's sortSettledThreadsForSidebar is removed in favor of main's shared sortSettledThreads.
  • KeybindingsSettings.logic.ts: usage.open is ranked (port commit).
  • OpenCodeAdapterV2: no placeholder session title (port commit).
  • Docs: composer.md keeps V2's server-queue text; main's Antigravity video line merged and is true for V2. providers-antigravity.md is rewritten for V2's path-based attachments.
  • Not taken from main: QueuedMessageSender, sendQueuedMessage, queuedMessageStore, encodeShellSnapshotForCache and its test, and the unsettledOnly plumbing on V1 ProjectionSnapshotQuery (V2 has no caller for it).
  • Cursor rename still needed. Main still ships lowercase provider/cursorCredentialStore.ts, and batch 2 did not touch it, so V2 keeps it as cursorKeychainToken.ts.

V2 memory and CPU hotspots worth a follow-up (not fixed here)

  1. V1 engine still resident. orchestration-v2/runtimeLayer.ts:86,305 wires OrchestrationLayerLive, whose OrchestrationEngine hydrates a full in-memory V1 read model at boot (orchestration/Layers/OrchestrationEngine.ts:344-345) and keeps it for the process lifetime. The only user is ProjectService's V1 commands. This is probably the largest fixed memory cost in V2.

  2. Unbounded event buffers. EventSink.ts:200 (live PubSub) and :626 (one unbounded PubSub per event type, never removed). ProviderSessionManager.ts:1219 has one unbounded queue per session subscriber. A slow consumer, such as a stalled streamDomainEvents subscriber, buffers without limit.

  3. Adapter maps that grow per item and are cleared only on reset.

    • ClaudeAdapterV2.ts:2788 itemOrdinals is copied (new Map(current)) on every new item and never pruned. That is O(items) memory and O(items²) copying over a long session.
    • The same pattern exists in CursorAdapterV2, AcpAdapterV2, and CodexAdapterV2.ts:1639 planDeltas, which keeps the full plan text per item.
  4. Shell stream per streaming delta. Every V2 event, including turn-item deltas, becomes a shell event. Each busy thread then costs one heavy getThreadShell query per 50ms window per client. On the client, each thread.updated maps the whole thread array (client-runtime/state/shellReducer.ts:7) and rebuilds the thread index (threadShell.ts:71). This is the client-side counterpart of perf(server): stop remapping every thread on each thread event #13720.

  5. Remaining full-shell reads on background paths. relay/AgentAwarenessRelay.ts:689, CheckpointRestoreSafety.ts:28 (reads the full shell, then checkpoint context for every other thread), ThreadManagementService listProjectThreads, and the minutely full sweeps in both settlement and PR discovery.

  6. Unbounded, non-deduplicating worker queues. DrainableWorker does not merge repeated requests, so a burst of run.updated events queues one sweep per event even after perf(server): per-thread settlement and PR checks no longer rebuild the whole thread list #13691.

  7. Small leaks.

    • assistantStreaming.ts:93: the per-message buffer is removed only on a final update, so interrupted streams leave it behind.
    • CheckpointService.ts:252: one semaphore per working directory, never removed.
  8. Web shell cache encode (perf(clients): saving the thread list cache no longer freezes the UI #13767 counterpart). apps/web/src/connection/storage.ts encodes the whole V2 shell snapshot through Schema in one go on every save. Mobile yields every 32 rows; the web path doesn't, so a large thread list can still stall a web frame on save.

Please check these (riskiest calls)

  1. Merge instead of rebase (see the top of this description).
  2. fix(terminal): settling a thread closes its idle shells #13673 port location. Idle-shell cleanup lives in ThreadSettlementServiceV2 as a domain-event reaction, not as an effect in the V2 outbox. It is not replayed after a crash, which matches main's reactor. An outbox effect would need a new effect type and more machinery.
  3. Cursor file rename. Main's cursorCredentialStore.ts is now cursorKeychainToken.ts on this branch. The next main merge will conflict on it again unless main renames it too.
  4. perf(server): pull request sync reads only threads with linked pull requests #13704 port adds a projection-store method instead of reusing main's V1 query. Main's query reads a table V2 no longer writes.
  5. Comfortable chat width stays at V2's 46rem instead of main's 48rem.
  6. Terminal drawer keeps V2's shell-only read. Archived V2 threads get no drawer thread data, which V2 already accepted before this merge.

Second batch:
7. #13764 superseded. V2 drains queued runs on the server, so a thread nobody has open still sends. I confirmed this in code, not in a live run.
8. #13368 drops the placeholder title but does not forward hand-renamed titles.
9. #13767 not ported. The V2 web cache encode is untouched (memory note 8).
10. #13765 port. The PR discovery sweep now reads unsettled-only unless backfill is pending. A settled thread whose PR changes waits for backfill or a per-thread event, as on main.

Verification

Second batch, on head b049c24:

  • tsc --noEmit: server, contracts, client-runtime, effect-acp, web, mobile all report 0 error TS and 0 warning TS.
  • vp run knip:check: passes.
  • Replay suite plus 055/056 migration and LegacyV1Cutover/Importer tests: 7 files, 105 tests, all pass.
  • Port tests: I reverted each production change and confirmed its new test fails.
    • KeybindingsSettings.logic.test.ts (Usage order)
    • ProjectionSettlement.test.ts (unsettled-only SQL/memory parity)
    • ThreadPullRequestService.test.ts (periodic sweep is unsettled-only after backfill)
    • OpenCodeAdapterV2.test.ts (no session title)
  • Merged areas: 16 server files (345 tests: relay, cloud http, projection pipeline, trace diagnostics, git, port scanner, Antigravity support, Cursor), 17 web files (588 tests), 2 client-runtime files (41 tests), all pass.

First batch:

  • tsc --noEmit: server, web, mobile, client-runtime, contracts, effect-acp all report 0 error TS and 0 warning TS.
  • vp run knip:check: passes.
  • Migrations and import: 055_OrchestrationV2*.test.ts (3 files), 056_RemoveRedundantProjectionIndexes.test.ts, LegacyV1Cutover.integration.test.ts, LegacyV1ThreadImporter.test.ts, Sqlite.test.ts all pass.
  • Replay: OrchestratorReplayFixtures.integration.test.ts, 93/93 pass.
  • Ports:
    • ThreadSettlementService.test.ts (new settle-terminal and single-thread tests), ThreadPullRequestService.test.ts (new one-thread-read and refresh tests), PullRequestSyncReactor.test.ts (asserts no shell read), ProjectionSettlement.test.ts (new SQL/memory parity test for getThreadsWithPullRequests), cli/trace.test.ts all pass.
    • I reverted each new test's production change and confirmed the test fails, then restored it.
  • Merged areas:
    • Server: cursor, usage, observability, terminal, VCS, CLI, auth, project, and runtime-startup test files, 34 files, all pass.
    • Web: 15 files (MessagesTimeline, BranchToolbar, ThreadDetailsPanel, settings, usage, keybindings, markdown-clipboard), 436 tests, all pass.
    • Other: client-runtime usage, contracts settings, and 8 shared test files all pass.
  • scripts/build-desktop-artifact.test.ts has 15 failures, and they are pre-existing. The same 15 fail with V2 HEAD's versions of the file on this machine (asar unpack under the custom TMPDIR).
  • Not run: repo-wide suites, the desktop build, and any browser, device, or live-provider run.

Model: Claude Opus 5.5 (Claude Code)

🤖 Generated with Claude Code


Devin Review

dominic-r and others added 30 commits September 25, 2026 11:24
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
The Linux release build now also makes a .deb in the same electron-builder
run as the AppImage, and the release publishes it. electron-builder lists it
in latest-linux.yml and writes resources/package-type into it, so the app
updates a .deb install through electron-updater, which installs the new .deb
with dpkg. The desktop updater now allows that path.

The .deb uses xz in threaded mode (XZ_DEFAULTS=-T0): 113 MB in place of
141 MB with gzip. The Linux arm64 release job moves to a 16-vCPU Blacksmith
arm64 runner. The download page, README, install guide, and release docs
list the .deb.

Based on community work in #4071, #5139, #4900, and #4887.

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

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

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
…rotocol variables (#13492)

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…and WSL backends (#13641)

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
)

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
)

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

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

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Bil0000 and others added 20 commits September 26, 2026 03:09
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ents, and idle polls (#13756)

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…g into memory (#13763)

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ates per comparison (#13759)

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

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

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

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

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…th failed repacks (#13812)

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Brings in the V2 bug-hunt fixes merged since this branch was cut
(#13541, #13775, #13786, #13793, #13796, #13802). No conflicts.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Merges origin/main (95030dc), the 18 commits after a21b42c.

Conflict resolutions that change V2 code:
- AgentAwarenessRelay: keep V2's publish worker and drain, add main's
  unlinked backoff and requestCatchUp (cloud/http now wakes it). Main's
  catch-up tests are rewritten against V2's relay harness.
- server.ts: keep V2's MCP route wiring, add main's untracedRequestsLayer last.
- Sidebar: V2's sortSettledThreadsForSidebar is dropped for main's shared
  sortSettledThreads (client-runtime, same resolver); its tests moved there
  and use V2's latestRun.
- #13767 cache encode shortcut: not taken. It relies on V1 shells being in
  encoded form; V2 shells hold DateTime values and V2 already encodes
  cooperatively (mobile shell-cache-encoding, #12117). Main's IndexedDB
  "abort" listener fix is kept.
- #13764 queued sends: main's client-side QueuedMessageSender and
  queuedMessageStore stay deleted; V2 queues runs on the server
  (Orchestrator startNextQueuedRun), which already drains unopened threads.
- #13765 / #13756: V1 ProjectionSnapshotQuery and ProjectionPipeline keep
  V2's versions except main's skip of empty attachment-cleanup spans.
- Docs: composer.md keeps V2's queue text; keybindings.md adds
  usagePageOpen to V2's list.
- Deleted-in-V2 V1 files that main modified stay deleted.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…the binding order

Main's keybindings settings rank the Usage page commands by the page's own
order but left usage.open unranked. An unranked command fell back to an
alphabetical compare, so the comparator was inconsistent and the list
order depended on the input order. With V2's extra default bindings
(threadPanel.toggle, composer.sendAlternate, ...) the settings list put
Open between Tokens and Limits, and main's own test failed on this branch.
usage.open now ranks first, and the test checks both input orders.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…threads that can still settle

Main's periodic discovery and settlement sweeps stopped reading settled
threads. V2's settlement sweep already reads candidates only
(getSettlementCandidates filters settled, pinned, archived, and busy
threads in SQL), but V2's PR discovery ran a full getShellSnapshot every
minute: every thread, active and archived, settled or not, with every
thread's run, item, and session subqueries. Discovery then dropped
archived and settled threads unless they were in backfill.

getShellSnapshot takes an `unsettledOnly` option (SQL and memory store),
and the periodic discovery sweep reads active, unsettled threads unless a
backfill pass is pending, as on main. A pending backfill entry for a
thread with no branch is cleared so it cannot keep every pass on the
full read.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
OpenCode generates a session title from the first prompt only when
session.create leaves the title unset (SessionPrompt.ensureTitle). Main
stopped forwarding prompt-seeded titles from the V1 ProviderCommandReactor,
which V2 deleted. V2's OpenCode adapter sent a placeholder title,
"T3 Code <threadId>", on every session.create, so every V2 OpenCode
session in OpenCode's own UI and history was named after an id.

session.create no longer sends a title. Main also forwards a title the
user renamed by hand. V2 has no title-provenance field on the thread and
never sent the thread title, so that part is left out.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…path

Main's #13339 changed V1's Antigravity adapter to pass unsupported files by
path, and the merge brought its doc text, which describes V1's native
PDF, text, and audio limits. V2's Antigravity runs through AcpAdapterV2,
which embeds only images and passes every other attachment as a saved
path (AttachmentPrompt.providerMessageTextWithAttachmentPaths), with reads
confined by AntigravityClientFiles. The V1 support code merged but has no
V2 caller. The provider page now describes V2's behavior.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Brings in the V2 bug-hunt fixes merged while this PR was refreshed
(#13787, #13789, #13790, #13797, #13805, #13806). No conflicts.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@github-actions github-actions Bot added the 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. label Sep 26, 2026
<span className="flex min-w-0 items-center gap-2 text-sm text-foreground">
<span
aria-hidden
className="size-2 shrink-0 rounded-full"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Tailwind ownership: this Cursor swatch uses a static inline color. Please put bg-[#8b8b8b] on the owning element instead.

Suggested change
className="size-2 shrink-0 rounded-full"
className="size-2 shrink-0 rounded-full bg-[#8b8b8b]"

Posted via Macroscope — UI Consistency

@macroscopeapp

This comment has been minimized.

@macroscopeapp

This comment has been minimized.

@macroscopeapp

This comment has been minimized.

@macroscopeapp

This comment has been minimized.

@macroscopeapp

This comment has been minimized.

@juliusmarminge
juliusmarminge merged commit 0b4f386 into t3code/codex-turn-mapping Sep 26, 2026
25 checks passed
@juliusmarminge
juliusmarminge deleted the v2/rebase-onto-main-20260926 branch September 26, 2026 19:03
juliusmarminge added a commit that referenced this pull request Sep 26, 2026
#13800 brought main up to 95030dc into V2, but its squash merge dropped
main as a parent, so GitHub still diffed #2829 against the old merge base
and reported conflicts. This records 95030dc as merged; the tree is
unchanged because #13800 already contains those commits and their ports.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
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 1,000+ changed lines (additions + deletions). 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.