- половина потока (50 доставок из 104) не несёт metrics вовсе и до сих пор числилась parsed: ретеншен, поверив статусу, срезал бы тела stateOfMind, которых в экспорте Apple нет - разбор перечисляет верхнеуровневые ключи data, непокрытые проглатываются декодированием: тело 40 МиБ из непокрытой секции удерживает 0 МиБ - статус partial и колонка delivery.uncovered_sections; миграция переводит прежние parsed в pending — им верить нельзя - витрина не изменилась: отпечаток совпал с прогоном до изменения
3.1 KiB
Ретеншен сырого архива
Приоритет: низкий
Срок жизни сырого архива объявлен (14 дней, storage.raw_retention), но
удаления нет: архив растёт бесконечно. Пока это 16 МБ и проблемой не является.
Само правило изменилось. Экспорт Apple — снапшот всей истории, доставки после его даты — события поверх снапшота, и состояние всегда пересобираемо свёрткой. Значит доставки должны жить до следующего проверенного экспорта, а не фиксированные две недели: иначе между концом ретеншена и датой снапшота образуется дыра в журнале, и пересобрать этот отрезок будет нечем.
Цена измерена: ~23 МБ архива в сутки, то есть ~2 ГБ за квартал между экспортами. Дёшево за возможность пересобрать что угодно.
Отдельное исключение: stateOfMind в экспорт не попадает вовсе (проверено на
свежем архиве). Для него доставки — не хвост журнала, а единственный источник,
и под общее правило удаления он не подпадает.
Включать после того, как разбор устоится и пересборка докажет, что хранилище действительно восстанавливается: иначе страховка исчезнет раньше, чем перестанет быть нужна.
Готово, когда удаляются только доставки старше последнего проверенного
экспорта, записи stateOfMind не трогаются вовсе, а /stats показывает
глубину архива и дату снапшота, до которой он подрезан.
Предусловие снято
Признак, без которого ретеншен был опасен, готов: доставка с непокрытой секцией
имеет статус partial и список непокрытых ключей
(change 2026-08-01-nerazobrannye-sekcii-dostavki). Ретеншен обязан спрашивать
статус, а не считать parsed разрешением: тело stateOfMind восстановить
неоткуда — в экспорте Apple секции нет.
Вместе с этим действует правило: задача, которая начинает разбирать секцию, тем
же изменением переводит partial-строки с этим ключом в pending. Ретеншену
позволено смотреть на partial только пока правило соблюдается.