Зачем правило
Массовый перенос ломается не на тысячной записи, а на первой. Просто на тысячной это уже дорого. Поэтому у нас нет команд, которые по умолчанию делают «всё»: сначала — одна запись, и человек смотрит на результат.
[NOTE] Правило ноль — не про тесты. Тесты проверяют код. Правило проверяет результат: глазами, так, как его увидит человек.
Четыре шага
- Один объект. Запустить, открыть, посмотреть.
- Десять. Сверить руками.
- Двадцать — снова глазами.
- Только потом фон: задача, которая берёт по одной записи и оставляет на ней след.
Для фотографий sniff.ru это выглядит так:
$ ship remote artisan media:one # одна фотография, на виду, с результатом
$ ship remote artisan media:queue --limit=20
$ ship remote artisan media:status # сколько уже переехало
Что нашли десять
Считыватель EXIF на десяти файлах вернул «прочитано» семь раз — и в семи случаях внутри были только ширина и высота, которые записал старый ресайзер, а не камера. Строка в логе говорила, что всё работает. На тысяче мы бы это не заметили.
Первые десять задач на сервере упали с «source missing»: в серверном compose у воркера не было подключено хранилище архива. Десять упавших задач — это одна строка в конфиге. Тридцать три тысячи — это вечер разбора.
Итог
galleries 535
photos 33346
offloaded 33345 (100%)
failed 1
still on local disk 0
Одна фотография не переехала, и она видна в статусе — а не потеряна где-то в середине пакета.
То же для AI-агентов
Агенту мы даём не задачу, а план в файле: один объект, отчёт, проверка человеком, потом десять. Чат забывает, файл плана — нет.