HERTZ RCA — Claude settings left-shift + `To`/`Wh`/`Es` left-margin scraps Date: 2026-07-18 Verdict: CONFIRMED ScreenGrid display-width defect in synthesized attach repaint. Not whitespace trimming, rc overlay, PTY resize, or output transport. FIELD SHAPE Screenshot shows 2-character fragments at physical column 1 on otherwise blank rows, including the row immediately above `Search settings...`, plus a nearby row shifted by two display columns. This is the exact overflow signature of two unmodeled wide-cell continuations during a synthesized repaint. ROOT `crates/spt-term/src/screen.rs` models each cell only as `{ ch: char, pen }` (122-145). `GridState::put_char` (327-344) writes every Unicode scalar into one cell and always advances `col += 1`. There is: - no Unicode display-width dependency; - no wide-lead / wide-continuation representation; - no combining-grapheme attachment; - no normalization of wide halves in ECH/EL/ED/ICH/DCH or resize. A real VT renders many Unicode scalars at width 2 and combining marks at width 0. ScreenGrid therefore undercounts physical columns. CUP/ECH/overwrite operations index into the wrong cells, and `render_repaint` (577-642) emits one stored `char` per modeled cell. A modeled row that fits `cols` can physically exceed `cols`, wrap its final characters into the next row's left margin, and leave them there because repaint skips wholly-default modeled rows (598-607). EXACT REPRODUCER — screenshot scrap shape Use a 3x10 ScreenGrid and feed: `ESC[1;1H界界ABCDEFGH ESC[3;1HSearch` (two width-2 glyphs + eight ASCII scalars). ScreenGrid stores 10 scalar cells on row 1 and believes the row fits. `render_repaint` first clears the real screen, then CUP-paints the row sequentially. A width-aware 10-column terminal consumes 12 physical columns, so trailing `GH` wraps to row 2 columns 1-2. ScreenGrid believes row 2 is blank and skips painting it, so `GH` survives immediately above the CUP-painted `Search` row. Substitute suffixes `To`, `Wh`, and `Es` to reproduce the photographed left-margin fragments exactly. The initial `CSI 2 J` cannot heal this: the overflow occurs after the clear, during repaint. EXACT REPRODUCER — wrong overwrite/prefix shape Feed a 1x20 grid with: `界界Today ESC[1;5HNEW` A real VT puts `Today` at physical column 5 after two width-2 glyphs; CUP 1;5 overwrites `Tod`, yielding `界界NEWay`. ScreenGrid places `Today` at modeled column 3; CUP 1;5 overwrites `day`, so repaint yields `界界ToNEW`. The stale `To` is the two-column width deficit made visible. WHY IT APPEARS AFTER ATTACH / IN MENUS Live PTY output is forwarded byte-for-byte. The corrupting seam is the broker's synthesized current-screen repaint used on attach/reattach. It reconstructs a physical client screen from the under-width model. Claude/Ratatui then sends differential updates relative to its correct PTY-side screen assumption; those updates cannot reliably erase cells that the corrupt repaint wrapped or misplaced. Dense Unicode TUI transitions such as Settings expose the latent baseline divergence. RULED OUT 1. rc identity overlay: current main has `STATUS_ROW_ENABLED=false` (`rc.rs:198-215`); its legacy implementation changes rows, never columns. The bottom `todlando @ HFENDULEAM (spt-core/)` label in the screenshot is Claude Code's session display name supplied by the claude-spt adapter's `-n` launch argument, not core's disabled StatusRow. 2. PTY resize: controller preserves columns and subtracts only one row when legacy status is active (`rc.rs:1870-1882`, 2210-2229). Cannot create a horizontal -2. 3. Transport trimming: live Output records remain byte-exact; repaint deliberately clears first. No shared whitespace filter exists. 4. DECSTBM: now tracked/replayed; a mismatch moves rows, not a deterministic two-column prefix/wrap signature. 5. Exit/output ordering and teardown: affect final frames/detach, not an active menu. SEPARATE REAL SEAM, NOT THIS ROOT `crates/spt-term/src/reader.rs` answers DSR `ESC[6n` with fixed `1;1` before forwarding the query, while the physical terminal can also answer it; the child may receive two CPRs, one false. That deserves a separate requirement, but it does not mutate ScreenGrid and does not explain deterministic width-2 margin scraps. FIX CONTRACT Use a width-aware grid: - resolve each printable grapheme's terminal cell width under the product's width policy; - represent width-2 glyphs as WideLead + WideContinuation cells; - attach width-0 combining marks to the preceding grapheme/cell rather than advancing; - before replacing/erasing/inserting/deleting/resizing any cell, normalize both halves of an intersected wide glyph; - wrapping/pending-wrap must advance in display cells and never split a wide glyph at the right edge; - repaint emits a lead once, skips continuation payload, but preserves the full rectangular cell baseline including blanks; - invalidation/repaint after resize or width-policy change. REGRESSION CONTRACT Do not compare ScreenGrid to itself; that shares the defect. Apply synthesized repaint bytes to an independent width-aware stateful terminal emulator and assert physical cells. 1. Exact 3x10 `界界ABCDEFGH` + blank middle + `Search` case: row 2 remains blank; no wrapped suffix. 2. Exact CUP overwrite case: physical result matches authoritative width-aware interpretation. 3. Combining-mark case: mark consumes zero cells and survives repaint attached to its base. 4. Replace/erase/ICH/DCH across either half of a wide glyph: no orphan lead/continuation. 5. Wide glyph at final/penultimate column: correct wrap behavior. 6. Production broker cold-attach wire test: wide-glyph child frame -> synthesized repaint -> next raw differential frame; independent emulator equals the authoritative child screen. Secondary DSR regression should independently assert the child receives exactly one accurate CPR for one DSR query, not a fixed broker reply plus physical reply.