Skip to content

fix(web): keep composer banners readable and stop scroll jumps when the pill mounts - #668

Merged
rynfar merged 4 commits into
pylonfrom
upstream/2026-09-19-chat-rendering
Sep 19, 2026
Merged

rynfar merged 4 commits into
pylonfrom
upstream/2026-09-19-chat-rendering

Conversation

@rynfar

@rynfar rynfar commented Sep 19, 2026 •

Copy link
Copy Markdown
Collaborator

Ports two upstream web fixes from T3 Code. Part of upstream integration cycle #667, bounded at upstream b44c1ce5d25ee0d5a5be82e380618a886c19ea96.

Sources

Source Upstream Outcome
4749035bda13b4b6260499caedbc0d69a2f60e6f #12166 keep composer banners compact and readable Adopted
fcfd9f911a27ee3b813d64582c53d82dfa2e892b #12317 keep chat from jumping when the scroll-to-end pill mounts Adopted

Both applied by cherry-pick -x with original authorship retained; each needed one conflict resolved against Pylon's diverged code.

Composer banners

Banner stack items gain an optional compact flag. Compact banners keep the old wrap-actions-narrow row layout and the description that collapses into an info popover below 400px; everything else now uses wrap-actions, giving the description room to sit beside the title instead of being truncated away. The popover gains an accessible label, a wider max width, wrap-anywhere, and a bounded scroll region so a long description stays readable. Only the two project-clone banners are marked compact, matching upstream.

Adaptations

  • ComposerBanner.Actions: upstream's hunk also carries classes for an approval banner layout. Pylon's ComposerBanner.Row layout union is "inline" | "wrap-actions" | "wrap-actions-narrow" — it has no approval layout, which arrives in a different upstream commit Pylon has not adopted. Only this source's actual change was applied: the 400px wrap-actions case drops -ms-2/justify-start for justify-end. No dead classes for a layout that does not exist here.
  • ComposerTasksBadge: upstream replaces sm:flex with the container query @min-[560px]:flex on the task segment bar. Pylon's badge is substantially diverged — it renders a delegates label, hides segments while the list is expanded, and uses TaskProgressSegments fit rather than upstream's TaskSegments. All of that is preserved; only the breakpoint changed.

Pylon's other nine banner producers (environment unavailable, server version, background liveness, thread woke/snoozed, resume compaction, branch mismatch, send-environment) are left non-compact, which matches upstream's default for its own equivalents.

Scroll-to-end pill

Publishing the composer overlay height and publishing the scroll-to-end clearance were one callback, and the effect that ran it listed showScrollToBottom as a dependency. The pill mounts in the same commit that rests the composer, so a fast fling could measure a stale overlay height against the new resting flag, drop the timeline inset reservation and yank the scroll position. publishScrollToEndClearance is now split out, the height publisher records the last height in a ref, and a separate layout effect recomputes only the clearance when the pill appears.

Adaptation

The conflict sat where Pylon inserts linkedPullRequestStatus and resolveDisplayedThreadPr immediately after that effect. Upstream's effect split and dependency change were taken; Pylon's pull-request resolution block is preserved unchanged.

Not included

592021f008 (#12302) and fbc8b96002 (#12270) were in this cycle's selection but are not ported here. Both refine upstream's activity-group timeline — ActivityGroupTimelineRow, ReasoningTraceBlock, expandedReasoningMessageIds, isActivityEntry, reasoningMessages — none of which exist in Pylon. Their disposition is tracked in #667; adopting the underlying architecture is a separate product decision, not a catch-up adaptation.

Verification

  • vp test run on ComposerBannerStack.test.tsx, ComposerTasksBadge.test.tsx, ComposerPendingUserInputPanel.test.tsx, ChatView.logic.test.ts, MessagesTimeline.logic.test.ts — 5 files, 284 tests passed.
  • vp run -F @t3tools/web typecheck — exit 0.
  • vp check on the five changed files — 0 errors. The 25 warnings are pre-existing React-compiler notes; the two outside ChatView.tsx are at ComposerBannerStack.tsx:71 and ComposerPendingUserInputPanel.tsx:93, both outside every changed hunk.

These are visual changes to banner density and scroll behavior. Browser evidence is not attached — computer use is not authorized for this cycle. Recorded as outstanding in #667.


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need. Autofix is disabled.

Bil0000 and others added 2 commits September 19, 2026 11:17
(cherry picked from commit 4749035bda13b4b6260499caedbc0d69a2f60e6f)
…#12317)

(cherry picked from commit fcfd9f911a27ee3b813d64582c53d82dfa2e892b)
@vercel

vercel Bot commented Sep 19, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated
pylon-marketing Ignored Ignored Preview Sep 19, 2026 6:04pm UTC

@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:M labels Sep 19, 2026
…on v2

Records DEF-18 for upstream #12302 and #12270. Neither refines anything
Pylon has: there is no ActivityGroupTimelineRow, ReasoningTraceBlock or
reasoning field in contracts, so adopting them first means adopting
#11784 and #12147, a new full-stack capability. Orchestration v2 is
unmerged on t3code/codex-turn-mapping and will rewrite orchestration
contracts, so the maintainer parked this behind that decision.
@github-actions

github-actions Bot commented Sep 19, 2026 •

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

Provider Metric Main baseline This PR Impact PR ceiling
Codex Total thread wire 13.9 KiB 14.0 KiB +36 B (+0.3%) 15.1 KiB ✅
Codex Thread snapshot wire 7.2 KiB 7.2 KiB +3 B (+0.0%) 7.3 KiB ✅
Codex Live turn WebSocket wire 6.7 KiB 6.7 KiB +33 B (+0.5%) 7.8 KiB ✅
Codex Live turn WebSocket decoded 58.0 KiB 58.0 KiB +44 B (+0.1%) 66.4 KiB ✅
Codex Live turn messages 8 9 +1 (+12.5%) 21 ✅
Claude Total thread wire 14.0 KiB 14.0 KiB +10 B (+0.1%) 15.1 KiB ✅
Claude Thread snapshot wire 7.2 KiB 7.2 KiB −7 B (−0.1%) 7.3 KiB ✅
Claude Live turn WebSocket wire 6.7 KiB 6.7 KiB +17 B (+0.2%) 7.8 KiB ✅
Claude Live turn WebSocket decoded 58.9 KiB 58.9 KiB 0 B (0.0%) 66.4 KiB ✅
Claude Live turn messages 9 9 0 (0.0%) 21 ✅

Baseline: 2725b65 · PR result: 979cd5d · 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: 115.6 KiB
  • Claude decoded thread snapshot: 116.3 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

Adversarial review found that upstream's non-compact layout renders a
permanently visible details popover next to descriptions that can never
truncate. Five Pylon banners qualify: environment update, thread woke,
snoozed/settled, resume-compaction and auto-balance. Marks them compact,
aligns the delegates label with the segment bar's container query, and
adds the ComposerBannerStack coverage the flag shipped without.
@github-actions github-actions Bot added size:L and removed size:M labels Sep 19, 2026
@rynfar
rynfar merged commit 4e421f1 into pylon Sep 19, 2026
20 checks passed
@rynfar
rynfar deleted the upstream/2026-09-19-chat-rendering branch September 19, 2026 18:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L 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.

3 participants