diff --git a/docs/ux-ui-external-acceptance.md b/docs/ux-ui-external-acceptance.md index c613c7ce..56f13f89 100644 --- a/docs/ux-ui-external-acceptance.md +++ b/docs/ux-ui-external-acceptance.md @@ -16,6 +16,8 @@ Routing83: disabled BGP/OSPF selected/raw409/probe0 и собственная eB OSPF84: real GRE Full adjacency/private routes/Ping3/3 и4 live PC/320px URL/browser checks приняты. Exact own cleanup и исходные7 коллекций×2 passed; runtime routing83 без новой сборки. [Отчёт](ux-ui/acceptance/ospf-gre-2026-10-09.json). +BFD85: Up/Full/own route/Ping,4 live UI и loss/withdrawal/recovery приняты; exact own cleanup8 коллекций×2 passed. Withdrawal5,245ms не подтверждает sub-second BFD timing; этот вопрос открыт. Runtime routing83 без новой сборки. [Отчёт](ux-ui/acceptance/ospf-bfd-loss-2026-10-09.json). + ## Паспорт стенда Перед внешним запуском зафиксировать отдельные PostgreSQL и RouterOS тестовые устройства, версии server/client PostgreSQL и RouterOS, HEAD backend/frontend, роли пользователей, число экземпляров backend/планировщика/отправителей и способ их остановки. Для Telegram использовать тестовый чат, для остальных интеграций — тестовые endpoints и учётные записи. Зафиксировать ожидаемые изменения и способ восстановления стенда. diff --git a/docs/ux-ui-plan.md b/docs/ux-ui-plan.md index cd515b37..6ea781b8 100644 --- a/docs/ux-ui-plan.md +++ b/docs/ux-ui-plan.md @@ -1,6 +1,6 @@ # План реализации UX/UI по пятичасовым окнам -Актуальное продолжение 2026-10-09: 12.5.84 принял реальную OSPFv2 Full adjacency и частные loopback routes через собственный GRE, Ping3/3 в обе стороны и4 live browser PC/320px URL-сценария. Все собственные объекты удалены, baseline7 коллекций×2 восстановлен. Runtime backend ux-routing83/frontend ux-ipsec77, без новой сборки. Следующий12.5.85 — BFD на собственной OSPF/GRE паре; этап12.5 открыт. +Актуальное продолжение 2026-10-09: 12.5.85 принял BFD Up на своей OSPF/GRE паре,4 live PC/320px UI checks и loss/withdrawal/recovery. Exact baseline8 коллекций×2 восстановлен. Наблюдение route withdrawal5,245ms не доказывает sub-second detection; timing/failover остаются открытыми. Runtime backend ux-routing83/frontend ux-ipsec77. Следующий12.5.86 — точный разбор BFD/OSPF/SPF timing и оставшиеся optimizer/recursive diagnostics по плану. Квота контрольной точки96%, работа остановлена после сохранения результата; этап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 4620ac1e..67bed056 100644 --- a/docs/ux-ui-progress.md +++ b/docs/ux-ui-progress.md @@ -1,6 +1,6 @@ # UX/UI: журнал реализации -Актуальное продолжение 2026-10-09: 12.5.84 принял реальную OSPFv2 Full adjacency и частные loopback routes через собственный GRE, Ping3/3 в обе стороны и4 live browser PC/320px URL-сценария. Все собственные объекты удалены, baseline7 коллекций×2 восстановлен. Runtime backend ux-routing83/frontend ux-ipsec77, без новой сборки. Следующий12.5.85 — BFD на собственной OSPF/GRE паре; этап12.5 открыт. +Актуальное продолжение 2026-10-09: 12.5.85 принял BFD Up на своей OSPF/GRE паре,4 live PC/320px UI checks и loss/withdrawal/recovery. Exact baseline8 коллекций×2 восстановлен. Наблюдение route withdrawal5,245ms не доказывает sub-second detection; timing/failover остаются открытыми. Runtime backend ux-routing83/frontend ux-ipsec77. Следующий12.5.86 — точный разбор BFD/OSPF/SPF timing и оставшиеся optimizer/recursive diagnostics по плану. Квота контрольной точки96%, работа остановлена после сохранения результата; этап12.5 открыт. Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения. Записи расположены от новых к старым; подробная история этапа12 также сохранена в [ux-ui-stage-12.md](ux-ui-stage-12.md). @@ -36,7 +36,23 @@ | 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–84 и ограничения ниже. Runtime backend ux-routing83/frontend ux-ipsec77. | +| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка завершена в границах12.3.83; внешняя12.5 в работе, выполненные блоки1–85 и ограничения ниже. Runtime backend ux-routing83/frontend ux-ipsec77. | + +## 12.5.85 — BFD: реальные Up, потеря GRE и восстановление (2026-10-09) + +**Конфигурация.** Собственная GRE/OSPFv2 пара по шаблону84, link198.18.85.1/30↔2/30, loopback198.18.185.1/32↔2/32. Свои BFD configurations только для точного GRE и private subnet, min-rx/min-tx200ms/multiplier3; OSPF GRE template use-bfd=yes. Public/default routes/interfaces и foreign BFD config не менялись, default originate/redistribution не включались. + +**Native/API.** BFD state up, multihop=false, multiplier3 и packets-rx/tx растут на обоих CHR. Main catalog Up, интервалы/hold поля200/200/600ms и counters корректны; RX minimum — требуемый minimum, не измерение межпакетного времени. OSPF Full, own loopback route active, Ping3/3 в обе стороны. [Up отчёт](ux-ui/acceptance/ospf-bfd-2026-10-09.json). + +**Браузер.** Настоящий backend/frontend, Headless Edge, два устройства×1280/320:4/4 без pageerror. BFD/private peer DOM и selected button/URL, learned route и reload context проверены, document fits. Для BFD table screenshot выполнена внутренняя прокрутка к peer; просмотр mobile подтвердил видимую таблицу/Up и объяснение TX fact/RX minimum. [Browser отчёт](ux-ui/acceptance/browser-ospf-bfd-2026-10-09.json), экраны ospf-real-bfd-server1/2-1280/320-2026-10-09.png. + +**Loss/recovery.** Повторная собственная пара без browser wait: временно отключён только свой GRE наCHR1. НаCHR2 нет BFD Up/OSPF Full, remote private route больше не active; API согласован. Включение GRE восстановило Full и active route. Первая проверка требовала постоянную строку Down и отказалась: dynamic session удаляется после потери OSPF пользователя. Критерий исправлен на отсутствие Up + отсутствие Full + withdrawal, исчезновение записи не выдаётся за наблюдённый Down. [Loss/recovery отчёт](ux-ui/acceptance/ospf-bfd-loss-2026-10-09.json). + +HTTP sampling показал withdrawal за5245ms при OSPF dead interval4000ms; beforeDeadInterval=false. Это включает RPC/SPF/convergence и не подтверждает sub-second detection или преимущество перед Hello/Dead. Причину/latency требуется разбирать отдельно по событиям и SPF timing, не обещать BFD performance по nominal600ms hold. Alternate-path failover не тестировался. + +**Очистка и фиксация.** На каждом run exact returned ID и name/comment/address/interface/interfaces сверены до удаления. OSPF templates/areas/instances, own BFD config/IP/bridge/GRE удалены; затем bounded route convergence и исходные IDs8 коллекций×2 совпали. Loss run тоже cleanup passed/error=null. Credentials прежние;195.195.195.195/32/default routes сохранены. Production backend routing83/PG healthy, frontend ipsec77 Up; временных контейнеров/fixture DB записей не осталось. UI/source/dependencies не менялись, сборки/миграции не запускались. Один локальный commit без push. + +Продолжение86: проверить раздельно BFD event и SPF withdrawal timing, затем профильные optimizer/recursive diagnostics, routing failover/масштаб в согласованных границах. Сохраняются Portal SSO/browser auth, multi-instance/physical disconnect/durable retry, client OS/IPv6/сложные DN/maximum throughput/полный PKI-policy restore ограничения82. Контрольная квота96%, дальнейшие mutations в этом окне не начинать. [MikroTik BFD](https://help.mikrotik.com/docs/spaces/ROS/pages/191299691/BFD) подтверждает отдельную configuration и use-bfd; acceptance основана на настоящем API и native состояниях. ## 12.5.84 — OSPF: Full adjacency, GRE и реальная таблица (2026-10-09) diff --git a/docs/ux-ui-stage-12.md b/docs/ux-ui-stage-12.md index 3e3a3089..a32960e3 100644 --- a/docs/ux-ui-stage-12.md +++ b/docs/ux-ui-stage-12.md @@ -1996,3 +1996,19 @@ flowchart LR **Очистка.** Exact receipt ID/name/comment/address/interface проверены до удаления. Templates→areas→instances, свои IP/bridge/GRE удалены; контроль обеих сторон после удаления всей пары и bounded route convergence. Исходные ID7 коллекций×2 совпали, адрес195.195.195.195/32 и public/default routes сохранены. Credentials не менялись. Сборок/миграций/смены runtime не было; backend ux-routing83/version1.0.0-test.routing83 healthy, frontend ux-ipsec77. Один локальный commit без push, только evidence/docs. Следующий85 — разрешение BFD только на своих GRE/private peers и Up/control-plane checks. Не приняты BFD/failover/optimizer/масштаб/IPv6 и остальные внешние границы. Механика instance/area/template подтверждена [MikroTik OSPF](https://help.mikrotik.com/docs/spaces/ROS/pages/9863229/OSPF); таблицы/Frame сохраняют общие референсы плана. + +## 12.5.85 — BFD: реальные Up, потеря GRE и восстановление (2026-10-09) + +**Конфигурация.** Собственная GRE/OSPFv2 пара по шаблону84, link198.18.85.1/30↔2/30, loopback198.18.185.1/32↔2/32. Свои BFD configurations только для точного GRE и private subnet, min-rx/min-tx200ms/multiplier3; OSPF GRE template use-bfd=yes. Public/default routes/interfaces и foreign BFD config не менялись, default originate/redistribution не включались. + +**Native/API.** BFD state up, multihop=false, multiplier3 и packets-rx/tx растут на обоих CHR. Main catalog Up, интервалы/hold поля200/200/600ms и counters корректны; RX minimum — требуемый minimum, не измерение межпакетного времени. OSPF Full, own loopback route active, Ping3/3 в обе стороны. [Up отчёт](ux-ui/acceptance/ospf-bfd-2026-10-09.json). + +**Браузер.** Настоящий backend/frontend, Headless Edge, два устройства×1280/320:4/4 без pageerror. BFD/private peer DOM и selected button/URL, learned route и reload context проверены, document fits. Для BFD table screenshot выполнена внутренняя прокрутка к peer; просмотр mobile подтвердил видимую таблицу/Up и объяснение TX fact/RX minimum. [Browser отчёт](ux-ui/acceptance/browser-ospf-bfd-2026-10-09.json), экраны ospf-real-bfd-server1/2-1280/320-2026-10-09.png. + +**Loss/recovery.** Повторная собственная пара без browser wait: временно отключён только свой GRE наCHR1. НаCHR2 нет BFD Up/OSPF Full, remote private route больше не active; API согласован. Включение GRE восстановило Full и active route. Первая проверка требовала постоянную строку Down и отказалась: dynamic session удаляется после потери OSPF пользователя. Критерий исправлен на отсутствие Up + отсутствие Full + withdrawal, исчезновение записи не выдаётся за наблюдённый Down. [Loss/recovery отчёт](ux-ui/acceptance/ospf-bfd-loss-2026-10-09.json). + +HTTP sampling показал withdrawal за5245ms при OSPF dead interval4000ms; beforeDeadInterval=false. Это включает RPC/SPF/convergence и не подтверждает sub-second detection или преимущество перед Hello/Dead. Причину/latency требуется разбирать отдельно по событиям и SPF timing, не обещать BFD performance по nominal600ms hold. Alternate-path failover не тестировался. + +**Очистка и фиксация.** На каждом run exact returned ID и name/comment/address/interface/interfaces сверены до удаления. OSPF templates/areas/instances, own BFD config/IP/bridge/GRE удалены; затем bounded route convergence и исходные IDs8 коллекций×2 совпали. Loss run тоже cleanup passed/error=null. Credentials прежние;195.195.195.195/32/default routes сохранены. Production backend routing83/PG healthy, frontend ipsec77 Up; временных контейнеров/fixture DB записей не осталось. UI/source/dependencies не менялись, сборки/миграции не запускались. Один локальный commit без push. + +Продолжение86: проверить раздельно BFD event и SPF withdrawal timing, затем профильные optimizer/recursive diagnostics, routing failover/масштаб в согласованных границах. Сохраняются Portal SSO/browser auth, multi-instance/physical disconnect/durable retry, client OS/IPv6/сложные DN/maximum throughput/полный PKI-policy restore ограничения82. Контрольная квота96%, дальнейшие mutations в этом окне не начинать. [MikroTik BFD](https://help.mikrotik.com/docs/spaces/ROS/pages/191299691/BFD) подтверждает отдельную configuration и use-bfd; acceptance основана на настоящем API и native состояниях. diff --git a/docs/ux-ui-test-server.md b/docs/ux-ui-test-server.md index 9d4fff6f..eabe6998 100644 --- a/docs/ux-ui-test-server.md +++ b/docs/ux-ui-test-server.md @@ -32,6 +32,8 @@ Routing83: disabled BGP/OSPF selected/raw409/probe0 и собственная eB OSPF84: real GRE Full adjacency/private routes/Ping3/3 и4 live PC/320px URL/browser checks приняты. Exact own cleanup и исходные7 коллекций×2 passed; runtime routing83 без новой сборки. [Отчёт](ux-ui/acceptance/ospf-gre-2026-10-09.json). +BFD85: Up/Full/own route/Ping,4 live UI и loss/withdrawal/recovery приняты; exact own cleanup8 коллекций×2 passed. Withdrawal5,245ms не подтверждает sub-second BFD timing; этот вопрос открыт. Runtime routing83 без новой сборки. [Отчёт](ux-ui/acceptance/ospf-bfd-loss-2026-10-09.json). + ## Развёртывание приложения Чистые frontend/backend build contexts подготовлены по .gitea/workflows/docker.yml из закреплённого Git HEAD;образы собраны на сервере без push. Локально docker CLI сейчас отсутствует, на сервере доступен Docker. В корневом .dockerignore исключён backend, поэтому обычный backend build из корня не повторяет CI: использовать отдельный backend context, как main workflow. Не передавать .env.local,backend/.env,ключи и локальные node_modules/.next. diff --git a/docs/ux-ui/acceptance/browser-ospf-bfd-2026-10-09.json b/docs/ux-ui/acceptance/browser-ospf-bfd-2026-10-09.json new file mode 100644 index 00000000..37efb51f --- /dev/null +++ b/docs/ux-ui/acceptance/browser-ospf-bfd-2026-10-09.json @@ -0,0 +1,39 @@ +{ + "date": "2026-10-09", + "phase": "2 320", + "cases": [ + { + "serverId": 1, + "width": 1280, + "neighborVisible": true, + "learnedRouteVisible": true, + "urlRestore": true, + "documentFits": true + }, + { + "serverId": 1, + "width": 320, + "neighborVisible": true, + "learnedRouteVisible": true, + "urlRestore": true, + "documentFits": true + }, + { + "serverId": 2, + "width": 1280, + "neighborVisible": true, + "learnedRouteVisible": true, + "urlRestore": true, + "documentFits": true + }, + { + "serverId": 2, + "width": 320, + "neighborVisible": true, + "learnedRouteVisible": true, + "urlRestore": true, + "documentFits": true + } + ], + "errors": [] +} \ No newline at end of file diff --git a/docs/ux-ui/acceptance/ospf-bfd-2026-10-09.json b/docs/ux-ui/acceptance/ospf-bfd-2026-10-09.json new file mode 100644 index 00000000..6a0744be --- /dev/null +++ b/docs/ux-ui/acceptance/ospf-bfd-2026-10-09.json @@ -0,0 +1,247 @@ +{ + "date": "2026-10-09", + "name": "mm-ospf85-1791542472111", + "observations": [ + { + "serverId": 1, + "nativeNeighbor": { + ".id": "*F3FDDC00", + "router-id": "198.18.185.2", + "address": "198.18.85.2", + "interface": "mm-ospf85-1791542472111", + "state": "Full", + "state-changes": "6" + }, + "nativeRoute": { + ".id": "*2014C000", + "dst-address": "198.18.185.2/32", + "gateway": "198.18.85.2%mm-ospf85-1791542472111", + "ospf": "true", + "active": "true", + "distance": "110" + }, + "catalogNeighbors": [ + { + "id": "*F3FDDC00", + "serverId": 1, + "serverName": "CHR", + "serverSite": "", + "serverCountry": "", + "address": "198.18.85.2", + "routerId": "198.18.185.2", + "instance": "mm-ospf85-1791542472111", + "area": "mm-ospf85-1791542472111", + "areaId": "0.0.0.0", + "interface": "mm-ospf85-1791542472111", + "state": "Full", + "uptime": "3s", + "stateChanges": 6, + "priority": null + } + ], + "catalogRoutes": [ + { + "id": "*2014C000", + "serverId": 1, + "serverName": "CHR", + "serverSite": "", + "destination": "198.18.185.2/32", + "type": "Unknown", + "cost": null, + "nextHop": "198.18.85.2", + "via": "mm-ospf85-1791542472111", + "area": "" + } + ], + "pingReceived": 3 + }, + { + "serverId": 2, + "nativeNeighbor": { + ".id": "*F3FDDC00", + "router-id": "198.18.185.1", + "address": "198.18.85.1", + "interface": "mm-ospf85-1791542472111", + "state": "Full", + "state-changes": "5" + }, + "nativeRoute": { + ".id": "*2014C000", + "dst-address": "198.18.185.1/32", + "gateway": "198.18.85.1%mm-ospf85-1791542472111", + "ospf": "true", + "active": "true", + "distance": "110" + }, + "catalogNeighbors": [ + { + "id": "*F3FDDC00", + "serverId": 2, + "serverName": "CHR", + "serverSite": "", + "serverCountry": "", + "address": "198.18.85.1", + "routerId": "198.18.185.1", + "instance": "mm-ospf85-1791542472111", + "area": "mm-ospf85-1791542472111", + "areaId": "0.0.0.0", + "interface": "mm-ospf85-1791542472111", + "state": "Full", + "uptime": "3s", + "stateChanges": 5, + "priority": null + } + ], + "catalogRoutes": [ + { + "id": "*2014C000", + "serverId": 2, + "serverName": "CHR", + "serverSite": "", + "destination": "198.18.185.1/32", + "type": "Unknown", + "cost": null, + "nextHop": "198.18.85.1", + "via": "mm-ospf85-1791542472111", + "area": "" + } + ], + "pingReceived": 3 + } + ], + "cleanup": [ + { + "serverId": 1, + "/routing/bfd/configuration": true, + "/routing/ospf/interface-template": true, + "/routing/ospf/area": true, + "/routing/ospf/instance": true, + "/interface/gre": true, + "/interface/bridge": true, + "/ip/address": true, + "/ip/route": true + }, + { + "serverId": 2, + "/routing/bfd/configuration": true, + "/routing/ospf/interface-template": true, + "/routing/ospf/area": true, + "/routing/ospf/instance": true, + "/interface/gre": true, + "/interface/bridge": true, + "/ip/address": true, + "/ip/route": true + } + ], + "currentRoutes": [ + { + ".id": "*20145050", + "dst-address": "198.18.85.0/30", + "gateway": "mm-ospf85-1791542472111", + "active": "true", + "distance": "0", + "routing-table": "main" + }, + { + ".id": "*2014C000", + "dst-address": "198.18.185.1/32", + "gateway": "198.18.85.1%mm-ospf85-1791542472111", + "active": "true", + "ospf": "true", + "distance": "110", + "routing-table": "main" + }, + { + ".id": "*20145060", + "dst-address": "198.18.185.2/32", + "gateway": "mm-ospf85-1791542472111-loop", + "active": "true", + "distance": "0", + "routing-table": "main" + } + ], + "bfd": [ + { + "serverId": 1, + "native": [ + { + ".id": "*1", + "state": "up", + "remote-address": "198.18.85.2%mm-ospf85-1791542472111", + "local-address": "198.18.85.1%mm-ospf85-1791542472111", + "desired-tx-interval": "200ms", + "required-min-rx": "200ms", + "remote-min-rx": "200ms", + "multiplier": "3", + "packets-rx": "20", + "packets-tx": "18", + "state-changes": "2", + "multihop": "false" + } + ], + "catalog": [ + { + "id": "*1", + "serverId": 1, + "serverName": "CHR", + "serverSite": "", + "serverCountry": "", + "localAddr": "198.18.85.1", + "remoteAddr": "198.18.85.2", + "interface": "mm-ospf85-1791542472111", + "state": "Up", + "uptime": "2s", + "multihop": false, + "multiplier": 3, + "txInterval": 200, + "rxInterval": 200, + "holdTime": 600, + "packetsRx": 17, + "packetsTx": 14, + "stateChanges": 2 + } + ] + }, + { + "serverId": 2, + "native": [ + { + ".id": "*1", + "state": "up", + "remote-address": "198.18.85.1%mm-ospf85-1791542472111", + "local-address": "198.18.85.2%mm-ospf85-1791542472111", + "desired-tx-interval": "200ms", + "required-min-rx": "200ms", + "remote-min-rx": "200ms", + "multiplier": "3", + "packets-rx": "20", + "packets-tx": "25", + "state-changes": "1", + "multihop": "false" + } + ], + "catalog": [ + { + "id": "*1", + "serverId": 2, + "serverName": "CHR", + "serverSite": "", + "serverCountry": "", + "localAddr": "198.18.85.2", + "remoteAddr": "198.18.85.1", + "interface": "mm-ospf85-1791542472111", + "state": "Up", + "uptime": "3s", + "multihop": false, + "multiplier": 3, + "txInterval": 200, + "rxInterval": 200, + "holdTime": 600, + "packetsRx": 12, + "packetsTx": 17, + "stateChanges": 1 + } + ] + } + ] +} \ No newline at end of file diff --git a/docs/ux-ui/acceptance/ospf-bfd-loss-2026-10-09.json b/docs/ux-ui/acceptance/ospf-bfd-loss-2026-10-09.json new file mode 100644 index 00000000..abb2d547 --- /dev/null +++ b/docs/ux-ui/acceptance/ospf-bfd-loss-2026-10-09.json @@ -0,0 +1,258 @@ +{ + "date": "2026-10-09", + "name": "mm-ospf85-1791543377687", + "observations": [ + { + "serverId": 1, + "nativeNeighbor": { + ".id": "*F3FDDC00", + "router-id": "198.18.185.2", + "address": "198.18.85.2", + "interface": "mm-ospf85-1791543377687", + "state": "Full", + "state-changes": "6" + }, + "nativeRoute": { + ".id": "*2014C000", + "dst-address": "198.18.185.2/32", + "gateway": "198.18.85.2%mm-ospf85-1791543377687", + "ospf": "true", + "active": "true", + "distance": "110" + }, + "catalogNeighbors": [ + { + "id": "*F3FDDC00", + "serverId": 1, + "serverName": "CHR", + "serverSite": "", + "serverCountry": "", + "address": "198.18.85.2", + "routerId": "198.18.185.2", + "instance": "mm-ospf85-1791543377687", + "area": "mm-ospf85-1791543377687", + "areaId": "0.0.0.0", + "interface": "mm-ospf85-1791543377687", + "state": "Full", + "uptime": "3s", + "stateChanges": 6, + "priority": null + } + ], + "catalogRoutes": [ + { + "id": "*2014C000", + "serverId": 1, + "serverName": "CHR", + "serverSite": "", + "destination": "198.18.185.2/32", + "type": "Unknown", + "cost": null, + "nextHop": "198.18.85.2", + "via": "mm-ospf85-1791543377687", + "area": "" + } + ], + "pingReceived": 3 + }, + { + "serverId": 2, + "nativeNeighbor": { + ".id": "*F3FDDC00", + "router-id": "198.18.185.1", + "address": "198.18.85.1", + "interface": "mm-ospf85-1791543377687", + "state": "Full", + "state-changes": "5" + }, + "nativeRoute": { + ".id": "*2014C000", + "dst-address": "198.18.185.1/32", + "gateway": "198.18.85.1%mm-ospf85-1791543377687", + "ospf": "true", + "active": "true", + "distance": "110" + }, + "catalogNeighbors": [ + { + "id": "*F3FDDC00", + "serverId": 2, + "serverName": "CHR", + "serverSite": "", + "serverCountry": "", + "address": "198.18.85.1", + "routerId": "198.18.185.1", + "instance": "mm-ospf85-1791543377687", + "area": "mm-ospf85-1791543377687", + "areaId": "0.0.0.0", + "interface": "mm-ospf85-1791543377687", + "state": "Full", + "uptime": "3s", + "stateChanges": 5, + "priority": null + } + ], + "catalogRoutes": [ + { + "id": "*2014C000", + "serverId": 2, + "serverName": "CHR", + "serverSite": "", + "destination": "198.18.185.1/32", + "type": "Unknown", + "cost": null, + "nextHop": "198.18.85.1", + "via": "mm-ospf85-1791543377687", + "area": "" + } + ], + "pingReceived": 3 + } + ], + "cleanup": [ + { + "serverId": 1, + "/routing/bfd/configuration": true, + "/routing/ospf/interface-template": true, + "/routing/ospf/area": true, + "/routing/ospf/instance": true, + "/interface/gre": true, + "/interface/bridge": true, + "/ip/address": true, + "/ip/route": true + }, + { + "serverId": 2, + "/routing/bfd/configuration": true, + "/routing/ospf/interface-template": true, + "/routing/ospf/area": true, + "/routing/ospf/instance": true, + "/interface/gre": true, + "/interface/bridge": true, + "/ip/address": true, + "/ip/route": true + } + ], + "currentRoutes": [ + { + ".id": "*20145050", + "dst-address": "198.18.85.0/30", + "gateway": "mm-ospf85-1791543377687", + "active": "true", + "distance": "0", + "routing-table": "main" + }, + { + ".id": "*2014C000", + "dst-address": "198.18.185.1/32", + "gateway": "198.18.85.1%mm-ospf85-1791543377687", + "active": "true", + "ospf": "true", + "distance": "110", + "routing-table": "main" + }, + { + ".id": "*20145060", + "dst-address": "198.18.185.2/32", + "gateway": "mm-ospf85-1791543377687-loop", + "active": "true", + "distance": "0", + "routing-table": "main" + } + ], + "bfd": [ + { + "serverId": 1, + "native": [ + { + ".id": "*1", + "state": "up", + "remote-address": "198.18.85.2%mm-ospf85-1791543377687", + "local-address": "198.18.85.1%mm-ospf85-1791543377687", + "desired-tx-interval": "200ms", + "required-min-rx": "200ms", + "remote-min-rx": "200ms", + "multiplier": "3", + "packets-rx": "17", + "packets-tx": "16", + "state-changes": "2", + "multihop": "false" + } + ], + "catalog": [ + { + "id": "*1", + "serverId": 1, + "serverName": "CHR", + "serverSite": "", + "serverCountry": "", + "localAddr": "198.18.85.1", + "remoteAddr": "198.18.85.2", + "interface": "mm-ospf85-1791543377687", + "state": "Up", + "uptime": "2s", + "multihop": false, + "multiplier": 3, + "txInterval": 200, + "rxInterval": 200, + "holdTime": 600, + "packetsRx": 13, + "packetsTx": 12, + "stateChanges": 2 + } + ] + }, + { + "serverId": 2, + "native": [ + { + ".id": "*1", + "state": "up", + "remote-address": "198.18.85.1%mm-ospf85-1791543377687", + "local-address": "198.18.85.2%mm-ospf85-1791543377687", + "desired-tx-interval": "200ms", + "required-min-rx": "200ms", + "remote-min-rx": "200ms", + "multiplier": "3", + "packets-rx": "19", + "packets-tx": "22", + "state-changes": "1", + "multihop": "false" + } + ], + "catalog": [ + { + "id": "*1", + "serverId": 2, + "serverName": "CHR", + "serverSite": "", + "serverCountry": "", + "localAddr": "198.18.85.2", + "remoteAddr": "198.18.85.1", + "interface": "mm-ospf85-1791543377687", + "state": "Up", + "uptime": "3s", + "multihop": false, + "multiplier": 3, + "txInterval": 200, + "rxInterval": 200, + "holdTime": 600, + "packetsRx": 12, + "packetsTx": 13, + "stateChanges": 1 + } + ] + } + ], + "failureDetection": { + "ownedGreDisabled": true, + "peerBfdNotUp": true, + "privateRouteWithdrawn": true, + "elapsedMs": 5245, + "deadIntervalMs": 4000, + "apiNotUp": true, + "apiNeighborNotFull": true, + "beforeDeadInterval": false, + "fullAndRouteRecovered": true + } +} \ No newline at end of file diff --git a/docs/ux-ui/screens/ospf-real-bfd-server1-1280-2026-10-09.png b/docs/ux-ui/screens/ospf-real-bfd-server1-1280-2026-10-09.png new file mode 100644 index 00000000..962ab95e Binary files /dev/null and b/docs/ux-ui/screens/ospf-real-bfd-server1-1280-2026-10-09.png differ diff --git a/docs/ux-ui/screens/ospf-real-bfd-server1-320-2026-10-09.png b/docs/ux-ui/screens/ospf-real-bfd-server1-320-2026-10-09.png new file mode 100644 index 00000000..57bc4d72 Binary files /dev/null and b/docs/ux-ui/screens/ospf-real-bfd-server1-320-2026-10-09.png differ diff --git a/docs/ux-ui/screens/ospf-real-bfd-server2-1280-2026-10-09.png b/docs/ux-ui/screens/ospf-real-bfd-server2-1280-2026-10-09.png new file mode 100644 index 00000000..0f1be3be Binary files /dev/null and b/docs/ux-ui/screens/ospf-real-bfd-server2-1280-2026-10-09.png differ diff --git a/docs/ux-ui/screens/ospf-real-bfd-server2-320-2026-10-09.png b/docs/ux-ui/screens/ospf-real-bfd-server2-320-2026-10-09.png new file mode 100644 index 00000000..4917a67e Binary files /dev/null and b/docs/ux-ui/screens/ospf-real-bfd-server2-320-2026-10-09.png differ