Skip to content

[RSI] Start chats at the middle conversation-detail level - #2447

Merged
sethkarten merged 1 commit into
mainfrom
rsi/default-chat-detail-middle
Sep 17, 2026
Merged

sethkarten merged 1 commit into
mainfrom
rsi/default-chat-detail-middle

Conversation

@sethkarten

@sethkarten sethkarten commented Sep 17, 2026

Copy link
Copy Markdown
Contributor

Context

Ctrl+O (app.tools.expand, "Cycle conversation detail") cycles three chat-detail levels, overview -> details -> all:

  • overview - tool output summarized, edit diffs collapsed, thinking hidden
  • details - tool output summarized, edit diffs expanded, thinking visible
  • all - full tool output, edit diffs expanded, thinking visible

A chat used to start at overview, the most-collapsed level, so reaching the middle state took a Ctrl+O on every launch. Requested change: make the middle level the default.

Changes

  • Flip the two startup initializers in InteractiveMode (editDiffsExpanded: false -> true, hideThinkingBlock: true -> false) so every chat start - new, resumed, or attached - renders in details. toolOutputExpanded stays false, so tool output remains summarized at startup exactly as before.
  • The cycle itself is untouched: toggleToolOutputExpansion still walks overview -> details -> all, setChatDetail stays presentation-only (never persisted to settings or the session trace), and the fullscreen anchor logic is unchanged. Only the starting point moves one step.
  • Re-anchor the two regression suites that construct the real InteractiveMode from a startup-overview anchor to startup-details (cycle expectations shift by one step; full ring and every distinct assertion preserved - see Tests).
  • Changeset fragment in packages/coding-agent/.changes/chat-detail-middle-default.md.

Tests

No new test lines are added (the 1:1 test-line budget caps additions at the 2 changed source lines); the startup default is covered by the existing startup assertions, re-anchored to the new default:

  • 2193-chat-detail-cycle.test.ts: the startup assertion now expects details for fresh, streamed, and reopened chats (it fails on base, where hideThinkingBlock: true collapses thinking at startup). The full details -> all -> overview -> details ring is still exercised, and the JSONL/settings-immutability assertions are unchanged.
  • 2193-visible-message-spacing.test.ts: the two real-mode detail loops rotate [0, 1, 2, 0] -> [1, 2, 0, 1] (same asserted states, same ring); the third loop drives components directly and is untouched.
  • Two assertion pairs that used to run at different levels now run at the same startup level; they are kept intentionally so no assertion is removed, and their level coverage is not lost (the overview equivalents are still asserted later in the same tests).

All other interactive-mode tests drive explicit state (Object.create(InteractiveMode.prototype) with their own flags) and are unaffected.

Validation

  • Targeted vitest (all green): 2193-chat-detail-cycle 5/5, 2193-visible-message-spacing 5/5 (2 of 5 failed before the loop re-anchor), conversation-detail-status 4/4, compaction-message-components 10/10, interactive-mode-streaming 2/2, thinking-visibility 2/2, 2193-shell-completion-presentation 15/15, a 12-file interactive-mode surface batch 147/147, and a 5-file consumer sweep (2193-rendering-review, prompt-context-line, interactive-mode-status, plus repeats) 77/77.
  • TEST_POLICY_BASE=origin/main npm run check:test-policy passes: source +2, net test additions -4 (+8/-12).
  • npm run check passes: biome, test-policy, tsgo --noEmit, installer, browser-smoke.
  • Empirical pre-push probes (scratch vitest, deleted afterward): a real InteractiveMode starts at exactly the setChatDetail("details") triple; Ctrl+O walks details -> all -> overview -> details with per-level render semantics identical to base; reopened saved chats start at the new default; JSONL and settings stay byte-identical across cycles.

Note

Low Risk
Presentation-only default flags with no persistence or session trace changes; cycle behavior unchanged aside from the starting level.

Overview
New, resumed, and reopened chats now open in the details conversation-detail level instead of overview, so edit diffs and thinking are visible on launch while tool output stays summarized.

Startup defaults in InteractiveMode flip editDiffsExpanded to true and hideThinkingBlock to false; toolOutputExpanded stays false. Ctrl+O still cycles overview → details → all; only the initial step changes.

