Ломать текст намеренно, а не случайно
Грязный текст приходит по собственному расписанию. Форма, переживающая вставку из таблицы, вывод OCR с пропавшей буквой в каждом третьем слове, тикет поддержки с перепутанными строками — конвейеры встречают всё это рано или поздно. Этот workflow идёт в обратную сторону и намеренно: он берёт чистый текст под вашим контролем и портит его выбранными вами способами, чтобы парсер, корректор или опыт с чтением судился по документированному урону, а не по случайному. Отличие от бессмысленного искажения файла в редакторе — воспроизводимость: порча, которую можно породить заново, есть тестовый актив, а та, что нет, — просто битый файл.
Сначала предложения, затем слова, в конце символы
Идите от крупного зерна к мелкому. Инструменты уровня предложений перестраивают структуру — отфильтруйте корпус до нужных опыту предложений, удалите несущие шум, продублируйте их для сравнения бок о бок и переверните ради зеркального материала. Инструменты уровня слов затем тревожат словарь и порядок, не трогая структуру, — отфильтруйте слова, которые парсер обязан выдержать, продублируйте их для проверки повторов, переверните ради палиндромного материала и поменяйте местами соседние пары, сгибая синтаксис с сохранением каждого слова. Шум на уровне символов приходит последним и подражает физическому миру — вставленные буквы заменяют промахи пальцев, удалённые — пропавшие знаки, вычищенные символы — мусор сканера. Перепрыгивание уровней даёт громкую, но бессмысленную порчу: материал, перемешанный дважды и усыпанный случайными символами, не проверяет ничего определённого.
Случайное не значит безответное
Случайные инструменты меняются от запуска к запуску, в этом и замысел — но размах обязан оставаться описуемым. Вставители должны увеличивать счётчик символов или слов на заранее названную величину, удалители — уменьшать на ту же, а тасовка менять порядок и только. Записывайте настройки каждого прохода, а когда тесту нужен стабильный материал, породите повреждённую копию один раз и заархивируйте её рядом с оригиналом вместо воспроизведения при каждом запуске. Напарник во всём этом — diff: сравнение мутировавшего вывода с нетронутым архивом превращает «я его сломал» в «вот что именно сломано, намеренно и с такой силой».
Где этот workflow останавливается
Операции здесь меняют содержимое и порядок, но никогда чистоту — удаление пустых строк, сортировку списка и оборачивание значений в кавычки выполняют workflow очистки списков и обёртки префиксами с суффиксами, готовящие текст, а не портящие его. Статистика, описывающая результат — счётчики слов, символов и частоты шаблонов, — приходит из workflow анализа текста, а сам diff — из workflow сравнения файлов и данных. Форензика подозрительного Unicode принадлежит workflow отладки emoji и символов. Держите эти границы, и страница остаётся одним делом: намеренной, задокументированной порчей текста, который начинался чистым.