computeLineHash mixed in the line index for blank and punctuation-only lines so any line shift invalidated anchors whose content was unchanged. Two adjacent blank lines now collide on the same hash by design; the range and op disambiguate by line number.