- Очередью служит сама таблица: доставка ждёт свёртки в статусе `pending`,
канал несёт только бит «есть работа». Переполнять нечего, падение процесса
очередь не теряет, а подбор `pending` при старте — обычный проход воркера, а
не отдельный код. Классификация исхода общая с пересборкой журнала.
- Исход разбора начал отражать доставку, а не обстоятельства: отмена и
занятость базы статус не меняют (иначе конкуренция за базу выводила бы
доставку из очереди навсегда), паника свёртки больше не валит процесс, а
учёт доставки идёт через транзакцию с повторами.
- Длинный бюджет ответа выдан маршруту приёма, а не всему серверу:
`write_timeout` в Go покрывает и чтение тела, и общий подъём снял бы защиту с
остальных маршрутов.
- `healthlog reindex` собирает витрину из журнала (тела архива + учёт
доставок) в ОТДЕЛЬНЫЙ файл базы, строго по `(received_at, id)`; рабочую
базу читает без наката миграций и не трогает вовсе. Подмену делает
человек при остановленном сервисе: переименование поверх открытого
дескриптора портит базу молча.
- Журналом считается архив, а не таблица доставок: тело без учётной записи
заводится заново (метка из ULID, размер и хеш по распакованному телу),
запись без тела переносится, но не сворачивается. Оракул сходимости
встроен — два отпечатка и «объектов было/стало»; пустой журнал успехом не
считается.
- Прогон живого архива переехал на новый пакет: второго проигрывателя
журнала в проекте не осталось, а его утверждение о ключе сна перестало
быть константой, протухающей с каждой доставкой.
- половина потока (50 доставок из 104) не несёт metrics вовсе и до сих пор
числилась parsed: ретеншен, поверив статусу, срезал бы тела stateOfMind,
которых в экспорте Apple нет
- разбор перечисляет верхнеуровневые ключи data, непокрытые проглатываются
декодированием: тело 40 МиБ из непокрытой секции удерживает 0 МиБ
- статус partial и колонка delivery.uncovered_sections; миграция переводит
прежние parsed в pending — им верить нельзя
- витрина не изменилась: отпечаток совпал с прогоном до изменения
- отношение победы было нетранзитивным: полнота (частичный порядок) плюс
тай-брейк (тотальный) в попарной свёртке давали цикл, из-за которого одна
и та же доставка меняла содержимое объекта при каждой пересборке
- надмножество побеждает только при совпадении значений общих содержательных
ключей: иначе точка без единого измерения вытесняла измерение
- Less стал тотальным, isEmpty не материализует значение, имя метрики в
координате столкновения обрезается, отпечаток витрины включает units и sealed
- на живом архиве строгий no-op: 1737 объектов, содержимое совпало побайтово
Триаж свёл 62 сырые находки девяти проходов к 33 причинам: 3 блокера,
4 «сейчас», 2 развилки. Все закрыты регрессионными тестами.
- схема точки сна определяется по самой точке, а не по индексу в исходном
массиве: одна пропущенная точка меняла эпизод и сводку местами
- доставка сворачивается одной транзакцией: частичное состояние было
недетерминированным (восемь прогонов — семь состояний)
- граница размера на распакованном теле: 400 КиБ gzip разворачивались в
400 МиБ мимо max_body_mb
- столкновение — расхождение канонических форм, а не байтов; WARN с
координатами объекта; payload без HTML-экранирования
- выравнивание по местной метке: получасовые зоны уводили часовую выгрузку
в minute
- доставка из одних суточных сводок больше не отвергается целиком
- единицы не переписываются молча; счётчик считает сохранённые точки
- все выходы Fold логируются, исход пишется на переживающем отмену контексте
Четыре развилки вынесены блокерами в беклог.
- internal/fold — свёртка по идентификатору доставки, тело из архива: тот же
код, каким пойдёт пересборка витрины
- приём зовёт свёртку на context.WithoutCancel с собственным дедлайном;
исход разбора на код ответа не влияет
- слой доставки хранится в delivery.derived_layer и наследуется от
ПРЕДШЕСТВУЮЩЕЙ доставки автоматизации: без границы по времени свёртка
переставала быть функцией от префикса журнала (1737 объектов против 1742)
- task verify:archive — сходимость на живом архиве, 99 доставок из 99