The pager's click pipeline (_mouse → _screenToByte/_followRow, pager.js:813-927) maps screen cells to bytes with no viewport/mode guards and codepoint-not-column arithmetic. All VERIFIED headless (2026-07-07 audit) unless noted. Method Issues.
scroll + row - 1 (pager.js:831); the STATUS BAR row maps to the first row BELOW the fold — a click on the status bar navigates via an off-screen hunk (VERIFIED). Clicks on blank rows past EOF clamp to the last row and navigate too (pager.js:749)._mouse ignores this.mode — a click while the address bar is open runs the spell UNDER the bar; the bar stays open with the stale half-typed command; the wheel scrolls behind it (VERIFIED)._screenToByte counts emitted codepoints but the terminal reports COLUMNS — any click at/after a CJK/emoji (2-col) char maps to the wrong byte/target (VERIFIED: 汉字x, col 3 → byte of x). Same root defect in view/bro.js rowEnd/rowEndPass: soft-wrap breaks after cols CODEPOINTS = up to 2×cols columns → the row overflows and hard-wraps the frame (arithmetic-certain, visually unverified)._screenToByte skips only U/O tags while the renderer also hides the other diff SIDE — hidden bytes consume click columns, so every click on a modified line mis-maps, possibly to a byte not on screen (VERIFIED: rm-side bytes shift the IN-pass mapping)._followRow/_screenToByte fall back to this.rows(80) (pager.js:747, :841) — a click processed in the same _feed chunk as the view-swap indexes at 80 cols, not the real width (VERIFIED at 20 cols).(b & 0x23) ignores Shift/Meta/Ctrl bits — a modified click acts as a plain one (nit)._screenToByte, rowEnd, _fit, _banner) and skips exactly what the renderer hides (diff side included).views/bro/pager.js + view/bro.js; mirror C bro's bro_screen_to_byte where it already solves this; the C twin may need the same audit (file a linked ticket if so).