- Очередью служит сама таблица: доставка ждёт свёртки в статусе `pending`, канал несёт только бит «есть работа». Переполнять нечего, падение процесса очередь не теряет, а подбор `pending` при старте — обычный проход воркера, а не отдельный код. Классификация исхода общая с пересборкой журнала. - Исход разбора начал отражать доставку, а не обстоятельства: отмена и занятость базы статус не меняют (иначе конкуренция за базу выводила бы доставку из очереди навсегда), паника свёртки больше не валит процесс, а учёт доставки идёт через транзакцию с повторами. - Длинный бюджет ответа выдан маршруту приёма, а не всему серверу: `write_timeout` в Go покрывает и чтение тела, и общий подъём снял бы защиту с остальных маршрутов.
Беклог
Одна задача = один файл <slug>.md + строка в этом индексе.
Приоритет — грубая оценка «ценность / стоимость». Спекулятивные
задачи помечены [idea] в заголовке. Ведётся скиллом backlog.
Блокеры — вопросы, вынутые из задач. Работа над задачей идёт автономно; если внутри обнаружился вопрос, который решать не мне, он вынимается отдельным пунктом сюда, а сама задача переформулируется на остаток и продолжается. Пункт блокера отвечает на четыре вопроса: что именно решить, какие есть варианты с ценой каждого, что заблокировано пока решения нет, и какая рекомендация — без неё вопрос перекладывается целиком, а решать его всё равно с тем же контекстом. Разбираются пачками, а не по одному: прерывать поток ради каждого дороже, чем накопить.
Варианты ищутся не с нуля: сперва prior art — как это решено в референсах паспорта и в интернете, — и только потом своё. Готовое решение либо берётся, либо отвергается с названной причиной.
блокеры
- Порядок журнала при конкурентных приёмах — доставка, свёрнутая раньше своей предшественницы, уходит в failed навсегда — живое состояние расходится с reindex
высокий
- Тренировки и секции с собственными id — Тренировки с геотреком и состояние разума приходят, но не разбираются — без них не закрыть ни трекер, ни агента-медика
- Измеренный род агрегации и каталог разрезов — Без рода метрики свёртка в ответе неотличима от угадывания — а суммировать нижний слой значит завысить втрое
- Read API: точки, выбор слоя, свёртка по сетке — Данные видны только через sqlite на хосте — ни один из трёх потребителей ничего прочитать не может
- OpenAPI-спека и Swagger UI — Потребителей три и один из них агент — контракт должен читаться машиной, а не пересказываться в чате
- MCP-сервер поверх Read API — Агент-медик — первый заказчик проекта, а подключить его сейчас нечем
средний
- Словарь категориальных значений → коды HealthKit — Фазы сна и типы тренировок приходят строками русской локали — с экспортом Apple их не сверить
- Выведенные из данных схемы содержимого — Метрик больше сотни и формы точек разные — клиент вынужден угадывать структуру по выборке
- Импорт родного экспорта Apple Health — Слой sample пуст: полная история и точные сэмплы лежат в zip-архиве и никуда не едут
- Проверка секций, которых поток ещё не приносил — Симптомы, ЭКГ, лекарства, цикл и вес не виденны живьём — разбор писался вслепую
- Наблюдаемость: /stats — Тихо сломавшаяся автоматизация — главный эксплуатационный риск, а сейчас факт виден только в логах
- Проверка целостности собранной витрины перед подменой — Подмена файла необратима, а годность выхода подтверждена отпечатком на ещё открытом дескрипторе
- Деплой на rivendell — Сервис живёт на рабочей машине — телефон достаёт до него только дома
- Управление токенами и секретами — Проверка токенов выключена, config.docker.toml коммитится — так нельзя выезжать наружу
- [idea] Что считать сутками при смене часового пояса — Шаги за день — базовый запрос трекера и игры, но чей это день при перелёте, не решено
- [idea] Пересекающиеся источники одной метрики — Сон пишут и часы, и стороннее приложение — сумма по обоим задвоит ночь
- Умолчания конфига указывают на прежнюю раскладку — Запуск без конфига заведёт пустую базу в корне рядом с настоящей — тихая ловушка
- Счётчики слияния переживают ротацию логов — единственный след несравнимых наборов — строка WARN в docker-логе с ротацией 3×10 МБ: событие может произойти и не оставить ничего
- Цена слияния на широкой доставке — 63 МБ на одной координате держат транзакцию 5.15 с при busy_timeout 5 с — соседние доставки уходят в failed
- Заголовки доставки в архиве рядом с телом — Заголовки живут только в базе — потеря базы навсегда ломает вывод слоя при пересборке
низкий
- Устаревание нижнего слоя после экспорта — Нижний слой растёт на ~100 тысяч координат в сутки, а после экспорта Apple он избыточен
- Ретеншен сырого архива — Архив не подчищается вовсе — 14-дневный срок объявлен, но не работает
- Пересборка держит весь журнал в памяти — Учёт доставок и список путей архива материализуются целиком: расход растёт вместе с журналом, а у журнала конца нет
- Активный алерт «данных нет N часов» — Пропажу потока сейчас замечает человек, а не сервис
- [idea] Порог sealed: с какого возраста час считается запечатанным — WARN на изменение старого часа уже пишется, но порог не выбран — ставим по факту, когда накопится статистика досчёта
- [idea] Месячный проход по ручным секциям — Симптомы и лекарства заводятся задним числом на недели — недельного глубокого прохода им не хватит
- [idea] Человеческие аннотации поверх выведенных схем — Выведенная схема говорит форму, но не смысл метрики — нужно ли описание сверху, зависит от стабильности формата
- [idea] Отказ от heartbeatSeries — 93% объёма HRV ради данных, которых нет ни в одном планируемом запросе
- [idea] Выгрузка в parquet отдельной командой — Дверь для тяжёлой аналитики снаружи: DuckDB читает и parquet, и файл SQLite — спешить некуда, но и закрывать не нужно
- [idea] NDJSON-поток для больших выборок Read API — Выборка нижнего слоя за месяц не влезает в один JSON-ответ — либо поток, либо пагинация
- [idea] Разворачивание маршрутов тренировок в отдельную таблицу — Маршрут лежит блобом внутри тренировки — понадобится, только если появится клиент, которому мало отдачи одним пакетом