Padded the buffer name in my mode line to a fixed width so the bits after it line up, and it worked for a long while (well, in every buffer I happened to open).
(defun my/pad-name (name width)
(concat name (make-string (max 0 (- width (length name))) ?\s)))
Then I opened 회의록.org and everything to the right of it slid over by three columns. length counts characters, and three Hangul syllables are three characters, but each one takes two columns on screen. (string-width "회의록") says 6, (length "회의록") says 3. (M-: both and you'll see it straight away.)
The fix is a function that counts columns to begin with.
(defun my/pad-name (name width)
(truncate-string-to-width name width nil ?\s))
It pads short names and cuts long ones to the same width. (The manual is upfront that string-width is an approximation, composed characters and fonts can still fool it, but Hangul syllables come out right.) Rough rule from here on, anything headed for the screen gets measured with string-width and never with length.