Files
MikrotikManager/docs/ux-ui-stage-12.md
T

316 KiB
Raw Blame History

Этап 12: итоговая приёмка UX/UI

Актуальное продолжение 2026-10-08: 12.5.29 завершён — frontendf194e72 собран/развёрнут, real browser form/CLI/static-IP priority/320px/JS0 passed без моков и native-команд. Пять основных экранов и контрольБД passed; backend8782054healthy прежний. Следующий12.5.30 — read-only диагностика native bandwidth1→2; forward timeout, multi-WAN и остальные внешние сценарии остаются открытыми.

План: ux-ui-plan.md. Фактические результаты: ux-ui-progress.md. Подготовлен после сводных проверок 11Б; завершение каждого блока требует локального коммита без push.

Блок Проверка и результат Критерий остановки
12.1 Общая оболочка, автоматический аудит доступности, клавиатура/фокус, 320px/ПК и обе темы Исправлены доказанные нарушения, непроверенные состояния перечислены
12.2 Достоверность источников дашборда: неполный BGP, nullable counters/traffic, неверные DTO Unknown/partial не становятся zero/down/empty; last good сохраняется
12.3 Производительность больших списков и таблиц на фиксированных локальных данных Записаны размер fixture, измерения и практические ограничения
12.4 Сквозная регрессия интерфейса, права, context; production/contracts/backend builds и ReUI checklist Итоговая матрица с результатами и точными исключениями
12.5 Внешняя приёмка PG/RouterOS/Telegram/интеграций Протокол тестового окружения; локальные моки не заменяют эту проверку

Сначала воспроизвести предполагаемые проблемы общей оболочки: health popover принимает только status:ok, тогда как shared health допускает подтверждённый legacy ok:true; проверить согласованность. Проверить реальные accessible names header triggers и skip link focus. Использовать установленный axe-core для автоматической части; отсутствие violations не означает полного соответствия или замену screen reader/manual проверки.

Клавиатурный сценарий должен предоставлять эквивалент действий мышью (W3C SC 2.1.1); программные имена/роли/состояния проверяются отдельно (W3C SC 4.1.2). Проверка reflow включает 320 CSS px; широкие таблицы проверяются как отдельные области прокрутки, а не как разрешение переполнения страницы (W3C SC 1.4.10).

Внешние ограничения 11Б сохраняются: migrations0008/0009, PG isolation/CAS/rollback, реальный restore/UDP workers, RouterOS, Telegram, MaxMind/RIPE, Portal/Evolution, CI/Gitea. Processing не разрешается повторять без доказуемой остановки всех отправителей; timeout или checkbox не являются таким доказательством. BGP-prefix evaluator отсутствует и честно обозначен UI; отдельного live GRE расписания нет. Производственный выпуск не разрешён одним успешным browser/DI прогоном.

12.1 — оболочка: контраст, клавиатура и health (2026-10-03)

Подтверждённые нарушения автоматического axe-аудита исправлены на уровнях потребителей: доступный фокус main для skip link; высота toggle правила не менее24px; контраст API badge, подписей групп/Telegram и статуса backend. В открытом системном мониторе значения используют text-foreground, цвет остаётся у значка/полосы; длинная подпись переносится. Установленные ReUI/Base UI primitives и глобальная тема не изменены. Health использует shared getBackendHealth, подтверждённый legacy ok:true согласован с выбором источника; неподтверждённый ответ не становится успехом. axe-core4.11.3 закреплён прямой dev dependency.

Проверки:20 browser сценариев —12 audit комбинаций alerts/settings/releases×320/1440×light/dark,4 открытых monitor/menu, клавиатура skip/apps/monitor с возвратом фокуса, legacy health,2 неподтверждённых health; violations нет. После переноса подписи дополнительно4 открытых слоя.14 профильных layout/settings/release проверок:13 прошли сразу, release fixture встретила transient Windows file lock; исходные bytes восстановлены, ограниченный retry только при записи fixture, повтор всех3 releases прошёл. Typecheck и ESLint изменённых компонентов/тестов прошли. ReUI checklist: сохранены композиции, API props проверены по установленным исходникам; имена/роли, реальные состояния, scroll/security проверены в границах сценариев. Снимки shell-monitor-light/dark-320/1440 добавлены.

Границы: audit охватывает стабильные описанные состояния, не все модалки/формы и не ручную работу screen reader; нет заявления полного соответствия WCAG. Production build и общая регрессия предусмотрены в12.4. Далее12.2.1: строгий BGP catalog на дашборде, partial и nullable counters без подмены нулями; затем остальные источники.

Снимок ПК Телефон
Светлый монитор 1440 320
Тёмный монитор 1440 320

12.2.1 — строгая сводка BGP дашборда (2026-10-03)

Дашборд перешёл с legacy sessions на существующий /api/bgp/catalog и bgpCatalogSchema. Malformed DTO, дубликаты, conflict sessions/failures и переполнение суммы отклоняются до публикации. Failure устройства не становится отсутствием сессий: источник сообщает ошибку, последний успешный KPI/время сохранены. Nullable prefixesRx установленной сессии даёт неизвестные префиксы, неизвестный/custom state — неизвестные префиксы и число установленных сессий; успешный пустой каталог подтверждает0. Exact Established не путается с NotEstablished. ACL проверяется до/после запроса, прежняя revision защита polling сохранена.

Проверки:16 browser dashboard-data/permissions прошли (включая5 invalid/partial кейсов с unknown→success→failure/cache→recovery,2 nullable/state кейса и поздние ответы);3 unit (агрегация/строгий DTO/permission parity), typecheck и ESLint прошли. Новые fixtures содержат полный реальный DTO. ReUI checklist применён: KpiStatGrid сохранён, изменены data/copy, theme/primitives без изменений.

Далее12.2.2: проверить traffic DTO/длины серий без искусственных60 точек и нулей; затем servers/probes/overlay/Internet path. Реальная телеметрия RouterOS остаётся внешней проверкой.

12.2.2 — строгий traffic DTO и агрегация серий (2026-10-03)

Перед публикацией traffic проверяются обязательный servers, уникальные id, конечные неотрицательные rates, совпадающие длины RX/TX и общей оси всех устройств. Ошибочный/missing/null DTO сохраняет последний успешный снимок и время; других источников ошибка не затрагивает. Удалена искусственная минимальная длина60 и дописывание недостающих точек нулями. Успешный пустой каталог даёт пустую историю, существующий chart показывает её штатное пустое состояние.

Проверки:21 browser dashboard/permissions,5 unit dashboard BGP/traffic/ACL, typecheck и ESLint прошли. ReUI chart/KPI композиции сохранены. Обнаруженное ограничение: backend buildTrafficFromSamples сам возвращает0 для ненаблюдавшихся интервалов; строгий reader не может отличить их от измеренного0 без расширения API. Далее12.2.3: добавить совместимые признаки наблюдений и использовать их на dashboard; затем servers/probes/overlay/Internet path.

12.2.3 — наблюдаемость трафика от backend до дашборда (2026-10-03)

/traffic/servers добавляет совместимое observations: независимые признаки RX/TX для последнего снимка и60 временных корзин, реальный sampledAt. Старые числовые поля и default buildTrafficFromSamples сохранены; наблюдаемость opt-in для DTO серверов. Корзина считается измеренной только при валидных дельтах всех включённых интерфейсов; отсутствие, сброс, неверная дата/счётчик и переполнение не подтверждают0. Новые guards не меняют корректные дельты.

Дашборд валидирует masks/timestamp, неизвестные скорости показываются как—, в графике null/разрывы; измеренный0 видим. Legacy ответ без observations принят структурно, но измерения неизвестны с объяснением. По нескольким устройствам любой неизвестный вклад сохраняет неизвестную сумму; время измерения — самое раннее из агрегируемых снимков. Общий ReUI chart поддерживает nullable series; композиция/подписи единиц сохранены, описание отделяет историю и последний измеренный снимок. Другие потребители legacy numeric traffic продолжают прежнее поведение; расширение не является их повторной приёмкой.

Проверки:27 browser dashboard/permissions,12 traffic detail/list (периоды, ошибки, одиночные значения, измеренный0 и пропуски),6 unit BGP/traffic/ACL; backend test:traffic-rate с новыми сценариями empty/single/zero/reset/partial/all interfaces/invalid-time/overflow и совместимостью numeric DTO прошли. Frontend typecheck/lint, backend/contracts build прошли. Не запускалась общая backend suite/реальная БД. ReUI checklist применён к chart/KPI, primitives/theme сохранены.

Далее12.2.4: серверы и пробы дашборда — строгие DTO и unknown статус, затем overlay/Internet path. Реальные RouterOS измерения и внешняя приёмка остаются отдельными.

12.2.4 — строгие каталоги серверов/проб, unknown серверов (2026-10-03)

Servers использует выбранные поля serverReadSchema и строгие id/latency/sessions; probes — обязательные поля, unique id и диапазоны RTT/loss/series/status. Malformed каталоги отклоняются до публикации, сохраняется cache/время источника. Nullable статус сервера отображается как unknown, warning в очереди; offline KPI считает только явно offline, unknown/degraded перечислены отдельно, недоказанное состояние не называется исправным. Sessions обязательны как в реальном DTO; дополнительная WAN информация остаётся совместимой.

Проверки:34 dashboard/permissions browser и8 dashboard unit, typecheck/ESLint прошли. Initial failing unknown fixture был дополнен обязательным sessions реального DTO; финальный прогон34 прошёл. ReUI KPI/queue композиция сохранена, изменены только data/copy. Далее12.2.5: реальные ping наблюдения/временная ось; backend сейчас подставляет100%/down/нули при отсутствии samples, этот блок ещё не устранил такие backend подстановки. Затем overlay/Internet path.

12.2.5 — реальные ping наблюдения и разрывы RTT (2026-10-03)

/uptime/overview совместимо добавляет observations.samples и общие rangeStartAt/rangeEndAt. Сохраняет исходные числовые поля legacy клиентов; metadata содержит реальные отсортированные timestamp/RTT/loss/status без искусственных samples и ограничена концом снимка (поступление нового sample во время чтения не нарушает окно). Дашборд предпочитает наблюдения: legacy/empty становятся unknown/null, измеренный0 остаётся0, реальный down/100% остаётся ошибкой. Malformed/duplicate/unordered/out-of-window samples сохраняют cache. Source freshness показывает фактическое время, неизвестные проверки исключают утверждение «без ошибок» и дают warning/— в KPI; отсутствующий каталог источника не рисует offline.

RTT агрегируется в60 настоящих временных корзин; средний по источнику не дополняется нулями/интерполяцией. Пропуски — null; изолированная точка видима. Нечитаемый на320px SVG заменён установленной композицией ChartContainer/Recharts, как ReUI PRO chart-23 и существующий TrafficRxTxChart; Frame/OpsPanel сохранены. Скорости RX/TX вынесены из заголовка в переносимую строку, перекрытие устранено. Header таблицы «RTT · 1 ч» вместо неверных «60с».

Проверки:40 dashboard/permissions browser прошли после финального chart; дополнительно6 ping сценариев и снимки1440/320.11 unit dashboard (включая sparse axis/unknown/zero/invalid metadata), чистые backend observations assertions, typecheck/ESLint, frontend production/contracts build(34pages), backend/contracts build прошли. ReUI MCP подтвердил chart-23/Chart API; читались установленные исходники, checklist применён; primitives/theme не изменены. Другие uptime страницы продолжают legacy numeric API и этим блоком не переприняты. Реальные PG/RouterOS measurements не тестировались.

Доработка Референс Схема / локальные снимки
Читаемый RTT с пропусками Chart23 Observations → временные корзины → линии/разрывы/точки; 1440, 320
Неизвестное состояние в сводке Stats12 Snapshot → known/unknown → KPI/очередь → объект

Далее12.2.6: strict GRE/WireGuard/VXLAN и device failures на dashboard; затем Internet path и сводная приёмка12.2. Внешние ограничения сохраняются.

12.2.6 — полные каталоги GRE/WireGuard/VXLAN (2026-10-03)

Dashboard читает существующие строгие schemas GRE/VXLAN/WireGuard, требует явный результат failures (реальный backend передаёт его всегда для общего каталога), проверяет уникальность устройств/интерфейсов. Device failures/malformed/missing/duplicate не становятся успешным пустым каталогом: последний снимок соответствующего kind и время остаются, остальные источники обновляются независимо. Unknown status не переименовывается в down; допустимый VXLAN status передаётся напрямую. KPI указывает «последний успешный снимок» при неполном обновлении; очередь не утверждает исправность. Старый сервер с legacy каталогом без failures требует обновления API и получает честную ошибку, а не ложное отсутствие туннелей.

Проверки:49 dashboard/permissions browser (9 новых invalid/partial/cache/recovery cases),3 overlay unit, typecheck/ESLint прошли. Unused callback dependency удалена; installed ReUI/Frame/KPI unchanged, checklist применён. Fixtures содержат полные DTO, включая failures. Далее12.2.7: strict Internet path snapshot/fallback; отдельно устранить swallowed ошибки backend collector до сводной приёмки12.2.

12.2.7 — строгий снимок Internet path и запасные запросы (2026-10-04)

Снимок валидируется до публикации: обязательные коллекции, даты, ссылки на устройства, runtime/route для enabled home. Повреждённый сохранённый null с датой не считается отсутствием снимка. Filters stale/error, malformed speed/WAN и diagnostic error не превращаются в пустые успешные данные. После ошибки сохраняются последний снимок и время; независимые источники обновляются. Настроенный WAN без наблюдаемого default route не создаёт выдуманный маршрут/100 Mbps uplink; состояние unknown.

Проверки:56 dashboard/permissions browser (7 новых cache/recovery cases),4 unit, typecheck прошли; ESLint без ошибок, два прежних unused-helper warning в dashboard-internet-path. ReUI Frame/base-nova и общие компоненты не изменены. Backend collector пока скрывает часть RouterOS ошибок — это обязательный следующий блок12.2.8, затем проверка метрик Internet path и сводная приёмка12.2. Реальный PG/RouterOS не проверен.

12.2.8 — подтверждение полного сбора Internet path (2026-10-04)

Backend больше не скрывает ошибки обязательных GRE/routes/DHCP/address чтений пустыми массивами или null. Pure/DI граница собирает enabled homes и возвращает collectionComplete только после всех обязательных ответов. Неудачный сбор завершается до insert, существующий снимок остаётся; ошибки settings тоже освобождают collecting в finally. Malformed RouterOS rows отклоняются. Повреждённый сохранённый JSON/object даёт HTTP502 вместо успешного null.

Frontend требует collectionComplete:true: legacy сохранённые снимки не доказывают полноту и сохраняют последний подтверждённый cache/ошибку до свежего сбора. Это согласованное изменение backend/frontend, миграция/удаление данных не нужны; при выпуске обновить обе части и дождаться успешного scheduler run. Права и правила сетевых операций не изменены.

Проверки: pure/DI backend (успех, disabled home, ошибки шести readers, отсутствующий route/WAN, malformed RouterOS и stored JSON),4 frontend unit,12 path/permissions browser, frontend typecheck и backend/contracts build прошли. ESLint без ошибок; прежний unused import убран. Реальные PG insert/rollback, RouterOS API и scheduler cycle остаются внешней приёмкой. Далее12.2.9: проверить, не выдаются ли configured capacity/server RTT за измерения отдельных hops; затем сводная приёмка12.2 и12.3 производительность.

12.2.9 — метрики отдельных участков Internet path (2026-10-04)

Configured WAN maxDl/maxUl, общий RTT сервера и GRE эвристики больше не выдаются за наблюдения Home→JH/JH→Exit. Метрики берутся из профильных проб: ping требует дату и отсутствие ошибки, speed — дату/lastStatus:done/отсутствие ошибки. Legacy без metadata и неудачная проба дают неизвестное; ноль остаётся нулём; RX/TX не подменяют друг друга, при обратной пробе направления меняются. Primary и Current используют одинаковую границу подтверждения.

Active WAN выбирается только по наблюдаемому default interface/route; первый configured uplink и просто bound DHCP не доказывают выбор. Summary unknown больше не маркирует Оффлайн. Подпись поясняет, что JH/Exit — кандидаты, а default route подтверждает WAN; карта различает рекомендацию оптимизатора и наблюдаемый default route. Алгоритм сетевых операций/оптимизатора не изменён.

Проверки:61 dashboard/permissions browser, включая4 новых hop-состояния и320px,6 path unit (success/error/undated/zero/directions/unmatched WAN), typecheck и ESLint без ошибок/предупреждений в изменённых frontend файлах. Удалены прежние unused helpers/imports; ReUI Frame/Badge/StatusBadge сохранены. Далее12.3: фиксированные большие fixtures, измерения и ограничения; сводная регрессия12.4 должна включить12.2 и production build. Реальный traffic path/PG/RouterOS не проверен.

12.3.1 — ограничение DOM таблицы серверов (2026-10-04)

На фиксированном каталоге1000 ServerRead (501462 JSON bytes) прежняя таблица выводила1000 строк/41569 DOM nodes. Штатная client pagination ReUI/TanStack теперь выводит50 строк (initial page size50),2644 DOM nodes; поиск/сортировка выполняются по всему каталогу. При выбранном меньшем page size навигация остаётся доступной даже если фильтр даёт менее50 результатов. Малые каталоги при default50 сохраняют прежний вид.

Проверки:36 browser large-servers+servers (права, формы, операции, URL/filters), затем1 расширенный large-case (page size5/фильтр9 результатов/вторая страница/возврат50), typecheck/ESLint прошли. Дев-замеры одного локального Edge прогона: доready3345ms, после1058ms и1543ms; это наблюдение с разной прогретостью dev compiler, не production SLA/статистическая оценка. Полный JSON всё ещё загружается/валидируется на клиенте. ReUI MCP DataGridPagination API и checklist прочитаны; primitives/shared theme unchanged.

Следующий блок12.3.2: большие списки CompactDataGrid/статистика и явная карта оставшихся специализированных таблиц. Этап12.3 целиком ещё не принят;12.4 требует сводной browser/context проверки и production build.

12.3.2 — ограничение DOM общего CompactDataGrid (2026-10-04)

Общая компактная таблица теперь использует штатную client pagination50 строк; сохранены исходные data/columns/row callbacks и загрузка/empty/detail. Навигация сохраняется при выбранном меньшем размере. На1000 строк статистики (88894 JSON bytes массива users) DOM уменьшился12585→1210 nodes, rendered rows1000→50. Доready5195ms, после2928/1195ms в отдельных dev прогонах; прогретость отличается, production SLA не заявляется. Полный ответ и pivot columns по-прежнему находятся в памяти.

Проверки:25 statistics/migrated/catalog/snapshot browser прошли; large-case сначала ошибочно ожидал прямую кнопку последней страницы из нового upstream API, установленная версия использует группы. Тест исправлен под фактические штатные ellipsis controls, повтор1 large-case прошёл (последняя страница, назад, сортировка всего1000 набора,320px). Typecheck/ESLint прошли; ReUI API/checklist изучены, установленный primitive не переписан.

Не считать12.3 завершённым:28 специализированных grids используют manualPagination:true и требуют раздельного разбора (часть получает server page/limit). Скрытые строки AttentionRows тоже всё ещё создаются в DOM. Далее12.3.3: управляемое раскрытие большой очереди проблем, затем профильный разбор специализированных grids/ограничений и12.4 регрессия/build.

12.3.3 — DOM очереди проблем дашборда (2026-10-04)

AttentionRows больше не создаёт весь скрытый список: первые5 всегда видны, native details монтирует следующие50 по запросу, кнопка добавляет по50. Закрытие удаляет скрытые строки и сбрасывает порцию; полный счётчик/ссылки сохраняются. Нет скрытых1000 anchors до действия пользователя. Раскрытие выполняется обычным summary и клавиатурой, используется существующий Button; Frame/AttentionQueue primitives unchanged.

Проверки:62 dashboard/permissions browser (включая1000 проблем: DOM5→55→105→5→55, переход к серверу,320px),20 dashboard unit, typecheck/ESLint прошли. На fixture1000 offline servers начальный dashboard:831 DOM nodes,1081ms ready в одном dev прогоне. Порционное раскрытие может по запросу пользователя постепенно создать весь список; полноценная виртуализация очереди не заявляется.

Далее12.3.4: большой каталог BGP, учитывая сохранение страницы при фоновом обновлении. Другие27 специализированных manualPagination grids и wide pivot остаются отдельными ограничениями.12.4 сводные проверки/production build ещё не приняты; внешняя приёмка не заменяется локальными данными.

12.3.4 — большой каталог BGP и контекст страницы (2026-10-04)

BGP использует штатную client pagination50. При обновлении того же каталога страница сохраняется (autoResetPageIndex:false); при уменьшении результатов индекс ограничивается последней существующей страницей. Сессия из URL открывает соответствующую страницу по pre-paginated row model; изменение сортировки/page size пересчитывает её положение. Client фильтры/сортировка и раскрытие работают по всем данным, права/сетевые операции неизменны.

На фиксированных1000 сессиях DOM25657→1932 nodes, rendered1000→50. Единичные dev ready до2990ms/после898ms не являются production SLA.13 BGP/routing/link/large browser, typecheck/ESLint прошли, включая обновление на странице2, поиск последней сессии, URL последней страницы/детали и320px. ReUI DataGridPagination повторно использован; upstream API и установленная групповая навигация различаются, primitive не менялся.

Доработка Референс Схема
Серверы/CompactDataGrid/BGP Data Grid Filtering2 Полный каталог → поиск/сортировка → страница50 → детали
Большая очередь проблем List9 Полный счётчик → первые5 → раскрыть50 → добавить50 → объект
flowchart LR
  A["1000 строк API"] --> B["Проверка DTO и фильтры"]
  B --> C["ReUI/TanStack: 50 строк в DOM"]
  C --> D["Страница и детали сессии"]
  D --> E["Обновление сохраняет страницу"]

Этап12.3 ещё в работе: остальные27 manualPagination grids/широкие pivot не проверены на1000 строк. Следующий шаг: production build накопленных изменений, профильная регрессия переходов дашборда; затем12.3.5 остальные grids, отдельно Firewall порядок/drag и server-paged traffic без слепой client миграции. Итоговая12.4 и внешняя12.5 не приняты.

Промежуточная регрессия12.2–12.3 (2026-10-04)

Frontend production/contracts build на3978976 прошёл:34 страницы.123 browser после build прошли:20 accessibility shell, GRE/WireGuard/VXLAN/uptime links и операции/права/ошибки,3 больших каталога. Штатные fixtures теперь содержат sessions/failures, BGP catalog, collectionComplete и реальные ping observations; speed fixtures имеют полный nullable metadata. Не ослаблялась проверка DTO ради тестов. Regenerated monitor screenshots восстановлены до прежних проверенных bytes, случайные визуальные diff не включены.

Измерения и точный список27 оставшихся manualPagination grids сохранены в ux-ui-performance.md; это карта последующей приёмки, не объявление всех таблиц исправными. Typecheck/ESLint fixtures прошли.20 dashboard unit и backend pure/DI подтверждены предыдущими блоками; реальные PG/RouterOS не запускались.12.3/12.4/12.5 ещё в работе.

Далее12.3.5: проверка сохранения страницы общего CompactDataGrid при повторном dashboard polling (100 проб), затем uptime ресурсы/speed/schedule большие fixtures. Build должен быть повторён после новых изменений общей основы.

12.2.10 — обязательные поля объектов RouterOS (2026-10-04)

Сборщик Internet path проверяет не только array/string record, но и обязательные поля конкретного источника: route dst-address, DHCP interface, IP address/interface, GRE .id/name/local-address/remote-address. Строковый error record или пустой объект больше не проходят как подтверждённая сущность/пустая маршрутизация/синтетический GRE. Настоящий пустой массив остаётся допустимым; auto local-address0.0.0.0 сохраняется.

Pure/DI профиль дополнен malformed entity/error record/valid empty/valid route/valid GRE; профиль, ESLint и backend/contracts build прошли. Сетевые операции не изменены, живой RouterOS не проверен. Далее завершить12.3.5:89 browser уже прошли после сохранения страницы CompactDataGrid, требуется повторный frontend production build и локальная фиксация этого блока.

12.3.5 — сохранение страницы CompactDataGrid при опросе (2026-10-04)

На100 активных пробах воспроизведено: после получения нового DTO страница2 сбрасывалась на1. Общий CompactDataGrid теперь отключает autoResetPageIndex и ограничивает индекс последней существующей страницей только при сокращении набора. Одинаковый каталог с новыми измерениями сохраняет контекст;100→1 не оставляет пустую страницу. Штатные pagination/filter/sort компоненты сохранены.

Проверки:89 browser dashboard/permissions/large-statistics/statistics/migrated/snapshot прошли, включая воспроизведённый regression и сокращение100→1. Typecheck/ESLint прошли. Повторный frontend production/contracts build после изменения общей основы прошёл:34 страницы; backend/contracts build также прошёл после12.2.10. ReUI validate_usage ok для DataGrid table/recordCount/isLoading/tableLayout/i18n и Frame dense; checklist применён. Предыдущая123 browser приёмка остаётся профильным checkpoint до этого изменения, не общей12.4.

Далее12.3.6: фиксированные1000 ресурсов uptime/1000 speed probes/1000 schedule entries; измерить DOM, проверить URL/детали, pagination/polling/уменьшение набора и права. Использовать карту производительности для остальных27 specialized grids; Firewall порядок/drag и traffic server page требуют отдельной проверки. Затем12.4 полный browser/context прогон и итоговая матрица,12.5 реальные PG/RouterOS/интеграции. Этап12 пока не завершён. Все изменения сохраняются локально, push не выполнялся.

12.3.6 — исходный замер1000 speed probes (2026-10-04)

Штатная fixture collector-probes обновлена под numeric device IDs и каталог имён; старая использовала названия вместо ID, строгий reader правильно отклонял её. Новый large-case измерил1000 строк/23590 DOM nodes,3741ms ready в одном dev прогоне.4 browser профиля (12 speed/sort,11 scheduler jobs/run, demo schedule,1000 speed baseline) и ESLint прошли. Это исходный замер, ограничение DOM speed grid ещё НЕ реализовано; production UI этим блоком не изменён.

Следующий шаг12.3.7: probes-speed-probes-data-grid client pagination/сохранение страницы и URL/операции на1000 пробах; затем1000 uptime resources и расписаний, остальные27 grids из ux-ui-performance.md.12.3/12.4/12.5 не завершены. Последние production frontend/contracts и backend builds прошли в12.3.5/12.2.10. Локальные коммиты, без push.

12.3.7 — пагинация большого списка speed-проб (2026-10-04)

ProbesSpeedProbesDataGrid использует штатную ReUI client pagination по50 строк; обновление сохраняет страницу, сокращение набора ограничивает индекс. Сортировка работает по всему набору. Проверено1000→1, последняя страница20 и320px; небольшой список12 записей и демо-расписание сохраняют поведение.

4 browser collector-probes прошли.1000 строк дают50 rendered rows/739 узлов внутри секции speed-проб,11265 DOM nodes всей страницы,2310ms ready в одном dev прогоне против baseline23590 nodes/3741ms. Каталог1001 устройства в ServerTileRail остаётся полностью в DOM: общая производительность страницы ещё не принята. Полные DTO остаются в памяти; API и правила сетевых операций не менялись. Следующий блок12.3.8:1000 uptime resources; затем каталог устройств/расписания и остальные grids.12.4/12.5 не завершены.

12.3.8 — большой список ресурсов мониторинга (2026-10-04)

UptimeResourcesDataGrid использует ReUI client pagination по50 строк с сохранением страницы при обновлении и ограничением индекса при уменьшении набора. DataGridShell исправлен: pagination выводится также при собственных children/ScrollArea; раньше такой потребитель не получал панель страниц. Установленные primitives и тема сохранены.

