# Предел размера ответа - **Секция:** ядро - **Зачем:** У маршрутов чтения нет ни одного потолка: множители «метрики × окно × точки × одновременные запросы» ничем не ограничены - **Теги:** goal:read-api, sprint:2026-08-04 У маршрутов чтения появляется названный потолок: сетка не задана и ответ не влезает — сервер огрубляет её и **называет** в ответе; сетка задана явно и не влезает — ошибка со списком доступных, а не тихая подмена. Различие существенно: иначе агент, попросивший минутную сетку, получит суточные суммы и не узнает об этом. **Цена измерена и унаследована.** На каталоге враждебный запрос (20 метрик × 8 часов × 5000 точек) дал 693 мс и +153 МиБ живой кучи, при том что приём в том же процессе уже даёт пик 768 МиБ на теле 40 МиБ. Множители «метрики × окно × точки × одновременные запросы» сегодня без потолка ни у одного маршрута — включая уже живой каталог, у которого предела нет намеренно: правило размера общее, и задавать его мимоходом на первой ручке значило бы решить контракт до того, как известна форма тяжёлого ответа. Правило распространяется на все маршруты чтения сразу — каталог, точки, тренировки, записи, — а не только на тот, где написано. ## Критерии приёмки - запрос без сетки, не влезающий в предел, отвечает огрублённой сеткой и называет её в ответе — оракул: враждебный запрос на живом архиве - явно заданная сетка за пределом даёт ошибку со списком доступных сеток — оракул: тест - предел объявлен в конфиге и в `docs/architecture.md`, а не зашит числом в обработчике — оракул: образцы конфига в гейте - каталог подчиняется тому же пределу, что и точки — оракул: тест на враждебном запросе к каталогу ## Рамки Схема не трогается, данные только читаются. Берётся после свёртки по сетке. Собственный дедлайн маршрута сюда **не входит**: он в задаче [«Остановка и миграция»](shutdown-and-migration-traces.md) вместе с `BaseContext` и раздельными бюджетами остановки.