77 KiB
UX/UI: протокол внешней приёмки 12.5
Статус на2026-10-08: backend8782054/frontendb55588f, backend healthy. 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/интеграции остаются открытыми. Паспорт, журнал.
Паспорт стенда
Перед внешним запуском зафиксировать отдельные PostgreSQL и RouterOS тестовые устройства, версии server/client PostgreSQL и RouterOS, HEAD backend/frontend, роли пользователей, число экземпляров backend/планировщика/отправителей и способ их остановки. Для Telegram использовать тестовый чат, для остальных интеграций — тестовые endpoints и учётные записи. Зафиксировать ожидаемые изменения и способ восстановления стенда.
Пароли, JWT, REUI_LICENSE_KEY, DATABASE_URL, дампы БД и исходные приватные журналы хранить вне Git. В отчёт включать очищенные ответы, ID тестовых объектов, UTC-время, request ID, HTTP-код и проверенные изменения. Контрольный снимок данных должен позволять сравнить состояние до/после; успешный toast без независимой проверки не завершает сценарий.
PostgreSQL и восстановление
| ID | Сценарий | Проверяемый результат | Доказательство |
|---|---|---|---|
| PG-1 | Штатный bootstrap чистой тестовой БД и повторный старт | Миграции 0008/0009 отражены в schema_migrations; constraint допускает pending/processing/unknown/sent/failed; resolution_version неотрицательна. Повторный старт сохраняет данные | Версии, очищенный журнал миграций, контрольные строки и ограничения |
| PG-2 | GET /api/system/database/backup с mm:settings:admin | Архив сформирован pg_dump, открывается совместимым pg_restore; контрольные бизнес-записи/схема присутствуют | Размер/SHA256 архива, список объектов, receipt и предупреждения |
| PG-3 | POST /api/system/database/restore из доверенного тестового архива | Данные тестовой БД соответствуют архиву; последующая запись получает корректный новый ID. UI различает завершение restore и ошибки перезапуска listener/scheduler/event | Сравнение схемы/контрольных записей, проверка последовательностей, HTTP/UI |
| PG-4 | Ошибка внутри реального pg_restore | Восстановление не объявляется успешным. Проверить rollback по контрольным бизнес-строкам и схеме, отдельно проверить последовательности | Ошибка процесса, HTTP/UI и независимые запросы до/после |
| PG-5 | Два конкурентных backup/restore запроса | Advisory lock исключает конкурирующее выполнение; второй запрос сообщает конфликт | Два request ID, HTTP-коды, журнал фактических процессов |
| PG-6 | Длительная фоновая запись и UDP-приём во время подготовки restore | Подтверждена остановка всех writers и отсутствие записей в критическом интервале; после операции потребители восстановлены либо показано предупреждение | Процесс/worker lifecycle, счётчики приёма/записей, состояния jobs |
| PG-8 | Ошибка записи speed snapshot/history и потеря commit acknowledgement | Снимок/история атомарны; неизвестный commit не выдаётся за гарантированный rollback и не вызывает автоматический повтор native test | Состояние PG после восстановления соединения, runId, HTTP/UI |
| PG-7 | Неавторизованный пользователь и обычный settings writer | Backup/restore требуют settings admin, отказ происходит до выполнения процесса | 401/403, неизменные контрольные данные, отсутствие pg_dump/pg_restore |
Реализация: bootstrap, migrations, 0008, 0009, database operation, restore execution.
После12.5.15 приложение используетpg_dump -Fc, проверкуpg_restore --list, генерациюpg_restore --clean --if-exists --file иодинpsql -X --single-transaction --set ON_ERROR_STOP=on -c partition parent preparation -f SQL. Предварительнаяподготовкаиrestore находятсявобщейтранзакции. Транзакционный режим описан в документации PostgreSQL. Проверка пяти байтов PGDMP проверяет заголовок, но не полноту и не доверие к архиву. Для rollback нужен сценарий с ошибкой исполнения restore, а не только отказ HTTP до его начала.
В локальном блоке12.5.8 добавлено ожидание текущих scheduler jobs с закрытием admission, но этот код ещё не развёрнут на стенде673e5ba. Блок12.5.9 добавляет отдельный graceful shutdown worker для database operation, serial flush, pool.end и обязательные acknowledgement/exit0. Локальные protocol tests и настоящий isolated collector/UDP/blocked SQL drain12.5.10 прошли: evidence. Основной код на стенде ещё не обновлён; app-wide quiescence этим не подтверждена. Блок12.5.11 локально добавляет admission/drain всех API handlers иtraffic live streams; новые tests/build passed, на стенде patch не развёрнут. В12.5.12 локально добавлен общий background registry/drain дляbackup/audit/certificate/partition maintenance/cache work, атакжеpause RIPE enqueue. Tests/build passed; В12.5.13 добавленcache invalidation послеуспешногоrestore идоconsumer restart, локальныесовместныеhelpers tests passed. Всяцепочка требуетreal-PG integrated quiescence/restore12.5.14. Основнойстенд покаsource673e5ba. Другие экземпляры/хосты требуют отдельного контроля. PG-6 остаётся открытым до наблюдаемого подтверждения; восстановление стенда выполняется после его получения. Реальные тесты backend, способные очищать таблицы, запускаются только против выделенной тестовой БД.
После bootstrap достаточно следующих запросов чтения для начальной проверки, без вывода секретов:
SELECT id FROM schema_migrations
WHERE id IN ('0008_alert_outbox_outcomes', '0009_alert_outbox_resolution');
SELECT status, count(*) FROM alert_outbox GROUP BY status;
SELECT min(resolution_version), max(resolution_version) FROM alert_outbox;
Очередь уведомлений и Telegram
| ID | Сценарий | Проверяемый результат |
|---|---|---|
| Q-1 | Два конкурентных claim одной записи | Один sender получает право отправить; duplicate claim не отправляет второй запрос |
| Q-2 | Telegram принял сообщение, затем settlement/history transaction отказала | Ответ Telegram не подменяет DB receipt; запись удерживается в unknown/processing, автоматического повторения нет |
| Q-3 | Timeout после возможной отправки | UI сообщает неизвестный исход; сообщение в чате и состояние БД проверяются независимо |
| Q-4 | POST /api/alerts/outbox/:id/retry для unknown с текущим expectedVersion | Одна транзакция переводит запись в pending и увеличивает resolutionVersion ровно на1; stale version даёт409 без нового изменения |
| Q-5 | Повтор processing или unknown без подтверждённой остановки всех отправителей | Processing не разрешается вручную через этот API. Перед повтором unknown зафиксированы остановка всех senders и осознанный риск дубликата |
| Q-6 | Два enqueue с одинаковым dedupe key | В PostgreSQL создана одна запись; нет двух отправок из-за race |
| Q-7 | Нарушение прав, malformed receipt, изменение источника при pending | Отказ до действия; UI сохраняет checkpoint/черновик и не переносит результат в другой источник |
Для Q-1/Q-6 нужны конкурентные соединения реального PG; in-memory DI не доказывает изоляцию. Для Q-2 проверить атомарность status/history при ошибке внутри транзакции. Остановка senders подтверждается процессами/контейнерами и завершением in-flight requests; checkbox, timeout и отсутствие недавних логов достаточным доказательством не являются. Различать принятие Telegram API и прочтение пользователем.
Источники: outbox, delivery, retry, HTTP.
RouterOS и сетевые операции
| ID | Сценарий | Проверяемый результат |
|---|---|---|
| ROS-1 | Bandwidth-test transmit/receive/both на паре тестовых устройств | Реальный REST shape содержит native completion; TX — отправка клиента, RX — приём. Неизмеренная сторона null, измеренный0 сохраняется |
| ROS-2 | Authentication failed, unreachable, busy, disconnect и прерванный тест | Backend не пишет done и не заменяет старые probe averages; error run/HTTP/UI согласованы |
| ROS-3 | Выбранный srcInterface и тест скорости | Независимо проверить маршрут bandwidth-test и interface after-ping. UI не выдаёт выбор Ping-интерфейса за доказательство WAN скоростного теста |
| ROS-4 | Home→JH и JH↔Exit с асимметричной скоростью | Направления DL/UL соответствуют клиентской стороне; model limits применяются к правильному направлению |
| ROS-5 | OSPF preview → действие → перечитывание templates | Preview соответствует исправленным RX/DL и TX/UL. Применение подтверждается фактическим cost; частичный отказ не становится полным успехом |
| ROS-6 | WireGuard/IPsec/GRE/VXLAN/Firewall/BGP/маршруты | Проблема→устройство→форма→подтверждённое действие→возврат сохраняет контекст. Права и повторное нажатие проверены; фактическая конфигурация и connectivity сверены |
| ROS-9 | Смена пары или параметров измерения в каталоге и конкурентное завершение native test | Новый snapshot unknown, старый run сохранён с actual endpoints; enable/reorder сохраняют измеренный0. Проверить row locks/условный UPDATE в реальном PG |
| ROS-8 | Смена пары, интерфейсов, протокола, направления, длительности или удаление speed-пробы до запуска и во время теста | Preflight409 до команды; при поздней смене новый snapshot не перезаписан, actual run сохранён без stale probe association |
| ROS-10 | POST speed-test и последующий GET истории/пробы с разными часовыми поясами браузера и сервера | createdAt сохраняет серверный instant и совпадает с записью; nullable Ping не становится timeout. Это время перед after-ping, не начало bandwidth-test; legacy receipt без createdAt отдельно обозначить в evidence |
| ROS-7 | Удаление/отсутствие доступа/частичный отказ одного устройства | Ошибка не стирает форму, последний снимок и объекты остальных устройств; неизвестные метрики не превращаются в0 |
Для ROS-1/ROS-2 зафиксировать версию RouterOS и очищенный сырой ответ. Строковый status подтверждается по официальному CLI reference; несовместимый REST shape требует отдельной коррекции контракта. Тест скорости способен нагрузить канал — длительность и endpoints выбираются для выделенного стенда. Команды и правила маршрутизации этой UX/UI-серией не расширялись.
Остальные интеграции
| Область | Минимальная реальная проверка |
|---|---|
| MaxMind/RIPE | Валидный ответ, отказ/timeout, свежесть источника и неизвестное значение; реальные данные сверены с тестовыми адресами |
| Portal/Evolution | Настоящие роли/JWT, истечение/отзыв прав, scope приложения и смена backend; отказ происходит до операции |
| Сертификаты/S3/контейнеры | Реальный job/файл/объект и права после receipt; ошибка/частичный исход, восстановление контекста |
| Gitea/CI/релизы | Сборка и delivery в выделенном стенде, отображение фактического статуса и версия. Git-коммиты текущей задачи остаются локальными; публикация — отдельное действие |
BGP-prefix evaluator, отдельное live GRE расписание и recovery processing не считать реализованными по UI или локальным тестам: текущие ограничения описаны в журналах11Б/12.
Запись результата и критерий завершения
Для каждого ID сохранить: HEAD, UTC, идентификатор стенда/версию, роль, исходное состояние, действие, HTTP/native receipt, независимо подтверждённое итоговое состояние, результат passed/failed/blocked, способ возврата стенда и ссылку на очищенное доказательство. Пример строки:
| ID | HEAD / стенд | Доказательство | Результат | Следующий шаг |
|---|---|---|---|---|
| ROS-1 | Заполнить при запуске | Очищенные native rows + GET истории + снимок UI | Не выполнен | Проверить transmit/receive/both |
12.5 закрывается после выполнения обязательных сценариев и разбора отказов на согласованном стенде. Подготовленный протокол, успешные browser/DI tests и автоматический axe-аудит не заменяют внешние результаты или ручную работу со screen reader.
Обнаруженный блокер restore — 2026-10-07
12.5.14 realAPI/sourcef1aac49 навыделеннойPG18.6 подтвердилadmission/drain,ноrestore400 из-заinheritedpartitionPRIMARY KEY при--clean. Evidence/rollback controls. PG-4 подтверждёнвграницахнастоящейSQLошибкииконтрольныхстрок/sequence/constraint; PG-3успех/последующийID иполныйPG-6 непроверены. Следующий12.5.15 исправляеттранзакционнуюочистку. Основнойruntime673e5ba сохранён.
Restore исправлен — 2026-10-07
12.5.15 realAPI200/контрольархива/новыйID3 иinjectedCREATE INDEX400/rollback данных,sequence и1587constraints прошли: evidence. PG-3/4 принятывэтихграницах, Portal/UI/fullchecksum не проверены. Основнойruntime673e5ba сохранён; integratedPG-6/deployment ещёпредстоят. Приrestart ресурсныйcollector попыталсяопрашиватьdisabledserver3; исправление12.5.16.
Политика выключенных серверов — 2026-10-07
12.5.16 по явномувыборупользователя убрал намеренноеHome Router исключение изuptime/RESTping; scheduledspeed игнорируетdisabledendpoint, manualspeedотказдосети. RealPG/CHRматрица passed. Основнойruntime673e5ba не обновлён;integratedPG-6/deployment12.5.17 впереди.
IntegratedPG-6 иdeployment — 2026-10-07
12.5.17 подтвердилsingle-instanceadmission/drainHTTP/UDP/scheduler/backgroundwrite,restore200 ивозобновлениеUDP. Deployment основнойbackend4c12c55healthy/контрольБДpassed,frontend673e5ba прежний. Multi-instance/Portal/browserrestore/остальныеинтеграции требуютпродолжения12.5.18.
RBAC иbrowser restore — 2026-10-08
12.5.18 realJWT/processPG-7 иbrowserrestore200/400/guard/reload прошли. ИзоляцияfrontendпроверяласьмаркеромБД:runtimeURLoverride не менялbakedNextrewrites,поэтомуиспользованавременнаяотдельнаяDocker network/backendalias. Основнойстенднеизменён,temporarycontainers/network/tunnelудалены. PortalSSO/commit-loss/PG-8/остальныеинтеграции ещёнеприняты.
PG-8 — 2026-10-08
12.5.19 realPG/nativeTCP матрица подтвердилаINSERTrollback иclient-sideackfault послереальногоCOMMIT,безложногоfailurewrite/повтора. API502unknown/runId;scheduledreceiptokfalse,история/snapshotdoneсохранены.18scheduler/16persistence/HTTP-RBAC/build passed. Это не физическийTCPdisconnect;browserunknown-speed/deploymentpatch ещё12.5.20. Основнойbackend4c12c55 сохраняется.
Локальный snapshot guard — 2026-10-08
12.5.20 сохраняетlastconfirmedspeed snapshot дляunknown502/совпадающегоrunId.2unit tests/frontendtypecheck passed;browserunknownUX ещёнепроверен,patchнеразвёрнут. Backend4c12c55/frontend673e5ba прежние. Следующий12.5.21 — build/browserunknown/deploymentобоихобразов.
Локальный unknown UX — 2026-10-08
12.5.21: отдельная строка unknown/runId, сохранение snapshot и сверка по идентификатору при чтении истории. 13 браузерных тестов с HTTP-моками/typecheck/ESLint прошли; это не приёмка real browser/PG. Основной backend4c12c55/frontend673e5ba прежний. Следующий 12.5.22 — сборка и проверка обновлённых образов. Полный 12.5 открыт.
Локальный unknown UX — 2026-10-08
12.5.21: отдельная строка unknown/runId, сохранение snapshot и сверка по идентификатору при чтении истории. 13 браузерных тестов с HTTP-моками/typecheck/ESLint прошли; это не приёмка real browser/PG. Основной backend4c12c55/frontend673e5ba прежний. Следующий 12.5.22 — сборка и проверка обновлённых образов. Полный 12.5 открыт.
Real browser unknown и deployment — 2026-10-08
12.5.22: real browser speed unknown подтвердил snapshot42, видимый unknown/runId, reconciliation к SQL history done, снятие предупреждения, native1/POST1/JS0/320fits. HTTP/RouterOS-моков нет; COMMIT acknowledgement fault введён на node-pg boundary, физический network disconnect не проверен. Оба образа8782054 развёрнуты, пять экранов прошли. Основная БД не восстанавливалась, контроль сохранён. Следующий12.5.23 — ROS-8/9: preflight/late-context changes на реальном PG/native. Полный12.5 открыт.
Real speed context — 2026-10-08
12.5.23 ROS-8/9 API/SQL/native evidence: семь preflight409/bandwidth0, enable/reorder сохраняют fixture0; три TCPtransmit3s теста при late change/delete/row lock. Фактическая history done сохранена без stale probe association, новый snapshot null. Scheduler admission закрыт в isolated process до fixture setup; основной backend8782054healthy/история5 сохранены, testprobes0/containerудалён. Browser race и multi-instance открыты. Следующий12.5.24 — browser-смена контекста вторым клиентом.
Browser speed context — 2026-10-08
12.5.24 real browser/native: смена пары/длительности и удаление независимым HTTP-клиентом до native response; UI refresh/reload сохраняет новый контекст без старых скоростей, history done остаётся. Принятые native2/POST[200,200]/JS0/320fits, без HTTP/RouterOS-моков. Ещё один native command выполнен в подготовительном прогоне с неверным UI selector expectation; application auto retry отсутствует. Temporarycontainers/network/3018 закрыты, testprobe удалена; runtime8782054/основнаяhistory5 сохранены. Следующий12.5.25 — ROS-2 authentication failure.
Реальный отказ bandwidth-аутентификации — 2026-10-08
12.5.25 native/API/browser evidence: authentication failed→HTTP502/русская UI-ошибка, history error/TXRXnull; probe previousTX42 сохранён. Native1/POST[502]/refresh/reload/320fits/JS0, без HTTP/RouterOS-моков. Тестовое имя изменялось только в выделенной app DB и восстановлено; RouterOS accounts не менялись. Temporarycontainers/network/3018 закрыты, testprobe удалена; основнаяhistory5/runtime8782054 сохранены. Подготовительный слишком длинныйuser отклонён по длине; accepted run отдельно. ROS-2 authentication failure принят; остальные native failures ещё открыты. Следующий12.5.26 — unreachable destination.
Исправление Next proxy timeout — 2026-10-08
12.5.26 real frontend500/backend error-history выявил30s proxy timeout. Локально proxyTimeout180s; реальная Next proxy regression31s/TypeScript/ESLint passed. Backend сохраняет предыдущий TX42; native can not connect не подтверждён. Runtime8782054 прежний; destination восстановлен/testprobe удалена/temporarycontainers-network-3018 закрыты. Следующий12.5.27 — build/real browser retry/deployment исправленного frontend.
Новый frontend proxy timeout — 2026-10-08
12.5.27 real browser timeout502, frontend deployment, пять экранов passed. Frontendaa7dbdf/proxy180s, backend8782054healthy прежний; MMAPP_IMAGE_TAG=ux-aa7dbdf/BACKEND_IMAGE_TAG=ux-8782054. Основной DBcontrol совпал. Isolatedhost/probe восстановлены/удалены, temporarycontainers/network/3018 закрыты. Это transport timeout, не native can not connect; техническая подпись timeout остаётся ограничением UX. Следующий12.5.28 — ROS-3 interface/address/after-ping.
Интерфейс native test и Ping — 2026-10-08
12.5.28 real ROS-3: reverse2→1 done, bandwidth194.226.121.150/nointerfacebinding, Pingether1/0%loss; metadata source195 не доказываетsourceIPpackets. CHR2 имеет dynamic104/static195, явныйdstinterface предпочитаетstatic. Три1→2 попыткиtimeout, причинаauto-path не установлена; они не приняты. КонфигурацияRouterOS не менялась. Основнойruntimebackend8782054/frontendaa7dbdf/history5 сохранён. UIhint/CLIwhereinterface исправлены локально; browserfixture/typecheck/ESLint passed, не развёрнуты. Следующий12.5.29 — real browserform/deploymentподсказок.
Форма интерфейсов развёрнута — 2026-10-08
12.5.29 real browser form, deployment, пять экранов passed. Frontendf194e72, backend8782054healthy прежний; MMAPP_IMAGE_TAG=ux-f194e72/BACKEND_IMAGE_TAG=ux-8782054. Настоящий inventory/static-IP195, правильныйCLIinterfacefilter/пояснение/320fits/JS0, без моков/native-команд. Основнойcontrol совпал; fixtureprobe/temporarycontainers/network/3018 удалены. Следующий12.5.30 — read-only forward-native диагностика; timeout1→2 не исправлен этим UI-изменением.
Read-only forward диагностика — 2026-10-08
12.5.30 settings/state, jobs, TCP2000 сDebian. Server enabled/authtrue/session0, filter/NAT/mangle0, active main default routes, CPU0; TCP2000 reachable сDebian. ПричинаCHR1→CHR2timeout не установлена. Поздние REST401/CHR2-500 ограничивают дополнительные чтения. Native0/configchanges0, temporarycontainers завершены, mainruntimebackend8782054/frontendf194e72/history5 сохранены. Следующий12.5.31 — CLI/REST/соединения1→2, без изменения адресов и маршрутов.
Текущий доступ CHR2 требует проверки — 2026-10-08
12.5.31 CLI/REST/SSH comparison: CLI3.5s/REST3.0s nativeauthenticationfailed; GETconnections401, SSH2AuthenticationException. Main/testcredentials совпадают, значения не раскрыты. Текущий отказ авторизации подтверждён; причина прежнегоtimeout не доказана. Запрошены актуальные данные или проверкаadmin на104.165.244.7, зависимаяприёмка ожидает ответа. RouterOSconfiguration не менялась, mainruntimebackend8782054/frontendf194e72/history5 сохранён. Независимые12.5 сценарии остаются открытыми.
Доступ восстановлен пользователем — 2026-10-08
12.5.32 API/native1→2, realbrowserdashboard passed. Пользователь восстановил парольCHR2; агентне менялRouterOSaccounts/credentialsприложения. Четыре каталога200/failures0, прежниеошибкиUI отсутствуют; nativeTCPtransmit3s1→2 done/HTTP200/53ms0%loss/однаhistorydone. Mainhistory5→6 намеренно; runtimebackend8782054/frontendf194e72 прежний. Старыеисторическиеошибкине переписаны; источник измененияпароля/все прежниеtimeouts не установлены. ОжиданиедоступаCHR2 снято, следующие12.5сценарии ещёоткрыты.
TCP directions после восстановления — 2026-10-08
12.5.33 receive/both native/API/history passed: две TCP3s команды1→2, HTTP200/done testing, receiveTXnull/RXmeasured, bothTXRXmeasured, Ping53ms0%loss. УникальныеGEThistory строки совпали сAPI; mainhistory6→8 намеренно. Это функциональные значения, неbenchmark. Runtimebackend8782054/frontendf194e72/RouterOSconfiguration прежние. Следующий12.5.34 — ограниченныйUDPtest; остальные12.5сценарии открыты.
UDP native/API/history/UI — 2026-10-08
12.5.34 UDPtransmit3s passed: HTTP200/native done testing, TXmeasured/RXnull, Ping53ms0%loss; independenthistory/realbrowserUDP/done/unknownRX/320fits/JS0. Mainhistory8→9 намеренно. Rate cap не задавался, ограничение поduration3s; packet-deliveryratio/benchmark не заявлены. КонфигурацияRouterOS/пароли/runtimebackend8782054/frontendf194e72 прежние. Следующий12.5.35 — Q-6 PostgreSQL dedupe без реальнойотправки сообщений. Остальной12.5 открыт.
Q-6 dedupe — 2026-10-08
12.5.35 productionenqueue/PG race passed:2blockedINSERTs/receipts true-false/однаpendingстрока/повторfalse. Fixtureудалена/countbaseline восстановлен; dispatcherне запускался/сообщений0, mainruntime прежний. Q-6 принят; следующий12.5.36 — Q-4 unknownretry/version без отправки.
Q-4 retry/version — 2026-10-08
12.5.36 realHTTP/PG passed:2blockedUPDATE/200-409/version0→1; stale409, processing409, ackfalse400, отказанныезапросыне меняютстроку. Fixtureудалена/baselinecount восстановлен, app/pool/containerзакрыты, dispatcherне вызывался/сообщений0. Q-4 принят; Q-5 толькоprocessing-refusal. Runtime/mainhistory9 прежние. Следующий12.5.37 — конкурентныйclaimQ-1; реальныеTelegramdelivery scenarios требуютсогласованногочата/разрешенияна сообщения.
Malformed retry receipt rollback — 2026-10-08
12.5.36.1 realPGtrigger/HTTP500/SQLrollback passed: version2 отклонена, unknown/version0 сохранены. Fixture/trigger/functionудалены, app/pool/containerзакрыты, сообщений0. Runtimeпрежний; полнаяQ-7/Telegramприёмка открыта. Следующий12.5.37 — Q-1claim после проверкилимита.
Q-1 production claim — 2026-10-08
12.5.37 realPG/productiondispatcher passed:2blockedclaims/interceptedsender1/sentfixture1/history1/no duplicatecall. Реальныхсообщений0; fakeTelegramsettings/fetchзамена сняты, fixtureудалена/DBcountbaseline восстановлен. Q-1принятдляодногопроцесса/несколькихPGconnections, не реальнаяTelegramдоставка. Runtimeпрежний. Следующий12.5.38 — SQLsettlementfailure послеfixtureacceptedresponse.
12.5.38 — ошибки сохранения после принятого ответа отправителя (2026-10-08)
Отчёт PostgreSQL: production dispatchPendingOutbox из backend8782054, отдельная БД mmapp_acceptance_20261007. Telegram fetch перехвачен внутри изолированного процесса и возвращает ok=true; реальных сообщений не отправлено.
Реальный BEFORE INSERT trigger отклонил запись истории: транзакция settlement откатилась, outbox перешёл в unknown, история отсутствует. Повторный dispatcher не вызывает отправителя. После явно подтверждённого повторения синтетической записи проверена другая граница: PostgreSQL действительно выполнил COMMIT, затем обёртка node-pg ввела ошибку получения подтверждения. Outbox остался sent с resolution_version=1, история содержит ровно одну строку sent_ok=true; попытка hold не перезаписала подтверждённое состояние. Следующий dispatcher не повторил отправку. Поле result.sent=1 отражает принятый подменённый API-ответ и само по себе не подтверждает сохранение или реальную доставку.
Тестовые outbox/history/trigger/function удалены; исходные настройки Telegram восстановлены из памяти, fetch возвращён, pool и контейнер завершены. Основная БД и runtime не менялись. Это проверка SQL rollback и границы подтверждения COMMIT в одном процессе; физический разрыв соединения и реальная доставка Telegram не проверены.
Следующий блок 12.5.39 — неопределённый ответ отправителя и отказ записи unknown, без реальных сообщений. План, журнал этапа и протокол синхронизированы; локальный коммит без push.
12.5.39 — неопределённый ответ отправителя и отказ записи unknown (2026-10-08)
Отчёт PostgreSQL: production dispatchPendingOutbox из backend8782054, отдельная БД mmapp_acceptance_20261007. Fetch вместо внешнего запроса бросает исключение: это управляемая проверка отсутствия ответа, а не физический сетевой timeout и не доказательство доставки в Telegram.
В первом случае dispatcher вернул sent=0/failed=0/held=1, строка стала unknown без увеличения retry_count, история отсутствует. Повторный dispatcher не вызывает отправителя. Во втором случае реальный PostgreSQL trigger отклонил UPDATE unknown: строка осталась processing, API результата сообщает, что сохранение не подтверждено и автоматического повтора нет. После удаления триггера повторный dispatcher тоже не отправил сообщение. Два вызова перехваченного отправителя соответствуют двум явно подготовленным синтетическим сценариям; реальных сообщений — ноль.
Тестовые записи и объекты БД удалены, исходные настройки Telegram восстановлены из памяти с сохранением точного updated_at, fetch восстановлен, pool и контейнер закрыты. Отдельный SQL-запрос подтвердил ноль fixture-записей, ноль тестовых триггеров и функций для блоков 38–39. Основной стенд не затрагивался. Q-3 принят только на границе поведения production sender/PG; реальный чат, UI этого состояния и многопроцессное восстановление отдельно не проверены.
Следующий блок 12.5.40 — явный отказ отправителя, задержка повтора и исчерпание попыток, без реальных сообщений. Документы синхронизированы; локальный коммит без push.
12.5.40 — подтверждённый отказ и исчерпание попыток отправки (2026-10-08)
Отчёт PostgreSQL: production dispatchPendingOutbox из backend8782054, отдельная БД mmapp_acceptance_20261007. Внешний fetch возвращал явный Telegram отказ ok=false/error_code=400; реального запроса и сообщений не было.
Первая отклонённая попытка сохранила pending/retry_count=1, историю не создала и назначила next_attempt_at через 15 секунд. SQL timestamp проверен относительно времени до и после вызова; немедленный dispatcher не отправил повторный запрос. Чтобы не ждать таймер, только в fixture срок следующей попытки затем перенесён на now(). Вторая отклонённая попытка исчерпала maxRetries=2: failed/retry_count=2, одна история с sent_ok=false; последующий dispatcher больше не отправлял. Синтетический токен в description скрыт как [TOKEN] в сохранённой ошибке и ответе dispatcher.
Fixture outbox/history удалены, исходные настройки Telegram восстановлены из памяти с точным updated_at, fetch восстановлен, pool и контейнер завершены. Основной стенд не затрагивался. Это приёмка реального SQL и production-кода с перехваченным отказом; реальный Telegram отказ, нагрузка и многопроцессная работа не заявлены.
Следующий блок 12.5.41 — браузерная проверка unknown/processing через реальные HTTP и PostgreSQL, без отправки сообщений. Документы синхронизированы; локальный коммит без push.
12.5.41 — браузерная очередь через реальные HTTP и PostgreSQL (2026-10-08)
Отчёт браузера: production backend8782054/frontendf194e72, отдельная БД mmapp_acceptance_20261007. Пять синтетических SQL-состояний pending/processing/unknown/sent/failed, по одной строке; настоящий GET overview возвращает согласованные counts/items. HTTP-ответы в браузере не подменялись. Dispatcher не запускался, scheduler admission закрыт; внешний Telegram fetch дополнительно запрещён.
UI показывает понятные подписи и предупреждение об отсутствии автоматического повтора. Для unknown кнопка доступна, для processing отсутствует. Подтверждение риска требуется до постановки в очередь; отмена и Escape не отправляют POST и возвращают фокус. Управляемое исключение backend overview дало настоящий HTTP500: последний снимок сохранился, после восстановления ошибка исчезла. Reload сохранил SQL-состояния. Панель и диалог помещаются в 320px; итоговые снимки сделаны после завершения обновления и просмотрены: ПК, телефон, подтверждение. Queue HTTP statuses: 200/500/200/200; JS errors=0, retry POST=0, external sender calls=0.
Первый запуск остановлен проверкой маркера БД: Next rewrites закреплены во время сборки, runtime BACKEND_INTERNAL_URL не изменяет их. Для корректной изоляции frontend подключён только к отдельной Docker-сети с alias backend, разрешающим исключительно тестовый backend. Основной backend/БД не менялись. Временные контейнеры и сеть удалены; backend завершился с exitCode=0, журнал очистки подтвердил senderCalls=0/retryPosts=0, независимый SQL подтвердил ноль fixture-строк. Дополнительный SSH-туннель3018 закрыт; основной3000 сохранён.
Границы: AUTH_REQUIRED=false на изолированном loopback стенде; реальные Portal SSO, доставка Telegram, физический отказ PG и успешный UI retry не проверены этим блоком. Следующий 12.5.42 — настоящие JWT/RBAC чтения и повтора очереди на PostgreSQL. Локальный коммит без push.
12.5.42 — настоящие JWT/RBAC очереди на PostgreSQL (2026-10-08)
Отчёт JWT/RBAC: production buildApp/handlers/auth из backend8782054, AUTH_REQUIRED=true только внутри изолированного процесса, отдельная БД mmapp_acceptance_20261007. JWT HS256 подписаны серверным ключом в памяти; подпись, issuer и exp проверяет штатный middleware. Fastify inject проходит настоящий путь приложения и SQL, но не является браузерным запросом или удалённым сокетом.
GET outbox: anonymous, неверные issuer/signature, expired и malformed дают401; отсутствие разрешений, settings:admin без alerts и отсутствие доступа к приложению дают403; alerts:read/write/admin дают200 и реальные counts. Все GET сохраняют строки. Девять отказанных POST дают401/403, не меняют snapshot БД и не вызывают production retry boundary. Неподтверждённый риск даёт400 до boundary; неверная ожидаемая версия даёт409 без изменения. Разрешённые write и admin получают200, две fixture-строки становятся pending/retry_count=0/resolution_version=1. Дублирующий POST со старой версией даёт409 и сохраняет SQL snapshot. Ответы проверены на отсутствие JWT и ключа.
Первый запуск harness остановился до создания fixture: jose отсутствует в production-образе как тестовая зависимость. Для генерации стандартной HS256 подписи использован встроенный node:crypto, production middleware и настройки не менялись. Dispatcher не запускался, scheduler admission закрыт, сообщений не отправлено. App/pool/container завершены; fixture удалены, отдельный SQL подтвердил ноль тестовых строк; остались только три основные Compose-службы.
Границы: реальный Portal login/issuer endpoint не вызывался, браузерный RBAC и доставка не заявлены этим тестом. Q-7 подтверждён для API отказа до действия в этих границах. Следующий блок 12.5.43 — успешный UI retry и сохранение checkpoint при потере подтверждения HTTP в отдельной БД, с запретом внешней отправки. Локальный коммит без push.
12.5.43 — браузерный повтор и потеря подтверждения после COMMIT (2026-10-08)
Отчёт браузера: production backend8782054/frontendf194e72, отдельная БД mmapp_acceptance_20261007, два синтетических unknown-сообщения. Реальные браузерные HTTP запросы и production retry transaction; scheduler admission закрыт, dispatcher не запускается, внешний Telegram fetch запрещён. Изолированный frontend использует отдельную Docker-сеть и alias backend.
Первый POST200 подтверждает только постановку в pending/version1, подпись UI прямо сообщает, что отправка и доставка ещё не подтверждены. Во втором сценарии обёртка production retry бросает исключение после завершённой транзакции: настоящий HTTP500 при фактически сохранённом pending/version1. Диалог и checkbox риска остаются, повтор заблокирован. После отмены, refresh и reload предупреждение о неизвестном результате сохраняется; SQL подтверждает две pending-строки/version1/retry_count0 и ноль истории. Явная проверка результата снимает checkpoint без нового POST. Всего POST:200/500, lostReceipts1, senderCalls0, JS errors0; панель и диалог помещаются в320px.
Скриншоты просмотрены: предупреждение после перезагрузки, диалог после HTTP500. Первое тестовое ожидание внутреннего текста исключения исправлено на штатный production текст «Внутренняя ошибка сервера»; приложение не обязано раскрывать исключение. При пересоздании fixture первый прогон очищен с exitCode0. Итоговые контейнеры/сеть/туннель3018 удалены, backend exitCode0, независимый SQL подтвердил ноль fixture-строк. Основной стенд и RouterOS не менялись.
Границы: управляемый отказ получения receipt после фактического COMMIT, а не физический разрыв сети; AUTH_REQUIRED=false; реальных сообщений и проверки чата нет. Найдена UX-недоработка: внутри открытого диалога generic HTTP500 не объясняет неизвестный исход текущего повтора. Следующий блок 12.5.44 — явное пояснение и профильная проверка диалога. Локальный коммит без push.
12.5.44 — понятное пояснение неподтверждённого повтора в диалоге (2026-10-08)
По результатам реального теста12.5.43 уточнён catch в components/alerts-outbox-panel.tsx. При HTTP500, потере ответа или некорректном receipt ошибка прямо в открытом диалоге сообщает: «Результат повтора не подтверждён. Автоматический повтор заблокирован. Проверьте очередь и чат перед новой попыткой», затем показывает подробность ошибки. API400/401/403/409/422 остаются подтверждёнными отказами: checkpoint снимается, исходная ошибка сохраняется. Правила повторной отправки, права и API не менялись.
Профильный Playwright alerts-outbox.spec.ts:8/8, включая новый HTTP500 сценарий, сохранённый checkbox, disabled retry, reload guard и320px; прежние success, malformed receipt, reader, conflict и focus/cancel проходят. Eslint изменённых файлов и tsc --project tmp/tsconfig-speed-check.json --noEmit passed. Scoped config исключает старые копии исходников в tmp; это не утверждение о чистоте обычного полного tsc. Локальный диалог320px просмотрен. HTTP-ответы в этих локальных браузерных тестах подменены; реальные SQL/HTTP результаты43 сохраняются отдельно.
Применён skill ReUI и MCP get_audit_checklist: композиция, установленные primitives, base-nova и semantic tokens сохранены; новых API/стилей/компонентов нет. Ошибка объявляется существующим role=alert, реальные секреты не добавлены; подтверждение риска и управление фокусом покрыты профильными тестами. Изменение пока локальное, удалённый frontend остаётсяf194e72.
Следующий12.5.45 — production Docker build нового frontend, обновление тестового стенда и повтор сценария HTTP500 после COMMIT на отдельной БД. Локальный коммит без push.
12.5.45 — production frontend с пояснением неизвестного исхода (2026-10-08)
Развёртывание: чистый frontend Git archive из b55588f29b, SHA256 f18be60c1dc8c581e26040003d2c655ee2ae1da73044d761b166ac10dca71a7e совпал после передачи. Docker context повторяет frontend staging main workflow, workspaces ограничены packages; production build, полный TypeScript-check внутри образа и export завершились с exit0. Образ mmapp-test/frontend:ux-b55588f, imageId sha256:c3ce5aa8a3dbed7eaab23178cecbce2b2c1a27c31678590b54bc27db5820e5b1; исходный frontendf194e72 сохранён для отката. .env изменён только MMAPP_IMAGE_TAG, backend8782054 прежний и healthy, frontend опубликован исключительно127.0.0.1:3000. Git/image push не выполнялся.
Повтор реального browser retry: новый production frontend и прежний backend на отдельной PostgreSQL БД, без browser HTTP mocks. POST200/500, второй ответ потерян управляемым исключением после фактического COMMIT. Новый текст прямо в диалоге объясняет неподтверждённый исход и необходимость проверки; checkbox/форма/блокировка сохранены. Обе fixture pending/version1/retry_count0; история0, Telegram calls0. Refresh/reload сохраняют checkpoint, явная проверка снимает его без нового POST. Панель/диалог320px помещаются, JS errors0. Диалог и checkpoint просмотрены.
Smoke основной схемы: dashboard, servers, uptime speed, settings, filters, alerts возвращают200,320px fit, JS errors0/API errors0. Независимый контроль основной БД до/после совпадает: servers2/enabled2, speedHistory9, retention14, migrations9. Новые native тесты или сообщения не запускались. Тестовые контейнеры/сеть/туннель3018 удалены, backend fixture завершился exit0, независимый SQL подтвердил ноль его outbox-строк. Основной туннель3000 сохранён.
Границы: управляемый HTTP500 после COMMIT вместо физического сетевого разрыва; синтетические записи и AUTH_REQUIRED=false в изолированном browser стенде. Реальные Telegram доставка/чат, Portal SSO и multi-instance остаются отдельной приёмкой. Уточнены текущие версии и устаревшая сводка плана/паспорта, исторические записи сохранены. Следующий12.5.46 — браузерные права очереди с настоящими JWT. Локальный коммит без push.
12.5.46 — браузерные права очереди с подписанными JWT (2026-10-08)
Отчёт браузера: production frontendb55588f/backend8782054, отдельная PostgreSQL БД mmapp_acceptance_20261007. AUTH_REQUIRED=true только в тестовом процессе, отдельные синтетические HS256 key/issuer, два браузерных контекста read/write. Штатный backend проверяет подпись и разрешения; browser HTTP-ответы не подменялись. Основные настройки авторизации и ключи не изменялись, реальный Portal не вызывался.
Reader получает очередь и видит disabled retry. Прямой POST через browser fetch с reader JWT даёт403, SQL snapshot не меняется, mutation boundary не вызывается. JWT с теми же write claims, но неверной подписью, получает401 через настоящий HTTP API; строка и счётчик mutation сохраняются. Writer видит доступную кнопку, обязательное подтверждение риска, после него POST200 переводит fixture unknown/version0 в pending/version1/retry_count0. UI подтверждает только постановку в очередь; API принял0, история0. Reader после reload видит подтверждённое состояние.
Всего retry HTTP requests3 (403/401/200), mutation calls1, external sender calls0, JS errors0;320px fit. Читатель и после разрешённого повтора сохранены; экран читателя просмотрен. Тестовая запись синтетическая; scheduler admission закрыт, dispatcher не запускался, Telegram fetch дополнительно запрещён. Writer и reader имеют также необходимые read-права окружающей оболочки, но только writer имеет alerts:write.
Тестовые контейнеры/сеть/туннель3018 удалены; backend завершился exitCode0, cleanup подтвердил1mutation/3POST/0send, независимый SQL — ноль fixture-строк. Основной стенд/БД/RouterOS не менялись. Это подтверждение browser и API RBAC, не реального Portal login или Telegram доставки. Следующий12.5.47 — checkpoint и смена источника при незавершённом повторе. Локальный коммит без push.
12.5.47 — изоляция checkpoint при смене источника во время повтора (2026-10-08)
Отчёт браузера: текущий frontend sourceb55588f в Next dev с поддерживаемым NEXT_PUBLIC_BACKEND_URL=local, два настоящих backend8782054 и разные PostgreSQL БД: A mmapp_acceptance_20261007, B временная mmapp_acceptance_sourceb_20261008. Browser HTTP-ответы не подменялись. Production frontend остаётся same-origin с закреплённым источником; результат этого блока относится к конфигурации local, не к переключению в production.
Два синтетических сценария: нормальный поздний receipt и ошибка producer после реального retry COMMIT. Перед навигацией независимый SQL через контрольный endpoint подтверждает A pending/version1/retry_count0, ответ удержан. При A→B отображается только запись B unknown/version0, её кнопка доступна, checkpoint A и его подписи отсутствуют; БД B неизменна. При возврате в A предупреждение неизвестного результата сохраняется. Освобождение позднего producer outcome не снимает checkpoint и не показывает устаревший успех/ошибку; reload и refresh сохраняют защиту. Явная проверка результата снимает её без нового POST. По одному retry в A на сценарий, B retry0, Telegram calls0, JS errors0,320px fit.
Поздний receipt просмотрен; поздняя ошибка сохранена. Навигация штатно abort-ит старый клиентский запрос; управляемая задержка producer не является физическим разрывом сети или доказательством доставки сообщения. Scheduler admission закрыт, dispatcher не запускался, внешний Telegram fetch дополнительно запрещён. AUTH_REQUIRED=false на изолированных процессах; реальные Portal login и чат не проверены.
Оба backend завершились exitCode0, cleanup подтвердил A retry2/B retry0 и sender0. Независимые SQL-запросы подтвердили ноль fixture-записей в обеих БД. Контейнеры, локальный Next3101 и туннели8018/8019 удалены. Новая БД B удалена после проверки точного имени, владельца mmapp и отсутствия соединений; PostgreSQL подтвердил отсутствие БД. Основной стенд и БД не менялись. Следующий12.5.48 — профильная доступность очереди/диалога на production frontend. Локальный коммит без push.
12.5.48 — доступность production очереди и диалога (2026-10-08)
Отчёт доступности: production frontendb55588f/backend8782054, отдельная PostgreSQL БД, browser HTTP-ответы не подменялись. Axe4.11.3 с WCAG2A/AA,2.1A/AA,2.2AA tags: тёмная/светлая темы ×1280/320px, по четыре области/состояния — очередь, диалог без согласия, диалог с согласием, очередь при ошибке GET. Все16 scoped audits: violations0/incomplete0, passed rules14 для очереди и16 для диалога.
Клавиатура открывает диалог через Enter, Space переключает подтверждение риска и доступность submit. По шесть Tab/Shift+Tab проверок в каждом сочетании подтверждают завершённый перенос фокуса внутри modal; Escape закрывает и возвращает фокус trigger. Асинхронные состояния имеют role=status, ошибка GET — role=alert; после восстановления ошибка исчезает. Панель/диалог помещаются в320px. Светлая тема и тёмная тема сохранены и просмотрены.
Уточнены ожидания harness: сначала готовность доступной кнопки после основной загрузки, затем завершение CSS-анимации перед контрастным аудитом и завершение переноса фокуса через Base UI focus guards. Первый аудит поймал промежуточную прозрачность входной анимации; после её завершения контраст прошёл без изменения продукта. Это аудит устойчивых состояний, не проверка всех кадров перехода. HTTP500 создан управляемым backend overview exception; физический отказ БД не моделировался. Реальная screen reader сессия не проводилась, scoped axe/клавиатура не означают полную WCAG сертификацию приложения.
Retry POST0, Telegram calls0, JS errors0, SQL fixture counts сохранялись во всех сценариях. Dispatcher не запускался, scheduler admission закрыт. Временные контейнеры/сеть/туннель3018 удалены, backend exitCode0, отдельный SQL подтвердил ноль fixture-строк. Основной стенд и данные не менялись. Следующий12.5.49 — сводка Q-матрицы и точные оставшиеся условия реальной внешней приёмки. Локальный коммит без push.
12.5.49 — сводка очереди и оставшихся внешних условий (2026-10-08)
Сверены сохранённые JSON evidence блоков35–48: отчёты читаются, дата2026-10-08 и backend8782054 согласованы; актуальные browser отчёты используют frontendb55588f. Это сводка уже выполненных проверок, новых отправок или сетевых изменений нет.
| ID | Подтверждённый результат | Что остаётся за пределами проверки |
|---|---|---|
| Q-1 | Два production claim на PG дают один вызов перехваченного отправителя и одну историю: 37 | Несколько процессов/экземпляров, настоящая Telegram доставка |
| Q-2 | Реальный SQL отказ истории откатывает settlement; ошибка подтверждения после COMMIT не перезаписывает sent: 38 | Принятый ответ настоящего Telegram API, независимая проверка тестового чата |
| Q-3 | Неопределённый sender response удерживает unknown/processing без auto retry; browser checkpoint переживает HTTP500/reload: 39, 45 | Физический timeout/disconnect после возможной реальной отправки и сверка с чатом |
| Q-4 | Конкурентные retry дают200/409 и одно увеличение версии; старый повтор не меняет БД: 36, 46 | Queue receipt не означает доставку |
| Q-5 | Processing отвергается, обязательное подтверждение риска и блокировка неизвестного исхода работают: 36, 45 | Операционная процедура остановки всех реальных senders, включая несколько экземпляров, перед осознанным повтором |
| Q-6 | Два конкурентных enqueue создают одну строку, повтор возвращаетfalse: 35 | Не отдельное доказательство Telegram delivery |
| Q-7 | Malformed receipt откатывает реальную транзакцию; JWT/read/write защищают API и UI; ABA source isolation сохраняет checkpoint: 36.1, 46, 47 | Настоящий Portal login; source switching проверен в поддерживаемой local-конфигурации, production закреплён same-origin |
| UX/a11y | Dark/light1280/320,16 scoped axe audits, keyboard/focus/error states: 48 | Ручная screen reader приёмка и полная WCAG оценка приложения |
Готовность Telegram: штатный GET alerts на основном тестовом стенде, сохранены только признаки tokenConfigured=false/chatConfigured=false/threadConfigured=false. Токен, chat ID и исходный ответ не сохранялись. Telegram пока не настроен; real-message сценарии не могут быть приняты по подменённым ответам. Для этой ветки нужен отдельный тестовый бот/чат в приложении и явное разрешение на одно конкретное тестовое сообщение; до этого внешние сообщения не отправлять.
Этап12.5 остаётся открытым. Проверенные группы не заменяют остальные PG/ROS/Portal/интеграционные сценарии протокола. Следующий12.5.50 — read-only инвентаризация двух CHR для определения доступных VPN/маршрутизации/диагностики и подготовки оставшихся сетевых проверок; конфигурацию устройств этим шагом не менять. План/паспорт/протокол синхронизированы. Локальный коммит без push.
12.5.50 — инвентаризация двух CHR без изменения конфигурации (2026-10-08)
Отчёт CHR: штатный MikrotikClient из backend8782054, соединения из существующих записей основной тестовой БД, только enabled устройства194.226.121.150/id1 и104.165.244.7/id2. Использованы исключительно GET; post/put/patch/delete в тестовом процессе дополнительно запрещены. Не запускались Ping/bandwidth, scheduler или buildApp. Сырые VPN ответы, ключи и пароли оставались в памяти и не сохранялись/не выводились.
Оба устройства отвечают, RouterOS7.24.5 stable, CHR; оба имеют appType home-router. На каждом прочитаны19 разделов и повторно сверены выбранные конфигурационные поля; вместе с resource78 GET. Все разделы доступны, selectedConfigurationUnchanged=true. Сверка ограничена перечисленными в harness полями, не является полным export или доказательством отсутствия любых внешних изменений.
| Раздел | CHR1 / CHR2 | Следствие для приёмки |
|---|---|---|
| Интерфейсы | 2/2: ether и loopback | Нет VPN-интерфейсов для действий над существующим туннелем |
| IPv4 адреса / маршруты | 1/2 адреса,4/5 маршрутов | Существующая адресация и маршруты сохранены; connectivity этим GET не доказана |
| WireGuard / peers, GRE, VXLAN | 0/0 в каждом разделе | Можно проверить истинное пустое состояние; ROS6 lifecycle/connectivity требует отдельного тестового объекта |
| IPsec | Peers0,active-peers0; на каждом1policy/template | Стандартный template не считать действующим VPN |
| BGP connections/sessions | 0/0 | Для реального сценария нужны тестовый peer и сессия |
| OSPF instances/templates/neighbors | 0/0 | Preview/apply/factual cost в ROS5 пока проверить не на чем |
| IPv4 Firewall filter/NAT/mangle, routing filters | 0/0 | Пустая конфигурация подтверждена; IPv6 и реальные изменения правил не приняты |
| Роли приложения | home-router/home-router | Home→JH и JH↔Exit в ROS4 не подтверждены текущей парой ролей |
Контроль основной БД до/после совпадает: servers2, speedHistory9, retention14. Дополнительный SELECT подтвердил роли home-router. Эфемерный контейнер завершён/удалён, pool закрыт; остались только три основные Compose-службы. Пароли, адресация и правила устройств не менялись. Эта инвентаризация не закрывает ROS4/5/6 или остальные внешние ограничения.
Следующий12.5.51 — проверить реальные пустые состояния, выбор устройства/URL-контекст и доступность форм сетевых экранов на production frontend, без изменения RouterOS. После этого конкретный план создания изолированных тестовых объектов должен сохранять административный доступ и существующую конфигурацию. План/паспорт/протокол синхронизированы; локальный коммит без push.