Masker fragments a caller's Write, breaking \r-flushed trace entries
Problem
The phrase matcher in streamer/sanitizer + phrasestream emits its output in several pieces:
- plaintext flushed ahead of a candidate phrase prefix
- single bytes replayed after a failed match
- mask callbacks
Each piece was written straight through, so a single Write from a producer became several downstream writes.
Downstream, the \r-flushing timestamper starts a new trace entry for any write containing a carriage return. The transfer meter emits each progress update as one atomic, \r-led write ("\rUploading cache <n>/<total> (<rate>)…"). When the job has a masked secret, the matcher split that frame at an interior byte, so the timestamper emitted it across two entries with two timestamps, visibly breaking the word:
… 01O+\rUploading cach
… 01O+e 0 B/7.30 GB (0 B/s) \rUploading cachThis only reproduces when the job has masked variables, which is why it slipped through.
Expected behavior
The masker should buffer a single top-level Write's output and flush it once, preserving the caller's write boundary. The bytes emitted and the masking decisions should be unchanged, only the batching.