diff --git a/backend/package.json b/backend/package.json index cdc36e24..0c37a6a9 100644 --- a/backend/package.json +++ b/backend/package.json @@ -19,7 +19,7 @@ "test:exec": "tsx src/services/mikrotik-logs.test.ts && tsx src/routes/exec.test.ts && tsx src/plugins/auth.exec.test.ts", "test:auth": "tsx src/lib/permissions.test.ts && tsx src/plugins/auth.smoke.test.ts && tsx src/plugins/auth.ospf-optimizer.test.ts", "test:wireguard": "npx tsx src/services/wireguard-config.test.ts && npx tsx src/services/wireguard-ipv6.test.ts && npx tsx --test src/services/wireguard-import.test.ts src/services/wireguard-import-apply.test.ts src/services/wireguard-import-revision.test.ts src/services/wireguard-delete.test.ts && npx tsx src/routes/wireguard-import.test.ts", - "test:traffic-rate": "tsx src/services/traffic-rate.test.ts && tsx src/services/traffic-observation.test.ts && tsx src/services/traffic-freshness.test.ts && tsx src/services/traffic-live.test.ts && tsx src/services/traffic-observation-sql.test.ts && tsx src/services/traffic-history-sql.test.ts && tsx src/services/traffic-live-sql.test.ts && tsx src/services/traffic-volume-sql.test.ts && tsx src/services/traffic-binding-status.test.ts && tsx src/services/traffic-status-sql.test.ts && tsx src/services/traffic-gap.test.ts && tsx src/services/traffic-identity.test.ts", + "test:traffic-rate": "tsx src/services/traffic-rate.test.ts && tsx src/services/traffic-observation.test.ts && tsx src/services/traffic-freshness.test.ts && tsx src/services/traffic-live.test.ts && tsx src/services/traffic-observation-sql.test.ts && tsx src/services/traffic-history-sql.test.ts && tsx src/services/traffic-live-sql.test.ts && tsx src/services/traffic-volume-sql.test.ts && tsx src/services/traffic-binding-status.test.ts && tsx src/services/traffic-status-sql.test.ts && tsx src/services/traffic-gap.test.ts && tsx src/services/traffic-identity.test.ts && tsx src/services/traffic-membership.test.ts", "test:traffic-flow": "tsx src/routes/traffic-flow-query.test.ts && tsx src/services/traffic-flow-month.test.ts && tsx src/services/traffic-flow-parse.test.ts && tsx src/services/traffic-flow-ipv6-pipeline.test.ts && tsx src/services/traffic-flow-map-exporter.test.ts && tsx src/services/traffic-flow-ifaces.test.ts && tsx src/services/traffic-flow-ifindex.test.ts && tsx src/services/traffic-flow-dedup.test.ts && tsx src/services/traffic-flow-planes.test.ts && tsx src/services/traffic-flow-ip.test.ts && tsx src/services/traffic-flow-dest.test.ts && tsx src/services/traffic-flow-classify.test.ts && tsx src/services/traffic-flow-ripe.test.ts && tsx src/services/traffic-flow-brands.test.ts && tsx src/services/traffic-flow-ingest.test.ts && tsx src/services/traffic-flow-analytics.test.ts && tsx src/services/traffic-flow-map-hops.test.ts && tsx src/services/traffic-flow-purge.test.ts && tsx src/services/traffic-flow-geoip.test.ts && tsx src/services/traffic-flow-facts.test.ts && tsx src/services/traffic-flow-facts-filter.test.ts && tsx src/services/traffic-flow-facts-rebuild.test.ts && tsx src/services/statistics-aggregate.test.ts", "test:users": "tsx src/modules/users/iface-type.test.ts && tsx src/modules/users/bindings.test.ts && tsx src/modules/users/interface-inventory.test.ts && tsx src/routes/users-catalog.test.ts", "test:pg": "tsx src/db/pg-pool.test.ts && tsx src/db/sql-bind.test.ts && tsx src/db/sqlite-json.test.ts && tsx src/db/traffic-flags.test.ts && tsx src/db/pg-schema.test.ts && tsx src/services/config-revisions.test.ts", diff --git a/backend/src/services/traffic-membership.test.ts b/backend/src/services/traffic-membership.test.ts new file mode 100644 index 00000000..09a7a5cb --- /dev/null +++ b/backend/src/services/traffic-membership.test.ts @@ -0,0 +1,12 @@ +import assert from 'node:assert/strict' +import {buildTrafficFromSamples} from './traffic-rate.js' +const at=Date.parse('2026-10-13T00:00:00Z') +const sample=(name:string,t:number,bytes:number,known=true)=>({interfaceName:name,sampledAt:new Date(at+t).toISOString(),rxBytes:bytes,txBytes:bytes,rxBps:0,txBps:0,running:true,disabled:false,countersKnown:true,continuityKnown:known,nativeCounterIdentity:name}) +const calc=(rows:ReturnType[])=>buildTrafficFromSamples(rows,at,at+90_000,undefined,undefined,true) +const removed=calc([sample('a',0,0,false),sample('a',30_000,1024),sample('b',0,0,false),sample('b',30_000,1024),sample('b',60_000,2048),sample('b',90_000,3072)]) +assert.equal(removed.observations!.rxNow,true);assert.equal(removed.sessions,1);assert.equal(removed.rxTotalGiB,4096/1024**3);assert(removed.observations!.rxSeries.some(Boolean)) +const first=calc([sample('a',0,0,false),sample('a',30_000,0),sample('a',60_000,0),sample('new',60_000,0,false)]) +assert.equal(first.observations!.rxNow,false);assert.equal(first.sessions,2) +const next=calc([sample('a',0,0,false),sample('a',30_000,0),sample('a',60_000,0),sample('a',90_000,0),sample('new',60_000,0,false),sample('new',90_000,0)]) +assert.equal(next.observations!.rxNow,true);assert.equal(next.rxNow,0);assert.equal(next.sessions,2) +console.log('wave membership removal/addition/baseline/zero/history/active count passed') diff --git a/backend/src/services/traffic-rate.ts b/backend/src/services/traffic-rate.ts index 0a87b9fa..a2be250c 100644 --- a/backend/src/services/traffic-rate.ts +++ b/backend/src/services/traffic-rate.ts @@ -147,6 +147,8 @@ export function buildTrafficFromSamples( const txPoints: Array<{ t: number; v: number }> = [] const byTs = new Map() let includedSeries=0,lastAttemptAt:number|null=null + const membership = new Map() + let latestMembershipAt = -Infinity let rxBytesDelta = 0 let txBytesDelta = 0 @@ -170,6 +172,15 @@ export function buildTrafficFromSamples( const sorted = [...arr].sort((a, b) => Date.parse(a.sampledAt) - Date.parse(b.sampledAt)) const last = sorted[sorted.length - 1] if (!last) continue + for (const row of sorted) { + const t = Date.parse(row.sampledAt) + if (!Number.isFinite(t) || t < rangeStartMs || t > rangeEndMs) continue + const wave = membership.get(t) ?? {count:0,declared:true,active:0} + wave.count++; wave.declared &&= typeof row.continuityKnown === "boolean" + if (row.running && !row.disabled) wave.active++ + membership.set(t,wave) + latestMembershipAt = Math.max(latestMembershipAt,t) + } // Recorded counter deltas describe the period, independent of the latest link state. includedSeries++ @@ -183,7 +194,8 @@ export function buildTrafficFromSamples( const t1 = parseIsoMs(cur.sampledAt) if(Number.isFinite(Date.parse(cur.sampledAt))&&t1>=rangeStartMs&&t1<=rangeEndMs)lastAttemptAt=Math.max(lastAttemptAt??t1,t1) const sameIdentity = (prev.nativeCounterIdentity ?? null) === (cur.nativeCounterIdentity ?? null) - const countersKnown = prev.countersKnown !== false && cur.countersKnown !== false && cur.continuityKnown !== false && sameIdentity + const identityPresent = cur.continuityKnown === undefined || typeof cur.nativeCounterIdentity === "string" && cur.nativeCounterIdentity.length > 0 + const countersKnown = prev.countersKnown !== false && cur.countersKnown !== false && cur.continuityKnown !== false && identityPresent && sameIdentity const rxBps = countersKnown ? rateBpsFromDelta(prev.rxBytes, cur.rxBytes, t0, t1) : null const txBps = countersKnown ? rateBpsFromDelta(prev.txBytes, cur.txBytes, t0, t1) : null if (t1 >= rangeStartMs && t1 <= rangeEndMs) { @@ -206,6 +218,9 @@ export function buildTrafficFromSamples( rxPoints.push({ t, v: v.rx }) txPoints.push({ t, v: v.tx }) } + const expectedAt = (t:number) => membership.get(t)?.declared ? membership.get(t)!.count : includedSeries + const latestWave = membership.get(latestMembershipAt) + if (latestWave?.declared) sessions = latestWave.active const rxSeries = bucketAvg(rxPoints, rangeStartMs, rangeEndMs) const txSeries = bucketAvg(txPoints, rangeStartMs, rangeEndMs) @@ -225,10 +240,10 @@ export function buildTrafficFromSamples( rxSeries, txSeries, ...(includeObservations?{observations:{ - rxNow:lastAttemptAt!==null&&lastTs===lastAttemptAt&&!!last?.rxObserved&&last.count===includedSeries, - txNow:lastAttemptAt!==null&&lastTs===lastAttemptAt&&!!last?.txObserved&&last.count===includedSeries, - rxSeries:bucketAvg([...byTs].map(([t,v])=>({t,v:Number(v.rxObserved&&v.count===includedSeries&&t>=rangeStartMs&&t<=rangeEndMs)})),rangeStartMs,rangeEndMs).map(v=>v===1), - txSeries:bucketAvg([...byTs].map(([t,v])=>({t,v:Number(v.txObserved&&v.count===includedSeries&&t>=rangeStartMs&&t<=rangeEndMs)})),rangeStartMs,rangeEndMs).map(v=>v===1), + rxNow:lastAttemptAt!==null&&lastTs===lastAttemptAt&&!!last?.rxObserved&&last.count===expectedAt(lastTs!), + txNow:lastAttemptAt!==null&&lastTs===lastAttemptAt&&!!last?.txObserved&&last.count===expectedAt(lastTs!), + rxSeries:bucketAvg([...byTs].map(([t,v])=>({t,v:Number(v.rxObserved&&v.count===expectedAt(t)&&t>=rangeStartMs&&t<=rangeEndMs)})),rangeStartMs,rangeEndMs).map(v=>v===1), + txSeries:bucketAvg([...byTs].map(([t,v])=>({t,v:Number(v.txObserved&&v.count===expectedAt(t)&&t>=rangeStartMs&&t<=rangeEndMs)})),rangeStartMs,rangeEndMs).map(v=>v===1), sampledAt:lastAttemptAt===null?null:new Date(lastAttemptAt).toISOString(), measurementIntervalMs:lastTs===lastAttemptAt?last?.intervalMs??null:null, }}:{}), diff --git a/backend/src/services/traffic-volume-sql.test.ts b/backend/src/services/traffic-volume-sql.test.ts index 1ff90648..fc0f8cf0 100644 --- a/backend/src/services/traffic-volume-sql.test.ts +++ b/backend/src/services/traffic-volume-sql.test.ts @@ -46,6 +46,15 @@ else { s=(await get(`/traffic/servers/${serverId}?range=1h`)).server;assert.equal(s.rxTotal,1/1024);assert.equal(s.observations.rxNow,false);assert.equal(s.observations.measurementIntervalMs,120_000);assert(s.observations.error.includes("Интервал"));assert(s.observations.rxSeries.some(Boolean));cases++; await pool.query("UPDATE traffic_samples SET sampled_at=$1 WHERE server_id=$2 AND sampled_at=$3",[new Date(Date.parse(at)-30_000).toISOString(),serverId,at]);await put("ether1",0,2*1024**2); s=(await get(`/traffic/servers/${serverId}?range=1h`)).server;assert.equal(s.observations.rxNow,true);assert.equal(s.observations.measurementIntervalMs,30_000);assert.equal(s.rxTotal,2/1024);cases++; + for(const changed of["deleted","renamed"]){ + await pool.query("DELETE FROM traffic_samples WHERE server_id=$1",[serverId]); + for(const[name,offset,bytes]of[["ether1",-90_000,0],["ether1",-60_000,1024],["ether2",-90_000,0],["ether2",-60_000,1024],[changed==="renamed"?"newName":"ether2",-30_000,2048],[changed==="renamed"?"newName":"ether2",0,3072]] as const)await put(name,offset,bytes); + await pool.query("UPDATE traffic_samples SET flags=61,native_counter_identity=CASE WHEN interface_name='newName' THEN 'ether2' ELSE interface_name END WHERE server_id=$1",[serverId]); + if(changed==="renamed")await pool.query("UPDATE traffic_samples SET flags=45 WHERE server_id=$1 AND interface_name='newName' AND sampled_at=$2",[serverId,new Date(Date.parse(at)-30_000).toISOString()]); + s=(await get(`/traffic/servers/${serverId}?range=1h`)).server;assert.equal(s.observations.rxNow,true);assert.equal(s.sessions,1);assert.equal(s.rxTotal,(changed==="renamed"?3072:4096)/1024**3);assert(s.observations.rxSeries.some(Boolean));cases++; + } + await put("newInterface",0,0);await pool.query("UPDATE traffic_samples SET flags=45 WHERE server_id=$1 AND interface_name='newInterface'",[serverId]); + s=(await get(`/traffic/servers/${serverId}?range=1h`)).server;assert.equal(s.observations.rxNow,false);assert.equal(s.sessions,2);cases++; console.log(`traffic volume owned SQL: ${cases} cases; exact bytes/binary unit/server/user/binding/100-part aggregate/reset passed`) }finally{await app.close();await pool.query("DELETE FROM app_users WHERE id=$1",[userId]);if(serverId!==undefined){await pool.query("DELETE FROM traffic_samples WHERE server_id=$1",[serverId]);await pool.query("DELETE FROM servers WHERE id=$1",[serverId])}await closePool()} } diff --git a/docs/ux-ui-external-acceptance.md b/docs/ux-ui-external-acceptance.md index 63c05b0e..4c4702cd 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-13: завершён12.5.187 — actual PG18.6 archive restore: legacy schema→0012 bootstrap без guessed identity/flags; native identity/continuity/counters preserved.4cases/real pg_dump+restore helper passed, ownDB/role/container removed; production DB/runtime untouched (backend ux-identity186/frontend ux-warning183). Следующий188 — history wave membership после rename/delete/add interfaces;12.5 открыта. +Актуальное продолжение 2026-10-13: завершён12.5.188 — per-wave declared membership после rename/delete/add, active interfaces latest wave, no false0 для нового baseline; malformed declared identityNULL→unknown. OwnSQL65/38880ms/unit/build/source460+524/1040compiled/API/browser2 passed. Backend ux-membership188 healthy/frontend ux-warning183; ownDB/role/container удалены. Следующий189 — background traffic source guard между native commands и записью;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). @@ -696,7 +696,7 @@ flowchart LR ## 12.5.77 — основной блок IPsec (2026-10-09) -Актуальное продолжение 2026-10-13: завершён12.5.187 — actual PG18.6 archive restore: legacy schema→0012 bootstrap без guessed identity/flags; native identity/continuity/counters preserved.4cases/real pg_dump+restore helper passed, ownDB/role/container removed; production DB/runtime untouched (backend ux-identity186/frontend ux-warning183). Следующий188 — history wave membership после rename/delete/add interfaces;12.5 открыта. +Актуальное продолжение 2026-10-13: завершён12.5.188 — per-wave declared membership после rename/delete/add, active interfaces latest wave, no false0 для нового baseline; malformed declared identityNULL→unknown. OwnSQL65/38880ms/unit/build/source460+524/1040compiled/API/browser2 passed. Backend ux-membership188 healthy/frontend ux-warning183; ownDB/role/container удалены. Следующий189 — background traffic source guard между native commands и записью;12.5 открыта. Подробный объём, протоколы, схема и ограничения: [12.5.77 в журнале](ux-ui-progress.md). @@ -2239,3 +2239,21 @@ Unit identity/config/legacy-marker/pair guards, backend/application TypeScript PostgreSQL server/client18.6, Node22 from production image; отдельный test-client image на официальном postgres:18 собран с проверкой Node/pg_dump. Docker socket в контейнер не передавался. Script SHA256 совпал с локальными байтами. ESLint passed. OwnDB mm_accept_166_1791829512285/role/container удалены, независимая проверка catalog/container absence passed. Рабочие3 контейнера и их runtime186/183 не менялись, реальных серверных/network writes/messages0; отдельная приёмка PostgreSQL restore в полном API/RBAC/multi-writer сценарии этим коротким тестом не заявляется. Следующий188 — временный состав измерений: текущая реализация сравнивает количество известной wave с количеством всех series за период. Проверить rename/delete/add interfaces и active sessions, чтобы старый ряд не делал текущий срез навсегда unknown, а новое измерение без baseline не превращалось в measured0. Историю сохранить; причины absent object/optional peer failures и multi-instance остаются явными ограничениями.12.5 открыта. Локальный коммит без push. + +## 12.5.188 — состав временных измерений после изменения интерфейсов (2026-10-13) + +[Baseline/fixed](ux-ui/acceptance/traffic-wave-baseline-2026-10-13.json): при удалении одного ряда прежний186 builder навсегда оставлял current unknown и sessions2, хотя последний complete native wave содержал1 интерфейс.188 даёт current known/sessions1 с теми же4096 accounted bytes. Теперь expected count определяется для каждой wave, если все её строки имеют declared continuity marker нового producer. Счётчик активных интерфейсов берётся из последней такой wave. Legacy без marker сохраняет консервативный общий count; отсутствие строки не объявляется нулём по догадке. + +Новый интерфейс без предыдущего baseline присутствует в expected count, но не в known pair sum: current остаётся unknown до следующей пары. Rename оставляет отдельный baseline нового имени, byte gap не додумывается, обе подтверждённые исторические части сохраняются. Declared confirmed continuity с NULL/empty native identity не доверяется. Поиск latest wave не использует неограниченный spread массива timestamps. + +| Сценарий | Результат | +| --- | --- | +| Delete/rename старого series | latest complete wave снова current; stale series не увеличивает current sessions | +| Новый interface с единственным counter | unknown sum, current active count включает интерфейс | +| Следующая confirmed pair с0delta | measured0 допустим | + +Unit membership deletion/addition/baseline/zero/history и backend build passed. [Own PG SQL](ux-ui/acceptance/traffic-wave-sql-2026-10-13.json):65 cases9counter+14history+10TCP SSE+13volume+19status/38880ms, без skip.3 новые GET detail cases: deletion и rename возвращают known current/history/correct active count; добавление одного baseline оставляет current unknown. Markers/native-identity strings этих cases — собственные controlled fixtures, не native device mutation. OwnDB mm_accept_166_1791830718064/role/container удалены и отсутствие проверено. + +[Source460/524](ux-ui/acceptance/traffic-wave-source-2026-10-13.json)/[compiled1040](ux-ui/acceptance/traffic-wave-compiled-2026-10-13.json) SHA256 parity; [backend ux-membership188](ux-ui/acceptance/traffic-wave-runtime-2026-10-13.json) healthy/imageIds, frontend ux-warning183 unchanged/no rebuild. Only backend.env tag, rollback ux-identity186, migration0/secret env copy0. [Actual API](ux-ui/acceptance/traffic-wave-api-2026-10-13.json)/[browser1440/320](ux-ui/acceptance/traffic-wave-deployed-2026-10-13.json) current/live/receipt/no errors/overflow passed. Реальные interfaces/пароли не менялись, messages0; rename/delete проверены собственным SQL dataset, не выданы за native VPN tunnel test. + +Следующий189 — collector после отключения/смены источника между /interface и optional peer request: source.enabled/updatedAt должны проверяться перед каждой следующей командой и перед публикацией успешной записи. Live SSE уже проверяет каждую команду179. Затем проверить temporal peaks/частичные bins отдельно; этот блок не принимает sum-of-individual-peaks за общий одновременный пик.12.5 открыта. Локальный коммит без push. diff --git a/docs/ux-ui-plan.md b/docs/ux-ui-plan.md index f296c897..b6571a71 100644 --- a/docs/ux-ui-plan.md +++ b/docs/ux-ui-plan.md @@ -1,12 +1,12 @@ # План реализации UX/UI по пятичасовым окнам -Актуальное продолжение 2026-10-13: завершён12.5.187 — actual PG18.6 archive restore: legacy schema→0012 bootstrap без guessed identity/flags; native identity/continuity/counters preserved.4cases/real pg_dump+restore helper passed, ownDB/role/container removed; production DB/runtime untouched (backend ux-identity186/frontend ux-warning183). Следующий188 — history wave membership после rename/delete/add interfaces;12.5 открыта. +Актуальное продолжение 2026-10-13: завершён12.5.188 — per-wave declared membership после rename/delete/add, active interfaces latest wave, no false0 для нового baseline; malformed declared identityNULL→unknown. OwnSQL65/38880ms/unit/build/source460+524/1040compiled/API/browser2 passed. Backend ux-membership188 healthy/frontend ux-warning183; ownDB/role/container удалены. Следующий189 — background traffic source guard между native commands и записью;12.5 открыта. Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-12. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат. ## Актуальная точка продолжения — 2026-10-12 -Актуальное продолжение 2026-10-13: завершён12.5.187 — actual PG18.6 archive restore: legacy schema→0012 bootstrap без guessed identity/flags; native identity/continuity/counters preserved.4cases/real pg_dump+restore helper passed, ownDB/role/container removed; production DB/runtime untouched (backend ux-identity186/frontend ux-warning183). Следующий188 — history wave membership после rename/delete/add interfaces;12.5 открыта. +Актуальное продолжение 2026-10-13: завершён12.5.188 — per-wave declared membership после rename/delete/add, active interfaces latest wave, no false0 для нового baseline; malformed declared identityNULL→unknown. OwnSQL65/38880ms/unit/build/source460+524/1040compiled/API/browser2 passed. Backend ux-membership188 healthy/frontend ux-warning183; ownDB/role/container удалены. Следующий189 — background traffic source guard между native commands и записью;12.5 открыта. Этапы0–11 завершены в локальных границах журнала. История выполненных внешних блоков и доказательства сохранены в [журнале](ux-ui-stage-12.md) и [протоколе](ux-ui-external-acceptance.md). Реальная Telegram доставка, Portal SSO, multi-instance и оставшиеся профильные сетевые ограничения открыты. @@ -371,6 +371,6 @@ flowchart LR ## 12.5.77 — основной блок IPsec (2026-10-09) -Актуальное продолжение 2026-10-13: завершён12.5.187 — actual PG18.6 archive restore: legacy schema→0012 bootstrap без guessed identity/flags; native identity/continuity/counters preserved.4cases/real pg_dump+restore helper passed, ownDB/role/container removed; production DB/runtime untouched (backend ux-identity186/frontend ux-warning183). Следующий188 — history wave membership после rename/delete/add interfaces;12.5 открыта. +Актуальное продолжение 2026-10-13: завершён12.5.188 — per-wave declared membership после rename/delete/add, active interfaces latest wave, no false0 для нового baseline; malformed declared identityNULL→unknown. OwnSQL65/38880ms/unit/build/source460+524/1040compiled/API/browser2 passed. Backend ux-membership188 healthy/frontend ux-warning183; ownDB/role/container удалены. Следующий189 — background traffic source guard между native commands и записью;12.5 открыта. Подробный объём, протоколы, схема и ограничения: [12.5.77 в журнале](ux-ui-progress.md). diff --git a/docs/ux-ui-progress.md b/docs/ux-ui-progress.md index 6228f2d4..bdb61d93 100644 --- a/docs/ux-ui-progress.md +++ b/docs/ux-ui-progress.md @@ -1,6 +1,6 @@ # UX/UI: журнал реализации -Актуальное продолжение 2026-10-13: завершён12.5.187 — actual PG18.6 archive restore: legacy schema→0012 bootstrap без guessed identity/flags; native identity/continuity/counters preserved.4cases/real pg_dump+restore helper passed, ownDB/role/container removed; production DB/runtime untouched (backend ux-identity186/frontend ux-warning183). Следующий188 — history wave membership после rename/delete/add interfaces;12.5 открыта. +Актуальное продолжение 2026-10-13: завершён12.5.188 — per-wave declared membership после rename/delete/add, active interfaces latest wave, no false0 для нового baseline; malformed declared identityNULL→unknown. OwnSQL65/38880ms/unit/build/source460+524/1040compiled/API/browser2 passed. Backend ux-membership188 healthy/frontend ux-warning183; ownDB/role/container удалены. Следующий189 — background traffic source guard между native commands и записью;12.5 открыта. Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения. Записи расположены от новых к старым; подробная история этапа12 также сохранена в [ux-ui-stage-12.md](ux-ui-stage-12.md). @@ -38,6 +38,24 @@ | 11Б | Оповещения, сбор данных, интеграции, релизы и настройки | Завершён в границах локальной приёмки 2026-10-03; ограничения и evidence в11Б.7 | | 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка завершена в границах12.3.83; внешняя12.5 в работе, выполненные блоки1–168 и ограничения ниже. Runtime backend ux-month149/frontend ux-sessions150. | +## 12.5.188 — состав временных измерений после изменения интерфейсов (2026-10-13) + +[Baseline/fixed](ux-ui/acceptance/traffic-wave-baseline-2026-10-13.json): при удалении одного ряда прежний186 builder навсегда оставлял current unknown и sessions2, хотя последний complete native wave содержал1 интерфейс.188 даёт current known/sessions1 с теми же4096 accounted bytes. Теперь expected count определяется для каждой wave, если все её строки имеют declared continuity marker нового producer. Счётчик активных интерфейсов берётся из последней такой wave. Legacy без marker сохраняет консервативный общий count; отсутствие строки не объявляется нулём по догадке. + +Новый интерфейс без предыдущего baseline присутствует в expected count, но не в known pair sum: current остаётся unknown до следующей пары. Rename оставляет отдельный baseline нового имени, byte gap не додумывается, обе подтверждённые исторические части сохраняются. Declared confirmed continuity с NULL/empty native identity не доверяется. Поиск latest wave не использует неограниченный spread массива timestamps. + +| Сценарий | Результат | +| --- | --- | +| Delete/rename старого series | latest complete wave снова current; stale series не увеличивает current sessions | +| Новый interface с единственным counter | unknown sum, current active count включает интерфейс | +| Следующая confirmed pair с0delta | measured0 допустим | + +Unit membership deletion/addition/baseline/zero/history и backend build passed. [Own PG SQL](ux-ui/acceptance/traffic-wave-sql-2026-10-13.json):65 cases9counter+14history+10TCP SSE+13volume+19status/38880ms, без skip.3 новые GET detail cases: deletion и rename возвращают known current/history/correct active count; добавление одного baseline оставляет current unknown. Markers/native-identity strings этих cases — собственные controlled fixtures, не native device mutation. OwnDB mm_accept_166_1791830718064/role/container удалены и отсутствие проверено. + +[Source460/524](ux-ui/acceptance/traffic-wave-source-2026-10-13.json)/[compiled1040](ux-ui/acceptance/traffic-wave-compiled-2026-10-13.json) SHA256 parity; [backend ux-membership188](ux-ui/acceptance/traffic-wave-runtime-2026-10-13.json) healthy/imageIds, frontend ux-warning183 unchanged/no rebuild. Only backend.env tag, rollback ux-identity186, migration0/secret env copy0. [Actual API](ux-ui/acceptance/traffic-wave-api-2026-10-13.json)/[browser1440/320](ux-ui/acceptance/traffic-wave-deployed-2026-10-13.json) current/live/receipt/no errors/overflow passed. Реальные interfaces/пароли не менялись, messages0; rename/delete проверены собственным SQL dataset, не выданы за native VPN tunnel test. + +Следующий189 — collector после отключения/смены источника между /interface и optional peer request: source.enabled/updatedAt должны проверяться перед каждой следующей командой и перед публикацией успешной записи. Live SSE уже проверяет каждую команду179. Затем проверить temporal peaks/частичные bins отдельно; этот блок не принимает sum-of-individual-peaks за общий одновременный пик.12.5 открыта. Локальный коммит без push. + ## 12.5.187 — совместимость архивов после миграции counter identity (2026-10-13) [Воспроизводимый runner](../backend/scripts/acceptance/traffic-identity-restore.mjs) проверяет namespace/role/current_database до операций; допускает только отдельную mm_accept_166_* базу с ограниченной ролью. Реальные pg_dump/pg_restore/psql18.6 работают с ней через restorePartitionedDatabase из production ux-identity186: archive decode → known-parent preparation → one transactional psql. Production database/env не копируются и не восстанавливаются. Архивы/SQL остаются внутри временного контейнера, только публичный JSON сохранён в Git. diff --git a/docs/ux-ui-remaining-acceptance.md b/docs/ux-ui-remaining-acceptance.md index 15eebe32..d8681d0a 100644 --- a/docs/ux-ui-remaining-acceptance.md +++ b/docs/ux-ui-remaining-acceptance.md @@ -1,8 +1,8 @@ # Оставшаяся внешняя приёмка — 2026-10-12 -Это актуальная матрица после 12.5.187. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии. +Это актуальная матрица после 12.5.188. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии. -Стенд: Debian13/Compose, PostgreSQL18.6, два CHR RouterOS7.24.5. Backend `ux-identity186`, frontend `ux-warning183`; production lab использует AUTH_REQUIRED=false. Подписанные JWT/RBAC проверялись в изолированных процессах. Все собственные объекты112 удалены, исходные13 коллекций×2 (включая logging/certificates/files/routes) проверены; пароли не менялись. +Стенд: Debian13/Compose, PostgreSQL18.6, два CHR RouterOS7.24.5. Backend `ux-membership188`, frontend `ux-warning183`; production lab использует AUTH_REQUIRED=false. Подписанные JWT/RBAC проверялись в изолированных процессах. Все собственные объекты112 удалены, исходные13 коллекций×2 (включая logging/certificates/files/routes) проверены; пароли не менялись. | Раздел | Подтверждено | Осталось / условие завершения | | --- | --- | --- | @@ -1154,3 +1154,21 @@ Unit identity/config/legacy-marker/pair guards, backend/application TypeScript PostgreSQL server/client18.6, Node22 from production image; отдельный test-client image на официальном postgres:18 собран с проверкой Node/pg_dump. Docker socket в контейнер не передавался. Script SHA256 совпал с локальными байтами. ESLint passed. OwnDB mm_accept_166_1791829512285/role/container удалены, независимая проверка catalog/container absence passed. Рабочие3 контейнера и их runtime186/183 не менялись, реальных серверных/network writes/messages0; отдельная приёмка PostgreSQL restore в полном API/RBAC/multi-writer сценарии этим коротким тестом не заявляется. Следующий188 — временный состав измерений: текущая реализация сравнивает количество известной wave с количеством всех series за период. Проверить rename/delete/add interfaces и active sessions, чтобы старый ряд не делал текущий срез навсегда unknown, а новое измерение без baseline не превращалось в measured0. Историю сохранить; причины absent object/optional peer failures и multi-instance остаются явными ограничениями.12.5 открыта. Локальный коммит без push. + +## 12.5.188 — состав временных измерений после изменения интерфейсов (2026-10-13) + +[Baseline/fixed](ux-ui/acceptance/traffic-wave-baseline-2026-10-13.json): при удалении одного ряда прежний186 builder навсегда оставлял current unknown и sessions2, хотя последний complete native wave содержал1 интерфейс.188 даёт current known/sessions1 с теми же4096 accounted bytes. Теперь expected count определяется для каждой wave, если все её строки имеют declared continuity marker нового producer. Счётчик активных интерфейсов берётся из последней такой wave. Legacy без marker сохраняет консервативный общий count; отсутствие строки не объявляется нулём по догадке. + +Новый интерфейс без предыдущего baseline присутствует в expected count, но не в known pair sum: current остаётся unknown до следующей пары. Rename оставляет отдельный baseline нового имени, byte gap не додумывается, обе подтверждённые исторические части сохраняются. Declared confirmed continuity с NULL/empty native identity не доверяется. Поиск latest wave не использует неограниченный spread массива timestamps. + +| Сценарий | Результат | +| --- | --- | +| Delete/rename старого series | latest complete wave снова current; stale series не увеличивает current sessions | +| Новый interface с единственным counter | unknown sum, current active count включает интерфейс | +| Следующая confirmed pair с0delta | measured0 допустим | + +Unit membership deletion/addition/baseline/zero/history и backend build passed. [Own PG SQL](ux-ui/acceptance/traffic-wave-sql-2026-10-13.json):65 cases9counter+14history+10TCP SSE+13volume+19status/38880ms, без skip.3 новые GET detail cases: deletion и rename возвращают known current/history/correct active count; добавление одного baseline оставляет current unknown. Markers/native-identity strings этих cases — собственные controlled fixtures, не native device mutation. OwnDB mm_accept_166_1791830718064/role/container удалены и отсутствие проверено. + +[Source460/524](ux-ui/acceptance/traffic-wave-source-2026-10-13.json)/[compiled1040](ux-ui/acceptance/traffic-wave-compiled-2026-10-13.json) SHA256 parity; [backend ux-membership188](ux-ui/acceptance/traffic-wave-runtime-2026-10-13.json) healthy/imageIds, frontend ux-warning183 unchanged/no rebuild. Only backend.env tag, rollback ux-identity186, migration0/secret env copy0. [Actual API](ux-ui/acceptance/traffic-wave-api-2026-10-13.json)/[browser1440/320](ux-ui/acceptance/traffic-wave-deployed-2026-10-13.json) current/live/receipt/no errors/overflow passed. Реальные interfaces/пароли не менялись, messages0; rename/delete проверены собственным SQL dataset, не выданы за native VPN tunnel test. + +Следующий189 — collector после отключения/смены источника между /interface и optional peer request: source.enabled/updatedAt должны проверяться перед каждой следующей командой и перед публикацией успешной записи. Live SSE уже проверяет каждую команду179. Затем проверить temporal peaks/частичные bins отдельно; этот блок не принимает sum-of-individual-peaks за общий одновременный пик.12.5 открыта. Локальный коммит без push. diff --git a/docs/ux-ui-stage-12.md b/docs/ux-ui-stage-12.md index 0dc2c7f6..9c3eea6d 100644 --- a/docs/ux-ui-stage-12.md +++ b/docs/ux-ui-stage-12.md @@ -1,6 +1,6 @@ # Этап 12: итоговая приёмка UX/UI -Актуальное продолжение 2026-10-13: завершён12.5.187 — actual PG18.6 archive restore: legacy schema→0012 bootstrap без guessed identity/flags; native identity/continuity/counters preserved.4cases/real pg_dump+restore helper passed, ownDB/role/container removed; production DB/runtime untouched (backend ux-identity186/frontend ux-warning183). Следующий188 — history wave membership после rename/delete/add interfaces;12.5 открыта. +Актуальное продолжение 2026-10-13: завершён12.5.188 — per-wave declared membership после rename/delete/add, active interfaces latest wave, no false0 для нового baseline; malformed declared identityNULL→unknown. OwnSQL65/38880ms/unit/build/source460+524/1040compiled/API/browser2 passed. Backend ux-membership188 healthy/frontend ux-warning183; ownDB/role/container удалены. Следующий189 — background traffic source guard между native commands и записью;12.5 открыта. План: [ux-ui-plan.md](ux-ui-plan.md). Фактические результаты: [ux-ui-progress.md](ux-ui-progress.md). Подготовлен после сводных проверок 11Б; завершение каждого блока требует локального коммита без push. @@ -3544,3 +3544,21 @@ Unit identity/config/legacy-marker/pair guards, backend/application TypeScript PostgreSQL server/client18.6, Node22 from production image; отдельный test-client image на официальном postgres:18 собран с проверкой Node/pg_dump. Docker socket в контейнер не передавался. Script SHA256 совпал с локальными байтами. ESLint passed. OwnDB mm_accept_166_1791829512285/role/container удалены, независимая проверка catalog/container absence passed. Рабочие3 контейнера и их runtime186/183 не менялись, реальных серверных/network writes/messages0; отдельная приёмка PostgreSQL restore в полном API/RBAC/multi-writer сценарии этим коротким тестом не заявляется. Следующий188 — временный состав измерений: текущая реализация сравнивает количество известной wave с количеством всех series за период. Проверить rename/delete/add interfaces и active sessions, чтобы старый ряд не делал текущий срез навсегда unknown, а новое измерение без baseline не превращалось в measured0. Историю сохранить; причины absent object/optional peer failures и multi-instance остаются явными ограничениями.12.5 открыта. Локальный коммит без push. + +## 12.5.188 — состав временных измерений после изменения интерфейсов (2026-10-13) + +[Baseline/fixed](ux-ui/acceptance/traffic-wave-baseline-2026-10-13.json): при удалении одного ряда прежний186 builder навсегда оставлял current unknown и sessions2, хотя последний complete native wave содержал1 интерфейс.188 даёт current known/sessions1 с теми же4096 accounted bytes. Теперь expected count определяется для каждой wave, если все её строки имеют declared continuity marker нового producer. Счётчик активных интерфейсов берётся из последней такой wave. Legacy без marker сохраняет консервативный общий count; отсутствие строки не объявляется нулём по догадке. + +Новый интерфейс без предыдущего baseline присутствует в expected count, но не в known pair sum: current остаётся unknown до следующей пары. Rename оставляет отдельный baseline нового имени, byte gap не додумывается, обе подтверждённые исторические части сохраняются. Declared confirmed continuity с NULL/empty native identity не доверяется. Поиск latest wave не использует неограниченный spread массива timestamps. + +| Сценарий | Результат | +| --- | --- | +| Delete/rename старого series | latest complete wave снова current; stale series не увеличивает current sessions | +| Новый interface с единственным counter | unknown sum, current active count включает интерфейс | +| Следующая confirmed pair с0delta | measured0 допустим | + +Unit membership deletion/addition/baseline/zero/history и backend build passed. [Own PG SQL](ux-ui/acceptance/traffic-wave-sql-2026-10-13.json):65 cases9counter+14history+10TCP SSE+13volume+19status/38880ms, без skip.3 новые GET detail cases: deletion и rename возвращают known current/history/correct active count; добавление одного baseline оставляет current unknown. Markers/native-identity strings этих cases — собственные controlled fixtures, не native device mutation. OwnDB mm_accept_166_1791830718064/role/container удалены и отсутствие проверено. + +[Source460/524](ux-ui/acceptance/traffic-wave-source-2026-10-13.json)/[compiled1040](ux-ui/acceptance/traffic-wave-compiled-2026-10-13.json) SHA256 parity; [backend ux-membership188](ux-ui/acceptance/traffic-wave-runtime-2026-10-13.json) healthy/imageIds, frontend ux-warning183 unchanged/no rebuild. Only backend.env tag, rollback ux-identity186, migration0/secret env copy0. [Actual API](ux-ui/acceptance/traffic-wave-api-2026-10-13.json)/[browser1440/320](ux-ui/acceptance/traffic-wave-deployed-2026-10-13.json) current/live/receipt/no errors/overflow passed. Реальные interfaces/пароли не менялись, messages0; rename/delete проверены собственным SQL dataset, не выданы за native VPN tunnel test. + +Следующий189 — collector после отключения/смены источника между /interface и optional peer request: source.enabled/updatedAt должны проверяться перед каждой следующей командой и перед публикацией успешной записи. Live SSE уже проверяет каждую команду179. Затем проверить temporal peaks/частичные bins отдельно; этот блок не принимает sum-of-individual-peaks за общий одновременный пик.12.5 открыта. Локальный коммит без push. diff --git a/docs/ux-ui-test-server.md b/docs/ux-ui-test-server.md index 1fd7d841..c17560fc 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-13: завершён12.5.187 — actual PG18.6 archive restore: legacy schema→0012 bootstrap без guessed identity/flags; native identity/continuity/counters preserved.4cases/real pg_dump+restore helper passed, ownDB/role/container removed; production DB/runtime untouched (backend ux-identity186/frontend ux-warning183). Следующий188 — history wave membership после rename/delete/add interfaces;12.5 открыта. +Актуальное продолжение 2026-10-13: завершён12.5.188 — per-wave declared membership после rename/delete/add, active interfaces latest wave, no false0 для нового baseline; malformed declared identityNULL→unknown. OwnSQL65/38880ms/unit/build/source460+524/1040compiled/API/browser2 passed. Backend ux-membership188 healthy/frontend ux-warning183; ownDB/role/container удалены. Следующий189 — background traffic source guard между native commands и записью;12.5 открыта. | Параметр | Проверенное состояние | | --- | --- | @@ -14,7 +14,7 @@ | PostgreSQL | postgres:18-alpine,18.6;mmapp-test-postgres healthy;SELECT version() passed | | Данные | Отдельный Compose project mmapp-test,том mmapp-test_mmapp-pgdata и каталог ./data | | Доступ | PostgreSQL не публикуется;frontend3000/backend8000 привязаны к127.0.0.1 после запуска | -| Образы приложения | mmapp-test/backend:ux-identity186 и mmapp-test/frontend:ux-warning183; запущены | +| Образы приложения | mmapp-test/backend:ux-membership188 и mmapp-test/frontend:ux-warning183; запущены | Compose SHA256:3052bd6ab5d9865f97605cebfb5ff27a4410cd3357b81153a65a87fb7c92582f. OptionalBACKEND_IMAGE_TAG позволяетобновлятьbackendотдельно. Локальный и удалённый файлы совпали. Шаблоны: [Compose](../deploy/docker-compose.test.yml), [env без секретов](../deploy/env.test.example). @@ -708,7 +708,7 @@ flowchart LR ## 12.5.77 — основной блок IPsec (2026-10-09) -Актуальное продолжение 2026-10-13: завершён12.5.187 — actual PG18.6 archive restore: legacy schema→0012 bootstrap без guessed identity/flags; native identity/continuity/counters preserved.4cases/real pg_dump+restore helper passed, ownDB/role/container removed; production DB/runtime untouched (backend ux-identity186/frontend ux-warning183). Следующий188 — history wave membership после rename/delete/add interfaces;12.5 открыта. +Актуальное продолжение 2026-10-13: завершён12.5.188 — per-wave declared membership после rename/delete/add, active interfaces latest wave, no false0 для нового baseline; malformed declared identityNULL→unknown. OwnSQL65/38880ms/unit/build/source460+524/1040compiled/API/browser2 passed. Backend ux-membership188 healthy/frontend ux-warning183; ownDB/role/container удалены. Следующий189 — background traffic source guard между native commands и записью;12.5 открыта. Подробный объём, протоколы, схема и ограничения: [12.5.77 в журнале](ux-ui-progress.md). @@ -1970,3 +1970,21 @@ Unit identity/config/legacy-marker/pair guards, backend/application TypeScript PostgreSQL server/client18.6, Node22 from production image; отдельный test-client image на официальном postgres:18 собран с проверкой Node/pg_dump. Docker socket в контейнер не передавался. Script SHA256 совпал с локальными байтами. ESLint passed. OwnDB mm_accept_166_1791829512285/role/container удалены, независимая проверка catalog/container absence passed. Рабочие3 контейнера и их runtime186/183 не менялись, реальных серверных/network writes/messages0; отдельная приёмка PostgreSQL restore в полном API/RBAC/multi-writer сценарии этим коротким тестом не заявляется. Следующий188 — временный состав измерений: текущая реализация сравнивает количество известной wave с количеством всех series за период. Проверить rename/delete/add interfaces и active sessions, чтобы старый ряд не делал текущий срез навсегда unknown, а новое измерение без baseline не превращалось в measured0. Историю сохранить; причины absent object/optional peer failures и multi-instance остаются явными ограничениями.12.5 открыта. Локальный коммит без push. + +## 12.5.188 — состав временных измерений после изменения интерфейсов (2026-10-13) + +[Baseline/fixed](ux-ui/acceptance/traffic-wave-baseline-2026-10-13.json): при удалении одного ряда прежний186 builder навсегда оставлял current unknown и sessions2, хотя последний complete native wave содержал1 интерфейс.188 даёт current known/sessions1 с теми же4096 accounted bytes. Теперь expected count определяется для каждой wave, если все её строки имеют declared continuity marker нового producer. Счётчик активных интерфейсов берётся из последней такой wave. Legacy без marker сохраняет консервативный общий count; отсутствие строки не объявляется нулём по догадке. + +Новый интерфейс без предыдущего baseline присутствует в expected count, но не в known pair sum: current остаётся unknown до следующей пары. Rename оставляет отдельный baseline нового имени, byte gap не додумывается, обе подтверждённые исторические части сохраняются. Declared confirmed continuity с NULL/empty native identity не доверяется. Поиск latest wave не использует неограниченный spread массива timestamps. + +| Сценарий | Результат | +| --- | --- | +| Delete/rename старого series | latest complete wave снова current; stale series не увеличивает current sessions | +| Новый interface с единственным counter | unknown sum, current active count включает интерфейс | +| Следующая confirmed pair с0delta | measured0 допустим | + +Unit membership deletion/addition/baseline/zero/history и backend build passed. [Own PG SQL](ux-ui/acceptance/traffic-wave-sql-2026-10-13.json):65 cases9counter+14history+10TCP SSE+13volume+19status/38880ms, без skip.3 новые GET detail cases: deletion и rename возвращают known current/history/correct active count; добавление одного baseline оставляет current unknown. Markers/native-identity strings этих cases — собственные controlled fixtures, не native device mutation. OwnDB mm_accept_166_1791830718064/role/container удалены и отсутствие проверено. + +[Source460/524](ux-ui/acceptance/traffic-wave-source-2026-10-13.json)/[compiled1040](ux-ui/acceptance/traffic-wave-compiled-2026-10-13.json) SHA256 parity; [backend ux-membership188](ux-ui/acceptance/traffic-wave-runtime-2026-10-13.json) healthy/imageIds, frontend ux-warning183 unchanged/no rebuild. Only backend.env tag, rollback ux-identity186, migration0/secret env copy0. [Actual API](ux-ui/acceptance/traffic-wave-api-2026-10-13.json)/[browser1440/320](ux-ui/acceptance/traffic-wave-deployed-2026-10-13.json) current/live/receipt/no errors/overflow passed. Реальные interfaces/пароли не менялись, messages0; rename/delete проверены собственным SQL dataset, не выданы за native VPN tunnel test. + +Следующий189 — collector после отключения/смены источника между /interface и optional peer request: source.enabled/updatedAt должны проверяться перед каждой следующей командой и перед публикацией успешной записи. Live SSE уже проверяет каждую команду179. Затем проверить temporal peaks/частичные bins отдельно; этот блок не принимает sum-of-individual-peaks за общий одновременный пик.12.5 открыта. Локальный коммит без push. diff --git a/docs/ux-ui/acceptance/traffic-wave-api-2026-10-13.json b/docs/ux-ui/acceptance/traffic-wave-api-2026-10-13.json new file mode 100644 index 00000000..93902f96 --- /dev/null +++ b/docs/ux-ui/acceptance/traffic-wave-api-2026-10-13.json @@ -0,0 +1,26 @@ +{ + "date": "2026-10-13", + "block": "12.5.188", + "version": "1.0.0-test.membership188", + "passed": true, + "method": "Read-only actual application volume API; no new native RouterOS commands; exact edge values covered separately by owned SQL", + "cases": [ + { + "sourceId": "1", + "volumeUnit": "GiB", + "rxTotalGiB": 0.01371948141604662, + "txTotalGiB": 0.0019493047147989273, + "currentState": "current" + }, + { + "sourceId": "2", + "volumeUnit": "GiB", + "rxTotalGiB": 0.0025007007643580437, + "txTotalGiB": 0.0027580251917243004, + "currentState": "current" + } + ], + "newRouterOSCommands": 0, + "passwordChanges": 0, + "messages": 0 +} \ No newline at end of file diff --git a/docs/ux-ui/acceptance/traffic-wave-baseline-2026-10-13.json b/docs/ux-ui/acceptance/traffic-wave-baseline-2026-10-13.json new file mode 100644 index 00000000..9073f1fb --- /dev/null +++ b/docs/ux-ui/acceptance/traffic-wave-baseline-2026-10-13.json @@ -0,0 +1,17 @@ +{ + "date": "2026-10-13", + "block": "12.5.188", + "method": "Read-only pure formulas; prior186 source snapshot versus current188", + "before": { + "currentKnown": false, + "sessions": 2, + "bytes": 4096 + }, + "after": { + "currentKnown": true, + "sessions": 1, + "bytes": 4096 + }, + "writes": 0, + "nativeCommands": 0 +} diff --git a/docs/ux-ui/acceptance/traffic-wave-compiled-2026-10-13.json b/docs/ux-ui/acceptance/traffic-wave-compiled-2026-10-13.json new file mode 100644 index 00000000..55e00dfe --- /dev/null +++ b/docs/ux-ui/acceptance/traffic-wave-compiled-2026-10-13.json @@ -0,0 +1,1050 @@ +{ + "date": "2026-10-13", + "block": "12.5.188", + "backendVersion": "1.0.0-test.membership188", + "normalization": "CRLF to LF", + "matched": [ + "backend/dist/config.js", + "backend/dist/config.js.map", + "backend/dist/config.d.ts", + "backend/dist/config.d.ts.map", + "backend/dist/constants/ping-probe.js", + "backend/dist/constants/ping-probe.js.map", + "backend/dist/constants/ping-probe.d.ts", + "backend/dist/constants/ping-probe.d.ts.map", + "backend/dist/db/bootstrap.js", + "backend/dist/db/bootstrap.js.map", + "backend/dist/db/bootstrap.d.ts", + "backend/dist/db/bootstrap.d.ts.map", + "backend/dist/db/index.js", + "backend/dist/db/index.js.map", + "backend/dist/db/index.d.ts", + "backend/dist/db/index.d.ts.map", + "backend/dist/db/json.js", + "backend/dist/db/json.js.map", + "backend/dist/db/json.d.ts", + "backend/dist/db/json.d.ts.map", + "backend/dist/db/migrate.js", + "backend/dist/db/migrate.js.map", + "backend/dist/db/migrate.d.ts", + "backend/dist/db/migrate.d.ts.map", + "backend/dist/db/operation-lock.js", + "backend/dist/db/operation-lock.js.map", + "backend/dist/db/operation-lock.d.ts", + "backend/dist/db/operation-lock.d.ts.map", + "backend/dist/db/partitions.js", + "backend/dist/db/partitions.js.map", + "backend/dist/db/partitions.d.ts", + "backend/dist/db/partitions.d.ts.map", + "backend/dist/db/schema.js", + "backend/dist/db/schema.js.map", + "backend/dist/db/schema.d.ts", + "backend/dist/db/schema.d.ts.map", + "backend/dist/db/sql-bind.js", + "backend/dist/db/sql-bind.js.map", + "backend/dist/db/sql-bind.d.ts", + "backend/dist/db/sql-bind.d.ts.map", + "backend/dist/db/sqlite-import.js", + "backend/dist/db/sqlite-import.js.map", + "backend/dist/db/sqlite-import.d.ts", + "backend/dist/db/sqlite-import.d.ts.map", + "backend/dist/db/traffic-flags.js", + "backend/dist/db/traffic-flags.js.map", + "backend/dist/db/traffic-flags.d.ts", + "backend/dist/db/traffic-flags.d.ts.map", + "backend/dist/index.js", + "backend/dist/index.js.map", + "backend/dist/index.d.ts", + "backend/dist/index.d.ts.map", + "backend/dist/lib/permissions.js", + "backend/dist/lib/permissions.js.map", + "backend/dist/lib/permissions.d.ts", + "backend/dist/lib/permissions.d.ts.map", + "backend/dist/managed-markers.js", + "backend/dist/managed-markers.js.map", + "backend/dist/managed-markers.d.ts", + "backend/dist/managed-markers.d.ts.map", + "backend/dist/modules/events/repository/events-repository.js", + "backend/dist/modules/events/repository/events-repository.js.map", + "backend/dist/modules/events/repository/events-repository.d.ts", + "backend/dist/modules/events/repository/events-repository.d.ts.map", + "backend/dist/modules/events/service/events-service.js", + "backend/dist/modules/events/service/events-service.js.map", + "backend/dist/modules/events/service/events-service.d.ts", + "backend/dist/modules/events/service/events-service.d.ts.map", + "backend/dist/modules/servers/mapper/servers-mapper.js", + "backend/dist/modules/servers/mapper/servers-mapper.js.map", + "backend/dist/modules/servers/mapper/servers-mapper.d.ts", + "backend/dist/modules/servers/mapper/servers-mapper.d.ts.map", + "backend/dist/modules/servers/repository/servers-repository.js", + "backend/dist/modules/servers/repository/servers-repository.js.map", + "backend/dist/modules/servers/repository/servers-repository.d.ts", + "backend/dist/modules/servers/repository/servers-repository.d.ts.map", + "backend/dist/modules/servers/service/servers-service.js", + "backend/dist/modules/servers/service/servers-service.js.map", + "backend/dist/modules/servers/service/servers-service.d.ts", + "backend/dist/modules/servers/service/servers-service.d.ts.map", + "backend/dist/modules/users/iface-type.js", + "backend/dist/modules/users/iface-type.js.map", + "backend/dist/modules/users/iface-type.d.ts", + "backend/dist/modules/users/iface-type.d.ts.map", + "backend/dist/modules/users/interface-inventory.js", + "backend/dist/modules/users/interface-inventory.js.map", + "backend/dist/modules/users/interface-inventory.d.ts", + "backend/dist/modules/users/interface-inventory.d.ts.map", + "backend/dist/modules/users/peer-bind.js", + "backend/dist/modules/users/peer-bind.js.map", + "backend/dist/modules/users/peer-bind.d.ts", + "backend/dist/modules/users/peer-bind.d.ts.map", + "backend/dist/modules/users/repository/users-repository.js", + "backend/dist/modules/users/repository/users-repository.js.map", + "backend/dist/modules/users/repository/users-repository.d.ts", + "backend/dist/modules/users/repository/users-repository.d.ts.map", + "backend/dist/modules/users/service/users-service.js", + "backend/dist/modules/users/service/users-service.js.map", + "backend/dist/modules/users/service/users-service.d.ts", + "backend/dist/modules/users/service/users-service.d.ts.map", + "backend/dist/plugins/auth.js", + "backend/dist/plugins/auth.js.map", + "backend/dist/plugins/auth.d.ts", + "backend/dist/plugins/auth.d.ts.map", + "backend/dist/plugins/database-request-gate.js", + "backend/dist/plugins/database-request-gate.js.map", + "backend/dist/plugins/database-request-gate.d.ts", + "backend/dist/plugins/database-request-gate.d.ts.map", + "backend/dist/routes/alerts.js", + "backend/dist/routes/alerts.js.map", + "backend/dist/routes/alerts.d.ts", + "backend/dist/routes/alerts.d.ts.map", + "backend/dist/routes/backups.js", + "backend/dist/routes/backups.js.map", + "backend/dist/routes/backups.d.ts", + "backend/dist/routes/backups.d.ts.map", + "backend/dist/routes/bgp.js", + "backend/dist/routes/bgp.js.map", + "backend/dist/routes/bgp.d.ts", + "backend/dist/routes/bgp.d.ts.map", + "backend/dist/routes/certificates.js", + "backend/dist/routes/certificates.js.map", + "backend/dist/routes/certificates.d.ts", + "backend/dist/routes/certificates.d.ts.map", + "backend/dist/routes/containers.js", + "backend/dist/routes/containers.js.map", + "backend/dist/routes/containers.d.ts", + "backend/dist/routes/containers.d.ts.map", + "backend/dist/routes/events.js", + "backend/dist/routes/events.js.map", + "backend/dist/routes/events.d.ts", + "backend/dist/routes/events.d.ts.map", + "backend/dist/routes/evobgp-catalog.js", + "backend/dist/routes/evobgp-catalog.js.map", + "backend/dist/routes/evobgp-catalog.d.ts", + "backend/dist/routes/evobgp-catalog.d.ts.map", + "backend/dist/routes/evobgp-settings.js", + "backend/dist/routes/evobgp-settings.js.map", + "backend/dist/routes/evobgp-settings.d.ts", + "backend/dist/routes/evobgp-settings.d.ts.map", + "backend/dist/routes/evobgp.js", + "backend/dist/routes/evobgp.js.map", + "backend/dist/routes/evobgp.d.ts", + "backend/dist/routes/evobgp.d.ts.map", + "backend/dist/routes/exec.js", + "backend/dist/routes/exec.js.map", + "backend/dist/routes/exec.d.ts", + "backend/dist/routes/exec.d.ts.map", + "backend/dist/routes/filters.js", + "backend/dist/routes/filters.js.map", + "backend/dist/routes/filters.d.ts", + "backend/dist/routes/filters.d.ts.map", + "backend/dist/routes/firewall.js", + "backend/dist/routes/firewall.js.map", + "backend/dist/routes/firewall.d.ts", + "backend/dist/routes/firewall.d.ts.map", + "backend/dist/routes/geoip.js", + "backend/dist/routes/geoip.js.map", + "backend/dist/routes/geoip.d.ts", + "backend/dist/routes/geoip.d.ts.map", + "backend/dist/routes/gre.js", + "backend/dist/routes/gre.js.map", + "backend/dist/routes/gre.d.ts", + "backend/dist/routes/gre.d.ts.map", + "backend/dist/routes/internet-path.js", + "backend/dist/routes/internet-path.js.map", + "backend/dist/routes/internet-path.d.ts", + "backend/dist/routes/internet-path.d.ts.map", + "backend/dist/routes/ipsec.js", + "backend/dist/routes/ipsec.js.map", + "backend/dist/routes/ipsec.d.ts", + "backend/dist/routes/ipsec.d.ts.map", + "backend/dist/routes/network.js", + "backend/dist/routes/network.js.map", + "backend/dist/routes/network.d.ts", + "backend/dist/routes/network.d.ts.map", + "backend/dist/routes/ospf.js", + "backend/dist/routes/ospf.js.map", + "backend/dist/routes/ospf.d.ts", + "backend/dist/routes/ospf.d.ts.map", + "backend/dist/routes/ping-probes-write.js", + "backend/dist/routes/ping-probes-write.js.map", + "backend/dist/routes/ping-probes-write.d.ts", + "backend/dist/routes/ping-probes-write.d.ts.map", + "backend/dist/routes/probes.js", + "backend/dist/routes/probes.js.map", + "backend/dist/routes/probes.d.ts", + "backend/dist/routes/probes.d.ts.map", + "backend/dist/routes/recursive-routes.js", + "backend/dist/routes/recursive-routes.js.map", + "backend/dist/routes/recursive-routes.d.ts", + "backend/dist/routes/recursive-routes.d.ts.map", + "backend/dist/routes/scheduler.js", + "backend/dist/routes/scheduler.js.map", + "backend/dist/routes/scheduler.d.ts", + "backend/dist/routes/scheduler.d.ts.map", + "backend/dist/routes/servers-api-ping.js", + "backend/dist/routes/servers-api-ping.js.map", + "backend/dist/routes/servers-api-ping.d.ts", + "backend/dist/routes/servers-api-ping.d.ts.map", + "backend/dist/routes/servers.js", + "backend/dist/routes/servers.js.map", + "backend/dist/routes/servers.d.ts", + "backend/dist/routes/servers.d.ts.map", + "backend/dist/routes/sidebar-counts.js", + "backend/dist/routes/sidebar-counts.js.map", + "backend/dist/routes/sidebar-counts.d.ts", + "backend/dist/routes/sidebar-counts.d.ts.map", + "backend/dist/routes/speed-probes-write.js", + "backend/dist/routes/speed-probes-write.js.map", + "backend/dist/routes/speed-probes-write.d.ts", + "backend/dist/routes/speed-probes-write.d.ts.map", + "backend/dist/routes/speed-test.js", + "backend/dist/routes/speed-test.js.map", + "backend/dist/routes/speed-test.d.ts", + "backend/dist/routes/speed-test.d.ts.map", + "backend/dist/routes/statistics.js", + "backend/dist/routes/statistics.js.map", + "backend/dist/routes/statistics.d.ts", + "backend/dist/routes/statistics.d.ts.map", + "backend/dist/routes/system-database.js", + "backend/dist/routes/system-database.js.map", + "backend/dist/routes/system-database.d.ts", + "backend/dist/routes/system-database.d.ts.map", + "backend/dist/routes/traffic-flow-purge.js", + "backend/dist/routes/traffic-flow-purge.js.map", + "backend/dist/routes/traffic-flow-purge.d.ts", + "backend/dist/routes/traffic-flow-purge.d.ts.map", + "backend/dist/routes/traffic-flow-settings.js", + "backend/dist/routes/traffic-flow-settings.js.map", + "backend/dist/routes/traffic-flow-settings.d.ts", + "backend/dist/routes/traffic-flow-settings.d.ts.map", + "backend/dist/routes/traffic-flow.js", + "backend/dist/routes/traffic-flow.js.map", + "backend/dist/routes/traffic-flow.d.ts", + "backend/dist/routes/traffic-flow.d.ts.map", + "backend/dist/routes/traffic.js", + "backend/dist/routes/traffic.js.map", + "backend/dist/routes/traffic.d.ts", + "backend/dist/routes/traffic.d.ts.map", + "backend/dist/routes/uptime.js", + "backend/dist/routes/uptime.js.map", + "backend/dist/routes/uptime.d.ts", + "backend/dist/routes/uptime.d.ts.map", + "backend/dist/routes/users.js", + "backend/dist/routes/users.js.map", + "backend/dist/routes/users.d.ts", + "backend/dist/routes/users.d.ts.map", + "backend/dist/routes/vxlan.js", + "backend/dist/routes/vxlan.js.map", + "backend/dist/routes/vxlan.d.ts", + "backend/dist/routes/vxlan.d.ts.map", + "backend/dist/routes/wireguard.js", + "backend/dist/routes/wireguard.js.map", + "backend/dist/routes/wireguard.d.ts", + "backend/dist/routes/wireguard.d.ts.map", + "backend/dist/scripts/migrate-sqlite-to-pg.js", + "backend/dist/scripts/migrate-sqlite-to-pg.js.map", + "backend/dist/scripts/migrate-sqlite-to-pg.d.ts", + "backend/dist/scripts/migrate-sqlite-to-pg.d.ts.map", + "backend/dist/scripts/rebuild-flow-facts.js", + "backend/dist/scripts/rebuild-flow-facts.js.map", + "backend/dist/scripts/rebuild-flow-facts.d.ts", + "backend/dist/scripts/rebuild-flow-facts.d.ts.map", + "backend/dist/services/acme-cloudflare.js", + "backend/dist/services/acme-cloudflare.js.map", + "backend/dist/services/acme-cloudflare.d.ts", + "backend/dist/services/acme-cloudflare.d.ts.map", + "backend/dist/services/alert-collector-hooks.js", + "backend/dist/services/alert-collector-hooks.js.map", + "backend/dist/services/alert-collector-hooks.d.ts", + "backend/dist/services/alert-collector-hooks.d.ts.map", + "backend/dist/services/alert-engine/bgp-signals.js", + "backend/dist/services/alert-engine/bgp-signals.js.map", + "backend/dist/services/alert-engine/bgp-signals.d.ts", + "backend/dist/services/alert-engine/bgp-signals.d.ts.map", + "backend/dist/services/alert-engine/collector-context-reader.js", + "backend/dist/services/alert-engine/collector-context-reader.js.map", + "backend/dist/services/alert-engine/collector-context-reader.d.ts", + "backend/dist/services/alert-engine/collector-context-reader.d.ts.map", + "backend/dist/services/alert-engine/collector-source-signals.js", + "backend/dist/services/alert-engine/collector-source-signals.js.map", + "backend/dist/services/alert-engine/collector-source-signals.d.ts", + "backend/dist/services/alert-engine/collector-source-signals.d.ts.map", + "backend/dist/services/alert-engine/confirm-stability.js", + "backend/dist/services/alert-engine/confirm-stability.js.map", + "backend/dist/services/alert-engine/confirm-stability.d.ts", + "backend/dist/services/alert-engine/confirm-stability.d.ts.map", + "backend/dist/services/alert-engine/cooldown.js", + "backend/dist/services/alert-engine/cooldown.js.map", + "backend/dist/services/alert-engine/cooldown.d.ts", + "backend/dist/services/alert-engine/cooldown.d.ts.map", + "backend/dist/services/alert-engine/decision-engine.js", + "backend/dist/services/alert-engine/decision-engine.js.map", + "backend/dist/services/alert-engine/decision-engine.d.ts", + "backend/dist/services/alert-engine/decision-engine.d.ts.map", + "backend/dist/services/alert-engine/evaluate-rule.js", + "backend/dist/services/alert-engine/evaluate-rule.js.map", + "backend/dist/services/alert-engine/evaluate-rule.d.ts", + "backend/dist/services/alert-engine/evaluate-rule.d.ts.map", + "backend/dist/services/alert-engine/gre-signals.js", + "backend/dist/services/alert-engine/gre-signals.js.map", + "backend/dist/services/alert-engine/gre-signals.d.ts", + "backend/dist/services/alert-engine/gre-signals.d.ts.map", + "backend/dist/services/alert-engine/groups.js", + "backend/dist/services/alert-engine/groups.js.map", + "backend/dist/services/alert-engine/groups.d.ts", + "backend/dist/services/alert-engine/groups.d.ts.map", + "backend/dist/services/alert-engine/monitoring-history.js", + "backend/dist/services/alert-engine/monitoring-history.js.map", + "backend/dist/services/alert-engine/monitoring-history.d.ts", + "backend/dist/services/alert-engine/monitoring-history.d.ts.map", + "backend/dist/services/alert-engine/outbox-execution.js", + "backend/dist/services/alert-engine/outbox-execution.js.map", + "backend/dist/services/alert-engine/outbox-execution.d.ts", + "backend/dist/services/alert-engine/outbox-execution.d.ts.map", + "backend/dist/services/alert-engine/outbox.js", + "backend/dist/services/alert-engine/outbox.js.map", + "backend/dist/services/alert-engine/outbox.d.ts", + "backend/dist/services/alert-engine/outbox.d.ts.map", + "backend/dist/services/alert-engine/prev-live-store.js", + "backend/dist/services/alert-engine/prev-live-store.js.map", + "backend/dist/services/alert-engine/prev-live-store.d.ts", + "backend/dist/services/alert-engine/prev-live-store.d.ts.map", + "backend/dist/services/alert-engine/rule-matcher.js", + "backend/dist/services/alert-engine/rule-matcher.js.map", + "backend/dist/services/alert-engine/rule-matcher.d.ts", + "backend/dist/services/alert-engine/rule-matcher.d.ts.map", + "backend/dist/services/alert-engine/run-once.js", + "backend/dist/services/alert-engine/run-once.js.map", + "backend/dist/services/alert-engine/run-once.d.ts", + "backend/dist/services/alert-engine/run-once.d.ts.map", + "backend/dist/services/alert-engine/server-signal-identity.js", + "backend/dist/services/alert-engine/server-signal-identity.js.map", + "backend/dist/services/alert-engine/server-signal-identity.d.ts", + "backend/dist/services/alert-engine/server-signal-identity.d.ts.map", + "backend/dist/services/alert-engine/signal-ingestor.js", + "backend/dist/services/alert-engine/signal-ingestor.js.map", + "backend/dist/services/alert-engine/signal-ingestor.d.ts", + "backend/dist/services/alert-engine/signal-ingestor.d.ts.map", + "backend/dist/services/alert-engine/signals-from-collectors.js", + "backend/dist/services/alert-engine/signals-from-collectors.js.map", + "backend/dist/services/alert-engine/signals-from-collectors.d.ts", + "backend/dist/services/alert-engine/signals-from-collectors.d.ts.map", + "backend/dist/services/alert-engine/snapshot.js", + "backend/dist/services/alert-engine/snapshot.js.map", + "backend/dist/services/alert-engine/snapshot.d.ts", + "backend/dist/services/alert-engine/snapshot.d.ts.map", + "backend/dist/services/alert-engine/source-watermark.js", + "backend/dist/services/alert-engine/source-watermark.js.map", + "backend/dist/services/alert-engine/source-watermark.d.ts", + "backend/dist/services/alert-engine/source-watermark.d.ts.map", + "backend/dist/services/alert-engine/state-machine.js", + "backend/dist/services/alert-engine/state-machine.js.map", + "backend/dist/services/alert-engine/state-machine.d.ts", + "backend/dist/services/alert-engine/state-machine.d.ts.map", + "backend/dist/services/alert-engine/target-issues.js", + "backend/dist/services/alert-engine/target-issues.js.map", + "backend/dist/services/alert-engine/target-issues.d.ts", + "backend/dist/services/alert-engine/target-issues.d.ts.map", + "backend/dist/services/alert-engine/telegram-emoji.js", + "backend/dist/services/alert-engine/telegram-emoji.js.map", + "backend/dist/services/alert-engine/telegram-emoji.d.ts", + "backend/dist/services/alert-engine/telegram-emoji.d.ts.map", + "backend/dist/services/alert-engine/types.js", + "backend/dist/services/alert-engine/types.js.map", + "backend/dist/services/alert-engine/types.d.ts", + "backend/dist/services/alert-engine/types.d.ts.map", + "backend/dist/services/alerts-config-execution.js", + "backend/dist/services/alerts-config-execution.js.map", + "backend/dist/services/alerts-config-execution.d.ts", + "backend/dist/services/alerts-config-execution.d.ts.map", + "backend/dist/services/alerts-outbox-overview.js", + "backend/dist/services/alerts-outbox-overview.js.map", + "backend/dist/services/alerts-outbox-overview.d.ts", + "backend/dist/services/alerts-outbox-overview.d.ts.map", + "backend/dist/services/alerts-outbox-retry.js", + "backend/dist/services/alerts-outbox-retry.js.map", + "backend/dist/services/alerts-outbox-retry.d.ts", + "backend/dist/services/alerts-outbox-retry.d.ts.map", + "backend/dist/services/alerts-overview.js", + "backend/dist/services/alerts-overview.js.map", + "backend/dist/services/alerts-overview.d.ts", + "backend/dist/services/alerts-overview.d.ts.map", + "backend/dist/services/alerts-revision.js", + "backend/dist/services/alerts-revision.js.map", + "backend/dist/services/alerts-revision.d.ts", + "backend/dist/services/alerts-revision.d.ts.map", + "backend/dist/services/alerts-service.js", + "backend/dist/services/alerts-service.js.map", + "backend/dist/services/alerts-service.d.ts", + "backend/dist/services/alerts-service.d.ts.map", + "backend/dist/services/alerts-telegram-delivery.js", + "backend/dist/services/alerts-telegram-delivery.js.map", + "backend/dist/services/alerts-telegram-delivery.d.ts", + "backend/dist/services/alerts-telegram-delivery.d.ts.map", + "backend/dist/services/alerts-telegram-send.js", + "backend/dist/services/alerts-telegram-send.js.map", + "backend/dist/services/alerts-telegram-send.d.ts", + "backend/dist/services/alerts-telegram-send.d.ts.map", + "backend/dist/services/alerts-telegram-settings.js", + "backend/dist/services/alerts-telegram-settings.js.map", + "backend/dist/services/alerts-telegram-settings.d.ts", + "backend/dist/services/alerts-telegram-settings.d.ts.map", + "backend/dist/services/backup-deletion.js", + "backend/dist/services/backup-deletion.js.map", + "backend/dist/services/backup-deletion.d.ts", + "backend/dist/services/backup-deletion.d.ts.map", + "backend/dist/services/backup-dto.js", + "backend/dist/services/backup-dto.js.map", + "backend/dist/services/backup-dto.d.ts", + "backend/dist/services/backup-dto.d.ts.map", + "backend/dist/services/backup-job-execution.js", + "backend/dist/services/backup-job-execution.js.map", + "backend/dist/services/backup-job-execution.d.ts", + "backend/dist/services/backup-job-execution.d.ts.map", + "backend/dist/services/backup-prune.js", + "backend/dist/services/backup-prune.js.map", + "backend/dist/services/backup-prune.d.ts", + "backend/dist/services/backup-prune.d.ts.map", + "backend/dist/services/backup-restore.js", + "backend/dist/services/backup-restore.js.map", + "backend/dist/services/backup-restore.d.ts", + "backend/dist/services/backup-restore.d.ts.map", + "backend/dist/services/backup-scheduler-collector.js", + "backend/dist/services/backup-scheduler-collector.js.map", + "backend/dist/services/backup-scheduler-collector.d.ts", + "backend/dist/services/backup-scheduler-collector.d.ts.map", + "backend/dist/services/backup-scheduler-run.js", + "backend/dist/services/backup-scheduler-run.js.map", + "backend/dist/services/backup-scheduler-run.d.ts", + "backend/dist/services/backup-scheduler-run.d.ts.map", + "backend/dist/services/backup-service.js", + "backend/dist/services/backup-service.js.map", + "backend/dist/services/backup-service.d.ts", + "backend/dist/services/backup-service.d.ts.map", + "backend/dist/services/backup-storage-update.js", + "backend/dist/services/backup-storage-update.js.map", + "backend/dist/services/backup-storage-update.d.ts", + "backend/dist/services/backup-storage-update.d.ts.map", + "backend/dist/services/bandwidth-test-rates.js", + "backend/dist/services/bandwidth-test-rates.js.map", + "backend/dist/services/bandwidth-test-rates.d.ts", + "backend/dist/services/bandwidth-test-rates.d.ts.map", + "backend/dist/services/bandwidth-test-status.js", + "backend/dist/services/bandwidth-test-status.js.map", + "backend/dist/services/bandwidth-test-status.d.ts", + "backend/dist/services/bandwidth-test-status.d.ts.map", + "backend/dist/services/bgp-catalog-poll.js", + "backend/dist/services/bgp-catalog-poll.js.map", + "backend/dist/services/bgp-catalog-poll.d.ts", + "backend/dist/services/bgp-catalog-poll.d.ts.map", + "backend/dist/services/bgp-parse-sessions.js", + "backend/dist/services/bgp-parse-sessions.js.map", + "backend/dist/services/bgp-parse-sessions.d.ts", + "backend/dist/services/bgp-parse-sessions.d.ts.map", + "backend/dist/services/bgp-peers-live.js", + "backend/dist/services/bgp-peers-live.js.map", + "backend/dist/services/bgp-peers-live.d.ts", + "backend/dist/services/bgp-peers-live.d.ts.map", + "backend/dist/services/btest-node-locks.js", + "backend/dist/services/btest-node-locks.js.map", + "backend/dist/services/btest-node-locks.d.ts", + "backend/dist/services/btest-node-locks.d.ts.map", + "backend/dist/services/certificate-issue-dto.js", + "backend/dist/services/certificate-issue-dto.js.map", + "backend/dist/services/certificate-issue-dto.d.ts", + "backend/dist/services/certificate-issue-dto.d.ts.map", + "backend/dist/services/certificate-issue-execution.js", + "backend/dist/services/certificate-issue-execution.js.map", + "backend/dist/services/certificate-issue-execution.d.ts", + "backend/dist/services/certificate-issue-execution.d.ts.map", + "backend/dist/services/certificate-issue-request.js", + "backend/dist/services/certificate-issue-request.js.map", + "backend/dist/services/certificate-issue-request.d.ts", + "backend/dist/services/certificate-issue-request.d.ts.map", + "backend/dist/services/certificate-issue-runner.js", + "backend/dist/services/certificate-issue-runner.js.map", + "backend/dist/services/certificate-issue-runner.d.ts", + "backend/dist/services/certificate-issue-runner.d.ts.map", + "backend/dist/services/certificate-parse.js", + "backend/dist/services/certificate-parse.js.map", + "backend/dist/services/certificate-parse.d.ts", + "backend/dist/services/certificate-parse.d.ts.map", + "backend/dist/services/certificate-renew-collector.js", + "backend/dist/services/certificate-renew-collector.js.map", + "backend/dist/services/certificate-renew-collector.d.ts", + "backend/dist/services/certificate-renew-collector.d.ts.map", + "backend/dist/services/certificates-service.js", + "backend/dist/services/certificates-service.js.map", + "backend/dist/services/certificates-service.d.ts", + "backend/dist/services/certificates-service.d.ts.map", + "backend/dist/services/certificates-state.js", + "backend/dist/services/certificates-state.js.map", + "backend/dist/services/certificates-state.d.ts", + "backend/dist/services/certificates-state.d.ts.map", + "backend/dist/services/complete-count.js", + "backend/dist/services/complete-count.js.map", + "backend/dist/services/complete-count.d.ts", + "backend/dist/services/complete-count.d.ts.map", + "backend/dist/services/config-apply-plan.js", + "backend/dist/services/config-apply-plan.js.map", + "backend/dist/services/config-apply-plan.d.ts", + "backend/dist/services/config-apply-plan.d.ts.map", + "backend/dist/services/config-revisions.js", + "backend/dist/services/config-revisions.js.map", + "backend/dist/services/config-revisions.d.ts", + "backend/dist/services/config-revisions.d.ts.map", + "backend/dist/services/containers-live.js", + "backend/dist/services/containers-live.js.map", + "backend/dist/services/containers-live.d.ts", + "backend/dist/services/containers-live.d.ts.map", + "backend/dist/services/containers-state.js", + "backend/dist/services/containers-state.js.map", + "backend/dist/services/containers-state.d.ts", + "backend/dist/services/containers-state.d.ts.map", + "backend/dist/services/database-background-work.js", + "backend/dist/services/database-background-work.js.map", + "backend/dist/services/database-background-work.d.ts", + "backend/dist/services/database-background-work.d.ts.map", + "backend/dist/services/database-request-gate.js", + "backend/dist/services/database-request-gate.js.map", + "backend/dist/services/database-request-gate.d.ts", + "backend/dist/services/database-request-gate.d.ts.map", + "backend/dist/services/entity-snapshots.js", + "backend/dist/services/entity-snapshots.js.map", + "backend/dist/services/entity-snapshots.d.ts", + "backend/dist/services/entity-snapshots.d.ts.map", + "backend/dist/services/evobgp-catalog.js", + "backend/dist/services/evobgp-catalog.js.map", + "backend/dist/services/evobgp-catalog.d.ts", + "backend/dist/services/evobgp-catalog.d.ts.map", + "backend/dist/services/firewall-live.js", + "backend/dist/services/firewall-live.js.map", + "backend/dist/services/firewall-live.d.ts", + "backend/dist/services/firewall-live.d.ts.map", + "backend/dist/services/firewall-poll.js", + "backend/dist/services/firewall-poll.js.map", + "backend/dist/services/firewall-poll.d.ts", + "backend/dist/services/firewall-poll.d.ts.map", + "backend/dist/services/geoip-settings.js", + "backend/dist/services/geoip-settings.js.map", + "backend/dist/services/geoip-settings.d.ts", + "backend/dist/services/geoip-settings.d.ts.map", + "backend/dist/services/geoip-update-collector.js", + "backend/dist/services/geoip-update-collector.js.map", + "backend/dist/services/geoip-update-collector.d.ts", + "backend/dist/services/geoip-update-collector.d.ts.map", + "backend/dist/services/gre-bgp-snapshot-collector.js", + "backend/dist/services/gre-bgp-snapshot-collector.js.map", + "backend/dist/services/gre-bgp-snapshot-collector.d.ts", + "backend/dist/services/gre-bgp-snapshot-collector.d.ts.map", + "backend/dist/services/gre-bgp-snapshot-history.js", + "backend/dist/services/gre-bgp-snapshot-history.js.map", + "backend/dist/services/gre-bgp-snapshot-history.d.ts", + "backend/dist/services/gre-bgp-snapshot-history.d.ts.map", + "backend/dist/services/gre-bgp-timing.js", + "backend/dist/services/gre-bgp-timing.js.map", + "backend/dist/services/gre-bgp-timing.d.ts", + "backend/dist/services/gre-bgp-timing.d.ts.map", + "backend/dist/services/gre-catalog-poll.js", + "backend/dist/services/gre-catalog-poll.js.map", + "backend/dist/services/gre-catalog-poll.d.ts", + "backend/dist/services/gre-catalog-poll.d.ts.map", + "backend/dist/services/gre-comment.js", + "backend/dist/services/gre-comment.js.map", + "backend/dist/services/gre-comment.d.ts", + "backend/dist/services/gre-comment.d.ts.map", + "backend/dist/services/gre-live.js", + "backend/dist/services/gre-live.js.map", + "backend/dist/services/gre-live.d.ts", + "backend/dist/services/gre-live.d.ts.map", + "backend/dist/services/gre-tunnels-live.js", + "backend/dist/services/gre-tunnels-live.js.map", + "backend/dist/services/gre-tunnels-live.d.ts", + "backend/dist/services/gre-tunnels-live.d.ts.map", + "backend/dist/services/internet-path-collector.js", + "backend/dist/services/internet-path-collector.js.map", + "backend/dist/services/internet-path-collector.d.ts", + "backend/dist/services/internet-path-collector.d.ts.map", + "backend/dist/services/internet-path-snapshot.js", + "backend/dist/services/internet-path-snapshot.js.map", + "backend/dist/services/internet-path-snapshot.d.ts", + "backend/dist/services/internet-path-snapshot.d.ts.map", + "backend/dist/services/ipsec-ca.js", + "backend/dist/services/ipsec-ca.js.map", + "backend/dist/services/ipsec-ca.d.ts", + "backend/dist/services/ipsec-ca.d.ts.map", + "backend/dist/services/ipsec-certificate-dn.js", + "backend/dist/services/ipsec-certificate-dn.js.map", + "backend/dist/services/ipsec-certificate-dn.d.ts", + "backend/dist/services/ipsec-certificate-dn.d.ts.map", + "backend/dist/services/ipsec-cleanup.js", + "backend/dist/services/ipsec-cleanup.js.map", + "backend/dist/services/ipsec-cleanup.d.ts", + "backend/dist/services/ipsec-cleanup.d.ts.map", + "backend/dist/services/ipsec-config.js", + "backend/dist/services/ipsec-config.js.map", + "backend/dist/services/ipsec-config.d.ts", + "backend/dist/services/ipsec-config.d.ts.map", + "backend/dist/services/ipsec-live.js", + "backend/dist/services/ipsec-live.js.map", + "backend/dist/services/ipsec-live.d.ts", + "backend/dist/services/ipsec-live.d.ts.map", + "backend/dist/services/ipsec-operation.js", + "backend/dist/services/ipsec-operation.js.map", + "backend/dist/services/ipsec-operation.d.ts", + "backend/dist/services/ipsec-operation.d.ts.map", + "backend/dist/services/ipsec-ros.js", + "backend/dist/services/ipsec-ros.js.map", + "backend/dist/services/ipsec-ros.d.ts", + "backend/dist/services/ipsec-ros.d.ts.map", + "backend/dist/services/mikrotik.js", + "backend/dist/services/mikrotik.js.map", + "backend/dist/services/mikrotik.d.ts", + "backend/dist/services/mikrotik.d.ts.map", + "backend/dist/services/monitoring-server-catalog.js", + "backend/dist/services/monitoring-server-catalog.js.map", + "backend/dist/services/monitoring-server-catalog.d.ts", + "backend/dist/services/monitoring-server-catalog.d.ts.map", + "backend/dist/services/ospf-catalog-poll.js", + "backend/dist/services/ospf-catalog-poll.js.map", + "backend/dist/services/ospf-catalog-poll.d.ts", + "backend/dist/services/ospf-catalog-poll.d.ts.map", + "backend/dist/services/ospf-effective-disabled.js", + "backend/dist/services/ospf-effective-disabled.js.map", + "backend/dist/services/ospf-effective-disabled.d.ts", + "backend/dist/services/ospf-effective-disabled.d.ts.map", + "backend/dist/services/ospf-observed-values.js", + "backend/dist/services/ospf-observed-values.js.map", + "backend/dist/services/ospf-observed-values.d.ts", + "backend/dist/services/ospf-observed-values.d.ts.map", + "backend/dist/services/ospf-optimizer-identity.js", + "backend/dist/services/ospf-optimizer-identity.js.map", + "backend/dist/services/ospf-optimizer-identity.d.ts", + "backend/dist/services/ospf-optimizer-identity.d.ts.map", + "backend/dist/services/ospf-optimizer-metrics.js", + "backend/dist/services/ospf-optimizer-metrics.js.map", + "backend/dist/services/ospf-optimizer-metrics.d.ts", + "backend/dist/services/ospf-optimizer-metrics.d.ts.map", + "backend/dist/services/ospf-optimizer-plan.js", + "backend/dist/services/ospf-optimizer-plan.js.map", + "backend/dist/services/ospf-optimizer-plan.d.ts", + "backend/dist/services/ospf-optimizer-plan.d.ts.map", + "backend/dist/services/ospf-route-parse.js", + "backend/dist/services/ospf-route-parse.js.map", + "backend/dist/services/ospf-route-parse.d.ts", + "backend/dist/services/ospf-route-parse.d.ts.map", + "backend/dist/services/ping-probe-replacement.js", + "backend/dist/services/ping-probe-replacement.js.map", + "backend/dist/services/ping-probe-replacement.d.ts", + "backend/dist/services/ping-probe-replacement.d.ts.map", + "backend/dist/services/poller.js", + "backend/dist/services/poller.js.map", + "backend/dist/services/poller.d.ts", + "backend/dist/services/poller.d.ts.map", + "backend/dist/services/recursive-apply.js", + "backend/dist/services/recursive-apply.js.map", + "backend/dist/services/recursive-apply.d.ts", + "backend/dist/services/recursive-apply.d.ts.map", + "backend/dist/services/recursive-route-catalog.js", + "backend/dist/services/recursive-route-catalog.js.map", + "backend/dist/services/recursive-route-catalog.d.ts", + "backend/dist/services/recursive-route-catalog.d.ts.map", + "backend/dist/services/recursive-route-validation.js", + "backend/dist/services/recursive-route-validation.js.map", + "backend/dist/services/recursive-route-validation.d.ts", + "backend/dist/services/recursive-route-validation.d.ts.map", + "backend/dist/services/ros-metric-parse.js", + "backend/dist/services/ros-metric-parse.js.map", + "backend/dist/services/ros-metric-parse.d.ts", + "backend/dist/services/ros-metric-parse.d.ts.map", + "backend/dist/services/ros-ops.js", + "backend/dist/services/ros-ops.js.map", + "backend/dist/services/ros-ops.d.ts", + "backend/dist/services/ros-ops.d.ts.map", + "backend/dist/services/s3-backup-client.js", + "backend/dist/services/s3-backup-client.js.map", + "backend/dist/services/s3-backup-client.d.ts", + "backend/dist/services/s3-backup-client.d.ts.map", + "backend/dist/services/scheduler-recorded-run.js", + "backend/dist/services/scheduler-recorded-run.js.map", + "backend/dist/services/scheduler-recorded-run.d.ts", + "backend/dist/services/scheduler-recorded-run.d.ts.map", + "backend/dist/services/scheduler-running.js", + "backend/dist/services/scheduler-running.js.map", + "backend/dist/services/scheduler-running.d.ts", + "backend/dist/services/scheduler-running.d.ts.map", + "backend/dist/services/scheduler.js", + "backend/dist/services/scheduler.js.map", + "backend/dist/services/scheduler.d.ts", + "backend/dist/services/scheduler.d.ts.map", + "backend/dist/services/serial-operation.js", + "backend/dist/services/serial-operation.js.map", + "backend/dist/services/serial-operation.d.ts", + "backend/dist/services/serial-operation.d.ts.map", + "backend/dist/services/servers-rest-ping-collector.js", + "backend/dist/services/servers-rest-ping-collector.js.map", + "backend/dist/services/servers-rest-ping-collector.d.ts", + "backend/dist/services/servers-rest-ping-collector.d.ts.map", + "backend/dist/services/speed-history-dto.js", + "backend/dist/services/speed-history-dto.js.map", + "backend/dist/services/speed-history-dto.d.ts", + "backend/dist/services/speed-history-dto.d.ts.map", + "backend/dist/services/speed-probe-dto.js", + "backend/dist/services/speed-probe-dto.js.map", + "backend/dist/services/speed-probe-dto.d.ts", + "backend/dist/services/speed-probe-dto.d.ts.map", + "backend/dist/services/speed-probe-replacement.js", + "backend/dist/services/speed-probe-replacement.js.map", + "backend/dist/services/speed-probe-replacement.d.ts", + "backend/dist/services/speed-probe-replacement.d.ts.map", + "backend/dist/services/speed-run-error-message.js", + "backend/dist/services/speed-run-error-message.js.map", + "backend/dist/services/speed-run-error-message.d.ts", + "backend/dist/services/speed-run-error-message.d.ts.map", + "backend/dist/services/speed-run-persistence.js", + "backend/dist/services/speed-run-persistence.js.map", + "backend/dist/services/speed-run-persistence.d.ts", + "backend/dist/services/speed-run-persistence.d.ts.map", + "backend/dist/services/statistics-aggregate.js", + "backend/dist/services/statistics-aggregate.js.map", + "backend/dist/services/statistics-aggregate.d.ts", + "backend/dist/services/statistics-aggregate.d.ts.map", + "backend/dist/services/system-database-backup.js", + "backend/dist/services/system-database-backup.js.map", + "backend/dist/services/system-database-backup.d.ts", + "backend/dist/services/system-database-backup.d.ts.map", + "backend/dist/services/system-database-cache.js", + "backend/dist/services/system-database-cache.js.map", + "backend/dist/services/system-database-cache.d.ts", + "backend/dist/services/system-database-cache.d.ts.map", + "backend/dist/services/system-database-operation.js", + "backend/dist/services/system-database-operation.js.map", + "backend/dist/services/system-database-operation.d.ts", + "backend/dist/services/system-database-operation.d.ts.map", + "backend/dist/services/system-database-partition-restore.js", + "backend/dist/services/system-database-partition-restore.js.map", + "backend/dist/services/system-database-partition-restore.d.ts", + "backend/dist/services/system-database-partition-restore.d.ts.map", + "backend/dist/services/system-database-restore-execution.js", + "backend/dist/services/system-database-restore-execution.js.map", + "backend/dist/services/system-database-restore-execution.d.ts", + "backend/dist/services/system-database-restore-execution.d.ts.map", + "backend/dist/services/traffic-collection-state.js", + "backend/dist/services/traffic-collection-state.js.map", + "backend/dist/services/traffic-collection-state.d.ts", + "backend/dist/services/traffic-collection-state.d.ts.map", + "backend/dist/services/traffic-collector.js", + "backend/dist/services/traffic-collector.js.map", + "backend/dist/services/traffic-collector.d.ts", + "backend/dist/services/traffic-collector.d.ts.map", + "backend/dist/services/traffic-flow-analytics.js", + "backend/dist/services/traffic-flow-analytics.js.map", + "backend/dist/services/traffic-flow-analytics.d.ts", + "backend/dist/services/traffic-flow-analytics.d.ts.map", + "backend/dist/services/traffic-flow-apps.js", + "backend/dist/services/traffic-flow-apps.js.map", + "backend/dist/services/traffic-flow-apps.d.ts", + "backend/dist/services/traffic-flow-apps.d.ts.map", + "backend/dist/services/traffic-flow-brands.js", + "backend/dist/services/traffic-flow-brands.js.map", + "backend/dist/services/traffic-flow-brands.d.ts", + "backend/dist/services/traffic-flow-brands.d.ts.map", + "backend/dist/services/traffic-flow-classify.js", + "backend/dist/services/traffic-flow-classify.js.map", + "backend/dist/services/traffic-flow-classify.d.ts", + "backend/dist/services/traffic-flow-classify.d.ts.map", + "backend/dist/services/traffic-flow-collector-ipc.js", + "backend/dist/services/traffic-flow-collector-ipc.js.map", + "backend/dist/services/traffic-flow-collector-ipc.d.ts", + "backend/dist/services/traffic-flow-collector-ipc.d.ts.map", + "backend/dist/services/traffic-flow-collector-worker.js", + "backend/dist/services/traffic-flow-collector-worker.js.map", + "backend/dist/services/traffic-flow-collector-worker.d.ts", + "backend/dist/services/traffic-flow-collector-worker.d.ts.map", + "backend/dist/services/traffic-flow-dedup.js", + "backend/dist/services/traffic-flow-dedup.js.map", + "backend/dist/services/traffic-flow-dedup.d.ts", + "backend/dist/services/traffic-flow-dedup.d.ts.map", + "backend/dist/services/traffic-flow-dest.js", + "backend/dist/services/traffic-flow-dest.js.map", + "backend/dist/services/traffic-flow-dest.d.ts", + "backend/dist/services/traffic-flow-dest.d.ts.map", + "backend/dist/services/traffic-flow-engine.js", + "backend/dist/services/traffic-flow-engine.js.map", + "backend/dist/services/traffic-flow-engine.d.ts", + "backend/dist/services/traffic-flow-engine.d.ts.map", + "backend/dist/services/traffic-flow-facts-filter.js", + "backend/dist/services/traffic-flow-facts-filter.js.map", + "backend/dist/services/traffic-flow-facts-filter.d.ts", + "backend/dist/services/traffic-flow-facts-filter.d.ts.map", + "backend/dist/services/traffic-flow-facts-rebuild.js", + "backend/dist/services/traffic-flow-facts-rebuild.js.map", + "backend/dist/services/traffic-flow-facts-rebuild.d.ts", + "backend/dist/services/traffic-flow-facts-rebuild.d.ts.map", + "backend/dist/services/traffic-flow-facts.js", + "backend/dist/services/traffic-flow-facts.js.map", + "backend/dist/services/traffic-flow-facts.d.ts", + "backend/dist/services/traffic-flow-facts.d.ts.map", + "backend/dist/services/traffic-flow-geoip.js", + "backend/dist/services/traffic-flow-geoip.js.map", + "backend/dist/services/traffic-flow-geoip.d.ts", + "backend/dist/services/traffic-flow-geoip.d.ts.map", + "backend/dist/services/traffic-flow-host-file-builders.js", + "backend/dist/services/traffic-flow-host-file-builders.js.map", + "backend/dist/services/traffic-flow-host-file-builders.d.ts", + "backend/dist/services/traffic-flow-host-file-builders.d.ts.map", + "backend/dist/services/traffic-flow-host-files.js", + "backend/dist/services/traffic-flow-host-files.js.map", + "backend/dist/services/traffic-flow-host-files.d.ts", + "backend/dist/services/traffic-flow-host-files.d.ts.map", + "backend/dist/services/traffic-flow-ifaces.js", + "backend/dist/services/traffic-flow-ifaces.js.map", + "backend/dist/services/traffic-flow-ifaces.d.ts", + "backend/dist/services/traffic-flow-ifaces.d.ts.map", + "backend/dist/services/traffic-flow-ifindex.js", + "backend/dist/services/traffic-flow-ifindex.js.map", + "backend/dist/services/traffic-flow-ifindex.d.ts", + "backend/dist/services/traffic-flow-ifindex.d.ts.map", + "backend/dist/services/traffic-flow-ingest.js", + "backend/dist/services/traffic-flow-ingest.js.map", + "backend/dist/services/traffic-flow-ingest.d.ts", + "backend/dist/services/traffic-flow-ingest.d.ts.map", + "backend/dist/services/traffic-flow-ip.js", + "backend/dist/services/traffic-flow-ip.js.map", + "backend/dist/services/traffic-flow-ip.d.ts", + "backend/dist/services/traffic-flow-ip.d.ts.map", + "backend/dist/services/traffic-flow-key-execution.js", + "backend/dist/services/traffic-flow-key-execution.js.map", + "backend/dist/services/traffic-flow-key-execution.d.ts", + "backend/dist/services/traffic-flow-key-execution.d.ts.map", + "backend/dist/services/traffic-flow-map-exporter.js", + "backend/dist/services/traffic-flow-map-exporter.js.map", + "backend/dist/services/traffic-flow-map-exporter.d.ts", + "backend/dist/services/traffic-flow-map-exporter.d.ts.map", + "backend/dist/services/traffic-flow-map-hops.js", + "backend/dist/services/traffic-flow-map-hops.js.map", + "backend/dist/services/traffic-flow-map-hops.d.ts", + "backend/dist/services/traffic-flow-map-hops.d.ts.map", + "backend/dist/services/traffic-flow-overlay.js", + "backend/dist/services/traffic-flow-overlay.js.map", + "backend/dist/services/traffic-flow-overlay.d.ts", + "backend/dist/services/traffic-flow-overlay.d.ts.map", + "backend/dist/services/traffic-flow-parse.js", + "backend/dist/services/traffic-flow-parse.js.map", + "backend/dist/services/traffic-flow-parse.d.ts", + "backend/dist/services/traffic-flow-parse.d.ts.map", + "backend/dist/services/traffic-flow-planes.js", + "backend/dist/services/traffic-flow-planes.js.map", + "backend/dist/services/traffic-flow-planes.d.ts", + "backend/dist/services/traffic-flow-planes.d.ts.map", + "backend/dist/services/traffic-flow-purge-execution.js", + "backend/dist/services/traffic-flow-purge-execution.js.map", + "backend/dist/services/traffic-flow-purge-execution.d.ts", + "backend/dist/services/traffic-flow-purge-execution.d.ts.map", + "backend/dist/services/traffic-flow-ripe.js", + "backend/dist/services/traffic-flow-ripe.js.map", + "backend/dist/services/traffic-flow-ripe.d.ts", + "backend/dist/services/traffic-flow-ripe.d.ts.map", + "backend/dist/services/traffic-flow-settings.js", + "backend/dist/services/traffic-flow-settings.js.map", + "backend/dist/services/traffic-flow-settings.d.ts", + "backend/dist/services/traffic-flow-settings.d.ts.map", + "backend/dist/services/traffic-flow-topology.js", + "backend/dist/services/traffic-flow-topology.js.map", + "backend/dist/services/traffic-flow-topology.d.ts", + "backend/dist/services/traffic-flow-topology.d.ts.map", + "backend/dist/services/traffic-flow-worker-shutdown.js", + "backend/dist/services/traffic-flow-worker-shutdown.js.map", + "backend/dist/services/traffic-flow-worker-shutdown.d.ts", + "backend/dist/services/traffic-flow-worker-shutdown.d.ts.map", + "backend/dist/services/traffic-freshness.js", + "backend/dist/services/traffic-freshness.js.map", + "backend/dist/services/traffic-freshness.d.ts", + "backend/dist/services/traffic-freshness.d.ts.map", + "backend/dist/services/traffic-live.js", + "backend/dist/services/traffic-live.js.map", + "backend/dist/services/traffic-live.d.ts", + "backend/dist/services/traffic-live.d.ts.map", + "backend/dist/services/traffic-observation.js", + "backend/dist/services/traffic-observation.js.map", + "backend/dist/services/traffic-observation.d.ts", + "backend/dist/services/traffic-observation.d.ts.map", + "backend/dist/services/traffic-peer-observation.js", + "backend/dist/services/traffic-peer-observation.js.map", + "backend/dist/services/traffic-peer-observation.d.ts", + "backend/dist/services/traffic-peer-observation.d.ts.map", + "backend/dist/services/traffic-rate.js", + "backend/dist/services/traffic-rate.js.map", + "backend/dist/services/traffic-rate.d.ts", + "backend/dist/services/traffic-rate.d.ts.map", + "backend/dist/services/traffic-users.js", + "backend/dist/services/traffic-users.js.map", + "backend/dist/services/traffic-users.d.ts", + "backend/dist/services/traffic-users.d.ts.map", + "backend/dist/services/uptime-collector.js", + "backend/dist/services/uptime-collector.js.map", + "backend/dist/services/uptime-collector.d.ts", + "backend/dist/services/uptime-collector.d.ts.map", + "backend/dist/services/uptime-probe-observations.js", + "backend/dist/services/uptime-probe-observations.js.map", + "backend/dist/services/uptime-probe-observations.d.ts", + "backend/dist/services/uptime-probe-observations.d.ts.map", + "backend/dist/services/uptime-speed-service.js", + "backend/dist/services/uptime-speed-service.js.map", + "backend/dist/services/uptime-speed-service.d.ts", + "backend/dist/services/uptime-speed-service.d.ts.map", + "backend/dist/services/vxlan-live.js", + "backend/dist/services/vxlan-live.js.map", + "backend/dist/services/vxlan-live.d.ts", + "backend/dist/services/vxlan-live.d.ts.map", + "backend/dist/services/wg-keys.js", + "backend/dist/services/wg-keys.js.map", + "backend/dist/services/wg-keys.d.ts", + "backend/dist/services/wg-keys.d.ts.map", + "backend/dist/services/wireguard-config.js", + "backend/dist/services/wireguard-config.js.map", + "backend/dist/services/wireguard-config.d.ts", + "backend/dist/services/wireguard-config.d.ts.map", + "backend/dist/services/wireguard-delete.js", + "backend/dist/services/wireguard-delete.js.map", + "backend/dist/services/wireguard-delete.d.ts", + "backend/dist/services/wireguard-delete.d.ts.map", + "backend/dist/services/wireguard-import-apply.js", + "backend/dist/services/wireguard-import-apply.js.map", + "backend/dist/services/wireguard-import-apply.d.ts", + "backend/dist/services/wireguard-import-apply.d.ts.map", + "backend/dist/services/wireguard-import-revision.js", + "backend/dist/services/wireguard-import-revision.js.map", + "backend/dist/services/wireguard-import-revision.d.ts", + "backend/dist/services/wireguard-import-revision.d.ts.map", + "backend/dist/services/wireguard-import.js", + "backend/dist/services/wireguard-import.js.map", + "backend/dist/services/wireguard-import.d.ts", + "backend/dist/services/wireguard-import.d.ts.map", + "backend/dist/services/wireguard-live.js", + "backend/dist/services/wireguard-live.js.map", + "backend/dist/services/wireguard-live.d.ts", + "backend/dist/services/wireguard-live.d.ts.map", + "backend/dist/services/wireguard-observed-values.js", + "backend/dist/services/wireguard-observed-values.js.map", + "backend/dist/services/wireguard-observed-values.d.ts", + "backend/dist/services/wireguard-observed-values.d.ts.map", + "backend/dist/services/wireguard-ros.js", + "backend/dist/services/wireguard-ros.js.map", + "backend/dist/services/wireguard-ros.d.ts", + "backend/dist/services/wireguard-ros.d.ts.map", + "backend/dist/test/pg.js", + "backend/dist/test/pg.js.map", + "backend/dist/test/pg.d.ts", + "backend/dist/test/pg.d.ts.map", + "backend/dist/types/scheduler-run-snapshot.js", + "backend/dist/types/scheduler-run-snapshot.js.map", + "backend/dist/types/scheduler-run-snapshot.d.ts", + "backend/dist/types/scheduler-run-snapshot.d.ts.map", + "backend/dist/types/server.js", + "backend/dist/types/server.js.map", + "backend/dist/types/server.d.ts", + "backend/dist/types/server.d.ts.map", + "backend/dist/utils/abort-signals.js", + "backend/dist/utils/abort-signals.js.map", + "backend/dist/utils/abort-signals.d.ts", + "backend/dist/utils/abort-signals.d.ts.map", + "backend/dist/utils/ros-src-address.js", + "backend/dist/utils/ros-src-address.js.map", + "backend/dist/utils/ros-src-address.d.ts", + "backend/dist/utils/ros-src-address.d.ts.map", + "backend/dist/utils/server-id.js", + "backend/dist/utils/server-id.js.map", + "backend/dist/utils/server-id.d.ts", + "backend/dist/utils/server-id.d.ts.map", + "packages/contracts/dist/alerts.js", + "packages/contracts/dist/alerts.js.map", + "packages/contracts/dist/alerts.d.ts", + "packages/contracts/dist/alerts.d.ts.map", + "packages/contracts/dist/backups.js", + "packages/contracts/dist/backups.js.map", + "packages/contracts/dist/backups.d.ts", + "packages/contracts/dist/backups.d.ts.map", + "packages/contracts/dist/certificates.js", + "packages/contracts/dist/certificates.js.map", + "packages/contracts/dist/certificates.d.ts", + "packages/contracts/dist/certificates.d.ts.map", + "packages/contracts/dist/containers.js", + "packages/contracts/dist/containers.js.map", + "packages/contracts/dist/containers.d.ts", + "packages/contracts/dist/containers.d.ts.map", + "packages/contracts/dist/events.js", + "packages/contracts/dist/events.js.map", + "packages/contracts/dist/events.d.ts", + "packages/contracts/dist/events.d.ts.map", + "packages/contracts/dist/evobgp.js", + "packages/contracts/dist/evobgp.js.map", + "packages/contracts/dist/evobgp.d.ts", + "packages/contracts/dist/evobgp.d.ts.map", + "packages/contracts/dist/geoip.js", + "packages/contracts/dist/geoip.js.map", + "packages/contracts/dist/geoip.d.ts", + "packages/contracts/dist/geoip.d.ts.map", + "packages/contracts/dist/index.js", + "packages/contracts/dist/index.js.map", + "packages/contracts/dist/index.d.ts", + "packages/contracts/dist/index.d.ts.map", + "packages/contracts/dist/ipsec.js", + "packages/contracts/dist/ipsec.js.map", + "packages/contracts/dist/ipsec.d.ts", + "packages/contracts/dist/ipsec.d.ts.map", + "packages/contracts/dist/ospf-optimizer.js", + "packages/contracts/dist/ospf-optimizer.js.map", + "packages/contracts/dist/ospf-optimizer.d.ts", + "packages/contracts/dist/ospf-optimizer.d.ts.map", + "packages/contracts/dist/servers.js", + "packages/contracts/dist/servers.js.map", + "packages/contracts/dist/servers.d.ts", + "packages/contracts/dist/servers.d.ts.map", + "packages/contracts/dist/statistics.js", + "packages/contracts/dist/statistics.js.map", + "packages/contracts/dist/statistics.d.ts", + "packages/contracts/dist/statistics.d.ts.map", + "packages/contracts/dist/traffic-flow.js", + "packages/contracts/dist/traffic-flow.js.map", + "packages/contracts/dist/traffic-flow.d.ts", + "packages/contracts/dist/traffic-flow.d.ts.map", + "packages/contracts/dist/uptime-probes.js", + "packages/contracts/dist/uptime-probes.js.map", + "packages/contracts/dist/uptime-probes.d.ts", + "packages/contracts/dist/uptime-probes.d.ts.map", + "packages/contracts/dist/uptime-speed.js", + "packages/contracts/dist/uptime-speed.js.map", + "packages/contracts/dist/uptime-speed.d.ts", + "packages/contracts/dist/uptime-speed.d.ts.map", + "packages/contracts/dist/users.js", + "packages/contracts/dist/users.js.map", + "packages/contracts/dist/users.d.ts", + "packages/contracts/dist/users.d.ts.map", + "packages/contracts/dist/wireguard.js", + "packages/contracts/dist/wireguard.js.map", + "packages/contracts/dist/wireguard.d.ts", + "packages/contracts/dist/wireguard.d.ts.map" + ], + "missing": [], + "different": [] +} \ No newline at end of file diff --git a/docs/ux-ui/acceptance/traffic-wave-deployed-2026-10-13.json b/docs/ux-ui/acceptance/traffic-wave-deployed-2026-10-13.json new file mode 100644 index 00000000..be31a04d --- /dev/null +++ b/docs/ux-ui/acceptance/traffic-wave-deployed-2026-10-13.json @@ -0,0 +1,46 @@ +{ + "date": "2026-10-13", + "block": "12.5.188", + "runtime": { + "backend": "ux-membership188", + "frontend": "ux-warning183" + }, + "apis": [ + { + "path": "/api/traffic/servers", + "status": 200 + }, + { + "path": "/api/traffic/users", + "status": 200 + }, + { + "path": "/api/traffic/bound-interfaces", + "status": 200 + } + ], + "cases": [ + { + "width": 1440, + "trafficServers200": true, + "attemptProvenanceVisible": true, + "actualLiveSample": true, + "backendReceiptLabel": true, + "pageErrors": 0, + "noOverflow": true + }, + { + "width": 320, + "trafficServers200": true, + "attemptProvenanceVisible": true, + "actualLiveSample": true, + "backendReceiptLabel": true, + "pageErrors": 0, + "noOverflow": true + } + ], + "bounds": [ + "Read-only smoke; error/stale/legacy branches proven by owned SQL and UI fixtures", + "No manual production scheduler/config/password/message writes" + ] +} diff --git a/docs/ux-ui/acceptance/traffic-wave-runtime-2026-10-13.json b/docs/ux-ui/acceptance/traffic-wave-runtime-2026-10-13.json new file mode 100644 index 00000000..99e47a4a --- /dev/null +++ b/docs/ux-ui/acceptance/traffic-wave-runtime-2026-10-13.json @@ -0,0 +1,25 @@ +{ + "date": "2026-10-13", + "block": "12.5.188", + "secretEnvCopied": false, + "rollbackTags": { + "MMAPP_IMAGE_TAG": "ux-warning183", + "BACKEND_IMAGE_TAG": "ux-identity186" + }, + "services": { + "backend": { + "image": "mmapp-test/backend:ux-membership188", + "imageId": "sha256:5dd49e98bafcbcf98b0dc61ff0d7b810ee58ea9ae44f3d147cfdab91180653e1", + "state": "running", + "health": "healthy", + "matchedVerifiedImage": true + }, + "frontend": { + "image": "mmapp-test/frontend:ux-warning183", + "imageId": "sha256:4cf0549a212bfdc75c0107f3725686a9a9746a46ed6493ac73f608a0a335a586", + "state": "running", + "health": null, + "matchedVerifiedImage": true + } + } +} \ No newline at end of file diff --git a/docs/ux-ui/acceptance/traffic-wave-source-2026-10-13.json b/docs/ux-ui/acceptance/traffic-wave-source-2026-10-13.json new file mode 100644 index 00000000..f0a4bbda --- /dev/null +++ b/docs/ux-ui/acceptance/traffic-wave-source-2026-10-13.json @@ -0,0 +1,10 @@ +{ + "date": "2026-10-13", + "block": "12.5.188", + "matched": { + "backend": 460, + "frontend": 524 + }, + "different": [], + "missing": [] +} \ No newline at end of file diff --git a/docs/ux-ui/acceptance/traffic-wave-sql-2026-10-13.json b/docs/ux-ui/acceptance/traffic-wave-sql-2026-10-13.json new file mode 100644 index 00000000..5dcbd20b --- /dev/null +++ b/docs/ux-ui/acceptance/traffic-wave-sql-2026-10-13.json @@ -0,0 +1,31 @@ +{ + "date": "2026-10-13", + "block": "12.5.188", + "passed": true, + "profiles": [ + { + "date": "2026-10-13", + "block": "12.5.188", + "database": "mm_accept_166_1791830718064", + "scope": "ephemeral role and precreated owned database; no copied production credentials", + "tests": [ + { + "command": "npm --prefix backend run test:traffic-rate", + "passed": true, + "durationMs": 38880, + "ownedTrafficSqlCases": 9, + "ownedHistorySqlCases": 14, + "ownedLiveSqlCases": 10, + "ownedVolumeSqlCases": 13, + "ownedStatusSqlCases": 19, + "postgresUnavailableSkip": false + } + ], + "scopedRoleVerified": true, + "passed": true, + "databaseRemoved": true, + "roleRemoved": true, + "testContainerRemoved": true + } + ] +} \ No newline at end of file