Files
healthlog/docs/tasks/items/read-api-response-limit.md
T
av 3d24248075 docs: документация приведена к канону av-dev-pm 4
- каждая запись каталога задач получила тип вместо тега kind: и префикса
  заголовка; секция роадмапа «Разработка» стала «Сопровождением», порядок
  секций канонический
- поправлены протухшие факты: нереализованные маршруты Read API, MCP и
  `healthlog import`, словарь слоёв в инварианте, семантика гейта по покрытию
  диффа, периметр перестал дублировать security.md
- замер слияния переведён с находки 49 на находку 54, заполнены Purpose спек
  storage и parsing
2026-08-05 19:09:35 +03:00

4.2 KiB
Raw Blame History

Ограничить размер ответа маршрутов чтения

  • Тип: feature
  • Категория: Ядро
  • Зачем: У маршрутов чтения нет ни одного потолка: множители «метрики × окно × точки × одновременные запросы» ничем не ограничены
  • Теги: goal:read-api, sprint:2026-08-04

У маршрутов чтения появляется названный потолок: сетка не задана и ответ не влезает — сервер огрубляет её и называет в ответе; сетка задана явно и не влезает — ошибка со списком доступных, а не тихая подмена.

Различие существенно: иначе агент, попросивший минутную сетку, получит суточные суммы и не узнает об этом.

Цена измерена и унаследована. На каталоге враждебный запрос (20 метрик × 8 часов × 5000 точек) дал 693 мс и +153 МиБ живой кучи, при том что приём в том же процессе уже даёт пик 768 МиБ на теле 40 МиБ. Множители «метрики × окно × точки × одновременные запросы» сегодня без потолка ни у одного маршрута — включая уже живой каталог, у которого предела нет намеренно: правило размера общее, и задавать его мимоходом на первом маршруте значило бы решить контракт до того, как известна форма тяжёлого ответа.

Правило распространяется на все маршруты чтения сразу — каталог, точки, тренировки, записи, — а не только на тот, где написано.

Двигает строку «Завершения» цели: «У ответа любого маршрута чтения есть объявленный предел размера».

Затрагивает

Все маршруты чтения сразу — каталог, точки, а следом тренировки и записи: код и тело отказа на запросе за пределом, поле огрублённой сетки в ответе. Конфиг и его образцы — сам предел. Раздел о пределах в docs/architecture.md. Схемы и формата на диске не трогает.

Критерии приёмки

  • запрос без сетки, не влезающий в предел, отвечает огрублённой сеткой и называет её в ответе — оракул: враждебный запрос на живом архиве
  • явно заданная сетка за пределом даёт ошибку со списком доступных сеток — оракул: тест
  • предел читается из конфига: два разных значения дают две разные границы отказа — оракул: тест с подменой значения предела
  • предел назван в образцах конфига и в docs/architecture.md — оракул: шаг образцов конфига в гейте и глазами по разделу
  • каталог подчиняется тому же пределу, что и точки — оракул: тест на враждебном запросе к каталогу

Рамки

Схема не трогается, данные только читаются. Берётся после свёртки по сетке. Собственный дедлайн маршрута сюда не входит: он в задаче «Развести бюджеты остановки» вместе с BaseContext и раздельными бюджетами остановки.