diff --git a/docs/ux-ui-external-acceptance.md b/docs/ux-ui-external-acceptance.md index 183c0dd4..94ea858a 100644 --- a/docs/ux-ui-external-acceptance.md +++ b/docs/ux-ui-external-acceptance.md @@ -811,3 +811,27 @@ Production image не содержит dev-only jose: первый fixture impor **Runtime.** Один backend build ux-diagnostics89/version1.0.0-test.diagnostics89, image sha256:97c1cff01efd5055d3811b742e293180d5999ff1e326e42242e5c975b5f70349. Backend/PG healthy, frontend ux-optimizer87 сохранён/принят. Context recursive88 +3 exec/type files, override SHA2ca8c80d13a2dcce8b09c905f2b65d7467892ee6918cc102caad2d15d90bacbf7; label не Git SHA. Entry/node --check/pg_restore18.6/compose --wait passed, dependencies/apt cached. .env backup приватный, миграций и frontend rebuild нет. Один локальный commit без push. Продолжение90 — два собственных GRE пути OSPF/BFD, потеря primary, переход на alternate, packet observations и возврат. Сохраняются sustained BFD-only/физическая WAN failure/IPv6/масштаб/максимальная производительность/Portal SSO и другие внешние границы. Квота56% использовано после блока; этап12.5 открыт. + +## 12.5.90 — OSPF/BFD: переход на резервный GRE и возврат (2026-10-09) + +**Топология.** Свои primary GRE public↔public/link198.18.90.0/30/cost10/MTU1400 и alternate GRE/link198.18.91.0/30/cost100/MTU1380. Резервный GRE имеет отдельные outer endpoints198.18.92.1↔2 внутри собственного WireGuard/UDP59990/MTU1420. WireGuard ограничен peer /32, ключи созданы RouterOS; private keys не сохранены в отчёте. OSPFv2 private instances/area/loopbacks198.18.190.1/32↔2, hello1s/dead20s; BFD200ms×3 только на двух своих GRE. Originate-default=never, public interfaces не включались в OSPF. Два пути используют один public WAN; физическое резервирование не доказано. + +**Control/data plane.** На обоих CHR сначала2 Full и2 BFD Up, loopback через primary. Отключён только собственный primary GRE наCHR1; alternate остаётся Full/Up, native immediate-gw и API via показывают резервный интерфейс. Включение primary возвращает preferred path. Steady Ping3/3 в обе стороны во всех трёх фазах, в финальном control run с первой попытки. Исходная конфигурация восстановлена. + +| Наблюдение | Результат / граница | +| --- | --- | +| Primary BFD не Up / OSPF не Full | Первое HTTP-наблюдение797,7ms при dead20s | +| Active loopback через alternate | Первое HTTP-наблюдение4250,4ms | +| Ping во время переключения | Отдельная фаза18/40,55% loss; бесшовность не принята | +| Steady/возврат | 3/3×2 primary, alternate, recovered primary | +| UI во время alternate | 4/4 PC/320px, route peer/via DOM, BFD peer, reload URL, pageerror0 | + +[Объединённый отчёт](ux-ui/acceptance/ospf-failover-2026-10-09.json) сохраняет packet/browser phase и отдельную control phase с их именами/timestamps. В packet phase долгий native REST Ping задержал получение status batch:7648ms не является измерением BFD detection. В control phase длинного Ping во время sampling не было; времена включают RPC и остаются верхними границами первого наблюдения, не event timestamps/SLA. Потери не скрыты успешным steady Ping. + +**Оснастка.** Первая пара с одинаковыми outer public endpoints не достигла готовности; cleanup8 коллекций×2 прошёл. Для дальнейшего теста outer endpoints разграничены через свой WireGuard. Packet/browser phase подтвердила alternate path и4 UI cases, но первый Ping после возврата дал2/3. Cleanup10×2 прошёл. Затем выполнен только профильный control/recovery run без повторной UI-приёмки; bounded3 попытки сохраняют каждый результат, финальные steady probes прошли с первой. Product/source/dependencies не менялись, сборок/полной регрессии не было. + +**Визуальная приёмка.** [Browser отчёт](ux-ui/acceptance/browser-ospf-failover-2026-10-09.json), [ПК](ux-ui/screens/ospf-real-failover-server1-1280-2026-10-09.png), [320px](ux-ui/screens/ospf-real-failover-server1-320-2026-10-09.png). На PC снимке подтверждён next-hop198.18.91.2 и alternate via. Тип/Cost неизвестны и не заменены distance110. При просмотре найдено, что первый столбец слишком узок: CIDR198.18.190.2/32 визуально обрезан; это следующий самостоятельный UI блок91. Mobile проверяет document fit и наличие значений в DOM, а не одновременную видимость всех столбцов в горизонтальной прокрутке. + +**Очистка.** Exact ID/name/comment/address/interface/interfaces/addresses/public key preflight; удалены только свои templates/area/instance/BFD/IP/bridge/GRE/WG peers/interfaces. Исходные IDs10 коллекций×2 совпали, public/default routes и195.195.195.195/32 сохранены. WG secret fields не включены в report. Оба CHR доступны, passwords неизменны; временных контейнеров не осталось. Backend diagnostics89/PG healthy, frontend optimizer87 сохранён. Один локальный commit без push. + +Схема: primary → BFD/adjacency loss → alternate GRE over WG → проверка data plane → восстановленный primary. Транспорт подтверждён [GRE](https://help.mikrotik.com/docs/spaces/ROS/pages/24805531/GRE) и [WireGuard](https://help.mikrotik.com/docs/spaces/ROS/pages/69664792/WireGuard); таблицы сохраняют референсы общего плана. Продолжение91 — обрезка CIDR, затем BGP propagation/остальные внешние границы. BFD-only устойчивый запрет/physical WAN/IPv6/scale/maximum throughput/Portal SSO остаются открыты. Квота66% использовано; этап12.5 открыт. diff --git a/docs/ux-ui-plan.md b/docs/ux-ui-plan.md index 24c4c882..57990c0c 100644 --- a/docs/ux-ui-plan.md +++ b/docs/ux-ui-plan.md @@ -1,6 +1,6 @@ # План реализации UX/UI по пятичасовым окнам -Актуальное продолжение 2026-10-09: 12.5.89 принял терминал/диагностику: native Ping/trace/route/MTU, DNS приложения,16 disabled409/probe0,12 signed JWT gates и8 live UI cases. Исправлены exec enabled guard и avg RTT (native avg-rtt, не последний reply). Baseline7 коллекций×2 сохранён. Backend ux-diagnostics89/frontend ux-optimizer87. Следующий12.5.90 — контролируемый OSPF/BFD failover между двумя собственными GRE путями и восстановление; дальнейшие внешние ограничения сохраняются. Квота56% использовано; этап12.5 открыт. +Актуальное продолжение 2026-10-09: 12.5.90 принял контролируемый OSPF/BFD failover primary GRE→alternate GRE over WireGuard→primary; steady Ping3/3×2 во всех фазах,4 UI cases. BFD/not-Full≈798ms, first alternate route≈4250ms — HTTP observations, не SLA. Отдельный переходный Ping18/40/55% loss сохранён, бесшовность не заявлена. Baseline10 коллекций×2 восстановлен. Runtime diagnostics89/optimizer87. Следующий12.5.91 — устранить обрезку IPv4 CIDR в OSPF Data Grid, выявленную live desktop снимком; затем BGP route propagation и оставшиеся внешние границы. Квота66% использовано; этап12.5 открыт. Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-09. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат. diff --git a/docs/ux-ui-progress.md b/docs/ux-ui-progress.md index 8c4e0c76..7e93ab50 100644 --- a/docs/ux-ui-progress.md +++ b/docs/ux-ui-progress.md @@ -1,6 +1,6 @@ # UX/UI: журнал реализации -Актуальное продолжение 2026-10-09: 12.5.89 принял терминал/диагностику: native Ping/trace/route/MTU, DNS приложения,16 disabled409/probe0,12 signed JWT gates и8 live UI cases. Исправлены exec enabled guard и avg RTT (native avg-rtt, не последний reply). Baseline7 коллекций×2 сохранён. Backend ux-diagnostics89/frontend ux-optimizer87. Следующий12.5.90 — контролируемый OSPF/BFD failover между двумя собственными GRE путями и восстановление; дальнейшие внешние ограничения сохраняются. Квота56% использовано; этап12.5 открыт. +Актуальное продолжение 2026-10-09: 12.5.90 принял контролируемый OSPF/BFD failover primary GRE→alternate GRE over WireGuard→primary; steady Ping3/3×2 во всех фазах,4 UI cases. BFD/not-Full≈798ms, first alternate route≈4250ms — HTTP observations, не SLA. Отдельный переходный Ping18/40/55% loss сохранён, бесшовность не заявлена. Baseline10 коллекций×2 восстановлен. Runtime diagnostics89/optimizer87. Следующий12.5.91 — устранить обрезку IPv4 CIDR в OSPF Data Grid, выявленную live desktop снимком; затем BGP route propagation и оставшиеся внешние границы. Квота66% использовано; этап12.5 открыт. Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения. Записи расположены от новых к старым; подробная история этапа12 также сохранена в [ux-ui-stage-12.md](ux-ui-stage-12.md). @@ -36,7 +36,31 @@ | 10 | Маршрутизация, диагностика, карта и терминал | Завершён в границах локальной приёмки 2026-10-01; блоки 10.1–10.71, внешние ограничения в 10.71 | | 11А | Пользователи, контейнеры, сертификаты и резервные копии | Завершён в границах локальной приёмки 2026-10-01; 11А.1–11А.33, внешние ограничения в 11А.33 | | 11Б | Оповещения, сбор данных, интеграции, релизы и настройки | Завершён в границах локальной приёмки 2026-10-03; ограничения и evidence в11Б.7 | -| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка завершена в границах12.3.83; внешняя12.5 в работе, выполненные блоки1–89 и ограничения ниже. Runtime backend ux-diagnostics89/frontend ux-optimizer87. | +| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка завершена в границах12.3.83; внешняя12.5 в работе, выполненные блоки1–90 и ограничения ниже. Runtime backend ux-diagnostics89/frontend ux-optimizer87. | + +## 12.5.90 — OSPF/BFD: переход на резервный GRE и возврат (2026-10-09) + +**Топология.** Свои primary GRE public↔public/link198.18.90.0/30/cost10/MTU1400 и alternate GRE/link198.18.91.0/30/cost100/MTU1380. Резервный GRE имеет отдельные outer endpoints198.18.92.1↔2 внутри собственного WireGuard/UDP59990/MTU1420. WireGuard ограничен peer /32, ключи созданы RouterOS; private keys не сохранены в отчёте. OSPFv2 private instances/area/loopbacks198.18.190.1/32↔2, hello1s/dead20s; BFD200ms×3 только на двух своих GRE. Originate-default=never, public interfaces не включались в OSPF. Два пути используют один public WAN; физическое резервирование не доказано. + +**Control/data plane.** На обоих CHR сначала2 Full и2 BFD Up, loopback через primary. Отключён только собственный primary GRE наCHR1; alternate остаётся Full/Up, native immediate-gw и API via показывают резервный интерфейс. Включение primary возвращает preferred path. Steady Ping3/3 в обе стороны во всех трёх фазах, в финальном control run с первой попытки. Исходная конфигурация восстановлена. + +| Наблюдение | Результат / граница | +| --- | --- | +| Primary BFD не Up / OSPF не Full | Первое HTTP-наблюдение797,7ms при dead20s | +| Active loopback через alternate | Первое HTTP-наблюдение4250,4ms | +| Ping во время переключения | Отдельная фаза18/40,55% loss; бесшовность не принята | +| Steady/возврат | 3/3×2 primary, alternate, recovered primary | +| UI во время alternate | 4/4 PC/320px, route peer/via DOM, BFD peer, reload URL, pageerror0 | + +[Объединённый отчёт](ux-ui/acceptance/ospf-failover-2026-10-09.json) сохраняет packet/browser phase и отдельную control phase с их именами/timestamps. В packet phase долгий native REST Ping задержал получение status batch:7648ms не является измерением BFD detection. В control phase длинного Ping во время sampling не было; времена включают RPC и остаются верхними границами первого наблюдения, не event timestamps/SLA. Потери не скрыты успешным steady Ping. + +**Оснастка.** Первая пара с одинаковыми outer public endpoints не достигла готовности; cleanup8 коллекций×2 прошёл. Для дальнейшего теста outer endpoints разграничены через свой WireGuard. Packet/browser phase подтвердила alternate path и4 UI cases, но первый Ping после возврата дал2/3. Cleanup10×2 прошёл. Затем выполнен только профильный control/recovery run без повторной UI-приёмки; bounded3 попытки сохраняют каждый результат, финальные steady probes прошли с первой. Product/source/dependencies не менялись, сборок/полной регрессии не было. + +**Визуальная приёмка.** [Browser отчёт](ux-ui/acceptance/browser-ospf-failover-2026-10-09.json), [ПК](ux-ui/screens/ospf-real-failover-server1-1280-2026-10-09.png), [320px](ux-ui/screens/ospf-real-failover-server1-320-2026-10-09.png). На PC снимке подтверждён next-hop198.18.91.2 и alternate via. Тип/Cost неизвестны и не заменены distance110. При просмотре найдено, что первый столбец слишком узок: CIDR198.18.190.2/32 визуально обрезан; это следующий самостоятельный UI блок91. Mobile проверяет document fit и наличие значений в DOM, а не одновременную видимость всех столбцов в горизонтальной прокрутке. + +**Очистка.** Exact ID/name/comment/address/interface/interfaces/addresses/public key preflight; удалены только свои templates/area/instance/BFD/IP/bridge/GRE/WG peers/interfaces. Исходные IDs10 коллекций×2 совпали, public/default routes и195.195.195.195/32 сохранены. WG secret fields не включены в report. Оба CHR доступны, passwords неизменны; временных контейнеров не осталось. Backend diagnostics89/PG healthy, frontend optimizer87 сохранён. Один локальный commit без push. + +Схема: primary → BFD/adjacency loss → alternate GRE over WG → проверка data plane → восстановленный primary. Транспорт подтверждён [GRE](https://help.mikrotik.com/docs/spaces/ROS/pages/24805531/GRE) и [WireGuard](https://help.mikrotik.com/docs/spaces/ROS/pages/69664792/WireGuard); таблицы сохраняют референсы общего плана. Продолжение91 — обрезка CIDR, затем BGP propagation/остальные внешние границы. BFD-only устойчивый запрет/physical WAN/IPv6/scale/maximum throughput/Portal SSO остаются открыты. Квота66% использовано; этап12.5 открыт. ## 12.5.89 — диагностика и терминал: реальные ответы и JWT-права (2026-10-09) diff --git a/docs/ux-ui-stage-12.md b/docs/ux-ui-stage-12.md index 9ab58076..e0b9edcd 100644 --- a/docs/ux-ui-stage-12.md +++ b/docs/ux-ui-stage-12.md @@ -2120,3 +2120,27 @@ Production image не содержит dev-only jose: первый fixture impor **Runtime.** Один backend build ux-diagnostics89/version1.0.0-test.diagnostics89, image sha256:97c1cff01efd5055d3811b742e293180d5999ff1e326e42242e5c975b5f70349. Backend/PG healthy, frontend ux-optimizer87 сохранён/принят. Context recursive88 +3 exec/type files, override SHA2ca8c80d13a2dcce8b09c905f2b65d7467892ee6918cc102caad2d15d90bacbf7; label не Git SHA. Entry/node --check/pg_restore18.6/compose --wait passed, dependencies/apt cached. .env backup приватный, миграций и frontend rebuild нет. Один локальный commit без push. Продолжение90 — два собственных GRE пути OSPF/BFD, потеря primary, переход на alternate, packet observations и возврат. Сохраняются sustained BFD-only/физическая WAN failure/IPv6/масштаб/максимальная производительность/Portal SSO и другие внешние границы. Квота56% использовано после блока; этап12.5 открыт. + +## 12.5.90 — OSPF/BFD: переход на резервный GRE и возврат (2026-10-09) + +**Топология.** Свои primary GRE public↔public/link198.18.90.0/30/cost10/MTU1400 и alternate GRE/link198.18.91.0/30/cost100/MTU1380. Резервный GRE имеет отдельные outer endpoints198.18.92.1↔2 внутри собственного WireGuard/UDP59990/MTU1420. WireGuard ограничен peer /32, ключи созданы RouterOS; private keys не сохранены в отчёте. OSPFv2 private instances/area/loopbacks198.18.190.1/32↔2, hello1s/dead20s; BFD200ms×3 только на двух своих GRE. Originate-default=never, public interfaces не включались в OSPF. Два пути используют один public WAN; физическое резервирование не доказано. + +**Control/data plane.** На обоих CHR сначала2 Full и2 BFD Up, loopback через primary. Отключён только собственный primary GRE наCHR1; alternate остаётся Full/Up, native immediate-gw и API via показывают резервный интерфейс. Включение primary возвращает preferred path. Steady Ping3/3 в обе стороны во всех трёх фазах, в финальном control run с первой попытки. Исходная конфигурация восстановлена. + +| Наблюдение | Результат / граница | +| --- | --- | +| Primary BFD не Up / OSPF не Full | Первое HTTP-наблюдение797,7ms при dead20s | +| Active loopback через alternate | Первое HTTP-наблюдение4250,4ms | +| Ping во время переключения | Отдельная фаза18/40,55% loss; бесшовность не принята | +| Steady/возврат | 3/3×2 primary, alternate, recovered primary | +| UI во время alternate | 4/4 PC/320px, route peer/via DOM, BFD peer, reload URL, pageerror0 | + +[Объединённый отчёт](ux-ui/acceptance/ospf-failover-2026-10-09.json) сохраняет packet/browser phase и отдельную control phase с их именами/timestamps. В packet phase долгий native REST Ping задержал получение status batch:7648ms не является измерением BFD detection. В control phase длинного Ping во время sampling не было; времена включают RPC и остаются верхними границами первого наблюдения, не event timestamps/SLA. Потери не скрыты успешным steady Ping. + +**Оснастка.** Первая пара с одинаковыми outer public endpoints не достигла готовности; cleanup8 коллекций×2 прошёл. Для дальнейшего теста outer endpoints разграничены через свой WireGuard. Packet/browser phase подтвердила alternate path и4 UI cases, но первый Ping после возврата дал2/3. Cleanup10×2 прошёл. Затем выполнен только профильный control/recovery run без повторной UI-приёмки; bounded3 попытки сохраняют каждый результат, финальные steady probes прошли с первой. Product/source/dependencies не менялись, сборок/полной регрессии не было. + +**Визуальная приёмка.** [Browser отчёт](ux-ui/acceptance/browser-ospf-failover-2026-10-09.json), [ПК](ux-ui/screens/ospf-real-failover-server1-1280-2026-10-09.png), [320px](ux-ui/screens/ospf-real-failover-server1-320-2026-10-09.png). На PC снимке подтверждён next-hop198.18.91.2 и alternate via. Тип/Cost неизвестны и не заменены distance110. При просмотре найдено, что первый столбец слишком узок: CIDR198.18.190.2/32 визуально обрезан; это следующий самостоятельный UI блок91. Mobile проверяет document fit и наличие значений в DOM, а не одновременную видимость всех столбцов в горизонтальной прокрутке. + +**Очистка.** Exact ID/name/comment/address/interface/interfaces/addresses/public key preflight; удалены только свои templates/area/instance/BFD/IP/bridge/GRE/WG peers/interfaces. Исходные IDs10 коллекций×2 совпали, public/default routes и195.195.195.195/32 сохранены. WG secret fields не включены в report. Оба CHR доступны, passwords неизменны; временных контейнеров не осталось. Backend diagnostics89/PG healthy, frontend optimizer87 сохранён. Один локальный commit без push. + +Схема: primary → BFD/adjacency loss → alternate GRE over WG → проверка data plane → восстановленный primary. Транспорт подтверждён [GRE](https://help.mikrotik.com/docs/spaces/ROS/pages/24805531/GRE) и [WireGuard](https://help.mikrotik.com/docs/spaces/ROS/pages/69664792/WireGuard); таблицы сохраняют референсы общего плана. Продолжение91 — обрезка CIDR, затем BGP propagation/остальные внешние границы. BFD-only устойчивый запрет/physical WAN/IPv6/scale/maximum throughput/Portal SSO остаются открыты. Квота66% использовано; этап12.5 открыт. diff --git a/docs/ux-ui/acceptance/browser-ospf-failover-2026-10-09.json b/docs/ux-ui/acceptance/browser-ospf-failover-2026-10-09.json new file mode 100644 index 00000000..0cf1e0bc --- /dev/null +++ b/docs/ux-ui/acceptance/browser-ospf-failover-2026-10-09.json @@ -0,0 +1,39 @@ +{ + "date": "2026-10-09", + "phase": "2 320", + "cases": [ + { + "serverId": 1, + "width": 1280, + "alternateRouteVisible": true, + "alternateBfdPeerVisible": true, + "urlRestore": true, + "documentFits": true + }, + { + "serverId": 1, + "width": 320, + "alternateRouteVisible": true, + "alternateBfdPeerVisible": true, + "urlRestore": true, + "documentFits": true + }, + { + "serverId": 2, + "width": 1280, + "alternateRouteVisible": true, + "alternateBfdPeerVisible": true, + "urlRestore": true, + "documentFits": true + }, + { + "serverId": 2, + "width": 320, + "alternateRouteVisible": true, + "alternateBfdPeerVisible": true, + "urlRestore": true, + "documentFits": true + } + ], + "errors": [] +} \ No newline at end of file diff --git a/docs/ux-ui/acceptance/ospf-failover-2026-10-09.json b/docs/ux-ui/acceptance/ospf-failover-2026-10-09.json new file mode 100644 index 00000000..a8471bce --- /dev/null +++ b/docs/ux-ui/acceptance/ospf-failover-2026-10-09.json @@ -0,0 +1,1709 @@ +{ + "date": "2026-10-09", + "control": { + "date": "2026-10-09", + "name": "mm-fail90-1791557527240", + "samePublicUnderlay": true, + "observations": [ + { + "serverId": 1, + "phase": "primary", + "ping": { + "sent": 3, + "received": 3, + "packetLoss": "0" + } + }, + { + "serverId": 2, + "phase": "primary", + "ping": { + "sent": 3, + "received": 3, + "packetLoss": "0" + } + }, + { + "serverId": 1, + "phase": "alternate", + "ping": { + "sent": 3, + "received": 3, + "packetLoss": "0" + }, + "attempts": [ + { + "sent": 3, + "received": 3, + "packetLoss": "0" + } + ] + }, + { + "serverId": 2, + "phase": "alternate", + "ping": { + "sent": 3, + "received": 3, + "packetLoss": "0" + }, + "attempts": [ + { + "sent": 3, + "received": 3, + "packetLoss": "0" + } + ] + }, + { + "serverId": 1, + "phase": "recovered-primary", + "ping": { + "sent": 3, + "received": 3, + "packetLoss": "0" + }, + "attempts": [ + { + "sent": 3, + "received": 3, + "packetLoss": "0" + } + ] + }, + { + "serverId": 2, + "phase": "recovered-primary", + "ping": { + "sent": 3, + "received": 3, + "packetLoss": "0" + }, + "attempts": [ + { + "sent": 3, + "received": 3, + "packetLoss": "0" + } + ] + } + ], + "cleanup": [ + { + "serverId": 1, + "/interface/wireguard/peers": true, + "/interface/wireguard": true, + "/routing/ospf/interface-template": true, + "/routing/ospf/area": true, + "/routing/ospf/instance": true, + "/routing/bfd/configuration": true, + "/interface/gre": true, + "/interface/bridge": true, + "/ip/address": true, + "/ip/route": true + }, + { + "serverId": 2, + "/interface/wireguard/peers": true, + "/interface/wireguard": true, + "/routing/ospf/interface-template": true, + "/routing/ospf/area": true, + "/routing/ospf/instance": true, + "/routing/bfd/configuration": true, + "/interface/gre": true, + "/interface/bridge": true, + "/ip/address": true, + "/ip/route": true + } + ], + "wireguardUnderlay": [ + { + "serverId": 1, + "pingReceived": 3, + "peer": [ + { + "name": "mm-fail90-1791557527240-wg-peer", + "interface": "mm-fail90-1791557527240-wg", + "allowed-address": "198.18.92.2/32", + "current-endpoint-address": "104.165.244.7", + "current-endpoint-port": "59990", + "last-handshake": "1s", + "rx": "660", + "tx": "848" + } + ] + }, + { + "serverId": 2, + "pingReceived": 3, + "peer": [ + { + "name": "mm-fail90-1791557527240-wg-peer", + "interface": "mm-fail90-1791557527240-wg", + "allowed-address": "198.18.92.1/32", + "current-endpoint-address": "194.226.121.150", + "current-endpoint-port": "59990", + "last-handshake": "2s", + "rx": "988", + "tx": "948" + } + ] + } + ], + "initial": [ + { + "peers": [ + { + ".id": "*F3FDDC00", + "address": "198.18.90.2", + "adjacency": "3s", + "area": "mm-fail90-1791557527240", + "dynamic": "true", + "instance": "mm-fail90-1791557527240", + "interface": "mm-fail90-1791557527240-p", + "ls-retransmits": "1", + "router-id": "198.18.190.2", + "state": "Full", + "state-changes": "5", + "timeout": "20s" + }, + { + ".id": "*F3FDDBD2", + "address": "198.18.91.2", + "adjacency": "3s", + "area": "mm-fail90-1791557527240", + "dynamic": "true", + "instance": "mm-fail90-1791557527240", + "interface": "mm-fail90-1791557527240-a", + "router-id": "198.18.190.2", + "state": "Full", + "state-changes": "5", + "timeout": "20s" + } + ], + "routes": [ + { + ".id": "*2014C000", + "active": "true", + "distance": "110", + "dst-address": "198.18.190.2/32", + "dynamic": "true", + "gateway": "198.18.90.2%mm-fail90-1791557527240-p", + "immediate-gw": "198.18.90.2%mm-fail90-1791557527240-p", + "inactive": "false", + "ospf": "true", + "routing-table": "main", + "scope": "20", + "target-scope": "10" + } + ], + "bfd": [ + { + ".id": "*1", + "actual-tx-interval": "200ms", + "desired-tx-interval": "200ms", + "hold-time": "600ms", + "local-address": "198.18.90.1%mm-fail90-1791557527240-p", + "multihop": "false", + "multiplier": "3", + "packets-rx": "14", + "packets-tx": "16", + "remote-address": "198.18.90.2%mm-fail90-1791557527240-p", + "remote-min-rx": "200ms", + "remote-min-tx": "200ms", + "required-min-rx": "200ms", + "state": "up", + "state-changes": "1", + "up": "true", + "uptime": "3s", + "vrf": "main" + }, + { + ".id": "*2", + "actual-tx-interval": "200ms", + "desired-tx-interval": "200ms", + "hold-time": "600ms", + "local-address": "198.18.91.1%mm-fail90-1791557527240-a", + "multihop": "false", + "multiplier": "3", + "packets-rx": "14", + "packets-tx": "16", + "remote-address": "198.18.91.2%mm-fail90-1791557527240-a", + "remote-min-rx": "200ms", + "remote-min-tx": "200ms", + "required-min-rx": "200ms", + "state": "up", + "state-changes": "1", + "up": "true", + "uptime": "3s", + "vrf": "main" + } + ] + }, + { + "peers": [ + { + ".id": "*F3FDDC00", + "address": "198.18.90.1", + "adjacency": "3s", + "area": "mm-fail90-1791557527240", + "dynamic": "true", + "instance": "mm-fail90-1791557527240", + "interface": "mm-fail90-1791557527240-p", + "ls-retransmits": "1", + "router-id": "198.18.190.1", + "state": "Full", + "state-changes": "6", + "timeout": "19s" + }, + { + ".id": "*F3FDDBD2", + "address": "198.18.91.1", + "adjacency": "3s", + "area": "mm-fail90-1791557527240", + "dynamic": "true", + "instance": "mm-fail90-1791557527240", + "interface": "mm-fail90-1791557527240-a", + "router-id": "198.18.190.1", + "state": "Full", + "state-changes": "5", + "timeout": "19s" + } + ], + "routes": [ + { + ".id": "*2014C000", + "active": "true", + "distance": "110", + "dst-address": "198.18.190.1/32", + "dynamic": "true", + "gateway": "198.18.90.1%mm-fail90-1791557527240-p", + "immediate-gw": "198.18.90.1%mm-fail90-1791557527240-p", + "inactive": "false", + "ospf": "true", + "routing-table": "main", + "scope": "20", + "target-scope": "10" + } + ], + "bfd": [ + { + ".id": "*1", + "actual-tx-interval": "200ms", + "desired-tx-interval": "200ms", + "hold-time": "600ms", + "local-address": "198.18.90.2%mm-fail90-1791557527240-p", + "multihop": "false", + "multiplier": "3", + "packets-rx": "16", + "packets-tx": "15", + "remote-address": "198.18.90.1%mm-fail90-1791557527240-p", + "remote-min-rx": "200ms", + "remote-min-tx": "200ms", + "required-min-rx": "200ms", + "state": "up", + "state-changes": "2", + "up": "true", + "uptime": "3s", + "vrf": "main" + }, + { + ".id": "*2", + "actual-tx-interval": "200ms", + "desired-tx-interval": "200ms", + "hold-time": "600ms", + "local-address": "198.18.91.2%mm-fail90-1791557527240-a", + "multihop": "false", + "multiplier": "3", + "packets-rx": "16", + "packets-tx": "15", + "remote-address": "198.18.91.1%mm-fail90-1791557527240-a", + "remote-min-rx": "200ms", + "remote-min-tx": "200ms", + "required-min-rx": "200ms", + "state": "up", + "state-changes": "2", + "up": "true", + "uptime": "3s", + "vrf": "main" + } + ] + } + ], + "failover": { + "ownedPrimaryDisabled": true, + "deadIntervalMs": 20000, + "nominalHoldMs": 600, + "acknowledgedMs": 31.861972999999125, + "firstBfdNotUp": 797.6796959999992, + "firstPrimaryNotFull": 797.6796959999992, + "firstAlternatePath": 4250.378601, + "samples": [ + { + "beganMs": 31.86626199999955, + "endedMs": 104.70082600000023, + "bfdUp": true, + "primaryFull": true, + "alternateFull": true, + "alternatePath": false + }, + { + "beganMs": 205.2806729999993, + "endedMs": 275.9986779999999, + "bfdUp": true, + "primaryFull": true, + "alternateFull": true, + "alternatePath": false + }, + { + "beganMs": 376.3673369999997, + "endedMs": 451.4194159999988, + "bfdUp": true, + "primaryFull": true, + "alternateFull": true, + "alternatePath": false + }, + { + "beganMs": 551.8348459999997, + "endedMs": 623.9035499999991, + "bfdUp": true, + "primaryFull": true, + "alternateFull": true, + "alternatePath": false + }, + { + "beganMs": 724.2858080000005, + "endedMs": 797.6796959999992, + "bfdUp": false, + "primaryFull": false, + "alternateFull": true, + "alternatePath": false + }, + { + "beganMs": 898.0612509999992, + "endedMs": 976.0685130000002, + "bfdUp": false, + "primaryFull": false, + "alternateFull": true, + "alternatePath": false + }, + { + "beganMs": 1076.4464530000005, + "endedMs": 1146.5639449999999, + "bfdUp": false, + "primaryFull": false, + "alternateFull": true, + "alternatePath": false + }, + { + "beganMs": 1246.9517959999994, + "endedMs": 1317.5914809999995, + "bfdUp": false, + "primaryFull": false, + "alternateFull": true, + "alternatePath": false + }, + { + "beganMs": 1417.993414999999, + "endedMs": 1490.3611550000005, + "bfdUp": false, + "primaryFull": false, + "alternateFull": true, + "alternatePath": false + }, + { + "beganMs": 1590.7701779999989, + "endedMs": 1661.5691320000005, + "bfdUp": false, + "primaryFull": false, + "alternateFull": true, + "alternatePath": false + }, + { + "beganMs": 1762.002826, + "endedMs": 1835.6586420000003, + "bfdUp": false, + "primaryFull": false, + "alternateFull": true, + "alternatePath": false + }, + { + "beganMs": 1936.058642, + "endedMs": 2007.089786999999, + "bfdUp": false, + "primaryFull": false, + "alternateFull": true, + "alternatePath": false + }, + { + "beganMs": 2107.461673, + "endedMs": 2179.556461, + "bfdUp": false, + "primaryFull": false, + "alternateFull": true, + "alternatePath": false + }, + { + "beganMs": 2280.3738080000003, + "endedMs": 2351.9331999999995, + "bfdUp": false, + "primaryFull": false, + "alternateFull": true, + "alternatePath": false + }, + { + "beganMs": 2452.3607329999995, + "endedMs": 2522.683212, + "bfdUp": false, + "primaryFull": false, + "alternateFull": true, + "alternatePath": false + }, + { + "beganMs": 2623.0968749999993, + "endedMs": 2696.527038, + "bfdUp": false, + "primaryFull": false, + "alternateFull": true, + "alternatePath": false + }, + { + "beganMs": 2797.005045, + "endedMs": 2868.184138999999, + "bfdUp": false, + "primaryFull": false, + "alternateFull": true, + "alternatePath": false + }, + { + "beganMs": 2968.5968140000004, + "endedMs": 3038.569229999999, + "bfdUp": false, + "primaryFull": false, + "alternateFull": true, + "alternatePath": false + }, + { + "beganMs": 3139.000206999999, + "endedMs": 3212.663483999999, + "bfdUp": false, + "primaryFull": false, + "alternateFull": true, + "alternatePath": false + }, + { + "beganMs": 3313.0569099999993, + "endedMs": 3384.3387170000005, + "bfdUp": false, + "primaryFull": false, + "alternateFull": true, + "alternatePath": false + }, + { + "beganMs": 3484.6958529999993, + "endedMs": 3558.9096819999995, + "bfdUp": false, + "primaryFull": false, + "alternateFull": true, + "alternatePath": false + }, + { + "beganMs": 3659.3017340000006, + "endedMs": 3730.5719790000003, + "bfdUp": false, + "primaryFull": false, + "alternateFull": true, + "alternatePath": false + }, + { + "beganMs": 3830.966962999999, + "endedMs": 3904.4786050000002, + "bfdUp": false, + "primaryFull": false, + "alternateFull": true, + "alternatePath": false + }, + { + "beganMs": 4004.957919999999, + "endedMs": 4077.9120810000004, + "bfdUp": false, + "primaryFull": false, + "alternateFull": true, + "alternatePath": false + }, + { + "beganMs": 4178.522881999999, + "endedMs": 4250.378601, + "bfdUp": false, + "primaryFull": false, + "alternateFull": true, + "alternatePath": true + } + ], + "after": [ + { + "peers": [ + { + ".id": "*F3FDDBD2", + "address": "198.18.91.2", + "adjacency": "9s", + "area": "mm-fail90-1791557527240", + "dynamic": "true", + "instance": "mm-fail90-1791557527240", + "interface": "mm-fail90-1791557527240-a", + "router-id": "198.18.190.2", + "state": "Full", + "state-changes": "5", + "timeout": "20s" + } + ], + "routes": [ + { + ".id": "*2014C000", + "active": "true", + "distance": "110", + "dst-address": "198.18.190.2/32", + "dynamic": "true", + "gateway": "198.18.91.2%mm-fail90-1791557527240-a", + "immediate-gw": "198.18.91.2%mm-fail90-1791557527240-a", + "inactive": "false", + "ospf": "true", + "routing-table": "main", + "scope": "20", + "target-scope": "10" + } + ], + "bfd": [ + { + ".id": "*1", + "actual-tx-interval": "200ms", + "desired-tx-interval": "200ms", + "hold-time": "600ms", + "local-address": "198.18.91.1%mm-fail90-1791557527240-a", + "multihop": "false", + "multiplier": "3", + "packets-rx": "48", + "packets-tx": "51", + "remote-address": "198.18.91.2%mm-fail90-1791557527240-a", + "remote-min-rx": "200ms", + "remote-min-tx": "200ms", + "required-min-rx": "200ms", + "state": "up", + "state-changes": "1", + "up": "true", + "uptime": "9s", + "vrf": "main" + } + ] + }, + { + "peers": [ + { + ".id": "*F3FDDBD2", + "address": "198.18.91.1", + "adjacency": "9s", + "area": "mm-fail90-1791557527240", + "dynamic": "true", + "instance": "mm-fail90-1791557527240", + "interface": "mm-fail90-1791557527240-a", + "ls-retransmits": "1", + "router-id": "198.18.190.1", + "state": "Full", + "state-changes": "5", + "timeout": "19s" + } + ], + "routes": [ + { + ".id": "*2014C000", + "active": "true", + "distance": "110", + "dst-address": "198.18.190.1/32", + "dynamic": "true", + "gateway": "198.18.91.1%mm-fail90-1791557527240-a", + "immediate-gw": "198.18.91.1%mm-fail90-1791557527240-a", + "inactive": "false", + "ospf": "true", + "routing-table": "main", + "scope": "20", + "target-scope": "10" + } + ], + "bfd": [ + { + ".id": "*1", + "actual-tx-interval": "200ms", + "desired-tx-interval": "200ms", + "hold-time": "600ms", + "local-address": "198.18.91.2%mm-fail90-1791557527240-a", + "multihop": "false", + "multiplier": "3", + "packets-rx": "51", + "packets-tx": "49", + "remote-address": "198.18.91.1%mm-fail90-1791557527240-a", + "remote-min-rx": "200ms", + "remote-min-tx": "200ms", + "required-min-rx": "200ms", + "state": "up", + "state-changes": "2", + "up": "true", + "uptime": "9s", + "vrf": "main" + } + ] + } + ] + }, + "degradedCatalog": { + "neighbors": [ + { + "id": "*F3FDDBD2", + "serverId": 1, + "serverName": "CHR", + "serverSite": "", + "serverCountry": "", + "address": "198.18.91.2", + "routerId": "198.18.190.2", + "instance": "mm-fail90-1791557527240", + "area": "mm-fail90-1791557527240", + "areaId": "0.0.0.0", + "interface": "mm-fail90-1791557527240-a", + "state": "Full", + "uptime": "10s", + "stateChanges": 5, + "priority": null + }, + { + "id": "*F3FDDBD2", + "serverId": 2, + "serverName": "CHR", + "serverSite": "", + "serverCountry": "", + "address": "198.18.91.1", + "routerId": "198.18.190.1", + "instance": "mm-fail90-1791557527240", + "area": "mm-fail90-1791557527240", + "areaId": "0.0.0.0", + "interface": "mm-fail90-1791557527240-a", + "state": "Full", + "uptime": "10s", + "stateChanges": 5, + "priority": null + } + ], + "routes": [ + { + "id": "*2014C010", + "serverId": 1, + "serverName": "CHR", + "serverSite": "", + "destination": "198.18.90.0/30", + "type": "Unknown", + "cost": null, + "nextHop": "198.18.91.2", + "via": "mm-fail90-1791557527240-a", + "area": "" + }, + { + "id": "*2014C000", + "serverId": 1, + "serverName": "CHR", + "serverSite": "", + "destination": "198.18.190.2/32", + "type": "Unknown", + "cost": null, + "nextHop": "198.18.91.2", + "via": "mm-fail90-1791557527240-a", + "area": "" + }, + { + "id": "*2014C000", + "serverId": 2, + "serverName": "CHR", + "serverSite": "", + "destination": "198.18.190.1/32", + "type": "Unknown", + "cost": null, + "nextHop": "198.18.91.1", + "via": "mm-fail90-1791557527240-a", + "area": "" + } + ], + "bfdSessions": [ + { + "id": "*1", + "serverId": 1, + "serverName": "CHR", + "serverSite": "", + "serverCountry": "", + "localAddr": "198.18.91.1", + "remoteAddr": "198.18.91.2", + "interface": "mm-fail90-1791557527240-a", + "state": "Up", + "uptime": "10s", + "multihop": false, + "multiplier": 3, + "txInterval": 200, + "rxInterval": 200, + "holdTime": 600, + "packetsRx": 55, + "packetsTx": 57, + "stateChanges": 1 + }, + { + "id": "*1", + "serverId": 2, + "serverName": "CHR", + "serverSite": "", + "serverCountry": "", + "localAddr": "198.18.91.2", + "remoteAddr": "198.18.91.1", + "interface": "mm-fail90-1791557527240-a", + "state": "Up", + "uptime": "10s", + "multihop": false, + "multiplier": 3, + "txInterval": 200, + "rxInterval": 200, + "holdTime": 600, + "packetsRx": 57, + "packetsTx": 56, + "stateChanges": 2 + } + ] + }, + "recovered": [ + { + "peers": [ + { + ".id": "*F3FDDC00", + "address": "198.18.90.2", + "adjacency": "3s", + "area": "mm-fail90-1791557527240", + "dynamic": "true", + "instance": "mm-fail90-1791557527240", + "interface": "mm-fail90-1791557527240-p", + "router-id": "198.18.190.2", + "state": "Full", + "state-changes": "4", + "timeout": "20s" + }, + { + ".id": "*F3FDDBD2", + "address": "198.18.91.2", + "adjacency": "15s", + "area": "mm-fail90-1791557527240", + "dynamic": "true", + "instance": "mm-fail90-1791557527240", + "interface": "mm-fail90-1791557527240-a", + "router-id": "198.18.190.2", + "state": "Full", + "state-changes": "5", + "timeout": "20s" + } + ], + "routes": [ + { + ".id": "*2014C000", + "active": "true", + "distance": "110", + "dst-address": "198.18.190.2/32", + "dynamic": "true", + "gateway": "198.18.90.2%mm-fail90-1791557527240-p", + "immediate-gw": "198.18.90.2%mm-fail90-1791557527240-p", + "inactive": "false", + "ospf": "true", + "routing-table": "main", + "scope": "20", + "target-scope": "10" + } + ], + "bfd": [ + { + ".id": "*1", + "actual-tx-interval": "200ms", + "desired-tx-interval": "200ms", + "hold-time": "600ms", + "local-address": "198.18.90.1%mm-fail90-1791557527240-p", + "multihop": "false", + "multiplier": "3", + "packets-rx": "16", + "packets-tx": "17", + "remote-address": "198.18.90.2%mm-fail90-1791557527240-p", + "remote-min-rx": "200ms", + "remote-min-tx": "200ms", + "required-min-rx": "200ms", + "state": "up", + "state-changes": "1", + "up": "true", + "uptime": "3s", + "vrf": "main" + }, + { + ".id": "*2", + "actual-tx-interval": "200ms", + "desired-tx-interval": "200ms", + "hold-time": "600ms", + "local-address": "198.18.91.1%mm-fail90-1791557527240-a", + "multihop": "false", + "multiplier": "3", + "packets-rx": "82", + "packets-tx": "86", + "remote-address": "198.18.91.2%mm-fail90-1791557527240-a", + "remote-min-rx": "200ms", + "remote-min-tx": "200ms", + "required-min-rx": "200ms", + "state": "up", + "state-changes": "1", + "up": "true", + "uptime": "15s", + "vrf": "main" + } + ] + }, + { + "peers": [ + { + ".id": "*F3FDDC00", + "address": "198.18.90.1", + "adjacency": "3s", + "area": "mm-fail90-1791557527240", + "dynamic": "true", + "instance": "mm-fail90-1791557527240", + "interface": "mm-fail90-1791557527240-p", + "ls-retransmits": "1", + "router-id": "198.18.190.1", + "state": "Full", + "state-changes": "5", + "timeout": "20s" + }, + { + ".id": "*F3FDDBD2", + "address": "198.18.91.1", + "adjacency": "15s", + "area": "mm-fail90-1791557527240", + "dynamic": "true", + "instance": "mm-fail90-1791557527240", + "interface": "mm-fail90-1791557527240-a", + "router-id": "198.18.190.1", + "state": "Full", + "state-changes": "5", + "timeout": "19s" + } + ], + "routes": [ + { + ".id": "*2014C000", + "active": "true", + "distance": "110", + "dst-address": "198.18.190.1/32", + "dynamic": "true", + "gateway": "198.18.90.1%mm-fail90-1791557527240-p", + "immediate-gw": "198.18.90.1%mm-fail90-1791557527240-p", + "inactive": "false", + "ospf": "true", + "routing-table": "main", + "scope": "20", + "target-scope": "10" + } + ], + "bfd": [ + { + ".id": "*1", + "actual-tx-interval": "200ms", + "desired-tx-interval": "200ms", + "hold-time": "600ms", + "local-address": "198.18.90.2%mm-fail90-1791557527240-p", + "multihop": "false", + "multiplier": "3", + "packets-rx": "17", + "packets-tx": "18", + "remote-address": "198.18.90.1%mm-fail90-1791557527240-p", + "remote-min-rx": "200ms", + "remote-min-tx": "200ms", + "required-min-rx": "200ms", + "state": "up", + "state-changes": "2", + "up": "true", + "uptime": "3s", + "vrf": "main" + }, + { + ".id": "*2", + "actual-tx-interval": "200ms", + "desired-tx-interval": "200ms", + "hold-time": "600ms", + "local-address": "198.18.91.2%mm-fail90-1791557527240-a", + "multihop": "false", + "multiplier": "3", + "packets-rx": "86", + "packets-tx": "84", + "remote-address": "198.18.91.1%mm-fail90-1791557527240-a", + "remote-min-rx": "200ms", + "remote-min-tx": "200ms", + "required-min-rx": "200ms", + "state": "up", + "state-changes": "2", + "up": "true", + "uptime": "15s", + "vrf": "main" + } + ] + } + ] + }, + "packetAndBrowserPhase": { + "date": "2026-10-09", + "name": "mm-fail90-1791557069795", + "samePublicUnderlay": true, + "observations": [ + { + "serverId": 1, + "phase": "primary", + "ping": { + "sent": 3, + "received": 3, + "packetLoss": "0" + } + }, + { + "serverId": 2, + "phase": "primary", + "ping": { + "sent": 3, + "received": 3, + "packetLoss": "0" + } + }, + { + "serverId": 1, + "phase": "alternate", + "ping": { + "sent": 3, + "received": 3, + "packetLoss": "0" + } + }, + { + "serverId": 2, + "phase": "alternate", + "ping": { + "sent": 3, + "received": 3, + "packetLoss": "0" + } + } + ], + "cleanup": [ + { + "serverId": 1, + "/interface/wireguard/peers": true, + "/interface/wireguard": true, + "/routing/ospf/interface-template": true, + "/routing/ospf/area": true, + "/routing/ospf/instance": true, + "/routing/bfd/configuration": true, + "/interface/gre": true, + "/interface/bridge": true, + "/ip/address": true, + "/ip/route": true + }, + { + "serverId": 2, + "/interface/wireguard/peers": true, + "/interface/wireguard": true, + "/routing/ospf/interface-template": true, + "/routing/ospf/area": true, + "/routing/ospf/instance": true, + "/routing/bfd/configuration": true, + "/interface/gre": true, + "/interface/bridge": true, + "/ip/address": true, + "/ip/route": true + } + ], + "wireguardUnderlay": [ + { + "serverId": 1, + "pingReceived": 3, + "peer": [ + { + "name": "mm-fail90-1791557069795-wg-peer", + "interface": "mm-fail90-1791557069795-wg", + "allowed-address": "198.18.92.2/32", + "current-endpoint-address": "104.165.244.7", + "current-endpoint-port": "59990", + "last-handshake": "1s", + "rx": "660", + "tx": "848" + } + ] + }, + { + "serverId": 2, + "pingReceived": 3, + "peer": [ + { + "name": "mm-fail90-1791557069795-wg-peer", + "interface": "mm-fail90-1791557069795-wg", + "allowed-address": "198.18.92.1/32", + "current-endpoint-address": "194.226.121.150", + "current-endpoint-port": "59990", + "last-handshake": "2s", + "rx": "988", + "tx": "948" + } + ] + } + ], + "initial": [ + { + "peers": [ + { + ".id": "*F3FDDC00", + "address": "198.18.90.2", + "adjacency": "4s", + "area": "mm-fail90-1791557069795", + "dynamic": "true", + "instance": "mm-fail90-1791557069795", + "interface": "mm-fail90-1791557069795-p", + "router-id": "198.18.190.2", + "state": "Full", + "state-changes": "5", + "timeout": "20s" + }, + { + ".id": "*F3FDDBD2", + "address": "198.18.91.2", + "adjacency": "4s", + "area": "mm-fail90-1791557069795", + "dynamic": "true", + "instance": "mm-fail90-1791557069795", + "interface": "mm-fail90-1791557069795-a", + "router-id": "198.18.190.2", + "state": "Full", + "state-changes": "5", + "timeout": "20s" + } + ], + "routes": [ + { + ".id": "*2014C000", + "active": "true", + "distance": "110", + "dst-address": "198.18.190.2/32", + "dynamic": "true", + "gateway": "198.18.90.2%mm-fail90-1791557069795-p", + "immediate-gw": "198.18.90.2%mm-fail90-1791557069795-p", + "inactive": "false", + "ospf": "true", + "routing-table": "main", + "scope": "20", + "target-scope": "10" + } + ], + "bfd": [ + { + ".id": "*1", + "actual-tx-interval": "200ms", + "desired-tx-interval": "200ms", + "hold-time": "600ms", + "local-address": "198.18.90.1%mm-fail90-1791557069795-p", + "multihop": "false", + "multiplier": "3", + "packets-rx": "16", + "packets-tx": "21", + "remote-address": "198.18.90.2%mm-fail90-1791557069795-p", + "remote-min-rx": "200ms", + "remote-min-tx": "200ms", + "required-min-rx": "200ms", + "state": "up", + "state-changes": "1", + "up": "true", + "uptime": "3s", + "vrf": "main" + }, + { + ".id": "*2", + "actual-tx-interval": "200ms", + "desired-tx-interval": "200ms", + "hold-time": "600ms", + "local-address": "198.18.91.1%mm-fail90-1791557069795-a", + "multihop": "false", + "multiplier": "3", + "packets-rx": "19", + "packets-tx": "22", + "remote-address": "198.18.91.2%mm-fail90-1791557069795-a", + "remote-min-rx": "200ms", + "remote-min-tx": "200ms", + "required-min-rx": "200ms", + "state": "up", + "state-changes": "1", + "up": "true", + "uptime": "3s", + "vrf": "main" + } + ] + }, + { + "peers": [ + { + ".id": "*F3FDDC00", + "address": "198.18.90.1", + "adjacency": "4s", + "area": "mm-fail90-1791557069795", + "dynamic": "true", + "instance": "mm-fail90-1791557069795", + "interface": "mm-fail90-1791557069795-p", + "router-id": "198.18.190.1", + "state": "Full", + "state-changes": "6", + "timeout": "19s" + }, + { + ".id": "*F3FDDBD2", + "address": "198.18.91.1", + "adjacency": "4s", + "area": "mm-fail90-1791557069795", + "dynamic": "true", + "instance": "mm-fail90-1791557069795", + "interface": "mm-fail90-1791557069795-a", + "router-id": "198.18.190.1", + "state": "Full", + "state-changes": "5", + "timeout": "19s" + } + ], + "routes": [ + { + ".id": "*2014C000", + "active": "true", + "distance": "110", + "dst-address": "198.18.190.1/32", + "dynamic": "true", + "gateway": "198.18.90.1%mm-fail90-1791557069795-p", + "immediate-gw": "198.18.90.1%mm-fail90-1791557069795-p", + "inactive": "false", + "ospf": "true", + "routing-table": "main", + "scope": "20", + "target-scope": "10" + } + ], + "bfd": [ + { + ".id": "*1", + "actual-tx-interval": "200ms", + "desired-tx-interval": "200ms", + "hold-time": "600ms", + "local-address": "198.18.90.2%mm-fail90-1791557069795-p", + "multihop": "false", + "multiplier": "3", + "packets-rx": "21", + "packets-tx": "18", + "remote-address": "198.18.90.1%mm-fail90-1791557069795-p", + "remote-min-rx": "200ms", + "remote-min-tx": "200ms", + "required-min-rx": "200ms", + "state": "up", + "state-changes": "2", + "up": "true", + "uptime": "3s", + "vrf": "main" + }, + { + ".id": "*2", + "actual-tx-interval": "200ms", + "desired-tx-interval": "200ms", + "hold-time": "600ms", + "local-address": "198.18.91.2%mm-fail90-1791557069795-a", + "multihop": "false", + "multiplier": "3", + "packets-rx": "22", + "packets-tx": "20", + "remote-address": "198.18.91.1%mm-fail90-1791557069795-a", + "remote-min-rx": "200ms", + "remote-min-tx": "200ms", + "required-min-rx": "200ms", + "state": "up", + "state-changes": "2", + "up": "true", + "uptime": "3s", + "vrf": "main" + } + ] + } + ], + "failover": { + "ownedPrimaryDisabled": true, + "deadIntervalMs": 20000, + "nominalHoldMs": 600, + "acknowledgedMs": 31.264249000001655, + "firstBfdNotUp": 7648.29183, + "firstPrimaryNotFull": 7648.29183, + "firstAlternatePath": 7648.29183, + "samples": [ + { + "beganMs": 31.27094400000169, + "endedMs": 7648.29183, + "bfdUp": false, + "primaryFull": false, + "alternateFull": true, + "alternatePath": true + } + ], + "after": [ + { + "peers": [ + { + ".id": "*F3FDDBD2", + "address": "198.18.91.2", + "adjacency": "13s", + "area": "mm-fail90-1791557069795", + "dynamic": "true", + "instance": "mm-fail90-1791557069795", + "interface": "mm-fail90-1791557069795-a", + "router-id": "198.18.190.2", + "state": "Full", + "state-changes": "5", + "timeout": "20s" + } + ], + "routes": [ + { + ".id": "*2014C000", + "active": "true", + "distance": "110", + "dst-address": "198.18.190.2/32", + "dynamic": "true", + "gateway": "198.18.91.2%mm-fail90-1791557069795-a", + "immediate-gw": "198.18.91.2%mm-fail90-1791557069795-a", + "inactive": "false", + "ospf": "true", + "routing-table": "main", + "scope": "20", + "target-scope": "10" + } + ], + "bfd": [ + { + ".id": "*1", + "actual-tx-interval": "200ms", + "desired-tx-interval": "200ms", + "hold-time": "600ms", + "local-address": "198.18.91.1%mm-fail90-1791557069795-a", + "multihop": "false", + "multiplier": "3", + "packets-rx": "70", + "packets-tx": "76", + "remote-address": "198.18.91.2%mm-fail90-1791557069795-a", + "remote-min-rx": "200ms", + "remote-min-tx": "200ms", + "required-min-rx": "200ms", + "state": "up", + "state-changes": "1", + "up": "true", + "uptime": "12s", + "vrf": "main" + } + ] + }, + { + "peers": [ + { + ".id": "*F3FDDBD2", + "address": "198.18.91.1", + "adjacency": "13s", + "area": "mm-fail90-1791557069795", + "dynamic": "true", + "instance": "mm-fail90-1791557069795", + "interface": "mm-fail90-1791557069795-a", + "router-id": "198.18.190.1", + "state": "Full", + "state-changes": "5", + "timeout": "19s" + } + ], + "routes": [ + { + ".id": "*2014C000", + "active": "true", + "distance": "110", + "dst-address": "198.18.190.1/32", + "dynamic": "true", + "gateway": "198.18.91.1%mm-fail90-1791557069795-a", + "immediate-gw": "198.18.91.1%mm-fail90-1791557069795-a", + "inactive": "false", + "ospf": "true", + "routing-table": "main", + "scope": "20", + "target-scope": "10" + } + ], + "bfd": [ + { + ".id": "*1", + "actual-tx-interval": "200ms", + "desired-tx-interval": "200ms", + "hold-time": "600ms", + "local-address": "198.18.91.2%mm-fail90-1791557069795-a", + "multihop": "false", + "multiplier": "3", + "packets-rx": "76", + "packets-tx": "73", + "remote-address": "198.18.91.1%mm-fail90-1791557069795-a", + "remote-min-rx": "200ms", + "remote-min-tx": "200ms", + "required-min-rx": "200ms", + "state": "up", + "state-changes": "2", + "up": "true", + "uptime": "12s", + "vrf": "main" + } + ] + } + ], + "transitionPing": { + "sent": 40, + "received": 18, + "packetLoss": "55" + } + }, + "degradedCatalog": { + "neighbors": [ + { + "id": "*F3FDDBD2", + "serverId": 1, + "serverName": "CHR", + "serverSite": "", + "serverCountry": "", + "address": "198.18.91.2", + "routerId": "198.18.190.2", + "instance": "mm-fail90-1791557069795", + "area": "mm-fail90-1791557069795", + "areaId": "0.0.0.0", + "interface": "mm-fail90-1791557069795-a", + "state": "Full", + "uptime": "14s", + "stateChanges": 5, + "priority": null + }, + { + "id": "*F3FDDBD2", + "serverId": 2, + "serverName": "CHR", + "serverSite": "", + "serverCountry": "", + "address": "198.18.91.1", + "routerId": "198.18.190.1", + "instance": "mm-fail90-1791557069795", + "area": "mm-fail90-1791557069795", + "areaId": "0.0.0.0", + "interface": "mm-fail90-1791557069795-a", + "state": "Full", + "uptime": "14s", + "stateChanges": 5, + "priority": null + } + ], + "routes": [ + { + "id": "*2014C010", + "serverId": 1, + "serverName": "CHR", + "serverSite": "", + "destination": "198.18.90.0/30", + "type": "Unknown", + "cost": null, + "nextHop": "198.18.91.2", + "via": "mm-fail90-1791557069795-a", + "area": "" + }, + { + "id": "*2014C000", + "serverId": 1, + "serverName": "CHR", + "serverSite": "", + "destination": "198.18.190.2/32", + "type": "Unknown", + "cost": null, + "nextHop": "198.18.91.2", + "via": "mm-fail90-1791557069795-a", + "area": "" + }, + { + "id": "*2014C000", + "serverId": 2, + "serverName": "CHR", + "serverSite": "", + "destination": "198.18.190.1/32", + "type": "Unknown", + "cost": null, + "nextHop": "198.18.91.1", + "via": "mm-fail90-1791557069795-a", + "area": "" + } + ], + "bfdSessions": [ + { + "id": "*1", + "serverId": 1, + "serverName": "CHR", + "serverSite": "", + "serverCountry": "", + "localAddr": "198.18.91.1", + "remoteAddr": "198.18.91.2", + "interface": "mm-fail90-1791557069795-a", + "state": "Up", + "uptime": "13s", + "multihop": false, + "multiplier": 3, + "txInterval": 200, + "rxInterval": 200, + "holdTime": 600, + "packetsRx": 77, + "packetsTx": 82, + "stateChanges": 1 + }, + { + "id": "*1", + "serverId": 2, + "serverName": "CHR", + "serverSite": "", + "serverCountry": "", + "localAddr": "198.18.91.2", + "remoteAddr": "198.18.91.1", + "interface": "mm-fail90-1791557069795-a", + "state": "Up", + "uptime": "13s", + "multihop": false, + "multiplier": 3, + "txInterval": 200, + "rxInterval": 200, + "holdTime": 600, + "packetsRx": 83, + "packetsTx": 79, + "stateChanges": 2 + } + ] + }, + "recovered": [ + { + "peers": [ + { + ".id": "*F3FDDC00", + "address": "198.18.90.2", + "adjacency": "6s", + "area": "mm-fail90-1791557069795", + "dynamic": "true", + "instance": "mm-fail90-1791557069795", + "interface": "mm-fail90-1791557069795-p", + "router-id": "198.18.190.2", + "state": "Full", + "state-changes": "4", + "timeout": "19s" + }, + { + ".id": "*F3FDDBD2", + "address": "198.18.91.2", + "adjacency": "50s", + "area": "mm-fail90-1791557069795", + "dynamic": "true", + "instance": "mm-fail90-1791557069795", + "interface": "mm-fail90-1791557069795-a", + "router-id": "198.18.190.2", + "state": "Full", + "state-changes": "5", + "timeout": "19s" + } + ], + "routes": [ + { + ".id": "*2014C000", + "active": "true", + "distance": "110", + "dst-address": "198.18.190.2/32", + "dynamic": "true", + "gateway": "198.18.90.2%mm-fail90-1791557069795-p", + "immediate-gw": "198.18.90.2%mm-fail90-1791557069795-p", + "inactive": "false", + "ospf": "true", + "routing-table": "main", + "scope": "20", + "target-scope": "10" + } + ], + "bfd": [ + { + ".id": "*1", + "actual-tx-interval": "200ms", + "desired-tx-interval": "200ms", + "hold-time": "600ms", + "local-address": "198.18.90.1%mm-fail90-1791557069795-p", + "multihop": "false", + "multiplier": "3", + "packets-rx": "28", + "packets-tx": "30", + "remote-address": "198.18.90.2%mm-fail90-1791557069795-p", + "remote-min-rx": "200ms", + "remote-min-tx": "200ms", + "required-min-rx": "200ms", + "state": "up", + "state-changes": "1", + "up": "true", + "uptime": "6s", + "vrf": "main" + }, + { + ".id": "*2", + "actual-tx-interval": "200ms", + "desired-tx-interval": "200ms", + "hold-time": "600ms", + "local-address": "198.18.91.1%mm-fail90-1791557069795-a", + "multihop": "false", + "multiplier": "3", + "packets-rx": "284", + "packets-tx": "287", + "remote-address": "198.18.91.2%mm-fail90-1791557069795-a", + "remote-min-rx": "200ms", + "remote-min-tx": "200ms", + "required-min-rx": "200ms", + "state": "up", + "state-changes": "1", + "up": "true", + "uptime": "49s", + "vrf": "main" + } + ] + }, + { + "peers": [ + { + ".id": "*F3FDDC00", + "address": "198.18.90.1", + "adjacency": "6s", + "area": "mm-fail90-1791557069795", + "dynamic": "true", + "instance": "mm-fail90-1791557069795", + "interface": "mm-fail90-1791557069795-p", + "router-id": "198.18.190.1", + "state": "Full", + "state-changes": "5", + "timeout": "19s" + }, + { + ".id": "*F3FDDBD2", + "address": "198.18.91.1", + "adjacency": "50s", + "area": "mm-fail90-1791557069795", + "dynamic": "true", + "instance": "mm-fail90-1791557069795", + "interface": "mm-fail90-1791557069795-a", + "router-id": "198.18.190.1", + "state": "Full", + "state-changes": "5", + "timeout": "19s" + } + ], + "routes": [ + { + ".id": "*2014C000", + "active": "true", + "distance": "110", + "dst-address": "198.18.190.1/32", + "dynamic": "true", + "gateway": "198.18.90.1%mm-fail90-1791557069795-p", + "immediate-gw": "198.18.90.1%mm-fail90-1791557069795-p", + "inactive": "false", + "ospf": "true", + "routing-table": "main", + "scope": "20", + "target-scope": "10" + } + ], + "bfd": [ + { + ".id": "*1", + "actual-tx-interval": "200ms", + "desired-tx-interval": "200ms", + "hold-time": "600ms", + "local-address": "198.18.90.2%mm-fail90-1791557069795-p", + "multihop": "false", + "multiplier": "3", + "packets-rx": "30", + "packets-tx": "29", + "remote-address": "198.18.90.1%mm-fail90-1791557069795-p", + "remote-min-rx": "200ms", + "remote-min-tx": "200ms", + "required-min-rx": "200ms", + "state": "up", + "state-changes": "2", + "up": "true", + "uptime": "5s", + "vrf": "main" + }, + { + ".id": "*2", + "actual-tx-interval": "200ms", + "desired-tx-interval": "200ms", + "hold-time": "600ms", + "local-address": "198.18.91.2%mm-fail90-1791557069795-a", + "multihop": "false", + "multiplier": "3", + "packets-rx": "287", + "packets-tx": "286", + "remote-address": "198.18.91.1%mm-fail90-1791557069795-a", + "remote-min-rx": "200ms", + "remote-min-tx": "200ms", + "required-min-rx": "200ms", + "state": "up", + "state-changes": "2", + "up": "true", + "uptime": "49s", + "vrf": "main" + } + ] + } + ], + "error": "Expected values to be strictly equal:\n\n2 !== 3\n" + }, + "sameOuterEndpointAttempt": { + "error": "OSPF/BFD/path readiness not reached for mm-fail90-1791556662345-p", + "cleanup": [ + { + "serverId": 1, + "/routing/ospf/interface-template": true, + "/routing/ospf/area": true, + "/routing/ospf/instance": true, + "/routing/bfd/configuration": true, + "/interface/gre": true, + "/interface/bridge": true, + "/ip/address": true, + "/ip/route": true + }, + { + "serverId": 2, + "/routing/ospf/interface-template": true, + "/routing/ospf/area": true, + "/routing/ospf/instance": true, + "/routing/bfd/configuration": true, + "/interface/gre": true, + "/interface/bridge": true, + "/ip/address": true, + "/ip/route": true + } + ] + }, + "measurementNotes": [ + "Packet phase 40 probes includes real 18 replies and55% loss. Concurrent RouterOS REST ping delayed status response;7648ms is not BFD event timing.", + "Control phase has no long-running ping during status sampling. Times are first HTTP observation bounds, not exact event timestamps/SLA.", + "Two GRE paths share public WAN. Alternate GRE uses own WireGuard underlay with distinct private outer addresses.", + "Private keys were generated natively and never saved in this report." + ], + "runtime": { + "backend": "ux-diagnostics89", + "frontend": "ux-optimizer87", + "buildsPerformed": 0 + } +} \ No newline at end of file diff --git a/docs/ux-ui/screens/ospf-real-failover-server1-1280-2026-10-09.png b/docs/ux-ui/screens/ospf-real-failover-server1-1280-2026-10-09.png new file mode 100644 index 00000000..a0a3ab9d Binary files /dev/null and b/docs/ux-ui/screens/ospf-real-failover-server1-1280-2026-10-09.png differ diff --git a/docs/ux-ui/screens/ospf-real-failover-server1-320-2026-10-09.png b/docs/ux-ui/screens/ospf-real-failover-server1-320-2026-10-09.png new file mode 100644 index 00000000..9cec1c9f Binary files /dev/null and b/docs/ux-ui/screens/ospf-real-failover-server1-320-2026-10-09.png differ diff --git a/docs/ux-ui/screens/ospf-real-failover-server2-1280-2026-10-09.png b/docs/ux-ui/screens/ospf-real-failover-server2-1280-2026-10-09.png new file mode 100644 index 00000000..1ed91413 Binary files /dev/null and b/docs/ux-ui/screens/ospf-real-failover-server2-1280-2026-10-09.png differ diff --git a/docs/ux-ui/screens/ospf-real-failover-server2-320-2026-10-09.png b/docs/ux-ui/screens/ospf-real-failover-server2-320-2026-10-09.png new file mode 100644 index 00000000..6efdb9d9 Binary files /dev/null and b/docs/ux-ui/screens/ospf-real-failover-server2-320-2026-10-09.png differ