Skip to content

fix(server): thread list builds metadata only for the page it returns - #36434

Merged
juliusmarminge merged 1 commit into
mainfrom
factory/issue-36416
Nov 13, 2026
Merged

juliusmarminge merged 1 commit into
mainfrom
factory/issue-36416

Conversation

@juliusmarminge

@juliusmarminge juliusmarminge commented Nov 13, 2026 •

Copy link
Copy Markdown
Member

No rework was requested and none was needed. PR #36434 at 71d8526: all 8 required checks passed, Macroscope approved it with no comments on lines, CodeRabbit had not reviewed it, and the thread-transfer report says it stays within every enforced limit. The fix itself is unchanged: t3_thread_list reads a light index of active threads (ProjectionStore.listActiveThreads), applies the lineage, settled, title and page filters to it, and builds full shells only for the page's thread ids. Status and snoozed filters still need shell data, so they build shells only for the candidates left after the cheap filters.

Fixes #36416

Reproduction on main

Commit 48cdefe (origin/main). Started the real server with T3CODE_DEV_SEED=0 node src/bin.ts serve --base-dir <scratch> --port 39416 --host 127.0.0.1 <scratch git repo> (fresh database), added the project with t3 project add, and issued an MCP-client token (t3 auth session issue --subject mcp-client) and a regular bearer token. A scratch driver (https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/97f4a39ec20cc686/driver.mjs) created empty threads through the server's own /ws?orchestrationProtocol=2 RPC (orchestration.dispatchCommand with thread.create, no provider turns), then called the MCP tool t3_thread_list with {projectId, limit: 1} over /mcp three times. One-row list latency: 5 threads 16-28 ms; 500 threads 23-30 ms; 2,000 threads 65-80 ms. Each call returned rows=1 with the matching total. In server.trace.ndjson at 2,000 threads, OrchestratorV2.getShellSnapshot took 56.4 ms of OrchestratorMcpService.listThreads' 57.8 ms (and 65.3 of 66.3 ms on the next call), with about 9 MB of heap growth for one returned row. The threads were empty, so the absolute times are small; the cost grows with the number of active threads, not the page size, and per-thread history makes each shell row more expensive at the reporter's scale.

Evidence

Run each real server on a fresh database with seeding disabled. Create synthetic empty threads through thread.create RPC, then call MCP t3_thread_list with projectId and limit=1 seven times at each size. All responses returned one row and the correct total. Environment: Linux x86_64, Node 26, loopback HTTP; no provider turns.

Before After
36f011dfb7 71d852672f
Before: real MCP responses After: real MCP responses
Before recording After recording

Initial benchmark median latency, 7 requests per size: 5 threads: 21.0 → 20.8 ms; 500: 48.9 → 18.4 ms; 2000: 125.3 → 15.9 ms; 10000: 374.8 → 69.7 ms. At 10000 threads, server traces show median getShellSnapshot duration falling from 365.8 to 2.9 ms. Head's lightweight index scan still costs a median 55.3 ms, so total latency is reduced rather than constant.

Measured scaling

Driver · Reproduction scripts, measurements, recording events and selected trace spans. Recordings capture seven additional requests after restarting each server on its own synthetic database; their values differ from the initial scaling benchmark. Terminal views render actual stdout as it arrives, not a web UI.

Not shown:

  • The reporter's 27 GB database, history-heavy threads and absolute 25-second latency were not reproduced; evidence uses up to 10000 empty synthetic threads.
  • Strictly constant total listing cost is not achieved: head still scans a lightweight index, and median latency grows from 20.8 ms at 5 threads to 69.7 ms at 10000.
  • Status/snoozed filters, CLI listing and other filter combinations were not exercised; proof covers the reported unfiltered MCP limit=1 path.

Tests

No new commands this round; the branch is unchanged. CI: all 8 required checks passed on 71d8526. From the previous round: vp run check:changed passed (format, lint, knip, graphql, typecheck, tests in 11 files), and the targeted vp test run over 5 server test files passed 163 tests.

