tasks: задачи спринта раздроблены до восьми гранулярных

- конверт и точки разложены на форму провода, точки за период и условный
  запрос; свёртка — на сетку, порог неполного ведра и предел размера ответа;
  тренировки и записи разъехались на два независимых маршрута
- openapi-swagger разложена на спеку, гейт против расхождения и Swagger UI —
  все три вне набора, вместе с mcp-server
- набор спринта 2026-08-04 — весь HTTP-слой чтения, восемь задач
This commit is contained in:
av
2026-08-04 14:21:57 +03:00
parent 79331ac670
commit bd832337df
21 changed files with 393 additions and 216 deletions
@@ -0,0 +1,41 @@
# Предел размера ответа
- **Секция:** ядро
- **Зачем:** У маршрутов чтения нет ни одного потолка: множители «метрики × окно × точки × одновременные запросы» ничем не ограничены
- **Теги:** goal:read-api, sprint:2026-08-04
У маршрутов чтения появляется названный потолок: сетка не задана и ответ не
влезает — сервер огрубляет её и **называет** в ответе; сетка задана явно и не
влезает — ошибка со списком доступных, а не тихая подмена.
Различие существенно: иначе агент, попросивший минутную сетку, получит суточные
суммы и не узнает об этом.
**Цена измерена и унаследована.** На каталоге враждебный запрос
(20 метрик × 8 часов × 5000 точек) дал 693 мс и +153 МиБ живой кучи, при том что
приём в том же процессе уже даёт пик 768 МиБ на теле 40 МиБ. Множители «метрики ×
окно × точки × одновременные запросы» сегодня без потолка ни у одного маршрута —
включая уже живой каталог, у которого предела нет намеренно: правило размера
общее, и задавать его мимоходом на первой ручке значило бы решить контракт до
того, как известна форма тяжёлого ответа.
Правило распространяется на все маршруты чтения сразу — каталог, точки,
тренировки, записи, — а не только на тот, где написано.
## Критерии приёмки
- запрос без сетки, не влезающий в предел, отвечает огрублённой сеткой и
называет её в ответе — оракул: враждебный запрос на живом архиве
- явно заданная сетка за пределом даёт ошибку со списком доступных сеток —
оракул: тест
- предел объявлен в конфиге и в `docs/architecture.md`, а не зашит числом в
обработчике — оракул: образцы конфига в гейте
- каталог подчиняется тому же пределу, что и точки — оракул: тест на враждебном
запросе к каталогу
## Рамки
Схема не трогается, данные только читаются. Берётся после свёртки по сетке.
Собственный дедлайн маршрута сюда **не входит**: он в задаче
[«Остановка и миграция»](shutdown-and-migration-traces.md) вместе с `BaseContext`
и раздельными бюджетами остановки.