Regression tests in 2193-chat-detail-cycle and 2193-visible-message-spacing re-anchor cycle loops and startup assertions to details. A changeset note documents the behavior change.

Reviewed by Cursor Bugbot for commit 77544df. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Start InteractiveMode chats at the middle conversation-detail level

New interactive chats now open in the details state: edit diffs are expanded, thinking blocks are visible, and tool output stays collapsed. The Ctrl+O cycle order is unchanged. Regression tests for chat-detail cycling, visible-message spacing, and shell-notification ordering are updated to begin from the new details-first initial state.

  • Behavioral Change: InteractiveMode initial state changes from overview (collapsed diffs, hidden thinking) to details (expanded diffs, visible thinking). Reopened and live chats both start at details and cycle details -> all-output -> overview.

Macroscope summarized 77544df.

@github-actions

github-actions Bot commented Sep 17, 2026

Copy link
Copy Markdown

Prime Agent performance — completed

PR 77544df4 compared with main e2fb7bfa.

Overall: 1 regressed · 0 improved · 39 no clear change.

Metric Main This PR Change
Cold startup 1,553.5 ms 1,649.9 ms ≈ +96.4 ms (+6.20%)
Warm startup 913.6 ms 1,008.3 ms ≈ +94.7 ms (+10.37%)
Installation 15.02 s 15.63 s ≈ +0.62 s (+4.11%)
Compressed release artifacts 72.49 MB 72.54 MB ≈ +0.05 MB (+0.07%)
Installed footprint 577.65 MB 577.65 MB ≈ +0.00 MB (+0.00%)
Idle memory, summed RSS 1,254.05 MB 1,269.83 MB ≈ +15.78 MB (+1.26%)

Python runtime