Not in this change

  • With statuses or snoozed filters, listThreads still builds shells for every candidate left after the cheap filters, because status and snooze state are derived from shell data. Making those filters fully page-bounded would need status and snooze in SQL or a stored column.
  • listActiveThreads still reads one row per active thread in scope (about 16-23 ms for 2,000 rows) so total can be computed; moving the filters and LIMIT into SQL would need SQL-side title matching that keeps toLocaleLowerCase semantics.
  • With statuses or snoozed filters, listThreads still builds shells for every candidate left after the cheap filters, because status and snooze state come from shell data.
  • listActiveThreads still reads one row per active thread in scope so it can compute total; moving the filters and LIMIT into SQL would need SQL-side title matching that keeps the toLocaleLowerCase behavior.

Who did the work

  • Written by Claude Opus 5.5, in Claude Code
  • Reviewed by GPT-6.1 Sol, in Codex, and by Claude Opus 5.5, each on its own
  • Proof captured by GPT-6.1 Sol and checked by Claude Opus 5.5

Run by the t3code factory in T3 Code.

t3_thread_list (and `t3 thread list`) built a full shell for every active
thread in scope before filtering and slicing the page, so a one-row list
cost grew with the total thread count and history.

Listing now reads a light index of active threads (id, project, title,
lineage, settlement, snooze end, updatedAt), applies the lineage, settled,
title and page filters to it, and builds shells only for the page. Status
and snoozed filters still need shell state, so they build shells only for
the candidates left after the cheap filters.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@github-actions github-actions Bot added vouch:trusted Author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Nov 13, 2026
@macroscopeapp

macroscopeapp Bot commented Nov 13, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 71d8526

Macroscope's review found this PR approvable — Thread listing now reads lightweight entries first and builds detailed metadata only for the needed page when filters permit. The change is confined to read-side performance, with no changes to product defaults or persistent data.

You can add or adjust custom eligibility rules. Learn more.

@github-actions

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ℹ️ The exact PR base did not have a successful artifact. Baseline uses the latest successful main measurement shown below.

Provider Metric Main baseline This PR Impact PR ceiling
Codex Total thread wire 5.0 KiB 5.0 KiB 0 B (0.0%) 6.8 KiB ✅
Codex Thread snapshot wire 3.8 KiB 3.8 KiB 0 B (0.0%) 4.9 KiB ✅
Codex Live turn WebSocket wire 1.2 KiB 1.2 KiB 0 B (0.0%) 2.0 KiB ✅
Codex Live turn WebSocket decoded 21.5 KiB 21.5 KiB 0 B (0.0%) 24.4 KiB ✅
Codex Live turn messages 1 1 0 (0.0%) 8 ✅
Claude Total thread wire 5.0 KiB 5.0 KiB 0 B (0.0%) 6.8 KiB ✅
Claude Thread snapshot wire 3.8 KiB 3.8 KiB 0 B (0.0%) 4.9 KiB ✅
Claude Live turn WebSocket wire 1.2 KiB 1.2 KiB 0 B (0.0%) 2.0 KiB ✅
Claude Live turn WebSocket decoded 21.9 KiB 21.9 KiB 0 B (0.0%) 24.4 KiB ✅
Claude Live turn messages 1 1 0 (0.0%) 8 ✅

Other scenarios

All 64 scenario measurements match main.

