diff --git a/docs/ux-ui-external-acceptance.md b/docs/ux-ui-external-acceptance.md index 2d5420ff..3dd54b08 100644 --- a/docs/ux-ui-external-acceptance.md +++ b/docs/ux-ui-external-acceptance.md @@ -847,3 +847,26 @@ Production image не содержит dev-only jose: первый fixture impor **Контроль/runtime.** Свои objects удалены по exact IDs/атрибутам, baseline7 коллекций×2 совпал, оба CHR доступны, default/public/195.195.195.195/32 и credentials сохранены. Нормализованные SHA source/deployed DataGrid renderer и OSPF consumer совпадали до изменения, поэтому проблема не была вызвана отставшим компонентом стенда. Один frontend Docker build, production TypeScript/build, entry/node --check/compose --wait passed. mmapp-test/frontend:ux-ospf91/version1.0.0-test.ospf91, image sha256:b4bade515234115b3cad257ceb87ef7beb347e754ca92d6a97a25adc2199fd33. Context optimizer87 frontend +один consumer file, override SHA27a27569335c377bf8662fb5b39d200ce98d52925cafdf51dee165464c1532078, label не Git SHA. .env backup приватный, backend/migrations не менялись, полная регрессия/failover не повторялись. Один локальный commit без push. Следующий92 — BGP propagation собственных private prefixes, withdrawal/re-advertisement и UI counters; только собственные GRE/instances/filter chains. Квота84% использовано после блока, этап12.5 и внешние границы остаются открытыми. + +## 12.5.92 — BGP: собственный префикс, отзыв и повторное объявление (2026-10-09) + +**Сценарий.** Свой GRE/link198.18.92.0/30 и bridge loopbacks198.18.192.1/32↔2/32, private AS65092/65093, explicit BGP instances/router IDs и direct eBGP connections. Address list output.network содержит только собственный loopback /32. Отдельные input/output chains принимают только соответствующий exact /32 по dst/dst-len и отклоняют остальное. Default-originate=never, network-blackhole=no, public/default/metadata prefixes не экспортировались. + +| Проверка | Результат | +| --- | --- | +| Established / маршрут | Обе сессии Established; ровно1 learned BGP route на узле, active | +| Data plane | Собственные loopbacks Ping3/3 в обе стороны | +| Production API | Selected/catalog Established, prefixesRx1; неизвестные counters не заменены нулём | +| Отзыв | Отключение своей connection наCHR1 убрало active private route наCHR2 | +| Повторное объявление | Включение connection вернуло Established/active own prefix/API Rx1 | +| UI | 4/4 два CHR×1280/320: received1, Router ID, details/reload, document fits/pageerror0 | + +**Доказательства.** [Native/API протокол](ux-ui/acceptance/bgp-prefix-2026-10-09.json). Withdrawal впервые наблюдался340,8ms после acknowledgement административного disable. Это не hold-timer/BFD detection или loss-based failover/SLA. Public routing не менялся; peer TCP179 проходит только через собственный GRE. Input принимает только remote loopback, output только local loopback, что проверено также отсутствием других BGP routes. + +[Browser отчёт](ux-ui/acceptance/browser-bgp-prefix-2026-10-09.json), [ПК](ux-ui/screens/bgp-real-prefix-server1-1280-2026-10-09.png), [320px](ux-ui/screens/bgp-real-prefix-server1-320-2026-10-09.png) просмотрен: received1, Router ID198.18.192.2, unknown transmitted/active counters не выдуманы. Настоящие deployed API, без mocks. В URL сохранены server/state=Established/q собственного имени/session. RouterOS readonly session cache может сохранять старые строки, поэтому UI fixture отфильтрована по текущему имени и Established. + +**Оснастка/границы.** Native lifecycle прошёл с первой попытки. Observer90s завершился до начала browser; первая браузерная попытка получила ECONNRESET до страницы. Уже принятые native операции не повторялись: для UI создана отдельная такая же пара, ожидание180s, после4 cases cleanup. Это две отдельно обозначенные фазы, не один общий snapshot. Правила подтверждены [BGP](https://help.mikrotik.com/docs/spaces/ROS/pages/331612228/routing%2Bbgp) и [Routing Filters](https://help.mikrotik.com/docs/spaces/ROS/pages/74678285/Route%2BSelection%2Band%2BFilters). + +**Контроль/фиксация.** На каждой фазе exact ID/name/comment/chain/list/address/interface preflight; свои connections→instances→filter rules→address list/IP/bridge/GRE удалены. Исходные IDs8 коллекций×2 совпали, default/public/195.195.195.195/32 сохранены, оба CHR доступны, пароли не менялись. Product/source/dependencies не менялись, build/миграций/широких регрессий нет. Runtime backend diagnostics89/PG healthy, frontend ospf91; временных контейнеров не осталось. Один локальный commit без push. + +Квота95% использовано после блока. Следующий93 — отдельный BGP loss/alternate-path сценарий и сведение остаточных внешних ограничений; начать со свежего лимита. Не приняты multi-peer/WAN policy failover, IPv6/scale/maximum throughput/Portal SSO/physical disconnect/durable retry и ранее перечисленные внешние границы IPsec. Этап12.5 целиком не закрыт. diff --git a/docs/ux-ui-plan.md b/docs/ux-ui-plan.md index 6516b6fb..34e1b7fd 100644 --- a/docs/ux-ui-plan.md +++ b/docs/ux-ui-plan.md @@ -1,6 +1,6 @@ # План реализации UX/UI по пятичасовым окнам -Актуальное продолжение 2026-10-09: 12.5.91 устранил неоднозначное отображение IPv4 CIDR в OSPF: /32 больше не разбивается на /3 и2. Column180px/nowrap/title, red-before/green-after geometry test,7 E2E и4 live UI cases. Baseline7 коллекций×2 восстановлен. Backend ux-diagnostics89/frontend ux-ospf91. Следующий12.5.92 — обмен только собственным BGP prefix через GRE, отзыв и повторное объявление, API/UI контекст. Квота84% использовано; этап12.5 открыт. +Актуальное продолжение 2026-10-09: 12.5.92 принял eBGP exchange одного собственного /32 на каждом CHR через свой GRE, Ping3/3×2, административный withdrawal/re-advertisement, API prefixesRx1 и4 live UI cases. Baseline8 коллекций×2 восстановлен. Runtime backend ux-diagnostics89/frontend ux-ospf91. Следующий12.5.93 — профильный BGP loss/alternate-path сценарий и окончательная матрица внешних ограничений; не начинать его без свежей квоты. Квота95% использовано после блока; этап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 04586ec1..e0c1ddb2 100644 --- a/docs/ux-ui-progress.md +++ b/docs/ux-ui-progress.md @@ -1,6 +1,6 @@ # UX/UI: журнал реализации -Актуальное продолжение 2026-10-09: 12.5.91 устранил неоднозначное отображение IPv4 CIDR в OSPF: /32 больше не разбивается на /3 и2. Column180px/nowrap/title, red-before/green-after geometry test,7 E2E и4 live UI cases. Baseline7 коллекций×2 восстановлен. Backend ux-diagnostics89/frontend ux-ospf91. Следующий12.5.92 — обмен только собственным BGP prefix через GRE, отзыв и повторное объявление, API/UI контекст. Квота84% использовано; этап12.5 открыт. +Актуальное продолжение 2026-10-09: 12.5.92 принял eBGP exchange одного собственного /32 на каждом CHR через свой GRE, Ping3/3×2, административный withdrawal/re-advertisement, API prefixesRx1 и4 live UI cases. Baseline8 коллекций×2 восстановлен. Runtime backend ux-diagnostics89/frontend ux-ospf91. Следующий12.5.93 — профильный BGP loss/alternate-path сценарий и окончательная матрица внешних ограничений; не начинать его без свежей квоты. Квота95% использовано после блока; этап12.5 открыт. Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения. Записи расположены от новых к старым; подробная история этапа12 также сохранена в [ux-ui-stage-12.md](ux-ui-stage-12.md). @@ -36,7 +36,30 @@ | 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–91 и ограничения ниже. Runtime backend ux-diagnostics89/frontend ux-ospf91. | +| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка завершена в границах12.3.83; внешняя12.5 в работе, выполненные блоки1–92 и ограничения ниже. Runtime backend ux-diagnostics89/frontend ux-ospf91. | + +## 12.5.92 — BGP: собственный префикс, отзыв и повторное объявление (2026-10-09) + +**Сценарий.** Свой GRE/link198.18.92.0/30 и bridge loopbacks198.18.192.1/32↔2/32, private AS65092/65093, explicit BGP instances/router IDs и direct eBGP connections. Address list output.network содержит только собственный loopback /32. Отдельные input/output chains принимают только соответствующий exact /32 по dst/dst-len и отклоняют остальное. Default-originate=never, network-blackhole=no, public/default/metadata prefixes не экспортировались. + +| Проверка | Результат | +| --- | --- | +| Established / маршрут | Обе сессии Established; ровно1 learned BGP route на узле, active | +| Data plane | Собственные loopbacks Ping3/3 в обе стороны | +| Production API | Selected/catalog Established, prefixesRx1; неизвестные counters не заменены нулём | +| Отзыв | Отключение своей connection наCHR1 убрало active private route наCHR2 | +| Повторное объявление | Включение connection вернуло Established/active own prefix/API Rx1 | +| UI | 4/4 два CHR×1280/320: received1, Router ID, details/reload, document fits/pageerror0 | + +**Доказательства.** [Native/API протокол](ux-ui/acceptance/bgp-prefix-2026-10-09.json). Withdrawal впервые наблюдался340,8ms после acknowledgement административного disable. Это не hold-timer/BFD detection или loss-based failover/SLA. Public routing не менялся; peer TCP179 проходит только через собственный GRE. Input принимает только remote loopback, output только local loopback, что проверено также отсутствием других BGP routes. + +[Browser отчёт](ux-ui/acceptance/browser-bgp-prefix-2026-10-09.json), [ПК](ux-ui/screens/bgp-real-prefix-server1-1280-2026-10-09.png), [320px](ux-ui/screens/bgp-real-prefix-server1-320-2026-10-09.png) просмотрен: received1, Router ID198.18.192.2, unknown transmitted/active counters не выдуманы. Настоящие deployed API, без mocks. В URL сохранены server/state=Established/q собственного имени/session. RouterOS readonly session cache может сохранять старые строки, поэтому UI fixture отфильтрована по текущему имени и Established. + +**Оснастка/границы.** Native lifecycle прошёл с первой попытки. Observer90s завершился до начала browser; первая браузерная попытка получила ECONNRESET до страницы. Уже принятые native операции не повторялись: для UI создана отдельная такая же пара, ожидание180s, после4 cases cleanup. Это две отдельно обозначенные фазы, не один общий snapshot. Правила подтверждены [BGP](https://help.mikrotik.com/docs/spaces/ROS/pages/331612228/routing%2Bbgp) и [Routing Filters](https://help.mikrotik.com/docs/spaces/ROS/pages/74678285/Route%2BSelection%2Band%2BFilters). + +**Контроль/фиксация.** На каждой фазе exact ID/name/comment/chain/list/address/interface preflight; свои connections→instances→filter rules→address list/IP/bridge/GRE удалены. Исходные IDs8 коллекций×2 совпали, default/public/195.195.195.195/32 сохранены, оба CHR доступны, пароли не менялись. Product/source/dependencies не менялись, build/миграций/широких регрессий нет. Runtime backend diagnostics89/PG healthy, frontend ospf91; временных контейнеров не осталось. Один локальный commit без push. + +Квота95% использовано после блока. Следующий93 — отдельный BGP loss/alternate-path сценарий и сведение остаточных внешних ограничений; начать со свежего лимита. Не приняты multi-peer/WAN policy failover, IPv6/scale/maximum throughput/Portal SSO/physical disconnect/durable retry и ранее перечисленные внешние границы IPsec. Этап12.5 целиком не закрыт. ## 12.5.91 — OSPF Data Grid: целый IPv4 CIDR (2026-10-09) diff --git a/docs/ux-ui-stage-12.md b/docs/ux-ui-stage-12.md index 886521f0..244e9c49 100644 --- a/docs/ux-ui-stage-12.md +++ b/docs/ux-ui-stage-12.md @@ -2156,3 +2156,26 @@ Production image не содержит dev-only jose: первый fixture impor **Контроль/runtime.** Свои objects удалены по exact IDs/атрибутам, baseline7 коллекций×2 совпал, оба CHR доступны, default/public/195.195.195.195/32 и credentials сохранены. Нормализованные SHA source/deployed DataGrid renderer и OSPF consumer совпадали до изменения, поэтому проблема не была вызвана отставшим компонентом стенда. Один frontend Docker build, production TypeScript/build, entry/node --check/compose --wait passed. mmapp-test/frontend:ux-ospf91/version1.0.0-test.ospf91, image sha256:b4bade515234115b3cad257ceb87ef7beb347e754ca92d6a97a25adc2199fd33. Context optimizer87 frontend +один consumer file, override SHA27a27569335c377bf8662fb5b39d200ce98d52925cafdf51dee165464c1532078, label не Git SHA. .env backup приватный, backend/migrations не менялись, полная регрессия/failover не повторялись. Один локальный commit без push. Следующий92 — BGP propagation собственных private prefixes, withdrawal/re-advertisement и UI counters; только собственные GRE/instances/filter chains. Квота84% использовано после блока, этап12.5 и внешние границы остаются открытыми. + +## 12.5.92 — BGP: собственный префикс, отзыв и повторное объявление (2026-10-09) + +**Сценарий.** Свой GRE/link198.18.92.0/30 и bridge loopbacks198.18.192.1/32↔2/32, private AS65092/65093, explicit BGP instances/router IDs и direct eBGP connections. Address list output.network содержит только собственный loopback /32. Отдельные input/output chains принимают только соответствующий exact /32 по dst/dst-len и отклоняют остальное. Default-originate=never, network-blackhole=no, public/default/metadata prefixes не экспортировались. + +| Проверка | Результат | +| --- | --- | +| Established / маршрут | Обе сессии Established; ровно1 learned BGP route на узле, active | +| Data plane | Собственные loopbacks Ping3/3 в обе стороны | +| Production API | Selected/catalog Established, prefixesRx1; неизвестные counters не заменены нулём | +| Отзыв | Отключение своей connection наCHR1 убрало active private route наCHR2 | +| Повторное объявление | Включение connection вернуло Established/active own prefix/API Rx1 | +| UI | 4/4 два CHR×1280/320: received1, Router ID, details/reload, document fits/pageerror0 | + +**Доказательства.** [Native/API протокол](ux-ui/acceptance/bgp-prefix-2026-10-09.json). Withdrawal впервые наблюдался340,8ms после acknowledgement административного disable. Это не hold-timer/BFD detection или loss-based failover/SLA. Public routing не менялся; peer TCP179 проходит только через собственный GRE. Input принимает только remote loopback, output только local loopback, что проверено также отсутствием других BGP routes. + +[Browser отчёт](ux-ui/acceptance/browser-bgp-prefix-2026-10-09.json), [ПК](ux-ui/screens/bgp-real-prefix-server1-1280-2026-10-09.png), [320px](ux-ui/screens/bgp-real-prefix-server1-320-2026-10-09.png) просмотрен: received1, Router ID198.18.192.2, unknown transmitted/active counters не выдуманы. Настоящие deployed API, без mocks. В URL сохранены server/state=Established/q собственного имени/session. RouterOS readonly session cache может сохранять старые строки, поэтому UI fixture отфильтрована по текущему имени и Established. + +**Оснастка/границы.** Native lifecycle прошёл с первой попытки. Observer90s завершился до начала browser; первая браузерная попытка получила ECONNRESET до страницы. Уже принятые native операции не повторялись: для UI создана отдельная такая же пара, ожидание180s, после4 cases cleanup. Это две отдельно обозначенные фазы, не один общий snapshot. Правила подтверждены [BGP](https://help.mikrotik.com/docs/spaces/ROS/pages/331612228/routing%2Bbgp) и [Routing Filters](https://help.mikrotik.com/docs/spaces/ROS/pages/74678285/Route%2BSelection%2Band%2BFilters). + +**Контроль/фиксация.** На каждой фазе exact ID/name/comment/chain/list/address/interface preflight; свои connections→instances→filter rules→address list/IP/bridge/GRE удалены. Исходные IDs8 коллекций×2 совпали, default/public/195.195.195.195/32 сохранены, оба CHR доступны, пароли не менялись. Product/source/dependencies не менялись, build/миграций/широких регрессий нет. Runtime backend diagnostics89/PG healthy, frontend ospf91; временных контейнеров не осталось. Один локальный commit без push. + +Квота95% использовано после блока. Следующий93 — отдельный BGP loss/alternate-path сценарий и сведение остаточных внешних ограничений; начать со свежего лимита. Не приняты multi-peer/WAN policy failover, IPv6/scale/maximum throughput/Portal SSO/physical disconnect/durable retry и ранее перечисленные внешние границы IPsec. Этап12.5 целиком не закрыт. diff --git a/docs/ux-ui/acceptance/bgp-prefix-2026-10-09.json b/docs/ux-ui/acceptance/bgp-prefix-2026-10-09.json new file mode 100644 index 00000000..e8517703 --- /dev/null +++ b/docs/ux-ui/acceptance/bgp-prefix-2026-10-09.json @@ -0,0 +1,579 @@ +{ + "date": "2026-10-09", + "nativeLifecycle": { + "date": "2026-10-09", + "name": "mm-bgp92-1791559769092", + "devices": [ + { + "serverId": 1, + "catalog": { + "id": "*2800002", + "serverId": 1, + "serverName": "CHR", + "serverSite": "", + "serverCountry": "", + "name": "mm-bgp92-1791559769092-1", + "peerIp": "198.18.92.2", + "remoteAs": 65093, + "localAs": 65092, + "localId": "198.18.192.1", + "remoteId": "198.18.192.2", + "state": "Established", + "type": "eBGP", + "uptime": "280ms", + "holdTime": 180, + "keepalive": 60, + "prefixesRx": 1, + "prefixesTx": null, + "inputMessages": 2, + "outputMessages": 2, + "capabilities": [ + "MP-BGP", + "Route Refresh", + "Extended Next-Hop", + "Graceful Restart", + "4-byte-AS" + ], + "lastError": null, + "afi": "ip" + }, + "nativeRoute": { + ".id": "*2014D000", + "active": "true", + "bgp": "true", + "distance": "20", + "dst-address": "198.18.192.2/32", + "dynamic": "true", + "gateway": "198.18.92.2", + "immediate-gw": "198.18.92.2%mm-bgp92-1791559769092", + "inactive": "false", + "routing-table": "main", + "scope": "40", + "target-scope": "10" + }, + "pingReceived": 3, + "pingAttempts": [ + 3 + ], + "exactOwnPrefixOnly": true + }, + { + "serverId": 2, + "catalog": { + "id": "*2800002", + "serverId": 2, + "serverName": "CHR", + "serverSite": "", + "serverCountry": "", + "name": "mm-bgp92-1791559769092-1", + "peerIp": "198.18.92.1", + "remoteAs": 65092, + "localAs": 65093, + "localId": "198.18.192.2", + "remoteId": "198.18.192.1", + "state": "Established", + "type": "eBGP", + "uptime": "110ms", + "holdTime": 180, + "keepalive": 60, + "prefixesRx": 1, + "prefixesTx": null, + "inputMessages": 2, + "outputMessages": 2, + "capabilities": [ + "MP-BGP", + "Route Refresh", + "Extended Next-Hop", + "Graceful Restart", + "4-byte-AS" + ], + "lastError": null, + "afi": "ip" + }, + "nativeRoute": { + ".id": "*2014D000", + "active": "true", + "bgp": "true", + "distance": "20", + "dst-address": "198.18.192.1/32", + "dynamic": "true", + "gateway": "198.18.92.1", + "immediate-gw": "198.18.92.1%mm-bgp92-1791559769092", + "inactive": "false", + "routing-table": "main", + "scope": "40", + "target-scope": "10" + }, + "pingReceived": 3, + "pingAttempts": [ + 3 + ], + "exactOwnPrefixOnly": true + } + ], + "cleanup": [ + { + "serverId": 1, + "/routing/bgp/connection": true, + "/routing/bgp/instance": true, + "/routing/filter/rule": true, + "/ip/firewall/address-list": true, + "/interface/gre": true, + "/interface/bridge": true, + "/ip/address": true, + "/ip/route": true + }, + { + "serverId": 2, + "/routing/bgp/connection": true, + "/routing/bgp/instance": true, + "/routing/filter/rule": true, + "/ip/firewall/address-list": true, + "/interface/gre": true, + "/interface/bridge": true, + "/ip/address": true, + "/ip/route": true + } + ], + "initial": [ + { + "sessions": [ + { + ".id": "*2800002", + "ebgp": "", + "established": "true", + "hold-time": "3m", + "input.filter": "mm-bgp92-1791559769092-in", + "input.procid": "20", + "instance": "mm-bgp92-1791559769092", + "keepalive-time": "1m", + "last-started": "2026-10-09 18:29:32", + "local.address": "198.18.92.1", + "local.afi": "ip", + "local.as": "65092", + "local.bytes": "68", + "local.capabilities": "mp,rr,enhe,gr,as4", + "local.cluster-id": "198.18.192.1", + "local.eor": "", + "local.id": "198.18.192.1", + "local.messages": "2", + "name": "mm-bgp92-1791559769092-1", + "output.filter-chain": "mm-bgp92-1791559769092-out", + "output.network": "mm-bgp92-1791559769092", + "output.procid": "20", + "prefix-count": "1", + "remote.address": "198.18.92.2", + "remote.afi": "ip", + "remote.as": "65093", + "remote.bytes": "68", + "remote.capabilities": "mp,rr,enhe,gr,as4", + "remote.eor": "", + "remote.id": "198.18.192.2", + "remote.messages": "2", + "uptime": "280ms" + } + ], + "routes": [ + { + ".id": "*2014D000", + "active": "true", + "bgp": "true", + "distance": "20", + "dst-address": "198.18.192.2/32", + "dynamic": "true", + "gateway": "198.18.92.2", + "immediate-gw": "198.18.92.2%mm-bgp92-1791559769092", + "inactive": "false", + "routing-table": "main", + "scope": "40", + "target-scope": "10" + } + ] + }, + { + "sessions": [ + { + ".id": "*2800002", + "ebgp": "", + "established": "true", + "hold-time": "3m", + "input.filter": "mm-bgp92-1791559769092-in", + "input.procid": "20", + "instance": "mm-bgp92-1791559769092", + "keepalive-time": "1m", + "last-started": "2026-10-09 17:29:33", + "local.address": "198.18.92.2", + "local.afi": "ip", + "local.as": "65093", + "local.bytes": "68", + "local.capabilities": "mp,rr,enhe,gr,as4", + "local.cluster-id": "198.18.192.2", + "local.eor": "", + "local.id": "198.18.192.2", + "local.messages": "2", + "name": "mm-bgp92-1791559769092-1", + "output.filter-chain": "mm-bgp92-1791559769092-out", + "output.network": "mm-bgp92-1791559769092", + "output.procid": "20", + "prefix-count": "1", + "remote.address": "198.18.92.1", + "remote.afi": "ip", + "remote.as": "65092", + "remote.bytes": "68", + "remote.capabilities": "mp,rr,enhe,gr,as4", + "remote.eor": "", + "remote.id": "198.18.192.1", + "remote.messages": "2", + "uptime": "110ms" + } + ], + "routes": [ + { + ".id": "*2014D000", + "active": "true", + "bgp": "true", + "distance": "20", + "dst-address": "198.18.192.1/32", + "dynamic": "true", + "gateway": "198.18.92.1", + "immediate-gw": "198.18.92.1%mm-bgp92-1791559769092", + "inactive": "false", + "routing-table": "main", + "scope": "40", + "target-scope": "10" + } + ] + } + ], + "withdrawal": { + "ownConnectionDisabled": true, + "activePrivateRouteGone": true, + "firstObservedMs": 340.8078349999996 + }, + "recovered": [ + { + "sessions": [ + { + ".id": "*2800003", + "ebgp": "", + "established": "true", + "hold-time": "3m", + "input.filter": "mm-bgp92-1791559769092-in", + "input.procid": "20", + "instance": "mm-bgp92-1791559769092", + "keepalive-time": "1m", + "last-started": "2026-10-09 18:29:34", + "local.address": "198.18.92.1", + "local.afi": "ip", + "local.as": "65092", + "local.bytes": "68", + "local.capabilities": "mp,rr,enhe,gr,as4", + "local.cluster-id": "198.18.192.1", + "local.eor": "", + "local.id": "198.18.192.1", + "local.messages": "2", + "name": "mm-bgp92-1791559769092-1", + "output.filter-chain": "mm-bgp92-1791559769092-out", + "output.network": "mm-bgp92-1791559769092", + "output.procid": "20", + "prefix-count": "0", + "remote.address": "198.18.92.2", + "remote.afi": "ip", + "remote.as": "65093", + "remote.bytes": "68", + "remote.capabilities": "mp,rr,enhe,gr,as4", + "remote.eor": "", + "remote.id": "198.18.192.2", + "remote.messages": "2", + "uptime": "330ms" + } + ], + "routes": [ + { + ".id": "*2014D000", + "active": "true", + "bgp": "true", + "distance": "20", + "dst-address": "198.18.192.2/32", + "dynamic": "true", + "gateway": "198.18.92.2", + "immediate-gw": "198.18.92.2%mm-bgp92-1791559769092", + "inactive": "false", + "routing-table": "main", + "scope": "40", + "target-scope": "10" + } + ] + }, + { + "sessions": [ + { + ".id": "*2800002", + "ebgp": "", + "established": "true", + "hold-time": "3m", + "input.filter": "mm-bgp92-1791559769092-in", + "input.procid": "20", + "instance": "mm-bgp92-1791559769092", + "keepalive-time": "1m", + "last-started": "2026-10-09 17:29:35", + "last-stopped": "2026-10-09 17:29:34", + "local.address": "198.18.92.2", + "local.afi": "ip", + "local.as": "65093", + "local.bytes": "68", + "local.capabilities": "mp,rr,enhe,gr,as4", + "local.cluster-id": "198.18.192.2", + "local.eor": "", + "local.id": "198.18.192.2", + "local.messages": "2", + "name": "mm-bgp92-1791559769092-1", + "output.filter-chain": "mm-bgp92-1791559769092-out", + "output.network": "mm-bgp92-1791559769092", + "output.procid": "20", + "prefix-count": "1", + "remote.address": "198.18.92.1", + "remote.afi": "ip", + "remote.as": "65092", + "remote.bytes": "68", + "remote.capabilities": "mp,rr,enhe,gr,as4", + "remote.eor": "", + "remote.id": "198.18.192.1", + "remote.messages": "2", + "uptime": "160ms" + } + ], + "routes": [ + { + ".id": "*2014D000", + "active": "true", + "bgp": "true", + "distance": "20", + "dst-address": "198.18.192.1/32", + "dynamic": "true", + "gateway": "198.18.92.1", + "immediate-gw": "198.18.92.1%mm-bgp92-1791559769092", + "inactive": "false", + "routing-table": "main", + "scope": "40", + "target-scope": "10" + } + ] + } + ], + "recoveryCatalog": [ + { + "id": "*2800003", + "serverId": 1, + "serverName": "CHR", + "serverSite": "", + "serverCountry": "", + "name": "mm-bgp92-1791559769092-1", + "peerIp": "198.18.92.2", + "remoteAs": 65093, + "localAs": 65092, + "localId": "198.18.192.1", + "remoteId": "198.18.192.2", + "state": "Established", + "type": "eBGP", + "uptime": "330ms", + "holdTime": 180, + "keepalive": 60, + "prefixesRx": 1, + "prefixesTx": null, + "inputMessages": 2, + "outputMessages": 2, + "capabilities": [ + "MP-BGP", + "Route Refresh", + "Extended Next-Hop", + "Graceful Restart", + "4-byte-AS" + ], + "lastError": null, + "afi": "ip" + }, + { + "id": "*2800002", + "serverId": 2, + "serverName": "CHR", + "serverSite": "", + "serverCountry": "", + "name": "mm-bgp92-1791559769092-1", + "peerIp": "198.18.92.1", + "remoteAs": 65092, + "localAs": 65093, + "localId": "198.18.192.2", + "remoteId": "198.18.192.1", + "state": "Established", + "type": "eBGP", + "uptime": "160ms", + "holdTime": 180, + "keepalive": 60, + "prefixesRx": 1, + "prefixesTx": null, + "inputMessages": 2, + "outputMessages": 2, + "capabilities": [ + "MP-BGP", + "Route Refresh", + "Extended Next-Hop", + "Graceful Restart", + "4-byte-AS" + ], + "lastError": null, + "afi": "ip" + } + ] + }, + "uiFixture": { + "date": "2026-10-09", + "name": "mm-bgp92-1791560069532", + "devices": [], + "cleanup": [ + { + "serverId": 1, + "/routing/bgp/connection": true, + "/routing/bgp/instance": true, + "/routing/filter/rule": true, + "/ip/firewall/address-list": true, + "/interface/gre": true, + "/interface/bridge": true, + "/ip/address": true, + "/ip/route": true + }, + { + "serverId": 2, + "/routing/bgp/connection": true, + "/routing/bgp/instance": true, + "/routing/filter/rule": true, + "/ip/firewall/address-list": true, + "/interface/gre": true, + "/interface/bridge": true, + "/ip/address": true, + "/ip/route": true + } + ], + "initial": [ + { + "sessions": [ + { + ".id": "*2800004", + "ebgp": "", + "established": "true", + "hold-time": "3m", + "input.filter": "mm-bgp92-1791560069532-in", + "input.procid": "20", + "instance": "mm-bgp92-1791560069532", + "keepalive-time": "1m", + "last-started": "2026-10-09 18:34:33", + "local.address": "198.18.92.1", + "local.afi": "ip", + "local.as": "65092", + "local.bytes": "68", + "local.capabilities": "mp,rr,enhe,gr,as4", + "local.cluster-id": "198.18.192.1", + "local.eor": "", + "local.id": "198.18.192.1", + "local.messages": "2", + "name": "mm-bgp92-1791560069532-1", + "output.filter-chain": "mm-bgp92-1791560069532-out", + "output.network": "mm-bgp92-1791560069532", + "output.procid": "20", + "prefix-count": "1", + "remote.address": "198.18.92.2", + "remote.afi": "ip", + "remote.as": "65093", + "remote.bytes": "68", + "remote.capabilities": "mp,rr,enhe,gr,as4", + "remote.eor": "", + "remote.id": "198.18.192.2", + "remote.messages": "2", + "uptime": "0ms" + } + ], + "routes": [ + { + ".id": "*2014D000", + "active": "true", + "bgp": "true", + "distance": "20", + "dst-address": "198.18.192.2/32", + "dynamic": "true", + "gateway": "198.18.92.2", + "immediate-gw": "198.18.92.2%mm-bgp92-1791560069532", + "inactive": "false", + "routing-table": "main", + "scope": "40", + "target-scope": "10" + } + ] + }, + { + "sessions": [ + { + ".id": "*2800003", + "ebgp": "", + "established": "true", + "hold-time": "3m", + "input.filter": "mm-bgp92-1791560069532-in", + "input.procid": "20", + "instance": "mm-bgp92-1791560069532", + "keepalive-time": "1m", + "last-started": "2026-10-09 17:34:33", + "local.address": "198.18.92.2", + "local.afi": "ip", + "local.as": "65093", + "local.bytes": "68", + "local.capabilities": "mp,rr,enhe,gr,as4", + "local.cluster-id": "198.18.192.2", + "local.eor": "", + "local.id": "198.18.192.2", + "local.messages": "2", + "name": "mm-bgp92-1791560069532-1", + "output.filter-chain": "mm-bgp92-1791560069532-out", + "output.network": "mm-bgp92-1791560069532", + "output.procid": "20", + "prefix-count": "0", + "remote.address": "198.18.92.1", + "remote.afi": "ip", + "remote.as": "65092", + "remote.bytes": "68", + "remote.capabilities": "mp,rr,enhe,gr,as4", + "remote.eor": "", + "remote.id": "198.18.192.1", + "remote.messages": "2", + "uptime": "170ms" + } + ], + "routes": [ + { + ".id": "*2014D000", + "active": "true", + "bgp": "true", + "distance": "20", + "dst-address": "198.18.192.1/32", + "dynamic": "true", + "gateway": "198.18.92.1", + "immediate-gw": "198.18.92.1%mm-bgp92-1791560069532", + "inactive": "false", + "routing-table": "main", + "scope": "40", + "target-scope": "10" + } + ] + } + ] + }, + "runtime": { + "backend": "ux-diagnostics89", + "frontend": "ux-ospf91", + "buildsPerformed": 0 + }, + "notes": [ + "Only own /32 is originated through address list and both-direction filter chains; default origination never, network-blackhole no.", + "Withdrawal observed after administrative disable acknowledgement; not loss-based failover or hold-timer performance.", + "First observer expired before browser start; native lifecycle was preserved and only UI fixture recreated.", + "Read-only RouterOS session cache can retain old rows; UI filters Established and current fixture name." + ] +} \ No newline at end of file diff --git a/docs/ux-ui/acceptance/browser-bgp-prefix-2026-10-09.json b/docs/ux-ui/acceptance/browser-bgp-prefix-2026-10-09.json new file mode 100644 index 00000000..02e79163 --- /dev/null +++ b/docs/ux-ui/acceptance/browser-bgp-prefix-2026-10-09.json @@ -0,0 +1,39 @@ +{ + "date": "2026-10-09", + "phase": "2 320", + "cases": [ + { + "serverId": 1, + "width": 1280, + "receivedPrefixCount": 1, + "peerRouterIdVisible": true, + "detailReload": true, + "documentFits": true + }, + { + "serverId": 1, + "width": 320, + "receivedPrefixCount": 1, + "peerRouterIdVisible": true, + "detailReload": true, + "documentFits": true + }, + { + "serverId": 2, + "width": 1280, + "receivedPrefixCount": 1, + "peerRouterIdVisible": true, + "detailReload": true, + "documentFits": true + }, + { + "serverId": 2, + "width": 320, + "receivedPrefixCount": 1, + "peerRouterIdVisible": true, + "detailReload": true, + "documentFits": true + } + ], + "errors": [] +} \ No newline at end of file diff --git a/docs/ux-ui/screens/bgp-real-prefix-server1-1280-2026-10-09.png b/docs/ux-ui/screens/bgp-real-prefix-server1-1280-2026-10-09.png new file mode 100644 index 00000000..033fd00b Binary files /dev/null and b/docs/ux-ui/screens/bgp-real-prefix-server1-1280-2026-10-09.png differ diff --git a/docs/ux-ui/screens/bgp-real-prefix-server1-320-2026-10-09.png b/docs/ux-ui/screens/bgp-real-prefix-server1-320-2026-10-09.png new file mode 100644 index 00000000..7e6c31d5 Binary files /dev/null and b/docs/ux-ui/screens/bgp-real-prefix-server1-320-2026-10-09.png differ diff --git a/docs/ux-ui/screens/bgp-real-prefix-server2-1280-2026-10-09.png b/docs/ux-ui/screens/bgp-real-prefix-server2-1280-2026-10-09.png new file mode 100644 index 00000000..bc92b0e6 Binary files /dev/null and b/docs/ux-ui/screens/bgp-real-prefix-server2-1280-2026-10-09.png differ diff --git a/docs/ux-ui/screens/bgp-real-prefix-server2-320-2026-10-09.png b/docs/ux-ui/screens/bgp-real-prefix-server2-320-2026-10-09.png new file mode 100644 index 00000000..8d4c5a90 Binary files /dev/null and b/docs/ux-ui/screens/bgp-real-prefix-server2-320-2026-10-09.png differ