Skip to content

perf(web): reduce allocations in streaming timeline scans - #23739

Merged
Yash-Singh1 merged 1 commit into
pingdotgg:mainfrom
UtkarshUsername:perf/web-streaming-indexed-loops
Oct 23, 2026
Merged

Yash-Singh1 merged 1 commit into
pingdotgg:mainfrom
UtkarshUsername:perf/web-streaming-indexed-loops

Conversation

@UtkarshUsername

@UtkarshUsername UtkarshUsername commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

Problem

Two streaming timeline scans use array.entries(), adding transient allocations while most historical rows remain unchanged.

Change

Use indexed reads in both loops, preserving comparisons, fallbacks, ordering, and row identity.

Scope and approval

Small, behavior-preserving performance fix for measured allocation churn on one web/desktop streaming path. No feature or default changes.

Verification

Loaded items Processing time / 200 updates Sampled allocation bytes / update
1,000 19.45 → 15.48 ms; 20.5% median paired reduction 200,415 → 72,854; 63.6% lower
75 7.25 → 7.03 ms; timing inconclusive 32,894 → 23,325; 29.1% lower

Warm Node 26.12.1 pipeline benchmarks on Windows: five isolated trials per size with A/A controls; three separate allocation profiles per arm. App frame times were not measured.

At 75 items, profiled peak RSS rose 129.2 → 154.2 MiB and maximum-pause medians 3.02 → 3.52 ms; unsampled process peaks were 144.1 versus 144.6 MiB. No lower memory-footprint claim.

  • vp run check:changed upstream/main passed, including 133 tests across three files.
  • 400 streaming-pipeline comparisons preserved output values and historical row identity.

Implemented using gpt-6.1-sol through the Codex harness in T3 Code.

@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Oct 22, 2026
@macroscopeapp

macroscopeapp Bot commented Oct 22, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 9ae1d5d

Macroscope's review found this PR approvable — This is a narrowly scoped performance refactor that replaces iterator/destructuring allocations with indexed array reads in two existing streaming timeline scans. Control flow and data processing remain unchanged, with no product-default, API, schema, or static-analysis configuration changes.

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

@coderabbitai

coderabbitai Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
📥 Commits

Reviewing files that changed from the base of the PR and between f460ddb and 9ae1d5d.

📒 Files selected for processing: 2
  • apps/web/src/components/chat/MessagesTimeline.logic.ts
  • apps/web/src/session-logic.ts

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

📝 Walkthrough

Two loops now retrieve array items by index instead of using entries(). The existing per-item processing remains unchanged.

Changes: Timeline iteration

Layer / File(s) Summary
Indexed array access
apps/web/src/components/chat/MessagesTimeline.logic.ts, apps/web/src/session-logic.ts
Both loops now retrieve items by index. Their existing per-item processing remains unchanged.

Priority: ⬇️ Low

Estimated code review effort: 1 (Trivial) | ~4 minutes

Change: Refactor

Suggested reviewers: juliusmarminge

Merge Risk: ⚪ Minimal · up to 9ae1d

No actionable merge-blocking risk was identified.

Pre-merge checks: Passed 4
Check name Status Explanation
Title check Passed The title clearly and concisely describes the primary change: reducing allocations in streaming timeline scans.
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Description check Passed The pull request includes all required sections. It clearly describes the problem, indexed-loop change, scope, measured verification results, test coverage, limitations, and agent details. The scope s…
Full details: Description check

Explanation

The pull request includes all required sections. It clearly describes the problem, indexed-loop change, scope, measured verification results, test coverage, limitations, and agent details. The scope section does not link an issue or approval comment, but it explains why this small, behavior-preserving fix qualifies without one.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Comment @coderabbitai help to get the list of available commands.

