Good, that is the right call on both counts and you are further along than I guessed.
Resolving at first use is the version that survives a user reordering rows, and taking the wrap width from innerWidth on Window_Message rather than patching a height is the seam that also survives another plugin resizing that window, which is the case that usually breaks wrapping quietly.
Thanks for the correction.