chore(test): подтвердить компенсацию импорта на двух CHR

This commit is contained in:
Denozordec committed 2026-10-09 09:15:48 +07:00
1 parent e01454b720
commit 91ee424b42
9 files changed
+802 -7

No files matched your search

+15 -1
View File
@@ -1,6 +1,6 @@
# UX/UI: протокол внешней приёмки 12.5
Статус на2026-10-09: backend/frontend479f2ad, backend healthy. В12.5.67 исправленный Peer .conf принят как клиентский шаблон: API6/6, browser4/4, server endpoint и placeholders; настоящий RSC roundtrip через UI/native/handshake/Ping принят в12.5.68, .conf с явнымName/отказы400/409/сохранение формы приняты в70; partial failures/rollback открыты. Мобильная ширина WireGuard Sheets принята в12.5.64. Мобильная GRE форма и native сохранение на обоих CHR приняты в12.5.57. WireGuard handshake/короткий Ping/native API/read-only UI приняты в границах12.5.58; 12.5.59 воспроизвёл оставшиеся peers/IP; 12.5.60 развернул исправление и принял обычное удаление own WG интерфейса с peer/IPv4 адресом на обоих CHR. 12.5.62 принял полный WireGuard UI create/peer/disable/enable/Ping/delete на обоих CHR; устойчивое меню развёрнуто. Устойчивость меню GRE при live refresh на обоих CHR принята в12.5.55. GRE peer metadata и реальный lifecycle/API/UI/двусторонний Ping подтверждены в12.5.53. Browser retry/checkpoint на реальном HTTP/PG принят в границах12.5.43–45; Telegram sender responses подменены, реальная доставка не проверена. PG-1/2/3/4/5 приняты в описанных границах, PG-6 integrated для одного isolated instance, PG-7 real JWT/processcounts и browser restore passed. PG-8 real PG/native и browser unknown→history done приняты с fault injection после настоящего COMMIT. ROS-8/9 real API/SQL/native приняты в границах12.5.23; browser pair/duration change и delete приняты в12.5.24. ROS-2 authentication failure принят в12.5.25. PortalSSO, физический TCP disconnect, мультиэкземпляры и остальные ROS/Q/интеграции остаются открытыми. [Паспорт](ux-ui-test-server.md), [журнал](ux-ui-progress.md).
Статус на2026-10-09: backend e01454b/frontend479f2ad, backend healthy. В12.5.67 исправленный Peer .conf принят как клиентский шаблон: API6/6, browser4/4, server endpoint и placeholders; настоящий RSC roundtrip через UI/native/handshake/Ping принят в12.5.68, .conf с явнымName/отказы400/409/сохранение формы приняты в70; поздний native rejection/подтверждённая компенсация/retry приняты в72; неизвестные исходы и audit failure открыты. Мобильная ширина WireGuard Sheets принята в12.5.64. Мобильная GRE форма и native сохранение на обоих CHR приняты в12.5.57. WireGuard handshake/короткий Ping/native API/read-only UI приняты в границах12.5.58; 12.5.59 воспроизвёл оставшиеся peers/IP; 12.5.60 развернул исправление и принял обычное удаление own WG интерфейса с peer/IPv4 адресом на обоих CHR. 12.5.62 принял полный WireGuard UI create/peer/disable/enable/Ping/delete на обоих CHR; устойчивое меню развёрнуто. Устойчивость меню GRE при live refresh на обоих CHR принята в12.5.55. GRE peer metadata и реальный lifecycle/API/UI/двусторонний Ping подтверждены в12.5.53. Browser retry/checkpoint на реальном HTTP/PG принят в границах12.5.43–45; Telegram sender responses подменены, реальная доставка не проверена. PG-1/2/3/4/5 приняты в описанных границах, PG-6 integrated для одного isolated instance, PG-7 real JWT/processcounts и browser restore passed. PG-8 real PG/native и browser unknown→history done приняты с fault injection после настоящего COMMIT. ROS-8/9 real API/SQL/native приняты в границах12.5.23; browser pair/duration change и delete приняты в12.5.24. ROS-2 authentication failure принят в12.5.25. PortalSSO, физический TCP disconnect, мультиэкземпляры и остальные ROS/Q/интеграции остаются открытыми. [Паспорт](ux-ui-test-server.md), [журнал](ux-ui-progress.md).
## Паспорт стенда
@@ -597,3 +597,17 @@ Route отдельно обрабатывает audit revision failure посл
Проверки apply unit16/16: native receipt успех, baseline read failure0writes, несовпавшая native identity, повтор после успеха409 без mutations, отказ второго peer/адреса с восстановлением baseline, успешный повтор после rollback, lost reply после iface/IP/peer commit,HTTP408/500,missing/foreign receipt,concurrent чужой peer,изменённая identity,отказ/неподтверждённый DELETE. Исходные preflight22/22 и codec/HTTP4 invalid cases passed; новые apply tests включены в backend test:wireguard. Browser6/6: прежние import сценарии и три новых502 состояния rolled-back/needs-review/applied сохраняют текст/server/error; автоматического повторного POST нет; ручной retry после rolled-back принят успешным receipt. HTTP ответы browser подменены, это не real RouterOS cleanup. Backend и scoped frontend TypeScript, ESLint и diff check passed. UI primitives/ReUI composition не менялись.
Исправление локальное: runtime backend/frontend479f2ad из70 не обновлялся; production frontend source не менялся. Следующий12.5.72 — production build/deploy только backend, реальная проверка ROS PUT receipts, поздний native rejection на собственных объектах,cleanup/baseline и исправленный повтор с связностью. Прерванный HTTP/процесс,подлинный audit DB failure,конкуренция/multi-instance,IPv6/throughput/RBAC,PSK/multi-address/unknown-conf поля,интеграции и остальные внешние протоколы остаются открытыми. Пароли/RouterOS конфигурация в этом локальном блоке не менялись. Локальный коммит без push.
## 12.5.72 — реальная компенсация позднего отказа импорта WireGuard (2026-10-09)
Backend e01454b720f92ae8adc1636f7a2092132232dc87 production build/deploy passed; frontend479f2ad оставлен, его container ID до/после совпал. Git archive SHA2566cffbd73c05cf28fded3c80d9c8965a3c22f8f698e33f499fb87f5d21fc2effc; backend src staging совпал с source. Новый image inspect IDsha256:b6d5d7f68a8529ead68d8a676a0def5edfdd6aa9ad485be4b0158c0241ecae46,OCI revision полныйe01454b,version1.0.0-test.e01454b. Module import/state assertion без сети passed, backend healthy,/health HTTP200. Private backup pre-e01454b.dump2364848bytes,0600,pg_restore --list passed; предыдущая.env и образы сохранены только на сервере для отката. SSH161.104.46.222 и RouterOS REST обоих CHR доступны с прежними доступами.
Создана собственная WG пара с уникальным name/comment,51879/1420 и198.18.255.241/30↔198.18.255.242/30; исходные native keys/association/handshake/Ping3/3 подтверждены. Private conf exports с явным Name использованы только в памяти, исходная пара обычным DELETE удалена. Для позднего отказа к каждому conf добавлен повтор того же Peer. Это настоящий native rejection, не fake HTTP response или transport injection.
Supplemental native service run на каждом CHR использовал новый applyWireguardImport и настоящий MikrotikClient. Adapter только записывал method/path/наличие receipt .id/завершение DELETE и делегировал реальные операции; GET retries наследуют harness, mutations не повторяются. Native trace: iface PUT receipt →IP PUT receipt →первый peer PUT receipt →второй peer HTTP400 →DELETE peer/IP/iface. State rolled-back и полный выбранный baseline restored на обоих CHR. Успешные native HTTP-коды не выдумывались: client возвращает body/void, отчёт отмечает completed и receiptIdPresent; status400 получен из реального MikrotikError. Наличие receipt/native identities на этой RouterOS версии подтверждено.
Отдельно реальный production UI/API наCHR1 при1280px иCHR2 при320px: неполный template400 сохраняет форму/server selection, duplicate-peer conf502,state rolled-back сохраняет введённый конфиг и показывает подтверждённую очистку; native observer не нашёл iface/peer/IP на выбранном устройстве. После исправления textarea повтор200 подтвердил applied name/peersCreated=1, Sheet закрылся, интерфейс появился в таблице. Применённая пара прошла native parameter/public identity/private scalar checks, handshake иPing3/3 в обе стороны. Expected UI errors:2×400 и2×502; unexpected API/page errors0,page overflow0. Comments/peer names не переносятся conf, явный Name — расширение parser приложения; byte-for-byte metadata restore не обещается.
[Native service/API evidence](ux-ui/acceptance/wg-import-compensation-native-2026-10-09.json), [production browser failure/retry](ux-ui/acceptance/browser-wg-import-compensation-e01454b-2026-10-09.json), [deploy/DB controls](ux-ui/acceptance/wg-import-compensation-deploy-controls-2026-10-09.json), [smoke6 страниц](ux-ui/acceptance/deploy-browser-e01454b-backend-2026-10-09.json). Финальный fixture exit0, собственные WG/peers/IP/connected routes удалены; выбранные WG/peers/IP/routes/IPv4 filter/nat/mangle совпали с baseline на обоих CHR. Остались3 основные службы, backend healthy. DB controls до/после servers2,speedHistory9,retentionDays14,migrations9; audit revisions намеренно сохранены. Smoke /dashboard,/servers,/uptime?tab=speed,/settings,/filters,/wireguard →200,320px fits,0 page/API errors. Ключи/конфигурации не включались в отчёты/скриншоты/traces/файлы; public JSON проверены. Product source после71 не менялся, общая локальная регрессия не повторялась; выполнены production build и реальные scoped сценарии.
Граница результата: подтверждённый native validation failure после трёх создающих операций, компенсация и ручной успешный retry в production HTTP/UI. Потерянный ответ/HTTP408/500 после commit,потеря процесса,unconfirmed cleanup,concurrent changes и audit DB failure остаются внешними ограничениями; unit71 их не заменяет. Следующий12.5.73 — изолированный audit failure после настоящего apply и truthful состояние applied с собственной WG парой/cleanup. RBAC/IPv6/throughput/multi-instance/PSK/multi-address/unknown-conf поля и остальные протоколы/интеграции остаются открытыми. Доступы и чужая RouterOS конфигурация не менялись. Локальный коммит без push.
+1 -1
View File
@@ -1,6 +1,6 @@
# План реализации UX/UI по пятичасовым окнам
Актуальное продолжение 2026-10-09: 12.5.71 локально вынес WireGuard apply в сервис с receipt ownership, native подтверждением и компенсацией подтверждённых отказов. Потерянный ответ/unknown receipt/чужие объекты/неподтверждённая очистка →needs-review без удаления по имени; успешный повтор после rollback и409 повтор после успеха проверены. Apply unit16/16, preflight22/22, HTTP invalid cases, browser6/6, TypeScript/ESLint passed. Runtime остаётся backend/frontend479f2ad. Следующий12.5.72 — backend Docker build/deploy, реальный receipt/partial rejection/cleanup/retry на собственной WG паре; frontend479f2ad сохранить. Этап12.5 открыт.
Актуальное продолжение 2026-10-09: 12.5.72 развернул backend e01454b, frontend479f2ad сохранён. На обоих CHR реальный отказ второго peer400 после iface/IP/peer receipts компенсирован до baseline; реальные UI502 rolled-back сохраняют форму, исправленный повтор200 восстановил handshake/Ping3/3. Cleanup/DB controls/smoke6 страниц passed. Все три сервера доступны с прежними доступами. Следующий12.5.73 — подтверждение применённой конфигурации при отказе сохранения ревизии: изолированный fault scenario и truthful HTTP/UI, собственные WG объекты и cleanup. Этап12.5 открыт.
Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-08. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат.
+16 -2
View File
@@ -1,6 +1,6 @@
# UX/UI: журнал реализации
Актуальное продолжение 2026-10-09: 12.5.71 локально вынес WireGuard apply в сервис с receipt ownership, native подтверждением и компенсацией подтверждённых отказов. Потерянный ответ/unknown receipt/чужие объекты/неподтверждённая очистка →needs-review без удаления по имени; успешный повтор после rollback и409 повтор после успеха проверены. Apply unit16/16, preflight22/22, HTTP invalid cases, browser6/6, TypeScript/ESLint passed. Runtime остаётся backend/frontend479f2ad. Следующий12.5.72 — backend Docker build/deploy, реальный receipt/partial rejection/cleanup/retry на собственной WG паре; frontend479f2ad сохранить. Этап12.5 открыт.
Актуальное продолжение 2026-10-09: 12.5.72 развернул backend e01454b, frontend479f2ad сохранён. На обоих CHR реальный отказ второго peer400 после iface/IP/peer receipts компенсирован до baseline; реальные UI502 rolled-back сохраняют форму, исправленный повтор200 восстановил handshake/Ping3/3. Cleanup/DB controls/smoke6 страниц passed. Все три сервера доступны с прежними доступами. Следующий12.5.73 — подтверждение применённой конфигурации при отказе сохранения ревизии: изолированный fault scenario и truthful HTTP/UI, собственные WG объекты и cleanup. Этап12.5 открыт.
Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения. Записи расположены от новых к старым; подробная история этапа12 также сохранена в [ux-ui-stage-12.md](ux-ui-stage-12.md).
@@ -34,7 +34,21 @@
| 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–71 и ограничения ниже. Runtime backend/frontend479f2ad. |
| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка завершена в границах12.3.83; внешняя12.5 в работе, выполненные блоки1–72 и ограничения ниже. Runtime backend e01454b/frontend479f2ad. |
## 12.5.72 — реальная компенсация позднего отказа импорта WireGuard (2026-10-09)
Backend e01454b720f92ae8adc1636f7a2092132232dc87 production build/deploy passed; frontend479f2ad оставлен, его container ID до/после совпал. Git archive SHA2566cffbd73c05cf28fded3c80d9c8965a3c22f8f698e33f499fb87f5d21fc2effc; backend src staging совпал с source. Новый image inspect IDsha256:b6d5d7f68a8529ead68d8a676a0def5edfdd6aa9ad485be4b0158c0241ecae46,OCI revision полныйe01454b,version1.0.0-test.e01454b. Module import/state assertion без сети passed, backend healthy,/health HTTP200. Private backup pre-e01454b.dump2364848bytes,0600,pg_restore --list passed; предыдущая.env и образы сохранены только на сервере для отката. SSH161.104.46.222 и RouterOS REST обоих CHR доступны с прежними доступами.
Создана собственная WG пара с уникальным name/comment,51879/1420 и198.18.255.241/30↔198.18.255.242/30; исходные native keys/association/handshake/Ping3/3 подтверждены. Private conf exports с явным Name использованы только в памяти, исходная пара обычным DELETE удалена. Для позднего отказа к каждому conf добавлен повтор того же Peer. Это настоящий native rejection, не fake HTTP response или transport injection.
Supplemental native service run на каждом CHR использовал новый applyWireguardImport и настоящий MikrotikClient. Adapter только записывал method/path/наличие receipt .id/завершение DELETE и делегировал реальные операции; GET retries наследуют harness, mutations не повторяются. Native trace: iface PUT receipt →IP PUT receipt →первый peer PUT receipt →второй peer HTTP400 →DELETE peer/IP/iface. State rolled-back и полный выбранный baseline restored на обоих CHR. Успешные native HTTP-коды не выдумывались: client возвращает body/void, отчёт отмечает completed и receiptIdPresent; status400 получен из реального MikrotikError. Наличие receipt/native identities на этой RouterOS версии подтверждено.
Отдельно реальный production UI/API наCHR1 при1280px иCHR2 при320px: неполный template400 сохраняет форму/server selection, duplicate-peer conf502,state rolled-back сохраняет введённый конфиг и показывает подтверждённую очистку; native observer не нашёл iface/peer/IP на выбранном устройстве. После исправления textarea повтор200 подтвердил applied name/peersCreated=1, Sheet закрылся, интерфейс появился в таблице. Применённая пара прошла native parameter/public identity/private scalar checks, handshake иPing3/3 в обе стороны. Expected UI errors:2×400 и2×502; unexpected API/page errors0,page overflow0. Comments/peer names не переносятся conf, явный Name — расширение parser приложения; byte-for-byte metadata restore не обещается.
[Native service/API evidence](ux-ui/acceptance/wg-import-compensation-native-2026-10-09.json), [production browser failure/retry](ux-ui/acceptance/browser-wg-import-compensation-e01454b-2026-10-09.json), [deploy/DB controls](ux-ui/acceptance/wg-import-compensation-deploy-controls-2026-10-09.json), [smoke6 страниц](ux-ui/acceptance/deploy-browser-e01454b-backend-2026-10-09.json). Финальный fixture exit0, собственные WG/peers/IP/connected routes удалены; выбранные WG/peers/IP/routes/IPv4 filter/nat/mangle совпали с baseline на обоих CHR. Остались3 основные службы, backend healthy. DB controls до/после servers2,speedHistory9,retentionDays14,migrations9; audit revisions намеренно сохранены. Smoke /dashboard,/servers,/uptime?tab=speed,/settings,/filters,/wireguard →200,320px fits,0 page/API errors. Ключи/конфигурации не включались в отчёты/скриншоты/traces/файлы; public JSON проверены. Product source после71 не менялся, общая локальная регрессия не повторялась; выполнены production build и реальные scoped сценарии.
Граница результата: подтверждённый native validation failure после трёх создающих операций, компенсация и ручной успешный retry в production HTTP/UI. Потерянный ответ/HTTP408/500 после commit,потеря процесса,unconfirmed cleanup,concurrent changes и audit DB failure остаются внешними ограничениями; unit71 их не заменяет. Следующий12.5.73 — изолированный audit failure после настоящего apply и truthful состояние applied с собственной WG парой/cleanup. RBAC/IPv6/throughput/multi-instance/PSK/multi-address/unknown-conf поля и остальные протоколы/интеграции остаются открытыми. Доступы и чужая RouterOS конфигурация не менялись. Локальный коммит без push.
## 12.5.71 — подтверждённая очистка частичного импорта WireGuard (2026-10-09)
+15 -1
View File
@@ -1,6 +1,6 @@
# Этап 12: итоговая приёмка UX/UI
Актуальное продолжение 2026-10-09: 12.5.71 локально вынес WireGuard apply в сервис с receipt ownership, native подтверждением и компенсацией подтверждённых отказов. Потерянный ответ/unknown receipt/чужие объекты/неподтверждённая очистка →needs-review без удаления по имени; успешный повтор после rollback и409 повтор после успеха проверены. Apply unit16/16, preflight22/22, HTTP invalid cases, browser6/6, TypeScript/ESLint passed. Runtime остаётся backend/frontend479f2ad. Следующий12.5.72 — backend Docker build/deploy, реальный receipt/partial rejection/cleanup/retry на собственной WG паре; frontend479f2ad сохранить. Этап12.5 открыт.
Актуальное продолжение 2026-10-09: 12.5.72 развернул backend e01454b, frontend479f2ad сохранён. На обоих CHR реальный отказ второго peer400 после iface/IP/peer receipts компенсирован до baseline; реальные UI502 rolled-back сохраняют форму, исправленный повтор200 восстановил handshake/Ping3/3. Cleanup/DB controls/smoke6 страниц passed. Все три сервера доступны с прежними доступами. Следующий12.5.73 — подтверждение применённой конфигурации при отказе сохранения ревизии: изолированный fault scenario и truthful HTTP/UI, собственные WG объекты и cleanup. Этап12.5 открыт.
План: [ux-ui-plan.md](ux-ui-plan.md). Фактические результаты: [ux-ui-progress.md](ux-ui-progress.md). Подготовлен после сводных проверок 11Б; завершение каждого блока требует локального коммита без push.
@@ -1762,3 +1762,17 @@ Route отдельно обрабатывает audit revision failure посл
Проверки apply unit16/16: native receipt успех, baseline read failure0writes, несовпавшая native identity, повтор после успеха409 без mutations, отказ второго peer/адреса с восстановлением baseline, успешный повтор после rollback, lost reply после iface/IP/peer commit,HTTP408/500,missing/foreign receipt,concurrent чужой peer,изменённая identity,отказ/неподтверждённый DELETE. Исходные preflight22/22 и codec/HTTP4 invalid cases passed; новые apply tests включены в backend test:wireguard. Browser6/6: прежние import сценарии и три новых502 состояния rolled-back/needs-review/applied сохраняют текст/server/error; автоматического повторного POST нет; ручной retry после rolled-back принят успешным receipt. HTTP ответы browser подменены, это не real RouterOS cleanup. Backend и scoped frontend TypeScript, ESLint и diff check passed. UI primitives/ReUI composition не менялись.
Исправление локальное: runtime backend/frontend479f2ad из70 не обновлялся; production frontend source не менялся. Следующий12.5.72 — production build/deploy только backend, реальная проверка ROS PUT receipts, поздний native rejection на собственных объектах,cleanup/baseline и исправленный повтор с связностью. Прерванный HTTP/процесс,подлинный audit DB failure,конкуренция/multi-instance,IPv6/throughput/RBAC,PSK/multi-address/unknown-conf поля,интеграции и остальные внешние протоколы остаются открытыми. Пароли/RouterOS конфигурация в этом локальном блоке не менялись. Локальный коммит без push.
## 12.5.72 — реальная компенсация позднего отказа импорта WireGuard (2026-10-09)
Backend e01454b720f92ae8adc1636f7a2092132232dc87 production build/deploy passed; frontend479f2ad оставлен, его container ID до/после совпал. Git archive SHA2566cffbd73c05cf28fded3c80d9c8965a3c22f8f698e33f499fb87f5d21fc2effc; backend src staging совпал с source. Новый image inspect IDsha256:b6d5d7f68a8529ead68d8a676a0def5edfdd6aa9ad485be4b0158c0241ecae46,OCI revision полныйe01454b,version1.0.0-test.e01454b. Module import/state assertion без сети passed, backend healthy,/health HTTP200. Private backup pre-e01454b.dump2364848bytes,0600,pg_restore --list passed; предыдущая.env и образы сохранены только на сервере для отката. SSH161.104.46.222 и RouterOS REST обоих CHR доступны с прежними доступами.
Создана собственная WG пара с уникальным name/comment,51879/1420 и198.18.255.241/30↔198.18.255.242/30; исходные native keys/association/handshake/Ping3/3 подтверждены. Private conf exports с явным Name использованы только в памяти, исходная пара обычным DELETE удалена. Для позднего отказа к каждому conf добавлен повтор того же Peer. Это настоящий native rejection, не fake HTTP response или transport injection.
Supplemental native service run на каждом CHR использовал новый applyWireguardImport и настоящий MikrotikClient. Adapter только записывал method/path/наличие receipt .id/завершение DELETE и делегировал реальные операции; GET retries наследуют harness, mutations не повторяются. Native trace: iface PUT receipt →IP PUT receipt →первый peer PUT receipt →второй peer HTTP400 →DELETE peer/IP/iface. State rolled-back и полный выбранный baseline restored на обоих CHR. Успешные native HTTP-коды не выдумывались: client возвращает body/void, отчёт отмечает completed и receiptIdPresent; status400 получен из реального MikrotikError. Наличие receipt/native identities на этой RouterOS версии подтверждено.
Отдельно реальный production UI/API наCHR1 при1280px иCHR2 при320px: неполный template400 сохраняет форму/server selection, duplicate-peer conf502,state rolled-back сохраняет введённый конфиг и показывает подтверждённую очистку; native observer не нашёл iface/peer/IP на выбранном устройстве. После исправления textarea повтор200 подтвердил applied name/peersCreated=1, Sheet закрылся, интерфейс появился в таблице. Применённая пара прошла native parameter/public identity/private scalar checks, handshake иPing3/3 в обе стороны. Expected UI errors:2×400 и2×502; unexpected API/page errors0,page overflow0. Comments/peer names не переносятся conf, явный Name — расширение parser приложения; byte-for-byte metadata restore не обещается.
[Native service/API evidence](ux-ui/acceptance/wg-import-compensation-native-2026-10-09.json), [production browser failure/retry](ux-ui/acceptance/browser-wg-import-compensation-e01454b-2026-10-09.json), [deploy/DB controls](ux-ui/acceptance/wg-import-compensation-deploy-controls-2026-10-09.json), [smoke6 страниц](ux-ui/acceptance/deploy-browser-e01454b-backend-2026-10-09.json). Финальный fixture exit0, собственные WG/peers/IP/connected routes удалены; выбранные WG/peers/IP/routes/IPv4 filter/nat/mangle совпали с baseline на обоих CHR. Остались3 основные службы, backend healthy. DB controls до/после servers2,speedHistory9,retentionDays14,migrations9; audit revisions намеренно сохранены. Smoke /dashboard,/servers,/uptime?tab=speed,/settings,/filters,/wireguard →200,320px fits,0 page/API errors. Ключи/конфигурации не включались в отчёты/скриншоты/traces/файлы; public JSON проверены. Product source после71 не менялся, общая локальная регрессия не повторялась; выполнены production build и реальные scoped сценарии.
Граница результата: подтверждённый native validation failure после трёх создающих операций, компенсация и ручной успешный retry в production HTTP/UI. Потерянный ответ/HTTP408/500 после commit,потеря процесса,unconfirmed cleanup,concurrent changes и audit DB failure остаются внешними ограничениями; unit71 их не заменяет. Следующий12.5.73 — изолированный audit failure после настоящего apply и truthful состояние applied с собственной WG парой/cleanup. RBAC/IPv6/throughput/multi-instance/PSK/multi-address/unknown-conf поля и остальные протоколы/интеграции остаются открытыми. Доступы и чужая RouterOS конфигурация не менялись. Локальный коммит без push.
+16 -2
View File
@@ -1,6 +1,6 @@
# Тестовый сервер UX/UI — 2026-10-09
Сервер161.104.46.222 предоставлен для временного тестирования. Backend/frontend source479f2adc78b162d7694d9897d201704b51082968/version1.0.0-test.479f2ad обновлены в12.5.70; backend healthy, frontend HTTP200. SSH и оба CHR доступны с прежними доступами. RSC68 и conf с явнымName70 приняты в описанных границах; baseline восстановлен.
Сервер161.104.46.222 предоставлен для временного тестирования. Backend sourcee01454b720f92ae8adc1636f7a2092132232dc87/version1.0.0-test.e01454b обновлён в12.5.72 иhealthy; frontend479f2ad/version1.0.0-test.479f2ad сохранён. SSH и оба CHR доступны с прежними доступами. RSC68/conf70/поздний native отказ с компенсацией и retry72 приняты в описанных границах, baseline восстановлен.
| Параметр | Проверенное состояние |
| --- | --- |
@@ -14,7 +14,7 @@
| PostgreSQL | postgres:18-alpine,18.6;mmapp-test-postgres healthy;SELECT version() passed |
| Данные | Отдельный Compose project mmapp-test,том mmapp-test_mmapp-pgdata и каталог ./data |
| Доступ | PostgreSQL не публикуется;frontend3000/backend8000 привязаны к127.0.0.1 после запуска |
| Образы приложения | mmapp-test/backend:ux-479f2ad и mmapp-test/frontend:ux-479f2ad; запущены |
| Образы приложения | mmapp-test/backend:ux-e01454b и mmapp-test/frontend:ux-479f2ad; запущены |
Compose SHA256:3052bd6ab5d9865f97605cebfb5ff27a4410cd3357b81153a65a87fb7c92582f. OptionalBACKEND_IMAGE_TAG позволяетобновлятьbackendотдельно. Локальный и удалённый файлы совпали. Шаблоны: [Compose](../deploy/docker-compose.test.yml), [env без секретов](../deploy/env.test.example).
@@ -605,3 +605,17 @@ Route отдельно обрабатывает audit revision failure посл
Проверки apply unit16/16: native receipt успех, baseline read failure0writes, несовпавшая native identity, повтор после успеха409 без mutations, отказ второго peer/адреса с восстановлением baseline, успешный повтор после rollback, lost reply после iface/IP/peer commit,HTTP408/500,missing/foreign receipt,concurrent чужой peer,изменённая identity,отказ/неподтверждённый DELETE. Исходные preflight22/22 и codec/HTTP4 invalid cases passed; новые apply tests включены в backend test:wireguard. Browser6/6: прежние import сценарии и три новых502 состояния rolled-back/needs-review/applied сохраняют текст/server/error; автоматического повторного POST нет; ручной retry после rolled-back принят успешным receipt. HTTP ответы browser подменены, это не real RouterOS cleanup. Backend и scoped frontend TypeScript, ESLint и diff check passed. UI primitives/ReUI composition не менялись.
Исправление локальное: runtime backend/frontend479f2ad из70 не обновлялся; production frontend source не менялся. Следующий12.5.72 — production build/deploy только backend, реальная проверка ROS PUT receipts, поздний native rejection на собственных объектах,cleanup/baseline и исправленный повтор с связностью. Прерванный HTTP/процесс,подлинный audit DB failure,конкуренция/multi-instance,IPv6/throughput/RBAC,PSK/multi-address/unknown-conf поля,интеграции и остальные внешние протоколы остаются открытыми. Пароли/RouterOS конфигурация в этом локальном блоке не менялись. Локальный коммит без push.
## 12.5.72 — реальная компенсация позднего отказа импорта WireGuard (2026-10-09)
Backend e01454b720f92ae8adc1636f7a2092132232dc87 production build/deploy passed; frontend479f2ad оставлен, его container ID до/после совпал. Git archive SHA2566cffbd73c05cf28fded3c80d9c8965a3c22f8f698e33f499fb87f5d21fc2effc; backend src staging совпал с source. Новый image inspect IDsha256:b6d5d7f68a8529ead68d8a676a0def5edfdd6aa9ad485be4b0158c0241ecae46,OCI revision полныйe01454b,version1.0.0-test.e01454b. Module import/state assertion без сети passed, backend healthy,/health HTTP200. Private backup pre-e01454b.dump2364848bytes,0600,pg_restore --list passed; предыдущая.env и образы сохранены только на сервере для отката. SSH161.104.46.222 и RouterOS REST обоих CHR доступны с прежними доступами.
Создана собственная WG пара с уникальным name/comment,51879/1420 и198.18.255.241/30↔198.18.255.242/30; исходные native keys/association/handshake/Ping3/3 подтверждены. Private conf exports с явным Name использованы только в памяти, исходная пара обычным DELETE удалена. Для позднего отказа к каждому conf добавлен повтор того же Peer. Это настоящий native rejection, не fake HTTP response или transport injection.
Supplemental native service run на каждом CHR использовал новый applyWireguardImport и настоящий MikrotikClient. Adapter только записывал method/path/наличие receipt .id/завершение DELETE и делегировал реальные операции; GET retries наследуют harness, mutations не повторяются. Native trace: iface PUT receipt →IP PUT receipt →первый peer PUT receipt →второй peer HTTP400 →DELETE peer/IP/iface. State rolled-back и полный выбранный baseline restored на обоих CHR. Успешные native HTTP-коды не выдумывались: client возвращает body/void, отчёт отмечает completed и receiptIdPresent; status400 получен из реального MikrotikError. Наличие receipt/native identities на этой RouterOS версии подтверждено.
Отдельно реальный production UI/API наCHR1 при1280px иCHR2 при320px: неполный template400 сохраняет форму/server selection, duplicate-peer conf502,state rolled-back сохраняет введённый конфиг и показывает подтверждённую очистку; native observer не нашёл iface/peer/IP на выбранном устройстве. После исправления textarea повтор200 подтвердил applied name/peersCreated=1, Sheet закрылся, интерфейс появился в таблице. Применённая пара прошла native parameter/public identity/private scalar checks, handshake иPing3/3 в обе стороны. Expected UI errors:2×400 и2×502; unexpected API/page errors0,page overflow0. Comments/peer names не переносятся conf, явный Name — расширение parser приложения; byte-for-byte metadata restore не обещается.
[Native service/API evidence](ux-ui/acceptance/wg-import-compensation-native-2026-10-09.json), [production browser failure/retry](ux-ui/acceptance/browser-wg-import-compensation-e01454b-2026-10-09.json), [deploy/DB controls](ux-ui/acceptance/wg-import-compensation-deploy-controls-2026-10-09.json), [smoke6 страниц](ux-ui/acceptance/deploy-browser-e01454b-backend-2026-10-09.json). Финальный fixture exit0, собственные WG/peers/IP/connected routes удалены; выбранные WG/peers/IP/routes/IPv4 filter/nat/mangle совпали с baseline на обоих CHR. Остались3 основные службы, backend healthy. DB controls до/после servers2,speedHistory9,retentionDays14,migrations9; audit revisions намеренно сохранены. Smoke /dashboard,/servers,/uptime?tab=speed,/settings,/filters,/wireguard →200,320px fits,0 page/API errors. Ключи/конфигурации не включались в отчёты/скриншоты/traces/файлы; public JSON проверены. Product source после71 не менялся, общая локальная регрессия не повторялась; выполнены production build и реальные scoped сценарии.
Граница результата: подтверждённый native validation failure после трёх создающих операций, компенсация и ручной успешный retry в production HTTP/UI. Потерянный ответ/HTTP408/500 после commit,потеря процесса,unconfirmed cleanup,concurrent changes и audit DB failure остаются внешними ограничениями; unit71 их не заменяет. Следующий12.5.73 — изолированный audit failure после настоящего apply и truthful состояние applied с собственной WG парой/cleanup. RBAC/IPv6/throughput/multi-instance/PSK/multi-address/unknown-conf поля и остальные протоколы/интеграции остаются открытыми. Доступы и чужая RouterOS конфигурация не менялись. Локальный коммит без push.
@@ -0,0 +1,145 @@
{
"date": "2026-10-09",
"backendSource": "e01454b",
"frontendSource": "479f2ad",
"name": "mm-acceptance-wg-1791511858276",
"httpMocks": false,
"cases": [
{
"serverId": "1",
"width": 1280,
"format": "conf",
"incompleteTemplateStatus": 400,
"templateAndServerRetained": true,
"lateFailureStatus": 502,
"lateFailureState": "rolled-back",
"failedFormRetained": true,
"compensatedBeforeRetry": true,
"rejectedTemplateNoNativeObjects": true,
"localPreviewPassed": true,
"selectedServerPreserved": true,
"status": 200,
"receiptConfirmed": true,
"dialogClosedAfterReceipt": true,
"noPageOverflow": true
},
{
"serverId": "2",
"width": 320,
"format": "conf",
"incompleteTemplateStatus": 400,
"templateAndServerRetained": true,
"lateFailureStatus": 502,
"lateFailureState": "rolled-back",
"failedFormRetained": true,
"compensatedBeforeRetry": true,
"rejectedTemplateNoNativeObjects": true,
"localPreviewPassed": true,
"selectedServerPreserved": true,
"status": 200,
"receiptConfirmed": true,
"dialogClosedAfterReceipt": true,
"noPageOverflow": true
}
],
"native": {
"ok": true,
"handshakeConfirmed": true,
"pings": [
{
"serverId": 1,
"received": 3
},
{
"serverId": 2,
"received": 3
}
],
"roundtrip": [
{
"serverId": 1,
"format": "conf",
"explicitNameAdded": true,
"privateKeyPreservedInMemory": true,
"dryRunStatus": 200,
"dryRunNativeUnchanged": true,
"checks": {
"interfacePresent": true,
"interfaceName": true,
"interfaceCommentAbsent": true,
"interfacePrivateScalarEquivalent": true,
"interfacePublicIdentity": true,
"listenPort": true,
"mtu": true,
"onePeer": true,
"peerIdentity": true,
"allowedAddresses": true,
"configuredEndpointAddress": true,
"configuredEndpointPort": true,
"keepalive": true,
"peerCommentAbsent": true,
"address": true
},
"nativeParametersMatch": true,
"interfacePublicIdentityUnchanged": true,
"privateScalarEquivalent": true,
"privateEncodingUnchanged": true,
"linkedAddressAndPeerPresent": true
},
{
"serverId": 2,
"format": "conf",
"explicitNameAdded": true,
"privateKeyPreservedInMemory": true,
"dryRunStatus": 200,
"dryRunNativeUnchanged": true,
"checks": {
"interfacePresent": true,
"interfaceName": true,
"interfaceCommentAbsent": true,
"interfacePrivateScalarEquivalent": true,
"interfacePublicIdentity": true,
"listenPort": true,
"mtu": true,
"onePeer": true,
"peerIdentity": true,
"allowedAddresses": true,
"configuredEndpointAddress": true,
"configuredEndpointPort": true,
"keepalive": true,
"peerCommentAbsent": true,
"address": true
},
"nativeParametersMatch": true,
"interfacePublicIdentityUnchanged": true,
"privateScalarEquivalent": true,
"privateEncodingUnchanged": false,
"linkedAddressAndPeerPresent": true
}
]
},
"pageErrors": [],
"expectedApiRejections": [
{
"path": "/api/wireguard/import",
"status": 400
},
{
"path": "/api/wireguard/import",
"status": 502
},
{
"path": "/api/wireguard/import",
"status": 400
},
{
"path": "/api/wireguard/import",
"status": 502
}
],
"unexpectedApiErrors": [],
"limits": [
"Private CONF configs used only in memory; no traces/screenshots/config files persisted",
"Own conf with explicit Name restored; comments/peer names not retained; no interrupted apply or RBAC tested"
]
}
@@ -0,0 +1,40 @@
{
"date": "2026-10-09",
"backendSource": "e01454b",
"frontendSource": "479f2ad",
"httpMocks": false,
"pages": [
{
"path": "/dashboard",
"status": 200,
"mobileFits": true
},
{
"path": "/servers",
"status": 200,
"mobileFits": true
},
{
"path": "/uptime?tab=speed",
"status": 200,
"mobileFits": true
},
{
"path": "/settings",
"status": 200,
"mobileFits": true
},
{
"path": "/filters",
"status": 200,
"mobileFits": true
},
{
"path": "/wireguard",
"status": 200,
"mobileFits": true
}
],
"pageErrors": [],
"badApiResponses": []
}
@@ -0,0 +1,46 @@
{
"date": "2026-10-09",
"backendSource": "e01454b720f92ae8adc1636f7a2092132232dc87",
"frontendSource": "479f2ad",
"archiveSha256": "6cffbd73c05cf28fded3c80d9c8965a3c22f8f698e33f499fb87f5d21fc2effc",
"backendImage": "sha256:b6d5d7f68a8529ead68d8a676a0def5edfdd6aa9ad485be4b0158c0241ecae46",
"backendHealthy": true,
"backendVersion": "1.0.0-test.e01454b",
"frontendContainerUnchanged": true,
"networkNoneModuleAssertion": true,
"backup": {
"bytes": 2364848,
"mode": "0600",
"pgRestoreListPassed": true,
"retainedOnTestServerOnly": true
},
"before": {
"servers": 2,
"speedHistory": 9,
"retentionDays": 14,
"migrations": 9
},
"after": {
"servers": 2,
"speedHistory": 9,
"retentionDays": 14,
"migrations": 9
},
"mainServices": 3,
"temporaryFixtureContainersRemaining": 0,
"auditRevisionsIntentionallyRetained": true,
"access": [
{
"host": "161.104.46.222",
"available": true
},
{
"host": "194.226.121.150",
"available": true
},
{
"host": "104.165.244.7",
"available": true
}
]
}
@@ -0,0 +1,508 @@
{
"date": "2026-10-09",
"backendSource": "e01454b",
"frontendSource": "479f2ad",
"name": "mm-acceptance-wg-1791511858276",
"subnet": "198.18.255.240/30",
"listenPort": 51879,
"realRouterOs": true,
"changes": [
{
"method": "POST",
"path": "/api/wireguard/interfaces",
"status": 201
},
{
"method": "POST",
"path": "/api/wireguard/interfaces",
"status": 201
},
{
"method": "POST",
"path": "/api/wireguard/peers",
"status": 201
},
{
"method": "POST",
"path": "/api/wireguard/peers",
"status": 201
},
{
"method": "PATCH",
"path": "/api/wireguard/interfaces/1/*1B",
"status": 200
},
{
"method": "PATCH",
"path": "/api/wireguard/interfaces/1/*1B",
"status": 200
},
{
"method": "GET",
"path": "/api/wireguard",
"status": 200
},
{
"method": "POST",
"path": "/api/wireguard/export",
"status": 200
},
{
"method": "POST",
"path": "/api/wireguard/import",
"status": 200
},
{
"method": "POST",
"path": "/api/wireguard/export",
"status": 200
},
{
"method": "POST",
"path": "/api/wireguard/import",
"status": 200
},
{
"method": "DELETE",
"path": "/api/wireguard/interfaces/1/*1B",
"status": 200
},
{
"method": "DELETE",
"path": "/api/wireguard/interfaces/2/*16",
"status": 200
},
{
"method": "DELETE",
"path": "/api/wireguard/peers/1/*1C",
"status": 200
},
{
"method": "DELETE",
"path": "/api/wireguard/interfaces/1/*1E",
"status": 200
},
{
"method": "DELETE",
"path": "/api/wireguard/peers/2/*18",
"status": 200
},
{
"method": "DELETE",
"path": "/api/wireguard/interfaces/2/*19",
"status": 200
}
],
"pings": [
{
"serverId": 1,
"target": "198.18.255.242",
"interface": "mm-acceptance-wg-1791511858276",
"received": 3,
"rows": [
{
"sent": "1",
"received": "1",
"packet-loss": "0",
"time": "54ms644us",
"avg-rtt": "54ms644us"
},
{
"sent": "2",
"received": "2",
"packet-loss": "0",
"time": "54ms831us",
"avg-rtt": "54ms737us"
},
{
"sent": "3",
"received": "3",
"packet-loss": "0",
"time": "55ms56us",
"avg-rtt": "54ms843us"
}
]
},
{
"serverId": 2,
"target": "198.18.255.241",
"interface": "mm-acceptance-wg-1791511858276",
"received": 3,
"rows": [
{
"sent": "1",
"received": "1",
"packet-loss": "0",
"time": "54ms578us",
"avg-rtt": "54ms578us"
},
{
"sent": "2",
"received": "2",
"packet-loss": "0",
"time": "54ms473us",
"avg-rtt": "54ms525us"
},
{
"sent": "3",
"received": "3",
"packet-loss": "0",
"time": "54ms622us",
"avg-rtt": "54ms557us"
}
]
}
],
"cleanup": [
{
"serverId": 1,
"/interface/wireguard": true,
"/interface/wireguard/peers": true,
"/ip/address": true,
"/ip/route": true,
"/ip/firewall/filter": true,
"/ip/firewall/nat": true,
"/ip/firewall/mangle": true
},
{
"serverId": 2,
"/interface/wireguard": true,
"/interface/wireguard/peers": true,
"/ip/address": true,
"/ip/route": true,
"/ip/firewall/filter": true,
"/ip/firewall/nat": true,
"/ip/firewall/mangle": true
}
],
"rejections": [
{
"serverId": 1,
"status": 400,
"dryRun": false,
"nativeUnchanged": true
},
{
"serverId": 1,
"status": 400,
"dryRun": true,
"nativeUnchanged": true
},
{
"serverId": 2,
"status": 400,
"dryRun": false,
"nativeUnchanged": true
},
{
"serverId": 2,
"status": 400,
"dryRun": true,
"nativeUnchanged": true
}
],
"nativeKeyGenerationConfirmed": true,
"connectedState": [
{
"serverId": 1,
"interface": {
"rosId": "*1B",
"appId": "1:*1B",
"name": "mm-acceptance-wg-1791511858276",
"listenPort": "51879",
"mtu": "1420",
"running": "true",
"disabled": "false",
"userComment": "Temporary UX acceptance mm-acceptance-wg-1791511858276"
},
"addresses": [
"198.18.255.241/30"
],
"peers": [
{
"rosId": "*17",
"name": "mm-acceptance-wg-1791511858276-peer",
"allowedAddresses": "198.18.255.242/32",
"endpoint": "104.165.244.7:51879",
"handshake": "1s",
"rx": "180",
"tx": "272",
"disabled": "false",
"userComment": "Temporary UX acceptance mm-acceptance-wg-1791511858276"
}
]
},
{
"serverId": 2,
"interface": {
"rosId": "*16",
"appId": "2:*16",
"name": "mm-acceptance-wg-1791511858276",
"listenPort": "51879",
"mtu": "1420",
"running": "true",
"disabled": "false",
"userComment": "Temporary UX acceptance mm-acceptance-wg-1791511858276"
},
"addresses": [
"198.18.255.242/30"
],
"peers": [
{
"rosId": "*13",
"name": "mm-acceptance-wg-1791511858276-peer",
"allowedAddresses": "198.18.255.241/32",
"endpoint": "194.226.121.150:51879",
"handshake": "1s",
"rx": "124",
"tx": "180",
"disabled": "false",
"userComment": "Temporary UX acceptance mm-acceptance-wg-1791511858276"
}
]
}
],
"handshakeConfirmed": true,
"bidirectionalPingPassed": true,
"catalogMatchesNative": true,
"roundtrip": [
{
"serverId": 1,
"format": "conf",
"explicitNameAdded": true,
"privateKeyPreservedInMemory": true,
"dryRunStatus": 200,
"dryRunNativeUnchanged": true,
"checks": {
"interfacePresent": true,
"interfaceName": true,
"interfaceCommentAbsent": true,
"interfacePrivateScalarEquivalent": true,
"interfacePublicIdentity": true,
"listenPort": true,
"mtu": true,
"onePeer": true,
"peerIdentity": true,
"allowedAddresses": true,
"configuredEndpointAddress": true,
"configuredEndpointPort": true,
"keepalive": true,
"peerCommentAbsent": true,
"address": true
},
"nativeParametersMatch": true,
"interfacePublicIdentityUnchanged": true,
"privateScalarEquivalent": true,
"privateEncodingUnchanged": true,
"linkedAddressAndPeerPresent": true
},
{
"serverId": 2,
"format": "conf",
"explicitNameAdded": true,
"privateKeyPreservedInMemory": true,
"dryRunStatus": 200,
"dryRunNativeUnchanged": true,
"checks": {
"interfacePresent": true,
"interfaceName": true,
"interfaceCommentAbsent": true,
"interfacePrivateScalarEquivalent": true,
"interfacePublicIdentity": true,
"listenPort": true,
"mtu": true,
"onePeer": true,
"peerIdentity": true,
"allowedAddresses": true,
"configuredEndpointAddress": true,
"configuredEndpointPort": true,
"keepalive": true,
"peerCommentAbsent": true,
"address": true
},
"nativeParametersMatch": true,
"interfacePublicIdentityUnchanged": true,
"privateScalarEquivalent": true,
"privateEncodingUnchanged": false,
"linkedAddressAndPeerPresent": true
}
],
"collisions": [
{
"serverId": 1,
"status": 409,
"nativeUnchanged": true
},
{
"serverId": 2,
"status": 409,
"nativeUnchanged": true
}
],
"directNativeCompensation": [
{
"serverId": 1,
"state": "rolled-back",
"calls": [
{
"method": "PUT",
"path": "/interface/wireguard",
"completed": true,
"receiptIdPresent": true
},
{
"method": "PUT",
"path": "/ip/address",
"completed": true,
"receiptIdPresent": true
},
{
"method": "PUT",
"path": "/interface/wireguard/peers",
"completed": true,
"receiptIdPresent": true
},
{
"method": "PUT",
"path": "/interface/wireguard/peers",
"status": 400
},
{
"method": "DELETE",
"path": "/interface/wireguard/peers/*18",
"completed": true
},
{
"method": "DELETE",
"path": "/ip/address/*1B",
"completed": true
},
{
"method": "DELETE",
"path": "/interface/wireguard/*1C",
"completed": true
}
],
"nativeBaselineRestored": true
},
{
"serverId": 2,
"state": "rolled-back",
"calls": [
{
"method": "PUT",
"path": "/interface/wireguard",
"completed": true,
"receiptIdPresent": true
},
{
"method": "PUT",
"path": "/ip/address",
"completed": true,
"receiptIdPresent": true
},
{
"method": "PUT",
"path": "/interface/wireguard/peers",
"completed": true,
"receiptIdPresent": true
},
{
"method": "PUT",
"path": "/interface/wireguard/peers",
"status": 400
},
{
"method": "DELETE",
"path": "/interface/wireguard/peers/*14",
"completed": true
},
{
"method": "DELETE",
"path": "/ip/address/*18",
"completed": true
},
{
"method": "DELETE",
"path": "/interface/wireguard/*17",
"completed": true
}
],
"nativeBaselineRestored": true
}
],
"importedHandshakeConfirmed": true,
"importedPings": [
{
"serverId": 1,
"received": 3
},
{
"serverId": 2,
"received": 3
}
],
"afterBrowser": [
{
"serverId": 1,
"interface": {
"rosId": "*1E",
"appId": "1:*1E",
"name": "mm-acceptance-wg-1791511858276",
"listenPort": "51879",
"mtu": "1420",
"running": "true",
"disabled": "false"
},
"addresses": [
"198.18.255.241/30"
],
"peers": [
{
"rosId": "*1C",
"name": "peer28",
"allowedAddresses": "198.18.255.242/32",
"endpoint": "104.165.244.7:51879",
"handshake": "2s",
"rx": "936",
"tx": "940",
"disabled": "false"
}
]
},
{
"serverId": 2,
"interface": {
"rosId": "*19",
"appId": "2:*19",
"name": "mm-acceptance-wg-1791511858276",
"listenPort": "51879",
"mtu": "1420",
"running": "true",
"disabled": "false"
},
"addresses": [
"198.18.255.242/30"
],
"peers": [
{
"rosId": "*18",
"name": "peer24",
"allowedAddresses": "198.18.255.241/32",
"endpoint": "194.226.121.150:51879",
"handshake": "2s",
"rx": "668",
"tx": "756",
"disabled": "false"
}
]
}
],
"limits": [
"Only own WireGuard interface/peer/IP and connected route changed; no default routes/firewall changes",
"Native service duplicate-peer rejection plus real HTTP/UI failure and retry; explicit Name added; keys/configs only in memory",
"Private/public/preshared keys omitted from report; native generation and peer association checked in memory",
"Handshake and short ICMP connectivity, not throughput, RBAC or interrupted mutation",
"WireGuard audit revisions intentionally retained"
]
}