fix(app): make session navigation stable and fast#33569
Merged
Conversation
Contributor
There was a problem hiding this comment.
Pull request overview
This PR focuses on improving session navigation paint stability and latency in the app by caching session “placement” (server + directory + root) to avoid cold route work, switching history pagination to single opaque-cursor pages, and adding performance benchmarks to guard the new behavior.
Changes:
- Add a bounded session placement cache and wire it into home/session navigation and titlebar tab metadata to reduce cold navigations.
- Adjust timeline history paging to consume exactly one opaque cursor page per action, with controlled continuation when the user is already at the top.
- Add/expand e2e performance probes + fixtures to measure first/stable paints for navigation milestones and first navigation blank-frame behavior.
Reviewed changes
Copilot reviewed 26 out of 26 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| packages/app/src/utils/session-placement.ts | New bounded placement store used to resolve directory/root quickly across navigations. |
| packages/app/src/utils/session-placement.test.ts | Unit tests for placement aliasing, inheritance, and bounding behavior. |
| packages/app/src/pages/session/timeline/model.ts | Simplifies “load older” to a single page per call (opaque cursor semantics). |
| packages/app/src/pages/session/timeline/model.test.ts | Updates tests to reflect single-page history loading behavior. |
| packages/app/src/pages/session.tsx | Adds request/continuation coordination for history paging and cleanup for scheduled frames. |
| packages/app/src/pages/session-module.ts | Adds shared dynamic import wrapper for session module preloading. |
| packages/app/src/pages/home.tsx | Preloads session module; prefetches top sessions; sets placement before navigation; adds tabs usage. |
| packages/app/src/pages/home-module.ts | Adds shared dynamic import wrapper for home module preloading. |
| packages/app/src/pages/directory-layout.tsx | Inherits placement for child-session navigation to keep destination placement ready. |
| packages/app/src/context/global.tsx | Registers the global sessionPlacement store alongside existing global contexts. |
| packages/app/src/context/directory-sync.ts | Reduces initial message page size to support small-page navigation/pagination strategy. |
| packages/app/src/components/titlebar.tsx | Uses cached placement + local sync data for tab titles before falling back to network; preloads home module. |
| packages/app/src/app.tsx | Switches session-route resolution from query placeholdering to resource + placement cache. |
| packages/app/e2e/utils/mock-server.ts | Introduces opaque cursor tokens for message pagination in e2e mock server. |
| packages/app/e2e/smoke/session-timeline.spec.ts | Makes timeline key sampling robust by collecting currently visible timeline part IDs. |
| packages/app/e2e/performance/unit/timeline-test-helpers.test.ts | Adds unit test for stress-session link builder. |
| packages/app/e2e/performance/unit/navigation-milestones.test.ts | Adds unit test for milestone first/stable paint summarization. |
| packages/app/e2e/performance/unit/first-navigation-metrics.test.ts | Adds unit tests for first-navigation blank-frame/stability summarization. |
| packages/app/e2e/performance/timeline/timeline-test-helpers.ts | Updates stress helpers for server-scoped routes, draft tabs, and fixture paging. |
| packages/app/e2e/performance/timeline/session-timeline-stress.fixture.ts | Extends fixture with child session + tool metadata to exercise child navigation. |
| packages/app/e2e/performance/timeline/navigation-milestones.ts | Adds probe + summarizer for content/tab/home/tab-removed milestone paints. |
| packages/app/e2e/performance/timeline/home-tab-navigation-benchmark.spec.ts | Adds benchmarks for home→session and close-only-tab→home milestone paints. |
| packages/app/e2e/performance/timeline/first-navigation-probe.ts | Adds probe for detecting blank frames during first navigation to destination. |
| packages/app/e2e/performance/timeline/first-navigation-metrics.ts | Adds summarizer for first navigation samples (blank/source/destination). |
| packages/app/e2e/performance/timeline/first-navigation-benchmark.spec.ts | Adds benchmarks for unvisited tab, new-session draft, and child session first-navigation paint. |
| packages/app/e2e/performance/README.md | Documents additional benchmark scenarios covered by the suite. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| @@ -0,0 +1,41 @@ | |||
| import { ServerConnection } from "@/context/server" | |||
| } | ||
| const absolute = (path: string) => (current()[0].path.directory + "/" + path).replace("//", "/") | ||
| const initialMessagePageSize = 80 | ||
| const initialMessagePageSize = 2 |
Comment on lines
+12
to
+14
| const stable = samples.findIndex( | ||
| (sample, index) => matches(sample) && matches(samples[index + 1]!) && matches(samples[index + 2]!), | ||
| ) |
699c77f to
fbb1428
Compare
# Conflicts: # packages/app/src/app.tsx # packages/app/src/pages/home.tsx
BenGu3
pushed a commit
to BenGu3/opencode
that referenced
this pull request
Jun 27, 2026
Co-authored-by: Brendan Allan <git@brendonovich.dev>
lacymorrow
added a commit
to lacymorrow/lash
that referenced
this pull request
Jun 29, 2026
* fix(app): mount shortcuts per titlebar tab (anomalyco#33567) * fix(tui): normalize autocomplete attachments * refactor(core): drop filesystem entry mime * fix(app): use fixed titlebar tab widths (anomalyco#33572) * refactor(schema): extract shared public schemas (anomalyco#33571) * chore: update nix node_modules hashes * fix(app): throttle directory tree loading (anomalyco#33576) * refactor(core): remove schema forwarding facades (anomalyco#33577) * fix(app): create scoped drafts from home (anomalyco#33578) * feat(cli): add API request command * fix(tui): sort model picker by release date (anomalyco#33558) * chore: generate * fix(app): clear viewed session notifications (anomalyco#33574) * fix(app): route new sessions through tabs (anomalyco#33582) * fix(mcp): bind oauth callback to IPv4 loopback (anomalyco#30022) * fix(opencode): restore v1 account config (anomalyco#33590) Co-authored-by: Test <test@opencode.test> * refactor(app): simplify layout hierarchy (anomalyco#33588) * fix(mcp): restore legacy tool names (anomalyco#33593) * fix(skill): emit base directory as filesystem path, not file:// URL (anomalyco#33580) Co-authored-by: Aiden Cline <aidenpcline@gmail.com> * chore: generate * fix(mcp): prevent resource key collisions (anomalyco#33596) * feat(app): update all components to use v2 tokens (anomalyco#33598) * chore: generate * deps: update OpenTUI to 0.4.2 (anomalyco#33610) * chore: update nix node_modules hashes * fix(app): make session navigation stable and fast (anomalyco#33569) Co-authored-by: Brendan Allan <git@brendonovich.dev> * chore: generate * fix(app): share synced session data (anomalyco#33624) * refactor(app): rename cached context accessors (anomalyco#33627) * ci: notify the current Discord alert role * feat(console): add support actions (anomalyco#33492) * feat(tui): add diff viewer keybind (anomalyco#33365) * chore: generate * fix(app): always apply safe area insets (anomalyco#33619) * feat(tui): add main branch source to diff mode (anomalyco#30942) * fix(enterprise): use delete for remove share * tui: fix multi-day duration formatting (anomalyco#33651) Report elapsed days and remaining hours instead of showing zero days and the total duration as hours. Close anomalyco#32957 Close anomalyco#32956 * docs(llm): propose AI library design (anomalyco#33666) * chore: generate * refactor(ui): isolate session components (anomalyco#33670) * chore: update nix node_modules hashes * zen: migrate to new inference * fix(stats): strip locale prefixes from data routes * refactor(stats): simplify locale prefix stripping * feat(mcp): append server instructions to context (anomalyco#32490) Co-authored-by: Aiden Cline <aidenpcline@gmail.com> * chore: generate * fix(mcp): hide denied resource template tool (anomalyco#33686) * refactor(core): simplify model requests * feat(core): generate model variants * chore: generate * zen: track model tier in stats * fix: restore dev CI (anomalyco#33701) * tui: remove logo animation (anomalyco#33633) Render branding as a static logo to avoid continuous redraws and mouse-driven visual effects. * sync release versions for v1.17.10 * refactor(schema): extract public event definitions (anomalyco#33579) * chore: generate * chore: update nix node_modules hashes * docs: add GMI Cloud provider entry to providers directory (anomalyco#32914) * fix(opencode): always print MCP OAuth URL (anomalyco#33716) * fix(core): scope fff broad scanning * fix(core): disable fff broad scanning * fix(core): handle unavailable fff index * fix(core): preserve unconfigured console models * fix(core): lower OpenAI text verbosity * feat(core): add session snapshot and revert system (anomalyco#33226) * chore: generate * fix(app): remove session loading stripe (anomalyco#33649) Co-authored-by: Test <test@opencode.test> * refactor(protocol): extract server contracts (anomalyco#33708) * refactor(app): centralize session state (anomalyco#33641) * chore: generate * fix(app): clear late session notifications (anomalyco#33753) Co-authored-by: Test <test@opencode.test> * chore: update nix node_modules hashes * feat(sdk): add HttpApi clients and embedded host (anomalyco#33445) * chore: generate * chore: update nix node_modules hashes * fix(app): separate provider lifetimes and reactive ownership (anomalyco#33739) * chore: generate * refactor(app): lift parent session navigation (anomalyco#33782) * chore: generate * feat(app): draggable tabs (anomalyco#31364) Co-authored-by: LukeParkerDev <10430890+Hona@users.noreply.github.com> * chore: generate * feat(app): ui improvements (anomalyco#32438) Co-authored-by: LukeParkerDev <10430890+Hona@users.noreply.github.com> * chore: generate * fix(app): close missing session tabs (anomalyco#33785) * fix(app): preserve todo dock across sessions (anomalyco#33778) * fix(app): remove produce default values in server session state (anomalyco#33793) * fix(app): update all v1 new-session icons (anomalyco#32017) Co-authored-by: LukeParkerDev <10430890+Hona@users.noreply.github.com> * fix(storybook): support prompt state capture (anomalyco#33798) * feat(app): no sesssions empty state (anomalyco#33315) * chore: generate * feat(app): restyle v2 jump-to-latest button (anomalyco#33809) * fix(app): improve home action availability (anomalyco#33805) * fix(app): restore tab layout consistency (anomalyco#33804) * fix(app): reveal tab avatar on hover (anomalyco#33824) Co-authored-by: Test <test@opencode.test> * feat(app): add Chrome tab cycle shortcuts (anomalyco#33838) * Revert "deps: update OpenTUI to 0.4.2 (anomalyco#33610)" (anomalyco#33842) * fix(app): use project server for prompt drafts (anomalyco#33850) * chore: update nix node_modules hashes * fix(client): exclude generated files from formatting (anomalyco#33832) Co-authored-by: Test <test@opencode.test> * feat(ui): publish ui package (anomalyco#33681) * sync release versions for v1.17.11 * fix(app): hide mobile titlebar setting in production (anomalyco#33894) * chore: update nix node_modules hashes * feat(server): add permission request endpoints (anomalyco#33774) * chore: generate * feat(app): improve titlebar tab layout (anomalyco#33914) * feat(stats): add i18n support (anomalyco#33693) * fix(app): suspend while recent models load (anomalyco#33921) * chore: generate * docs(schema): document package conventions (anomalyco#33768) * fix(app): restore new layout shortcuts (anomalyco#33929) * refactor(schema): normalize module patterns (anomalyco#33770) * chore: generate * zen: migrate to new inference * zen: new inference * fix(app): adjust home search and header layout (anomalyco#33923) * fix(tui): load root sessions in session switcher (anomalyco#33931) Request root sessions before applying the session list limit so child sessions cannot crowd roots out of the switcher. Keep the synchronized cache available while requests are pending or fail, reconcile results with live updates, and retain current and pinned sessions. Preserve selection by session ID when asynchronous results reorder the list. Closes anomalyco#16270 Closes anomalyco#32725 * fix(app): persist home project selection (anomalyco#33935) * chore: generate * refactor(schema): tighten public contracts (anomalyco#33771) * chore: generate * refactor(schema): isolate v1 contracts (anomalyco#33769) * feat(app): group prompt projects by server (anomalyco#33941) * feat(sdk): restore session runtime operations (anomalyco#33777) * chore: generate * refactor(core): support tiered layer nodes (anomalyco#33937) * chore: generate * fix(app): use tab-scoped servers in sessions (anomalyco#33946) * fix(app): enable composer shortcuts on drafts (anomalyco#33956) * refactor(app): split session composer (anomalyco#33954) * chore: generate * fix(mcp): scope auth status to server URL (anomalyco#33924) * chore: generate * feat(llm): pass strict through tool definitions for Codex parity (anomalyco#33392) * fix(app): simplify question prompt (anomalyco#33968) Co-authored-by: Test <test@opencode.test> * feat(core): split MCP timeout configuration (anomalyco#33977) Co-authored-by: Test <test@opencode.test> * fix(core): refine small model defaults (anomalyco#33926) * tweak: hide MCP access token prefix (anomalyco#33711) * fix(app): enable auto-accept in session settings (anomalyco#33974) * fix(app): suspend hidden terminal renderer (anomalyco#33990) Co-authored-by: Test <test@opencode.test> * fix(ui): normalize tooltip trigger layout (anomalyco#33979) Co-authored-by: Test <test@opencode.test> Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com> * refactor(opencode): stop legacy v2 event emission (anomalyco#33993) * fix(sdk): wake embedded session execution (anomalyco#33992) * feat(sdk): expose active sessions (anomalyco#33991) * chore: generate * fix(app): bump ghostty-web to prevent terminal resize hangs (anomalyco#34020) Co-authored-by: Luke Parker <10430890+Hona@users.noreply.github.com> * chore: update nix node_modules hashes * refactor(app): use dropdown for project selector (anomalyco#33984) * refactor(app): replace tab drag handling with dndkit (anomalyco#33880) Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com> * chore: generate * feat(oauth): unify OAuth callback browser pages (anomalyco#34025) * chore: update nix node_modules hashes * feat(app): refine session UI styling (anomalyco#33860) Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com> * chore: generate * core: prevent UI imports compiling TSX source * fix(tui): preserve renderer initialization errors (anomalyco#33996) Co-authored-by: Shoubhit Dash <shoubhit2005@gmail.com> * fix(opencode): preserve skill resource paths (anomalyco#34052) * fix(core): refresh cached remote skills (anomalyco#34059) * fix(acp): surface prompt errors (anomalyco#34061) * feat(app): updates to design system (anomalyco#34066) * fix(acp): skip resume transcript replay (anomalyco#34070) * fix(mcp): refresh credentials on reauthentication (anomalyco#33717) * tweak: update OAuth callback branding (anomalyco#34081) * fix(llm): omit stateless response item ids (anomalyco#34027) * fix(core): enlarge OAuth callback card (anomalyco#34082) * feat(app): add new session workspace controls (anomalyco#34085) * fix(app): consolidate add project action (anomalyco#34086) * fix(acp): enrich permission prompts (anomalyco#34079) * docs(providers): document blacklist and whitelist model filtering (anomalyco#33792) * fix(app): wait for persisted home state before reading collapsed state (anomalyco#34088) * fix(acp): send partial completed tool updates (anomalyco#34091) * fix(data): canonicalize locale pages * docs: route enterprise contact links (anomalyco#34080) * fix(data): clarify unchanged rank * feat(stats): add clickable section headings (anomalyco#34095) * chore: generate * fix(core): resolve prompt attachment mime types * chore: generate * fix(core): authorize external read paths * fix(llm): end reasoning before responses * chore: generate * fix(app): animate prompt selectors after loading (anomalyco#34101) * feat(api): add finite durable session history pages (anomalyco#34097) * chore: generate * fix(app): slow tooltip display for models (anomalyco#30745) Co-authored-by: affanali2k3 <affanalikhanxx@gmail.com> * chore: update nix node_modules hashes * feat(sdk): expose live event stream (anomalyco#34098) * chore: generate * fix(app): centralize notification state (anomalyco#34105) * zen: new inference * fix: apply lash-specific patches after upstream merge - Fix SolidJS accessor usage in question-dock (sdk → sdk()) - Remove dead session-prompt-dock.tsx (no imports, replaced by composer) - Update bun.lock * fix(tui): use generated event union (anomalyco#34118) Co-authored-by: 𝓛𝓲𝓽𝓽𝓵𝓮 𝓕𝓻𝓪𝓷𝓴 <little-frank@opencord.local> * fix(app): keep bare slash as plain inline code (anomalyco#34122) Co-authored-by: 𝓛𝓲𝓽𝓽𝓵𝓮 𝓕𝓻𝓪𝓷𝓴 <little-frank@opencord.local> * fix(app): hide home session archive action (anomalyco#34136) Co-authored-by: 𝓛𝓲𝓽𝓽𝓵𝓮 𝓕𝓻𝓪𝓷𝓴 <little-frank@opencord.local> * refactor(core): separate out location node functionality and integrate into v2 (anomalyco#34119) * chore: generate * fix(mcp): surface OAuth completion errors (anomalyco#34145) * fix(mcp): request refresh token scope (anomalyco#34125) * chore: update nix node_modules hashes * fix(app): migrate composer tooltips to v2 (anomalyco#34147) Co-authored-by: Jay V <air@live.ca> Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com> * feat(core): port v2 runtime fixes onto dev Cherry-picks the packages/core changes from the v2 branch onto dev: - combined ordered stdout/stderr in AppProcess + bash structured output - edit/apply-patch return FileDiff info with status and line stats - ignore no-op model switches; record reasoning timestamps - return unexpected local tool defects to the model and continue - keep OAuth account metadata out of request bodies - nest OpenAI reasoning effort/summary options - load OpenCode provider config asynchronously; batch plugin boot - export latest public event manifest Includes the supporting schema reasoning time field and regenerated client/SDK types. * chore: generate * fix(opencode): allow empty provider config default (anomalyco#34167) Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com> * chore: update nix node_modules hashes * fix(app): space home sessions from scrollbar (anomalyco#34132) Co-authored-by: 𝓛𝓲𝓽𝓽𝓵𝓮 𝓕𝓻𝓪𝓷𝓴 <little-frank@opencord.local> * fix(ui): make select hover feedback immediate (anomalyco#34121) Co-authored-by: 𝓛𝓲𝓽𝓽𝓵𝓮 𝓕𝓻𝓪𝓷𝓴 <little-frank@opencord.local> * feat(app): update home screen alignment + markdown styles (anomalyco#34172) * fix(desktop): recognize normal auth metadata input prompts in connect provider dialog (anomalyco#33024) * fix(app): reconcile session pages with concurrent events (anomalyco#34042) * chore: generate * fix(app): batch new session tab navigation (anomalyco#34196) * feat(app): minor visual updates (anomalyco#34205) * refactor(core): make node build bind maps conditionally (anomalyco#34218) * feat(app): new debug bar (anomalyco#34237) * chore: generate * fix(tui): register `prompt.skills` keybinds (anomalyco#34180) * refactor(core): rename app node modules (anomalyco#34238) * chore: generate * test(core): cover app node builder graphs (anomalyco#34244) * refactor(core): move session test to nodes (anomalyco#34245) * chore: generate * refactor(core): move more tests to nodes (anomalyco#34248) * chore: generate * fix(app): transition draft project updates (anomalyco#34252) * fix(sdk): preserve V2Event name for SSE streams (anomalyco#34171) * chore: update nix node_modules hashes * feat(client): generate complete protocol client (anomalyco#34164) * fix(app): disable `add project` when given server is offline (anomalyco#34294) * fix(desktop): avoid destroyed window permission checks (anomalyco#34300) * zen: new inference * zen: update alert role * fix(mcp): reconnect after OAuth even when server is disabled Closes anomalyco#33915 * fix(mcp): clarify debug oauth probe (anomalyco#34350) * feat(desktop): Display stored totals for Tokens and Cost in Desktop Session Context (anomalyco#28887) * chore: generate * fix(app): wrap model.set in startTransition (anomalyco#34351) * chore: generate * feat(tui): integrate ServerAuth headers into transport configuration for external served TUI thread (anomalyco#29876) * refactor(core): refine layer node replacements (anomalyco#34377) * chore: generate * test(core): fix layer node replacement type expectation (anomalyco#34386) Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com> * fix(app): disable empty server chevron (anomalyco#34292) * zen: budget * zen: budget * feat(app): sticky session list header (anomalyco#34220) Co-authored-by: Brendan Allan <git@brendonovich.dev> * feat(app): show loader on session hover (anomalyco#34224) * chore: generate * fix(tui): use V2Event after upstream SSE name preservation (anomalyco#34171) Upstream renamed the SSE event union back to `V2Event` (no `V2Event1` suffix). Drop the alias import. LAC-2490 --------- Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com> Co-authored-by: Dax Raad <d@ironbay.co> Co-authored-by: Kit Langton <kit.langton@gmail.com> Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com> Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> Co-authored-by: Yufeng He <40085740+he-yufeng@users.noreply.github.com> Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com> Co-authored-by: Test <test@opencode.test> Co-authored-by: Chris Yuan <honglong@gmail.com> Co-authored-by: Aiden Cline <aidenpcline@gmail.com> Co-authored-by: Aarav Sareen <96787824+arvsrn@users.noreply.github.com> Co-authored-by: Simon Klee <hello@simonklee.dk> Co-authored-by: Luke Parker <10430890+Hona@users.noreply.github.com> Co-authored-by: Brendan Allan <git@brendonovich.dev> Co-authored-by: vimtor <vn4varro@gmail.com> Co-authored-by: Shoubhit Dash <shoubhit2005@gmail.com> Co-authored-by: Frank <frank@anoma.ly> Co-authored-by: Adam <2363879+adamdotdevin@users.noreply.github.com> Co-authored-by: 4rcadia <97033226+Arcadi4@users.noreply.github.com> Co-authored-by: opencode <opencode@sst.dev> Co-authored-by: Isaac Huang <isaac.h@gmicloud.ai> Co-authored-by: Dax <mail@thdxr.com> Co-authored-by: James Long <longster@gmail.com> Co-authored-by: usrnk1 <7547651+usrnk1@users.noreply.github.com> Co-authored-by: Ariane Emory <97994360+ariane-emory@users.noreply.github.com> Co-authored-by: Stefan Avram <98915060+Slickstef11@users.noreply.github.com> Co-authored-by: Affan Ali <93028901+affanali2k3@users.noreply.github.com> Co-authored-by: affanali2k3 <affanalikhanxx@gmail.com> Co-authored-by: 𝓛𝓲𝓽𝓽𝓵𝓮 𝓕𝓻𝓪𝓷𝓴 <little-frank@opencord.local> Co-authored-by: Jay V <air@live.ca> Co-authored-by: OpeOginni <107570612+OpeOginni@users.noreply.github.com> Co-authored-by: Ben Guthrie <benjee.012@gmail.com> Co-authored-by: Filip <34747899+neriousy@users.noreply.github.com> Co-authored-by: Max Anderson <max.a.anderson95@gmail.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Performance
Production Chromium, native speed, one worker. Painted-frame benchmarks sample with
requestAnimationFramefollowed bysetTimeout(0). Baseline is currentupstream/devate8610d821; branch is the PR head. First-navigation and home/close values are medians of 3 runs. Cold/hot tab values are medians of 15 trials (3 benchmark repetitions, each containing 5 trials).Windows
macOS
Home And Tab Milestones
Home-to-session records session content and titlebar-tab visibility independently. Closing measures home shell, restored session row, and tab removal.
Visual Stability
Chrome Trace Attribution
Full Chrome Performance traces include V8 sampling and timeline-stack overhead, so these values are reported separately from the native-speed medians above. User Timing marks delimit click, first paint, and stable paint inside each trace.
The remaining traced cost is dominated by final Solid/DOM construction and layout rather than network or Markdown parsing. Review-shell geometry remains immediate; only its internal body is staged after the first session-content paint.
Verification
bun turbo typecheckacross 23 packagesbun run test:unit: 415 passedbun test ./e2e/performance/unit: 15 passedbun run test:e2e: 16 passedupstream/devand rebased branch refsNotes
bun run test:benchdiscovers all navigation scenarios above for future baseline comparisons