fix: bound TUI transcript rendering - #3386
Merged
Merged
Conversation
breznknecht
force-pushed
the
codex/issue-3309-bounded-transcript-render
branch
from
September 16, 2026 14:19
b6bdfee to
b7a046d
Compare
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.
TL;DR
Reading older TUI chat now stays responsive as the transcript grows. The TUI renders only the visible viewport plus bounded overscan, preserves the reader's local anchor across transcript changes, and retains styled rows within explicit row and byte caps.
Closes #3309
Context
The unpinned transcript path previously laid out and styled every resident message during each update. An unchanged 10,000-message transcript took about 731 ms per production
UpdateplusViewsample on the benchmark machine, even when the reader only needed one viewport.This change keeps semantic messages authoritative while moving viewport navigation and disposable paint data into focused TUI owners. It does not change transcript storage, wire identity, or the remaining #2715 responsibilities.
Changes
Verification
go test ./...mix protocol.gen --checkmix conformance: 162 passedmake lint: Credo, Dialyzer, duplication, architecture policy, and fast lint passedThe reproducible benchmark source and all raw outputs are in
docs/performance/issue-3309/.The unpinned 10,000-message mean improved by 255x. Pinned p95 improved by 28.8%, and pinned allocations fell by 4.4%.
Acceptance Criteria Addressed
UpdateplusViewbenchmarks, deterministic counters, raw receipts, and exact oracle comparisons demonstrate the new bound. ✅