- роадмап отвечает «что умеет и чего не умеет»: PLAN.md → ROADMAP.md, четыре канонические секции, достигнутые звенья строками в «Готово», цели переформулированы возможностями приложения - задачи: род работы и «Затрагивает» набору спринта, 34 заголовка в форму действия, «Завершение» целей перечнями со ссылкой из каждой задачи - вычитка проходами task-form и doc-wording, починены протухшие факты в README, паспорте и review.md
53 lines
4.2 KiB
Markdown
53 lines
4.2 KiB
Markdown
# Ограничить размер ответа маршрутов чтения
|
||
|
||
- **Секция:** Ядро
|
||
- **Зачем:** У маршрутов чтения нет ни одного потолка: множители «метрики × окно × точки × одновременные запросы» ничем не ограничены
|
||
- **Теги:** goal:read-api, sprint:2026-08-04, kind:feature
|
||
|
||
У маршрутов чтения появляется названный потолок: сетка не задана и ответ не
|
||
влезает — сервер огрубляет её и **называет** в ответе; сетка задана явно и не
|
||
влезает — ошибка со списком доступных, а не тихая подмена.
|
||
|
||
Различие существенно: иначе агент, попросивший минутную сетку, получит суточные
|
||
суммы и не узнает об этом.
|
||
|
||
**Цена измерена и унаследована.** На каталоге враждебный запрос
|
||
(20 метрик × 8 часов × 5000 точек) дал 693 мс и +153 МиБ живой кучи, при том что
|
||
приём в том же процессе уже даёт пик 768 МиБ на теле 40 МиБ. Множители «метрики ×
|
||
окно × точки × одновременные запросы» сегодня без потолка ни у одного маршрута —
|
||
включая уже живой каталог, у которого предела нет намеренно: правило размера
|
||
общее, и задавать его мимоходом на первом маршруте значило бы решить контракт до
|
||
того, как известна форма тяжёлого ответа.
|
||
|
||
Правило распространяется на все маршруты чтения сразу — каталог, точки,
|
||
тренировки, записи, — а не только на тот, где написано.
|
||
|
||
Двигает строку «Завершения» цели: «У ответа любого маршрута чтения есть объявленный предел размера».
|
||
|
||
## Затрагивает
|
||
|
||
Все маршруты чтения сразу — каталог, точки, а следом тренировки и записи: код и
|
||
тело отказа на запросе за пределом, поле огрублённой сетки в ответе. Конфиг и
|
||
его образцы — сам предел. Раздел о пределах в `docs/architecture.md`. Схемы и
|
||
формата на диске не трогает.
|
||
|
||
## Критерии приёмки
|
||
|
||
- запрос без сетки, не влезающий в предел, отвечает огрублённой сеткой и
|
||
называет её в ответе — оракул: враждебный запрос на живом архиве
|
||
- явно заданная сетка за пределом даёт ошибку со списком доступных сеток —
|
||
оракул: тест
|
||
- предел читается из конфига: два разных значения дают две разные границы
|
||
отказа — оракул: тест с подменой значения предела
|
||
- предел назван в образцах конфига и в `docs/architecture.md` — оракул: шаг
|
||
образцов конфига в гейте и глазами по разделу
|
||
- каталог подчиняется тому же пределу, что и точки — оракул: тест на враждебном
|
||
запросе к каталогу
|
||
|
||
## Рамки
|
||
|
||
Схема не трогается, данные только читаются. Берётся после свёртки по сетке.
|
||
Собственный дедлайн маршрута сюда **не входит**: он в задаче
|
||
[«Развести бюджеты остановки»](shutdown-and-migration-traces.md) вместе с `BaseContext`
|
||
и раздельными бюджетами остановки.
|