All 64 scenario measurements
Provider Scenario Metric Main baseline This PR Impact PR ceiling
Codex short turn resume WebSocket decoded 10.5 KiB 10.5 KiB 0 B (0.0%) 12.7 KiB ✅
Codex short turn resume WebSocket messages 2 2 0 (0.0%) 2 ✅
Codex long turn running, cold open HTTP decoded 281.7 KiB 281.7 KiB 0 B (0.0%) 302.7 KiB ✅
Codex long turn running, cold open rows 75 75 0 (0.0%) 75 ✅
Codex long turn running, history page HTTP decoded 92.4 KiB 92.4 KiB 0 B (0.0%) 107.4 KiB ✅
Codex long turn running, history page rows 75 75 0 (0.0%) 75 ✅
Codex long turn finished, cold open HTTP decoded 381.5 KiB 381.5 KiB 0 B (0.0%) 410.2 KiB ✅
Codex long turn finished, cold open rows 151 151 0 (0.0%) 151 ✅
Codex long turn finished, socket cold open WebSocket decoded 381.6 KiB 381.6 KiB 0 B (0.0%) 410.2 KiB ✅
Codex long turn finished, socket cold open WebSocket messages 2 2 0 (0.0%) 2 ✅
Codex long turn finished, socket cold open rows 151 151 0 (0.0%) 151 ✅
Codex long turn finished, work page HTTP decoded 186.2 KiB 186.2 KiB 0 B (0.0%) 200.2 KiB ✅
Codex long turn finished, work page rows 150 150 0 (0.0%) 150 ✅
Codex idle thread resume WebSocket decoded 65 B 65 B 0 B (0.0%) 200 B ✅
Codex idle thread resume WebSocket messages 1 1 0 (0.0%) 1 ✅
Codex fleet shell snapshot HTTP decoded 42.4 KiB 42.4 KiB 0 B (0.0%) 53.7 KiB ✅
Codex fleet shell snapshot rows 27 27 0 (0.0%) 27 ✅
Codex fleet shell subscribe WebSocket decoded 65 B 65 B 0 B (0.0%) 200 B ✅
Codex fleet shell subscribe WebSocket messages 1 1 0 (0.0%) 1 ✅
Codex fleet shell resume check HTTP decoded 18 B 18 B 0 B (0.0%) 100 B ✅
Codex fleet shell resume check rows 0 0 0 0 ✅
Codex stale shell reload HTTP decoded 42.4 KiB 42.4 KiB 0 B (0.0%) 53.7 KiB ✅
Codex stale shell reload rows 27 27 0 (0.0%) 27 ✅
Codex stale shell resume WebSocket decoded 140 B 140 B 0 B (0.0%) 400 B ✅
Codex stale shell resume WebSocket messages 2 2 0 (0.0%) 2 ✅
Codex stale todo list cold open HTTP decoded 72.4 KiB 72.4 KiB 0 B (0.0%) 83.0 KiB ✅
Codex stale todo list cold open rows 75 75 0 (0.0%) 75 ✅
Codex stale todo list cold open nodes 2 2 0 (0.0%) 4 ✅
Codex stale todo list cold open subagents 2 2 0 (0.0%) 4 ✅
Codex stale todo list cold open plans 1 1 0 (0.0%) 2 ✅
Codex stale todo list cold open providerTurns 1 1 0 (0.0%) 2 ✅
Codex stale todo list cold open checkpoints 1 1 0 (0.0%) 2 ✅
Claude short turn resume WebSocket decoded 10.6 KiB 10.6 KiB 0 B (0.0%) 12.7 KiB ✅
Claude short turn resume WebSocket messages 2 2 0 (0.0%) 2 ✅
Claude long turn running, cold open HTTP decoded 283.3 KiB 283.3 KiB 0 B (0.0%) 302.7 KiB ✅
Claude long turn running, cold open rows 75 75 0 (0.0%) 75 ✅
Claude long turn running, history page HTTP decoded 93.4 KiB 93.4 KiB 0 B (0.0%) 107.4 KiB ✅
Claude long turn running, history page rows 75 75 0 (0.0%) 75 ✅
Claude long turn finished, cold open HTTP decoded 384.2 KiB 384.2 KiB 0 B (0.0%) 410.2 KiB ✅
Claude long turn finished, cold open rows 151 151 0 (0.0%) 151 ✅
Claude long turn finished, socket cold open WebSocket decoded 384.3 KiB 384.3 KiB 0 B (0.0%) 410.2 KiB ✅
Claude long turn finished, socket cold open WebSocket messages 2 2 0 (0.0%) 2 ✅
Claude long turn finished, socket cold open rows 151 151 0 (0.0%) 151 ✅
Claude long turn finished, work page HTTP decoded 188.1 KiB 188.1 KiB 0 B (0.0%) 200.2 KiB ✅
Claude long turn finished, work page rows 150 150 0 (0.0%) 150 ✅
Claude idle thread resume WebSocket decoded 66 B 66 B 0 B (0.0%) 200 B ✅
Claude idle thread resume WebSocket messages 1 1 0 (0.0%) 1 ✅
Claude fleet shell snapshot HTTP decoded 43.0 KiB 43.0 KiB 0 B (0.0%) 53.7 KiB ✅
Claude fleet shell snapshot rows 27 27 0 (0.0%) 27 ✅
Claude fleet shell subscribe WebSocket decoded 66 B 66 B 0 B (0.0%) 200 B ✅
Claude fleet shell subscribe WebSocket messages 1 1 0 (0.0%) 1 ✅
Claude fleet shell resume check HTTP decoded 18 B 18 B 0 B (0.0%) 100 B ✅
Claude fleet shell resume check rows 0 0 0 0 ✅
Claude stale shell reload HTTP decoded 43.0 KiB 43.0 KiB 0 B (0.0%) 53.7 KiB ✅
Claude stale shell reload rows 27 27 0 (0.0%) 27 ✅
Claude stale shell resume WebSocket decoded 140 B 140 B 0 B (0.0%) 400 B ✅
Claude stale shell resume WebSocket messages 2 2 0 (0.0%) 2 ✅
Claude stale todo list cold open HTTP decoded 73.4 KiB 73.4 KiB 0 B (0.0%) 83.0 KiB ✅
Claude stale todo list cold open rows 75 75 0 (0.0%) 75 ✅
Claude stale todo list cold open nodes 2 2 0 (0.0%) 4 ✅
Claude stale todo list cold open subagents 2 2 0 (0.0%) 4 ✅
Claude stale todo list cold open plans 1 1 0 (0.0%) 2 ✅
Claude stale todo list cold open providerTurns 1 1 0 (0.0%) 2 ✅
Claude stale todo list cold open checkpoints 1 1 0 (0.0%) 2 ✅

