# Троттлинг обновления дашборда по событиям - **Кому:** `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` обработчик события делает так: ```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: скорость поступления событий на настоящем флоте не проверена. Если на живой машине окажется, что пачек не бывает и усиления нет, — так и напиши в отчёте с числами; это допустимый результат, а не провал задания.