From c88d31fa4546fa1039a417e894e9322323d433b3 Mon Sep 17 00:00:00 2001 From: Denozordec Date: Thu, 15 Oct 2026 14:39:29 +0700 Subject: [PATCH] =?UTF-8?q?chore(rest):=20=D0=BF=D0=BE=D0=B4=D1=82=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D0=B4=D0=B8=D1=82=D1=8C=20=D1=83=D1=81=D1=82=D0=BE?= =?UTF-8?q?=D0=B9=D1=87=D0=B8=D0=B2=D0=BE=D1=81=D1=82=D1=8C=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=B2=D1=82=D0=BE=D1=80=D0=BD=D1=8B=D1=85=20=D0=BF=D0=B0=D1=80?= =?UTF-8?q?=D0=B0=D0=BB=D0=BB=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D1=85=20=D1=87?= =?UTF-8?q?=D1=82=D0=B5=D0=BD=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scripts/acceptance/rest-session-soak.mjs | 69 + docs/ux-ui-external-acceptance.md | 12 +- docs/ux-ui-plan.md | 14 +- docs/ux-ui-progress.md | 14 +- docs/ux-ui-remaining-acceptance.md | 18 +- docs/ux-ui-stage-12.md | 12 +- docs/ux-ui-test-server.md | 12 +- docs/ux-ui/acceptance/rest262-soak.json | 4224 +++++++++++++++++ docs/ux-ui/acceptance/rest262-summary.json | 25 + 9 files changed, 4389 insertions(+), 11 deletions(-) create mode 100644 backend/scripts/acceptance/rest-session-soak.mjs create mode 100644 docs/ux-ui/acceptance/rest262-soak.json create mode 100644 docs/ux-ui/acceptance/rest262-summary.json diff --git a/backend/scripts/acceptance/rest-session-soak.mjs b/backend/scripts/acceptance/rest-session-soak.mjs new file mode 100644 index 00000000..4e3a417d --- /dev/null +++ b/backend/scripts/acceptance/rest-session-soak.mjs @@ -0,0 +1,69 @@ +import fs from 'node:fs'; +import assert from 'node:assert/strict'; +import { chromium, expect } from '@playwright/test'; + +const output = 'tmp/rest262-soak.json'; +assert(!fs.existsSync(output), 'Never overwrite acceptance evidence'); +const credentials = JSON.parse(fs.readFileSync('tmp/portal195-private.json')); +const browser = await chromium.launch({ channel: 'msedge', headless: true }); +let token; +try { + const page = await browser.newPage(); + await page.goto('http://localhost:3000/certificates'); + await page.getByLabel('Email', { exact: true }).fill(credentials.email); + await page.getByLabel('Пароль', { exact: true }).fill(credentials.password); + await page.getByRole('button', { name: 'Войти', exact: true }).click(); + await expect(page.getByRole('navigation', { name: 'Путь страницы' })).toContainText('Сертификаты', { timeout: 30000 }); + token = await page.evaluate(() => localStorage.getItem('mmapp_token')); + assert(token); +} finally { await browser.close(); } + +const report = { + date: '2026-10-15', block: '12.5.262', realPortalLogin: true, mocks: false, + backend: 'ux-certificates258', endpoint: '/api/certificates/state', directBackendTunnel: true, + concurrentRequestsPerWave: 12, waveIntervalMs: 30000, plannedWindowMs: 600000, + nonAuthApiWrites: 0, nativeConfigurationWrites: 0, waves: [], + bounds: ['One backend, two CHR over HTTP REST; not a global cap for external clients or multiple backend instances', 'Concurrent normal collectors and UI acceptance may run; not maximum throughput', 'A finite successful window does not prove all historical 401/500 causes or indefinite stability'], +}; +const start = Date.now(); +const lastReceipts = new Map(); +try { + for (let wave = 0; wave <= 20; wave++) { + const wait = start + wave * report.waveIntervalMs - Date.now(); + if (wait > 0) await new Promise(resolve => setTimeout(resolve, wait)); + const began = Date.now(); + const samples = await Promise.all(Array.from({ length: 12 }, async () => { + const requested = Date.now(); + try { + const response = await fetch('http://localhost:8000/api/certificates/state', { + headers: { Authorization: 'Bearer ' + token }, signal: AbortSignal.timeout(20000), + }); + const body = await response.json(); + return { status: response.status, durationMs: Date.now() - requested, servers: body.servers?.map(s => ({ serverId: s.serverId, collectedAt: s.collectedAt, error: s.error !== null })) ?? [] }; + } catch (error) { return { status: null, durationMs: Date.now() - requested, failure: error.name, servers: [] }; } + })); + const item = { wave, startedAt: new Date(began).toISOString(), elapsedMs: Date.now() - start, durationMs: Date.now() - began, samples }; + report.waves.push(item); + fs.writeFileSync(output, JSON.stringify(report, null, 2) + '\n'); + assert(samples.every(s => s.status === 200 && s.servers.length === 2 && s.servers.every(row => !row.error) && s.servers.map(row => row.serverId).sort().join(',') === '1,2'), 'Request or device read failed; stopping without automatic replay'); + for (const id of ['1', '2']) { + const receipts = samples.flatMap(s => s.servers.filter(row => row.serverId === id).map(row => Date.parse(row.collectedAt))); + assert(receipts.every(Number.isFinite)); + const earliest = Math.min(...receipts); + if (lastReceipts.has(id)) assert(earliest > lastReceipts.get(id), 'A later wave returned an old receipt'); + lastReceipts.set(id, Math.max(...receipts)); + } + console.log(JSON.stringify({ wave, durationMs: item.durationMs, requests: samples.length, errors: 0 })); + } + report.completed = true; + report.durationMs = Date.now() - start; + assert(report.durationMs >= report.plannedWindowMs); + report.passed = true; +} catch (error) { + report.passed = false; + report.failure = { name: error.name, message: error.message.slice(0, 200) }; + process.exitCode = 1; +} finally { + token = undefined; + fs.writeFileSync(output, JSON.stringify(report, null, 2) + '\n'); +} diff --git a/docs/ux-ui-external-acceptance.md b/docs/ux-ui-external-acceptance.md index 8bc63286..f90aa818 100644 --- a/docs/ux-ui-external-acceptance.md +++ b/docs/ux-ui-external-acceptance.md @@ -1,6 +1,6 @@ # UX/UI: протокол внешней приёмки 12.5 -Актуальное продолжение 2026-10-15: 261 — оставшиеся12 default screens проверены; контраст recursive/ECMP исправлен, KPI BGP/GRE/VXLAN/OSPF используют штатную адаптивную сетку.64 unique live states261, вместе с260 —120 состояний30 экранов с явным происхождением;40 локальных E2E приняты. Runtime backend258/frontend261. Следующий262 — оформить десятиминутный REST-протокол, затем263 — итоговая UI-регрессия; этап12.5 открыт. +Актуальное продолжение 2026-10-15: 262 — ten-minute REST soak после shared pool fix прошёл:21 волна×12 GET,252 запросов/504 device observations,200/errornull везде, новые receipts, native writes0. UI260/261 покрывает120 unique default states30 экранов. Runtime backend258/frontend261. Следующий263 — полная актуальная локальная UI-регрессия с изоляцией backend и сохранением screenshots; этап12.5 открыт. IPsec78: реальный PSK responder established, mode-config198.18.78.10 и online=true подтверждены API; точные собственные объекты удалены. Сертификатный/DN online, late failure и history restore остаются открытыми. [Отчёт](ux-ui/acceptance/ipsec-mode-config-2026-10-09.json), [журнал](ux-ui-progress.md). @@ -18,6 +18,16 @@ OSPF84: real GRE Full adjacency/private routes/Ping3/3 и4 live PC/320px URL/bro BFD85: Up/Full/own route/Ping,4 live UI и loss/withdrawal/recovery приняты; exact own cleanup8 коллекций×2 passed. Withdrawal5,245ms не подтверждает sub-second BFD timing; этот вопрос открыт. Runtime routing83 без новой сборки. [Отчёт](ux-ui/acceptance/ospf-bfd-loss-2026-10-09.json). +## 12.5.262 — десятиминутная устойчивость REST после ограничения соединений (2026-10-15) + +Реальный Portal UI login; JWT только в памяти процесса, не в отчёте/файле. Затем прямой localhost8000 SSH tunnel к backend258, endpoint GET /api/certificates/state:21 волна через30s,12 одновременно инициированных Node fetch запросов в каждой. Первый и последний запросы разделены полноценным окном600916ms. Frontend развёртывался/проверялся в части окна, обычные фоновые коллекторы работали; тест не зависел от frontend restart. [Полный протокол](ux-ui/acceptance/rest262-soak.json). + +Все252 HTTP responses200;504 server observations по exact IDs1/2, errornull везде. Server collectedAt валидны и строго новее предыдущей волны: кэш старого receipt не засчитан. Median/p95/max request duration=821/1687/1933ms. Ошибок API/timeout/RouterOS login не обнаружено; автоматических повторов после неопределённого результата нет. Configuration/native writes0; только авторизация Portal и чтение. [Сводка](ux-ui/acceptance/rest262-summary.json). + +Проверен один backend, два предоставленных CHR и конкретный HTTP REST путь. Live peak native sockets не измерялся: cap2 подтверждён профильным transport тестом257, здесь проверяется наблюдаемая стабильность под повторяющимися burst. Не заявляются global cap для hostname aliases/внешних WinBox/SSH/других backend, все прочие REST endpoints, максимальная пропускная способность или бессрочная устойчивость. Историческая причинность всех401/500/vendor version hypothesis этим окном не доказана. + +Helper syntax/scoped ESLint passed; production код не менялся, Docker build/25 backend profiles не повторялись. Native объектов/настроек/DNS/файлов не создавали; rollback не нужен, пароли не менялись. Датированные документы и текущая матрица обновлены. Следующий263 — один полный локальный UI-набор после shared keyboard260 и responsive261, с недоступным proxy backend и восстановлением исходных screenshots; build/runtime остаются backend258/frontend261. + ## 12.5.261 — оставшиеся экраны и читаемые сетевые KPI (2026-10-15) Baseline12 разделов×2 темы×1440/320px:48 live states, API/JS errors0, overflow0, blocked configuration writes0. Четыре проверенных read-only POST OSPF preview разрешены явно после чтения backend handler; они рассчитывают план, не применяют его. DNS resolution/catalog read POST также имеют точный opt-in allowlist в helper, остальные non-GET блокируются. EvoBGP на стенде disabled, URL/key не настроены: каталоги здесь проверены в состоянии недоступной интеграции, не с реальными внешними данными. [Baseline](ux-ui/acceptance/ui261-baseline.json). diff --git a/docs/ux-ui-plan.md b/docs/ux-ui-plan.md index 22537c22..f6845c25 100644 --- a/docs/ux-ui-plan.md +++ b/docs/ux-ui-plan.md @@ -1,9 +1,19 @@ # План реализации UX/UI по пятичасовым окнам -Актуальное продолжение 2026-10-15: 261 — оставшиеся12 default screens проверены; контраст recursive/ECMP исправлен, KPI BGP/GRE/VXLAN/OSPF используют штатную адаптивную сетку.64 unique live states261, вместе с260 —120 состояний30 экранов с явным происхождением;40 локальных E2E приняты. Runtime backend258/frontend261. Следующий262 — оформить десятиминутный REST-протокол, затем263 — итоговая UI-регрессия; этап12.5 открыт. +Актуальное продолжение 2026-10-15: 262 — ten-minute REST soak после shared pool fix прошёл:21 волна×12 GET,252 запросов/504 device observations,200/errornull везде, новые receipts, native writes0. UI260/261 покрывает120 unique default states30 экранов. Runtime backend258/frontend261. Следующий263 — полная актуальная локальная UI-регрессия с изоляцией backend и сохранением screenshots; этап12.5 открыт. Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-15. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат. +## 12.5.262 — десятиминутная устойчивость REST после ограничения соединений (2026-10-15) + +Реальный Portal UI login; JWT только в памяти процесса, не в отчёте/файле. Затем прямой localhost8000 SSH tunnel к backend258, endpoint GET /api/certificates/state:21 волна через30s,12 одновременно инициированных Node fetch запросов в каждой. Первый и последний запросы разделены полноценным окном600916ms. Frontend развёртывался/проверялся в части окна, обычные фоновые коллекторы работали; тест не зависел от frontend restart. [Полный протокол](ux-ui/acceptance/rest262-soak.json). + +Все252 HTTP responses200;504 server observations по exact IDs1/2, errornull везде. Server collectedAt валидны и строго новее предыдущей волны: кэш старого receipt не засчитан. Median/p95/max request duration=821/1687/1933ms. Ошибок API/timeout/RouterOS login не обнаружено; автоматических повторов после неопределённого результата нет. Configuration/native writes0; только авторизация Portal и чтение. [Сводка](ux-ui/acceptance/rest262-summary.json). + +Проверен один backend, два предоставленных CHR и конкретный HTTP REST путь. Live peak native sockets не измерялся: cap2 подтверждён профильным transport тестом257, здесь проверяется наблюдаемая стабильность под повторяющимися burst. Не заявляются global cap для hostname aliases/внешних WinBox/SSH/других backend, все прочие REST endpoints, максимальная пропускная способность или бессрочная устойчивость. Историческая причинность всех401/500/vendor version hypothesis этим окном не доказана. + +Helper syntax/scoped ESLint passed; production код не менялся, Docker build/25 backend profiles не повторялись. Native объектов/настроек/DNS/файлов не создавали; rollback не нужен, пароли не менялись. Датированные документы и текущая матрица обновлены. Следующий263 — один полный локальный UI-набор после shared keyboard260 и responsive261, с недоступным proxy backend и восстановлением исходных screenshots; build/runtime остаются backend258/frontend261. + ## 12.5.261 — оставшиеся экраны и читаемые сетевые KPI (2026-10-15) Baseline12 разделов×2 темы×1440/320px:48 live states, API/JS errors0, overflow0, blocked configuration writes0. Четыре проверенных read-only POST OSPF preview разрешены явно после чтения backend handler; они рассчитывают план, не применяют его. DNS resolution/catalog read POST также имеют точный opt-in allowlist в helper, остальные non-GET блокируются. EvoBGP на стенде disabled, URL/key не настроены: каталоги здесь проверены в состоянии недоступной интеграции, не с реальными внешними данными. [Baseline](ux-ui/acceptance/ui261-baseline.json). @@ -366,7 +376,7 @@ Production backend/frontend ux-backups237 собраны и развёрнуты | Группа | Подтверждено | Открытый объём / условие | | --- | --- | --- | -| REST и достоверность данных | Нативные наблюдения236/238; ограничение shared REST pools257,12 параллельных чтений двух CHR и25 backend-профилей прошли | Длительное наблюдение после transport fix; историческая причинность всех401/500 и сравнение версий RouterOS полностью не доказаны | +| REST и достоверность данных | Нативные наблюдения236/238; ограничение shared REST pools257,12 параллельных чтений двух CHR и25 backend-профилей прошли | После fix262 приняты21 burst/252 запроса за10min на одном endpoint; более длительные/иные endpoints, историческая причинность всех401/500 и сравнение версий отдельно | | Клиентские ОС и внешняя сеть | CHR↔CHR/Linux; Android StrongSwan full-tunnel и reconnect227 подтверждены пользователем | Windows/macOS/iOS и другие клиенты; независимые WAN/multi-WAN. Публичного IPv6 на предоставленном стенде нет — проверка требует другого подключения | | Масштаб и устойчивость | Контролируемые PG lock/dedupe/loss/recovery, отдельные multi-process сценарии194/200/201 | Несколько полноценных backend/worker со всеми writers, длительный rekey/traffic, физические потери WAN/DB и maximum throughput | | Хранилища и внешние jobs | Реальные Portal/Telegram195–201, Selectel S3/limited bridge restore/retention228–240, GeoIP mirror242; контейнеры248; production ACME250 и реальное renewal/rotation259 с trusted TLS/cleanup | Large native export/migration buckets/multi-instance S3; CA revocation отдельно не принят. Gitea publishing CI не запускался: действует no push. Direct licensed MaxMind отсутствует в текущей реализации | diff --git a/docs/ux-ui-progress.md b/docs/ux-ui-progress.md index e9d81a06..85bcd210 100644 --- a/docs/ux-ui-progress.md +++ b/docs/ux-ui-progress.md @@ -1,6 +1,6 @@ # UX/UI: журнал реализации -Актуальное продолжение 2026-10-15: 261 — оставшиеся12 default screens проверены; контраст recursive/ECMP исправлен, KPI BGP/GRE/VXLAN/OSPF используют штатную адаптивную сетку.64 unique live states261, вместе с260 —120 состояний30 экранов с явным происхождением;40 локальных E2E приняты. Runtime backend258/frontend261. Следующий262 — оформить десятиминутный REST-протокол, затем263 — итоговая UI-регрессия; этап12.5 открыт. +Актуальное продолжение 2026-10-15: 262 — ten-minute REST soak после shared pool fix прошёл:21 волна×12 GET,252 запросов/504 device observations,200/errornull везде, новые receipts, native writes0. UI260/261 покрывает120 unique default states30 экранов. Runtime backend258/frontend261. Следующий263 — полная актуальная локальная UI-регрессия с изоляцией backend и сохранением screenshots; этап12.5 открыт. Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения. Записи расположены от новых к старым; подробная история этапа12 также сохранена в [ux-ui-stage-12.md](ux-ui-stage-12.md). @@ -36,7 +36,17 @@ | 10 | Маршрутизация, диагностика, карта и терминал | Завершён в границах локальной приёмки 2026-10-01; блоки 10.1–10.71, внешние ограничения в 10.71 | | 11А | Пользователи, контейнеры, сертификаты и резервные копии | Завершён в границах локальной приёмки 2026-10-01; 11А.1–11А.33, внешние ограничения в 11А.33 | | 11Б | Оповещения, сбор данных, интеграции, релизы и настройки | Завершён в границах локальной приёмки 2026-10-03; ограничения и evidence в11Б.7 | -| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная12.3.83; внешняя12.5 открыта, блоки1–261 в записанных границах. ACME259; default UI260/261:120 unique states30 экранов. Runtime backend258/frontend261. Следующий262 — REST, затем263 — полная актуальная UI-регрессия. | +| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная12.3.83; внешняя12.5 открыта, блоки1–262. ACME259; default UI260/261:120 states30 экранов; REST262 ten-minute252 requests passed. Runtime backend258/frontend261. Следующий263 — итоговая локальная UI-регрессия. | + +## 12.5.262 — десятиминутная устойчивость REST после ограничения соединений (2026-10-15) + +Реальный Portal UI login; JWT только в памяти процесса, не в отчёте/файле. Затем прямой localhost8000 SSH tunnel к backend258, endpoint GET /api/certificates/state:21 волна через30s,12 одновременно инициированных Node fetch запросов в каждой. Первый и последний запросы разделены полноценным окном600916ms. Frontend развёртывался/проверялся в части окна, обычные фоновые коллекторы работали; тест не зависел от frontend restart. [Полный протокол](ux-ui/acceptance/rest262-soak.json). + +Все252 HTTP responses200;504 server observations по exact IDs1/2, errornull везде. Server collectedAt валидны и строго новее предыдущей волны: кэш старого receipt не засчитан. Median/p95/max request duration=821/1687/1933ms. Ошибок API/timeout/RouterOS login не обнаружено; автоматических повторов после неопределённого результата нет. Configuration/native writes0; только авторизация Portal и чтение. [Сводка](ux-ui/acceptance/rest262-summary.json). + +Проверен один backend, два предоставленных CHR и конкретный HTTP REST путь. Live peak native sockets не измерялся: cap2 подтверждён профильным transport тестом257, здесь проверяется наблюдаемая стабильность под повторяющимися burst. Не заявляются global cap для hostname aliases/внешних WinBox/SSH/других backend, все прочие REST endpoints, максимальная пропускная способность или бессрочная устойчивость. Историческая причинность всех401/500/vendor version hypothesis этим окном не доказана. + +Helper syntax/scoped ESLint passed; production код не менялся, Docker build/25 backend profiles не повторялись. Native объектов/настроек/DNS/файлов не создавали; rollback не нужен, пароли не менялись. Датированные документы и текущая матрица обновлены. Следующий263 — один полный локальный UI-набор после shared keyboard260 и responsive261, с недоступным proxy backend и восстановлением исходных screenshots; build/runtime остаются backend258/frontend261. ## 12.5.261 — оставшиеся экраны и читаемые сетевые KPI (2026-10-15) diff --git a/docs/ux-ui-remaining-acceptance.md b/docs/ux-ui-remaining-acceptance.md index ec4d43c8..a0dc8f99 100644 --- a/docs/ux-ui-remaining-acceptance.md +++ b/docs/ux-ui-remaining-acceptance.md @@ -1,11 +1,21 @@ # Оставшаяся внешняя приёмка — 2026-10-15 -Актуальное продолжение 2026-10-15: 261 — оставшиеся12 default screens проверены; контраст recursive/ECMP исправлен, KPI BGP/GRE/VXLAN/OSPF используют штатную адаптивную сетку.64 unique live states261, вместе с260 —120 состояний30 экранов с явным происхождением;40 локальных E2E приняты. Runtime backend258/frontend261. Следующий262 — оформить десятиминутный REST-протокол, затем263 — итоговая UI-регрессия; этап12.5 открыт. +Актуальное продолжение 2026-10-15: 262 — ten-minute REST soak после shared pool fix прошёл:21 волна×12 GET,252 запросов/504 device observations,200/errornull везде, новые receipts, native writes0. UI260/261 покрывает120 unique default states30 экранов. Runtime backend258/frontend261. Следующий263 — полная актуальная локальная UI-регрессия с изоляцией backend и сохранением screenshots; этап12.5 открыт. -Это актуальная матрица после 12.5.261. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии. +Это актуальная матрица после 12.5.262. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии. Стенд: Debian13/Compose, PostgreSQL18.6, два CHR RouterOS7.24.5. Backend `ux-certificates258`, frontend `ux-accessibility261`; production lab с195 использует AUTH_REQUIRED=true и Portal1.3.1. Подписанные JWT/RBAC проверялись в изолированных процессах. Все собственные объекты112 удалены, исходные13 коллекций×2 (включая logging/certificates/files/routes) проверены; пароли не менялись. +## 12.5.262 — десятиминутная устойчивость REST после ограничения соединений (2026-10-15) + +Реальный Portal UI login; JWT только в памяти процесса, не в отчёте/файле. Затем прямой localhost8000 SSH tunnel к backend258, endpoint GET /api/certificates/state:21 волна через30s,12 одновременно инициированных Node fetch запросов в каждой. Первый и последний запросы разделены полноценным окном600916ms. Frontend развёртывался/проверялся в части окна, обычные фоновые коллекторы работали; тест не зависел от frontend restart. [Полный протокол](ux-ui/acceptance/rest262-soak.json). + +Все252 HTTP responses200;504 server observations по exact IDs1/2, errornull везде. Server collectedAt валидны и строго новее предыдущей волны: кэш старого receipt не засчитан. Median/p95/max request duration=821/1687/1933ms. Ошибок API/timeout/RouterOS login не обнаружено; автоматических повторов после неопределённого результата нет. Configuration/native writes0; только авторизация Portal и чтение. [Сводка](ux-ui/acceptance/rest262-summary.json). + +Проверен один backend, два предоставленных CHR и конкретный HTTP REST путь. Live peak native sockets не измерялся: cap2 подтверждён профильным transport тестом257, здесь проверяется наблюдаемая стабильность под повторяющимися burst. Не заявляются global cap для hostname aliases/внешних WinBox/SSH/других backend, все прочие REST endpoints, максимальная пропускная способность или бессрочная устойчивость. Историческая причинность всех401/500/vendor version hypothesis этим окном не доказана. + +Helper syntax/scoped ESLint passed; production код не менялся, Docker build/25 backend profiles не повторялись. Native объектов/настроек/DNS/файлов не создавали; rollback не нужен, пароли не менялись. Датированные документы и текущая матрица обновлены. Следующий263 — один полный локальный UI-набор после shared keyboard260 и responsive261, с недоступным proxy backend и восстановлением исходных screenshots; build/runtime остаются backend258/frontend261. + ## 12.5.261 — оставшиеся экраны и читаемые сетевые KPI (2026-10-15) Baseline12 разделов×2 темы×1440/320px:48 live states, API/JS errors0, overflow0, blocked configuration writes0. Четыре проверенных read-only POST OSPF preview разрешены явно после чтения backend handler; они рассчитывают план, не применяют его. DNS resolution/catalog read POST также имеют точный opt-in allowlist в helper, остальные non-GET блокируются. EvoBGP на стенде disabled, URL/key не настроены: каталоги здесь проверены в состоянии недоступной интеграции, не с реальными внешними данными. [Baseline](ux-ui/acceptance/ui261-baseline.json). @@ -362,7 +372,7 @@ Production backend/frontend ux-backups237 собраны и развёрнуты | Группа | Подтверждено | Открытый объём / условие | | --- | --- | --- | -| REST и достоверность данных | Нативные наблюдения236/238; ограничение shared REST pools257,12 параллельных чтений двух CHR и25 backend-профилей прошли | Длительное наблюдение после transport fix; историческая причинность всех401/500 и сравнение версий RouterOS полностью не доказаны | +| REST и достоверность данных | Нативные наблюдения236/238; ограничение shared REST pools257,12 параллельных чтений двух CHR и25 backend-профилей прошли | После fix262 приняты21 burst/252 запроса за10min на одном endpoint; более длительные/иные endpoints, историческая причинность всех401/500 и сравнение версий отдельно | | Клиентские ОС и внешняя сеть | CHR↔CHR/Linux; Android StrongSwan full-tunnel и reconnect227 подтверждены пользователем | Windows/macOS/iOS и другие клиенты; независимые WAN/multi-WAN. Публичного IPv6 на предоставленном стенде нет — проверка требует другого подключения | | Масштаб и устойчивость | Контролируемые PG lock/dedupe/loss/recovery, отдельные multi-process сценарии194/200/201 | Несколько полноценных backend/worker со всеми writers, длительный rekey/traffic, физические потери WAN/DB и maximum throughput | | Хранилища и внешние jobs | Реальные Portal/Telegram195–201, Selectel S3/limited bridge restore/retention228–240, GeoIP mirror242; контейнеры248; production ACME250 и реальное renewal/rotation259 с trusted TLS/cleanup | Large native export/migration buckets/multi-instance S3; CA revocation отдельно не принят. Gitea publishing CI не запускался: действует no push. Direct licensed MaxMind отсутствует в текущей реализации | @@ -392,7 +402,7 @@ Portal offline JWT действует доexp после logout/role change; э ## Следующая последовательность — 2026-10-15 -1. **REST262 и регрессия263:** оформить десятиминутную стабильность backend258; один полный локальный UI-набор после shared keyboard260/responsive261 с сохранением исходных screenshots и недоступным proxy backend, без native writes. +1. **Регрессия263:** один полный локальный UI-набор после shared keyboard260/responsive261; сохранить/восстановить screenshots, proxy backend направить на недоступный local port, реальные устройства не использовать. REST262 завершён и принят в записанном scope. 2. **Профильный контроль:** для новых изменений выполнять затронутые SQL/API/UI проверки. Общая регрессия192 выполнена; не повторять её без изменений общей основы или нового основания. 3. **Внешние зависимости:** Portal issuer/login/revoke, Telegram bot/chat/разрешённое сообщение, клиентские ОС, независимые WAN/public IPv6 и scale/multi-instance — отдельные группы по таблице выше. Ограничения текущего стенда не превращать в обещание приёмки всех конфигураций. diff --git a/docs/ux-ui-stage-12.md b/docs/ux-ui-stage-12.md index 790d4ccf..bdb1244e 100644 --- a/docs/ux-ui-stage-12.md +++ b/docs/ux-ui-stage-12.md @@ -1,6 +1,6 @@ # Этап 12: итоговая приёмка UX/UI -Актуальное продолжение 2026-10-15: 261 — оставшиеся12 default screens проверены; контраст recursive/ECMP исправлен, KPI BGP/GRE/VXLAN/OSPF используют штатную адаптивную сетку.64 unique live states261, вместе с260 —120 состояний30 экранов с явным происхождением;40 локальных E2E приняты. Runtime backend258/frontend261. Следующий262 — оформить десятиминутный REST-протокол, затем263 — итоговая UI-регрессия; этап12.5 открыт. +Актуальное продолжение 2026-10-15: 262 — ten-minute REST soak после shared pool fix прошёл:21 волна×12 GET,252 запросов/504 device observations,200/errornull везде, новые receipts, native writes0. UI260/261 покрывает120 unique default states30 экранов. Runtime backend258/frontend261. Следующий263 — полная актуальная локальная UI-регрессия с изоляцией backend и сохранением screenshots; этап12.5 открыт. План: [ux-ui-plan.md](ux-ui-plan.md). Фактические результаты: [ux-ui-progress.md](ux-ui-progress.md). Подготовлен после сводных проверок 11Б; завершение каждого блока требует локального коммита без push. @@ -4152,6 +4152,16 @@ Real Portal/browser API, provider local verified: создан один job ро Runtime backend ux-backup234/frontend ux-routing218 healthy; новое application image для volume-only fix не требовалось. Пароли CHR не менялись, S3 mutations0 в235, configs body/JWT не опубликованы, private local manifest удалён. Исходные10 missing local files не восстановлены и records не удалены. Force-recreate — не host reboot/power loss/fsync/DR приёмка. Далее236 — UX недоступных local files, затем version retention границы и оставшиеся7 группы матрицы; multi-instance guard не принимается. Этап12.5 открыт. +## 12.5.262 — десятиминутная устойчивость REST после ограничения соединений (2026-10-15) + +Реальный Portal UI login; JWT только в памяти процесса, не в отчёте/файле. Затем прямой localhost8000 SSH tunnel к backend258, endpoint GET /api/certificates/state:21 волна через30s,12 одновременно инициированных Node fetch запросов в каждой. Первый и последний запросы разделены полноценным окном600916ms. Frontend развёртывался/проверялся в части окна, обычные фоновые коллекторы работали; тест не зависел от frontend restart. [Полный протокол](ux-ui/acceptance/rest262-soak.json). + +Все252 HTTP responses200;504 server observations по exact IDs1/2, errornull везде. Server collectedAt валидны и строго новее предыдущей волны: кэш старого receipt не засчитан. Median/p95/max request duration=821/1687/1933ms. Ошибок API/timeout/RouterOS login не обнаружено; автоматических повторов после неопределённого результата нет. Configuration/native writes0; только авторизация Portal и чтение. [Сводка](ux-ui/acceptance/rest262-summary.json). + +Проверен один backend, два предоставленных CHR и конкретный HTTP REST путь. Live peak native sockets не измерялся: cap2 подтверждён профильным transport тестом257, здесь проверяется наблюдаемая стабильность под повторяющимися burst. Не заявляются global cap для hostname aliases/внешних WinBox/SSH/других backend, все прочие REST endpoints, максимальная пропускная способность или бессрочная устойчивость. Историческая причинность всех401/500/vendor version hypothesis этим окном не доказана. + +Helper syntax/scoped ESLint passed; production код не менялся, Docker build/25 backend profiles не повторялись. Native объектов/настроек/DNS/файлов не создавали; rollback не нужен, пароли не менялись. Датированные документы и текущая матрица обновлены. Следующий263 — один полный локальный UI-набор после shared keyboard260 и responsive261, с недоступным proxy backend и восстановлением исходных screenshots; build/runtime остаются backend258/frontend261. + ## 12.5.261 — оставшиеся экраны и читаемые сетевые KPI (2026-10-15) Baseline12 разделов×2 темы×1440/320px:48 live states, API/JS errors0, overflow0, blocked configuration writes0. Четыре проверенных read-only POST OSPF preview разрешены явно после чтения backend handler; они рассчитывают план, не применяют его. DNS resolution/catalog read POST также имеют точный opt-in allowlist в helper, остальные non-GET блокируются. EvoBGP на стенде disabled, URL/key не настроены: каталоги здесь проверены в состоянии недоступной интеграции, не с реальными внешними данными. [Baseline](ux-ui/acceptance/ui261-baseline.json). diff --git a/docs/ux-ui-test-server.md b/docs/ux-ui-test-server.md index 2eda037e..fa130ecf 100644 --- a/docs/ux-ui-test-server.md +++ b/docs/ux-ui-test-server.md @@ -1,6 +1,6 @@ # Тестовый сервер UX/UI — 2026-10-10 -Актуальное продолжение 2026-10-15: 261 — оставшиеся12 default screens проверены; контраст recursive/ECMP исправлен, KPI BGP/GRE/VXLAN/OSPF используют штатную адаптивную сетку.64 unique live states261, вместе с260 —120 состояний30 экранов с явным происхождением;40 локальных E2E приняты. Runtime backend258/frontend261. Следующий262 — оформить десятиминутный REST-протокол, затем263 — итоговая UI-регрессия; этап12.5 открыт. +Актуальное продолжение 2026-10-15: 262 — ten-minute REST soak после shared pool fix прошёл:21 волна×12 GET,252 запросов/504 device observations,200/errornull везде, новые receipts, native writes0. UI260/261 покрывает120 unique default states30 экранов. Runtime backend258/frontend261. Следующий263 — полная актуальная локальная UI-регрессия с изоляцией backend и сохранением screenshots; этап12.5 открыт. | Параметр | Проверенное состояние | | --- | --- | @@ -34,6 +34,16 @@ OSPF84: real GRE Full adjacency/private routes/Ping3/3 и4 live PC/320px URL/bro BFD85: Up/Full/own route/Ping,4 live UI и loss/withdrawal/recovery приняты; exact own cleanup8 коллекций×2 passed. Withdrawal5,245ms не подтверждает sub-second BFD timing; этот вопрос открыт. Runtime routing83 без новой сборки. [Отчёт](ux-ui/acceptance/ospf-bfd-loss-2026-10-09.json). +## 12.5.262 — десятиминутная устойчивость REST после ограничения соединений (2026-10-15) + +Реальный Portal UI login; JWT только в памяти процесса, не в отчёте/файле. Затем прямой localhost8000 SSH tunnel к backend258, endpoint GET /api/certificates/state:21 волна через30s,12 одновременно инициированных Node fetch запросов в каждой. Первый и последний запросы разделены полноценным окном600916ms. Frontend развёртывался/проверялся в части окна, обычные фоновые коллекторы работали; тест не зависел от frontend restart. [Полный протокол](ux-ui/acceptance/rest262-soak.json). + +Все252 HTTP responses200;504 server observations по exact IDs1/2, errornull везде. Server collectedAt валидны и строго новее предыдущей волны: кэш старого receipt не засчитан. Median/p95/max request duration=821/1687/1933ms. Ошибок API/timeout/RouterOS login не обнаружено; автоматических повторов после неопределённого результата нет. Configuration/native writes0; только авторизация Portal и чтение. [Сводка](ux-ui/acceptance/rest262-summary.json). + +Проверен один backend, два предоставленных CHR и конкретный HTTP REST путь. Live peak native sockets не измерялся: cap2 подтверждён профильным transport тестом257, здесь проверяется наблюдаемая стабильность под повторяющимися burst. Не заявляются global cap для hostname aliases/внешних WinBox/SSH/других backend, все прочие REST endpoints, максимальная пропускная способность или бессрочная устойчивость. Историческая причинность всех401/500/vendor version hypothesis этим окном не доказана. + +Helper syntax/scoped ESLint passed; production код не менялся, Docker build/25 backend profiles не повторялись. Native объектов/настроек/DNS/файлов не создавали; rollback не нужен, пароли не менялись. Датированные документы и текущая матрица обновлены. Следующий263 — один полный локальный UI-набор после shared keyboard260 и responsive261, с недоступным proxy backend и восстановлением исходных screenshots; build/runtime остаются backend258/frontend261. + ## 12.5.261 — оставшиеся экраны и читаемые сетевые KPI (2026-10-15) Baseline12 разделов×2 темы×1440/320px:48 live states, API/JS errors0, overflow0, blocked configuration writes0. Четыре проверенных read-only POST OSPF preview разрешены явно после чтения backend handler; они рассчитывают план, не применяют его. DNS resolution/catalog read POST также имеют точный opt-in allowlist в helper, остальные non-GET блокируются. EvoBGP на стенде disabled, URL/key не настроены: каталоги здесь проверены в состоянии недоступной интеграции, не с реальными внешними данными. [Baseline](ux-ui/acceptance/ui261-baseline.json). diff --git a/docs/ux-ui/acceptance/rest262-soak.json b/docs/ux-ui/acceptance/rest262-soak.json new file mode 100644 index 00000000..2f34081e --- /dev/null +++ b/docs/ux-ui/acceptance/rest262-soak.json @@ -0,0 +1,4224 @@ +{ + "date": "2026-10-15", + "block": "12.5.262", + "realPortalLogin": true, + "mocks": false, + "backend": "ux-certificates258", + "endpoint": "/api/certificates/state", + "directBackendTunnel": true, + "concurrentRequestsPerWave": 12, + "waveIntervalMs": 30000, + "plannedWindowMs": 600000, + "nonAuthApiWrites": 0, + "nativeConfigurationWrites": 0, + "waves": [ + { + "wave": 0, + "startedAt": "2026-10-15T07:26:08.640Z", + "elapsedMs": 1942, + "durationMs": 1942, + "samples": [ + { + "status": 200, + "durationMs": 1768, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:26:07.764Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:26:09.302Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1742, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:26:07.761Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:26:09.285Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1694, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:26:07.762Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:26:09.236Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1680, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:26:07.759Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:26:09.222Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1630, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:26:07.759Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:26:09.172Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1614, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:26:07.757Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:26:09.157Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1570, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:26:07.756Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:26:09.109Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1933, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:26:07.770Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:26:09.476Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1887, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:26:07.769Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:26:09.431Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1868, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:26:07.766Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:26:09.412Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1822, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:26:07.766Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:26:09.366Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1804, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:26:07.764Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:26:09.349Z", + "error": false + } + ] + } + ] + }, + { + "wave": 1, + "startedAt": "2026-10-15T07:26:38.647Z", + "elapsedMs": 31342, + "durationMs": 1335, + "samples": [ + { + "status": 200, + "durationMs": 1304, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:26:38.380Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:26:38.839Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1233, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:26:38.365Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:26:38.775Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 946, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:26:38.119Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:26:38.484Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1008, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:26:38.136Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:26:38.549Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 880, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:26:38.123Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:26:38.420Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 848, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:26:38.082Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:26:38.389Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 912, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:26:38.094Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:26:38.455Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 814, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:26:38.092Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:26:38.353Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 804, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:26:38.059Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:26:38.324Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1331, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:26:38.371Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:26:38.875Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1273, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:26:38.371Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:26:38.809Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1200, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:26:38.347Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:26:38.744Z", + "error": false + } + ] + } + ] + }, + { + "wave": 2, + "startedAt": "2026-10-15T07:27:08.649Z", + "elapsedMs": 60985, + "durationMs": 976, + "samples": [ + { + "status": 200, + "durationMs": 957, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:27:07.736Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:27:08.499Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 975, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:27:07.742Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:27:08.518Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 892, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:27:07.735Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:27:08.436Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 908, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:27:07.734Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:27:08.452Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 844, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:27:07.732Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:27:08.389Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 778, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:27:07.730Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:27:08.322Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 827, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:27:07.732Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:27:08.372Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 763, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:27:07.730Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:27:08.308Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 713, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:27:07.728Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:27:08.258Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 699, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:27:07.724Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:27:08.245Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 644, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:27:07.717Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:27:08.181Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 646, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:27:07.726Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:27:08.192Z", + "error": false + } + ] + } + ] + }, + { + "wave": 3, + "startedAt": "2026-10-15T07:27:38.649Z", + "elapsedMs": 90929, + "durationMs": 920, + "samples": [ + { + "status": 200, + "durationMs": 729, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:27:37.666Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:27:38.270Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 791, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:27:37.668Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:27:38.334Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 722, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:27:37.665Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:27:38.265Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 663, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:27:37.664Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:27:38.207Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 658, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:27:37.662Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:27:38.201Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 597, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:27:37.658Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:27:38.138Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 595, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:27:37.662Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:27:38.139Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 915, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:27:37.674Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:27:38.458Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 919, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:27:37.672Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:27:38.463Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 853, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:27:37.671Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:27:38.394Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 858, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:27:37.671Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:27:38.398Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 787, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:27:37.668Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:27:38.331Z", + "error": false + } + ] + } + ] + }, + { + "wave": 4, + "startedAt": "2026-10-15T07:28:08.653Z", + "elapsedMs": 121723, + "durationMs": 1710, + "samples": [ + { + "status": 200, + "durationMs": 691, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:28:07.706Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:28:08.238Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 687, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:28:07.706Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:28:08.233Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1692, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:28:07.734Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:28:09.239Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1628, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:28:07.730Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:28:09.175Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1647, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:28:07.730Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:28:09.193Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1587, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:28:07.725Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:28:09.135Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1562, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:28:07.722Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:28:09.111Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1498, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:28:07.722Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:28:09.046Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1497, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:28:07.716Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:28:09.047Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 753, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:28:07.709Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:28:08.302Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 748, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:28:07.716Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:28:08.298Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1707, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:28:07.733Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:28:09.257Z", + "error": false + } + ] + } + ] + }, + { + "wave": 5, + "startedAt": "2026-10-15T07:28:38.643Z", + "elapsedMs": 150898, + "durationMs": 895, + "samples": [ + { + "status": 200, + "durationMs": 633, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:28:37.664Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:28:38.169Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 582, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:28:37.657Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:28:38.114Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 569, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:28:37.654Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:28:38.104Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 641, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:28:37.663Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:28:38.178Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 760, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:28:37.674Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:28:38.296Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 767, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:28:37.674Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:28:38.305Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 694, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:28:37.670Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:28:38.232Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 702, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:28:37.670Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:28:38.241Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 892, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:28:37.679Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:28:38.432Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 875, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:28:37.679Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:28:38.424Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 812, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:28:37.677Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:28:38.360Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 821, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:28:37.677Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:28:38.369Z", + "error": false + } + ] + } + ] + }, + { + "wave": 6, + "startedAt": "2026-10-15T07:29:08.651Z", + "elapsedMs": 180945, + "durationMs": 934, + "samples": [ + { + "status": 200, + "durationMs": 612, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:29:07.706Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:29:08.156Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 610, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:29:07.701Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:29:08.153Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 673, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:29:07.704Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:29:08.217Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 675, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:29:07.707Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:29:08.220Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 739, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:29:07.710Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:29:08.281Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 740, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:29:07.711Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:29:08.287Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 862, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:29:07.752Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:29:08.407Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 797, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:29:07.718Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:29:08.344Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 924, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:29:07.753Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:29:08.471Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 802, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:29:07.749Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:29:08.351Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 866, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:29:07.751Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:29:08.414Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 929, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:29:07.754Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:29:08.478Z", + "error": false + } + ] + } + ] + }, + { + "wave": 7, + "startedAt": "2026-10-15T07:29:38.648Z", + "elapsedMs": 210926, + "durationMs": 918, + "samples": [ + { + "status": 200, + "durationMs": 589, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:29:37.653Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:29:38.130Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 853, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:29:37.667Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:29:38.395Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 795, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:29:37.665Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:29:38.331Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 791, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:29:37.663Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:29:38.330Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 731, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:29:37.661Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:29:38.268Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 726, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:29:37.660Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:29:38.266Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 652, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:29:37.658Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:29:38.194Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 657, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:29:37.658Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:29:38.200Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 591, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:29:37.654Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:29:38.133Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 917, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:29:37.670Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:29:38.459Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 916, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:29:37.667Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:29:38.457Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 851, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:29:37.664Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:29:38.394Z", + "error": false + } + ] + } + ] + }, + { + "wave": 8, + "startedAt": "2026-10-15T07:30:08.647Z", + "elapsedMs": 240978, + "durationMs": 971, + "samples": [ + { + "status": 200, + "durationMs": 672, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:30:07.674Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:30:08.213Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 607, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:30:07.665Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:30:08.148Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 605, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:30:07.662Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:30:08.147Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 744, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:30:07.699Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:30:08.286Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 738, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:30:07.699Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:30:08.278Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 667, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:30:07.698Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:30:08.210Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 807, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:30:07.702Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:30:08.350Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 968, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:30:07.708Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:30:08.512Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 935, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:30:07.707Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:30:08.480Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 902, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:30:07.705Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:30:08.447Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 871, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:30:07.704Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:30:08.415Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 821, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:30:07.702Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:30:08.366Z", + "error": false + } + ] + } + ] + }, + { + "wave": 9, + "startedAt": "2026-10-15T07:30:38.656Z", + "elapsedMs": 271276, + "durationMs": 1260, + "samples": [ + { + "status": 200, + "durationMs": 999, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:30:37.663Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:30:38.547Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 952, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:30:37.662Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:30:38.501Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 934, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:30:37.661Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:30:38.482Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 869, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:30:37.659Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:30:38.418Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 886, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:30:37.659Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:30:38.436Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1211, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:30:37.671Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:30:38.758Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1258, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:30:37.672Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:30:38.804Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1188, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:30:37.669Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:30:38.739Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1125, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:30:37.668Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:30:38.676Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1143, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:30:37.670Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:30:38.693Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1078, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:30:37.666Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:30:38.629Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1016, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:30:37.666Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:30:38.565Z", + "error": false + } + ] + } + ] + }, + { + "wave": 10, + "startedAt": "2026-10-15T07:31:08.645Z", + "elapsedMs": 301768, + "durationMs": 1763, + "samples": [ + { + "status": 200, + "durationMs": 1439, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:31:07.788Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:31:08.978Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1407, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:31:07.769Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:31:08.950Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1498, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:31:07.788Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:31:09.043Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1470, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:31:07.800Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:31:09.014Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1535, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:31:07.800Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:31:09.079Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1600, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:31:07.816Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:31:09.146Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1561, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:31:07.816Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:31:09.107Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1625, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:31:07.826Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:31:09.171Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1754, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:31:07.852Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:31:09.301Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1729, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:31:07.852Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:31:09.274Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1687, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:31:07.829Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:31:09.236Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1664, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:31:07.826Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:31:09.210Z", + "error": false + } + ] + } + ] + }, + { + "wave": 11, + "startedAt": "2026-10-15T07:31:38.644Z", + "elapsedMs": 330904, + "durationMs": 900, + "samples": [ + { + "status": 200, + "durationMs": 581, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:31:37.627Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:31:38.119Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 579, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:31:37.626Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:31:38.117Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 772, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:31:37.636Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:31:38.310Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 707, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:31:37.634Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:31:38.245Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 708, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:31:37.631Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:31:38.247Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 644, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:31:37.630Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:31:38.183Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 643, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:31:37.628Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:31:38.181Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 899, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:31:37.641Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:31:38.438Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 898, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:31:37.639Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:31:38.437Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 835, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:31:37.638Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:31:38.374Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 834, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:31:37.636Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:31:38.373Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 771, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:31:37.634Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:31:38.309Z", + "error": false + } + ] + } + ] + }, + { + "wave": 12, + "startedAt": "2026-10-15T07:32:08.652Z", + "elapsedMs": 360917, + "durationMs": 905, + "samples": [ + { + "status": 200, + "durationMs": 645, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:32:07.696Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:32:08.190Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 581, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:32:07.695Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:32:08.125Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 582, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:32:07.695Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:32:08.127Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 704, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:32:07.698Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:32:08.254Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 705, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:32:07.700Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:32:08.256Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 639, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:32:07.698Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:32:08.192Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 895, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:32:07.707Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:32:08.446Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 896, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:32:07.705Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:32:08.451Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 832, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:32:07.704Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:32:08.387Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 826, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:32:07.702Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:32:08.382Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 767, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:32:07.700Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:32:08.322Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 762, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:32:07.702Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:32:08.318Z", + "error": false + } + ] + } + ] + }, + { + "wave": 13, + "startedAt": "2026-10-15T07:32:38.649Z", + "elapsedMs": 391082, + "durationMs": 1073, + "samples": [ + { + "status": 200, + "durationMs": 883, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:32:37.908Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:32:38.422Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1073, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:32:37.962Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:32:38.615Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 940, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:32:37.938Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:32:38.483Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 1018, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:32:37.966Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:32:38.558Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 947, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:32:37.962Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:32:38.490Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 824, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:32:37.819Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:32:38.354Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 540, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:32:37.773Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:32:38.083Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 824, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:32:37.796Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:32:38.356Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 543, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:32:37.759Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:32:38.086Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 604, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:32:37.795Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:32:38.147Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 884, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:32:37.820Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:32:38.419Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 477, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:32:37.772Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:32:38.019Z", + "error": false + } + ] + } + ] + }, + { + "wave": 14, + "startedAt": "2026-10-15T07:33:08.647Z", + "elapsedMs": 420917, + "durationMs": 910, + "samples": [ + { + "status": 200, + "durationMs": 655, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:33:07.651Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:33:08.196Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 648, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:33:07.649Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:33:08.189Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 589, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:33:07.646Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:33:08.128Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 584, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:33:07.649Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:33:08.125Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 718, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:33:07.655Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:33:08.259Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 710, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:33:07.652Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:33:08.252Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 780, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:33:07.658Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:33:08.322Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 775, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:33:07.655Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:33:08.316Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 907, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:33:07.664Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:33:08.450Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 899, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:33:07.662Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:33:08.443Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 837, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:33:07.661Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:33:08.380Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 843, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:33:07.658Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:33:08.386Z", + "error": false + } + ] + } + ] + }, + { + "wave": 15, + "startedAt": "2026-10-15T07:33:38.643Z", + "elapsedMs": 450952, + "durationMs": 949, + "samples": [ + { + "status": 200, + "durationMs": 948, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:33:37.714Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:33:38.486Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 947, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:33:37.714Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:33:38.484Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 885, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:33:37.702Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:33:38.422Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 883, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:33:37.699Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:33:38.420Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 821, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:33:37.699Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:33:38.358Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 819, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:33:37.696Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:33:38.357Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 756, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:33:37.696Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:33:38.294Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 692, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:33:37.689Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:33:38.231Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 691, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:33:37.684Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:33:38.229Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 755, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:33:37.689Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:33:38.293Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 627, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:33:37.682Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:33:38.165Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 628, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:33:37.682Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:33:38.167Z", + "error": false + } + ] + } + ] + }, + { + "wave": 16, + "startedAt": "2026-10-15T07:34:08.650Z", + "elapsedMs": 480921, + "durationMs": 911, + "samples": [ + { + "status": 200, + "durationMs": 593, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:34:07.654Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:34:08.134Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 584, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:34:07.654Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:34:08.127Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 654, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:34:07.657Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:34:08.197Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 844, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:34:07.667Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:34:08.386Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 790, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:34:07.666Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:34:08.325Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 779, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:34:07.665Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:34:08.322Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 717, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:34:07.660Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:34:08.262Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 713, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:34:07.660Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:34:08.258Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 906, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:34:07.670Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:34:08.453Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 903, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:34:07.669Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:34:08.451Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 862, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:34:07.668Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:34:08.389Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 641, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:34:07.657Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:34:08.191Z", + "error": false + } + ] + } + ] + }, + { + "wave": 17, + "startedAt": "2026-10-15T07:34:38.654Z", + "elapsedMs": 510940, + "durationMs": 926, + "samples": [ + { + "status": 200, + "durationMs": 786, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:34:37.676Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:34:38.332Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 722, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:34:37.675Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:34:38.270Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 719, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:34:37.674Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:34:38.267Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 655, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:34:37.672Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:34:38.204Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 654, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:34:37.672Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:34:38.203Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 592, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:34:37.669Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:34:38.140Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 591, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:34:37.670Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:34:38.138Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 910, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:34:37.683Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:34:38.459Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 860, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:34:37.682Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:34:38.409Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 846, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:34:37.681Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:34:38.396Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 796, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:34:37.679Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:34:38.346Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 923, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:34:37.685Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:34:38.473Z", + "error": false + } + ] + } + ] + }, + { + "wave": 18, + "startedAt": "2026-10-15T07:35:08.651Z", + "elapsedMs": 540920, + "durationMs": 909, + "samples": [ + { + "status": 200, + "durationMs": 909, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:35:07.666Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:35:08.454Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 908, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:35:07.662Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:35:08.452Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 846, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:35:07.662Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:35:08.391Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 844, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:35:07.659Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:35:08.389Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 783, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:35:07.659Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:35:08.328Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 782, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:35:07.657Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:35:08.326Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 719, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:35:07.656Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:35:08.265Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 717, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:35:07.654Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:35:08.262Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 656, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:35:07.654Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:35:08.202Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 652, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:35:07.651Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:35:08.198Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 593, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:35:07.649Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:35:08.139Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 592, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:35:07.650Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:35:08.134Z", + "error": false + } + ] + } + ] + }, + { + "wave": 19, + "startedAt": "2026-10-15T07:35:38.655Z", + "elapsedMs": 570978, + "durationMs": 963, + "samples": [ + { + "status": 200, + "durationMs": 767, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:35:37.734Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:35:38.315Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 708, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:35:37.734Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:35:38.257Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 703, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:35:37.728Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:35:38.252Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 643, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:35:37.728Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:35:38.193Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 639, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:35:37.724Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:35:38.188Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 962, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:35:37.749Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:35:38.511Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 956, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:35:37.749Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:35:38.505Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 898, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:35:37.742Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:35:38.447Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 893, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:35:37.740Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:35:38.442Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 847, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:35:37.740Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:35:38.384Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 830, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:35:37.738Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:35:38.378Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 771, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:35:37.738Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:35:38.320Z", + "error": false + } + ] + } + ] + }, + { + "wave": 20, + "startedAt": "2026-10-15T07:36:08.646Z", + "elapsedMs": 600915, + "durationMs": 909, + "samples": [ + { + "status": 200, + "durationMs": 782, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:36:07.654Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:36:08.320Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 717, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:36:07.651Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:36:08.257Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 716, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:36:07.651Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:36:08.256Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 654, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:36:07.648Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:36:08.194Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 652, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:36:07.648Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:36:08.193Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 589, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:36:07.644Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:36:08.130Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 588, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:36:07.646Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:36:08.129Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 779, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:36:07.653Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:36:08.321Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 906, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:36:07.659Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:36:08.449Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 904, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:36:07.659Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:36:08.447Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 841, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:36:07.656Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:36:08.385Z", + "error": false + } + ] + }, + { + "status": 200, + "durationMs": 839, + "servers": [ + { + "serverId": "1", + "collectedAt": "2026-10-15T07:36:07.655Z", + "error": false + }, + { + "serverId": "2", + "collectedAt": "2026-10-15T07:36:08.383Z", + "error": false + } + ] + } + ] + } + ], + "bounds": [ + "One backend, two CHR over HTTP REST; not a global cap for external clients or multiple backend instances", + "Concurrent normal collectors and UI acceptance may run; not maximum throughput", + "A finite successful window does not prove all historical 401/500 causes or indefinite stability" + ], + "completed": true, + "durationMs": 600916, + "passed": true +} diff --git a/docs/ux-ui/acceptance/rest262-summary.json b/docs/ux-ui/acceptance/rest262-summary.json new file mode 100644 index 00000000..16c0eefb --- /dev/null +++ b/docs/ux-ui/acceptance/rest262-summary.json @@ -0,0 +1,25 @@ +{ + "date": "2026-10-15", + "block": "12.5.262", + "durationMs": 600916, + "waves": 21, + "requests": 252, + "deviceObservations": 504, + "errors": 0, + "allResponses200": true, + "receiptsAdvancedBetweenWaves": true, + "timingMs": { + "p50": 821, + "p95": 1687, + "max": 1933 + }, + "backend": "ux-certificates258", + "endpoint": "/api/certificates/state", + "configurationWrites": 0, + "tokenPersisted": false, + "bounds": [ + "One backend, two CHR over HTTP REST; not a global cap for external clients or multiple backend instances", + "Concurrent normal collectors and UI acceptance may run; not maximum throughput", + "A finite successful window does not prove all historical 401/500 causes or indefinite stability" + ] +}