- Очередью служит сама таблица: доставка ждёт свёртки в статусе `pending`,
канал несёт только бит «есть работа». Переполнять нечего, падение процесса
очередь не теряет, а подбор `pending` при старте — обычный проход воркера, а
не отдельный код. Классификация исхода общая с пересборкой журнала.
- Исход разбора начал отражать доставку, а не обстоятельства: отмена и
занятость базы статус не меняют (иначе конкуренция за базу выводила бы
доставку из очереди навсегда), паника свёртки больше не валит процесс, а
учёт доставки идёт через транзакцию с повторами.
- Длинный бюджет ответа выдан маршруту приёма, а не всему серверу:
`write_timeout` в Go покрывает и чтение тела, и общий подъём снял бы защиту с
остальных маршрутов.
- `healthlog reindex` собирает витрину из журнала (тела архива + учёт
доставок) в ОТДЕЛЬНЫЙ файл базы, строго по `(received_at, id)`; рабочую
базу читает без наката миграций и не трогает вовсе. Подмену делает
человек при остановленном сервисе: переименование поверх открытого
дескриптора портит базу молча.
- Журналом считается архив, а не таблица доставок: тело без учётной записи
заводится заново (метка из ULID, размер и хеш по распакованному телу),
запись без тела переносится, но не сворачивается. Оракул сходимости
встроен — два отпечатка и «объектов было/стало»; пустой журнал успехом не
считается.
- Прогон живого архива переехал на новый пакет: второго проигрывателя
журнала в проекте не осталось, а его утверждение о ключе сна перестало
быть константой, протухающей с каждой доставкой.
- internal/fold — свёртка по идентификатору доставки, тело из архива: тот же
код, каким пойдёт пересборка витрины
- приём зовёт свёртку на context.WithoutCancel с собственным дедлайном;
исход разбора на код ответа не влияет
- слой доставки хранится в delivery.derived_layer и наследуется от
ПРЕДШЕСТВУЮЩЕЙ доставки автоматизации: без границы по времени свёртка
переставала быть функцией от префикса журнала (1737 объектов против 1742)
- task verify:archive — сходимость на живом архиве, 99 доставок из 99
- сервис поднимается через `task up`/`task restart`, данные вынесены в ./data
и переживают пересборку — поток с телефона не прерывается
- `task gate` гоняет build/vet/lint/test/race/покрытие диффа/миграции, плюс два
шага под healthlog: данные о здоровье в индексе и синхронность образцов конфига
- `task review:context` собирает вход для архитектурного прохода ревью
- README, CLAUDE.md, docs: назначение и границы, архитектура, конвенции, план
- docs/local-research.md — 36 находок по формату Health Auto Export, снятых на
живых данных; документация приложения местами расходится с тем, что оно шлёт
- Taskfile, .golangci.yml, самодокументируемый config.example.toml