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

- **Кому:** `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 — ссылками.

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

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

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