1000 ресурсов: baseline1000 строк/38655 DOM nodes/4328ms dev; после50 строк/2580 nodes/1578ms. Проверены глобальная сортировка, страница20, поиск записи1000/URL/reload, обновление страницы2,1000→1,320px и отсутствие POST при чтении по ссылке.8 browser больших таблиц/collector-probes прошли после исправления оболочки;52 прежних uptime links сценария прошли. Первый large-case воспроизвёл отсутствие pagination при children; финальный прогон прошёл. Typecheck/ESLint, frontend production/contracts build (34 страницы), ReUI validate_usage/checklist прошли.

Полные ресурсы остаются в памяти. Этот fixture использует CPU10%, список1000 предупреждений ресурсов ещё не проверен; ServerTileRail остаётся следующим отдельным потребителем. Далее12.3.9: большой список предупреждений ресурсов, затем каталог устройств/расписания и специализированные grids.12.4/12.5 не завершены, реальная PG/RouterOS нагрузка не проверена. Локальный коммит, без push.

12.3.9 — порционный список предупреждений ресурсов (2026-10-04)

Список1000 серверов с CPU90% воспроизведён через обычный uptime overview:2009 warning nodes/4739 nodes страницы. ResourceWarnings применяет существующий шаблон AttentionRows:5 начальных записей,55 после раскрытия,105 после кнопки,5 после закрытия,55 при повторном раскрытии. Счётчик1000 остаётся полным, причины предупреждений и пороги не менялись. Начальная секция21 nodes, вся страница2751 nodes; таблица50 строк.

9 browser ресурсов/URL/reload/320–1440px и отдельный large-case с WCAG-tagged axe audit предупреждений прошли; Enter/summary и порционное раскрытие проверены. Typecheck прошёл. Полный ESLint uptime page имеет исходную ошибку react-hooks/set-state-in-effect в setSpeedDraft после загрузки интерфейсов (подтверждена на HEAD2762f07),6 исходных unused warnings; с временным отключением этого правила остальные правила не дают ошибок. Это ограничение проверки, правило в файле не отключалось. Последний production build —12.3.8, после ResourceWarnings не повторялся.

Следующий шаг12.3.10: устранить исходную ошибку синхронизации speedDraft с доступными интерфейсами, проверить формы и production build; затем ServerTileRail на1000 устройствах и оставшиеся25 grids. Демо GRE schedule хранится только в React state, live отдельного расписания нет:1000 entries пока не проверены.12.4/12.5 не завершены; локальная приёмка не доказывает реальные PG/RouterOS операции. Без push.

12.3.10 — синхронизация интерфейсов формы speed-проб (2026-10-04)

Исходный set-state-in-effect устранён: недоступный интерфейс очищается при получении списка endpoint и при повторном открытии формы с кэшем. Проверка относится только к совпадающему src/dst serverId; активный интерфейс сохраняется. Effect с синхронным setSpeedDraft удалён, правило ESLint не отключалось. Права и подтверждение сохранения API сохранены.

54 browser uptime links прошли, включая2 новых сценария active=false/true с холодной загрузкой и повторным открытием/проверкой PUT. Typecheck и полный ESLint изменённой страницы/тестов прошли без ошибок (6 исходных unused warnings). Повторный frontend production/contracts build прошёл:34 страницы; включает ResourceWarnings12.3.9. Живые интерфейсы RouterOS не проверены.

Следующий блок12.3.11: ограничение DOM ServerTileRail на1000 устройствах с поиском по всему каталогу, выбранным сервером из URL, клавиатурой и мобильным Sheet. Затем оставшиеся25 grids: scheduler ограничен11 job keys, speed history backend limit200, остальные требуют проверки потребителя/API.12.4/12.5 не завершены. Коммит локальный, без push.

12.3.11 — ограничение DOM бокового каталога устройств (2026-10-04)

ServerTileRail сохраняет существующую композицию Frame/Item/List9, а страницы управляются штатными TanStack v9/DataGridPagination. До50 устройств в DOM, поиск по полному каталогу, группировка по площадкам и выбор из URL сохранены. Home/End/стрелки открывают страницу выбранного устройства; ручное перелистывание не меняет URL и сохраняется при повторном получении каталога. Эффект выбора использует стабильный setPageIndex: объект useTable в v9 меняется при рендере и иначе возвращал страницу назад. ID карточек уникальны для desktop/mobile, активный descendant указывается только для смонтированной карточки своего списка.

1000 speed probes/1001 устройства: вся страница11265→1778 DOM nodes,50 строк speed grid/739 nodes секции; dev ready1016ms в одном прогоне. Rail<=50 устройств,<=1200 nodes; открытый Sheet также ограничен50. Проверены последняя страница/URL, Home/End/ArrowDown, поиск записи1000, refresh страницы2, граница двух площадок,320px/возврат фокуса. На снимке исправлены растущий footer и длинное многоточие. Axe выявил контраст EN: ServerTypeBadge теперь text-foreground с прежним цветным фоном. Повторный WCAG-tagged audit mobile обеих тем прошёл; снимки просмотрены.

47 browser BGP/диагностика/collector-probes прошли после финальной правки, Typecheck/ESLint и frontend production/contracts build(34 страницы) прошли. ReUI validate_usage/checklist применены; primitives/theme не изменены. Полный список остаётся в памяти; это pagination, не серверная выборка/виртуализация. Общая регрессия ещё не завершена: main config содержит1091 тест в163 файлах.

Следующий блок12.3.12: проверить тот же эффект зависимости от объекта table в BGP при выбранной сессии из URL и ручном переходе страницы. Затем общая регрессия12.4 по группам и оставшиеся25 специализированных grids;12.5 внешняя PG/RouterOS приёмка отдельно. Без push.

12.3.12 — ручная страница BGP при выборе сессии из URL (2026-10-04)

Воспроизведён возврат со страницы19 на20 после ручного Previous при selectedSessionId из URL. Эффект BGP больше не зависит от меняющегося объекта useTable: используются стабильный setPageIndex и вычисленный индекс выбранной сессии. Глобальная сортировка и первичное восстановление выбранной сессии сохранены; ручная страница19 сохраняется при refresh, reload восстанавливает linked session на20.

16 browser BGP/data/links/1000 sessions прошли после исправления; Typecheck/ESLint и frontend production/contracts build(34 страницы) прошли. Метрики BGP50 строк/1932 nodes остаются. Реальный BGP/RouterOS не проверен.

Следующий шаг12.4.1: общий main browser прогон (1091 тест в163 файлах) с JSON отчётом; ограничить ранние падения20, затем разобрать причины и профильные повторы. Это проверка после изменения общей основы;12.3 ещё имеет25 specialized grids и широкую pivot для проверки. После main — context конфигурации и итоговая матрица;12.5 внешняя приёмка отдельно. Без push.

12.4.1 — общая регрессия и актуальные fixtures (2026-10-04)

Main Playwright/Edge на c4110fa:1091 сценарий в163 файлах,1088 passed/3 failed/0 skipped/0 flaky,24.9 минуты,workers1/retries0. Все три падения воспроизведены как устаревшие fixtures: admin-tables обслуживал legacy /api/certificates вместо /api/certificates/state; Filters ожидал демо Community, не предоставляя подтверждённый Evolution catalog. Fixtures обновлены по strict schemas; keyboard/SAN/sort/write assertions сохранены. Повтор обоих файлов:6 passed. Полный прогон после fixtures не повторялся: production код не менялся; это1088 успешных сценариев общей регрессии плюс исправленные3 в профильном повторе, а не новый единый1091/1091 прогон.

Typecheck и ESLint двух изменённых файлов прошли. Production/contracts build34 страницы ранее прошёл на том же production HEAD c4110fa. Исходный отчёт сохранён в main-regression-2026-10-04.json, новые просмотренные снимки rail320px — в docs/ux-ui/screens/large-server-rail-dark-320.png и large-server-rail-light-320.png. Перегенерированные исторические screenshots восстановлены; чужие изменения не включены. Карта производительности уточнена по фактическим backend caps (scheduler11/flows50/speed history200/pivot51×16 с Other); большие browser профили оставшихся25 grids и pivot ещё требуются.

Следующий блок12.4.2: единый последовательный context прогон23 исключённых файлов с backend URL local, затем backend-switch. После context — оставшиеся границы производительности12.3 и матрица builds/checklist.12.5 реальная PG/RouterOS/интеграционная приёмка отдельно. Локальный коммит, без push.

12.4.2 — context-регрессия и чистые проверки источников (2026-10-04)

Новая playwright.ux-context.config.ts переиспользует основной список23 testIgnore как testMatch, добавляет backend-switch.e2e.ts и запускает24 файла последовательно на3101 с NEXT_PUBLIC_BACKEND_URL=local. Индивидуальные конфигурации сохранены.205 passed/0 failed/0 skipped/0 flaky,7.0 минут,Edge/workers1/retries0. Проверены поздние чтения/записи при backend/demo/ABA, scoped unknown checkpoints, health, фоновые jobs/экспорт и смена контекста сетевых объектов. Отчёт: context-regression-2026-10-04.json.

28 unit-проверок прошли:8 lib dashboard/Evolution профилей и4 чистых/DI backend профиля traffic-rate/BGP parser/OSPF values/Internet path snapshot. Реальная БД, migrations и сетевое применение не запускались. Typecheck и ESLint новой конфигурации прошли. Production код с момента c4110fa не менялся; frontend/contracts build34 страницы на нём принят.12.4 ещё требует итоговой матрицы и backend build;12.3 — оставшихся специализированных границ. Внешние ограничения12.5 остаются.

Следующий блок12.3.13: browser профиль широкой pivot51×16 (50/15 cap + Other), глобальная сортировка/последняя страница/refresh/320px/переход к двум измерениям и возврат. Затем speed history200 и probes-schedule по фактическому API. Коммит локальный, без push.

12.3.13 — широкая pivot и доступные действия ячеек (2026-10-04)

Профиль фактического backend cap51×16 (50 строк/15 колонок плюс Other) воспроизвёл отсутствие горизонтальной области прокрутки. CompactDataGrid получает отдельную horizontalScroll опцию со штатными DataGridContainer/DataGridScrollArea/DataGridTable; включена только у StatisticsPivotGrid. Pagination остаётся за пределами ScrollArea через DataGridShell. Primitive/theme не менялись. Агрегаты Other теперь текст, не кнопки без действия; имя обычной кнопки содержит оба измерения, значение и действие.

Fixture17311 JSON bytes,50 строк в DOM; после исправления2574 nodes/1017ms dev ready на1440 и2313/762ms на320. Это единичные dev наблюдения, не SLA. Проверены page2 с Other, сортировка всего51-row набора, scrollLeft до крайних колонок, отсутствие page overflow, Enter→userId50/service15, подтверждённый GET с двумя параметрами, Back/reload, отсутствие POST. В отчёте нет обещания сохранения page при refresh: отдельного refresh у статистики нет, reload восстанавливает URL и начальную страницу.

24 browser statistics/large/migrated-tables прошли; финальные2 pivot повторены после типизации injected axe. Tagged WCAG axe области grid прошёл на320/1440; снимки просмотрены. Typecheck/ESLint и production frontend/contracts34 страницы/backend build прошли. Main/context отчёты12.4.1/12.4.2 относятся к предыдущему production HEAD; эта локальная delta проверена профильными24+2, общая регрессия после неё не повторялась.

Следующий блок12.3.14: проверить200 speed-test history по реальному backend cap, ограничить строки DOM и сохранить сортировку/страницы/320px. Затем probes-schedule и оставшиеся специализированные grids;12.4 итоговая матрица/12.5 внешняя приёмка ещё не завершены. Локальный коммит без push.

12.3.14 — история200 speed-test запусков (2026-10-04)

История GET runs имеет backend limit200. Baseline200 rows/7583 DOM nodes/1339ms dev ready на fixture73075 JSON bytes. Штатная client pagination50, autoResetPageIndex=false и clamp при сокращении дают50 rows/2361 nodes/1271ms в финальном прогоне. ReUI ScrollArea открывает крайние колонки на320px, footer остаётся вне области прокрутки. Правила запуска сетевых операций не менялись.

Проверены page4 с первой записью, глобальная числовая сортировка TX, refresh на page2 без сброса,200→1/clamp, scroll/reflow320, tagged axe grid и отсутствие POST при refresh Speed.54 existing uptime browser прошли; новый профиль первоначально использовал неверное имя refresh («Обновить данные» вместо «Обновить»), после исправления прошёл полностью. Typecheck/ESLint и production frontend/contracts build34 страницы прошли. Снимок просмотрен. Повтор полного main/context после этой delta не выполнялся; отчёты12.4 сохраняют границы HEAD.

Статический аудит следующего grid: ProbesScheduleDataGrid используется только в demo ScheduleTab (INIT_RULES3), live использует уже ограниченный ProbesSpeedProbesDataGrid. Следующий блок12.3.15 — проверить1000 speed probes непосредственно в live расписании диагностики, refresh/error cache/уменьшение; не создавать вымышленное live GRE расписание. Затем admin/network grids. Отдельное ограничение достоверности истории: reloadSpeedData очищает обе коллекции при отказе одного GET, backend legacy rates использует null→0. Эта приёмка ограничивает DOM, не принимает указанное поведение данных; оно требует отдельного fullstack блока после профилей. Локальный коммит, без push.

12.3.15 — live расписание1000 и отказ на последней странице (2026-10-04)

Уточнён consumer: ProbesScheduleDataGrid только demo/INIT_RULES3; live /probes использует ProbesSpeedSchedule→ProbesSpeedProbesDataGrid, уже принятый на1000 в12.3.7. Существующий большой профиль усилен проверкой503 на page20:50 строк и951–1000 из1000 остаются, полученное время не обновляется, отображается последний успешный список. Recovery1000→1 очищает ошибку и clamp страницы, POST не отправляется. Не добавлялось вымышленное live GRE расписание.

15 browser collector-probes/probes-schedule прошли: включает initial unknown/malformed/timeout/permissions/320px, demo device/tunnel selection и Rail1001 обе темы/границу площадок.1000 live rows:50 DOM rows/739 nodes секции/1778 page nodes/938ms dev ready. Typecheck и ESLint теста прошли. Production код не менялся с e5cf057; build34 страницы принят в предыдущем блоке. Исторические generated screenshots восстановлены.

Следующий блок12.3.16:certificates1000 через strict per-device state, pagination/поиск всего каталога/числовая сортировка/детали/refresh/уменьшение/320px. Далее users/backups/network grids; отдельная достоверность speed history остаётся в12.3.14.12.4 итоговая матрица и12.5 внешняя приёмка не завершены. Локальный коммит без push.

12.3.16 — каталог1000 сертификатов и refresh деталей (2026-10-04)

Fixture strict per-device certificatesStateSchema,1000 сертификатов одного устройства/329034 JSON bytes. Baseline1000 rows/29666 DOM nodes/2689ms dev ready; после client pagination50 и горизонтального ReUI ScrollArea:50 rows/2145 nodes/1098ms. autoResetPageIndex=false/clamp сохраняют страницу и корректно сокращают1000→1. Воспроизведено закрытие SAN при refresh: autoResetExpanded=false сохраняет детали по стабильному составному ID устройства/RouterOS.

Проверены page20/Enter/SAN, refresh страницы и раскрытия, поиск записи1000 по полному каталогу с URL/server/reload, глобальная числовая сортировка срока, ScrollArea/reflow320, tagged axe grid, сокращение и отсутствие POST. После последней production правки19 из20 browser прошли; narrow layout прерван разовой UNKNOWN open PNG ошибкой Windows. Повтор всех3 layout прошёл без изменения UI. Typecheck/ESLint и production frontend/contracts build34 страницы прошли. Снимок просмотрен; из-за горизонтальной прокрутки имя строки уходит из видимой области — следующий UX блок сохраняет идентификацию строк.

Следующий блок12.3.17: штатное закрепление колонки имени сертификата и измерения pivot при horizontal scroll, проверить доступ к остальным ячейкам на320px/ПК. Затем users/backups/network grids. Осталось23 manualPagination:true файла, включая demo-only и bounded источники; это не23 доказанных дефекта. Достоверность speed history, итоговая матрица12.4 и внешняя приёмка12.5 остаются. Коммит локальный, без push.

12.3.17 — идентификатор строки при горизонтальной прокрутке (2026-10-04)

Имя сертификата и измерение pivot закреплены штатным TanStack columnPinning/start и ReUI columnsPinnable. CompactDataGrid получает optional pinnedColumnId и размеры колонок; default consumers сохраняют прежний режим. Мобильные размеры проверены по реальным bounding boxes: имя160/status120 для сертификатов, измерение140/метрики и итог110 для pivot. Ранние180/150 ширины перекрывали часть значения на320px; финальные размеры устраняют это. Дублирующий status icon в имени сертификата скрыт только на телефоне, полное имя остаётся в title/details.

Scoped scroll-padding-inline-start на viewport обеспечивает видимость кнопки ячейки при keyboard focus возле закреплённого измерения. Проверены полностью видимые статус/итог/действие вне pinned области, границы имени, Enter→двойной срез,320/1440/axe/sort/search/refresh/expanded/1000→1.29 browser в7 файлах прошли после финальной правки. Typecheck/ESLint и production frontend/contracts34 страницы прошли. Снимки сертификатов/pivot/history обновлены и просмотрены. Повторяющаяся UNKNOWN open historical PNG в certificate-layout устранена использованием штатного info.outputPath: текущие layout артефакты отдельно от сохранённых исторических снимков, assertions не ослаблялись.

Следующий блок12.3.18:users1000 через strict API, пагинация/весь поиск/refresh деталей/ошибка и восстановление/правильный пользователь в действии/320px. Затем backups/network grids; достоверность history из12.3.14 и финальная матрица12.4 остаются. Полный main/context после delta ещё не повторён;12.5 внешняя приёмка отдельно. Локальный коммит без push.

12.3.18 — каталог пользователей1000 и поиск по всему списку (2026-10-04)

Strict appUserReadSchema fixture1000/263680 JSON bytes. Baseline1000 строк/37505 DOM nodes/2174ms dev ready; после client pagination50:50 строк/2393 nodes/921ms. Поиск по имени, логину и email добавлен через общую DataPageToolbar, фильтрует весь каталог. KPI и данные формы остаются полными; поиск локальный, без URL persistence. Stable ID/autoResetPageIndex=false/autoResetExpanded=false и clamp сохраняют страницу и детали при refresh/503 и корректно сокращают1000→1.

Штатные ReUI ScrollArea и pinning имени180/actions106 обеспечивают полностью видимые действия на320px; декоративный avatar скрыт на телефоне. Проверены page20, клавиатура/детали, ошибка и recovery, глобальные поиск и сортировка, правильный пользователь в форме после sort, возврат focus, отсутствие POST, reflow и tagged axe.32 browser users-data/layout/operations/large-users прошли; TypeScript и ESLint без ошибок. Мобильный снимок просмотрен. Production build прошёл:34 страницы и contracts.

Следующий блок12.3.19: backups1000, проверка фактического источника/пагинации/поиска/refresh/действий/320px. Осталось22 manualPagination:true файла, включая ограниченные и demo источники. Достоверность speed history и финальная матрица12.4 остаются; внешняя приёмка12.5 отдельно. Коммит локальный, без push.

12.3.19 — резервные копии1000 и возврат фокуса (2026-10-04)

GET /backups/listBackups возвращает весь каталог без DB cap. Fixture1000 проходит backupItemDtoSchema,171812 JSON bytes. Baseline1000 rows/43580 DOM nodes/2626ms dev ready; финально50 rows/2462 nodes/898ms. Client pagination50/autoResetPageIndex=false/clamp, полный search/Filters до pagination, штатный ReUI horizontal ScrollArea и pinning filename. Проверены page20/refresh/503 cache/recovery, весь поиск с URL/reload, числовая глобальная сортировка,1000→1, отсутствие запросов записи,320px и tagged axe.

На телефоне действия постоянно видимы и имеют явный минимум44px; rem-based size-11 при root font-size проекта давал около40px. Имя110/actions176 сохраняют видимость всех трёх кнопок в реальном viewport266px внутри Frame. Декоративная иконка хранения удалена из имени: статус остаётся в отдельной колонке. Воспроизведена потеря focus после отмены: cell renderer remount менял элемент. Штатный finalFocus разрешает тот же стабильный row/action, при удалении строки fallback на Обновить; проверены оба диалога и правильный filename после sort.

После финального production кода39 из40 browser прошли, narrow layout прерван Windows UNKNOWN open historical PNG. Backups layout и dialog layout теперь пишут info.outputPath, assertions сохранены; повтор layout+large4 passed. TypeScript/ESLint и production contracts/frontend34 страницы прошли. Мобильный снимок просмотрен. Осталось21 manualPagination:true файла; это не21 доказанный дефект. Следующий блок12.3.20: строгая достоверность speed history и независимые состояния чтения, затем network grids/финальная матрица12.4;12.5 внешняя приёмка отдельно. Коммит локальный, без push.

12.3.20 — независимое чтение speed-проб и истории (2026-10-04)

Promise.all с общей очисткой заменён независимыми обработчиками каждого GET: готовый ресурс появляется без ожидания второго, при API/malformed array ошибке прежний список и receivedAt сохраняются. На speed вкладке видны freshness и отдельные ReUI warning alerts. Первоначально неизвестный список не выдаётся за пустой: нет ложного Нет speed-проб, KPI показывают —. Revision/context/write guards исключают поздние ответы прежнего чтения.

58 из59 browser uptime-links/large-history/new-data прошли; первоначальный race fixture задерживал только первый GET, а StrictMode запускает две initial волны. Исправлено задержкой всей старой волны и ожиданием реально полученного позднего ответа; все4 новых browser прошли. Проверены оба initial failures, partial success,503/malformed/cache/freshness/recovery и late response. TypeScript/ESLint без ошибок (9 исходных предупреждений uptime страницы), production contracts/frontend34 страницы прошли. DOM history200 остаётся50 rows/2343 nodes в этом dev профиле.

Это приёмка состояний чтения, а не полного DTO: legacy backend null→0 и fallback status/protocol остаются. Следующий блок12.3.21: общий строгий контракт speed history, сохранение null rates от DB до grid/KPI, pure mapper/unit и browser неизвестных/ошибочных значений. Затем большие network grids и итоговая матрица12.4; внешний12.5 отдельно. Коммит локальный без push.

12.3.21 — строгая история скорости от DB до UI (2026-10-04)

Общий speedHistoryResponseSchema в contracts проверяет обязательные rates, finite/nonnegative или null, enums status/protocol/direction, duration/date/server IDs и уникальность run IDs. Pure mapSpeedHistoryRun сохраняет null rates и реальные нули; PostgreSQL timestamp нормализуется в ISO без изменения времени. Backend больше не подменяет неизвестные поля status=done/protocol=tcp/direction=both/duration=10/rate=0: некорректная запись возвращает502 с понятным сообщением. DB cap200 сохранён, миграция БД не требуется.

Frontend safeParse отклоняет invalid/duplicate данные и сохраняет последний успешный список/receivedAt по12.3.20. History grid показывает Неизвестно для null, sortUndefined=last; KPI maximum использует только известные rates. Связанная карточка speed-пробы не подставляет прежние999 Мбит/с вместо null нового результата и не объявляет done только по timestamp. Подтверждённый0 остаётся0. Контракт rates теперь number|null: backend/frontend должны обновляться вместе; сетевые write/start операции не менялись.

60 browser uptime-links/history200/speed-data прошли после финальной production правки; ещё5 speed-data после добавления320px/no overflow/снимка прошли.4 pure mapper/schema tests без PG прошли; typecheck/ESLint без ошибок (9 прежних предупреждений uptime), backend build и production frontend/contracts34 страницы прошли. Мобильный снимок просмотрен. Реальное чтение PG/RouterOS не проверялось. Большая history200:50 rows/2367 DOM nodes/1150ms dev ready, не SLA.

Следующий короткий блок12.4.3: delta context users/backups после их pagination/search/focus изменений, зафиксировать проверенный HEAD. Затем12.3.22: строгий speed-probes DTO и смена источника данных; независимые read states не заменяют эту проверку. Далее network grids и итоговая общая матрица12.4. Полный main/context после последних delta ещё не повторялся;12.5 внешняя приёмка отдельно. Коммит локальный без push.

12.4.3 — context delta последних admin изменений (2026-10-04)

На a558412 выполнены backups-context и users-context через общий playwright.ux-context.config.ts:36 passed/0 failed/skipped/flaky, Edge/3101/workers1/retries0, наблюдаемые1.4m. Проверены поздние reads при backend/mode switch, schedule/storage writes, create/job poll, delete/restore/download, создание/удаление пользователя. HTTP ответы подставные, реальных внешних операций не было. Отчёт: docs/ux-ui/acceptance/context-delta-2026-10-04.json.

Текущий main inventory по --list:1102 теста/169 файлов. Это перечень, не1102 passed. Ранее main1091 дал1088 passed и3 устаревших fixtures, после исправлений6 профильных прошли; полный context205 прошёл на прежнем HEAD. Последние production delta приняты профильными проверками и builds, полная повторная main/context регрессия остаётся в12.4. Stage12 не закрыт.

Следующий шаг12.3.22: strict speed-probes DTO и speed state при смене backend/mode, включая неизвестный каталог перед записью. Затем оставшиеся большие network grids, общая матрица и12.5 внешняя PG/RouterOS/integration приёмка. Текущий блок записан локальным коммитом без push; посторонние изменения skills/AGENTS/tsbuildinfo сохранены. Остаток квоты около3% перед записью журнала.

12.3.22 — общий каталог speed-проб и изоляция источника (2026-10-04)

Схема из probe-schedule-response перенесена в contracts: shared speedProbeReadSchema/speedProbesResponseSchema проверяют enums/duration/boolean/server IDs/уникальность ID и nullable observed values. Uptime и live schedule используют один контракт; ping-after-BT поля сохраняются, optional legacy отсутствие остаётся неизвестным. Pure backend mapSpeedProbeRead сохраняет null/0/false, нормализует DB timestamps; недостоверная запись возвращает502 вместо protocol/direction/duration/enabled fallback.

UptimeRoute keyed по probe ID/mode/backendUrl: каталог, история, freshness, интерфейсы и формы относятся к своему источнику. UI create/toggle/edit/delete/start и bulk writer защищены speedCatalogReady; первоначальная неизвестность и malformed refresh не допускают полной замены неподтверждённого списка. Cached строки и receivedAt сохранены; warning объясняет, что нужно успешно обновить данные. Навигационный счётчик unknown показывает —, переключатель получил доступное имя.

60 browser uptime и6 после финальной copy/a11y правки прошли;8 новых context scenarios backend/mode × probes/history × success/error прошли. Второй consumer/diagnostics/schedule/history47 browser прошли, включая1000 probes и1001 rail. Unit mapper3 + shared reader2 прошли без PG. Typecheck/ESLint без ошибок (9 прежних uptime warnings), backend build и frontend/contracts production34 страницы прошли; ReUI checklist и scoped axe error alert пройдены,320px снимок просмотрен. Context файл включён в агрегированную отдельную конфигурацию. Коммит локальный без push.

Следующий блок12.3.23: строгий PUT speed-probes до DB mutation, отказ без удаления malformed строк и транзакционная полная замена. Текущий backend PUT всё ещё имеет permissive normalize/filter и последовательные mutations; защита UI не заменяет серверную проверку. Затем network grids/полная main/context матрица12.4;12.5 реальная PG/RouterOS/integration приёмка отдельно.

12.3.23 — атомарная запись speed-проб (2026-10-04)

Общий write DTO требует явный probes массив, уникальные ID, безопасные положительные ID устройств, разные источник/назначение, целую длительность от3 секунд, protocol/direction/enabled. Missing/null/malformed каталог отклоняется400 целиком до обращения к хранилищу; явный probes:[] сохраняет намеренное удаление последней записи. Измерения из запроса исключены и не перезаписывают подтверждённые наблюдения.

Backend заменяет каталог в одной Drizzle transaction с pg_advisory_xact_lock для полной замены из разных процессов. Upsert обновляет только конфигурацию и порядок, timestamp создания сохранён. Ошибка refreshScheduler после commit возвращает ok:true с отдельным предупреждением; UI показывает предупреждение и требует подтверждённый ответ ok:true, сохраняет черновик при malformed acknowledgement. Неверная длительность отклоняется до PUT без parseInt fallback.

65 browser uptime/save/read сценариев прошли. HTTP/DI проверены malformed/no side effects, моделируемый rollback, explicit empty replacement, порядок и сохранение измерений, scheduler warning; signed JWT401/403/write проверен без PG. Typecheck, backend build, ESLint без ошибок (9 прежних uptime warnings) прошли. Production frontend build проверен отдельно. Реальный PostgreSQL rollback/advisory lock и работа scheduler на устройстве остаются внешней приёмкой12.5; модель DI не доказывает их.

Следующий блок12.3.24: большой OSPF route catalog — аудит фактического источника, пагинация50, поиск/сортировка по полному списку, refresh/error/recovery и320px. Затем остальные network grids и общая матрица12.4. Коммит локальный без push.

12.3.24 — большой каталог OSPF-маршрутов (2026-10-04)

Аудит источника: /ospf/catalog опрашивает полный RouterOS ipRoutes и объединяет маршруты устройств без page/limit. Grid переведён на штатную TanStack v9 client pagination50; сортировка применяется ко всему отфильтрованному каталогу. Страница сохраняется при refresh и ограничивается при сокращении списка/поиске. Назначение закреплено штатным columnPinning start/end, горизонтальная прокрутка использует DataGridScrollArea. Подобраны ширины, чтобы значение области не перекрывалось на320px; длинный префикс переносится.

1000 routes/200347 JSON bytes:50 DOM rows/1356 page nodes/930ms dev ready. Проверены page20, refresh, поиск дальнего маршрута/URL/reload, глобальная Cost сортировка,503 cache/unknown/freshness,1000→1 recovery,320px/no page overflow/полная видимость области/axe.22 профильных OSPF browser +1 после окончательной правки ширин прошли; lint/typecheck и production build прошли, мобильный снимок просмотрен. Ранние прогоны выявили неверное left API pinning (исправлено на v9 start/end) и две неверные предпосылки нового теста (ID и поле поиска); итоговые проверки прошли без ослабления assertions. Полный DTO остаётся в памяти, реальная задержка RouterOS не измерена.

Следующий блок12.3.25: BFD sessions большого каталога OSPF,50 DOM rows/поиск/sort/cache/320px. После него оставшиеся network grids и общая матрица12.4; внешняя12.5 отдельно. Коммит локальный без push.

12.3.25 — большой каталог BFD-сессий (2026-10-04)

Источник /ospf/catalog читает и объединяет полный RouterOS bfdSessions без pagination cap. OspfBfdDataGrid использует client pagination50, сохранение страницы при refresh и clamp при сокращении/поиске. Роутер закреплён штатным start/end pinning, горизонтальная прокрутка через DataGridScrollArea; последняя метрика полностью видима на320px. Метрики и режимы unknown/null остаются прежними, сетевые операции не изменены.

1000 BFD/323133 JSON bytes:50 DOM rows/1956 page nodes/983ms dev ready.12 browser прошли:page20/refresh/global Rx sort/поиск по всему remoteAddr каталогу/URL/reload/503 cache/unknown/recovery1000→1/320px/axe, включая прежние null/zero и layout сценарии. Lint/typecheck и production build прошли, мобильный снимок просмотрен. Полные DTO остаются в памяти; реальный RouterOS опрос не проверен. Осталось19 manualPagination:true specialized grids, включая bounded/demo, это не19 доказанных дефектов.

Следующий блок12.4.4: повтор общей context матрицы213 scenarios после последних delta. Затем12.4.5 общий main прогон текущего HEAD и12.3.26 оставшиеся network grids. Внешняя12.5 отдельно. Коммит локальный без push.

12.4.4 — повтор общей context матрицы (2026-10-04)

На HEAD5b2a291 повторена вся playwright.ux-context.config.ts:213 из213 сценариев/25 файлов,7.5min,0 unexpected/0 skipped/0 flaky; Edge,workers1,retries0,maxFailures12. Включены новые8 uptime speed context сценариев и все прежние source/ABA/операции/unknown checkpoint profiles. Доказательство: docs/ux-ui/acceptance/context-repeat-2026-10-04.json с точным HEAD и результатами по файлам.

15 explicit pure/DI файлов дали36 passed/0 failed, включая strict speed DTO и HTTP/JWT write route; PostgreSQL/RouterOS не использовались. Общий backend npm test не запускался из-за реальных purge/DB операций. Основная матрица последних delta ещё не повторена целиком.

Следующий блок12.4.5: общий main прогон текущего HEAD с сохранением JSON evidence. Затем12.3.26 оставшиеся network grids; аудит также выявил fmtBytes(0)→— в WireGuard detail/peer grid, исправить в следующем UI блоке с различением missing/zero. Внешняя12.5 отдельно; stage12 не завершён. Коммит локальный без push.

12.4.5 — повтор основной регрессии (2026-10-04)

На HEAD21859be полный playwright.config.ts дал1110 из1110 passed/171 файл за26.6min;0 unexpected/0 skipped/0 flaky, Edge/workers1/retries0/maxFailures12. Прежние3 устаревшие fixtures из12.4.1 исправлены и теперь прошли в общей матрице. Включены последние speed read/write и большие OSPF/BFD профили, двухтемная доступность оболочки, права, responsive и сквозные API scenarios. Доказательство: docs/ux-ui/acceptance/main-repeat-2026-10-04.json с точным HEAD и результатами по файлам. Context213/25 и unit36 приняты отдельно в12.4.4. Исторические PNG, пересозданные этим прогоном, восстановлены по явному проверенному списку; новые принятые OSPF/BFD снимки сохранены.

Это общая локальная регрессия текущего кода, не полная итоговая приёмка stage12. Аудит показал оставшийся опасный Ping PUT: normalize/filter перед последовательными DB deletes/updates, а uptimeProbeSamples удаляются каскадно. Также подтверждён fmtBytes(0)→— в WireGuard detail/peer grid. Network performance map сохраняет19 manualPagination:true specialized grids; CommRecs ограничен24 на HomeCard (lib/route-optimizer-data.ts), общий список HomeCard этим не ограничен. Тесты реальных PG/RouterOS/integrations не выполнялись.

Следующий блок12.3.26: строгий Ping write DTO до DB, атомарная замена, защита записи неизвестного каталога, подтверждение scheduler warning и точная copy о каскадном удалении истории. Затем12.3.27 WireGuard missing/zero counters и оставшиеся network grids. Внешняя12.5 отдельно; коммит локальный без push.

12.3.26 — атомарная запись каталога Ping-проб (2026-10-04)

Shared write DTO проверяет весь список до DB: обязательный массив, уникальные ID, безопасные ID устройств, непустые имена/цели, boolean и целые интервалы. Некорректные строки не отбрасываются с последующим удалением других проб. Замена выполняется в PostgreSQL transaction с advisory lock; конфигурация обновляется отдельно от измерений. Оmitted interval/dashboard сохраняются для существующих строк, явный пустой список означает удаление. Ошибка refreshScheduler после commit возвращает подтверждённое ok:true с предупреждением.

UI проверяет Ping-каталог до публикации, сохраняет последний успешный список при ошибке и запрещает замену неподтверждённого каталога. Первоначально неизвестные количества показаны как —. PUT требует подтверждённый ответ; malformed ack сохраняет черновик. Один ReUI Alert показывает причину и время последнего успешного списка. Диалог удаления точно описывает каскадное удаление Ping history; speed history сохраняется. Снимок320px: Ping catalog error.

Проверки: uptime-links62/62; context uptime/backend-switch11/11; pure/HTTP DI6/6 (включая JWT401/403, отсутствие mutations до validation и моделированный rollback с историей). TypeScript без incremental и ESLint прошли (9 исходных warnings Uptime); backend и frontend production build прошли. ReUI Alert API/usage проверены, primitives/base-nova не изменены. Fixture backend-switch дополнен реальным backend полем showOnDashboard. Общая регрессия1110/213 относится к предыдущим HEAD, после delta целиком ещё не повторена.

Реальный PG rollback/advisory lock/RouterOS не проверены; DI не заменяет внешнюю12.5. Whole-catalog PUT остаётся last writer wins без revision/ETag. Resources entries остаются legacy DTO (проверена только array оболочка). Следующий блок12.3.27: WireGuard missing/zero RX/TX в деталях и таблице пиров; далее network grids. Коммит локальный, без push.

12.3.27 — достоверные счётчики WireGuard (2026-10-04)

Нулевые RX/TX отображаются как 0 Б, отсутствующие значения — как — в таблице пиров и раскрытии интерфейса. Направления подписаны для accessibility. Backend принимает только целые неотрицательные десятичные счётчики в safe integer диапазоне: строки вроде12junk, дроби/минус/unsafe больше не превращаются в показания. Существующие правила сетевых операций не изменены.

Проверки: wireguard-links/tables29/29, включая обе композиции zero/missing и старые сценарии операций/ссылок; pure mapper1/1; TypeScript без incremental, ESLint изменённых файлов и backend/frontend production build прошли. Реальные RouterOS ответы не проверены. Следующий блок12.3.28: большой каталог интерфейсов WireGuard, пагинация50/refresh/search/320px; полный peer grid и раскрытие большого списка пиров остаются отдельным объёмом. Коммит локальный без push.

12.3.28 — большой каталог интерфейсов WireGuard (2026-10-04)

Полный API /wireguard не ограничивает каталог страницей. Таблица теперь использует client pagination50, глобальную сортировку, сохранение page/expanded при обновлении и clamp после сокращения списка. Composite ID server/interface сохранён. ReUI DataGridScrollArea и штатное start pinning удерживают имя на320px; длинные имена переносятся. Кнопка раскрытия доступна с клавиатуры, меню действий видно без hover и имеет44px цель.

Профиль1000 интерфейсов/316026 JSON bytes:50 строк/2136 DOM nodes/1573ms до ready в локальном dev с HTTP-моками (не оценка RouterOS или production latency). Проверены page20, Enter/раскрытие и refresh, поиск записи1000, глобальная числовая сортировка порта,503/cache/page, горизонтальная прокрутка с закреплением имени/меню, axe grid и1000→1 с правильным объектом в диалоге удаления.29 прежних browser прошли; большой профиль после уточнения локального поиска и вертикального scroll1/1. TypeScript без incremental/ESLint и frontend production build прошли. Снимок320px просмотрен.

Поиск/вкладка/статус WireGuard пока локальные, сервер/interface контекст в URL сохраняется; восстановление остальных фильтров записано отдельным остатком. Осталось18 manualPagination:true specialized grids, включая bounded/demo источники; это не18 доказанных дефектов. Следующий блок12.3.29: полный peer grid1000/50 DOM/действия/320px. Unbounded раскрытие peers одного интерфейса и внешняя12.5 остаются. Коммит локальный без push.

12.3.29 — большой каталог пиров WireGuard (2026-10-04)

Peer grid теперь использует client pagination50, clamp и сохранение страницы при refresh. Полный поиск/сортировка выполняются до страницы, composite server/interface/peer ID сохранён. Штатные ReUI ScrollArea/start pinning удерживают идентификатор на320px, действия имеют44px цель. Подтверждение удаления теперь показывает имя и точный ID пира, а не только интерфейс.

Профиль1000 пиров одного интерфейса/119347 JSON bytes:50 строк/2596 DOM nodes/1369ms ready в локальном dev с HTTP-моками. Проверены page20/refresh, поиск записи1000, сортировка по всему каталогу, выбранные server/interface/keep в URL,503/cache/page, zero/missing RX/TX,320px/axe grid,1000→1 и точный пир в dialog.29 старых browser прошли; после уточнения dialog повтор большого профиля и обоих delete-сценариев3/3. TypeScript без incremental/ESLint и production frontend build прошли. Снимок320px просмотрен.

Осталось17 manualPagination:true specialized grids, включая bounded/demo источники. Следующий блок12.3.30: ограничить DOM раскрытия большого списка пиров одного интерфейса. Восстановление WireGuard search/tab/status из URL, аудит подписи «онлайн» по факту handshake и внешняя12.5 остаются; presence старого handshake не доказывает текущую доступность. Общая main/context после delta целиком ещё не повторена. Коммит локальный без push.

12.3.30 — порционное раскрытие пиров WireGuard (2026-10-04)

Раскрытие интерфейса ограничено50 пирами на страницу, сохраняет страницу при refresh и ограничивает её при сокращении списка до отображения. Имена и точные IDs действий сохранены. На320px карточки имеют две колонки внутри sticky области шириной экрана; кнопки44px, пагинация доступна с клавиатуры и показывает диапазон/общий счётчик. На ПК сохраняется компактная строка полей.

Профиль1000 пиров:50 карточек/2388 DOM nodes. Проверены Enter/страница20/refresh,320px при крайнем horizontal scroll/доступ к действиям/axe detail, правильный последний пир в delete dialog и1000→1.31 browser прошли; после устранения setState-in-effect повтор большого detail1/1. TypeScript без incremental, ESLint и production frontend build прошли. Снимок320px просмотрен. Измерения используют локальные HTTP-моки, RouterOS latency не измерена.

Следующий блок12.3.31: убрать вывод «онлайн» из наличия старого handshake, показать отсутствие данных отдельно. Официальный RouterOS last-handshake — время после последнего успешного рукопожатия: https://help.mikrotik.com/docs/spaces/ROS/pages/69664792/WireGuard. Затем WireGuard URL filters/context и оставшиеся network grids.17 manualPagination:true grids/общая регрессия после delta/внешняя12.5 остаются. Коммит локальный без push.

12.3.31 — рукопожатие не подменяет доступность WireGuard (2026-10-04)

Убрана оценка «пиров онлайн» по presence старого last-handshake. KPI «Данные рукопожатия» считает непустые сведения в ответе и явно сообщает, что доступность пиров не проверена. Колонка «Пиры» показывает число записей. Старое время рукопожатия отображается без зелёного вывода о доступности; отсутствующее/пустое значение — «Нет данных». В мобильных деталях видна подпись Endpoint.

Основание: официальный RouterOS WireGuard, last-handshake означает время после последнего успешного рукопожатия. Порогов актуальности/новых правил сетевых операций не введено. Проверены missing/empty/1h/0s в обеих композициях и KPI2/4. Семь прежних/table/large browser прошли, новый handshake сценарий после уточнения adaptive KPI селектора1/1. TypeScript без incremental/ESLint и production frontend build прошли. Снимок320px просмотрен.

Следующий блок12.3.32: WireGuard URL search/tab/status — reload/история/сохранение server/interface/неверные параметры без расширения среза. Первоначально неизвестные общие KPI WireGuard и freshness/source switching требуют отдельного аудита; этот блок исправляет именно смысл handshake.17 остальных specialized grids/общая регрессия после delta/внешняя12.5 остаются. Коммит локальный без push.

12.3.32 — контекст фильтров WireGuard в URL (2026-10-04)

Поиск q, вкладка tab и статус интерфейса status сохраняются в URL; reload/назад/вперёд восстанавливают срез. Native history updates сохраняют server/interface, посторонние параметры и hash; ввод поиска использует replace, смена вкладки/статуса — push. Статус относится к интерфейсам, peer view сохраняет его для возврата. Неверные/повторяющиеся фильтры и поиск длиннее200 не расширяют список: показываются предупреждение и явный сброс только фильтров с сохранением устройства. Создание/импорт заблокированы до исправления ссылки.

Проверки:34 browser профильных/large/URL прошли; четыре новых invalid-filter сценария выявили пропущенную блокировку header-кнопки, после исправления повтор4/4. Pure URL1/1, TypeScript без incremental/ESLint и production frontend build прошли. Профили1000 интерфейсов/пиров/деталей включены. DTO server/interface context не расширен и его legacy parse не заявлен новым strict контрактом. Общие правила ReUI/base-nova сохранены.

Следующий блок12.3.33: WireGuard чтение при смене backend/mode и поздних ответах, первоначально неизвестный каталог/KPI, cache/freshness и запрет изменения неизвестного источника. Затем оставшиеся17 specialized grids. Общая main/context после delta и внешняя12.5 остаются. Коммит локальный без push.

12.3.33 — достоверное чтение и контекст WireGuard (2026-10-04)

GET WireGuard проверяется до публикации: форма DTO, уникальные composite server/interface IDs и peer IDs внутри интерфейса, уникальность failed sources, отсутствие одновременно результата и failure одного устройства. Каталог устройств проверяется по subset общего serverRead контракта; оба списка преобразуются до изменения state/receipt time. Отсутствующий server status показан как unknown. Ошибочный ответ сохраняет последние данные; inline ReUI Alert показывает постоянную причину и время получения. Первоначально неизвестные и неопрошенные scope KPI показаны как —, failed device не становится подтверждённым пустым каталогом; sidebar count неизвестного устройства не подставляет0.

Mounted/revision guards исключают позднее чтение/ошибку старого источника; content key включает backend/mode. Старые операции не показывают toast в новом контексте и не запускают повторное чтение прежнего backend после unmount. Мутации неизвестного/error каталога закрыты; исходные API пути и правила сетевых операций сохранены. История также не загружается из obsolete component.

Проверки: финальный основной WireGuard профиль40/40; дополнительные strict identity/failures/device/cache сценарии7/7; context read/toggle × backend/mode × успех/ошибка8/8, повторён после strict device parser. TypeScript без incremental/ESLint и production frontend build прошли. Ошибка/cache320px просмотрена. Detail viewport test прокручивает первую карточку, resize проверка ожидает применения media layout; assertions не ослаблены. Добавлен wireguard-context в общий context config (новая общая матрица ещё целиком не повторена).

Scope proof ограничен HTTP-моками и read/toggle context сценариями; реальный RouterOS/PG не проверены. Backend fallback running/disabled/type и остальные source-context операции требуют дальнейшего аудита, strict frontend не доказывает достоверность отсутствующих raw RouterOS flags. Следующий блок12.3.34: VXLAN1000/50 DOM/refresh/search/sort/export/320px; затем остальные17 specialized grids и общая main/context приёмка. Внешняя12.5 отдельно. Коммит локальный без push.

12.3.34 — большой каталог VXLAN (2026-10-04)

Полный /vxlan API не ограничен страницей. Таблица использует client pagination50, global sort, сохранение страницы при refresh и clamp после поиска/сокращения. ReUI ScrollArea/start pinning сохраняют имя/VTEP на320px; длинные значения переносятся, меню экспорта видно без hover и имеет44px цель. Composite server/tunnel ID и неизменяемый export snapshot сохранены.

Профиль1000 туннелей/227787 JSON bytes:50 строк/2137 DOM nodes/1249ms ready в локальном dev с HTTP-моками. Проверены page20/refresh, поиск записи1000/глобальный VNI sort,503/cache/unknown/page,320px/закрепление имени/axe, экспорт устаревшего snapshot и1000→1 с точным VNI1000.22 browser (large/table/links/freshness/GRE-VXLAN layouts) прошли. TypeScript без incremental/ESLint и production frontend build прошли. Снимок320px просмотрен.

Осталось16 manualPagination:true specialized grids, включая bounded/demo источники. VXLAN поиск пока локальный; server/tunnel URL контекст сохранён. Следующий блок12.3.35: GRE tunnels1000/50 DOM/search/sort/refresh/действия/320px. OSPF neighbors сопровождаются большим SVG графом, поэтому ограничение одной таблицы не докажет производительность всего экрана; отдельный аудит topology остаётся. Общая main/context после delta и внешняя12.5 отдельно. Коммит локальный без push.

12.3.35 — большой каталог GRE-туннелей (2026-10-04)

GET /api/gre/tunnels возвращает полный каталог без ограничения строк. ReUI client pagination50 ограничивает DOM; refresh сохраняет страницу, уменьшение/поиск корректирует её, MTU сортируется по всему каталогу. На320px имя закреплено, обе кнопки кода/меню видны без hover и имеют44px; composite identity и существующие permissions/mutation guards сохранены.

Профиль1000 туннелей/351894 JSON bytes:50 строк/2748 DOM nodes/1609ms ready в dev с HTTP-моками.20 browser (large/links/freshness/toggle/delete/IPsec-GRE tables/layouts) прошли; large повторён1/1 с проверкой disabled edit/delete после503. Поиск записи1000, page20/refresh/global MTU sort, cache/page/unknown,320px/axe/pinning, устаревший export snapshot и1000→1 с точным MTU2399 проверены. TypeScript без incremental/ESLint прошли; production frontend build прошёл. Снимок320px просмотрен.

Осталось15 manualPagination:true специализированных таблиц; GRE pools в live всегда пусты и доступны только как demo, поэтому их пагинация не приоритет для live. Firewall использует DnD исходного порядка; OSPF neighbors дополнительно рисует SVG topology. Следующий блок12.3.36: карта оставшихся источников/ограничений и безопасная последовательность performance доработок. Поиск GRE пока локальный; реальные RouterOS/PG и внешняя12.5 не проверены. Общая main/context регрессия после delta остаётся отдельной. Коммит локальный без push.

12.3.36 — актуальная карта оставшихся таблиц (2026-10-04)

Обновлён ux-ui-performance.md:15 manualPagination:true файлов сопоставлены с JSX/источниками и действующими ограничениями. Удалены6 уже принятых таблиц из активной карты. Scheduler11, traffic top50, community recommendations24 на HomeCard, demo GRE pools/schedule и неподключённый Subusers отделены от неограниченных live каталогов. OSPF topology и Firewall DnD остаются отдельными рисками; optimizer имеет комбинаторные массивы и много HomeCard. Измерения WireGuard/VXLAN/GRE внесены без выдуманного baseline.

Проверка документа: автоматическая сверка15 файлов с точным поиском исходников, существования относительных ссылок и отсутствие уже принятых файлов в активной карте; git diff --check. Код продукта не изменён, повтор сборки не требуется. Следующий блок12.3.37: честное обозначение ограниченного top50 traffic conversations; затем Communities1000/recursive groups и остальные шаги карты. Внешняя12.5 и общая main/context регрессия после delta остаются. Коммит локальный без push.

12.3.37 — границы выборки сессий трафика (2026-10-04)

FlowAnalyticsPanel сообщает фактическое число строк после фильтра и размер полученной выборки, объясняет top по объёму до50 и локальную область фильтра. Пустой выбранный фильтр имеет собственную причину, вместо общей parent emptyHint; сводка общего conversations не подменяется числом строк. Backend cap/read/network операции не изменены.

Новый сценарий выявил реальное перекрытие второй строки tabs таблицей: scoped TabsList теперь имеет автоматическую высоту, фиксированную высоту вкладок и перенос. Обычный click без force работает.Финальный browser профиль28/28 прошёл одним запуском на окончательных файлах, включая123 total/1 selected/0 filtered/reset/320px. Первоначальные падения нового теста привели к исправлению перекрытия tabs, корректировке роли выбранной строки и точной причине пустого фильтра; assertions не ослаблены. TypeScript без incremental/финальный ESLint и production frontend build прошли. Снимок320px просмотрен.

Следующий блок12.3.38: Communities1000 с полным поиском/sort/refresh/выбором/320px по актуальной performance карте.15 manualPagination:true остаются, traffic cap50 не требует фиктивной пагинации. Общая main/context после delta и внешняя12.5 отдельно; реальные RouterOS/PG не проверены. Коммит локальный без push.

12.3.38 — большой каталог Communities (2026-10-04)

ReUI pagination50, global sort/search, сохранение страницы при refresh и clamp при уменьшении списка. Закреплено значение community; копирование и явная кнопка деталей имеют44px/доступные подписи. Выбор по ID не привязан к странице и сохраняется при сортировке/обновлении; удалённая запись закрывает детали. Кнопка деталей работает с клавиатуры. Права/источник/отсутствующие prefix counts сохранены.

19 browser (large Communities и Evolution consumers) прошли:1000/190573 JSON bytes →50 rows/2216 page nodes/1206ms dev ready; page20/refresh/search1000/global sort/cache/320px/pinning/axe, clipboard stub,1000→1→0/selection. TypeScript без incremental/ESLint прошли. Первый production build не получил Google Fonts, повторная обычная сборка успешно собрала34 страницы. Снимок320px просмотрен. Реальная интеграция Evolution и системный clipboard не проверены. Поиск/выбор Communities пока локальны, восстановления из URL нет.

Осталось14 manualPagination:true specialized grids. Обнаружено прежнее ложное подтверждение clipboard: handleCopy ставит copied до завершения writeText и игнорирует reject. Следующий блок12.3.39: исправить ack/error/pending копирования и поздние ответы при смене источника; затем12.3.40 recursive groups+endpoints. Общая main/context регрессия после delta и внешняя12.5 отдельно. Коммит локальный без push.

12.3.39 — подтверждение копирования Communities (2026-10-04)

Clipboard success показывается только после resolved writeText; reject/недоступный API сохраняет значение и показывает ReUI Alert с повтором/ручным копированием. Pending блокирует повторный вызов и кнопки списка/деталей; активная операция и timer защищены mount/revision guard, источник страницы уже ключуется sourceKey. Уведомления pending/success доступны через role=status.

5/5 browser (4 clipboard cases и large Communities повтор) прошли: отсутствие преждевременной галочки, двойное нажатие, reject→retry, поздний успех/ошибка после unmount. TypeScript без incremental/ESLint и production frontend build прошли. Clipboard подменён promise в браузере; системные разрешения и смена backend/mode именно во время clipboard отдельно не проверены. Не утверждаем, что уже начатая запись в системный clipboard отменяется при unmount.

Следующий блок12.3.40: recursive routes1000 групп и1000 endpoints одной группы, pagination/URL expansion/global sort/refresh/cache/320px.14 manualPagination:true остаются. Общая main/context регрессия и внешняя12.5 отдельно. Коммит локальный без push.

12.3.40 — большие группы рекурсивных маршрутов (2026-10-04)

ReUI pagination50 групп, global sort, refresh без сброса страницы и clamp. Первичное/новое URL раскрытие находит группу в sorted model и открывает её страницу; обычный переход страниц не навязывает возврат к выбранной группе. Строка показывает3 gateway и точное число остальных. Раскрытие имеет отдельные страницы50 endpoints, сортирует всю группу по distance, сохраняет страницу при refresh и корректирует её при сокращении. На320px route закреплён, edit/delete44px и доступны через горизонтальный scroll; детали ограничены viewport и доступны с клавиатуры.

35/35 browser (large/table/links/layout/values/data) прошли:1000 групп/212347 JSON bytes →50 rows/2118 nodes/1457ms dev ready;1000 endpoints →50 cards/1126 nodes. Проверены URL page20, full search/global Table sort, refresh/cache/permissions/1000→1, expanded endpoint page20/refresh/clamp и320px/axe. TypeScript без incremental/ESLint и production frontend build прошли. Группы320px, endpoints320px просмотрены. Изменение/удаление получает всю исходную группу, профильные операции прошли на малых fixtures; большой write payload в этом блоке не проверялся.

Осталось13 manualPagination:true specialized grids. Большая RouteSheet пока рендерит все endpoints и все варианты gateways для каждого endpoint; performance формы не принят. Следующий блок12.3.41: ограничить DOM формы/вариантов шлюзов без потери скрытых данных/валидации/PUT payload, проверить1000 endpoints и1000 gateways. Затем Filters порядок/Firewall DnD и остальные этапы карты. Общая main/context после delta и внешняя12.5 отдельно. Коммит локальный без push.

12.3.41 — большая форма рекурсивного маршрута (2026-10-04)

RouteSheet показывает10 endpoints, но хранит весь draft. Предыдущая/следующая страница и прямой переход по номеру endpoint доступны с клавиатуры; add открывает страницу нового элемента, удаление корректирует индекс. Валидация ищет ошибки во всём draft и открывает страницу первого невалидного endpoint. RecursiveGatewayChoices сохраняет прежние карточки/семантику статуса; показывает5 вариантов (выбранный первым) и ищет по всему каталогу IP/name. Ручной gateway ввод сохранён.

22 профильных browser прошли; финальный large повтор1/1 после прямого перехода/скрытой ошибки.1000 endpoints ×1000 gateways →10 cards/1569 modal nodes,50 gateway choices. Проверены первая/последняя страницы, поиск шлюза1000, скрытый невалидный endpoint1000 без PUT, ошибка503/сохранение draft/повтор,320px; PUT содержит1001 строки, обе скрытые правки и неизменную другую группу. TypeScript без incremental/финальный ESLint и production frontend build прошли. Форма320px просмотрена. Общие сетевые правила и права не изменены; реальный RouterOS PUT не проверен.

Следующий блок12.3.42: Filters1000/порядок через границу страниц/whole-catalog PUT/search/sort/refresh/cache/320px.13 manualPagination:true specialized grids остаются. Общая main/context после delta и внешняя12.5 отдельно. Коммит локальный без push.

12.3.42 — большой список Filters (2026-10-04)

ReUI pagination50/clamp/закреплённые номер и community; доступные действия44px без hover. Индекс и крайние позиции берутся из полного orderedRules через Map. Поиск сортирует весь срез, очистка поиска возвращает исходный порядок (manualSorting), перемещение отправляет все правила.

10 профильных browser и финальный large1/1 прошли:1000/120894 JSON bytes →50 rows/2266 nodes/1880ms dev ready. Проверены down r50 через границу страницы, keyboard up обратно, полный PUT1000/403 rollback, search1000/global sort/clear, refresh/page/cache503/блокировка действий/1000→1,320px/ScrollArea/axe. TypeScript без incremental/ESLint и production build прошли. Filters320px просмотрен. DTO целиком остаётся в памяти; реальные RouterOS операции не проверены. Старое уведомление ошибки перемещения сохраняется после refresh; это отдельное состояние операции, не успех чтения.

Осталось12 manualPagination:true specialized grids. Следующий блок12.3.43: Firewall1000/pagination/порядок DnD и действия, точный RouterOS destination через границу страниц. Общая main/context после delta и внешняя12.5 отдельно. Коммит локальный без push.

12.3.43 — большая таблица Firewall и порядок (2026-10-04)

ReUI pagination50/clamp/ScrollArea, закреплённые номер и chain. DnD получает ID текущей страницы, кнопки44px up/down используют соседей полного отфильтрованного списка внутри server/family/table. Callback прежний: RouterOS destination рассчитывается по полному источнику, включая скрытые строки. DnD мышью/клавиатурой сохранён; action menu44px видим без hover. Переключателям добавлены доступные имена с rosId.

13+22 профильных main browser, финальный large1/1 и context4/4 прошли.1000/253248 JSON bytes →50 rows/3054 nodes/2082ms dev ready. Down r50→destination *52, keyboard up r50→*51, DnD page2 r51→*53,403 rollback/refresh page/search1000/cache503/1000→1,320px/action44px/axe проверены. TypeScript без incremental/финальный ESLint и production build прошли. Firewall320px просмотрен. Полный DTO остаётся в памяти; real RouterOS не проверен. Global sorting большого multi-server среза отдельно не проверена, reorderable сохраняет manualSorting.

Обнаружено прежнее ограничение: dataError после полного GET failure сохраняет кэш, но не блокирует действия, в отличие от partial failures. Следующий блок12.3.44: явная блокировка stale операций/повторного чтения/восстановления; затем большой редактор сценария и OSPF/optimizer.11 manualPagination:true specialized grids остаются. Общая main/context после delta и внешняя12.5 отдельно. Коммит локальный без push.

12.3.44 — блокировка устаревших операций Firewall (2026-10-04)

readTrusted отделён от текста dataError: после HTTP/DTO failure кэш сохраняется, но toggle/edit/delete/create/move/address-list/history restore заблокированы. Очистка ошибки при retry не разблокирует действия до корректного ответа. Существующие partial failures дополнительно сохраняют scoped блокировку; поздний read после мутации не сбрасывает подтверждение. Статус объясняет блокировку и сохранённый список, операции RouterOS не изменены.

29/29 main browser (data/partial/save/delete/toggle/move/history/large),2/2 новых stale cases и4/4 context прошли. Проверены503/некорректный DTO, неизменная строка, отключённые switch/menu/create/history, pending retry без writes, восстановление после успешного GET. TypeScript без incremental, ESLint нового теста и production build прошли. ESLint страницы имеет4 исходных set-state-in-effect errors (506/754/883/2081 в HEAD1e9889f) и2 unused warnings; сравнение ESLint API с HEAD подтвердило тот же набор в текущем файле (последняя строка2085). Это не полный lint pass; исправление прежних эффектов отдельно.

Следующий блок12.3.45: большой редактор локального сценария Firewall — pagination/глобальный порядок/сохранение всего draft/симуляция/320px. Затем OSPF таблица+topology/optimizer.11 manualPagination:true остаются. Общая main/context после delta, lint cleanup Firewall и внешняя12.5 отдельно. Коммит локальный без push.

12.3.45 — большой редактор сценария Firewall (2026-10-04)

ReUI pagination50/clamp/ScrollArea, закреплённые номер и chain, действия44px без hover; номера и up/down края считаются по полному draft. ScenarioSheet320px занимает всю ширину viewport. Кнопки редактирования/удаления сценария получили44px и доступные имена. Локальный сценарий не отправляет операции RouterOS.

Финальные6/6 browser (tables и large scenario) прошли.1000 правил →50 rows/1847 modal nodes. Проверены down50 через страницу/up51 обратно/delete51, полный сохранённый localStorage draft999/точный порядок/последнее правило неизменно,320px/полная кнопка44px/axe. Симуляция вычисляет скрытое последнее правило #999 и блокирует пакет; API writes0. TypeScript без incremental, ESLint grid/test и production build прошли. Сценарий320px просмотрен. Четыре исходных lint errors страницы/2 warnings из12.3.44 остаются; отказ записи localStorage отдельно не проверен.

Обнаружено: trace999 создаёт15529 page DOM nodes; ограничение редактора не означает принятие всего симулятора. Следующий блок12.3.46: страницы трассировки/полный verdict/переход к результату и сохранение отмены/повторного запуска. Затем Firewall lint cleanup, OSPF таблица+topology/optimizer.10 manualPagination:true specialized grids остаются. Общая main/context после delta и внешняя12.5 отдельно. Коммит локальный без push.

12.3.46 — ограниченная трассировка Firewall (2026-10-04)

Trace показывает50 шагов, общий verdict/counts/номера относятся ко всему расчёту. Предыдущая/следующая страница и переход к правилу результата44px; новая симуляция/reset/preset/scenario начинают с первой страницы. Строки переносятся на320px, исправлен контраст passthrough и пояснений. runEpoch защищает от старого таймера после stop→новый run; unmount инвалидирует запуск.

6/6 browser на начальной pagination и финальный large1/1 после mobile/epoch/axe прошли: trace999 уменьшен15529→1293 page DOM nodes,50 steps на странице/49 на последней. Full verdict#999, page2, keyboard jump951–999,320px/axe, stop→instant run и продвижение clock1000ms без старого evaluating, reset проверены. TypeScript без incremental/ESLint теста/production build прошли; ESLint API baseline/current подтверждает те же4 исходных ошибки страницы и2 warnings. Трассировка320px просмотрена. Алгоритм вычисления не изменён: instant по-прежнему делает обновления полного steps на каждом правиле, CPU complexity не принята нагрузочным тестом. Данные остаются полными в памяти.

Следующий блок12.3.47: Firewall lint cleanup четырёх старых эффектов без потери draft/URL/filter/focus. Затем OSPF таблица+topology/optimizer; ошибки localStorage и большой multi-server sort отдельно.10 manualPagination:true остаются. Общая main/context после delta и внешняя12.5 отдельно. Коммит локальный без push.

12.3.47 — формы, URL и lint Firewall (2026-10-04)

RuleSheet/AddressListSheet корректируют собственный draft при смене контекста до commit дочерних элементов, сохраняя ввод при API ошибке и pending. Sheet не перемонтируется; finalFocus возвращает к исходной кнопке меню строки, fallback — create/add. Address-list фильтр отсутствующего списка сбрасывается до вывода детей и не возвращается при повторном появлении списка. Query server применяется один раз после каталога через guarded state adjustment; начальный useState недостаточен для асинхронного URL-контекста. Удалены дубли unused styles.

6+20 main browser и4/4 context прошли: reopen старого rule/address после несохранённого draft, create с пустым draft, Escape/focus, удаление/возврат фильтра,8 save cases/ошибки API/права/partial/cache/stale, обе большие таблицы/trace и поздние ответы. TypeScript без incremental/ESLint страницы и нового теста/production build прошли. Четыре исходные lint errors/2 warnings устранены без suppression; подход соответствует React: Adjusting some state when a prop changes. Сетевые правила не изменены, real RouterOS не проверен.

Следующий блок12.3.48: полный профиль OSPF1000 соседей/1001 SVG узел, таблица и topology вместе; определить точную границу DOM до изменений. Затем ограничение таблицы/графа, optimizer. LocalStorage отказ сценария и большой multi-server sort Firewall остаются отдельными проверками.10 manualPagination:true остаются. Общая main/context после delta и внешняя12.5 отдельно. Коммит локальный без push.

12.3.48 — исходный профиль OSPF соседей и topology (2026-10-04)

Fixture полного DTO:1000 neighbors/1000 interfaces/одна instance,1001 distinct graph nodes;583875 JSON bytes.1/1 browser и ESLint теста прошли. Исходный экран:1000 table rows/14012 SVG descendants/32635 page nodes/6760ms dev ready.320px document width320, но это не доказательство читаемости. Профиль, desktop, mobile сохранены и просмотрены: узлы на фиксированной окружности перекрывают друг друга, граф не принят. Latency одного dev прогона не является production benchmark.

Продуктовый код не менялся; build повторно не нужен для теста/документации. Следующий блок12.3.49: client pages50 OSPF neighbors/полный поиск и sort/URL node/refresh/cache/clamp/320px. Принимать таблицу отдельно, не объявлять готовность всего экрана: граф14012 SVG требует12.3.50 — читаемый ограниченный срез topology с явными counts/выбором узла/переходами ко всем данным. Затем optimizer и общая main/context после delta.10 manualPagination:true остаются; внешняя12.5 отдельно. Коммит локальный без push.

12.3.49 — большая таблица соседей OSPF (2026-10-04)

ReUI pagination50/clamp/ScrollArea, закреплённый local router и кнопка узла44px. Новый/первичный URL node находит строку в глобальной sorted model и открывает её страницу; обычная pagination/refresh не навязывает возврат к выбранному узлу. Search/sort используют весь срез, selection не привязан к странице. Unknown/cost/null/права сохранены.

22/22 browser (large/data/layout/links/values) и финальные large повторы прошли;1000/583875 JSON bytes →50 table rows,1001 graph nodes/12015 SVG descendants/13597 page nodes/2827ms dev ready. URL remote1000→page20, refresh/ручная page19, search/reload/сохранение keep, global Cost sort/cache503/unknown/clamp1000→1/no writes,320px/pinning/axe проверены. TypeScript без incremental/ESLint grid+test/production build прошли. Профиль таблицы, таблица320px просмотрены. SVG количество зависит также от animation/reduced-motion состояния; baseline14k и текущие12k не означают изменение алгоритма графа. Dev latency не считается production benchmark.

Осталось9 manualPagination:true specialized grids. Весь экран не принят: граф1001 перекрывается; KPI1000 на320px переносит число; NodeDetailPanel локального узла рендерит все связи. Следующий блок12.3.50: читаемый ограниченный срез topology/явные counts/поиск и выбор любого узла/URL/полный источник, исправить отображение чисел. Затем12.3.51 большие node details, optimizer и общая main/context после delta. Внешняя12.5 отдельно. Коммит локальный без push.

12.3.50 — ограниченный срез topology OSPF (2026-10-04)

OspfTopologyScope использует полный источник: до8 incident edges/9 SVG nodes, focal выбранного URL узла или первого устройства, pagination/clamp/сброс при смене focal, точные полные counts, поиск всех узлов с пятью результатами. Малый граф до12 узлов/12 связей сохраняет прежнюю композицию; 1000 параллельных связей между двумя узлами тоже включают ограничение. Полный nodeState вычисляется по всем edges, а не видимой странице. Close возвращает фокус к узлу или поиску, если узел исчез из среза. KPI1000 на320px не дробится, HTML-кнопки выбора/pages/animation44px.

26/26 профильных main,8/8 context и финальные3/3 large прошли. Fixture1000 neighbors/1000 interfaces/1001 nodes/583875 bytes →50 rows/2 SVG nodes/27 descendants/1630 page nodes/1531ms dev ready для URL remote1000. Проверены page2/clamp после уменьшения1000→13→12, полная hidden Full-связь при первых Down, выбор remote1000 из всего каталога/keep, close/focus,320px/axe, bounded parallel1000. TypeScript без incremental, ESLint страницы/компонента/теста и production build прошли. Профиль, срез1440px, 320px сохранены и просмотрены. Dev latency не production benchmark. На большой топологии SVG доступен через горизонтальный scroll; все узлы доступны через поиск.

Это не приёмка всех вариантов графа: параллельные edges ограничены по DOM, но их подписи на общей линии могут перекрываться. Большая NodeDetailPanel ещё рендерит все1000 neighbors/interfaces — следующий12.3.51. Затем параллельные связи/optimizer/общая main-context регрессия после delta.9 manualPagination:true specialized grids остаются. Внешние RouterOS/PG/интеграции12.5 не проверены. Локальный коммит без push.

12.3.51 — большие детали узла OSPF (2026-10-04)

OspfDetailList: client pages50 отдельно для соседей/интерфейсов, поиск всего списка по peer/Router ID/interface/state и interface/area/cost; full counts сохраняются. Refresh не сбрасывает ручную страницу, shrink ограничивает её, новый nodeId пересоздаёт контекст списка. Close44px, Escape/focus прежние; сетевые правила не изменены.

4/4 large,15/15 profile keyboard/layout/URL/state/identity и финальный detail1/1 прошли. Полный fixture1000 neighbors/1000 interfaces →50+50 записей/635 panel DOM/2335 page DOM для URL node=1. Поиск ether1000/полный cost1000, no-match, page2/refresh, shrink1000→1/keep/node,320px/кнопки44/axe проверены. TypeScript без incremental, полный ESLint страницы/компонента/теста и production build прошли. Профиль, панель320px сохранены и просмотрены. Каталог не обрезается в памяти.

Следующий12.3.52: визуальная группировка параллельных links без подмены cost/state; затем optimizer и общая регрессия после всех delta.9 specialized manualPagination:true остаются. Внешние RouterOS/PG/интеграции12.5 не проверены. Локальный коммит без push.

12.3.52 — читаемые параллельные связи OSPF (2026-10-04)

TopologyGraph группирует видимые edges по неориентированной паре: одна линия/подпись количества на страницу, отдельные cost/state каждой связи в SVG title и accessible name. Для разных состояний нейтральный цвет, dashed без Full-анимации; Unknown не подставляется. Статусы узлов остаются по всем edges. Групповая подпись читается без hover; единственный peer расположен сбоку, подпись не накладывается на узел. Full table и node details доступны для просмотра всех связей.

9/9 browser (large topology/details/identity/states/layout/keyboard/reduced motion) и финальный parallel1/1 прошли.1000 links between2 nodes, page8 links →одна visual group, aria-label Full/cost1 и Down/cost2, подпись8 связей. TypeScript без incremental/ESLint страницы/scope/теста и окончательный production build прошли. Группировка1440px сохранена и просмотрена; PNG после проверки показал недостаточный opacity, исправлен и повторно проверен.

Следующий12.3.53: OSPF preview оптимизатора1000 rows/полная apply-ветка при pagination/search; затем матрицы и many HomeRouterCard.9 manualPagination:true specialized grids остаются. Общая main/context регрессия после delta и внешняя12.5 отдельно. Локальный коммит без push.

12.3.53 — большой OSPF preview оптимизатора (2026-10-04)

Штатные ReUI pages50/client sorting/clamp и ScrollArea, закреплённый interface120px оставляет место cost на320px. Именованная область preview включает поиск полного массива id/interface, полные counts и явное пояснение, что фильтр меняет только отображение. Контекстный key server/weight сбрасывает поиск/страницу при смене устройства; фоновый refresh сохраняет их. Применение не использует фильтр/видимую страницу, существующий POST pingWeight и строгий receipt сохранены.

47/47 профильных main,16/16 final preview/large/new context-search и8/8 backend/mode context прошли.1000 interfaces/245293 JSON bytes →50 rows/924 preview region DOM/1610 page DOM. Search ether1000→1 row/receipt1000 applied; Cost sort full array, page2/refresh/cache503/disabled apply/shrink1000→1/server+keep,320px/pinning/axe, смена server очищает no-match query. TypeScript без incremental/полный ESLint grid/page/двух тестов/production build прошли. Профиль, 320px сохранены и просмотрены. API fixture receipt исправлен по существующему контракту currentCost=from; контракт не ослаблен. Это проверка HTTP live-ветки с подменёнными ответами, не реальное применение RouterOS. Полный массив остаётся в памяти.

Осталось8 manualPagination:true specialized grids. Следующий12.3.54 — исходный профиль1000 HomeRouterCard с полным servers DTO; затем bounded cards/full-route/wan-matrix, честность24 commRecs. Общая main/context после delta и внешняя12.5 отдельно. Локальный коммит без push.

12.3.54 — исходный профиль домашних устройств оптимизатора (2026-10-04)

Полный optimizerServersSchema1000 home-router/179347 bytes, без подтверждённых WAN/probes/filters.1/1 browser и ESLint теста прошли.1000 HomeRouterCard/40668 page DOM/11496ms dev ready; document320px не шире viewport. Профиль, исходный320px сохранены. Это baseline, не приёмка производительности; dev latency не production benchmark. Нет WAN — это валидная live ветка, не подмена неизвестных данных нулями. Продуктовый код не менялся, build повторно не нужен.

Следующий12.3.55: ограниченный DOM HomeRouterCard/поиск полного каталога/URL/refresh/clamp/320px. Расчёт полного массива остаётся отдельным CPU риском; раскрытые full-routes и WAN dynamic columns требуют других профилей. Общая регрессия и внешняя12.5 отдельно. Локальный коммит без push.

12.3.55 — ограниченные карточки домашних устройств (2026-10-04)

OptimizerHomesList показывает5 карточек на страницу, поиск по полным label/id/IP/site/country. home_q/home_page в URL сохраняют server/keep/hash; поиск replaceState/reset page, pagination pushState, clamp после нового полного снимка нормализует URL. Малый каталог до5 без фильтра сохраняет прежнюю композицию. Расчёт и полный DTO не обрезаются; глобальные pinned/applied Sets остаются у родителя. Карточка при уходе со страницы перемонтируется, её локальная вкладка сбрасывается — восстановление вкладки отдельно не принято.

23 профильных main прошли; единственный сбой нового pin-сценария был неверным selector теста (row key home::community::index); исправлен, финальный suite8/8 passed.8/8 backend/mode context, TypeScript без incremental/полный ESLint страницы/компонента/тестов/production build прошли.1000 home-router/179347 bytes →5 cards/1870 page DOM/1606ms dev ready вместо40668/11496ms. Проверены page200/refresh, search1000/reload/back/keep/server, cache503/full snapshot, shrink1000→1/URL clamp, pin Community→page2→page1,320px/HTML pagination44px/axe. Профиль, 320px сохранены и просмотрены. Dev latency не production benchmark; native OSPF device select всё ещё содержит1000 options.

Следующий12.3.56: полный профиль WAN10×JH10×Exit10/1000 routes и раскрытой таблицы. WAN matrix columns/полный расчёт combinatorics и24 commRecs остаются самостоятельными ограничениями.8 specialized manualPagination:true остаются. Общая регрессия после delta и внешняя12.5 отдельно. Локальный коммит без push.

12.3.56 — исходный профиль1000 полных маршрутов (2026-10-04)

Полный валидный servers DTO21 устройство/4261 bytes:WAN10×JH10×Exit10 создаёт1000 full routes.1 browser/test lint passed; раскрытый список1000 rows/33049 table DOM/33780 page DOM/3738ms dev ready. Профиль сохранён. Это baseline, не performance acceptance; dev latency не production benchmark. Продуктовый код не менялся, build повторно не нужен. Далее12.3.57 ограничить DOM раскрытого списка50/page без потери global sort/индекса/best/refresh/clamp; затем WAN matrix/CPU combinatorics/24 commRecs и общая регрессия. Внешняя12.5 отдельно. Локальный коммит без push.

12.3.57 — страницы полных маршрутов оптимизатора (2026-10-04)

ReUI client pagination50 только раскрытого списка, autoResetPageIndex=false/clamp, fixed widths/ScrollArea, закреплённый исходный номер маршрута112px. _index/bestId вычислены по полному исходному списку, не странице/sort. Сворачивание/раскрытие явно reset page0; для1000 текст «Открыть все1000 комбинаций» не обещает одновременный DOM. Для<=50 прежний текст сохранён. Toggle44px. Расчёт модели/сети и полный массив не изменены.

6/6 профильных table/pin/empty/unknown cases и финальный large1/1 passed. Первые ошибочные expectations теста считали min index уникальным; исправлены по существующим равным значениям. Проверены50 initial/счётчик номера51/refresh/page20 951–1000, collapse5/open50, глобальный min sort включает номера за исходной page1 при ties,320px/pinning/axe/shrink1000→1/no writes.21 devices/WAN10×JH10×Exit10/4261 bytes →50 rows/1699 table DOM/2461 page DOM/1853ms dev ready вместо33049/33780. TypeScript без incremental/ESLint grid+test/production build passed. Профиль, 320px сохранены и просмотрены. Dev latency не production benchmark.

Осталось7 manualPagination:true specialized grids. Следующий12.3.58 — WAN matrix/динамические JH columns/CPU combinatorics. Срез commRecs24/восстановление вкладки карточки/native device options1000 и полный массив в памяти остаются. Общая main/context после всех delta и внешняя12.5 не закрыты. Локальный коммит без push.

12.3.58 — карта оставшихся рисков оптимизатора (2026-10-04)

Статический аудит после a16bfae, без продуктовых изменений/сетевых операций. Осталось7 manualPagination:true. WAN matrix рендерит все home.wans и все jumpHosts как columns, legs.find на каждую ячейку; Math.max(...legs.map(score)) тоже не имеет явной границы числа аргументов. DOM ограничение карточек и full routes не ограничивает эту матрицу. Следующие независимые fixtures:1000 WAN×1JH без Exit и10WAN×100JH без Exit — отделить rows/columns от full-route product. После baseline нужны page50 WAN/ограниченный набор JH columns/точные counts/поиск всех JH, map lookup по wan/jh без изменения состояния/best по полным legs.

buildLiveOptimizerData/assignProbesForWanJh делает DFS, когда WAN<=7 и WAN<=pool.length. Лимита pool нет. scoreProbeForWanIface допускает srcInterface="" для любого WAN; при7WAN/20 подходящих разных probes полное дерево содержит20P7=390700800 полных назначений (вывод из кода, не измеренный benchmark). Не запускать этот случай через Next/UI: сначала отдельный чистый CPU-профиль в дочернем процессе с жёстким timeout, без DB/RouterOS. Стратегию назначения/оптимальность нельзя менять без доказательства эквивалентности на малых наборах; простое обрезание pool может скрыть лучшее назначение.

commRecs строятся через filter(sourceServerId).slice(0,24), а HomeCard подписывает BGP community только длиной среза. Нужны полный source count/явное сообщение24 изN; нельзя выдавать24 за весь каталог или менять правила применения. Локальная вкладка карточки сбрасывается при pagination, native OSPF select1000 options остаётся. Общая main/context после delta и реальная внешняя12.5 ещё не закрыты. Этот блок — карта приёмки, не доказательство нагрузочной готовности. Product build a16bfae уже passed; для документации повтор не нужен. Следующий12.3.59 — указанные bounded profiles/CPU timeout. Локальный коммит без push.

12.3.59 — отдельные профили матрицы и CPU (2026-10-04)

2026-10-04. Live API подменён строгими DTO, без Exit и API mutations. Два браузерных профиля прошли: WAN1000×JH1 — 1000 строк,4 столбца,28019 DOM таблицы,28712 DOM страницы,4977мс dev-ready,108917байт; WAN10×JH100 — 10 строк,103 столбца,9803 DOM таблицы,10595 DOM страницы,2258мс dev-ready,16593байт. Время dev измеряет также загрузку/компиляцию и не является production benchmark.

Чистый расчёт7WAN×20 wildcard probes воспроизводится scripts/performance/optimizer-probes-profile.mjs, в отдельном child process с жёстким timeout10000мс. Расчёт не завершился за timeout; тяжёлый DFS нельзя воспроизводить в UI. Нет DB/API/сетевых операций. Следующий12.3.60 — страницы50WAN и ограниченное окно JH, поиск по полному каталогу, проверка обновления/сжатия и320px. Семантику назначения probes этим блоком не меняем.

12.3.60 — ограниченное отображение WAN matrix (2026-10-04)

2026-10-04. ReUI DataGrid/TanStack v9: клиентские страницы50WAN, окно5JH, поиск по полному WAN/JH каталогу, точные filtered/total counts. Fixed widths/горизонтальный DataGridScrollArea/закреплённый WAN; страницы сохраняются при refresh и нормализуются при сжатии каталога. Best score берётся из всех legs циклом без spread; Map WAN→JH сохраняет первый matching leg, как прежний find. Raw unknown/zero/даты и модель остаются раздельными. API writes отсутствуют.

WAN1000×JH1:1000→50rows,28019→1419tableDOM,28712→2149pageDOM,2264ms dev-ready. WAN10×JH100:103→8columns,9803→683tableDOM,10595→1492pageDOM,1785ms dev-ready. Полные исходные массивы остаются в памяти.

Проверены12browser + повтор2 после lint-правки, TypeScript без incremental, targeted ESLint, production build, ReUI validate_usage/checklist. Мобильные снимки docs/ux-ui/screens/optimizer-wan-matrix-{1000,100jh}-320.png просмотрены. Поиск последних объектов, последний диапазон, cache/refresh/clamp,320px/pinnedWAN и WCAG axe приняты. Общая регрессия после delta ещё требуется.6 manualPagination:true остаются; CPU DFS и срез24 commRecs не исправлены этим блоком.

12.3.61 — точное отсечение перебора проб (2026-10-04)

2026-10-04. DFS сохранил порядок WAN/pool, обязательный выбор совместимой пробы и первое назначение при равных totals. Отсекаются только ветви, чья верхняя граница не превосходит найденного bestSum. Две релаксации: сумма независимых максимумов remainingWAN и сумма наибольших remainingCount максимумов уникальных probe IDs. Каждое допустимое завершение ограничено обеими оценками; минимум также верхняя граница. Никакого изменения правил scores, fallback greedy для >7WAN/недостаточного pool, выбора интерфейсов, API или сетевых операций.

Независимый старый полный DFS в тесте совпал по exact probe IDs на1200 seeded fixtures с ties/incompatible/partial matching. Дополнительно equal20 сохраняет первые7 и проверен forced early choice.7 pure tests/type/lint,6 main browser и8 context прошли. Скрипт с child timeout10с теперь проверяет probe IDs: equal17.3ms(p0..6), varied16.6ms(p13..19), freshness60.9ms(p13..19). До правки equal превышал10с; первая слабая граница оставляла freshness2269ms, усиленная граница сократила его. Время child startup отдельно335–443ms, в расчёт не входит. Production build проходит.

Это профили7WAN×20, а не гарантия для любого размера/набора: DFS всё ещё экспоненциальный в худшем случае, исходный pool не ограничен; large mixed-interface/live нагрузка остаётся предметом production измерения. Следующий12.3.62 — скрытый срез24commRecs.

12.3.62 — исходный скрытый срез Community (2026-10-04)

2026-10-04. Live API fixture1000 правил Home1/1WAN/1JH/безExit, strict servers/rules DTO. UI показывает BGP community(24),24rows/504tableDOM/1197pageDOM/1916ms dev-ready. Это не performance-успех:976 правил вообще исключены до grid, counts не показывают реальный источник.1 browser/test lint passed, API writes отсутствуют. Следующий12.3.63 удаляет срез и ограничивает отображение pages50, сохраняя unknown indices безExit.

12.3.63 — весь Community-каталог с ограниченным отображением (2026-10-04)

2026-10-04. Удалён скрытый slice24 после фильтра sourceServerId; ownership и расчётная семантика сохранены. ReUI DataGrid pages50/full search/communityName/gateway/path, exact counts, full-model sort, fixed widths/horizontalScroll/pinnedCommunity. Row key формируется до фильтрации из прежнего home/community/index; pins сохраняются при search/sort/страницах/refresh. Global рекомендаций count теперь относится ко всем правилам. Live режим по-прежнему не применяет BGP-рекомендации; симуляция доступна только demo.

1000source→50 rendered/1024tableDOM/1751pageDOM/1851ms dev-ready; раньше24 rendered соответствовали24 в модели,976 правил терялись. Проверены page20 и правило1000/search/unknown indices безExit/no simulation buttons/refresh/clamp1/320px/pinned column/axe.7 main browser,8 pure tests (1200 assignment fixtures и новый1000 ownership/unknown), TypeScript, targeted lint и production build прошли. Снимок docs/ux-ui/screens/optimizer-community-320.png просмотрен.

Осталось5manualPagination:true: scheduler11 fixedkeys, live GRE pools пусты/demo ограничен fixtures, probes schedule толькоdemo, subusers не подключён, trafficflows серверныйtop50 принят с честным указанием среза. Не мигрировать искусственно недостижимые live каталоги. Дальше12.4.6/12.4.7 — повтор общей main/context матрицы после delta. Внешняя12.5 не выполнена.

12.4.6 — общая main регрессия после больших каталогов (2026-10-04)

2026-10-04, HEAD991f2b3.1162 сценария/190 файлов:1161passed,1unexpected,0skipped/0flaky за55.2min. Edge/1worker/retries0/maxFailures12. Единственный сбой terminal-data: поле не получило focus после успешного повтора BFD error. Вероятная гонка requestAnimationFrame с React commit/re-enable. Общая матрица НЕ объявляется полностью пройденной. Доказательство docs/ux-ui/acceptance/main-delta-2026-10-04.json; trace/error сохранены в tmp перед следующими тестами. Перегенерированные этим прогоном исторические PNG восстановлены по явному списку tmp/ux-main-regenerated-screens.json; собственные новые матричные/Community screenshots сохранены.

Все новые большие профили, Firewall/OSPF/optimizer сценарии вошли в этот общий прогон. Статический аудит дополнительно выявил полный join1000WAN в шапке HomeCard и полные site-строки JH/Exit в KPI: число DOM nodes не измеряет высоту текстовых сводок. Следующий12.4.6.1 — фокус после commit и профильный repeat; затем12.4.7 context. Внешняя12.5 отдельно.

12.4.6.1 — исправление гонки фокуса терминала (2026-10-04)

2026-10-04. requestAnimationFrame из finally заменён pendingFocus ref и DOM effect после commit. Поле получает focus только после снятия disabled; unmounted/blocked terminal не перехватывает фокус. Зависимость от lines покрывает быстрый запрос, даже когда executing=true/false попадают в один React batch. Порядок запросов, права, ownership и сохранение команд не менялись.

20 terminal-data/layout passed; все3 формы отказа повторены5раз:15/15passed,0unexpected/flaky. Evidence docs/ux-ui/acceptance/terminal-focus-2026-10-04.json содержит baseHead и SHA256 проверенного source. ESLint и production build прошли; отдельный non-incremental TypeScript повторён после завершения dev-сервера успешно. Первый параллельный tsc попал на временную перезапись .next/dev/types/routes.d.ts; исходники не имели этой ошибки. Исторические6 terminal PNG восстановлены по точному списку.

Это профильное закрытие единственного сбоя main12.4.6, не новый полный main прогон на исправленном HEAD. Следующий12.4.7 —221 context/26files (актуальная discovery; прежняя матрица213/25). Внешняя12.5 остаётся.

12.4.7 — общая context регрессия после delta (2026-10-04)

2026-10-04, HEADb1f8326.221/221passed/26files за15.8min,0unexpected/0skipped/0flaky,Edge/1worker/retries0/maxFailures12. Включены Firewall context и все поздние read/write/backend/mode/ABA/checkpoint сценарии. Evidence docs/ux-ui/acceptance/context-final-delta-2026-10-04.json. Terminal context прошёл на исправленном source. Перегенерированных tracked screenshots нет.

Main12.4.6 относится к991f2b3:1161/1162; единственный focus race исправлен и проверен20+15 в12.4.6.1. Полный main после этого маленького исправления не повторялся. Внешняя12.5 PG/RouterOS/integrations не выполнена; stage12 не завершён. Следующий12.3.64 — высота сводки1000WAN, затем дополнительные CPU/pool профили.

12.3.64 — компактная текстовая сводка WAN (2026-10-04)

2026-10-04. Baseline1000WAN:31783chars/13695px высоты summary на320px, хотя grid уже50rows/1419DOM. В HomeCard теперь preview первых3 WAN с прежними ISP/IP, точный remaining/total и понятная ссылка в copy на существующую вкладку WAN×JH. Для ≤3WAN описание не сокращено. Исходный массив/расчёт/поиск/таблица не срезаются.

Final1000WAN:134chars/86.5px высоты summary; WAN10:130chars/86.5px. В тест добавлены реальные размеры/длина preview, точные counts и мобильный snapshot.12 profile browser +1 screenshot repeat, full ESLint страницы/test и production build прошли. Полный search WAN1000, последняя страница, refresh/clamp/pinnedWAN/320px/axe сохранены. Снимок docs/ux-ui/screens/optimizer-wan-summary-320.png просмотрен;9 historical optimizer PNG восстановлены по явному списку.

Общие main/context доказательства относятся к прежним HEAD; этот небольшой текстовый delta проверен профильными сценариями. Исторический context-delta(a558412/36) сохранён отдельно от нового context-final-delta(b1f8326/221), чтобы ссылки12.4.3 не изменили смысл. Следующий12.3.65 — pure CPU7WAN×1000pool с hard timeout; не запускать в UI. KPI captions/native selector и худшая DFS/full-route комбинация не приняты этим блоком. Внешняя12.5 остаётся.

12.3.65 — CPU-профили pool1000 (2026-10-04)

2026-10-04, UI/source расчёта не менялись. Child script принимает integer count20–1000, hard timeout10с, без API/DB/браузера/сети.7WAN×1000: equal1217.5ms (IDs p0..6), varied7967.5ms (p13..19), freshness не завершился за10с, процесс остановлен. Startup отдельно ~0.4s. Freshness создаёт1000 разных возрастов, будущие timestamps не используются. ESLint скрипта прошёл; корректность ID проверяется после успешного завершения.

Это оставшийся CPU риск, а не performance приёмка. В current DFS повторяются Date.parse/trim/score и оценка upper для ветвей, уже достигших максимум. Следующий12.3.66: score cache только для bounded WAN≤7 DFS с одним snapshot time и early stop при достижении node upper, preserving first tie/order/forced picks/greedy fallback. Проверить1200 legacy oracle fixtures, raw observations, profiles20/1000. Худшая комбинаторика и весь full-route product по-прежнему не ограничены.

12.3.66 — точный выбор проб из большого pool (2026-10-07)

2026-10-07. Score matrix вычисляется только при exact DFS≤7WAN/pool≥WAN, с единым временем ранжирования на назначение JH. Сырые наблюдения/даты не меняются, greedy fallback сохранён. Допустимый score-first greedy путь даёт только lower total, не готовое назначение. Пока DFS не нашёл реальный witness, равные верхние границы НЕ отсекаются; первое равное назначение остаётся в исходном pool order. Node stop требует реального bestAssign. Для каждого кандидата child upper выводится из topK максимумов текущего узла с исключением занятой пробы; уже проигрышные siblings не пересканируют весь pool. Forced pick сохраняется, даже если ветвь отсечена.

1230 seeded сравнений с независимым прежним DFS совпали по точным probe IDs, включая30 смешанных наборов7WAN.10 pure tests прошли: ties/partial matching, single snapshot при переходе часа, прежний greedy для8WAN, unknown/zero/disabled/raw snapshots.51 main browser и8 context прошли; TypeScript без incremental, targeted lint и production build успешны. Historical9 optimizer PNG восстановлены по точному списку.

Pure child CPU1000: equal1217.5→15.6ms,varied7967.5→14.5ms,freshness10с timeout→16.7ms; CPU20:11.5–11.7ms. Child startup отдельно~0.25s. Exact IDs проверены во всех6 профилях. Evidence docs/ux-ui/acceptance/optimizer-probes-cpu-2026-10-07.json содержит source SHA256, baseline HEAD и результаты. Браузерная live ветка7WAN/1000probes:219902bytes/7rows/222tableDOM/1018ms dev-ready; timestamps соответствуют p993..999, после refresh сохраняются,320px без overflow, API mutations отсутствуют. Это не production SLA/нагрузка PostgreSQL/RouterOS и не гарантия произвольного mixed pool: худшая экспоненциальная сложность DFS и full-route product остаются.

Следующий12.3.67: KPI captions JH/Exit (повторы/пустая площадка/unknown), затем separate full-route CPU profile. Общая main/context регрессия12.4.6/7 относится к прежним HEAD; этот delta принят профильными51+8. Внешняя12.5 не выполнена.

12.3.67 — краткие и достоверные KPI-подписи площадок (2026-10-07)

2026-10-07. В существующем ReUI Stats12/KpiStatGrid footer переиспользован ReUI Badge outline/sm. Короткие уникальные названия (≤3 и≤24символов) показываются без повторов; большой/длинный список заменяется точным количеством площадок. Отдельно виден count узлов без площадки: пустые/whitespace/нормализованный — не считаются реальной площадкой. Нет полного join большого каталога. Неизвестный каталог сообщает «Площадки неизвестны»; нулевой topology pool — «Нет узлов в расчёте», потому что live topology исключает offline/disabled, а устройства могут существовать в inventory. Права/выбор узлов/расчёт/источники не менялись.

16 main browser +2 повторных новых профиля после copy-уточнения прошли:1000JH и1000Exit отдельно (без опасного cross product), repetitions/two sites/1000sites/long80chars/unknown/empty/offline/disabled/503 cache/recovery.320px без overflow, caption≤80px, scoped WCAG axe passed. Non-incremental TypeScript до dev, full page/helper/test lint и окончательный production build прошли. ReUI API/validate_usage проверены; primitive/theme не изменены. Historical9 optimizer PNG восстановлены, новые docs/ux-ui/screens/optimizer-sites-{jump-host,exit-node}-320.png просмотрены.

Далее12.3.68 pure child CPU profile full-route product≤100000/timeout10s/memory cap; не грузить тяжёлый baseline в UI. Остаточные DFS worst-case/full-route memory/native selector и внешняя12.5 не объявляются принятыми. Общая main/context регрессия относится к ранее записанным HEAD; текущий footer delta проверен профильными16+2.

12.3.68 — bounded CPU-профиль генерации полных маршрутов (2026-10-07)

2026-10-07. Pure child process без API/DB/браузера/сети, product≤100000/dimensions1–1000/timeout10s/V8heap256MB.1000WAN×1JH×1Exit1000routes≈16.9ms/heapDelta1.8MB;10×100×100100000routes≈329.6ms/22.0MB;100×10×100≈266.7ms/27.1MB. Первый измеренный прогон; точные повторные значения и source SHA256 в docs/ux-ui/acceptance/optimizer-routes-baseline-2026-10-07.json. Heap delta не peak/retained memory, время не production p95/SLA. Проверены count/first-last IDs/bestFirst/сохранение отсутствующих наблюдений. ESLint скрипта прошёл.

Baseline в UI не запускался. Повторный Array.find по1000wanJhLegs на каждую из100000комбинаций даёт лишние линейные сканирования. Следующий12.3.69: map lookup с сохранением первого matching leg и порядка routes/ties, профильный repeat. Полный product всё ещё хранится/сортируется в памяти; опасную произвольную размерность этот профиль не принимает. Далее аудит TX/RX и связи wildcard-пробы с конкретным WAN, прежде чем объявлять observed correctness закрытой. Внешняя12.5 отдельно.

12.3.69 — lookup leg и исключение ненужных расчётов без WAN (2026-10-07)

2026-10-07. WAN/JH map сохраняет первый matching leg, lookup вынесен из Exit loop. JH/Exit legs не строятся, если нет настроенного WAN: их не может использовать ни один full route. Порядок WAN/JH/Exit, сортировка/ties, raw source identity, all routes и unknown community indices сохранены.13pure tests прошли, включая1230 assignment oracle fixtures и новые проверки8route probe ownership/ties/zeroWAN.12browser (large homes/routes/observed/tables) passed; non-incremental typecheck до dev, targeted lint и production build успешны.

CPU final:1000routes13.3ms;100000(10×100×100)49.7ms;100000(100×10×100)44.0ms. До lookup ~284–329ms и267–287ms. Дополнительный zeroWAN baseline0×100×1000 строил100000unused JH/Exit legs:45.6ms/heapDelta24.6MB; после skip11.5ms/0.17MB. Новый profiler допускаетWAN0 и ограничивает также JH×Exit≤100000. HeapDelta не peak/retained memory; полный nonzero product по-прежнему хранится и сортируется в памяти. Evidence docs/ux-ui/acceptance/optimizer-routes-final-2026-10-07.json содержит source SHA256 и точные результаты.

После чтения реального producer обнаружены следующие вопросы достоверности:source btest выполняется на srcClient,TX/RX экспортируются без переименования,optimizer пока читаетTX какDL. srcInterface передаётся только after-ping, не bandwidthTest; поле не доказывает WAN скоростного теста. Producer parser/fallback отсутствующую скорость превращает в0, а explicit avg0 может заменяться mean series. Следующий12.3.70 фиксирует аудит с первичными RouterOS источниками и планирует точечные исправления данных/подписей. Команды/права/правила сетевых операций не менялись; real PG/RouterOS/integrations12.5 не выполнялись.

12.3.70 — аудит источника и смысла observed metrics (2026-10-07)

2026-10-07. Код сопоставлен с первичной RouterOS bandwidth-test документацией. Подтверждены неверное TX→DL, неподтверждённая связь btest с srcInterface/WAN, missing→0/explicit0→mean и отсутствие проверки terminal status перед success write. Это новые ограничения, которые ранее проверенные mock snapshots не доказывали. Отдельный протокол/таблица/схема: docs/ux-ui/optimizer-observed-audit-2026-10-07.md.

Только read-only audit/docs, без DB/RouterOS/сетевых операций. Дальше71direction mapping,72scope labels,73nullable rate parser/producer/DTO,74terminal confirmation. Фактические команды, права и routing rules не меняются этой серией; real12.5 отдельно. Исторические0 не переписывать автоматически.

12.3.71 — направление измерений DL/UL (2026-10-07)

2026-10-07. Для Home→JH RX клиентского bandwidth-test отображается как DL к Home, TX как UL от Home. JH→Exit использует тот же смысл; для reverse Exit→JH клиент на дальней стороне, поэтому TX→DL/RX→UL. Raw getter сохраняет nullable/zero/decimal и исходную дату; модельные maxDl/maxUl применяются к правильной стороне. Команды RouterOS, параметры теста, подбор probe IDs и правила операций не менялись. Ввод/трактовка скоростных данных исправлены по источнику srcClient и RouterOS CLI docs (ссылка в observed audit).

15pure tests passed:1230 assignment oracle fixtures, source ownership/ties/noWAN, новые asymmetric limits и forward/reverse/zero/null.51main browser и6 observed повторных (включая2новых direction/asymmetric сценария) прошли; TypeScript до dev, targeted lint и production build успешны. Старое ожидание ↓TX исправлено на ↑TX, а не ослаблено. Historical9 optimizer PNG восстановлены. Полная main/context матрица последнего общего прогона относится к прежним HEAD; этот delta проверен профильными сценариями.

Наблюдения по-прежнему не доказывают конкретный WAN bandwidth-test: следующее72scope labels. Backend producer missing→0/terminal status и OSPF metrics/route builder TX→DL требуют73–75. OSPF traffic fallback уже используетRX→DL, измеренная дата speed-probe намеренноnull и не требует изменения. Real12.5 отдельно.

12.3.72 — область скоростного снимка и единицы (2026-10-07)

2026-10-07. Матрица с probe snapshot явно объясняет:скорость — пара устройств, привязка WAN расчётная, DL кHome/UL отHome. В existing «Как читать расчёт» добавлена роль srcInterface для Ping после теста и выбор пути скорости маршрутизацией устройства. Скорости и model limits подписаны Мбит/с. Новых RouterOS параметров, routing rules, методов или API операций нет.

10browser (observed forward/reverse/null/zero,20/1000probes,1000WAN/100JH) прошли; TypeScript до dev, targeted lint и production build успешны. При noProbe измерения остаются неизвестными. Scope note находится один раз над таблицей, без повторения длинного предупреждения в каждой ячейке.

Остаются73missing→0/nullable consumer,74native terminal status,75OSPF direction. Чтение frontend consumer подтвердило ещё Math.round(null)→0 и доверие POST без runtime DTO; фиксировать73 вместе с producer. Границы мобильного pinnedWAN и соседней metric cell требуют отдельного76geometry теста, а не только проверки первого столбца. Внешняя12.5 отдельно.

12.3.73 — неизвестная скорость и подтверждение POST (2026-10-07)

2026-10-07. Backend parser возвращает null для отсутствующих/невалидных скоростей, переводит RouterOS SI bits/s в Мбит/с и сохраняет явный total-average 0 вместо замены средним. Серии включают только валидные значения; отсутствующие samples не получают нулей, временная геометрия пропусков здесь не реализована. Поля БД уже nullable, миграции и переписывания исторических записей нет. Frontend проверяет ok/result/runId и nullable finite nonnegative rates до публикации ответа. Контекст проверяется раньше DTO, поздний ответ чужого источника игнорируется. Running averages null; Math.round(null) исключён. Ошибка сохраняет предыдущие probe averages и подтверждённую историю.

7 pure parser/DTO +9 isolated scheduler journal tests прошли.71 main browser (uptime-links, speed-data, large-speed-history),8 context прошли; non-incremental TypeScript, targeted lint (9 существующих предупреждений uptime,0 errors), backend и frontend production build успешны. Первые два новых браузерных прогона обнаружили неверный KPI role selector и неоднозначность одинаковой подписи в истории/строке; selectors уточнены, финальный связанный профиль полностью passed. Historical large-speed-history-320 PNG восстановлен.

Следующий74: native terminal status ещё не проверяется перед done/DB write.75OSPF direction и76mobile metric geometry остаются. DTO доказывает целостность ответа, но не факт выполнения на устройстве. Реальная RouterOS/PG приёмка12.5 отдельно.

12.3.74 — подтверждённое завершение bandwidth-test (2026-10-07)

2026-10-07. Pure guard проверяет структуру native rows, все известные failure statuses и последний сообщённый status. Только done testing допускает дальнейший расчёт, after-ping и DB success write. Connecting/running, отсутствие статуса, неизвестный status, malformed response или error/failure/trap marker отклоняются с неизвестным результатом; native failures имеют краткие русские сообщения. Числовой enum не принимается как строковое подтверждение. Подтверждённый one-direction result может иметь null на другой стороне и0 на измеренной.

16 pure tests (3status,4rates,9scheduler) и backend build passed. Проверка placement/callers по source: HTTP и scheduled collection используют общий execute, их catch вызывает прежний failure recorder, который сохраняет старые probe averages и пишет error run с nullable rates. Полная DB/network orchestration не запускалась; это source review и pure guard tests, а не внешняя приёмка. Команда bandwidth-test и её параметры, locks, routing rules, permissions и DB schema не менялись.

Источник native statuses: RouterOS CLI bandwidth-test. Последний reported done допускает последующие rows без status, но любые failure markers отклоняются даже после completion. Реальный REST shape/версия RouterOS и PG writes требуют12.5. Следующие75direction OSPF и76mobile geometry.

12.3.75 — направление скоростных входов OSPF (2026-10-07)

2026-10-07. Источник выбирается через srcServerId текущего роутера, поэтому единый pure getter читает RX как DL и TX как UL. Getter используется raw observed и model speeds; route builder вызывает модельный helper вместо прежнего обратного сопоставления. Raw zero/null/fraction/source/date сохраняются. Модельные округление, floor1 и traffic fallback сохранены; formula Cost, pingWeight, unique probe assignment и порядок операций не менялись. Рекомендации Cost могут измениться из-за исправленных asymmetric inputs. Traffic fallback RX→DL/TX→UL уже был верен. Дата speed остаётсяnull, Ping date не подставляется.

Четыре backend suites passed: pure metrics (новые asymmetric80.75/30.25,0/null,rounding/floor/fallback), identity, plan и HTTP optimizer с DI/in-memory writes. Backend build passed. Source review подтвердил фильтрацию по srcServerId и вызов helper в builder. Реальный DB builder и RouterOS не исполнялись; HTTP suite подменяет buildOptimizationPlan и отдельно проверяет отсутствие операций до валидного плана. Frontend не менялся, повторный browser/build для него не требовался.

Следующий76: на320px проверить видимость всей соседней metric cell за pinnedWAN, исправить column sizing при подтверждённой проблеме. Общая main/context регрессия прежних HEAD требует обновления позже;12.5 остаётся внешней.

12.3.76 — читаемая мобильная WAN/JH матрица (2026-10-07)

2026-10-07. Геометрический baseline320px подтвердил дефект: viewport right303,pinned right197,cell right397 (200px колонка рядом с180px WAN). Пропорции ColumnDef на телефоне теперь112/160, desktop180/200 сохранены (actual table fill может расширять размеры). Hook useIsMobile и installed ReUI DataGridShell/ScrollArea/Table переиспользованы, primitive/hook/theme не менялись. Имя/интерфейс WAN ограничены truncate/min-w-0; полное значение остаётся DOM text/title и доступно поиску.

6 новых geometry cases320/390/1440×1/7JH проверяют всю metric cell и её speed text относительно pinnedRight/viewportRight, все7JH через переключение колонок, long WAN, отсутствие page overflow/API writes. Resize320→1440→320 прошёл, scoped WCAG axe passed. Related26browser, targeted lint, non-incremental TypeScript и frontend production build passed. Первый baseline намеренно failed на реальном переполнении, финальные assertions не ослаблялись. ReUI API и audit checklist прочитаны: v9useTable/dataGridFeatures/table/recordCount, existing layout/semantic tokens/security/scroll composition сохранены.

Доказательства: геометрия до/после, экран320px просмотрен. Historic9optimizer и2speed PNG восстановлены; предыдущие снимки не переписаны. Следующий12.4.8main/12.4.9context повтор на новом HEAD. Внешняя12.5 не выполнена.

12.5.0 — подготовка внешнего протокола (2026-10-07)

2026-10-07. Протокол12.5 подготовлен по фактическим backend routes/services/migrations: PG bootstrap0008/0009, backup/restore/rollback и writer lifecycle; outbox claim/dedupe/CAS/status-history; native bandwidth terminal/direction/scope, OSPF и остальные сетевые операции; реальные роли/интеграции. Каждая строка задаёт независимое подтверждение результата и очищенные артефакты. Локальные ссылки проверены. Внешние операции не выполнялись, credentials/dumps не читались и не сохранялись.

Source review: stopScheduler очищает таймеры, stopTrafficFlowListener запускает flush без ожидания, поэтому эти вызовы не считаются доказательством завершения всех writers. PG-6 и остановка senders остаются предметом реальной проверки, не закрываются checkbox/timeout. Протокол не добавляет команды к сетевым операциям и не объявляет реализованными отсутствующие BGP-prefix evaluator/live GRE schedule/processing recovery.

12.4.8 main1176 продолжает выполняться на runtime source HEAD579e816. Этот блок меняет только docs; исходники/конфигурация тестов не изменились после старта. Дальше завершить main, сохранить результат и запустить12.4.9context.12.5 не принята.

12.4.8 — общая main регрессия после исправлений оптимизатора/скорости (2026-10-07)

2026-10-07. Runtime HEAD579e816:1176/1176passed,0unexpected/skipped/flaky,34.9min. Edge/1worker/retries0/maxFailures12. После старта добавлен только внешний протокол docs5fedf7a; runtime diff579e816→current проверен пустым. Итог main записан отдельно от исторического12.4.6. Сырой JSON сохранён в tmp/ux-main-final-20261007.json. Исторические PNG, перегенерированные тестами, восстановлены по проверенному списку tmp/ux-main-regenerated-screens-20261007.json. Чужие skill/AGENTS/config/cache изменения не включены.

Этот общий прогон содержит новые large pool/site captions, direction/scope/nullable POST и6mobile geometry cases. Старый terminal focus race в этом прогоне не повторился. Source review дополнительно нашёл обновление speed probe только по id без endpoint ownership; snapshot update и run insert были отдельными операциями. Следующий небольшой12.3.77 защищает привязку пары и атомарность этих двух записей, без смены RouterOS команд; затем12.4.9 полныйcontext. Внешняя12.5 отдельно.

12.3.77 — пара устройств и атомарная запись speed-run (2026-10-07)

2026-10-07. Preflight сверяет probeId/srcServerId/dstServerId до создания RouterOS client/команды, mismatch/deleted даёт409. UPDATE snapshot success/error содержит id AND source AND destination и RETURNING id. Если пара изменилась/проба удалена за время native test, её snapshot не обновляется, история actual endpoints сохраняется с probeId=null. Snapshot и run insert теперь внутри одной Drizzle transaction для success и failure. Ad-hoc run без probeId сохраняет историю без обновления пробы. Команды, параметры, locks, permissions/schema не менялись.

25 pure/DI tests (9новых persistence: preflight, zero, source/destination/delete race, update/insert/pre-commit failures,ad-hoc;4rate,3status,9scheduler),5browser speed-test (новый409 и прежние ошибки/timeout/nullable/foreignrun), targeted test lint и backend build passed. Pure transaction в памяти моделирует rollback и отказ до commit, не доказывает потерю реального PG commit acknowledgement. Source placement и SQL predicates просмотрены; PG concurrency/transaction semantics требуют12.5.

Полный main1176 относится к579e816 до backend delta; frontend runtime после него не менялся, добавлен1профильный409тест. Следующий12.4.9context; после него12.3.78: adapter каталога сохраняет observations по id, нужно проверить смену пары и local publish после config save. Текущий77защищает пару при запуске/результате, не является CAS полной версии параметров пробы.

12.4.9 — общая context регрессия после speed ownership (2026-10-07)

2026-10-07, HEADa3fcba0.221/221passed,26files,0unexpected/skipped/flaky,7.5min. Edge/1worker/retries0/maxFailures12. Итог context сохранён отдельно от старых матриц; source tmp/ux-context-final-20261007.json. Смена backend/mode, ABA/late data/write/permission, закрытие scope и checkpoint прошли.

Main1176 на579e816 и backend ownership delta25pure/5browser наa3fcba0 остаются разными доказательствами, HEAD не подменён. Следующий78: при смене пары adapter upsert и frontend optimistic publish сохраняли старые observations; исправить после общего прогона и проверить профиль. Внешняя12.5 всё ещё не выполнена.

12.3.78 — снимок при изменении пары и приоритет истории (2026-10-07)

2026-10-07. Catalog replacement читает и блокирует существующие probe rows внутри прежней транзакции/advisory lock. Смена source/destination или новый id сбрасывает9наблюдаемых полей вnull, перестановка/enable и та же пара сохраняют measurements. История не удаляется. Frontend публикует configuration только после подтверждения; той же паре берёт последние observations из текущего state вместо readonly копии старого draft. Новый target получаетnull. Общий emptySpeedProbeObservations переиспользован через contracts; ReUI primitives/theme/composition сохранены.

Строка пробы выбирает running run, затем более новый подтверждённый run той же пары/интерфейсов только при существующем snapshot lastStatus/lastRunAt; иначе текущий snapshot. Это исключает старый history overlay после смены пары/возврата и сохраняет приоритет нового nullable результата над старым999. Первые два новых test runs выявили ошибки relative has/inert selector; исправлены проверки области формы/фонового state. Первый общий профиль72/73 показал реальную регрессию приоритета новогоnull над старым snapshot, она исправлена без изменения теста. Финальный73/73passed.

14pure (5новых frontend snapshot+9persistence), HTTP/DI/RBAC speed-probes write, contracts/backend build,73browser uptime/large history,8uptime context, non-incremental TypeScript, targeted lint (0errors,9предыдущих предупреждений uptime) и frontend production build passed. Финальная новая проверка: API save error сохраняет прежние80; успешная смена/возврат пары не показывает их как новый snapshot, history/KPI1run сохранены. Historic2speed PNG восстановлены. Реальное FOR UPDATE/concurrency требует12.5; здесь DI и source review.

Этот delta выполнен после общих main579e816/contexta3fcba0; общие результаты не переименованы в проверку нового HEAD. Следующий79: POST command body ещё использует parseInt/enum defaults; проверить строгий DTO до DB/native, сохранив валидные ad-hoc/scheduled сценарии и существующие команды/права. Полный CAS параметров пробы и реальные native timestamps также не объявлены проверенными. Внешняя12.5 отдельно.

12.3.78.1 — удаление неиспользуемого кода прежней таблицы (2026-10-07)

2026-10-07. Из uptime удалены неиспользуемые MiniBar/resBarColor/resPctColor/SortIcon/ResSortKey,2импорта и чистое вычислениеy1,3неактуальных eslint-disable directives. Reference search и предыдущий lint подтверждали отсутствие использования; активные render/API/measurement paths не менялись. Установленные ReUI primitives/hooks/theme не изменены.

Targeted lint страницы/helpers/tests теперь0errors/0warnings (до этого9warnings), non-incremental TypeScript и production frontend build passed. Для удаления неиспользуемых объявлений не добавлены повторяющие реализацию тесты; функциональный78 delta73browser/8context/14pure+backend HTTP/RBAC сохранён в предыдущем блоке. Следующий79: runtime command body schema до DB/native. Внешняя12.5 не выполнена; полная матрица относится к точным ранее указанным HEAD.

12.3.79 — строгие параметры команды speed-test (2026-10-07)

POST /uptime/speed-test проверяет runtime DTO до поиска устройств и запуска native операции. Отклоняются частичные/неканонические ID, неверные enum, дробная или недопустимая длительность, неверные типы текстовых полей и NUL. Валидные значения по умолчанию tcp/both/10s, ad-hoc без probeId, обрезка пробелов и прежние команды/права сохранены. Проверка вынесена в общий контракт, HTTP route — в фабрику с зависимостями. Ошибки запуска сохраняют нормализованные параметры; конфликт пары даёт409.

26 неверных HTTP bodies не вызывают поиск серверов, запуск или запись истории. Fastify inject проверил defaults/ad-hoc,404,409,400,502/timeout и JWT401/403/разрешённый mm:uptime:write. Дополнительно16 pure rate/status/persistence проверок, contracts/backend/frontend production builds, non-incremental TypeScript, targeted contract lint и diff check прошли. PostgreSQL и RouterOS не запускались; внешний12.5 остаётся открытым. Общие main/context результаты не объявлены проверкой нового HEAD.

Следующий12.3.80: текущая привязка защищает пару устройств, но не изменение интерфейсов, протокола, направления и длительности во время теста; проверить принадлежность snapshot полным параметрам без изменения сетевых команд.

12.3.80 — принадлежность результата параметрам speed-пробы (2026-10-07)

Preflight перед созданием RouterOS client проверяет id, оба устройства, оба интерфейса, протокол, направление и длительность. Изменение параметров возвращает409. Условный UPDATE успеха и ошибки сверяет те же поля; поздний результат сохраняется в истории с probeId=null и не перезаписывает изменённый snapshot. Enable/order/telemetry не относятся к параметрам измерения. Сетевые команды, locks и права сохранены.

23 pure rate/status/persistence проверки прошли: 7 новых проверяют каждый изменённый параметр для late success/error, неизменный контекст с явным0 и preflight. HTTP/DI проверил409 как для пары, так и для параметров, прежние26 invalid inputs/defaults/RBAC; backend/contracts build passed. Реального PostgreSQL/RouterOS не было: source review условного SQL и DI не заменяют12.5. Это сравнение параметров, не версия строки и не защита от ABA изменения с возвратом тех же значений.

Следующий12.3.81: каталог и frontend пока сбрасывают observations только при смене пары; распространить правило на все параметры измерения, сохраняя историю и enable/reorder.

12.3.81 — снимки и история при изменении параметров измерения (2026-10-07)

Общий sameSpeedMeasurement сравнивает пару, интерфейсы, протокол, направление и длительность в валидных read/write формах. Каталог читает полный конфигурационный снимок под прежним FOR UPDATE; смена любого параметра сбрасывает9 observations. Frontend публикует это правило только после API confirmation и выбирает историю по тем же параметрам. Enable/reorder сохраняют последние наблюдения, в том числе0; history не удаляется. ReUI компоненты и сетевые команды сохранены.

10 pure snapshot checks, HTTP/DI/RBAC каталога (все изменяемые параметры и сохранение0 при enable),74browser uptime/large history,8uptime context, targeted lint0errors/0warnings, non-incremental TypeScript и contracts/backend/frontend production builds прошли. Новый браузерный сценарий: save500 сохраняет80; успешная смена длительности20 и возврат10 оставляют snapshot unknown, история80 и KPI1run остаются. Перегенерированные3 исторических PNG восстановлены. Реальные PG locks/native tests требуют12.5.

Следующий12.3.82: POST receipt пока не возвращает серверное время, live publish использует время браузера и ставит Ping date даже без afterBtPing; исправить совместимо и проверить неполный/невалидный receipt. Общие main/context результаты не переименованы в проверки нового HEAD.

12.3.82 — серверное время результата и отсутствующий Ping (2026-10-07)

Backend возвращает createdAt из того же pingNow, который записывает в snapshot/history: время перед after-ping, не начало bandwidth-test. Frontend валидирует ISO timestamp, использует его в истории и локальном snapshot. Старый receipt без createdAt совместим: история сохраняет клиентское начало, snapshot использует время получения; это ограничение совместимости, не подтверждённое серверное время. Неопционально переданный неверный timestamp отклоняет receipt.

Без afterBtPing новая операция не получает lastPingAt; выбор нового done run не подставляет прежний Ping snapshot. Явный0 сохранён. 4 pure receipt проверки, HTTP/RBAC с server timestamp passthrough, types/lint и contracts/backend/frontend builds прошли. Финальный76/76 browser прошёл. Первый прогон остановлен после ошибки нового селектора: в selected-probe scope кнопка называется «Обновить данные»; исправлены только новые тесты, отдельно2/2 и затем полный76/76 passed. Проверены дата из сервера в таблице, старый99 не наложен, отсутствующий Ping и новый0. Исторические3 PNG восстановлены.

Проверка согласованности журналов до этого блока:104 одинаковых numbered records в обоих документах, все с датами, без пропусков/дублей. Следующий12.3.83: таблица и карточки пока выводят timeout при любом null RTT; неизвестный/отсутствующий результат должен быть отделён от подтверждённого отсутствия ответов. Внешняя12.5 открыта; общий main/context не объявлен проверкой нового HEAD.

12.3.83 — неизвестный RTT и отсутствие ответов Ping (2026-10-07)

История показывает «Нет данных» без afterBtPing, «RTT неизвестен» при null RTT и неопределённых/частичных потерях, «Нет ответов» при подтверждённых100% потерь. Ошибка и измеренный0 остаются отдельными состояниями. Карточка speed-пробы и связанная Ping-проба используют те же смыслы. Для null RTT шкала не заполнена как измерение. ReUI Data Grid/Frame и сетевые команды сохранены.

81/81 browser uptime/large history passed, включая5 новых состояний missing/unknown/loss100/zero/error в истории и карточке, отсутствие старого99 и reflow320px. Targeted ESLint0errors/0warnings, non-incremental TypeScript и contracts/frontend production build прошли. Для простой подписи не добавлены повторяющие реализацию unit tests. Исторические3 PNG восстановлены. Backend/native parsing не изменены; реальные native loss/status требуют12.5.

Следующий12.4.10: общая main матрица на новом HEAD после блоков79–83; затем12.4.11context. Предыдущие main1176(579e816)/context221(a3fcba0) сохраняются как отдельные результаты, не доказательство нового HEAD. Внешняя12.5 остаётся открытой.

12.4.10 — общая main регрессия после speed API/UI (2026-10-07)

Runtime HEAD9680a6422ba951a1737207663acbd6d562710b62:1186/1186passed,193files,0unexpected/skipped/flaky,32.8min. Edge/1worker/retries0/maxFailures12. Новый итог main; сырой источник tmp/ux-main-speed-final-20261007.json. Предыдущий main1176 на579e816 сохранён отдельно. Во время прогона HEAD и runtime не менялись. Исторические PNG восстановлены по проверенному списку tmp/ux-main-speed-regenerated-screens-20261007.json; перед запуском screenshots были clean.

Новые10 browser scenarios после прежней общей main вошли в матрицу: конфликт пары, смена пары/длительности, server timestamps/Ping и5 nullable Ping состояний. Дополнительно37pure snapshot/receipt/rate/status/persistence и HTTP/DI/RBAC обоих speed routes прошли на9680a64; contracts/backend/frontend builds уже passed по блокам79–83. В dev logs были отказы фоновых чтений localhost:8000 (OSPF/catalog/sidebar-counts/EvoBGP); backend не запущен, assertion failures нет. Это локальная UI/DI приёмка, реальные интеграции не проверены.

Следующий12.4.11: полная context матрица на том же runtime. Внешняя12.5 открыта: реальные PG transactions/locks/commit acknowledgement, RouterOS, интеграции и остановка worker требуют стенда. Чужие skill/AGENTS/config/cache изменения не включены.

12.4.11 — общая context регрессия после speed API/UI (2026-10-07)

221/221passed,26files,0unexpected/skipped/flaky,7.8min. Edge/1worker/retries0/maxFailures12. HEAD683148d6201aca73d1be267db8110ff1e14faf53; runtime9680a6422ba951a1737207663acbd6d562710b62. Между ними изменены только main report и документы; git diff по app/components/lib/packages/backend перед стартом пуст. Новый итог context, сырой источник tmp/ux-context-speed-final-20261007.json. Старые context221 наa3fcba0 и main1176 на579e816 сохранены отдельно.

Main1186/1186 на9680a64 и эта context матрица теперь включают runtime блоков79–83. Дополнительно7 чистых producer DTO checks подтвердили ISO преобразование PostgreSQL timestamp с сохранением instant, nullable/zero и отказ от неверных записей. Вместе с предыдущими37 —44 чистых теста; HTTP/DI/RBAC speed command/catalog и contracts/backend/frontend builds passed. Реального подключения к PostgreSQL/RouterOS не было.

Следующий12.5: подготовленный протокол внешней приёмки. По имеющимся локальным мокам нельзя подтвердить реальные PG rollback/row locks/commit acknowledgement, RouterOS и внешние интеграции. Для этого нужен отдельный стенд. Этап12 остаётся открытым до внешней приёмки; локальные матрицы не являются заявлением о полной production готовности. Локальные коммиты без push; чужие изменения сохранены.

12.5.1 — подготовка удалённого тестового Docker-стенда (2026-10-07)

По прямому поручению пользователя подготовлен временный сервер161.104.46.222,root,Debian13.7 trixie/x86_64. До установки Docker отсутствовал;1CPU/1973MiB RAM,23GiB свободно. Установлены Docker Engine29.8.2,Compose5.6.0,Buildx0.37.1 из официального apt repository,git/python3 и4GiB swap. Docker systemd enabled/active,hello-world passed. SSH и сетевые настройки подключения сохранены.

Создан /opt/mmapp-test (0700),Compose по main с отдельными именами/project/data,ограничением logs,loopback3000/8000 и фиксированными тегами. Пароль SSH не сохранён в репозитории; PG/JWT secrets сгенерированы на сервере в.env0600 без вывода. Compose config --quiet passed; SHA256 совпал с локальным шаблоном. Реальный PostgreSQL18.6 запущен,healthy и SELECT version() passed; порт БД не опубликован. Паспорт и дальнейшие команды, Compose, env-шаблон.

Это подготовка инфраструктуры, не приёмка PG-1/restore/native: backend/frontend ещё не собраны и не запущены, bootstrap не выполнен. Следующий12.5.2 — чистые CI build contexts,закреплённые образы без push,bootstrap/health и начало PG-протокола. Локально docker CLI отсутствует; серверный Docker готов. Публикация Gitea/CI не выполнялась; локальный коммит без push. Ресурсы стенда не представляют production performance.

12.5.2 — сборка Docker и запуск приложения на тестовом сервере (2026-10-07)

Собраны backend/frontend из закреплённого коммита4d88b97d490b2342aa4de81d093a0b8d4902e8d4,через чистые build contexts по CI main. Архив8MiB не содержит локальных.env/лицензии/ключей/node_modules. Образы mmapp-test/backend:ux-4d88b97 и mmapp-test/frontend:ux-4d88b97 созданы на сервере без push;version1.0.0-test.4d88b97,revision label сохранён. Контейнеры запущены наloopback;backend/PostgreSQL healthy,health напрямую/черезfrontend status:ok. SSH-туннель3000/8000 открыт для проверки.

Реальный PostgreSQL применил9миграций,включая0008/0009;CHECK разрешает5статусов outbox и resolution_version>=0. После restartbackend совпали контрольный uptime_settings(id1/retention14) и список миграций;health восстановился. Пустые servers/probes/history прочитаны через API. Первый live browser smoke:3экрана200,безJSerrors/API>=400,320px fits,безHTTP-моков. Снимок320px просмотрен.

Smoke обнаружил ошибку Internet path приHTTP200: внешний sampledAt пришёл строкой PostgreSQL вместоISO;корректный snapshot отклонён строгимfrontend. Общий smoke не является полной приёмкой: UI-source error сохранён в отчёте. Следующий12.5.3 — нормализация producer timestamp,пересборка и повтор live-smoke. PG backup/restore/concurrency/native/integrations не проверены. Внешний PG-1 проверен bootstrap/restart/schema/control-row в указанной границе.

12.5.3 — нормализация даты Internet path на границе API (2026-10-07)

Выявленный на реальном Docker/PG дефект исправлен mapper/GET latest: внешний PostgreSQL sampledAt преобразован вISO без смены instant;payload не изменён. Неверные дата/payload возвращают502. Строгийfrontend DTO сохранён. Pure collector/mapper tests и6frontend path contract tests прошли,contracts/backend build passed. Сетевые команды/правила не менялись.

Source673e5ba444ced304ea099a99108964e1c471482f:backend/frontend пересобраны с version1.0.0-test.673e5ba и revision labels;образыux-673e5ba запущены,backend/PG healthy. APIlatest отдаёт одинаковыеISO датыsnapshot/outer;записьPG и контрольные настройки/9миграций сохранились. Итоговый real browser smoke:3экрана200,54APIreads200,0JSerrors,320px fits,Internet path подтверждён,HTTP-моков нет. Первое повторное ожидание скрытой подписи свежести поправлено раскрытием штатного блока;проверка данных послеpatch прошла. Дашборд320px просмотрен.

Паспорт стенда содержит image IDs,версии,доступ и ограничения. SSH-туннельlocalhost3000/8000 открыт;приложение работаетнаloopback тестового сервера. Следующий12.5.4 — PG backup/restore/concurrency/права и остановка writers/workers по протоколу. NativeRouterOS/Telegram/Portal не проверены,вся12.5 не закрыта. Предыдущие общиеmain/context относятся к своимHEAD,не к этомуbackend patch. Локальные коммиты безpush;секреты/чужие изменения не включены.

12.5.4 — подключение первого реального CHR к тестовому стенду (2026-10-07)

По поручению пользователя в Docker-приложение161.104.46.222 добавлен CHR194.226.121.150,serverId1. HTTPS443 отклонял соединение;SSH read подтвердил www80 enabled,www-ssl443 disabled,сертификатов нет. Пользователь явно выбрал HTTP REST безTLS. Запись обновлена через штатныйPUT наport80/useSsl=false;дубликат не создан. Конфигурация RouterOS не изменялась;SSH использован только для чтенияresource/services/certificates.

Test-connection200:identityCHR,RouterOS7.24.5 stable,CHR OpenStack Foundation OpenStack Nova. Poll200/statusonline,GET200 подтвердилonline/версию/model/polledAt. После poll имя в приложении сталоCHR по штатнойidentity синхронизации. Typehome-router — default существующей формы/контракта;роль маршрутизации отдельно не назначалась. Очищенное доказательство содержит только несекретные поля;реальныйUI row виден,HTTP-моков нет.

Первое обновление из вспомогательного скрипта использовалоPATCH и получило404;по исходникам исправлен метод наPUT,успешный ответ200 подтверждён. Пароль не записывался в репозиторий/отчёт/вспомогательный файл;передан API для хранения в тестовойБД как предусмотрено приложением. Нет заявлений о speed/VPN/routing apply:сейчас проверены подключение и чтение/опрос. Для bandwidth-test потребуется второе устройство. Следующий12.5.5 — PG backup/restore/concurrency/права/workers и профильные сценарии сCHR по протоколу. Все коммиты локальные,безpush.

12.5.5 — второй CHR и подтверждённая пара устройств (2026-10-07)

По поручению пользователя добавлен CHR104.165.244.7,serverId2. HTTP REST80/useSsl=false,admin/пароль переданы только API через скрытыйprompt;в Git/отчётах/скрипте секрет отсутствует. Test-connection200/identityCHR/RouterOS7.24.5 stable,создание201,poll200,statusonline,повторныйGET200. Первая запись194.226.121.150(id1) такжеonline. Очищенный паспорт пары. Дубликат не создан,конфигурацияRouterOS не изменялась.

Имена обоих устройств после штатнойidentity синхронизации —CHR;различать поIP/id. Typehome-router(defaultконтракта),специальнаяроль отдельно не назначалась. Следующий12.5.6 — короткие nativeTCP bandwidth-test дляtransmit/receive/both и независимоеGET истории;PGbackup/restore/concurrency/права/workers и остальные12.5 остаются открыты. Все коммиты локальные,безpush.

12.5.6 — реальные TCP bandwidth-test на паре CHR (2026-10-07)

Source194.226.121.150(id1) → destination104.165.244.7(id2),RouterOS7.24.5;приложение673e5ba на161.104.46.222. Первыйtransmit3s вернул502/native «не смог подключиться»;GET истории подтвердилerror иTX/RXnull. Остальныеавтоматические запуски остановлены. ЧтениеRouterOS показалоbandwidth-server enabled=false наобоихCHR. Первоначальная ошибка.

Пользователь явно разрешил включитьслужбу наобоих устройствах сauthenticate=true. POSTset/независимыйGET200 подтвердилиenabled=true,authenticate=true,max-sessions100 сохранён. Это единственное изменение конфигурацииRouterOS в этом блоке;служба остаётся включённой для дальнейших тестов. Настройки и взаимныйPing:3ответаиз3 в каждом направлении,0%потерь,примерно53–56ms.

Повторные короткиеTCP tests transmit/receive/both по3s прошлиHTTP200;native массивзаканчиваетсяdone testing. Transmit:TX1771.419912Mbps/RXnull;receive:TXnull/RX1454.885984Mbps;both:TX1124.95272/RX863.660264Mbps. After-ping53–54ms/0%loss. Очищенные API receipts и независимый GET истории совпали поrunId/endpoints/direction/duration/averages/date/status. Nativeданные не подменены моками;неизмеренная сторонаnull,первый отказ не объявленdone/zero.

RealUI показывает3successful и1failedhistoryrows,неизмеренная сторона «Неизвестно»,320px fits. ПервыйUI-selector ожидал русские «Готово/Ошибка»,но существующаятаблица выводитdone/error;проверка уточнена пофактическим caption,продуктовый код не менялся. Это короткая функциональная проверкаTCP,не benchmark устойчивой скорости и неWAN-interface/source binding. Ad-hoc runs безprobeId:probe ownership/snapshot race этим не проверены. PGbackup/restore/concurrency/права/workers,ROS остальныеошибки/UDP/OSPF/VPN/интеграции ещё не приняты. Следующий12.5.7 — продолжение протокола;локальныйкоммит безpush,credentials в evidence отсутствуют.

12.5.7 — реальный архив PostgreSQL, права и конкуренция операций (2026-10-07)

Стенд 161.104.46.222, source 673e5ba, PostgreSQL/server и pg_restore/client 18.6. Очищенный отчёт. Для проверки прав временно включён AUTH_REQUIRED=true; JWT с тестовым issuer сформированы только в памяти контейнера. Восемь запросов backup/restore: anonymous и wrong issuer → 401, settings writer и wrong app → 403. Admin mm:settings:admin получил backup HTTP200, 475225 байт, PGDMP, SHA256 a6b66402b28bdb146cae9712c384979aa1c1000fee19cbc97c0ec045b673c002, outcome {} без предупреждений. Настоящий Portal SSO и отсутствие процессов при отказах отдельно не инструментированы: PG-7 принят только в границах HTTP RBAC.

PG-2: pg_restore --list прочитал 907 TOC entries, включая servers, uptime_settings, uptime_speed_test_runs и schema_migrations. Архив успешно восстановлен pg_restore --single-transaction --exit-on-error в отдельную mmapp_acceptance_20261007, exit0. Независимые SQL сравнили исходную/проверочную БД: два server ID/IP, retention14, девять миграций, пять speed history rows с одинаковым digest, servers_id_seq last_value2/is_called=true. Новая запись после restore не выполнялась; API restore основной тестовой БД этим не проверен. Архив содержит учётные данные и остался только на сервере: data/acceptance-private 0700, dump0600, вне Git. Проверочная БД сохранена, активных соединений к ней после теста0.

PG-5: отдельная SQL-транзакция временно удерживала ACCESS EXCLUSIVE lock таблицы servers, первый HTTP backup запустил реальный pg_dump. Независимое соединение наблюдателя подтвердило application_name=pg_dump/wait_event_type=Lock/wait_event=relation. Конкурирующий POST restore с валидным доверенным архивом получил409 «Операция с базой приложения уже выполняется». После ROLLBACK тестового lock первый backup вернул200/PGDMP/478793 байта. Первая попытка наблюдения использовала кешированный stats snapshot внутри удерживающей транзакции и не увидела процесс; исправлена отдельным observer connection, повторная проверка прошла. Первый контрольный SQL ошибочно называл таблицу uptime_speed_runs; исправлен на uptime_speed_test_runs.

Выявлен незакрытый PG-6: stopScheduler отменяет таймеры без ожидания текущих jobs; stopTrafficFlowListener вызывает flushPending без await и не подтверждает завершение worker. API restore основной БД не запускался. После проверки AUTH_REQUIRED возвращён в false, /api/auth/config это подтвердил, /health ok/version1.0.0-test.673e5ba; listener по-прежнему disabled/alivefalse/boundfalse. Код продукта и RouterOS в этом блоке не менялись. Следующий 12.5.8: обеспечить ожидание завершения jobs/flush/worker, проверить lifecycle перед PG-3/4; остальной протокол остаётся открытым. Локальный коммит без push.

12.5.8 — ожидание заданий планировщика перед операцией с БД (2026-10-07)

Исправлена первая часть обнаруженного в12.5.7 lifecycle: scheduler-running закрывает admission до ожидания всех активных jobs. Слот освобождается в существующем finally после collector и записи scheduler journal. Ожидание ограничено30сек; при таймауте pg_dump/pg_restore не запускается, исходная ошибка сохраняется, consumers проходят стандартную попытку перезапуска. Повторный запуск уже выполняющейся job по-прежнему отклонён. system-database-backup подключён к новым stopSchedulerForDatabaseOperation/restartSchedulerAfterDatabaseOperation; обычный stopScheduler для существующих потребителей сохраняет синхронный контракт.

Новые ручные запуски во время паузы получают409 «Планировщик приостановлен для операции с базой», вместо неверного «Задача уже выполняется». Alert collector hooks не планируют/не запускают новые jobs во время паузы; уже ожидающий hook проверяет паузу перед runner. RefreshScheduler защищён поколением: stop или более новый refresh отменяет продолжение старого после каждого await чтения настроек. Refresh в период database pause не создаёт интервалы; штатный restart прочитает актуальные настройки.

Изменены scheduler-running.ts, scheduler.ts, alert-collector-hooks.ts, system-database-backup.ts и scheduler route; новый lifecycle test включён в test:scheduler. Проверки: test:scheduler17/17 (3lifecycle,9recorded-run,5HTTP), test:system-database (7pure tests и HTTP/JWT scripts) passed; contracts/backend build passed. Проверены два одновременно активных jobs/отказ нового запуска, сохранение паузы до завершения, timeout с нулём вызовов database command, recovery, queued alert hook и HTTP409 с настоящим manual runner. Эти проверки не требуют native RouterOS apply или очистки тестовой БД.

Это локальный кодовый блок, не завершение PG-6. NetFlow ещё использует fire-and-forget flush/terminate; прочие ручные API writers и другие экземпляры не охвачены scheduler gate. Активный Docker source остаётся673e5ba, новый код пока не развёрнут. Восстановление основной тестовой БД не запускалось; данные/CHR/серверный auth режим не менялись. Следующий 12.5.9 — graceful stop с подтверждением завершения worker flush и выхода worker, затем сборка/развёртывание и наблюдаемая PG-6 приёмка. Локальный коммит без push.

12.5.9 — подтверждённая остановка NetFlow worker перед операцией с БД (2026-10-07)

Добавлена отдельная IPC команда shutdown для database operation; обычный stop остальных потребителей не подменён. Worker прекращает приём datagrams, закрывает UDP socket/таймер, ждёт принудительный flush без prune и pool.end(), затем отправляет shutdown-complete и закрывает parentPort. Основной процесс требует и acknowledgement, и exit0. Timeout30сек, неподтверждённый exit и ошибки отменяют database operation без принудительного terminate. Неуспешный stop остаётся latched: попытка restart не уничтожает worker с неподтверждёнными записями и возвращает существующее listenerError предупреждение.

Flush engine сериализован общей очередью: завершающий flush не обгоняет уже выполняющуюся запись; отказ одного вызова не ломает следующий. По окончании worker дополнительно ожидается очередь main engine. Listener admission закрыт на весь database operation: обычный start во время паузы отклонён; явный restartAfterDatabaseOperation снимает паузу только после успешного stop. Асинхронный spawn проверяет паузу после чтения контекста, поздний exit старого worker не сбрасывает ссылку на новый. system-database-backup подключён к отдельной паре stop/restart.

Проверки: четыре новых pure/protocol tests прошли — ack без exit недостаточен, exit без ack/exit1/timeout отменяют операцию, final flush ждёт in-flight rejected flush, настоящий worker thread подтверждает shutdown и штатно выходит. Это worker fixture для транспорта, не настоящий UDP collector с PostgreSQL. Новый тест включён в test:system-database. Существующие7pure database tests, HTTP/JWT scripts прошли; contracts/backend build после окончательных изменений passed; diff-check passed. Тесты с очисткой БД не запускались.

PG-6 ещё открыт: тест с реальным collector/UDP и длительным SQL, конкурирующие ручные API writers, вспомогательные writers и другие экземпляры не проверены. flushPending сохраняет прежнюю best-effort обработку ошибок отдельных хранилищ: подтверждение означает завершение попыток записи/закрытие pool, а не гарантию сохранения каждого packet. Новый код пока не развёрнут, активный source673e5ba; данные стенда/RouterOS не менялись, API restore основной БД не запускался. Следующий12.5.10 — запуск текущего collector в выделенной mmapp_acceptance_20261007, наблюдение UDP/SQL drain и безопасный контроль остальных writers перед развёртыванием/PG-3/4. Локальный коммит без push.

12.5.10 — настоящий NetFlow collector: UDP и ожидание SQL перед выходом (2026-10-07)

На161.104.46.222 запущен временный docker compose run --rm --no-deps backend с актуальным compiled dist изsourcef8da3e0; основной backend/frontend не пересоздавались. DATABASE_URL в памяти тестового процесса/унаследованного worker ограничен отдельной mmapp_acceptance_20261007. Приложение не подключено к этой БД. Очищенный отчёт, SHA256 архива и worker JS совпали с локальными файлами. Секреты/дампы не передавались в репозиторий.

Настоящий traffic-flow-collector-worker слушал127.0.0.1:4749 только внутри временного контейнера; синтетический NetFlowv5 datagram отправлен через реальный UDP socket, exporter map сопоставил127.0.0.1→server1. SQL-транзакция удерживала ACCESS EXCLUSIVE lock traffic_flow_settings, независимый pg_stat_activity наблюдатель увидел Lock/relation в проверочной БД. После shutdown и500ms worker ещё не вышел/stop promise не завершился. Успешная привязка нового probe socket к4749 доказала освобождение UDP до завершения SQL drain. После ROLLBACK lock полученыshutdown-complete иexit0; pool connections worker после выхода0.

Независимый SQL сравнил baseline1500bytes и итог3000bytes/20packets в двухflow rows: ровно+1500bytes одного тестовогоdatagram. Baseline обязателен: предыдущая неуспешная попытка оставила тестовую запись в этой выделенной БД. Первые попытки не завершили сценарий: staging mount /app/acceptance не находил backend dependency dotenv (выявлено после добавления диагностики); mount перенесён в /app/backend/acceptance. Затем10сек ожидания lock истекли; окончательный запуск дал initial tick2500ms перед observation и прошёл всеassertions. Это исправления harness, продуктовый код в этом блоке не менялся.

Проверочная БД теперь содержит синтетические flow rows и изменённые collector counters; прежнее сравнение12.5.7 описывает состояние на момент backup, не нынешнюю идентичность БД. Временный контейнер удалён штатным--rm, worker остановлен. Основной /health ok/version1.0.0-test.673e5ba/alivefalse/boundfalse, оба serverID/IP иuptime retention14 сохранены. КонфигурацияCHR/traffic-flow на маршрутизаторах не менялась.

Принята частьPG-6 для isolated collector/drain, не весь app-wide сценарий. Ручные API writers, вспомогательные writers, параллельные экземпляры и API restore не проверены; новый код ещё не развёрнут в основном приложении. Следующий12.5.11 — admission/drain ручных запросов и аудит остальных писателей, затем deployment и полнаяPG-6/PG-3/4 проверка. Локальный коммит безpush.

12.5.11 — ожидание ручных API-запросов и закрытие live-подписок (2026-10-07)

Добавлен DatabaseRequestGate и root onRoute hook перед регистрацией API. Каждый API handler получает lease до выполнения и освобождает его вfinally после фактического завершения, а не onResponse/socket close. ВключеныGET: некоторые чтения имеют lazy/cache side effects. /health и /api/auth/config остаются доступными. Backup/restore захватывают exclusive gate на весь handler, включая audit event; новый API-запрос получает409 с понятной причиной, конкурирующая database operation409. Ожидание30сек; timeout отменяет команду, не объявляет незавершённые запросы завершёнными; при повторной попытке они остаются в active registry.

Traffic flow live и server traffic live регистрируют abort callback. Exclusive gate останавливает их циклы и ждёт завершения asynchronous cleanup; не подменяет закрытие socket завершением обработчика. Отмена запоминается и приходит сразу при поздней регистрации callback, если ещё выполнялось первоначальное чтение сервера. Прочие длительные запросы не прерываются принудительно: при превышении30сек database operation отменяется. Gate локален одному Fastify instance; другие процессы/экземпляры не охвачены.

Аудит выявил detached writers: routes/backups.ts запускает event promise иqueueMicrotask/processBackupJob послеHTTP202; traffic-flow-ripe.ts запускает background resolver/loadPg и fire-and-forget persist/persistAsn. HTTP lease эти задачи не покрывает. Их нельзя считать завершёнными только поHTTP-ответу; PG-6 остаётся открытым, API restore не выполнялся. Код на сервере не пересобирался/не развёртывался, основной source673e5ba сохраняется.

Проверки:4новых gate tests passed — ожидание активного handler/отказ новых иконкурирующегоexclusive, timeout с нулёмdatabase commands иправильнымповторнымdrain, stream cancellation сожиданиемcleanup, Fastify child routes/GET409/health200/поздняярегистрацияabort/возобновлениеAPI. Полный test:system-database15pure/protocol tests иHTTP/JWT scripts passed; contracts/backend build passed; diff-check passed. Новые проверки включены вpackage script. Изменены index.ts, traffic.ts, traffic-flow.ts, добавлены gate service/plugin/test. RouterOS иданныестенда не менялись.

Следующий12.5.12 — зарегистрировать/дождаться detached backup jobs иaudit, закрыть admission идождатьсяRIPE resolver/persistence; послеэтого сборка/развёртывание ивнешняяPG-6/PG-3/4 проверка. Локальныйкоммит безpush.

12.5.12 — ожидание фоновых jobs, audit и записей RIPE (2026-10-07)

Добавлен общий process-local DatabaseBackgroundWork. Promise регистрируется до запуска отложенного тела; drain ждёт settlement всех задач, включая дочерние записи, которые регистрируются во время завершения parent task. Timeout30сек отменяет database operation; pending registry сохраняется для следующего drain. Rejection наблюдается отдельно и не ломает ожидание остальных задач; завершение drain не объявляет неуспешные записи успешными.

Backups HTTP202 теперь регистрирует job до microtask запуска и держит его учтённым до processBackupJob/terminal audit. Started/restore audit promises также учтены; ошибки audit не подменяют подтверждённую операцию. Выпуск сертификата изqueue учтён доprogress/terminal state/event. Опрос сервера учитывает detached dropExpiredPartitions/ensurePartitionsAround (DDL особенно опасен во времяrestore). Фоновые загрузки topology/catalog/интерфейсов/classification catalog также учтены, хотя часть изних только читаетБД/обновляетmemory cache.

RIPE учитывает loadPg, resolver worker иотдельные persist/persistAsn promises. Pause закрывает admission cache misses иочищает ещёневыданную best-effort enrichment очередь; текущие resolver иихSQL writes ожидаются. ПослеstopListener иscheduler drain database operation ждёт общий background registry; стандартный restart вновьразрешаетRIPE. Настоящий UDP worker передpool.end также вызываетpause/drain, поэтомуизолированные auxiliary writes не могут остаться заегоподтверждённымвыходом. Большая очередь/длительныйnativejob могут привести кtimeout иотменеоперации, анепринудительнойостановке.

Проверки: test:system-database19pure/protocol tests иHTTP/JWT scripts passed (4background,4HTTPgate,4shutdown,4restore,3operation). Новый integration fixture среальнымbackup handler подтвердилHTTP202 иdrain, которыйне завершается доотложеннойcreate task. RIPE test сотключённымpersist иподменённымfetch подтвердил0fetch во времяpause ивозобновлениепослеresume. Существующийbackups-operations HTTP test passed;10certificate execution tests passed; contracts/backend build послеокончательныхизменений passed; diff-check passed. Тесты неочищалиБД инеприменялиRouterOS config.

Код пока неразвёрнут, основнойruntime673e5ba сохраняется; данные/CHR/auth стенданеизменялись. PG-6 остаётсяоткрытым доинтегрированногонаблюдения всехпутей. Restore ещёнепроверен; отдельнотребуется cache invalidation послевосстановления, иначеmemory topology/RIPE/settings могут отражатьпредыдущуюБД. Другиеэкземпляры/хосты registry негарантируетостанавливать. Следующий12.5.13 — integrated HTTP/scheduler/background/UDP quiescence ввыделеннойпроверочнойБД, аудитcache invalidation/deployment, затемPG-3/4. Локальныйкоммитбезpush.

12.5.13 — сброс кэшей после подтверждённого восстановления БД (2026-10-07)

Добавлен invalidateSystemDatabaseCaches, вызываемый послеуспешногоpg_restore внутриrestore execution, доcleanup иперезапускаconsumers. Очищаются settingsRowCache, server/topology catalog, RIPE/index/ASN cache, интерфейсы, classification catalog, analytics/map hops, engine pending/recent/rings/minute accumulators иfact/engine ensured partition sets. Последнее исключаетповторноеиспользованиепамяткиосозданныхразделах, которыхуже можетнебытьввосстановленнойБД. Engine data epoch обновлён, runtime pending cap сохранён. GeoIP readers/file state не изменены: MMDB лежатвнеPostgreSQL dump.

Production invalidate/reset функции отделеныотForTests API; старыеимена сохраненыдлясуществующихтестов. RIPE invalidation сохраняетdatabase pause/enqueue/persist/fetch options: очисткакэшейне открывает admission воперации. Inflight tasks должныбытьпредварительнодренированы механизмами12.5.8–12; приошибкеpg_restore invalidation неприменяется.

Проверки: полныйtest:system-database21tests иHTTP/JWT scripts passed, затемновыйсовместныйcache/drain testpassed (всего22различныхtests). ПровереныудалениестарыхRIPE/interface/live данных безоткрытияRIPE, успешныйrestore→invalidate иотсутствиеinvalidate приошибкепроцесса. Совместныйfixtureснастоящимиoperation/restore helpers иbackground registry доказалпорядокstop listener→background drain→restore→invalidate→restart listener/scheduler; restart увиделочищенныйinterfacecache. Командаpg_restore вэтомfixture подмененаDI, это не реальныйPG-3. RIPE/ifindex/classify regression scripts иcontracts/backend build прошли; diff-check passed. БД/RouterOS влокальныхтестахнеизменялись.

Коднеразвёрнут: основнойruntime673e5ba сохраняется. PG-6 целикомоткрыт, чтение/rollback реальногоAPIrestore ещёнеподтверждено. PostgreSQL dump не содержитGeoIP/backup/certificate files; ихдоступностьнужноучитыватьвприёмке. Другиепроцессы/хосты gate/registry неостанавливает. Следующий12.5.14 — integrated real-PG HTTP/scheduler/background/UDP quiescence ввыделеннойпроверочнойБД, успешныйAPIrestore/ошибкапроцесса/sequence, затемdeploymentпроверенногообраза. Локальныйкоммитбезpush.

12.5.14 — реальный API restore: дефект очистки разделов и контроль rollback (2026-10-07)

Временный docker compose run --rm --no-deps backend использовалcompiled dist sourcef1aac49, mount/app/backend/acceptance, DATABASE_URL толькоmmapp_acceptance_20261007, HTTP127.0.0.1:8014 внутриконтейнера. Основнойbackend/frontend не обновлялись. Очищенный отчёт; SHA256 переданногоcompiled archive совпалслокальным. РеальныйbuildApp иAPI routes работалибезHTTP mocks; startScheduler=false приinitial build, стандартныеdatabase operation restarts выполнялиреальныйrefreshScheduler/consumer lifecycle.

GETbackup200/478810bytes/PGDMP полученвпамять безкопированиядампавGit. Отдельный тестовыйHTTP write handler менялretention14→16 подудерживаемымSQLlock. Concurrent POSTrestore не завершилсяраньшеwrite; новыйGETservers получил409. ПослеROLLBACKlock write завершился200; restore дождалсяего ивернул400 изнастоящегоpg_restore. Ошибка:cannot drop inherited constraint uptime_resource_samples_w_20261019_pkey of relation uptime_resource_samples_w_20261019. Существующий--single-transaction --clean --if-exists пытаетсяудалитьinheritedPK дочернегораздела. Сходныйконфликтописанвpgsql-hackers; текущийотказнепосредственновоспроизведённасервере/client18.6.

Первые2попыткиожидалиrestore200,ноостановилисьassert400; приватнаядиагностикаосталасьтольконасервере. Третийзапускпроверилизвестнуюошибкуиrollback: HTTP400/no ok,обаserverID/IP/enabled сохранены,5speed rows,9migration IDs,servers_id_seq last_value2/is_called=true иretention16 (последняяподтверждённаяHTTPwrite) совпалисожидаемымсостояниемдоrestore. Inheritedconstraint сохранился,count1. ЭтоPG-4 вграницеошибкиреальногоSQLпроцесса/контрольныхданных/sequence/constraint,неполныйchecksum всехтаблиц иневсе возможныеSQLотказы. УспешныйPG-3/новыйID послеуспешногоrestore не проверены.

Изолированныйконтейнерудалён--rm,егоscheduler/background/worker остановлены,соединениязакрыты. ПроверочнаяБД теперьretention16; основнойстендпо-прежнемуretention14,обаCHRзаписи сохранены,healthok/version1.0.0-test.673e5ba. Nativegre/BGP collector можетвыполнятьчтениеприштатномrestart,ноRouterOS apply/конфигурациянеизменялись. РеальныйPortal/browser restore UI иintegrated UDP+detached jobs втомжекритическоминтервалеэтимнепроверены.

Обнаруженныйдефектблокируетуспешнуюприёмкуrestore; коднеразвёрнутвосновномприложении. Следующий12.5.15 — исправитьочисткуpartition constraints внутриоднойтранзакции, безпредварительногонеобратимогоDROP ибезавтоматическогоповторапосленеизвестногоcommit, затемповторитьPG-3/4/полныйPG-6. Локальныйкоммитбезpush.

12.5.15 — транзакционное восстановление разделов PostgreSQL (2026-10-07)

Исправленреальныйдефект12.5.14. pg_restore --list проверяетобязательныеTABLE public servers/schema_migrations иопределяетприсутствующиевархивеизвестныеpartition parents приложения. ВременныйSQL полностьюформируется pg_restore --clean --if-exists --file безподключениякцелевойБД. Затемодинpsql -X --single-transaction --set ON_ERROR_STOP=on выполняет -c parent constraint preparation и -f SQLархива. РодительскиеPK/UNIQUE снимаютсячерезpg_catalog/format(%I) внутриэтойжетрaнзакции; inheritedchildconstraints удаляютсякаскадно, поэтомупоследующиеIF EXISTS DROP больше непадают. Подготовкаограниченаpublic/известнымиparents, присутствующимивархиве; нетотдельногоcommittedDROP/SQLпереписыванияданных/автоповтора. Транзакционныйрежимpsql охватываетобеопции-c/-f.

Customdump иSQL содержатприватныеданные: tempdirectory0700 (chmod такжеисправляетранее созданныйкаталог), файлы0600, обафайлаудаляютсяприуспехе/ошибке. Ошибкаdecode/неподходящийTOC непускаютtargetSQL. Архивдолженбытьдовереннымполнымbackup приложения; проверкадвухTABLE неявляетсяпроверкойвсейсхемыилидовериякSQLархива. CASCADEdependencies восстанавливаютсяизполногоархива; частичные/custom archives этимнепринимались.

Локальныепроверки:3новыхpartition-restoretests включенывtest:system-database; полныйнабор25pure/protocol tests иHTTP/JWT scripts passed, contracts/backend build passed. Провереныscope parent/table/schema, quotedcatalogidentifiers, полностьюdecode-before-targetSQL, одинpsqltransaction, отказdecodeбезtargetSQL. Существующийrestore lifecycle сохраняетcache invalidation толькопослеуспеха.

RealAPI evidence:161.104.46.222/PG18.6, isolatedcompiledf1aac49+partition-restoreworktreepatch (SHA256 patch совпал), mmapp_acceptance_20261007. Backup200/475305bytes; concurrentactiveHTTPwrite ждалSQLlock, новыйGET409. Restore200/oktrueбезwarnings, контрольныеservers/retention/speed/migrations/sequence совпалисархивом. СледующийINSERT disabledtestserver192.0.2.250 получилID3. Послеretention19 ивведенияeventtrigger, которыйпадаетнаCREATE INDEX, второйrestore400/необъявленуспешным. НезависимыеSQLпослеrollback подтвердиливсеперечисленныеконтрольныеданные/sequence3 и1587constraint descriptors. Eventtrigger/function удалены, temporarycontainer--rm/consumers/pool штатноостановлены.

ПроверочнаяБД теперьсодержитdisabledserver3/retention19; основнаясохранена:server1–2,retention14,healthok/source673e5ba. Во времяштатногоrestart ресурсныйcollector неожиданнопыталсяпрочитатьdisabledserver3 иполучилtimeout10s — отдельныйдефектдляследующегоблока. RouterOS apply не выполнялся. PG-3/4 принятывграницахrealAPI/контрольныхданных/новогоID/SQLrollback/constraints, безполногоchecksum/Portal/browser UI. Integrated UDP+detachedjobs втомжекритическоминтервалеимультиэкземплярыещёнеприняты; полныйPG-6 открыт. Новыйкоднеразвёрнутнаосновномстенде. Следующий12.5.16 — исправитьdisabled-server polling, integratedPG-6/deployment. Локальныйкоммитбезpush.

12.5.16 — выключенные серверы всех типов исключены из мониторинга (2026-10-07)

Аудит уточнилпричину12.5.15: uptime/RESTping намеренноиспользовалиenabled OR type=home-router, скомментариемобисключениидляLAN. Это существующееправило, непросто случайныйSQLдефект. Пользовательявновыбрал «Не опрашивать выключенные серверы любых типов». ПоэтомуисключениеHome Router удаленоосознанно, политикавключённоститеперьобщаядлявсехтипов.

НовыйlistEnabledMonitoringServers используетservers.enabled=true; подключёнкresources,scheduledping,manualpinggroup иRESTping. Плановыеspeed-пробы требуютвключённыхsource/destination ивключённойprobe; выключенныеendpointпропускаютсябезnativeoperation/ложногосэмплаошибки. Ручнойspeedguard проверяетобасерверапослечтенияизБД, доMikrotikClient/nativequeries, сявнойошибкой «Сервер отключён: включите его перед запуском теста». Уже начатыйдоотключениязапросможетштатнозавершиться; немедленнаяотменасетевойоперацииэтимнеобещается.

RealPG/CHR evidence: temporarycontainer/f3e2059+monitoringworktreepatch, mmapp_acceptance_20261007. Disabledserver3 последовательноимелтипыhome-router/exit-node/jump-host. Во всехслучаяхselected/resource IDs1–2, forwardednativeclients только1–2 (реальноечтениеresource/identity CHR, responses неподменены). Плановыепробы3→1/1→3 enabledtrue не запускались,runs0; manualspeed сdisabledsource/destination отказалдосозданияклиента. Повторныйзапускдобавилнезависимыйконтрольсэмплов: resourcecount3=1→1 (историческаяошибка12.5.15), RESTcount3=0→0, новыхсэмпловнет. Pingиспользуеттотжеqueryhelper,ноотдельныйnativepingfixtureвэтомблокенезапускался.

Временныеspeed probesудалены,server3 восстановленhome-router/enabledfalse, temporarycontainersудалены--rm. Рабочийстенд/source673e5ba/healthok инеизменённаяосновнаяБДсохранены. RouterOSконфигурациянеизменялась;толькоreadonlyresource/identity. SHA256compiledpatch совпалслокальным. Локальноspeed-test HTTP/RBAC (26invalidcases/401/403/dependencies),16speed-run-persistence tests,contracts/backend build иdiff-check прошли. Новыетривиальныемок-тестыSQLpredicate не добавлялись;поведениедоказано реальнойquery/collector матрицей.

Новыйкоднеразвёрнутнаосновномстенде. ПолныйintegratedPG-6,Portal/browserrestore ипрочие12.5 остаютсяоткрытыми. Следующий12.5.17 — integrated HTTP/scheduler/background/UDP quiescence иdeployment проверенногообраза. Локальныйкоммитбезpush.

12.5.17 — общая проверка PG-6 и обновление backend тестового стенда (2026-10-07)

Integrated PG-6 evidence: source4c12c55, настоящееbuildApp/API/worker/PG18.6, temporarycontainer иmmapp_acceptance_20261007. SQLsettings temporarilyвключилиUDP4749 внутриконтейнера иlocalhostexporter map; CHR traffic-flow конфигурациянеизменялась. ArchiveполученреальнымGETbackup. ВодноминтервалезадержаныHTTPhandler, workerSQLчерезACCESS EXCLUSIVE lock settingstable иbackground SQLtask черезproductionregistry.

Restore ждалHTTPhandler,новыеAPIGET409. ПослеHTTPcleanup UDPsocket освободилсяпри ещёзаблокированнойSQLзаписи. ПослеосвобожденияSQLworkerзавершился и1500bytes datagramсохранились; scheduler admissionpaused/activejobs0. Доreleasebackground psqlprocesses0/restoreне завершён, backgroundwrite ещёне выполнена. Послеrelease записьretention17 завершилась,restore200/oktrueбезwarnings вернулархивнуюretention14 иисходныйflow baseline. Послеrestart workerboundtrue/schedulerresumed, новыйUDPdatagram дал+1500bytes. Fixturebackground выполняетреальнуюSQLчерезregistry, анеRouterOSbackup/certificate; ихконкретныемеханизмыпроверенылокальнораньше. ЭтоPG-6 дляодногоэкземпляра, безмежхостовойкоординации. Temporarysettings/port/mgmtIP восстановлены, worker/jobs/pool/temporarycontainer штатноостановлены.

Deployment evidence: backend imageux-4c12c55,fullrevision4c12c55c9d4ca1fda2b901193a4969ba0e33e797,version1.0.0-test.4c12c55. Сборкана161.104.46.222 поCI-style context (база673e5ba, committedbackend/src/package4c12c55,безenv/лицензий/node_modules) прошла; PostgreSQLclient18.6 сохранён. ImageIDsha256:57878e320b7272edcc6efe1f6f5c140295510c85cb79b8ca12a900f7654cd917. Передupdateприватныйbackup546550bytes/SHA2701cc2fba4aa0ac34fe79ad5576012b775a8d4db7f1ec27cbc0c61342ed37cb сохранёнтольконасервере0600,контрольныеserverID/IP/enabled,retention14 и9миграций послеupdate совпали.

ComposeдобавленoptionalBACKEND_IMAGE_TAG, которыйпереопределяеттолькоbackend; default сохраняетMMAPP_IMAGE_TAG. На стендеMMAPP_IMAGE_TAG=ux-673e5ba/BACKEND_IMAGE_TAG=ux-4c12c55: frontendнепересобирался,егоimage/revision673e5ba прежние. ComposeSHA3052bd6ab5d9865f97605cebfb5ff27a4410cd3357b81153a65a87fb7c92582f совпаллокально/насервере,config--quiet passed. AUTH_REQUIREDfalse/SSH-only ports сохранены. Backendhealthy,health/APIauthconfig/servers/speed-test-runs200. Первыйsmoke ошибочноиспользовал/uptime/speed/history404; correctedcanonical/uptime/speed-test/runs200,продуктовогодефектаздесьнет.

Real browser smoke: dashboard/servers/filters200,320px fits,0JSerrors/0API>=400,HTTP-моковнет. RestoreосновнойБД не выполнялся;разрушающиесценарииоставалисьввыделеннойБД. Полныйпротоколещёоткрыт:Portal/browserrestore flow,остальныеnative/network/integrations иmulti-instanceконтрольнеприняты. Следующий12.5.18 — browser/RBACrestore иоставшиесясценарии. Локальныйкоммитбезpush.

12.5.18 — реальные права backup/restore и сценарии восстановления в браузере (2026-10-08)

Блокначат7октября,завершён8октября поAsia/Novosibirsk; отчётыдатированыподатеокончания. PG-7 evidence: temporarycontainerсреальнымimageux-4c12c55, AUTH_REQUIRED=true,mmapp_acceptance_20261007. JWTтестовогоissuerсозданытольковпамяти, безPortalSSO. 16GETbackup/POSTrestore:anonymous/wrongissuer/expired/invalidsignature401;settingsreader/writer/trafficadmin/missingapp403. Instrumentation productionchild_process.spawn (безподменывыполнениякоманд) подтвердилаpg_dump0/pg_restore0/psql0длявсехотказов; контрольныеservers/retention/sequence/speed послеотказовсовпали. Adminmm:settings:adminbackup200/478183bytes/PGDMP запустилровноодиннастоящийpg_dump. ЭтоусиливаетпрежниеHTTP-onlyPG-7 проверкинаблюдениемпроцессов.

Real browser restore: temporaryfrontend673e5ba/backend4c12c55,localhost3018черезотдельныйSSHтуннель, AUTHfalseдляbrowserсценария,выделеннаяБД. Передлюбойwriteмаркерserver3/192.0.2.250/disabled проверен. Перваяпроверкаотказала:Next.jsrewrites bakedприbuildигнорировалruntimeBACKEND_INTERNAL_URL ивременныйfrontendчиталосновнуюБД. Guard остановилсценарийдополученияархива/изменениянастроек/restore. Временныйfrontendотсоединёнотmmapp-test_default иподключёнкmmapp-browser-only,гдеaliasbackendуказывалтольковременныйbackend; повторныймаркерподтвердилвыделеннуюБД. Основнойfrontend/router configurationне менялись.

Backup478920bytesиспользовантольковпамятиNode/browser input,локальный.dumpнесохранён. Контрольretention14→19 сделанAPIввыделеннойБД. ЧерезнастоящийsettingsUI:выборфайла→Продолжить→подтверждение→restore200→подпись «База приложения восстановлена»; GETuptimesettings независимоподтвердилretention14. ЗатемPGDMP-invalid-fixture получил400:controlretention14сохранён,filenameвдиалогесохранён,unknowncaptionвиден,restoreкнопказаблокирована. Guardпережилreload, «Выбрать файл»disabled; послефактическойпроверкиcontrolнажато «Я проверил состояние — разрешить новый запрос»,кнопкавновьenabled. POSTstatusesровно[200,400],автоповторанет;0JSerrors,320px dialogfits. HTTP-моковнет. ЭтоbrowserPG-3/errorUX,неPortalSSO иневсеfailure/commit-lossварианты.

Temporaryfrontend/backend/самостоятельныйRBACcontainerудалены--rm, privateDocker networkудалена, временныйтуннель3018закрыт. Основнойтуннель3000/8000/стендсохранены;backend4c12c55healthy,основнаяБДserver1–2/retention14безизменений,AUTHfalseкакдоэтогоблока. Продуктовыйкодне менялся. PG-7 иbrowserrestoreпринятывуказанныхграницах; полный12.5 ещёоткрыт. Следующий12.5.19 — PG-8 speedpersistence/потеряcommitacknowledgement иостальныеROS/Q/integrationсценарии. Локальныйкоммитбезpush.

12.5.19 — speed persistence, ошибка INSERT и потерянное подтверждение commit (2026-10-08)

Выявленриск: общийcatch native run послеошибкиpersist запускалrecordSpeedTestFailure, хотяbandwidth-test ужезавершён. Послеcommitackloss это моглоподменитьsnapshot/log ложнымerror (особенноеслиrunId не былпередан). ДобавленSpeedRunPersistenceUnknown(actualrunId,cause) тольконаграничепубликацииуспешногоnativeрезультата. Routeвозвращает502/outcomeunknown/runId/просьбупроверитьисторию; failurewriterне вызывается. Плановыйrun тоже не записываетложныйfailedresult. Исходныйdrivercause сохранёнвError,публичныйreceipt не раскрываетSQL/credentials.

SchedulerSnapshotError раньшеигнорировалruns[].okfalse уuptime_speed, поэтому реальныйплановыйackloss помечалсяjobok. Теперьошибкиисполненияspeedrun попадаютвreceipt.statuserror/ограничение,безпереименованиядействительногосохранённогорезультатасетевоготеставerror. Корректные observedoffline/down ресурсы/ping по-прежнемунесчитаютсяисключениемоперации.

ОчищеннаяrealPG-8 матрица: image4c12c55 плюсcompiledworktreepatch, mmapp_acceptance_20261007, настоящиеCHR1→CHR2 TCPtransmit3s/afterping,RouterOSответынеподменены. SQLBEFOREINSERTtrigger отказалhistory:HTTP502unknown/actualrunId,baseline snapshot42 сохранился,history0,ровно1nativecall. Дляackloss node-pg boundary действительноисполнялCOMMIT,затемотклонялclientpromise:HTTP502unknown,независимыйPGread показал1historydone иsnapshotdone ссовпадающимTX1929.132904Mbps/RXnull. Плановыйackloss: HTTP200/okfalse receipt,1nativecall,историяdone/TX1729.056592/RXnull,snapshotнепереписанвerror. Этоинъекцияclientackfault послереальногосervercommit,нефизическийобрывTCP; универсальныйrollback длялюбогосетевогоотказанеутверждается.

Матрицапотребоваладиагностикиharness: первыйwrapperнеподдерживалPool.connectcallback иупалдонативныхтестов; перваяполнаяnativeматрицавыявилаschedulerok дефект; rerunполучил500 приcallback instrumentation. Добавленыcallbackbypass/BEGINreset,разовыеmanualrunIDs иdiagnosticerrorhandler; окончательнаяматрицапрошла,проверяемые502обработаныproductionroute,неdiagnostic handler. Выполнялисьручныеповторыпослеисправленияharness/classifier; это неавтоповторвнутриоперации. ФинальныеcompiledJSиpatchSHA совпалислокальными. Temporaryprobe/trigger/function удалены,count0; historicaltest runs сохраненывпроверочнойБД,probeassociationпослеcleanupFK=null. Temporarycontainer--rm/consumers/pool остановлены,mainhealth4c12c55ok/БДнеизменена,RouterOSconfigurationне менялась.

Локально18scheduler tests (включаяновыйunknownspeedreceipt),16speedpersistence tests,HTTPcommand/RBAC/unknownrunId-no-failure-write test иcontracts/backend build прошли; diff-check passed. Старыйосновнойruntime4c12c55 ещёбезэтогопatch. BrowserunknowncommitUX/физическийnetworkloss/deploymentpatch иостальной12.5 открыты. Остатокпятичасовоголимитапоследнейпроверки9%;новыйкрупныйблокненачат. Следующий12.5.20 — собрать/deploypatch иbrowserunknown-speed,затемROS/Q/integrationпротокол. Локальныйкоммитбезpush.

12.5.20 — сохранение подтверждённого speed snapshot при unknown receipt (2026-10-08)

Приостатке5%окнавыполненнебольшойлокальныйблокпередdeployment. Frontendcatch раньше ставилlastStatuserror/новыйlastRunAt любойошибкеPOSTspeed-test,включаяunknowncommit. Теперьподтверждённыйsnapshot пробысохраняется,еслиApiClientError502 содержитoutcomeunknown иrunId текущегозапроса. ЧужойrunId/неправильныйpayload/403/обычнаяошибка нераспознаютсякакэтотисход. Существующееservererrorсообщениепоказывается;новыекомпоненты/композицияReUIне менялись. Временнаястрокасамогозапросапо-прежнемуимеетstatuserror; полныйunknown-state/browserUX ещёнужнопроверить.

Добавленыlib/speed-persistence-outcome.ts и2meaningfultests;подключенguardвuptime/page.tsx. Обаunit tests passed. ПервыйroottscподхватилкопиистарогоCI contextвignoredtmp ивернулисходныеошибкиэтихкопий. Повторныйполныйfrontendtypecheckсвременнымconfig,которыйсохраняетrootoptions/исключения иисключаетtmp,passed; основнойtsconfigне менялся. Diff-check passed. ReUI skillпрочитан: адаптациясуществующегоэкрана,безновойregistryinstallation/редизайна. Browserunknownspeed/productionbuild/deploymentвэтомблокенезапускались.

Основнойruntimebackend4c12c55/frontend673e5ba сохраняется;backendpatchf408afb иfrontendguardещёнеразвёрнуты. Следующий12.5.21 — собратьобаобновлённыхобраза,проверитьbrowserunknownspeed/историю иразвернутьпослепроверок. Журналобновлён;локальныйкоммитбезpush.

12.5.21 — неопределённый исход speed-запуска и сверка с историей (2026-10-08)

В локальной строке запуска введён status unknown: «Сохранение не подтверждено», с видимым runId; это не новый статус серверного DTO (история API по-прежнему принимает только done/error). При обновлении истории незавершённая или неподтверждённая локальная строка сохраняется, если её идентификатора нет в ответе. Подтверждённая строка с тем же runId заменяет локальную, предупреждение снимается. Unknown не подменяет последний подтверждённый snapshot карточки пробы; предупреждение показано без destructive-оформления. Автоматического повторного сетевого теста нет. Ручной новый запуск остаётся доступен; предупреждение просит проверить историю перед повтором. Состояние локальной строки не сохраняется после перезагрузки страницы.

Проверки: 13/13 Playwright (uptime-speed-data и uptime-speed-unknown) за 27.7s, включая unknown → пустая история → done/error, сохранение TX42, один POST и адаптацию 320px. Это live-ветка UI с HTTP-моками, не real PG/browser proof. Scoped frontend typecheck (tmp/tsconfig-speed-check.json, исключён старый ignored tmp build context) и ESLint изменённых файлов прошли. Существующие null/zero, malformed DTO, свежесть, независимые источники и Ping-состояния сохранены.

Основной backend4c12c55/frontend673e5ba не изменён. Новые backend/frontend исправления ещё не развёрнуты. Полный 12.5 открыт. Следующий 12.5.22 — сборка обновлённых образов и приёмка на стенде перед deployment. Локальный коммит без push.

12.5.21 — неопределённый исход speed-запуска и сверка с историей (2026-10-08)

В локальной строке запуска введён status unknown: «Сохранение не подтверждено», с видимым runId; это не новый статус серверного DTO (история API по-прежнему принимает только done/error). При обновлении истории незавершённая или неподтверждённая локальная строка сохраняется, если её идентификатора нет в ответе. Подтверждённая строка с тем же runId заменяет локальную, предупреждение снимается. Unknown не подменяет последний подтверждённый snapshot карточки пробы; предупреждение показано без destructive-оформления. Автоматического повторного сетевого теста нет. Ручной новый запуск остаётся доступен; предупреждение просит проверить историю перед повтором. Состояние локальной строки не сохраняется после перезагрузки страницы.

Проверки: 13/13 Playwright (uptime-speed-data и uptime-speed-unknown) за 27.7s, включая unknown → пустая история → done/error, сохранение TX42, один POST и адаптацию 320px. Это live-ветка UI с HTTP-моками, не real PG/browser proof. Scoped frontend typecheck (tmp/tsconfig-speed-check.json, исключён старый ignored tmp build context) и ESLint изменённых файлов прошли. Существующие null/zero, malformed DTO, свежесть, независимые источники и Ping-состояния сохранены.

Основной backend4c12c55/frontend673e5ba не изменён. Новые backend/frontend исправления ещё не развёрнуты. Полный 12.5 открыт. Следующий 12.5.22 — сборка обновлённых образов и приёмка на стенде перед deployment. Локальный коммит без push.

12.5.22 — новые Docker-образы и real browser speed unknown (2026-10-08)

Из зафиксированного source8782054078304f36cc611876af2d17f87b857f60 подготовлены отдельные frontend/backend contexts и последовательно собраны production-образы на Debian-стенде. Frontend production build и проверка TypeScript внутри Docker прошли; backend contracts/TypeScript build прошёл. Незакоммиченные изменения, .env, ключи и локальные node_modules в сборку не передавались. Образы не публиковались.

Real browser evidence: новый frontend/backend, отдельная БД mmapp_acceptance_20261007 и Docker network. Перед командой guard проверил имя БД. Реальный CHR1→CHR2 TCP transmit3s; после настоящего COMMIT введена ошибка подтверждения на границе node-pg. HTTP502/outcome unknown/runId speed-1791425187780. UI показал «Сохранение не подтверждено» и runId, сохранил прежний TX42. Независимый SQL подтвердил одну history done с TX2353.700072/RXnull. После «Обновить» строка стала done и предупреждение исчезло; POST ровно один, nativeCalls1, JSerrors0,320px fits. Снимок. Это fault injection после реального COMMIT, не физический обрыв TCP; throughput не является benchmark.

Deployment evidence: оба runtime теперь source8782054/version1.0.0-test.8782054, backend healthy. Backend image7862c9b4…; frontend image d22dd0f3…; full revision labels проверены. До обновления получен приватный backup1049796bytes/SHA826cad71… (только на сервере,0600). Контроль основной БД до/после совпал: servers1–2/enabledtrue, retention14, speedHistory5; migrations9. Restore основной БД не выполнялся. AUTHfalse/loopback порты сохранены. Предыдущие образы и приватная конфигурация доступны для отката на этом временном стенде.

После развёртывания dashboard/servers/uptime-speed/settings/filters200, ПК и320px,0JSerrors/0API>=400, HTTP-моков нет. Первая попытка чтения локального URL отказала из-за завершившегося прежнего SSH-туннеля; туннель3000/8000 восстановлен, повторная проверка прошла. Временные frontend/backend/network/3018-tunnel удалены; тестовая probe acceptance-browser-speed удалена, исторический результат остался только в выделенной БД. Основной туннель и тестовый сервер оставлены для продолжения.

PG-8 browser unknown/reconciliation принят в этих границах. PortalSSO, физический TCP fault, мультиэкземпляры и остальные ROS/Q/интеграции остаются открытыми. Следующий 12.5.23 — ROS-8/9: preflight409 и конкурентное изменение контекста speed-пробы на реальном PG/native. План, паспорт и протокол обновлены. Локальный коммит без push.

12.5.23 — реальный конфликт speed-контекста и конкурентные записи (2026-10-08)

Evidence ROS-8/9: актуальный backend image/source8782054, PostgreSQL18.6/mmapp_acceptance_20261007, реальные HTTP PUT/POST и CHR1→CHR2. HTTP/RouterOS ответы не подменялись; wrapper только считал bandwidth-команды и отмечал их начало/окончание. Перед fixture setup проверены имя выделенной БД и отсутствие проб.

Семь preflight конфликтов: смена пары, srcInterface, dstInterface, протокола, направления, длительности и удалённая до запуска проба. Каждый POST409, bandwidthCalls0; существующий snapshot не изменён. История содержит error для отклонённого запроса с probeIdnull, без привязки к новому контексту. PUT enable/reorder сохранил lastStatusdone и измеренный0; нулевой baseline был явно подготовлен как DB fixture, не выдан за результат RouterOS.

Три реальных коротких TCP transmit3s команды (по одной на case): объединённая смена пары/интерфейсов/протокола/направления/длительности; удаление пробы; конкуренция записи конфигурации и результата при внешнем SELECT FOR UPDATE. В первых двух изменение конфигурации через HTTP завершилось до получения native response. В третьем отдельный observer увидел двух writers с wait_event_type Lock до освобождения строки. Все POST200; одна history done с фактическими src1/dst2/TCP/transmit3 и probeIdnull. Новый snapshot остался lastStatus/lastTx/lastRunAtnull, удалённая проба не создана заново. TX2815.169992/2841.242408/3247.053056, RXnull — функциональные результаты, не benchmark.

Первый пробный прогон обнаружил помеху harness: PUT refreshScheduler запускает немедленный speed job, который изменил fixture snapshot. В принятой матрице production scheduler admission закрыт до fixture setup только внутри isolated test process; таймеры не подменялись, основной scheduler не трогали. Этот подготовительный прогон не объявлен passed. Длинный terminal input отклонён инструментом; сценарий передан отдельным файлом, без изменения разрешений.

После принятой матрицы удалены временные пробы, count0; контейнер завершён и удалён --rm, locks освобождены, scheduler/listener/background/pool штатно закрыты. Исторические результаты остались только в выделенной БД. Основной backend8782054healthy/version1.0.0-test.8782054 и пять записей основной speed-истории сохранены. Продуктовый код не менялся; повторная сборка не требовалась.

ROS-8/9 приняты в перечисленных API/SQL/native границах: отдельные поля проверены preflight, поздняя смена объединяет параметры, row lock — один backend. Browser race, каждый поздний параметр по отдельности и multi-instance не проверены. Следующий12.5.24 — browser-сценарий смены speed-контекста вторым клиентом во время теста. Полный12.5 открыт; план/паспорт/протокол обновлены, локальный коммит без push.

12.5.24 — browser speed при изменении контекста вторым клиентом (2026-10-08)

Real browser evidence: production backend/frontend8782054, выделенная БД mmapp_acceptance_20261007, изолированная Docker network и SSH3018. Guard до операции проверил имя БД. Первый browser context использовал настоящую кнопку «Запустить» в uptime speed; независимый второй context отправлял реальные HTTP PUT каталога. HTTP/RouterOS-моков нет. Scheduler admission закрыт только в isolated backend, чтобы сохранение каталога не запускало фоновый speed job.

Два принятых сценария: смена пары1→2 на2→1 и длительности3→4; удаление пробы. Второй клиент завершил изменение до получения native response (проверено счётчиком/finished в wrapper, который возвращает настоящий RouterOS ответ). В обоих случаях исходный CHR1→CHR2 TCP transmit3s завершилсяHTTP200; history done сохранила фактическую пару и длительность3, probeIdnull. После «Обновить» новая карточка показывала4s без прежнего значения Мбит/с; после удаления показано «Нет speed-проб», история остаётся. Reload сохранил оба результата,320px fits. Принятая матрица: nativeCalls2, POSTstatuses[200,200], JSerrors0, автоповтора нет.

Первый подготовительный прогон выполнил ещё одну короткую команду, затем тест отказал из-за неверного ожидания подписи «Последний запуск: —», которой в текущей карточке нет. Исправлено ожидание harness: отсутствие старого замера. Это ручной повтор валидации; всего на временном стенде три native commands, два в принятой матрице. Продуктовый код не менялся, новый build/deployment не требовался. Значения TX2938.274608/2769.82096 и RXnull — функциональная проверка, не benchmark.

Temporaryfrontend/backend/network удалены,3018туннель закрыт, fixtureprobe удалена; history сохранена только в выделенной БД. Основной backend healthy/version1.0.0-test.8782054, история5 без изменений, основной SSH-туннель сохранён. Browser ROS-8/9 принят в этих двух сценариях; второй клиент менял каталог через HTTP, не через форму редактирования. Полная матрица поздней смены каждого поля, PortalSSO и multi-instance остаются открытыми.

Следующий12.5.25 — ROS-2: реальный отказ bandwidth-аутентификации и проверка snapshot/error history в выделенной БД, без изменения учётных записей RouterOS. План, паспорт и протокол обновлены; локальный коммит без push.

12.5.25 — реальный отказ bandwidth-аутентификации (2026-10-08)

Real API/native/browser evidence: production8782054, выделенная БД mmapp_acceptance_20261007, изолированная Docker network/SSH3018. Только в app DB временно изменён username назначения2 на несуществующий тестовый; исходное значение сохранено в памяти и восстановлено при штатном завершении. Учётные записи и конфигурация RouterOS не менялись. Scheduler admission закрыт только внутри isolated backend. Guard подтвердил выделенную БД до команды; предыдущий TX42 был явно подготовлен как DB fixture.

Реальный POST /tool/bandwidth-test со стороны CHR1 вернул statuses connecting/connecting/authentication failed. Backend отказалHTTP502 с русской подписью «RouterOS отклонил авторизацию bandwidth-test»; это обычная ошибка native test, не persistence unknown. UI показал ту же ошибку, локальная строка error. Независимые API/SQL подтвердили одну history error для фактической пары1→2/TCP/transmit3, TX/RXnull; probe lastStatuserror, предыдущий lastTx42 сохранён/RXnull. Снимок ошибки320px.

После «Обновить» и reload история error сохранена; nativeCalls1/POST[502], автоповтора нет, JSerrors0/320px fits. HTTP/RouterOS-моков нет. Подготовительный запрос с чрезмерно длинным тестовым именем был отклонён RouterOSHTTP400 по длинеuser до целевого сценария; после исправления fixture выполнен отдельный принятый прогон. Это ручная валидация, не retry продукта.

Temporaryfrontend/backend/network удалены,3018туннель закрыт, fixtureprobe удалена. В выделенной БД username назначения восстановлен и проверен без вывода секрета; основная история5 сохранена, runtime8782054 исправен. Продуктовый код не менялся, build/deployment не выполнялся. ROS-2 authentication failure принят; unreachable/busy/disconnect/abort и PortalSSO остаются открытыми. Следующий12.5.26 — недоступное назначение bandwidth-test и проверка HTTP/UI/history. План/паспорт/протокол обновлены; локальный коммит без push.

12.5.26 — тайм-аут недоступного назначения и исправление Next proxy (2026-10-08)

Real failure evidence: source8782054, выделенная БД, назначение2 временно заменено в app DB на192.0.2.250. Реальный bandwidth POST от CHR1 не вернул native rows до30s. Backend записал history error/TXRXnull и сохранил предыдущий probeTX42; frontend rewrite оборвал запрос с socket hang up/ECONNRESET и вернулHTTP500 раньше структурированного ответа backend. Целевая UI-проверка отклонила500; она не объявлена passed. Это транспортный timeout, не подтверждённый native can not connect.

В установленном Next16.2.4 найден default proxyTimeout30000. В next.config.ts задан experimental.proxyTimeout180000, дольше120s ожидания speed-команды в UI. Добавлен tests/integration/next-proxy-timeout.mjs: загрузка реальной конфигурации проекта, настоящие loopback sockets и установленный Next proxy; delayed backend502JSON после31s доходит до caller. Регрессия, scoped frontend TypeScript и ESLint прошли. Сценарий использует fixture backend response для проверки proxy, не выдаётся за RouterOS proof. Backend/общие UI-компоненты не менялись.

Temporarycontainers/network/3018 закрыты; destinationhost восстановлен и проверен, testprobe удалена. Основной runtime8782054 прежний. Исправление требует нового frontend build: следующий12.5.27 — real browser timeout-проверка на новом образе и deployment после успеха. ROS-2 native can not connect/busy/disconnect/abort остаются открытыми. План и журнал обновлены, локальный коммит без push.

12.5.27 — приёмка и deployment исправленного Next proxy (2026-10-08)

Frontend production-образ sourceaa7dbdf608ca4da4986826fca956543f40922841 собран из чистого предыдущего context8782054 с зафиксированным next.config.ts; git diff подтвердил, что это единственное изменение runtime source frontend. Build/встроенный TypeScript passed; proxyTimeout180000 отражён в build config. Backend image8782054 не менялся.

Real browser/native timeout: новый frontend/старый backend в выделенной БД и Docker network. Длительный bandwidth REST запрос к назначению192.0.2.250 завершился транспортным timeout без native rows. Теперь UI получил структурированныйHTTP502 backend вместо proxy500/ECONNRESET. Probe lastStatuserror, previousTX42 сохранён; одна history error/TXRXnull, понятное обработанное предупреждение в UI. Refresh/reload/error state/320px passed, nativeCalls1/POST[502]/JS0, без автоповтора и HTTP/RouterOS-моков. Снимок. Это REST timeout; RouterOS can not connect не подтверждён, успешного native completion не заявляем. Техническая смешанная подпись timeout пока сохраняется как ограничение UX.

Deployment: MMAPP_IMAGE_TAG=ux-aa7dbdf, BACKEND_IMAGE_TAG=ux-8782054. Frontend imageSHAcd63b03b… и full revision label проверены. Backend8782054healthy/version1.0.0-test.8782054 не перезапускался. Контроль основной БД совпал: два enabled CHR,retention14,speedHistory5; restore не выполнялся. Приватная предыдущая env сохранена только на сервере, старый frontend image оставлен для отката. Новый frontend доступен через основной SSH localhost3000.

Пять основных экранов: dashboard/servers/uptime-speed/settings/filters200, ПК/320px fits,0JSerrors/0API>=400, HTTP-моков нет. Temporaryfrontend/backend/network/3018 закрыты, destinationhost восстановлен и проверен, testprobes0; основной стенд/туннель сохранены.

Локальная regression31s/TypeScript/ESLint12.5.26 и real production browser proof подтверждают исправление proxy. ROS-2 transport timeout принят в этих границах; native can not connect/busy/disconnect/abort и Portal/multi-instance остаются открытыми. Следующий12.5.28 — ROS-3: фактический адрес native bandwidth-test и интерфейс after-ping. План/паспорт/протокол обновлены; локальный коммит без push.

12.5.28 — интерфейс bandwidth-test и after-ping; уточнение формы (2026-10-08)

Real native/API/SQL evidence: backend8782054, выделенная mmapp_acceptance_20261007; реальные inventory и команды, HTTP/RouterOS-моков нет. На обоих CHR активны ether1/lo. НаCHR1 ether1 имеет dynamic194.226.121.150/24; наCHR2 dynamic104.165.244.7/24 иstatic195.195.195.195/32. Существующая конфигурация RouterOS не менялась. API каталога предпочитает static195 при явном выборе ether1 назначения. Это не тот же адрес, что host/API104.

Три попытки1→2 (дважды с выбранным ether1 назначения, один разauto) получили502/transport timeout и historyerror; никакая из них не объявлена успешной. Bandwidth-server enabledtrue/authenticatetrue/maxsessions100 наобоихCHR, Ping1→2 и2→1 поether1 подтвердил2/2/0%loss. Причина timeout1→2/auto не установлена. Нельзя заключать, что её вызвала ошибка приложения или исключительноstaticадрес.

Отдельная принятая команда2→1: srcInterfaceether1, dstInterfaceauto, TCPtransmit3s/HTTP200. Wrapper считал и записывал только несекретные параметры настоящих вызовов: bandwidth address194.226.121.150 без interface-параметра; after-ping addressтотже/count4/interfaceether1/interval1s. API/SQLhistorydone, TX3756.788128/RXnull, Ping53ms/0%loss. srcInterfaceAddress195 — metadata выбранного интерфейса, не доказательство фактического source IP bandwidth packets. Native routing определяет RouterOS; source-interface binding не реализован. В принятом прогоне native1, всего4 команды с учётом трёх непрошедшихforward-прогонов. Это функциональная проверка, не benchmark/multi-WAN proof.

В форме локально добавлено пояснение: интерфейс источника используется для Ping после теста, интерфейс назначения выбираетIP/staticfirst, маршрутbandwidth-test определяетRouterOS. Исправлена CLI-подсказка /ip address print where interface= вместоwhere name=; синтаксис RouterOS. Установленные ReUI/Frame-композиции сохранены, новый компонент не устанавливался.

Проверки локального UI: uptime-speed-interface.spec.ts1/1 сHTTP-фикстурами — открытие формы, приоритет адреса изAPI, корректныйCLI/Ping, пояснение и320px fits; scopedfrontend TypeScript/ESLint passed. Это локальная проверка формы, не realbrowserproof новых текстов. Runtimefrontendaa7dbdf прежний, новыеUIизменения ещё не развёрнуты.

Временные --rm containers закрыты, testprobes0; история тестов только в выделеннойБД, основнаяhistory5/backend8782054healthok сохранены. ROS-3 принят дляобратнойкоманды в перечисленных границах; forward2interface/auto не принят. Следующий12.5.29 — realbrowserform/deploymentподсказок; forward-native диагностика иполный12.5 остаются открытыми. План/паспорт/протокол обновлены, локальный коммит без push.

12.5.29 — real browser форма интерфейсов и deployment frontend (2026-10-08)

Production frontend sourcef194e7269b1e0276f257b3fda28413958907a503 собран из чистого contextaa7dbdf с зафиксированным app/(main)/uptime/page.tsx. Git diff подтвердил, что это единственное runtime-изменение frontend; Dockerfile/deps/контракт не менялись. Production build/TypeScript внутри Docker passed; proxyTimeout180s сохранён. Backend image8782054 прежний.

Real browser evidence: новый frontend, выделенная БД и Docker network/SSH3018. Guard подтвердил имя БД; fixtureprobe только в выделенной app DB. Настоящий RouterOS inventory вернул ether1 назначения2 с addresses195.195.195.195/104.165.244.7 (static first). В открытой форме редактирования CLI содержит /ip address print where interface="ether1", /ping address195… interfaceether1 и bandwidth-test address195…; where name отсутствует. Пояснение различает source Ping-интерфейс, destination IP и маршрутизацию RouterOS. ПК/320px fits,0JSerrors/0API>=400. HTTP/RouterOS-моков нет. ПК, телефон.

NativeCalls0/commandPOSTs[]: bandwidth-test в этом блоке не запускался. Это приёмка формы и read-only inventory, не новый throughput или source-interface binding proof. ROS-3 reverse proof12.5.28 сохраняется в своих границах; forward timeout остаётся открытым.

Deployment: MMAPP_IMAGE_TAG=ux-f194e72, BACKEND_IMAGE_TAG=ux-8782054. Running frontend imageSHAa210ebc2… и full source label проверены. Backend healthy/version1.0.0-test.8782054 не перезапускался. Контроль основной БД совпал: servers1–2/enabledtrue,retention14,speedHistory5; restore не выполнялся. Приватная предыдущая env/образ сохранены на сервере для отката; секреты не включены в Git/отчёты.

Пять основных экранов dashboard/servers/uptime-speed/settings/filters200,ПК/320fits,0JSerrors/0API>=400,без HTTP-моков. Временные frontend/backend/network/3018 удалены,fixtureprobe удалена/count0. Основной стенд и SSH3000/8000 сохранены. Обновлённая форма доступна через localhost3000 при создании/редактировании speed-пробы.

Следующий12.5.30 — read-only диагностика native bandwidth1→2 перед повторными командами; forward timeout/multi-WAN/прочие ROS/Q/интеграции и полный12.5 открыты. План/паспорт/протокол обновлены, локальный коммит без push.