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