JGNT jgnt@juggernaut.work:~$
--lang=en
$ cd ..
2026-09-26 · 2 мин · #migration #process #laravel

Правило ноль: как фотоархив переехал по одной фотографии

Один объект, проверили глазами, потом десять, потом фон. Скучное правило — и что оно нашло на переезде sniff.ru.

Зачем правило

Массовый перенос ломается не на тысячной записи, а на первой. Просто на тысячной это уже дорого. Поэтому у нас нет команд, которые по умолчанию делают «всё»: сначала — одна запись, и человек смотрит на результат.

[NOTE] Правило ноль — не про тесты. Тесты проверяют код. Правило проверяет результат: глазами, так, как его увидит человек.

Четыре шага

  1. Один объект. Запустить, открыть, посмотреть.
  2. Десять. Сверить руками.
  3. Двадцать — снова глазами.
  4. Только потом фон: задача, которая берёт по одной записи и оставляет на ней след.

Для фотографий 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-агентов

Агенту мы даём не задачу, а план в файле: один объект, отчёт, проверка человеком, потом десять. Чат забывает, файл плана — нет.