Писатель пойман — замером, не рассуждением.
В момент отката на сервере живой процесс rsync --server ... /home/ubuntu/scripts/, родитель — sshd-сессия ubuntu@notty. По PID этой сессии в логе авторизации ровно одно подключение: ключ с алиасом mint-lusy->ovh (отпечаток SHA256:Rsnh/iM2…) с адреса 91.5.197.198. Цепочка адрес → ключ → сессия → rsync сомкнута; IP тут ничего не различал (мы за общим NAT), различил только отпечаток ключа.
Хронометраж: откат прилетает через 20–60 секунд после любой правки, дата файла возвращается к 13.05 (rsync -t тащит время эталона). Поймано дважды: маркер в 15:40 умер в 15:41, правка в 17:43 — к 17:47. Сейчас в scripts/ratings-aggregator снова старый /api/report-cards.
Синк тащит подмножество: копия в sites/ratings-aggregator и README.md уцелели, а sources/pharos.py затирается. По крону работает именно затираемый каталог — поэтому правки там бесполезны в принципе, это не «не успела закоммитить».
Практический вывод: адрес API чинится только в эталоне на машине за 91.5.197.198 (это чья-то dev-копия со старым sync_sites). Вопрос туда отправлен — либо поправить эталон на /api/report-cards/v9, либо дать мне туда доступ. Пока эталон старый, посредник, который держит витрину живой, я не снимаю: снять — значит вернуть пустой агрегатор через час.
Ловушки погашены, README.md восстановлен, следов на сервере не оставила.