diff --git a/backend/scripts/acceptance/full-backend-regression.mjs b/backend/scripts/acceptance/full-backend-regression.mjs new file mode 100644 index 00000000..bd288c31 --- /dev/null +++ b/backend/scripts/acceptance/full-backend-regression.mjs @@ -0,0 +1,25 @@ +import fs from 'node:fs' +import assert from 'node:assert/strict' +import {execFileSync} from 'node:child_process' +import pg from 'pg' +const database=process.env.MMAPP_OWN_SQL_DB,root='/app/backend/acceptance' +assert(/^mm_accept_166_\d+$/.test(database)) +const url=new URL(process.env.DATABASE_URL);assert.equal(url.pathname,'/'+database);assert.equal(url.username,database) +const client=new pg.Client({connectionString:url.toString()});await client.connect() +assert.equal((await client.query('SELECT current_database() AS name')).rows[0].name,database) +const role=(await client.query('SELECT rolsuper,rolcreatedb,rolcreaterole,rolbypassrls FROM pg_roles WHERE rolname=current_user')).rows[0] +assert(Object.values(role).every(value=>value===false));await client.end() +const pkg=JSON.parse(fs.readFileSync('/app/backend/package.json')) +const profiles=pkg.scripts['test:all'].split(/\s*&&\s*/).map(c=>{const m=/^npm run (test:[\w-]+)$/.exec(c);assert(m);return m[1]}) +const report={date:'2026-10-14',block:'12.5.222',scope:'full backend profile list on owned isolated PostgreSQL; no production DSN',database,profiles:[],passed:false} +for(const profile of profiles){ + const started=Date.now();let output='',passed=true,errorName + try{output=execFileSync('npm',['--prefix','backend','run',profile],{cwd:'/app',timeout:240_000,maxBuffer:16*1024**2,encoding:'utf8',env:{...process.env,NODE_ENV:'test',GEOIP_DIR:'/tmp/'+database+'/geoip',DATABASE_PATH:'/tmp/'+database+'/legacy.db'},stdio:['ignore','pipe','pipe']})} + catch(e){passed=false;errorName=e.name;output=String(e.stdout??'')+'\n'+String(e.stderr??'')} + fs.writeFileSync(root+'/'+profile.replace(':','-')+'-private.log',output,{mode:0o600}) + const skippedLines=output.split('\n').filter(s=>/\bskip(?:ped)?\b/i.test(s));const unavailableSql=skippedLines.filter(s=>/PostgreSQL|owned|own SQL|explicit owned|database|MMAPP_OWN/i.test(s)&&!s.includes('skip/release/recovery passed')); + report.profiles.push({profile,passed,durationMs:Date.now()-started,errorName,skippedLineCount:skippedLines.length,unavailableSqlBranches:unavailableSql.map(line=>line.trim())}) + fs.writeFileSync(root+'/owned222-result.json',JSON.stringify(report,null,2));console.log(JSON.stringify(report.profiles.at(-1))) +} +report.passed=report.profiles.every(p=>p.passed);fs.writeFileSync(root+'/owned222-result.json',JSON.stringify(report,null,2)) +if(!report.passed)process.exitCode=1 diff --git a/backend/src/services/traffic-flow-ingest.ts b/backend/src/services/traffic-flow-ingest.ts index cb266e68..093a2bd3 100644 --- a/backend/src/services/traffic-flow-ingest.ts +++ b/backend/src/services/traffic-flow-ingest.ts @@ -58,10 +58,10 @@ let state: FlowListenerState = { bound: false, address: null } let wantListen = false let databaseStop: Promise | null = null -function workerFileUrl(): URL { - const ts = import.meta.url.includes(".ts") +export function trafficFlowWorkerFileUrl(): URL { + const ts = new URL(import.meta.url).pathname.endsWith(".ts") return new URL( - ts ? "./traffic-flow-collector-worker.ts" : "./traffic-flow-collector-worker.js", + ts ? "./traffic-flow-worker-bootstrap.mjs" : "./traffic-flow-collector-worker.js", import.meta.url, ) } @@ -125,7 +125,7 @@ async function spawnWorker(): Promise { await applyExporterCtxFromDb() const exporterMap = await buildExporterMapPayload() if (databaseStop) return - const w = new Worker(workerFileUrl(), { execArgv: process.execArgv }) + const w = new Worker(trafficFlowWorkerFileUrl(), { execArgv: process.execArgv }) w.on("message", (msg: WorkerToMain) => handleWorkerMessage(msg)) w.on("error", (err) => { state = { bound: false, address: null } diff --git a/backend/src/services/traffic-flow-ipv6-pipeline.test.ts b/backend/src/services/traffic-flow-ipv6-pipeline.test.ts index e459c3bb..139a49d9 100644 --- a/backend/src/services/traffic-flow-ipv6-pipeline.test.ts +++ b/backend/src/services/traffic-flow-ipv6-pipeline.test.ts @@ -100,7 +100,10 @@ if (!ownDb) { await new Promise(resolve => reservation.bind(0, "127.0.0.1", resolve)) const port = reservation.address().port await new Promise(resolve => reservation.close(resolve)) - const workerFile = new URL(import.meta.url.endsWith(".ts") ? "./traffic-flow-collector-worker.ts" : "./traffic-flow-collector-worker.js", import.meta.url) + const { trafficFlowWorkerFileUrl } = await import("./traffic-flow-ingest.js") + const workerFile = process.env.MMAPP_TEST_COMPILED_WORKER === "true" + ? new URL("../../dist/services/traffic-flow-collector-worker.js", import.meta.url) + : trafficFlowWorkerFileUrl() worker = new Worker(workerFile) worker.on("error", error => { workerError = error }) worker.on("message", (message: WorkerToMain) => { diff --git a/backend/src/services/traffic-flow-worker-bootstrap.mjs b/backend/src/services/traffic-flow-worker-bootstrap.mjs new file mode 100644 index 00000000..6ad22d2c --- /dev/null +++ b/backend/src/services/traffic-flow-worker-bootstrap.mjs @@ -0,0 +1,4 @@ +// Register the TypeScript resolver inside this worker; parent hooks are not enough. +import { tsImport } from "tsx/esm/api" + +await tsImport(new URL("./traffic-flow-collector-worker.ts", import.meta.url).href, import.meta.url) diff --git a/docs/ux-ui-external-acceptance.md b/docs/ux-ui-external-acceptance.md index 69517b8c..0cfc490d 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-14: блок221 завершён. GRE API/config/snapshot source отклоняют missing/duplicate native ID/name и повреждённые records, fallback identity удалены. Local13/flags49, configSync7 и production22 прошли; false observed revisions не добавляются. Whole actual source2own GRE/UI passed, own tunnels/DB/roles удалены. Первичный native500104.165.244.7 сохранён; причина неизвестна. Backend ux-gre221/compiled1056/source490 matched, frontend ux-routing218. Следующий222 — общая backend регрессия в собственных PostgreSQL DB и профильный GRE UI. Этап12.5 открыт. +Актуальное продолжение 2026-10-14: блок222 завершён. Общая backend регрессия25 после worker fix и GRE/Filters E2E52 прошли. Отдельно SQL disabled33/months5; source+compiled IPv6 UDP worker6rows/aggregates/shutdown passed. Dev worker получил собственный tsx bootstrap; production worker path сохранён. Own DB/roles удалены. Backend ux-regression222/compiled1056/source492 matched, frontend ux-routing218. Live API6/UI4 passed. Следующий223 — согласование текущего плана, статусов и укрупнённой матрицы остатка. Этап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). @@ -2611,3 +2611,7 @@ BGP/OSPF contrast: baseline22/fixed104 cells0 violations; E2E22 и real UI8 pass ## 12.5.221 — GRE native identity (2026-10-14) Общий identity boundary предотвращает fallback IDs/names и false config revisions. Local13/flags49, production22 и real source/API/UI passed; own objects удалены. Первичный500 сохранён, причина неизвестна. Подробности и границы — [журнал](ux-ui-progress.md). Backend ux-gre221, frontend ux-routing218; следующий222 — общая backend/профильная UI регрессия. + +## 12.5.222 — backend/worker регрессия (2026-10-14) + +Backend25/UI52, disabled33/months5 и оба IPv6 UDP/SQL worker режима прошли; own DB/roles удалены. Dev bootstrap исправлен, production entry сохранён. Подробности и границы — [журнал](ux-ui-progress.md). Backend ux-regression222, frontend ux-routing218; следующий223 — актуализация матрицы/статусов. diff --git a/docs/ux-ui-plan.md b/docs/ux-ui-plan.md index 32a733fe..f94e645d 100644 --- a/docs/ux-ui-plan.md +++ b/docs/ux-ui-plan.md @@ -1,6 +1,6 @@ # План реализации UX/UI по пятичасовым окнам -Актуальное продолжение 2026-10-14: блок221 завершён. GRE API/config/snapshot source отклоняют missing/duplicate native ID/name и повреждённые records, fallback identity удалены. Local13/flags49, configSync7 и production22 прошли; false observed revisions не добавляются. Whole actual source2own GRE/UI passed, own tunnels/DB/roles удалены. Первичный native500104.165.244.7 сохранён; причина неизвестна. Backend ux-gre221/compiled1056/source490 matched, frontend ux-routing218. Следующий222 — общая backend регрессия в собственных PostgreSQL DB и профильный GRE UI. Этап12.5 открыт. +Актуальное продолжение 2026-10-14: блок222 завершён. Общая backend регрессия25 после worker fix и GRE/Filters E2E52 прошли. Отдельно SQL disabled33/months5; source+compiled IPv6 UDP worker6rows/aggregates/shutdown passed. Dev worker получил собственный tsx bootstrap; production worker path сохранён. Own DB/roles удалены. Backend ux-regression222/compiled1056/source492 matched, frontend ux-routing218. Live API6/UI4 passed. Следующий223 — согласование текущего плана, статусов и укрупнённой матрицы остатка. Этап12.5 открыт. Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-13. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат. diff --git a/docs/ux-ui-progress.md b/docs/ux-ui-progress.md index 4a0d9b9a..9b8a2f08 100644 --- a/docs/ux-ui-progress.md +++ b/docs/ux-ui-progress.md @@ -1,6 +1,6 @@ # UX/UI: журнал реализации -Актуальное продолжение 2026-10-14: блок221 завершён. GRE API/config/snapshot source отклоняют missing/duplicate native ID/name и повреждённые records, fallback identity удалены. Local13/flags49, configSync7 и production22 прошли; false observed revisions не добавляются. Whole actual source2own GRE/UI passed, own tunnels/DB/roles удалены. Первичный native500104.165.244.7 сохранён; причина неизвестна. Backend ux-gre221/compiled1056/source490 matched, frontend ux-routing218. Следующий222 — общая backend регрессия в собственных PostgreSQL DB и профильный GRE UI. Этап12.5 открыт. +Актуальное продолжение 2026-10-14: блок222 завершён. Общая backend регрессия25 после worker fix и GRE/Filters E2E52 прошли. Отдельно SQL disabled33/months5; source+compiled IPv6 UDP worker6rows/aggregates/shutdown passed. Dev worker получил собственный tsx bootstrap; production worker path сохранён. Own DB/roles удалены. Backend ux-regression222/compiled1056/source492 matched, frontend ux-routing218. Live API6/UI4 passed. Следующий223 — согласование текущего плана, статусов и укрупнённой матрицы остатка. Этап12.5 открыт. Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения. Записи расположены от новых к старым; подробная история этапа12 также сохранена в [ux-ui-stage-12.md](ux-ui-stage-12.md). @@ -38,6 +38,18 @@ | 11Б | Оповещения, сбор данных, интеграции, релизы и настройки | Завершён в границах локальной приёмки 2026-10-03; ограничения и evidence в11Б.7 | | 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка завершена в границах12.3.83; внешняя12.5 в работе, выполненные блоки1–196 и ограничения ниже. Runtime backend/frontend ux-peak196. | +## 12.5.222 — общая регрессия и исправление dev NetFlow worker (2026-10-14) + +После общих GRE catalog/config/alert readers выполнены25 backend profiles в собственной PostgreSQL с NOSUPERUSER/NOCREATEDB/NOCREATEROLE/NOBYPASSRLS. Test image не содержал /app/.env или /app/backend/.env; main DSN не копировался. По специальным namespace guards дополнительно выполнены33 disabled API/SQL checks (Home/Jump/Exit, bigint positive control, native contacts0) в mm_accept_152 и5 календарных SQL checks в mm_accept_149. Контроль skip/release/recovery concurrency — успешный contention test, не пропущенная SQL ветка. + +GRE/Filters20specs:52 unique E2E passed, skipped0/flaky0, пользовательские screenshots не перезаписывались. Дополнительная IPv6 UDP/source-worker SQL в mm_accept_144 первоначально упала ERR_MODULE_NOT_FOUND на src/db/index.js. Source worker не получал достаточный TS resolver из parent. Добавлен traffic-flow-worker-bootstrap.mjs, регистрирующий tsx внутри worker; dev factory использует его, production .js entry сохранён. Вариант source/compiled выбирается явно в отдельной приёмке. Backend build и4 shutdown checks прошли. + +Повтор source-bootstrap и compiled: по2 реальным UDP datagrams,6 SQL flow rows,25200bytes/42packets minute и7200bytes/12packets Internet hour/day, shutdown acknowledgement. Это synthetic IPv6 payload по local IPv4 UDP, публичный IPv6 WAN не проверялся. Первая повторная all-profile attempt не стартовала из-за неправильного mount gre222-checks в runner: namespace cleanup сработал; исправлено на regression222-checks, свежая БД и25 профилей после worker fix passed. Все собственные DB/roles удалены. + +Backend ux-regression222 compiled1056/source492 matched, healthy; frontend ux-routing218 сохранён. Real Portal JWT:6 API (servers/GRE/BGP/OSPF/flow settings/scheduler)200, network failures0; Traffic/Data collection UI1440/320 —4 smoke cases без page errors/mutations. Изменения не применяли native network configuration и не меняли пароли. Последняя полная UI-regression192 не объявляется повторённой: текущая UI52 профильная. Этап12.5 открыт в пределах матрицы. + +Протоколы: [backend25](ux-ui/acceptance/regression222-backend-2026-10-14.json), [UI52](ux-ui/acceptance/regression222-ui-2026-10-14.json), [disabled33](ux-ui/acceptance/optional222-152-result.json), [months5](ux-ui/acceptance/optional222-149-result.json), [initial worker failure](ux-ui/acceptance/optional222-144-initial-failure.json), [source](ux-ui/acceptance/optional222-144-source-bootstrap-result.json), [compiled](ux-ui/acceptance/optional222-144-compiled-result.json), [build](ux-ui/acceptance/regression222-build-proof-2026-10-14.json), [deployment](ux-ui/acceptance/regression222-deployment-2026-10-14.json), [live](ux-ui/acceptance/regression222-live-2026-10-14.json). Следующий223 — устранить устаревшие краткие статусы в документах и дать компактный актуальный остаток по группам, сохранив историю. + ## 12.5.221 — native identity GRE без выдуманных fallback (2026-10-14) Общий readGreNativeRows валидирует коллекцию, строковые поля, native .id/name, blank/whitespace IDs, duplicate ID и duplicate normalized names. API/config mapper и alert source используют один boundary. mapGreLive больше не создаёт gre-index IDs/names для повреждённых rows. Корректные .id и имена со спецсимволами сохранены. Неполный API catalog передаёт per-device failure, snapshot source сообщает GRE error, BGP observations сохраняются. diff --git a/docs/ux-ui-remaining-acceptance.md b/docs/ux-ui-remaining-acceptance.md index 2817c250..bea5d6d6 100644 --- a/docs/ux-ui-remaining-acceptance.md +++ b/docs/ux-ui-remaining-acceptance.md @@ -1,10 +1,10 @@ # Оставшаяся внешняя приёмка — 2026-10-13 -Актуальное продолжение 2026-10-14: блок221 завершён. GRE API/config/snapshot source отклоняют missing/duplicate native ID/name и повреждённые records, fallback identity удалены. Local13/flags49, configSync7 и production22 прошли; false observed revisions не добавляются. Whole actual source2own GRE/UI passed, own tunnels/DB/roles удалены. Первичный native500104.165.244.7 сохранён; причина неизвестна. Backend ux-gre221/compiled1056/source490 matched, frontend ux-routing218. Следующий222 — общая backend регрессия в собственных PostgreSQL DB и профильный GRE UI. Этап12.5 открыт. +Актуальное продолжение 2026-10-14: блок222 завершён. Общая backend регрессия25 после worker fix и GRE/Filters E2E52 прошли. Отдельно SQL disabled33/months5; source+compiled IPv6 UDP worker6rows/aggregates/shutdown passed. Dev worker получил собственный tsx bootstrap; production worker path сохранён. Own DB/roles удалены. Backend ux-regression222/compiled1056/source492 matched, frontend ux-routing218. Live API6/UI4 passed. Следующий223 — согласование текущего плана, статусов и укрупнённой матрицы остатка. Этап12.5 открыт. -Это актуальная матрица после 12.5.221. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии. +Это актуальная матрица после 12.5.222. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии. -Стенд: Debian13/Compose, PostgreSQL18.6, два CHR RouterOS7.24.5. Backend `ux-gre221`, frontend `ux-routing218`; production lab с195 использует AUTH_REQUIRED=true и Portal1.3.1. Подписанные JWT/RBAC проверялись в изолированных процессах. Все собственные объекты112 удалены, исходные13 коллекций×2 (включая logging/certificates/files/routes) проверены; пароли не менялись. +Стенд: Debian13/Compose, PostgreSQL18.6, два CHR RouterOS7.24.5. Backend `ux-regression222`, frontend `ux-routing218`; production lab с195 использует AUTH_REQUIRED=true и Portal1.3.1. Подписанные JWT/RBAC проверялись в изолированных процессах. Все собственные объекты112 удалены, исходные13 коллекций×2 (включая logging/certificates/files/routes) проверены; пароли не менялись. | Раздел | Подтверждено | Осталось / условие завершения | | --- | --- | --- | @@ -1529,3 +1529,7 @@ BGP/OSPF contrast: baseline22/fixed104 cells0 violations; E2E22 и real UI8 pass ## 12.5.221 — GRE native identity (2026-10-14) Общий identity boundary предотвращает fallback IDs/names и false config revisions. Local13/flags49, production22 и real source/API/UI passed; own objects удалены. Первичный500 сохранён, причина неизвестна. Подробности и границы — [журнал](ux-ui-progress.md). Backend ux-gre221, frontend ux-routing218; следующий222 — общая backend/профильная UI регрессия. + +## 12.5.222 — backend/worker регрессия (2026-10-14) + +Backend25/UI52, disabled33/months5 и оба IPv6 UDP/SQL worker режима прошли; own DB/roles удалены. Dev bootstrap исправлен, production entry сохранён. Подробности и границы — [журнал](ux-ui-progress.md). Backend ux-regression222, frontend ux-routing218; следующий223 — актуализация матрицы/статусов. diff --git a/docs/ux-ui-stage-12.md b/docs/ux-ui-stage-12.md index ee22f7c6..24828129 100644 --- a/docs/ux-ui-stage-12.md +++ b/docs/ux-ui-stage-12.md @@ -1,6 +1,6 @@ # Этап 12: итоговая приёмка UX/UI -Актуальное продолжение 2026-10-14: блок221 завершён. GRE API/config/snapshot source отклоняют missing/duplicate native ID/name и повреждённые records, fallback identity удалены. Local13/flags49, configSync7 и production22 прошли; false observed revisions не добавляются. Whole actual source2own GRE/UI passed, own tunnels/DB/roles удалены. Первичный native500104.165.244.7 сохранён; причина неизвестна. Backend ux-gre221/compiled1056/source490 matched, frontend ux-routing218. Следующий222 — общая backend регрессия в собственных PostgreSQL DB и профильный GRE UI. Этап12.5 открыт. +Актуальное продолжение 2026-10-14: блок222 завершён. Общая backend регрессия25 после worker fix и GRE/Filters E2E52 прошли. Отдельно SQL disabled33/months5; source+compiled IPv6 UDP worker6rows/aggregates/shutdown passed. Dev worker получил собственный tsx bootstrap; production worker path сохранён. Own DB/roles удалены. Backend ux-regression222/compiled1056/source492 matched, frontend ux-routing218. Live API6/UI4 passed. Следующий223 — согласование текущего плана, статусов и укрупнённой матрицы остатка. Этап12.5 открыт. План: [ux-ui-plan.md](ux-ui-plan.md). Фактические результаты: [ux-ui-progress.md](ux-ui-progress.md). Подготовлен после сводных проверок 11Б; завершение каждого блока требует локального коммита без push. @@ -4002,3 +4002,16 @@ Backend ux-gre221 compiled1056/source490 matched, healthy; frontend ux-routing21 Протоколы: [baseline](ux-ui/acceptance/gre221-baseline.json), [fixed](ux-ui/acceptance/gre221-fixed.json), [build](ux-ui/acceptance/gre221-build-proof-2026-10-14.json), [deployment](ux-ui/acceptance/gre221-deployment-2026-10-14.json), [initial500/diagnostics](ux-ui/acceptance/gre221-initial-native-failure-2026-10-14.json), [whole actual source/UI/cleanup](ux-ui/acceptance/gre221-native-live-2026-10-14.json). Следующий222 — общая backend регрессия в собственных PostgreSQL DB (без main env/DB) и профильный GRE/Filters UI после общего reader. + +## 12.5.222 — общая регрессия и исправление dev NetFlow worker (2026-10-14) + +После общих GRE catalog/config/alert readers выполнены25 backend profiles в собственной PostgreSQL с NOSUPERUSER/NOCREATEDB/NOCREATEROLE/NOBYPASSRLS. Test image не содержал /app/.env или /app/backend/.env; main DSN не копировался. По специальным namespace guards дополнительно выполнены33 disabled API/SQL checks (Home/Jump/Exit, bigint positive control, native contacts0) в mm_accept_152 и5 календарных SQL checks в mm_accept_149. Контроль skip/release/recovery concurrency — успешный contention test, не пропущенная SQL ветка. + +GRE/Filters20specs:52 unique E2E passed, skipped0/flaky0, пользовательские screenshots не перезаписывались. Дополнительная IPv6 UDP/source-worker SQL в mm_accept_144 первоначально упала ERR_MODULE_NOT_FOUND на src/db/index.js. Source worker не получал достаточный TS resolver из parent. Добавлен traffic-flow-worker-bootstrap.mjs, регистрирующий tsx внутри worker; dev factory использует его, production .js entry сохранён. Вариант source/compiled выбирается явно в отдельной приёмке. Backend build и4 shutdown checks прошли. + +Повтор source-bootstrap и compiled: по2 реальным UDP datagrams,6 SQL flow rows,25200bytes/42packets minute и7200bytes/12packets Internet hour/day, shutdown acknowledgement. Это synthetic IPv6 payload по local IPv4 UDP, публичный IPv6 WAN не проверялся. Первая повторная all-profile attempt не стартовала из-за неправильного mount gre222-checks в runner: namespace cleanup сработал; исправлено на regression222-checks, свежая БД и25 профилей после worker fix passed. Все собственные DB/roles удалены. + +Backend ux-regression222 compiled1056/source492 matched, healthy; frontend ux-routing218 сохранён. Real Portal JWT:6 API (servers/GRE/BGP/OSPF/flow settings/scheduler)200, network failures0; Traffic/Data collection UI1440/320 —4 smoke cases без page errors/mutations. Изменения не применяли native network configuration и не меняли пароли. Последняя полная UI-regression192 не объявляется повторённой: текущая UI52 профильная. Этап12.5 открыт в пределах матрицы. + +Протоколы: [backend25](ux-ui/acceptance/regression222-backend-2026-10-14.json), [UI52](ux-ui/acceptance/regression222-ui-2026-10-14.json), [disabled33](ux-ui/acceptance/optional222-152-result.json), [months5](ux-ui/acceptance/optional222-149-result.json), [initial worker failure](ux-ui/acceptance/optional222-144-initial-failure.json), [source](ux-ui/acceptance/optional222-144-source-bootstrap-result.json), [compiled](ux-ui/acceptance/optional222-144-compiled-result.json), [build](ux-ui/acceptance/regression222-build-proof-2026-10-14.json), [deployment](ux-ui/acceptance/regression222-deployment-2026-10-14.json), [live](ux-ui/acceptance/regression222-live-2026-10-14.json). Следующий223 — устранить устаревшие краткие статусы в документах и дать компактный актуальный остаток по группам, сохранив историю. + diff --git a/docs/ux-ui-test-server.md b/docs/ux-ui-test-server.md index 063c5830..6ddb0de7 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-14: блок221 завершён. GRE API/config/snapshot source отклоняют missing/duplicate native ID/name и повреждённые records, fallback identity удалены. Local13/flags49, configSync7 и production22 прошли; false observed revisions не добавляются. Whole actual source2own GRE/UI passed, own tunnels/DB/roles удалены. Первичный native500104.165.244.7 сохранён; причина неизвестна. Backend ux-gre221/compiled1056/source490 matched, frontend ux-routing218. Следующий222 — общая backend регрессия в собственных PostgreSQL DB и профильный GRE UI. Этап12.5 открыт. +Актуальное продолжение 2026-10-14: блок222 завершён. Общая backend регрессия25 после worker fix и GRE/Filters E2E52 прошли. Отдельно SQL disabled33/months5; source+compiled IPv6 UDP worker6rows/aggregates/shutdown passed. Dev worker получил собственный tsx bootstrap; production worker path сохранён. Own DB/roles удалены. Backend ux-regression222/compiled1056/source492 matched, frontend ux-routing218. Live API6/UI4 passed. Следующий223 — согласование текущего плана, статусов и укрупнённой матрицы остатка. Этап12.5 открыт. | Параметр | Проверенное состояние | | --- | --- | @@ -2342,3 +2342,7 @@ BGP/OSPF contrast: baseline22/fixed104 cells0 violations; E2E22 и real UI8 pass ## 12.5.221 — GRE native identity (2026-10-14) Общий identity boundary предотвращает fallback IDs/names и false config revisions. Local13/flags49, production22 и real source/API/UI passed; own objects удалены. Первичный500 сохранён, причина неизвестна. Подробности и границы — [журнал](ux-ui-progress.md). Backend ux-gre221, frontend ux-routing218; следующий222 — общая backend/профильная UI регрессия. + +## 12.5.222 — backend/worker регрессия (2026-10-14) + +Backend25/UI52, disabled33/months5 и оба IPv6 UDP/SQL worker режима прошли; own DB/roles удалены. Dev bootstrap исправлен, production entry сохранён. Подробности и границы — [журнал](ux-ui-progress.md). Backend ux-regression222, frontend ux-routing218; следующий223 — актуализация матрицы/статусов. diff --git a/docs/ux-ui/acceptance/optional222-144-compiled-result.json b/docs/ux-ui/acceptance/optional222-144-compiled-result.json new file mode 100644 index 00000000..4494b822 --- /dev/null +++ b/docs/ux-ui/acceptance/optional222-144-compiled-result.json @@ -0,0 +1,20 @@ +{ + "date": "2026-10-14", + "block": "12.5.222", + "database": "mm_accept_144_1791920520902", + "script": "traffic-flow-ipv6-pipeline.test.ts", + "passed": true, + "workerMode": "compiled", + "knownChecks": null, + "udpSqlMetrics": { + "udpDatagramsReceived": 2, + "rawRows": 6, + "allTrafficBytes": 25200, + "allTrafficPackets": 42, + "internetFactsBytes": 7200, + "internetFactsPackets": 12, + "workerShutdownAcknowledged": true, + "minuteHourDayTotalsPassed": true + }, + "ownedDatabaseAndRoleRemoved": true +} \ No newline at end of file diff --git a/docs/ux-ui/acceptance/optional222-144-initial-failure.json b/docs/ux-ui/acceptance/optional222-144-initial-failure.json new file mode 100644 index 00000000..cfee03bb --- /dev/null +++ b/docs/ux-ui/acceptance/optional222-144-initial-failure.json @@ -0,0 +1,9 @@ +{ + "date": "2026-10-14", + "block": "12.5.222", + "database": "mm_accept_144_1791919769374", + "script": "traffic-flow-ipv6-pipeline.test.ts", + "passed": false, + "errorName": "Error", + "exitCode": 1 +} \ No newline at end of file diff --git a/docs/ux-ui/acceptance/optional222-144-source-bootstrap-result.json b/docs/ux-ui/acceptance/optional222-144-source-bootstrap-result.json new file mode 100644 index 00000000..96e38f84 --- /dev/null +++ b/docs/ux-ui/acceptance/optional222-144-source-bootstrap-result.json @@ -0,0 +1,20 @@ +{ + "date": "2026-10-14", + "block": "12.5.222", + "database": "mm_accept_144_1791920508613", + "script": "traffic-flow-ipv6-pipeline.test.ts", + "passed": true, + "workerMode": "source-bootstrap", + "knownChecks": null, + "udpSqlMetrics": { + "udpDatagramsReceived": 2, + "rawRows": 6, + "allTrafficBytes": 25200, + "allTrafficPackets": 42, + "internetFactsBytes": 7200, + "internetFactsPackets": 12, + "workerShutdownAcknowledged": true, + "minuteHourDayTotalsPassed": true + }, + "ownedDatabaseAndRoleRemoved": true +} \ No newline at end of file diff --git a/docs/ux-ui/acceptance/optional222-149-result.json b/docs/ux-ui/acceptance/optional222-149-result.json new file mode 100644 index 00000000..93834f98 --- /dev/null +++ b/docs/ux-ui/acceptance/optional222-149-result.json @@ -0,0 +1,9 @@ +{ + "date": "2026-10-14", + "block": "12.5.222", + "database": "mm_accept_149_1791919762284", + "script": "traffic-flow-month.test.ts", + "passed": true, + "knownChecks": 5, + "ownedDatabaseAndRoleRemoved": true +} \ No newline at end of file diff --git a/docs/ux-ui/acceptance/optional222-152-result.json b/docs/ux-ui/acceptance/optional222-152-result.json new file mode 100644 index 00000000..a80f7358 --- /dev/null +++ b/docs/ux-ui/acceptance/optional222-152-result.json @@ -0,0 +1,9 @@ +{ + "date": "2026-10-14", + "block": "12.5.222", + "database": "mm_accept_152_1791919749449", + "script": "network-disabled-server.test.ts", + "passed": true, + "knownChecks": 33, + "ownedDatabaseAndRoleRemoved": true +} \ No newline at end of file diff --git a/docs/ux-ui/acceptance/regression222-backend-2026-10-14.json b/docs/ux-ui/acceptance/regression222-backend-2026-10-14.json new file mode 100644 index 00000000..ab3c4da3 --- /dev/null +++ b/docs/ux-ui/acceptance/regression222-backend-2026-10-14.json @@ -0,0 +1,191 @@ +{ + "date": "2026-10-14", + "block": "12.5.222", + "scope": "full backend profile list on owned isolated PostgreSQL; no production DSN", + "database": "mm_accept_166_1791920873950", + "profiles": [ + { + "profile": "test:probes", + "passed": true, + "durationMs": 25206, + "skippedLineCount": 1, + "unavailableSqlBranches": [] + }, + { + "profile": "test:exec", + "passed": true, + "durationMs": 6620, + "skippedLineCount": 1, + "unavailableSqlBranches": [] + }, + { + "profile": "test:alert-engine", + "passed": true, + "durationMs": 22308, + "skippedLineCount": 0, + "unavailableSqlBranches": [] + }, + { + "profile": "test:alerts-telegram", + "passed": true, + "durationMs": 15324, + "skippedLineCount": 10, + "unavailableSqlBranches": [] + }, + { + "profile": "test:auth", + "passed": true, + "durationMs": 11329, + "skippedLineCount": 0, + "unavailableSqlBranches": [] + }, + { + "profile": "test:wireguard", + "passed": true, + "durationMs": 12454, + "skippedLineCount": 1, + "unavailableSqlBranches": [] + }, + { + "profile": "test:ipsec", + "passed": true, + "durationMs": 17164, + "skippedLineCount": 0, + "unavailableSqlBranches": [] + }, + { + "profile": "test:traffic-rate", + "passed": true, + "durationMs": 49953, + "skippedLineCount": 1, + "unavailableSqlBranches": [] + }, + { + "profile": "test:traffic-flow", + "passed": true, + "durationMs": 64980, + "skippedLineCount": 2, + "unavailableSqlBranches": [ + "Monthly SQL: skip (requires an owned isolated database)", + "IPv6 UDP/worker/SQL: skip (requires an owned isolated database)" + ] + }, + { + "profile": "test:users", + "passed": true, + "durationMs": 7994, + "skippedLineCount": 0, + "unavailableSqlBranches": [] + }, + { + "profile": "test:pg", + "passed": true, + "durationMs": 10211, + "skippedLineCount": 0, + "unavailableSqlBranches": [] + }, + { + "profile": "test:backups", + "passed": true, + "durationMs": 9910, + "skippedLineCount": 8, + "unavailableSqlBranches": [] + }, + { + "profile": "test:scheduler", + "passed": true, + "durationMs": 6277, + "skippedLineCount": 5, + "unavailableSqlBranches": [] + }, + { + "profile": "test:live-maps", + "passed": true, + "durationMs": 27466, + "skippedLineCount": 0, + "unavailableSqlBranches": [] + }, + { + "profile": "test:ospf-optimizer", + "passed": true, + "durationMs": 7546, + "skippedLineCount": 1, + "unavailableSqlBranches": [] + }, + { + "profile": "test:recursive-routes", + "passed": true, + "durationMs": 4080, + "skippedLineCount": 0, + "unavailableSqlBranches": [] + }, + { + "profile": "test:config-sync", + "passed": true, + "durationMs": 17701, + "skippedLineCount": 1, + "unavailableSqlBranches": [ + "network-disabled-server.test.ts: invalid IDs passed; own SQL/disabled API checks skipped (MMAPP_OWN_TEST_DB required)" + ] + }, + { + "profile": "test:ros-file", + "passed": true, + "durationMs": 1600, + "skippedLineCount": 1, + "unavailableSqlBranches": [] + }, + { + "profile": "test:containers", + "passed": true, + "durationMs": 6582, + "skippedLineCount": 0, + "unavailableSqlBranches": [] + }, + { + "profile": "test:certificates", + "passed": true, + "durationMs": 12248, + "skippedLineCount": 3, + "unavailableSqlBranches": [] + }, + { + "profile": "test:netflow-settings", + "passed": true, + "durationMs": 4695, + "skippedLineCount": 0, + "unavailableSqlBranches": [] + }, + { + "profile": "test:netflow-purge", + "passed": true, + "durationMs": 2613, + "skippedLineCount": 0, + "unavailableSqlBranches": [] + }, + { + "profile": "test:evolution", + "passed": true, + "durationMs": 5168, + "skippedLineCount": 1, + "unavailableSqlBranches": [] + }, + { + "profile": "test:system-database", + "passed": true, + "durationMs": 19916, + "skippedLineCount": 9, + "unavailableSqlBranches": [] + }, + { + "profile": "test:server-privacy", + "passed": true, + "durationMs": 5873, + "skippedLineCount": 0, + "unavailableSqlBranches": [] + } + ], + "passed": true, + "ownedDatabaseAndRoleRemoved": true, + "coverageNote": "Three special namespace SQL branches replayed separately; contention skip/release/recovery is a successful check" +} diff --git a/docs/ux-ui/acceptance/regression222-build-proof-2026-10-14.json b/docs/ux-ui/acceptance/regression222-build-proof-2026-10-14.json new file mode 100644 index 00000000..ba1619bc --- /dev/null +++ b/docs/ux-ui/acceptance/regression222-build-proof-2026-10-14.json @@ -0,0 +1,29 @@ +{ + "date": "2026-10-14", + "block": "12.5.222", + "compiled": { + "matched": 1056, + "missing": 0, + "different": 0 + }, + "source": [ + { + "kind": "backend", + "matched": 492 + } + ], + "rootEnvExists": false, + "backendEnvExists": false, + "fullProfilesAfterFix": 25, + "uiCases": 52, + "workerShutdownChecks": 4, + "specialSqlCases": { + "networkDisabled": 33, + "calendarMonths": 5, + "ipv6PipelineModes": [ + "source-bootstrap", + "compiled" + ] + }, + "runnerPathFailure": "Repeat attempt initially mounted non-existent gre222-checks; owned DB/role trap cleaned up, corrected to regression222-checks and fresh full25 passed" +} diff --git a/docs/ux-ui/acceptance/regression222-deployment-2026-10-14.json b/docs/ux-ui/acceptance/regression222-deployment-2026-10-14.json new file mode 100644 index 00000000..15e482b7 --- /dev/null +++ b/docs/ux-ui/acceptance/regression222-deployment-2026-10-14.json @@ -0,0 +1,21 @@ +{ + "date": "2026-10-14", + "block": "12.5.222", + "backendSourceMatched": 492, + "compiledMatched": 1056, + "frontendChanged": false, + "services": { + "backend": { + "image": "mmapp-test/backend:ux-regression222", + "imageId": "sha256:13baf68195251a134286474aa86847d86d6dfc11ce4d90e6b8c7f0526abed285", + "running": true, + "health": "healthy" + }, + "frontend": { + "image": "mmapp-test/frontend:ux-routing218", + "imageId": "sha256:ec658b9da88c19d60987be5bfc0c15fb339a0310d7a42dc761b40a70a3428c5a", + "running": true, + "health": null + } + } +} \ No newline at end of file diff --git a/docs/ux-ui/acceptance/regression222-live-2026-10-14.json b/docs/ux-ui/acceptance/regression222-live-2026-10-14.json new file mode 100644 index 00000000..f7bf68e4 --- /dev/null +++ b/docs/ux-ui/acceptance/regression222-live-2026-10-14.json @@ -0,0 +1,67 @@ +{ + "date": "2026-10-14", + "block": "12.5.222", + "backend": "ux-regression222", + "frontend": "ux-routing218", + "apiCases": [ + { + "path": "/api/servers", + "status": 200, + "failures": null + }, + { + "path": "/api/gre/tunnels", + "status": 200, + "failures": 0 + }, + { + "path": "/api/bgp/catalog", + "status": 200, + "failures": 0 + }, + { + "path": "/api/ospf/catalog", + "status": 200, + "failures": 0 + }, + { + "path": "/api/traffic/flow/settings", + "status": 200, + "failures": null + }, + { + "path": "/api/scheduler/status", + "status": 200, + "failures": null + } + ], + "ui": [ + { + "width": 1440, + "path": "/traffic", + "pageErrors": 0, + "mutationRequests": 0 + }, + { + "width": 1440, + "path": "/data-collection", + "pageErrors": 0, + "mutationRequests": 0 + }, + { + "width": 320, + "path": "/traffic", + "pageErrors": 0, + "mutationRequests": 0 + }, + { + "width": 320, + "path": "/data-collection", + "pageErrors": 0, + "mutationRequests": 0 + } + ], + "realPortalJWT": true, + "apiMocks": false, + "scope": "Healthy runtime API and UI smoke after worker fix; actual UDP worker SQL proof is isolated" +} diff --git a/docs/ux-ui/acceptance/regression222-ui-2026-10-14.json b/docs/ux-ui/acceptance/regression222-ui-2026-10-14.json new file mode 100644 index 00000000..8ccf280e --- /dev/null +++ b/docs/ux-ui/acceptance/regression222-ui-2026-10-14.json @@ -0,0 +1,15 @@ +{ + "date": "2026-10-14", + "block": "12.5.222", + "scope": "20 GRE/Filters specs through live HTTP fixtures; user screenshots not rewritten", + "stats": { + "startTime": "2026-10-13T19:13:21.889Z", + "duration": 128028.369, + "expected": 52, + "skipped": 0, + "unexpected": 0, + "flaky": 0 + }, + "uniqueCases": 52, + "apiMocked": true +}