@Yash-Singh1
Yash-Singh1 merged commit f7f02d7 into pingdotgg:main Oct 23, 2026
31 checks passed
github-actions Bot added a commit to omarcresp/t3code-flake that referenced this pull request Oct 23, 2026
## What's Changed
* fix(server): avoid full shell read on resume by @Yash-Singh1 in pingdotgg/t3code#23987
* test: delete low-value tests and dead test-only exports by @t3dotgg in pingdotgg/t3code#24058
* test(server): restore DST scheduling tests deleted in the test snap by @t3dotgg in pingdotgg/t3code#23991
* test(web): restore project settings permission tests deleted in the test snap by @t3dotgg in pingdotgg/t3code#24011
* test(mobile): restore clipboard secret-redaction test deleted in the test snap by @t3dotgg in pingdotgg/t3code#23980
* fix(web): Cmd+B toggles the sidebar unless text is selected by @t3dotgg in pingdotgg/t3code#24063
* fix(server): agent-browser and Chrome no longer outlive the agent that started them by @josephv123 in pingdotgg/t3code#21299
* test(client-runtime): restore render scheduler tests deleted in the test snap by @t3dotgg in pingdotgg/t3code#23977
* fix(web): cmd+k search hides subagents and favors recent, whole-word matches by @t3dotgg in pingdotgg/t3code#24032
* test(lint): new polling loops in tests now fail lint by @t3dotgg in pingdotgg/t3code#23983
* ci: unused dependency patches fail in check:changed, not after push by @t3dotgg in pingdotgg/t3code#23988
* fix(desktop): PDFs in the preview can be annotated by @shivamhwp in pingdotgg/t3code#24022
* fix(web): instructed compact runs without a bare compaction first by @juliusmarminge in pingdotgg/t3code#24008
* fix(desktop): reduce app crashes when a preview tab's renderer dies during agent screenshots by @shivamhwp in pingdotgg/t3code#24056
* fix(server): Stop stops a thread's subagents again by @shivamhwp in pingdotgg/t3code#23886
* fix(desktop): a stuck quit no longer leaves the app unkillable by @shivamhwp in pingdotgg/t3code#23873
* fix(web): keep blockquote text readable in every theme by @Yash-Singh1 in pingdotgg/t3code#24036
* fix(bitbucket): stop the startup sweep from flooding Bitbucket with 429s by @shivamhwp in pingdotgg/t3code#23889
* fix(web): screen readers hear when the open thread starts, needs you or finishes by @shivamhwp in pingdotgg/t3code#23752
* perf(web): reduce allocations in streaming timeline scans by @UtkarshUsername in pingdotgg/t3code#23739
* perf(web): reuse a collator when sorting changed-file trees by @UtkarshUsername in pingdotgg/t3code#23776
* perf(scripts): check:changed finishes in about 10 s by @t3dotgg in pingdotgg/t3code#23581