Baseline: c8db8be · PR result: 71d8526 · 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.

@coderabbitai

coderabbitai Bot commented Nov 13, 2026 •

Copy link
Copy Markdown
Contributor

Explain Change →

No actionable comments were generated in the recent review.

Walkthrough

Thread listing now applies record-level filters before shell loading. When status and snooze filters are absent, it loads shells only for the requested page. The orchestration v2 projection store now lists active-thread entries with an optional project filter.

Changes: Thread Listing

Layer / File(s) Summary
Active-thread projection
apps/server/src/orchestration-v2/ProjectionStore.ts
The projection store defines active-thread list entries, centralizes lineage decoding, and lists non-deleted, non-archived threads with an optional project filter.
Active-thread listing integration
apps/server/src/orchestration-v2/Orchestrator.ts, apps/server/src/orchestration-v2/ThreadManagementService.ts, apps/server/src/orchestration-v2/ProviderTurnControlService.test.ts
OrchestratorV2 forwards active-thread listing to the projection store. ThreadManagementService uses the new method and retains its lineage filtering and ordering.
MCP thread-list pagination
apps/server/src/mcp/OrchestratorMcpService.ts, apps/server/src/mcp/OrchestratorMcpService.test.ts, apps/server/src/mcp/toolkits/core.test.ts, apps/server/src/peer/PeerForwarding.test.ts
MCP thread listing filters project records before shell loading. When status and snooze filters are absent, it loads shells only for the requested page. Tests verify the page total, cursor, and requested shell IDs.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Change: Bug fix · Severity of issue fixed: Medium

Suggested reviewers: t3dotgg, yash-singh1

Merge Risk: Minimal · up to 71d85

Thread listing now avoids building metadata for every thread when only one page is requested, which should cut latency on large databases. Status and snoozed filters are still not page-bounded. No merge-blocking risk was identified.

Pre-merge checks: Passed 4

Check name Status Explanation
Title check Passed The title names the main change: thread list metadata (shells) is now built only for the page it returns. It matches the raw summary, where listThreads loads shells only for the requested page when st…
Linked Issues check Passed Issue #36416 asks that thread listing apply filters and the page limit before building thread shells, and that list metadata not recount full histories. The reviewed summary shows this behavior in the…
Out of Scope Changes check Passed All changed files relate to the listing objective:
- OrchestratorMcpService.ts and its test: the listThreads change and its test.
- ProjectionStore.ts and Orchestrator.ts: the new listActiveThreads in…
Description check Passed The description states the problem, the reproduction on main, the change and its mechanism, and the verification. It links issue #36416 and covers scope, validation evidence, limitations, and attribut…
Full details: Title check

