# Отдавать тренировки вместе с маршрутом - **Секция:** Ядро - **Зачем:** Тренировки с маршрутами разобраны и лежат в витрине, а маршрутов чтения нет — сценарий трекера не закрыт - **Теги:** goal:read-api, sprint:2026-08-04, kind:feature Трекер забирает тренировку одним пакетом вместе с маршрутом: `GET /workouts` за период и `GET /workouts/{id}` поштучно. Разбор и хранение тренировок сделаны (change `2026-08-02-trenirovki-i-zapisi`), маршрутов чтения нет: тренировка с маршрутом лежит в витрине и наружу не отдаётся. Второй сценарий паспорта — трекер тренировок — до тех пор не закрыт. **Это первый по-настоящему тяжёлый ответ проекта.** Маршрут лежит блобом внутри тренировки, и общий предел размера ответа обязан распространяться и на него — иначе одна тренировка с длинным треком проходит мимо потолка, названного для точек. Отсюда же требование к списку: перечень за период не тянет треки, иначе неделя тренировок превращается в один неподъёмный ответ. Конверт и форма провода наследуются, а не изобретаются. Двигает строку «Завершения» цели: «Тренировки с маршрутом и записи со своим `id` отдаются за период». ## Затрагивает Два новых маршрута: `GET /api/v1/workouts` за период и `GET /api/v1/workouts/{id}` поштучно. Публичные типы провода в `internal/httpapi` — конверт тренировки и элемент списка. Чтение таблицы тренировок; схемы и формата на диске не трогает. ## Критерии приёмки - тренировка отдаётся одним пакетом вместе с маршрутом — оракул: запрос к поднятому сервису на живом архиве - список тренировок за период не тянет треки — оракул: тест, сравнивающий размер ответа списка с размером ответа одной тренировки - тренировка с длинным треком подчиняется общему пределу размера ответа — оракул: тест на синтетическом треке за пределом ## Рамки Схема не трогается, данные только читаются. Берётся после конверта. Разворачивание маршрута в отдельную таблицу остаётся [идеей](workout-routes-table.md) и здесь не решается.