**Full Changelog**: pingdotgg/t3code@v0.1.3-nightly.20261023.3566...v0.1.3-nightly.20261023.3579

Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.1.3-nightly.20261023.3579
@UtkarshUsername
UtkarshUsername deleted the perf/web-streaming-indexed-loops branch October 23, 2026 20:03
Pipyakas pushed a commit to Pipyakas/t3code that referenced this pull request Oct 23, 2026
adampeterhiggins added a commit to adampeterhiggins/t3code that referenced this pull request Oct 24, 2026
* test: delete low-value tests and dead test-only exports (pingdotgg#24058)

* test(server): restore DST scheduling tests deleted in the test snap (pingdotgg#23991)

* test(web): restore project settings permission tests deleted in the test snap (pingdotgg#24011)

* test(mobile): restore clipboard secret-redaction test deleted in the test snap (pingdotgg#23980)

* fix(web): Cmd+B toggles the sidebar unless text is selected (pingdotgg#24063)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(server): agent-browser and Chrome no longer outlive the agent that started them (pingdotgg#21299)

Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Theo Browne <me@theo.li>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* test(client-runtime): restore render scheduler tests deleted in the test snap (pingdotgg#23977)

* fix(web): cmd+k search hides subagents and favors recent, whole-word matches (pingdotgg#24032)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* test(lint): new polling loops in tests now fail lint (pingdotgg#23983)

* ci: unused dependency patches fail in check:changed, not after push (pingdotgg#23988)

* fix(desktop): PDFs in the preview can be annotated (pingdotgg#24022)

Co-authored-by: PR Batch Tester <agent@local.test>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(web): instructed compact runs without a bare compaction first (pingdotgg#24008)

Co-authored-by: fixfon <12512757+fixfon@users.noreply.github.com>
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>

* fix(desktop): reduce app crashes when a preview tab's renderer dies during agent screenshots (pingdotgg#24056)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(server): Stop stops a thread's subagents again (pingdotgg#23886)

Co-authored-by: PR Batch Tester <agent@local.test>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(desktop): a stuck quit no longer leaves the app unkillable (pingdotgg#23873)

Co-authored-by: PR Batch Tester <agent@local.test>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(web): keep blockquote text readable in every theme (pingdotgg#24036)

* fix(bitbucket): stop the startup sweep from flooding Bitbucket with 429s (pingdotgg#23889)

Co-authored-by: PR Batch Tester <agent@local.test>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(web): screen readers hear when the open thread starts, needs you or finishes (pingdotgg#23752)

Co-authored-by: PR Batch Tester <agent@local.test>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* perf(web): reduce allocations in streaming timeline scans (pingdotgg#23739)

* perf(web): reuse a collator when sorting changed-file trees (pingdotgg#23776)

* perf(scripts): check:changed finishes in about 10 s (pingdotgg#23581)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(web): size Usage header controls to the available width (pingdotgg#24123)

* perf(server): speed up large terminal clipboard sequences (pingdotgg#23819)

Co-authored-by: Julius Marminge <julius0216@outlook.com>

* fix(server): make stale CLI service recovery actionable (pingdotgg#23541)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(web): pasted images show their upload tile instantly (pingdotgg#23832)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>

* fix(server): clean up deleted threads worktrees with subagents (pingdotgg#23900)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(server): pause periodic PR discovery without foreground clients (pingdotgg#23852)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(server): meter checkpoint git subprocess attempts (pingdotgg#24218)

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
Co-authored-by: Yordis Prieto <yordis.prieto@gmail.com>

* fix(web): clear stale resource monitor errors after retry (pingdotgg#24229)

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
Co-authored-by: Yordis Prieto <yordis.prieto@gmail.com>

* fix(mobile): align draft workspace controls with the composer (pingdotgg#24239)

* feat(mobile): thread header minimizes on the Duo while reading back through history (pingdotgg#24235)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(web): center pull request timeline actions (pingdotgg#24259)

* fix(server): find the resource monitor when the server runs from its build output (pingdotgg#23965)

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
Co-authored-by: Theo Browne <me@t3.gg>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Victor Vogel <satsdev@only21mil.xyz>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
Co-authored-by: Joseph Vidal <135430578+josephv123@users.noreply.github.com>
Co-authored-by: Theo Browne <me@theo.li>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: PR Batch Tester <agent@local.test>
Co-authored-by: fixfon <12512757+fixfon@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: Yukun Shan <92423096+nateEc@users.noreply.github.com>
Co-authored-by: Akshar Patel <123344143+AksharP5@users.noreply.github.com>
Co-authored-by: Ben Davis <45952064+bmdavis419@users.noreply.github.com>

* fix(pull-requests): list filters narrow on every host that can (pingdotgg#23922)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(pull-requests): a filtered list fills its page instead of waiting for a scroll (pingdotgg#23923)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* feat(pull-requests): label and author filters search the host (pingdotgg#23924)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(mobile): chat and composer chips stay readable in light mode (pingdotgg#22585)

Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(web): review thread avatars no longer clip in collapsed activity rows (pingdotgg#23545)

* ci: close "needs more info" issues after 7 days without a reply (pingdotgg#22628)

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>

* fix(server): Codex accounts show ChatGPT's current plan names (pingdotgg#24200)

* fix(observability): desktop dev version and web environment match the other services (pingdotgg#23975)

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>

* fix(observability): custom resource attributes use the t3code prefix (pingdotgg#23974)

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>

* fix(mobile): Home and pull request lists let UIKit own their top inset (pingdotgg#24284)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(mobile): keep the Duo's Home and pull request headers fixed (pingdotgg#24295)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(server): interrupts started by an agent no longer say "by user" in the timeline (pingdotgg#24299)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* feat(relay): deploy on-demand preview stages for labeled PRs

Labeled same-repo PRs deploy stage pr-<n> behind the relay-preview environment reviewer gate. Unlabel or close tears the stage down, and a nightly job retries failed teardowns. Runtime-created managed endpoint tunnels and CNAMEs are swept by a PreviewTunnelSweep resource.

Known gaps, tracked as follow-ups: an interrupted preview deploy can leave runtime tunnels behind; repo-level relay secrets still bypass the environment gate until moved.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

* fix(mobile): HTML links in pull request comments open when tapped (pingdotgg#22110)

* perf(client): avoid full ordering scans for streamed replacements (pingdotgg#24264)

* fix(server): a fork's first /compact compacts its inherited history (pingdotgg#24172)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(server): agent recordings honor the browser frame rate setting (pingdotgg#23895)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(client-runtime): Stop clears commands already finished on the server (pingdotgg#23814)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(web): SSH environments on an older reused remote server explain the version mismatch instead of reconnecting forever (pingdotgg#23647)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(web): keep usage-limit wake action visible (pingdotgg#23803)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(server): reject pairing with an incompatible server protocol (pingdotgg#23789)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(mobile): Live Activity stops shouting the running-agent count (pingdotgg#24329)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* feat(usage): include Muse Code session history (pingdotgg#22443)

Co-authored-by: Theo Browne <me@theo.li>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* feat(mobile): add Usage and Settings to workspace navigation (pingdotgg#23841)

* fix(mobile): keep iPad workspace columns aligned while resizing (pingdotgg#24182)

* fix(mobile): no-project threads show a chat bubble instead of a monogram (pingdotgg#21546)

* fix(mobile): stabilize Duo search and portrait navigation (pingdotgg#24206)

Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(mobile): the unfolded Duo keeps its header in portrait (pingdotgg#24339)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* fix(client-runtime): avoid duplicate handoff previews during startup (pingdotgg#24349)

* fix(mobile): Usage and Settings use the glass header and the Duo rail (pingdotgg#24348)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* perf(server): coalesce superseded streaming text updates (pingdotgg#24267)

* fix(server): stop flooding analytics with successful MCP tool calls (pingdotgg#24287)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* feat(search): Cmd+K finds the right thread first, with indexed message search (pingdotgg#24343)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

---------

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
Co-authored-by: Theo Browne <me@t3.gg>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Joseph Vidal <135430578+josephv123@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Theo Browne <me@theo.li>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: PR Batch Tester <agent@local.test>
Co-authored-by: fixfon <12512757+fixfon@users.noreply.github.com>
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: Yukun Shan <92423096+nateEc@users.noreply.github.com>
Co-authored-by: Akshar Patel <123344143+AksharP5@users.noreply.github.com>
Co-authored-by: Ben Davis <45952064+bmdavis419@users.noreply.github.com>
Co-authored-by: Yordis Prieto <yordis.prieto@gmail.com>
Co-authored-by: Alex <me@pixp.cc>
Co-authored-by: Victor Vogel <satsdev@only21mil.xyz>
Co-authored-by: oliver <97427849+flamboh@users.noreply.github.com>
Co-authored-by: Wiktor Golicz <56449542+Wiktor102@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS 0-9 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.

2 participants