Explanation

The title names the main change: thread list metadata (shells) is now built only for the page it returns. It matches the raw summary, where listThreads loads shells only for the requested page when status and snooze filters are absent. The title uses a conventional commit prefix and plain language. It does not mention the new listActiveThreads index, but it is not required to cover every detail.

Full details: Linked Issues check

Explanation

Issue #36416 asks that thread listing apply filters and the page limit before building thread shells, and that list metadata not recount full histories. The reviewed summary shows this behavior in the following changes:

  1. ProjectionStore.listActiveThreads (new) reads a light per-thread index. It reads thread rows and payload fields only (lineage, settledOverride, settledAt, snoozedUntil). It does not read per-thread history.
  2. ThreadManagementService.listProjectThreads calls orchestrator.listActiveThreads, so the project filter and lineage filter run before any shell is built.
  3. OrchestratorMcpService.listThreads applies the settled and title filters and the cursor/limit slice to index entries. It calls getShellSnapshot with threadIds for the page only, when no status or snoozed filter is set. The new test 'builds shells only for the threads on the page' covers this.

With status or snoozed filters, shells are built for the remaining candidates. Those filters depend on shell-derived state (activity run, background work, pending requests), so this is an inherent limit. The PR describes it. The remaining linear read is over active thread rows, not history, which matches the issue's request to decouple list cost from history size. Reported tests and the runtime measurements are consistent with this design. The Evidence section is still pending, but it is not a coding requirement.

Full details: Out of Scope Changes check

Explanation

All changed files relate to the listing objective:

  • OrchestratorMcpService.ts and its test: the listThreads change and its test.
  • ProjectionStore.ts and Orchestrator.ts: the new listActiveThreads index read and its exposure through OrchestratorV2. The lineage decoder moved to shared helper shellIndexLineage, which is a supporting refactor for the new method.
  • ThreadManagementService.ts: switches listProjectThreads to the new index and removes the unused shell type import.
  • core.test.ts, ProviderTurnControlService.test.ts, PeerForwarding.test.ts: test mocks updated for the new or changed methods (getShellSnapshot, listActiveThreads).

No unrelated behavior change is shown in the summary.

Full details: Description check

Explanation

The description states the problem, the reproduction on main, the change and its mechanism, and the verification. It links issue #36416 and covers scope, validation evidence, limitations, and attribution. The required template sections are present and substantively filled in. The main weakness is length and repetition. Two bullets in "Not in this change" are duplicates. The description also leans on external links for evidence. The Problem section is only implied by the opening paragraph and the reproduction text, not stated as a clear problem statement. The Scope section cites an issue but does not explicitly confirm it is a bug fix rather than a feature. Overall the description is mostly complete.

Finishing Touches

Generate unit tests (beta)

  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts
Recent review info

Run configuration

Commits

Reviewing files that changed from the base of the PR and between aaa3dba and 71d8526.

Files selected for processing: 8

  • apps/server/src/mcp/OrchestratorMcpService.test.ts
  • apps/server/src/mcp/OrchestratorMcpService.ts
  • apps/server/src/mcp/toolkits/core.test.ts
  • apps/server/src/orchestration-v2/Orchestrator.ts
  • apps/server/src/orchestration-v2/ProjectionStore.ts
  • apps/server/src/orchestration-v2/ProviderTurnControlService.test.ts
  • apps/server/src/orchestration-v2/ThreadManagementService.ts
  • apps/server/src/peer/PeerForwarding.test.ts

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 0 remain after this review.

