fix(netflow): запускать TypeScript worker с собственным загрузчиком

This commit is contained in:
Denozordec committed 2026-10-14 02:57:24 +07:00
1 parent 7a38bb36aa
commit 19ad294ded
20 files changed
+472 -13

No files matched your search

@@ -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
+4 -4
View File
@@ -58,10 +58,10 @@ let state: FlowListenerState = { bound: false, address: null }
let wantListen = false
let databaseStop: Promise<void> | 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<void> {
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 }
@@ -100,7 +100,10 @@ if (!ownDb) {
await new Promise<void>(resolve => reservation.bind(0, "127.0.0.1", resolve))
const port = reservation.address().port
await new Promise<void>(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) => {
@@ -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)
+5 -1
View File
@@ -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 — актуализация матрицы/статусов.
+1 -1
View File
@@ -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). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат.
+13 -1
View File
@@ -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 сохраняются.
+7 -3
View File
@@ -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 — актуализация матрицы/статусов.
+14 -1
View File
@@ -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 — устранить устаревшие краткие статусы в документах и дать компактный актуальный остаток по группам, сохранив историю.
+5 -1
View File
@@ -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 — актуализация матрицы/статусов.
@@ -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
}
@@ -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
}
@@ -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
}
@@ -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
}
@@ -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
}
@@ -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"
}
@@ -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"
}
@@ -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
}
}
}
@@ -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"
}
@@ -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
}