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

82 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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