@juliusmarminge
juliusmarminge merged commit b537916 into main Nov 13, 2026
36 checks passed
@juliusmarminge
juliusmarminge deleted the factory/issue-36416 branch November 13, 2026 23:13
amv146 added a commit to amv146/t3code that referenced this pull request Nov 14, 2026
* fix(server): Claude can show the user mid-turn text in full (pingdotgg#36384)

* fix(cli): tagged source builds report the release version (pingdotgg#36350)

Co-authored-by: Lakshmi Tanmay <[email protected]>

* fix(server): storage cleanup prunes idle No project folders under ~/.t3/scratch (pingdotgg#36369)

* fix(terminal): trimmed history no longer replays half of a control sequence (pingdotgg#36368)

* fix(usage): a re-emitted Codex snapshot is no longer billed as a counter rewind (pingdotgg#36367)

Co-authored-by: rihanaws <[email protected]>

* fix(server): a Claude Monitor line no longer wakes a delegated child's parent (pingdotgg#36339)

* fix(opencode): a lost subagent report no longer leaves a resumed call running (pingdotgg#36386)

* fix(web): a new worktree thread opened during a clone bases on the real default branch (pingdotgg#36379)

* fix(server): unauthenticated token requests no longer write DPoP replay markers (pingdotgg#36393)

* fix(server): other sites can no longer frame the web app (pingdotgg#36395)

* fix(server): a server browser tab survives a renderer crash, and a service worker badge call no longer causes one (pingdotgg#36389)

* fix(web): T3 Connect sign-in offers Retry after Clerk fails to load (pingdotgg#23620)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(ci): macOS PR previews no longer run the PR's bundle next to signing secrets (pingdotgg#36407)

* fix(mobile): a new thread's first message no longer returns to the composer after a lost launch reply (pingdotgg#32330)

* fix(web): size markdown media whose width and height carry a px unit (pingdotgg#32108)

* fix(web): file links the agent cited from a checkout it cd'd into open that file (pingdotgg#36364)

* ci(mobile): iOS jobs run on macos-27, store builds require the final Xcode 27.1 (pingdotgg#36421)

* fix(server): Claude context meter no longer shows an auto-compact point when auto-compaction is off (pingdotgg#36417)

* fix(web): a run waiting on foreground subagents says so instead of Thinking (pingdotgg#36334)

* fix(server): a follow-up to a delegated child waits for its awaited background work (pingdotgg#36411)

* fix(provider-grok): Grok follow-ups queue instead of cancelling the running tool (pingdotgg#36422)

* fix(server): thread list builds metadata only for the page it returns (pingdotgg#36434)

* fix(web): middle-clicking empty chat space on Linux no longer pastes into the composer (pingdotgg#36436)

* fix(web): closing Settings no longer leaves it as a back/forward stop (pingdotgg#36437)

* fix(opencode): OpenCode 1.x threads report context-window usage (pingdotgg#36430)

* fix(web): bare @ in the composer lists workspace files (pingdotgg#36435)

* fix(mobile): thread list project filter lists recently active projects first (pingdotgg#36433)

* fix(clients): live working timers count on the host's clock (pingdotgg#36420)

* perf(relay): lighter Postgres load and PS-160 cluster (pingdotgg#36442)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(mobile): mobile:install --session works on pooled devices (pingdotgg#36447)

* fix(native): KDE SnapShot no longer loses the first reply from KWin (pingdotgg#36218)

Co-authored-by: Claude Fable 5.2 <[email protected]>

* fix(server): t3 connect status no longer reports a publish-only link as exposed (pingdotgg#33967)

* fix(web): don't label Windows paths outside the workspace as relative (pingdotgg#28469)

Co-authored-by: Julius Marminge <[email protected]>

* fix(server): multi-line guest messages are no longer refused or stored with CRLF (pingdotgg#26542)

* perf(desktop): provider checks no longer compete with server startup (pingdotgg#35712)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(web,mobile): explain missing file access for host videos (pingdotgg#24637)

* fix(scripts): iOS scenarios prepare the dev client before leasing a device (pingdotgg#36456)

* perf(server): a new thread's first turn starts sooner (pingdotgg#35710)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(provider-pi): running shell output no longer stores a snapshot row per update (pingdotgg#36429)

* fix(web): NVDA browse mode reads the current thread's branch, not the previous one (pingdotgg#34446)

Co-authored-by: nibarAhmed <[email protected]>
Co-authored-by: Julius Marminge <[email protected]>

* fix(server): T3 Connect clients are named "T3 Connect", not "T3 Connect connect" (pingdotgg#27887)

* fix(web): screen readers read the Update everything machine list as a table (pingdotgg#36445)

* feat: agents can restyle T3 Code with theme colors and CSS (pingdotgg#35247)

Co-authored-by: maria-rcks <[email protected]>
Co-authored-by: Claude Fable 5.2 <[email protected]>

* fix(mobile): long-pressed iOS blockquotes no longer draw over the thread (pingdotgg#36461)

* fix(cli): npm launcher no longer leaves a runtime running after a stop signal (pingdotgg#30487)

* feat(connect): require approval for new T3 Connect devices (pingdotgg#36419)

Co-authored-by: Claude Opus 5.5 <[email protected]>

* fix(server): run the Azure CLI in UTF-8 on Windows (pingdotgg#25801)

Co-authored-by: Julius Marminge <[email protected]>

* fix(server): preview navigation leaves a page whose script never yields (pingdotgg#36365)

* fix(server): the auto-settle sweep no longer rereads every idle branch every few minutes (pingdotgg#36371)

* fix(web): rewind no longer offers file restore in project-folder threads (pingdotgg#36467)

* fix(server): stop the relay client a crashed server left running (pingdotgg#36465)

* fix(server): read Azure DevOps pull request templates (pingdotgg#22881)

* perf(azure-devops): PR Code tab loads a page's files in one az run instead of two per file (pingdotgg#35295)

Co-authored-by: Julius Marminge <[email protected]>

* fix(web): copying a file preview selection returns the selected lines after scrolling (pingdotgg#36466)

* fix(mobile): push-token failures no longer report notifications as enabled (pingdotgg#26557)

* fix(provider-core): mise updates a tool configured by its backend name (pingdotgg#36472)

* fix(server): parent turns no longer duplicate delegated task thread items (pingdotgg#36473)

* fix(server): Windows drive paths open under WSL (pingdotgg#26030)

* fix(client-runtime): new T3 Connect machines appear without signing in again (pingdotgg#29788)

* fix(azure-devops): local pull request checkout no longer fails on --detect (pingdotgg#31170)

Co-authored-by: maria-rcks <[email protected]>
Co-authored-by: Julius Marminge <[email protected]>

* fix(usage): count shared Windows and WSL transcripts once (pingdotgg#24319)

* fix(azure-devops): pull requests report build validation as checks (pingdotgg#31146)

Co-authored-by: maria-rcks <[email protected]>
Co-authored-by: Julius Marminge <[email protected]>

* fix(desktop): WSL backend starts in distros without automounted drives (pingdotgg#25734)

* fix(server): t3 browser setup reloads an AppArmor profile that is on disk but not loaded (pingdotgg#36490)

* Initial plan

* fix(azure-devops): finish reconciling nightly diff tests

Remove retired files-diff code and update mocks for iteration changes and blob reads. Preserve bounded paging, cache, and error-path coverage.

Co-authored-by: Copilot <[email protected]>

---------

Co-authored-by: Julius Marminge <[email protected]>
Co-authored-by: Lakshmi Tanmay <[email protected]>
Co-authored-by: rihanaws <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
Co-authored-by: Theo Browne <[email protected]>
Co-authored-by: ValeraZSD <[email protected]>
Co-authored-by: nibarAhmed <[email protected]>
Co-authored-by: nibarAhmed <[email protected]>
Co-authored-by: maria-rcks <[email protected]>
Co-authored-by: Pedro Henrique <[email protected]>
Co-authored-by: Kieren-Foenander <[email protected]>
Co-authored-by: Pavel Kroupa <[email protected]>
Co-authored-by: copilot-swe-agent[bot] <[email protected]>
Co-authored-by: Alex Vallone <[email protected]>
Co-authored-by: Copilot <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L 100-499 changed lines (additions + deletions). vouch:trusted Author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Thread listing builds metadata for every thread before paginating (25 s for a one-row list on a 27 GB DB)

1 participant