Break text on purpose, not by accident
Dirty text arrives on its own schedule. The form that survives a paste from a spreadsheet, the OCR output with a dropped letter in every third word, the support ticket whose lines arrive out of order — pipelines meet all of it eventually. This workflow runs the other direction on purpose: it takes clean text you control and damages it in ways you choose, so a parser, a corrector, or a reading experiment can be judged against damage that is documented instead of accidental. The difference between this and simply mangling a file in an editor is reproducibility — a corruption you can regenerate is a test asset, and one you cannot is just a broken file.
Sentences before words, words before characters
Work from coarse grain to fine. Sentence-level tools reshape structure — filter the corpus down to the sentences an experiment actually needs, remove the ones that carry noise into the fixture, duplicate sentences when a before-and-after comparison must sit side by side, and reverse sentences to build mirrored test material. Word-level tools then disturb vocabulary and order without touching structure — filter which words a parser must survive, duplicate words to exercise repetition handling, reverse words for palindrome-style fixtures, and swap adjacent word pairs to bend syntax while conserving every word. Character-level noise comes last and mimics the physical world — inserted letters stand in for fat-finger typing, removed letters for dropped strokes, and stripped symbols for scanner debris. Skipping levels produces damage that is loud but meaningless; a fixture that is simultaneously shuffled, shuffled again, and peppered with random symbols tests nothing in particular.
Random does not mean unaccountable
The random tools vary between runs, and that is the point — but the magnitude must stay describable. Inserters should grow the character or word count by an amount you named in advance, removers should shrink it likewise, and a shuffle should change order and nothing else. Note the settings for every pass, and when a test needs stable fixtures, generate the damaged copy once and archive it alongside the original instead of regenerating on every run. The pairing tool for all of this is a diff — comparing mutated output against the untouched archive is what turns "I broke it" into "here is exactly what broke, on purpose, at this strength."
Where this workflow stops
The operations here change content and order, never cleanliness — removing empty lines, sorting a list, and wrapping values in quotes belong to the list cleanup and the prefix, suffix, and symbol wrapping workflows, which prepare text rather than damage it. Statistics that describe the result — word counts, character counts, pattern frequency — come from the text analysis workflow, and the diff itself from the file and data comparison workflow. Character-level forensics on suspicious Unicode belongs to the emoji and character debugging workflow. Keep those boundaries and this page stays what it is — the deliberate, documented corruption of text that started out clean.