chore(ux): зафиксировать аудит скоростных измерений
This commit is contained in:
1 parent
4fee9e371f
commit
7d331aff41
4 files changed
+34
-2
No files matched your search
@@ -0,0 +1,25 @@
|
||||
# Аудит достоверности скоростных снимков оптимизатора
|
||||
|
||||
Дата: 2026-10-07. Это анализ кода и первичных RouterOS документов, без запуска сетевых тестов или PostgreSQL.
|
||||
|
||||
Первичный источник: [RouterOS bandwidth-test CLI](https://manual.mikrotik.com/docs/cli-reference/tool/bandwidth-test/) (на момент чтения версия документации 7.26). TX относится к отправке клиента, RX — к его приёму. Успех HTTP-запроса отдельно не определяет терминальный статус теста.
|
||||
|
||||
| Проблема | Доказательство в проекте | Последствие | Следующий блок |
|
||||
| --- | --- | --- | --- |
|
||||
| TX/RX перепутаны с DL/UL | `backend/src/services/uptime-speed-service.ts`: тест выполняет srcClient, TX/RX сохраняются напрямую. `lib/route-optimizer-data.ts`: TX читается как DL и RX как UL | Для Home→JH download к Home соответствует RX, upload от Home — TX. Для обратной пробы Exit→JH стороны нужно развернуть | 12.3.71: исправить отображение и модельные лимиты, проверить forward/reverse, null/zero/asymmetric rates |
|
||||
| Сопоставление скорости конкретному WAN не подтверждено | `MikrotikClient.bandwidthTest` принимает address/protocol/direction/duration/user/password; `srcInterface` туда не передаётся. Он используется в after-ping. `srcAddress` вычисляется для метаданных, не передаётся команде | Даже выбранный source-интерфейс не доказывает WAN bandwidth-test. Wildcard-проба тем более не измеряет выбранный WAN. Скорость относится к паре устройств; привязка — модель | 12.3.72: показать область измерения и границу сопоставления; не добавлять недокументированные RouterOS параметры/временные routing rules |
|
||||
| Отсутствие скорости превращается в zero | `parseRateToMbps` возвращает0 для пустого/неразобранного поля. `txAvg || mean || 0` / `rxAvg || mean || 0` заменяют даже explicit avg0 | Receive-only/transmit-only и повреждённый ответ могут публиковать ненаблюдаемый0. Explicit измеренный0 может быть заменён другой оценкой | 12.3.73: pure nullable parser/average selector, адаптация DTO/producer/consumer; сохранить измеренный0 и отделить отсутствие данных |
|
||||
| Терминальный статус bandwidth-test не проверяется | После `bandwidthTest` producer агрегирует поля, записывает `status:done` без проверки последнего status. Документация перечисляет auth/connect/busy/disconnected ошибки | HTTP200 с терминальным отказом может выглядеть выполненным тестом; пустой ответ не доказывает завершение | 12.3.74: pure result interpreter и validation до success write, сохраняя pending/unknown пояснение и прежние команды/права |
|
||||
|
||||
Нулевой маршрутный каталог без WAN остаётся известным отсутствием модельных комбинаций, а не нулевым наблюдаемым трафиком. Исторические сохранённые0 нельзя автоматически считать неизвестными без исходного RouterOS ответа; массовую коррекцию/удаление данных не выполнять.
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
A["RouterOS на srcClient"] --> B["TX: отправка / RX: приём"]
|
||||
B --> C["Снимок пары устройств"]
|
||||
C --> D["Направление к Home: DL / от Home: UL"]
|
||||
C --> E["WAN: модельное сопоставление"]
|
||||
F["srcInterface"] --> G["after-ping / метаданные"]
|
||||
```
|
||||
|
||||
Проверки по блокам: pure функции без DB/network side effects, live API e2e с подменой HTTP, TypeScript/lint/build и профильные context сценарии при изменениях общей основы. Изменение фактической маршрутизации или новая стратегия принудительного выбора WAN требует отдельного дизайна и внешней приёмки12.5; в этой серии таких изменений нет.
|
||||
Reference in new issue
Block a user