feat(prosediff): recover the source line each word edit sits on (spec-by6.3.5) The review UI is moving to a line-numbered unified diff, which needs to know which line a word-level change happened on. The differ does not keep that. Tokenize drops whitespace — "\n" and " " both collapse to Token.Space — and that is precisely what makes a rewrapped paragraph produce a byte-identical token stream and therefore no diff at all. The property is load-bearing, so the line is recovered here rather than retained there. It is recoverable because the script is ordered: the equal and deleted runs reproduce the old block's tokens in sequence, and the equal and inserted ones the new block's. Walking each side in step with that side's re-tokenized lines says which line every token belongs to, and a run crossing a line break is cut at the boundary. The script supplies only the operation per token; text and spacing come from re-tokenizing the source line. Taking text from the spans instead drops separators — Span.Space is false on an insertion that directly replaces a deletion, because in a combined rendering the deletion before it carried the space, and split onto one side that deletion is gone. Caught by a test: "delta CHANGED zeta" rendered as "deltaCHANGED zeta". Reports ok=false rather than guessing when a block's Lines and Text disagree about token count. A caller that cannot split falls back to rendering the block as one old/new pair labelled by line range: a wrong line number is worse than an honest range, because it invites a comment onto text that was never there. spec-by6.3.5