Skip to content

bug(terminal): WebGL atlas changes leave stale glyphs after scrolling #789

Closed

Description

@Juliusolsson05

Expected behavior

Scrolling raw terminal history and displaying colored CLI output must repaint the visible cells correctly without disturbing running sessions.

Actual behavior and evidence

User reports left-edge stale colored cells/text fragments after scrolling a plain terminal running interactive Claude on macOS after the WebGL performance change (#783). The exact screenshot cause is not yet confirmed.

An independent Electron reproduction using the installed @xterm/xterm 6.0.0 and @xterm/addon-webgl 0.19.0 found a concrete related defect: atlas page merges during colored output leave stale rendered pixels; repainting without changing terminal buffer content corrects them. Scrollback navigation also reproduced this instability. Synthetic two-terminal stress: 148 removed atlas pages, 33 output-frame mismatches and one scroll-frame mismatch, versus a subsequent explicit refresh of identical buffer contents.

Investigation and acceptance

  • Verify whether scheduling a coalesced repaint after atlas layout changes resolves the deterministic reproduction.
  • Preserve GPU acceleration, input/PTY ordering, terminal history, and DOM context-loss fallback.
  • Cover teardown and late-import lifecycle, real rendered-pixel stability, and all shared-helper terminal hosts.
  • Do not restart or kill live agents to investigate.

Related upstream investigation: xtermjs/xterm.js#6038 . Our pinned 0.19.0 implementation predates newer merge-retry logic; do not assume every upstream failure mode applies unchanged.

Activity

  1. Juliusolsson05 commented on Sep 5, 2026

    @Juliusolsson05
    OwnerAuthor

    Implementation and verification are in #790. The installed 0.19.0 addon has two reproduced mechanisms: stale cell texture coordinates after a mid-frame atlas merge, and per-page texture-version collisions that can leave an old GPU texture bound. A refresh-only experiment removed frame instability but failed an independent fresh-atlas pixel oracle, so it was not shipped. The final repair invalidates bindings and coalesces a viewport refresh on atlas layout events without clearing the shared glyph cache. Final real Electron run: 148 distinct page removals; control has 33 output-frame mismatches, one scroll mismatch, and 1,264,868 differing pixel channels against an independent reference; production loader has zero mismatches and zero reference differences. Exact screenshot confirmation remains pending deployment; no live session was restarted.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions