- каждая запись каталога задач получила тип вместо тега kind: и префикса заголовка; секция роадмапа «Разработка» стала «Сопровождением», порядок секций канонический - поправлены протухшие факты: нереализованные маршруты Read API, MCP и `healthlog import`, словарь слоёв в инварианте, семантика гейта по покрытию диффа, периметр перестал дублировать security.md - замер слияния переведён с находки 49 на находку 54, заполнены Purpose спек storage и parsing
12 KiB
12 KiB
Беклог
Что можно взять. Одна задача = один файл items/<slug>.md
- строка здесь. Целей тут нет — они в ROADMAP.md: беклог — то, что
берут, роадмап — то, подо что берут. Порядка внутри секции нет: «что делать
дальше» отвечает набор спринта. Ведётся скиллом
tasks.
Секции «блокеры» здесь нет и не заводится: блокер — это состояние (спринт не может продолжаться ни одной задачей), оно живёт до ответа человека, а его следы — вопросами в файлах задач.
Ядро
- ✨ Проверять целостность собранной витрины до подмены — Подмена файла необратима, а годность выхода подтверждена отпечатком на ещё открытом дескрипторе
- 🐞 Снизить цену слияния на широкой доставке — 63 МБ на одной координате держат транзакцию 5.15 с при busy_timeout 5 с — соседние доставки уходят в failed
- 🐞 Не терять сущность с id и неразобранной меткой — Тренировка с меткой в неизвестном формате пропадает целиком, а после включения ретеншена окно становится необратимым
- ✨ Не задваивать тренировки при импорте родного экспорта — В export.xml у тренировки нет id — импорт снапшота задвоит тренировки, приехавшие от HAE
- ✨ Импортировать родной экспорт Apple Health — Слой sample пуст: полная история и точные сэмплы лежат в zip-архиве и никуда не едут
- 🐞 Не отбирать строки в data-миграциях по обрезаемым спискам — Миграция 00007 отбирает по uncovered_sections, который обрезается на 32 — следующая покрытая секция унаследует слепую зону
- 🧹 Не держать весь журнал в памяти при пересборке — Учёт доставок и список путей архива материализуются целиком: расход растёт вместе с журналом, а у журнала конца нет
- 🐞 Держать порядок журнала при конкурентных приёмах — Доставка, свёрнутая раньше своей предшественницы, уходит в failed навсегда, и живая витрина молча расходится с пересборкой
- ✨ Ограничить размер и число заголовков доставки — MaxHeaderBytes не задан, в базу заголовки пишутся целиком: дефект спит до деплоя, а просыпается вместе с ним
- ✨ Ограничить размер сущности и считать форму потоково — Тело 40 МиБ даёт 768 МиБ пика кучи, 63 МиБ держат блокировку 5.019 с — предела на одну сущность нет вовсе
- ✨ Выводить схемы содержимого из данных — Метрик больше сотни и формы точек разные — клиент вынужден угадывать структуру по выборке
- ✨ Сверять живую витрину с пересборкой — reindex печатает оба отпечатка, но сравнивать их некому — расхождение с журналом молчит
- ✨ Помечать нижний слой устаревшим после экспорта — Нижний слой растёт на ~100 тысяч координат в сутки, а после экспорта Apple он избыточен
- 🐞 Класть заголовки доставки в архив рядом с телом — Заголовки живут только в базе — потеря базы навсегда ломает вывод слоя при пересборке
- ✨ Поднять MCP-сервер поверх Read API — Агент-медик — первый заказчик проекта, а подключить его сейчас нечем
- ✨ Написать OpenAPI-спеку руками — Потребителей три и один из них агент — контракт должен читаться машиной, а не пересказываться в чате
- 🧹 Ловить гейтом расхождение спеки с маршрутами — Рукописная спека — источник истины, а расходится она с кодом молча: без гейта решение о рукописной спеке не держится
- ✨ Поднять Swagger UI без внешней сети — Контракт читается машиной, но человеку нечем выполнить запрос к живому сервису из браузера, а внешних CDN в локальной сети нет
- 🔬 Измерить, нужно ли правило полноты рядом с LWW — Полнота решает 1,2% спорных координат, и неизвестно, была ли более полная точка более поздней — от этого зависит, нужна ли она вообще
- 🔬 Человеческие аннотации поверх выведенных схем — Выведенная схема говорит форму, но не смысл метрики — нужно ли описание сверху, зависит от стабильности формата
- 🔬 Месячный проход по ручным секциям — Симптомы и лекарства заводятся задним числом на недели — недельного глубокого прохода им не хватит
- 🔬 NDJSON-поток для больших выборок Read API — Выборка нижнего слоя за месяц не влезает в один JSON-ответ — либо поток, либо пагинация
- 🔬 Отказ от heartbeatSeries — 93% объёма HRV ради данных, которых нет ни в одном планируемом запросе
- 🔬 Пересекающиеся источники одной метрики — Сон пишут и часы, и стороннее приложение — сумма по обоим задвоит ночь
- 🔬 Порог sealed: с какого возраста час считается запечатанным — WARN на изменение старого часа уже пишется, но порог не выбран — ставим по факту, когда накопится статистика досчёта
- 🔬 Разворачивание маршрутов тренировок в отдельную таблицу — Маршрут лежит блобом внутри тренировки — понадобится, только если появится клиент, которому мало отдачи одним пакетом
- 🔬 Что считать сутками при смене часового пояса — Шаги за день — базовый запрос трекера и игры, но чей это день при перелёте, не решено
- 🔬 Выгрузка в parquet отдельной командой — Дверь для тяжёлой аналитики снаружи: DuckDB читает и parquet, и файл SQLite — спешить некуда, но и закрывать не нужно
Инфра
- ✨ Слать уведомление, когда данных нет N часов — Пропажу потока сейчас замечает человек, а не сервис
- ✨ Выложить сервис на rivendell — Сервис живёт на рабочей машине — телефон достаёт до него только дома
- ✨ Хранить счётчики слияния вне логов — Единственный след несравнимых наборов — строка WARN в docker-логе с ротацией 3×10 МБ: событие может произойти и не оставить ничего
- 🐞 Развести бюджеты остановки и оставить следы миграции в логе — Долгий запрос чтения съедает бюджет остановки, и WARN обвиняет воркер свёртки; миграция молчит и не прерывается SIGTERM
- ✨ Назвать механизм отката релиза после наката миграции — Страж версии схемы делает возврат старого бинаря отказом, а понизить схему нечем — аварийный путь пришлось бы изобретать в аварии
- ✨ Подчищать сырой архив до последнего проверенного экспорта — Архив не подчищается вовсе, а резать его раньше даты проверенного экспорта нельзя — в журнале останется дыра, которую нечем пересобрать
- ✨ Отдавать состояние сервиса маршрутом /stats — Тихо сломавшаяся автоматизация — главный эксплуатационный риск, а сейчас факт виден только в логах
- 🐞 Свести умолчания конфига с рабочей раскладкой данных — Запуск без конфига заведёт пустую базу в корне рядом с настоящей — тихая ловушка
- ✨ Развести токены контуров и убрать секреты из репозитория — Проверка токенов выключена, config.docker.toml коммитится — так нельзя выезжать наружу