Metric Main This PR Change
Python kernel startup 137.6 ms 151.3 ms ≈ +13.7 ms (+9.92%)
Python cell round trip 0.529 ms 0.655 ms $\textcolor{#b8625f}{\textsf{↑ +0.126 ms (+23.88\%)}}$
Empty bash command 12.5 ms 14.5 ms ≈ +2.0 ms (+16.32%)
Bash git status 17.8 ms 21.2 ms ≈ +3.4 ms (+19.31%)
Bash 32 KiB output 13.4 ms 14.7 ms ≈ +1.3 ms (+9.71%)
35 cells / 9 shell calls 188.1 ms 208.7 ms ≈ +20.7 ms (+10.98%)
Python interrupt to done 1.688 ms 1.846 ms ≈ +0.158 ms (+9.36%)
Python state snapshot 26.5 ms 29.3 ms ≈ +2.7 ms (+10.31%)
Python state restore 362.7 ms 428.5 ms ≈ +65.8 ms (+18.14%)
Python idle RSS 34.47 MB 33.28 MB ≈ -1.19 MB (-3.44%)
Python RSS after pandas workload 96.91 MB 95.37 MB ≈ -1.54 MB (-1.59%)

UI interactions

Metric Main This PR Change
Resume large session (cold) 3,739.9 ms 4,187.2 ms ≈ +447.3 ms (+11.96%)
CPU, resume large session 6,120.0 ms 6,680.0 ms ≈ +560.0 ms (+9.15%)
Switch into large session 5,416.5 ms 5,914.6 ms ≈ +498.1 ms (+9.20%)
CPU, switch into large session 9,340.0 ms 10,950.0 ms ≈ +1,610.0 ms (+17.24%)
Open agents view from a session 165.5 ms 170.1 ms ≈ +4.6 ms (+2.78%)
CPU, open agents view 290.0 ms 330.0 ms ≈ +40.0 ms (+13.79%)
Full agents roster, many sessions 4.47 s 4.46 s ≈ -0.0091 s (-0.20%)
CPU, full agents roster 3.11 s 3.28 s ≈ +0.17 s (+5.47%)
Open another session from agents view 2,878.9 ms 2,802.7 ms ≈ -76.1 ms (-2.64%)
CPU, open from agents view 3,300.0 ms 3,090.0 ms ≈ -210.0 ms (-6.36%)
Reopen resident large session 552.9 ms 601.4 ms ≈ +48.5 ms (+8.78%)
CPU, reopen resident session 930.0 ms 1,190.0 ms ≈ +260.0 ms (+27.96%)
Open subagent session at depth 6 21,361.9 ms 21,404.2 ms ≈ +42.3 ms (+0.20%)
CPU, open subagent at depth 6 10,380.0 ms 10,390.0 ms ≈ +10.0 ms (+0.10%)
Open chain parent from agents view 4,092.2 ms 4,092.4 ms ≈ +0.1 ms (+0.00%)
CPU, open chain parent 4,050.0 ms 4,260.0 ms ≈ +210.0 ms (+5.19%)
Scheduled catalog, first request 1,877.1 ms 1,935.9 ms ≈ +58.8 ms (+3.13%)
CPU, scheduled catalog 3,120.0 ms 3,180.0 ms ≈ +60.0 ms (+1.92%)
Scheduled catalog, repeated request 1,200.7 ms 1,281.4 ms ≈ +80.7 ms (+6.72%)
CPU, repeated catalog 1,650.0 ms 1,680.0 ms ≈ +30.0 ms (+1.82%)
Cold worker with three catalog scans 1,617.8 ms 1,740.4 ms ≈ +122.5 ms (+7.57%)
CPU, cold worker and scans 4,460.0 ms 5,000.0 ms ≈ +540.0 ms (+12.11%)
UI memory after interactions 2,678.16 MB 2,676.32 MB ≈ -1.84 MB (-0.07%)

Sandbox cost: ~$0.1508 — no inference calls.
Run, logs, and downloadable raw results

Methodology and samples

Main resolved at 2026-09-17T20:12:20.355515+00:00. Harness e2fb7bfa.
Linux x64, 4 vCPU, 8 GB RAM, 20 GB disk; region us.
Image: node:24-bookworm@sha256:be23f54a88d34e8824c741b19b91064094f92c1c97b194144bfc8b50d67258e2.
Stock tools, skills, daemon, and Python bootstrap enabled; fresh homes and a fixed Git fixture.
Onboarding is dismissed; the editor starts without a selected model or submitted prompt.
Medians shown. Arrows require a 20% timing/memory change plus absolute floors and IQR.
These practical noise floors are not a statistical significance test.
Cold means stopped Prime processes; OS filesystem caches are not flushed.
No model requests or credentials. Installation excludes build/setup time.
Installer tarballs use loopback; npm/Python downloads use the network with fresh caches.
Artifact size counts release tarballs; footprint after first use includes registry packages.
MB is decimal. Summed RSS can double-count shared pages; PSS is recorded when available.
Provisioning, setup, and build durations are recorded separately in the raw results.
Kernel probes use the installed JSONL runtime, outside the TUI/TypeScript host.
Per trial: 50 Python cells, 5 calls per shell case, and one 35-cell mix (9 git status calls).
Cell/shell values are batch means; other runtime timings are single operations.
State fixture: a 10,000-row × 8-column integer DataFrame and a 10,000-integer list.
Restore runs in a fresh kernel, including pandas imports; kernel startup is excluded.
Kernel RSS covers the isolated Python process; loaded RSS follows the pandas workload.
UI trials use a fresh fixture set: 194 top-level sessions including one ~40 MB transcript,
40 ledger fan-out children, and a 6-deep subagent chain (~46 spawn edges).
Large fixtures hold 1,999 complete triples (~5 MB JSONL); medium 119; subagents 399 each.
Interactions: cold --resume of a large session, warm /resume switch, left-arrow to agents view,
roster settle with many saved sessions, search-and-open of another large session,
reattaching to that resident session, opening the chain parent, and drilling to depth 6.
Readiness is the rendered transcript tail plus a confirmed editor echo.
CPU metrics sum utime+stime across the whole benchmark-user process tree per interaction.
UI memory sums RSS after the interactions; PTY byte counts are in the raw results.
A separate catalog fixture has 2,300 sessions, 2,298 edges, and 13 paused scheduled-job owners.
Catalog timings cover first/repeated reads and cold worker creation under three pending scans.
All expected jobs and owner metadata are checked; worker readiness excludes TUI rendering.
Costs estimate full sandbox lifetimes at configured rates, including setup and build.
Budget target: $1; not a billing cap. Performance changes are informational.
Failed or incomplete execution fails the workflow; saved artifacts remain available.
Each side stops a phase after 2 identical consecutive failures.
Skipped trials are not attempted samples. Warm startup requires a successful cold launch.

Metric Main successful/attempted PR successful/attempted Main spread PR spread
Cold startup 10/10 10/10 IQR 68.0 ms IQR 187.5 ms
Warm startup 10/10 10/10 IQR 74.4 ms IQR 110.5 ms
Installation 3/3 3/3 range 0.11 s range 0.61 s
Compressed release artifacts 1/1 1/1
Installed footprint 1/1 1/1
Idle memory, summed RSS 10/10 10/10 IQR 150.40 MB IQR 13.82 MB
Python kernel startup 10/10 10/10 IQR 5.3 ms IQR 21.1 ms
Python cell round trip 10/10 10/10 IQR 0.064 ms IQR 0.083 ms
Empty bash command 10/10 10/10 IQR 1.7 ms IQR 1.4 ms
Bash git status 10/10 10/10 IQR 2.0 ms IQR 2.0 ms
Bash 32 KiB output 10/10 10/10 IQR 1.8 ms IQR 1.3 ms
35 cells / 9 shell calls 10/10 10/10 IQR 30.9 ms IQR 17.8 ms
Python interrupt to done 10/10 10/10 IQR 0.449 ms IQR 0.152 ms
Python state snapshot 10/10 10/10 IQR 2.0 ms IQR 6.6 ms
Python state restore 10/10 10/10 IQR 21.2 ms IQR 83.6 ms
Python idle RSS 10/10 10/10 IQR 2.11 MB IQR 4.91 MB
Python RSS after pandas workload 10/10 10/10 IQR 2.56 MB IQR 5.72 MB
Resume large session (cold) 3/3 3/3 range 994.5 ms range 589.3 ms
CPU, resume large session 3/3 3/3 range 350.0 ms range 290.0 ms
Switch into large session 3/3 3/3 range 521.1 ms range 810.2 ms
CPU, switch into large session 3/3 3/3 range 910.0 ms range 2,210.0 ms
Open agents view from a session 3/3 3/3 range 8.2 ms range 6.2 ms
CPU, open agents view 3/3 3/3 range 220.0 ms range 170.0 ms
Full agents roster, many sessions 3/3 3/3 range 0.40 s range 0.41 s
CPU, full agents roster 3/3 3/3 range 0.26 s range 0.80 s
Open another session from agents view 3/3 3/3 range 241.5 ms range 215.0 ms
CPU, open from agents view 3/3 3/3 range 380.0 ms range 200.0 ms
Reopen resident large session 3/3 3/3 range 89.6 ms range 3.9 ms
CPU, reopen resident session 3/3 3/3 range 140.0 ms range 300.0 ms
Open subagent session at depth 6 3/3 3/3 range 394.0 ms range 418.1 ms
CPU, open subagent at depth 6 3/3 3/3 range 680.0 ms range 1,770.0 ms
Open chain parent from agents view 3/3 3/3 range 308.6 ms range 153.9 ms
CPU, open chain parent 3/3 3/3 range 440.0 ms range 700.0 ms
Scheduled catalog, first request 3/3 3/3 range 91.4 ms range 156.7 ms
CPU, scheduled catalog 3/3 3/3 range 370.0 ms range 480.0 ms
Scheduled catalog, repeated request 3/3 3/3 range 186.1 ms range 206.4 ms
CPU, repeated catalog 3/3 3/3 range 300.0 ms range 300.0 ms
Cold worker with three catalog scans 3/3 3/3 range 210.1 ms range 277.2 ms
CPU, cold worker and scans 3/3 3/3 range 830.0 ms range 680.0 ms
UI memory after interactions 3/3 3/3 range 105.26 MB range 65.07 MB

@sethkarten
sethkarten enabled auto-merge (squash) September 17, 2026 21:18
@sethkarten
sethkarten requested a review from xeophon September 17, 2026 21:21
@sethkarten
sethkarten merged commit f2a9ad6 into main Sep 17, 2026
46 checks passed
@sethkarten
sethkarten deleted the rsi/default-chat-detail-middle branch September 17, 2026 23:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants