145 KiB
Этап 12: итоговая приёмка UX/UI
План: 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.