fix(web): expanded tool output stays above the composer#24436
Problem
Expanding a tool call or reasoning row near the composer while the timeline is above its end leaves the expanded content hidden behind the composer. The row header stays fixed even when later detail fetching makes its body taller.
Change
Reveal expanded content above the composer, capped so the activated header remains visible. Follow late content layout until the user interacts again, collapses the disclosure, or leaves the thread. Preserve existing collapse and pinned-to-end behavior.
Scope and approval
Fixes https://github.com/pingdotgg/t3code/issues/21967
Triaged bug via the automated issue flow. GitCafe: #21967
Verification
vp run check:changedpassed after integrating main: format, lint, both knip checks, scoped typecheck, and 96 tests in three files.- Real Chromium web dev-server reproduction at 1280×800: expanding a command at y=600 originally left its body ending at y=981 behind the composer at y≈637. With the fix, the body ends at y=620 and its header remains visible at y=239.
- Web and desktop share the changed timeline. Native mobile, providers, contracts, and server behavior are unchanged.
Evidence
Before d53873b6a4; after a92c50fef3. Real dev-server app, Chrome 154/Linux, DPR 2, 16px root font, frozen clock. CSS viewports 1440×900 and 390×844, both themes.
| Before | After |
|---|---|
| Desktop light recording, d53873b6a4 | Desktop light recording, a92c50fef3 |
390×844 light comparison: before left, after right
Full timestamped evidence index includes eight recordings, 56 stills, 28 before/after pairs with zero-threshold amplified and threshold-8 diffs, and the complete visible-difference list. Reproduction seed; complete artifact archive.
What else changed visibly: surrounding timeline text and headers move with the intended reveal; the scroll-to-end overlay moves relative to content. One desktop-light pre-toggle pair differs in timestamp/copy hover controls. Recordings contain pointer/click indicators and profile setup transitions.
Proof audit pass 2: core evidence credible, full matrix INSUFFICIENT. The auditor independently rebuilt command-open with zero changed pixels, recomputed all 28 diff counts exactly, and inspected all stills and recording keyframes. Delayed growth and takeover cancellation remain unverified; no implementation defect was established by the proof audit.
Remaining verification
This PR remains draft: six of eight matrix families have partial evidence; none has complete matrix coverage. Delayed detail/media arrival, live transitions, the full tool gallery, attempt folds, tall-content bounds, thread-switch cleanup, and conclusive takeover cancellation remain unverified. Actual Electron and remote smoke are also unverified. The final document-wide takeover correction has scoped checks but no fresh independent review after the three review rounds.
Capture export limits: desktop PNGs were downsampled to 1280×800 despite the measured 1440×900 CSS viewport; narrow PNGs are 780×1688. Recording resize changes produce letterboxing. Narrow collapsed-composer measurements do not establish exact inset arithmetic. These captures demonstrate the core command/reasoning improvement, not a complete proof pass. CI and bot review remain pending; no bugfix gate label is applied.
Models: Claude Opus 5.5 implementation; GPT-6.1-Sol and Claude Opus 5.5 review; Codex and Claude Agent harnesses in T3 Code.
Checks
Added 5 commits
- fix(web): expanding a disclosure reveals its content above the composer22cbf01
- fix(web): disclosure reveal follows late content until the user takes over35a377a
- fix(web): disclosure reveal follows content that loads after expanding9c51e70
- Merge main into fix/issue-21967a92c50f
- fix(web): input outside the timeline also ends a disclosure revealfc378ca