mirror of
https://github.com/storytold/wordcraft.git
synced 2026-11-01 14:27:16 -06:00
lcs_ops is a textbook LCS, which finds the mathematically longest common subsequence, not the most readable edit script. On two short strings that happen to share a few characters in a different order (very common with dates, IDs, phone numbers), it faithfully threads a chain of single-character matches through what a reader expects to be one clean replacement — e.g. "01.09.2026" -> "19.10.2026" came out as an alternating run of tiny deletions and insertions instead of deleting "01.09" and inserting "19.10". Add collapse_noise_matches, called only for character-level compares: it folds a short (length-1) match that sits strictly inside a run of edits back into the surrounding delete/insert, flattening the region into one clean delete followed by one clean insert. A match that opens or closes the whole sequence is the genuine common prefix/suffix lcs_ops already stripped before running its table, so it's never touched regardless of length, and the fold is gated on character granularity only — a matched whole word at word-level compare is essentially never a coincidence and must survive. Fixes #3094. Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>