server-monitor-manager/agents/antigravity/inbox/2026-08-19-console-events-throttle.md
Ochenstarik 28e447da0d chore(agents): измеренные числа в задании по троттлингу консоли
Замечание воспроизведено на стенде: настоящие файлы консоли под локальным
макетом Control API. Пачка из 15 накопленных событий при подключении к
потоку даёт 22 обновления дашборда, то есть 44 запроса примерно за 0,1
секунды с одной вкладки. В установившемся режиме слияния соседних событий
нет ни одного. В задании было написано, что эффект не измерен — исправлено.

Туда же уточнение проверки: мерить нужно пачку, а не установившийся режим.
В задание по тестам добавлен найденный при показе дефект текста: строка
подтверждения направления заканчивается двумя точками.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 16:32:25 +07:00

5.3 KiB
Raw Blame History

Троттлинг обновления дашборда по событиям

  • Кому: antigravity
  • Дата: 2026-08-19
  • От кого: главный агент (claude), по разбору PR #63 — agents/claude/done/2026-08-18-review-pr63-console-links.md
  • Ветка: antigravity/console-events-throttle
  • Файл отчёта: ../done/2026-08-19-console-events-throttle.md

Что нужно сделать

Убрать усиление нагрузки на Control при пачке событий.

В src/ServerMonitorManager.Control/wwwroot/app.js обработчик события делает так:

const eventType = (ev.type || '').toLowerCase();
if (eventType.startsWith('link.') || eventType.startsWith('agent.')) {
  loadDashboardData(false);
}

loadDashboardData выполняет два запроса — /api/v1/control/agents и /api/v1/control/links. Ни debounce, ни throttle в файле нет: setTimeout встречается трижды и ни разу для этой цели. Согласование политик Links в Control работает непрерывно (CHANGELOG.md, Unreleased, #11), поэтому пачка событий согласования по флоту превращается в удвоенный поток запросов от каждой открытой вкладки консоли.

Нужно свести пачку событий к одному обновлению. Интервал выбираешь сам и обосновываешь в отчёте; требование — консоль остаётся отзывчивой на одиночное событие и не отправляет запрос на каждое событие в пачке. Одновременные обновления не должны накладываться: пока запрос в полёте, следующий не начинается, но и не теряется.

Границы

Только app.js. Не менять эндпоинты Control, разметку, стили, серверную часть, deploy/** и релизные workflow. Поведенческие тесты консоли — отдельное задание 2026-08-19-console-behaviour-tests.md.

Как проверить результат

  • предъявить количество запросов на пачке событий до и после правки: на N событий подряд должно уйти одно обновление, а не N. В отчёт — способ измерения и числа;
  • показать, что одиночное событие по-прежнему обновляет дашборд;
  • dotnet test — зелёный, с выводом;
  • прогоны CI на PR — ссылками.

«Стало лучше» без чисел результатом проверки не является.

Измерение, уже проведённое

Дефект найден чтением кода, но затем воспроизведён и измерен на стенде: настоящие файлы консоли из wwwroot под локальным макетом Control API. Числа получены из журнала сетевых запросов браузера.

  • Установившийся режим. Одно событие → одно loadDashboardData → два запроса (/agents и /links). Слияния соседних событий нет ни одного.
  • Пачка при подключении. Поток отдал 15 накопленных событий разом — консоль выпустила 22 обновления дашборда, то есть 44 запроса примерно за 0,1 секунды. Это одна вкладка и четыре узла.
  • Побочный эффект. Каждое обновление перестраивает innerHTML таблицы Links целиком. Во время пачки ссылки на элементы строки становятся недействительными, и таблица перестраивается под курсором оператора.

Воспроизведение: открыть консоль под макетом Control, отдающим backlog событий при подключении к /api/v1/control/events, и посмотреть журнал сетевых запросов.

Отсюда следует уточнение к проверке: измерять надо именно пачку, а не установившийся режим — в установившемся режиме при одном событии в 6 секунд разница незаметна.

Контекст и ограничения

Измерение сделано на макете API, а не на живом Hub: скорость поступления событий на настоящем флоте не проверена. Если на живой машине окажется, что пачек не бывает и усиления нет, — так и напиши в отчёте с числами; это допустимый результат, а не провал задания.