fix(traffic): объединять чтения истории общего сервера
This commit is contained in:
1 parent
7b88416415
commit
a68bd61e58
18 files changed
+1373
-30
No files matched your search
@@ -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 && tsx src/services/traffic-membership.test.ts && tsx src/services/traffic-aggregate-peak.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 && tsx src/services/traffic-aggregate-peak.test.ts && tsx src/services/traffic-users-cache.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",
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
import assert from 'node:assert/strict'
|
||||
import fs from 'node:fs'
|
||||
import vm from 'node:vm'
|
||||
import ts from 'typescript'
|
||||
import {buildTrafficFromSamples,mergeBuiltTraffic} from './traffic-rate.js'
|
||||
import {applyTrafficFreshness,trafficBindingStatus} from './traffic-freshness.js'
|
||||
|
||||
const source=fs.readFileSync(new URL('./traffic-users.ts',import.meta.url),'utf8')
|
||||
const ast=ts.createSourceFile('traffic-users.ts',source,ts.ScriptTarget.Latest,true)
|
||||
const names=['seriesFromBuilt','buildUserTrafficList']
|
||||
const functions=ast.statements.filter(n=>ts.isFunctionDeclaration(n)&&n.name&&names.includes(n.name.text)).map(n=>n.getText(ast)).join('\n')
|
||||
assert.equal(ast.statements.filter(n=>ts.isFunctionDeclaration(n)&&n.name&&names.includes(n.name.text)).length,2)
|
||||
let calls=0,fail=false
|
||||
const at=Date.parse('2026-10-13T00:00:00Z')
|
||||
const users=Array.from({length:100},(_,i)=>({id:String(i),login:'user'+i,name:'User '+i,role:'user',active:true,
|
||||
bindings:[{serverId:1,interfaceName:'ether1',peerPublicKey:'',userId:String(i),id:'binding'+i}]}))
|
||||
const context=vm.createContext({Date,Map,Promise,buildTrafficFromSamples,mergeBuiltTraffic,applyTrafficFreshness,trafficBindingStatus,
|
||||
listUsers:async()=>users,servers:{},db:{select:()=>({from:async()=>[{id:1,enabled:true,updatedAt:new Date(at).toISOString()}]})},
|
||||
readTrafficCollectionContext:async()=>({settings:{enabled:true,intervalSec:30},states:new Map()}),
|
||||
readServerSamplesInRange:async()=>{calls++;await new Promise(resolve=>setTimeout(resolve,5));if(fail)throw Error('fixture read failed');
|
||||
return [0,30_000].map((offset,i)=>({interfaceName:'ether1',sampledAt:new Date(at+offset).toISOString(),rxBytes:i*1024,txBytes:0,rxBps:0,txBps:0,running:true,disabled:false}))},
|
||||
})
|
||||
vm.runInContext(ts.transpileModule(functions,{compilerOptions:{target:ts.ScriptTarget.ES2022,module:ts.ModuleKind.CommonJS}}).outputText.replace(/^.*exports.*$/gm,''),context)
|
||||
const build=context.buildUserTrafficList as (start:number,end:number)=>Promise<Array<{rxTotal:number;interfaces:unknown[]}>>
|
||||
const rows=await build(at,at+30_000)
|
||||
assert.equal(calls,1,'100 concurrent users share one server history read')
|
||||
assert.equal(rows.length,100);assert(rows.every(r=>r.rxTotal===1024/1024**3&&r.interfaces.length===1))
|
||||
await build(at,at+60_000);assert.equal(calls,2,'cache is scoped to a request and never reuses an older period')
|
||||
fail=true;await assert.rejects(build(at,at+60_000),/fixture read failed/);assert.equal(calls,3)
|
||||
fail=false;await build(at,at+60_000);assert.equal(calls,4,'a failed request cannot poison later reads')
|
||||
users[99].bindings[0].serverId=2
|
||||
await build(at,at+60_000);assert.equal(calls,6,'different server IDs never share a cached history')
|
||||
console.log('user traffic: 100 concurrent consumers/one server read/request scope/failure/recovery passed')
|
||||
@@ -80,18 +80,19 @@ export async function buildUserTrafficList(rangeStartMs: number, rangeEndMs: num
|
||||
const users = await listUsers()
|
||||
const [context, allServers] = await Promise.all([readTrafficCollectionContext(), db.select().from(servers)])
|
||||
const catalog = new Map(allServers.map(s => [s.id, s]))
|
||||
const sampleCache = new Map<number, Awaited<ReturnType<typeof readServerSamplesInRange>>>()
|
||||
const sampleCache = new Map<number, ReturnType<typeof readServerSamplesInRange>>()
|
||||
|
||||
return Promise.all(users.map(async (user) => {
|
||||
const parts: BuiltTrafficSeries[] = []
|
||||
const interfaces: BoundIfaceTrafficDto[] = []
|
||||
|
||||
for (const b of user.bindings) {
|
||||
let rows = sampleCache.get(b.serverId)
|
||||
if (!rows) {
|
||||
rows = await readServerSamplesInRange(b.serverId, sinceIso)
|
||||
sampleCache.set(b.serverId, rows)
|
||||
let pending = sampleCache.get(b.serverId)
|
||||
if (!pending) {
|
||||
pending = readServerSamplesInRange(b.serverId, sinceIso)
|
||||
sampleCache.set(b.serverId, pending)
|
||||
}
|
||||
const rows = await pending
|
||||
const peerKey = b.peerPublicKey ?? ""
|
||||
const built = buildTrafficFromSamples(rows, rangeStartMs, rangeEndMs, b.interfaceName, peerKey, true)
|
||||
const server = catalog.get(b.serverId)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# UX/UI: протокол внешней приёмки 12.5
|
||||
|
||||
Актуальное продолжение 2026-10-13: завершён191 — общий пик привязок по совпадающим подтверждённым интервалам; backend/frontend ux-peak191 развёрнуты. ownSQL71/41228ms, E2E77/1.6m, source985/compiled1040/API/live UI2 passed. Начата192 — общая backend-регрессия в отдельной временной БД.12.5 открыта.
|
||||
Актуальное продолжение 2026-10-13: завершены191 и193 — общий пик подтверждённых интервалов и одно чтение истории сервера на запрос пользователей. Runtime backend ux-peak193/frontend ux-peak191 healthy/API/live UI2 passed.192: backend24 профиля passed321237ms; отдельные Monthly SQL/IPv6 UDP-worker-SQL/Ping replay passed, frontend59 test files accepted after corrected stale assertion; полный E2E1286 ещё выполняется.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: завершён191 — общий пик привязок по совпадающим подтверждённым интервалам; backend/frontend ux-peak191 развёрнуты. ownSQL71/41228ms, E2E77/1.6m, source985/compiled1040/API/live UI2 passed. Начата192 — общая backend-регрессия в отдельной временной БД.12.5 открыта.
|
||||
Актуальное продолжение 2026-10-13: завершены191 и193 — общий пик подтверждённых интервалов и одно чтение истории сервера на запрос пользователей. Runtime backend ux-peak193/frontend ux-peak191 healthy/API/live UI2 passed.192: backend24 профиля passed321237ms; отдельные Monthly SQL/IPv6 UDP-worker-SQL/Ping replay passed, frontend59 test files accepted after corrected stale assertion; полный E2E1286 ещё выполняется.12.5 открыта.
|
||||
|
||||
Подробный объём, протоколы, схема и ограничения: [12.5.77 в журнале](ux-ui-progress.md).
|
||||
|
||||
@@ -2307,10 +2307,22 @@ Unit проверил partial high point → последующая complete0 wa
|
||||
|
||||
Backend build и frontend TypeScript passed. Все77 уникальных E2E трафика прошли1.6m; начальные4 focused cases22.4s входят в77 и повторно не считаются. Production backend/frontend build passed; source manifests совпали461 backend+524 frontend файлов,1040 compiled backend artifacts совпали. Runtime backend/frontend ux-peak191, PostgreSQL healthy; frontend healthcheck отсутствует, работа подтверждена HTTP/browser. До backend rollout новый frontend принят с backend190. Actual API200 и fresh measurements обоих CHR, live UI1440/320 без page errors/overflow. Native конфигурация/пароли не менялись, messages0.
|
||||
|
||||
Протоколы: [SQL](ux-ui/acceptance/traffic-peak191-sql191-result.json), [source](ux-ui/acceptance/traffic-peak191-source191-result.json), [compiled](ux-ui/acceptance/traffic-peak191-compiled191-result.json), [runtime](ux-ui/acceptance/traffic-peak191-runtime191-result.json), [API](ux-ui/acceptance/traffic-peak191-peak191-api-result.json), [E2E](ux-ui/acceptance/traffic-peak-e2e-2026-10-13.json), [interop](ux-ui/acceptance/traffic-peak-interop-2026-10-13.json), [live UI](ux-ui/acceptance/traffic-peak-deployed-2026-10-13.json).
|
||||
Протоколы: [SQL](ux-ui/acceptance/traffic-peak191-sql191-result.json), [source](ux-ui/acceptance/traffic-peak191-source191-result.json), [compiled](ux-ui/acceptance/traffic-peak191-compiled191-result.json), [runtime](ux-ui/acceptance/traffic-peak191-runtime191-result.json), [API](ux-ui/acceptance/traffic-peak191-peak191-api-result.json), [E2E](ux-ui/acceptance/traffic-peak-e2e-2026-10-13.json), [interop](ux-ui/acceptance/traffic-peak-interop-2026-10-13.json), [live UI](ux-ui/acceptance/traffic-aggregate-peak-deployed-2026-10-13.json).
|
||||
|
||||
| Референс | Схема |
|
||||
| --- | --- |
|
||||
| [ReUI Stats12](https://reui.io/preview/base/stats-12?ref=mcp) | Совпадающие интервалы всех привязок → подтверждённая сумма → максимум периода; нет совпадения → «—», объём сохранён |
|
||||
|
||||
Следующий192: одна согласованная общая backend-регрессия; фиксировать реальные skipped/external ветки отдельно. Последующий объём определяется результатом этой проверки и матрицей внешней приёмки. Portal/Telegram/client OS/multi-WAN/scale не приняты по fixture-тестам.12.5 открыта.
|
||||
|
||||
## 12.5.193 — трафик пользователей: одно чтение истории общего сервера (2026-10-13)
|
||||
|
||||
Устранены повторные одновременные SELECT истории при Promise.all пользователей. Cache раньше заполнялся только после await, поэтому100 пользователей с общим сервером успевали начать100 независимых чтений. Теперь Promise сохраняется перед await, потребители используют одну выборку этого сервера в рамках текущего запроса. Cache не сохраняется между запросами/периодами; другой serverId читает собственные данные. Ошибка распространяется как прежде, следующий запрос выполняет новое чтение и восстанавливается. Это не глобальный cache и не обещание транзакционно согласованного snapshot всех серверов/каталога.
|
||||
|
||||
Изменён traffic-users.ts, добавлен traffic-users-cache.test.ts в профиль traffic-rate. Проверка выполняет actual function body из исходника с подменой DB boundaries:100 concurrent consumers →1 server history read, unchanged1024bytes/user, новый запрос →новое чтение, другая serverId →отдельная выборка, failure/recovery. Это подтверждение call count алгоритма, не production SQL benchmark. Реальный профиль PostgreSQL/API прошёл все71 SQL cases41959ms без unavailable skip, включая100 bindings/user, volume/temporal peak/source/freshness. Собственные DB/role/container удалены.
|
||||
|
||||
Backend build passed. Production backend ux-peak193/version1.0.0-test.peak193 развёрнут, frontend ux-peak191 сохранён.462 backend source files и1040 compiled artifacts совпали. Frontend не пересобирался; его источник/production bundle остаются подтверждёнными191. Backend/PG healthy, frontend HTTP/browser passed. Actual API200 и current measurements обоих CHR, live UI1440/320 без page errors/overflow. Native конфигурация и пароли не менялись, messages0.
|
||||
|
||||
Протоколы: [cache](ux-ui/acceptance/traffic-users-cache-2026-10-13.json), [SQL](ux-ui/acceptance/traffic-users193-sql193-result.json), [source](ux-ui/acceptance/traffic-users193-source193-result.json), [compiled](ux-ui/acceptance/traffic-users193-compiled193-result.json), [runtime](ux-ui/acceptance/traffic-users193-runtime193-result.json), [API](ux-ui/acceptance/traffic-users193-peak193-api-result.json), [live UI](ux-ui/acceptance/traffic-users-cache-deployed-2026-10-13.json).
|
||||
|
||||
Общая регрессия192 начата на backend191; её24 backend профиля passed, текущий cache193 отдельно принят полным traffic-rate профилем. Не повторять общие неизменённые разделы. Полный браузерный прогон1286 ещё выполняется — не считать его завершённым. Исправлена ссылка live UI191: его evidence теперь хранится отдельно от исторического190, исходный протокол190 восстановлен. Следующий шаг — завершить192, разобрать ошибки полного E2E и восстановить только снимки текущего тестового запуска с сохранением8 исходно изменённых пользовательских PNG. Затем multi-instance/scale и внешние группы матрицы.12.5 открыта.
|
||||
+5
-5
@@ -1,12 +1,12 @@
|
||||
# План реализации UX/UI по пятичасовым окнам
|
||||
|
||||
Актуальное продолжение 2026-10-13: завершён191 — общий пик привязок по совпадающим подтверждённым интервалам; backend/frontend ux-peak191 развёрнуты. ownSQL71/41228ms, E2E77/1.6m, source985/compiled1040/API/live UI2 passed. Начата192 — общая backend-регрессия в отдельной временной БД.12.5 открыта.
|
||||
Актуальное продолжение 2026-10-13: завершены191 и193 — общий пик подтверждённых интервалов и одно чтение истории сервера на запрос пользователей. Runtime backend ux-peak193/frontend ux-peak191 healthy/API/live UI2 passed.192: backend24 профиля passed321237ms; отдельные Monthly SQL/IPv6 UDP-worker-SQL/Ping replay passed, frontend59 test files accepted after corrected stale assertion; полный E2E1286 ещё выполняется.12.5 открыта.
|
||||
|
||||
Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-12. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат.
|
||||
Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-13. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат.
|
||||
|
||||
## Актуальная точка продолжения — 2026-10-12
|
||||
## Актуальная точка продолжения — 2026-10-13
|
||||
|
||||
Актуальное продолжение 2026-10-13: завершён191 — общий пик привязок по совпадающим подтверждённым интервалам; backend/frontend ux-peak191 развёрнуты. ownSQL71/41228ms, E2E77/1.6m, source985/compiled1040/API/live UI2 passed. Начата192 — общая backend-регрессия в отдельной временной БД.12.5 открыта.
|
||||
Актуальное продолжение 2026-10-13: завершены191 и193 — общий пик подтверждённых интервалов и одно чтение истории сервера на запрос пользователей. Runtime backend ux-peak193/frontend ux-peak191 healthy/API/live UI2 passed.192: backend24 профиля passed321237ms; отдельные Monthly SQL/IPv6 UDP-worker-SQL/Ping replay passed, frontend59 test files accepted after corrected stale assertion; полный E2E1286 ещё выполняется.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: завершён191 — общий пик привязок по совпадающим подтверждённым интервалам; backend/frontend ux-peak191 развёрнуты. ownSQL71/41228ms, E2E77/1.6m, source985/compiled1040/API/live UI2 passed. Начата192 — общая backend-регрессия в отдельной временной БД.12.5 открыта.
|
||||
Актуальное продолжение 2026-10-13: завершены191 и193 — общий пик подтверждённых интервалов и одно чтение истории сервера на запрос пользователей. Runtime backend ux-peak193/frontend ux-peak191 healthy/API/live UI2 passed.192: backend24 профиля passed321237ms; отдельные Monthly SQL/IPv6 UDP-worker-SQL/Ping replay passed, frontend59 test files accepted after corrected stale assertion; полный E2E1286 ещё выполняется.12.5 открыта.
|
||||
|
||||
Подробный объём, протоколы, схема и ограничения: [12.5.77 в журнале](ux-ui-progress.md).
|
||||
+15
-3
@@ -1,6 +1,6 @@
|
||||
# UX/UI: журнал реализации
|
||||
|
||||
Актуальное продолжение 2026-10-13: завершён191 — общий пик привязок по совпадающим подтверждённым интервалам; backend/frontend ux-peak191 развёрнуты. ownSQL71/41228ms, E2E77/1.6m, source985/compiled1040/API/live UI2 passed. Начата192 — общая backend-регрессия в отдельной временной БД.12.5 открыта.
|
||||
Актуальное продолжение 2026-10-13: завершены191 и193 — общий пик подтверждённых интервалов и одно чтение истории сервера на запрос пользователей. Runtime backend ux-peak193/frontend ux-peak191 healthy/API/live UI2 passed.192: backend24 профиля passed321237ms; отдельные Monthly SQL/IPv6 UDP-worker-SQL/Ping replay passed, frontend59 test files accepted after corrected stale assertion; полный E2E1286 ещё выполняется.12.5 открыта.
|
||||
|
||||
Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения. Записи расположены от новых к старым; подробная история этапа12 также сохранена в [ux-ui-stage-12.md](ux-ui-stage-12.md).
|
||||
|
||||
@@ -36,7 +36,19 @@
|
||||
| 10 | Маршрутизация, диагностика, карта и терминал | Завершён в границах локальной приёмки 2026-10-01; блоки 10.1–10.71, внешние ограничения в 10.71 |
|
||||
| 11А | Пользователи, контейнеры, сертификаты и резервные копии | Завершён в границах локальной приёмки 2026-10-01; 11А.1–11А.33, внешние ограничения в 11А.33 |
|
||||
| 11Б | Оповещения, сбор данных, интеграции, релизы и настройки | Завершён в границах локальной приёмки 2026-10-03; ограничения и evidence в11Б.7 |
|
||||
| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка завершена в границах12.3.83; внешняя12.5 в работе, выполненные блоки1–191 и ограничения ниже. Runtime backend/frontend ux-peak191. |
|
||||
| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка завершена в границах12.3.83; внешняя12.5 в работе, выполненные блоки1–191 и193;192 в проверке и ограничения ниже. Runtime backend ux-peak193/frontend ux-peak191. |
|
||||
|
||||
## 12.5.193 — трафик пользователей: одно чтение истории общего сервера (2026-10-13)
|
||||
|
||||
Устранены повторные одновременные SELECT истории при Promise.all пользователей. Cache раньше заполнялся только после await, поэтому100 пользователей с общим сервером успевали начать100 независимых чтений. Теперь Promise сохраняется перед await, потребители используют одну выборку этого сервера в рамках текущего запроса. Cache не сохраняется между запросами/периодами; другой serverId читает собственные данные. Ошибка распространяется как прежде, следующий запрос выполняет новое чтение и восстанавливается. Это не глобальный cache и не обещание транзакционно согласованного snapshot всех серверов/каталога.
|
||||
|
||||
Изменён traffic-users.ts, добавлен traffic-users-cache.test.ts в профиль traffic-rate. Проверка выполняет actual function body из исходника с подменой DB boundaries:100 concurrent consumers →1 server history read, unchanged1024bytes/user, новый запрос →новое чтение, другая serverId →отдельная выборка, failure/recovery. Это подтверждение call count алгоритма, не production SQL benchmark. Реальный профиль PostgreSQL/API прошёл все71 SQL cases41959ms без unavailable skip, включая100 bindings/user, volume/temporal peak/source/freshness. Собственные DB/role/container удалены.
|
||||
|
||||
Backend build passed. Production backend ux-peak193/version1.0.0-test.peak193 развёрнут, frontend ux-peak191 сохранён.462 backend source files и1040 compiled artifacts совпали. Frontend не пересобирался; его источник/production bundle остаются подтверждёнными191. Backend/PG healthy, frontend HTTP/browser passed. Actual API200 и current measurements обоих CHR, live UI1440/320 без page errors/overflow. Native конфигурация и пароли не менялись, messages0.
|
||||
|
||||
Протоколы: [cache](ux-ui/acceptance/traffic-users-cache-2026-10-13.json), [SQL](ux-ui/acceptance/traffic-users193-sql193-result.json), [source](ux-ui/acceptance/traffic-users193-source193-result.json), [compiled](ux-ui/acceptance/traffic-users193-compiled193-result.json), [runtime](ux-ui/acceptance/traffic-users193-runtime193-result.json), [API](ux-ui/acceptance/traffic-users193-peak193-api-result.json), [live UI](ux-ui/acceptance/traffic-users-cache-deployed-2026-10-13.json).
|
||||
|
||||
Общая регрессия192 начата на backend191; её24 backend профиля passed, текущий cache193 отдельно принят полным traffic-rate профилем. Не повторять общие неизменённые разделы. Полный браузерный прогон1286 ещё выполняется — не считать его завершённым. Исправлена ссылка live UI191: его evidence теперь хранится отдельно от исторического190, исходный протокол190 восстановлен. Следующий шаг — завершить192, разобрать ошибки полного E2E и восстановить только снимки текущего тестового запуска с сохранением8 исходно изменённых пользовательских PNG. Затем multi-instance/scale и внешние группы матрицы.12.5 открыта.
|
||||
|
||||
## 12.5.191 — подтверждённый общий пик привязок: реализация и приёмка (2026-10-13)
|
||||
|
||||
@@ -48,7 +60,7 @@
|
||||
|
||||
Backend build и frontend TypeScript passed. Все77 уникальных E2E трафика прошли1.6m; начальные4 focused cases22.4s входят в77 и повторно не считаются. Production backend/frontend build passed; source manifests совпали461 backend+524 frontend файлов,1040 compiled backend artifacts совпали. Runtime backend/frontend ux-peak191, PostgreSQL healthy; frontend healthcheck отсутствует, работа подтверждена HTTP/browser. До backend rollout новый frontend принят с backend190. Actual API200 и fresh measurements обоих CHR, live UI1440/320 без page errors/overflow. Native конфигурация/пароли не менялись, messages0.
|
||||
|
||||
Протоколы: [SQL](ux-ui/acceptance/traffic-peak191-sql191-result.json), [source](ux-ui/acceptance/traffic-peak191-source191-result.json), [compiled](ux-ui/acceptance/traffic-peak191-compiled191-result.json), [runtime](ux-ui/acceptance/traffic-peak191-runtime191-result.json), [API](ux-ui/acceptance/traffic-peak191-peak191-api-result.json), [E2E](ux-ui/acceptance/traffic-peak-e2e-2026-10-13.json), [interop](ux-ui/acceptance/traffic-peak-interop-2026-10-13.json), [live UI](ux-ui/acceptance/traffic-peak-deployed-2026-10-13.json).
|
||||
Протоколы: [SQL](ux-ui/acceptance/traffic-peak191-sql191-result.json), [source](ux-ui/acceptance/traffic-peak191-source191-result.json), [compiled](ux-ui/acceptance/traffic-peak191-compiled191-result.json), [runtime](ux-ui/acceptance/traffic-peak191-runtime191-result.json), [API](ux-ui/acceptance/traffic-peak191-peak191-api-result.json), [E2E](ux-ui/acceptance/traffic-peak-e2e-2026-10-13.json), [interop](ux-ui/acceptance/traffic-peak-interop-2026-10-13.json), [live UI](ux-ui/acceptance/traffic-aggregate-peak-deployed-2026-10-13.json).
|
||||
|
||||
| Референс | Схема |
|
||||
| --- | --- |
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# Оставшаяся внешняя приёмка — 2026-10-13
|
||||
|
||||
Актуальное продолжение 2026-10-13: завершён191 — общий пик привязок по совпадающим подтверждённым интервалам; backend/frontend ux-peak191 развёрнуты. ownSQL71/41228ms, E2E77/1.6m, source985/compiled1040/API/live UI2 passed. Начата192 — общая backend-регрессия в отдельной временной БД.12.5 открыта.
|
||||
Актуальное продолжение 2026-10-13: завершены191 и193 — общий пик подтверждённых интервалов и одно чтение истории сервера на запрос пользователей. Runtime backend ux-peak193/frontend ux-peak191 healthy/API/live UI2 passed.192: backend24 профиля passed321237ms; отдельные Monthly SQL/IPv6 UDP-worker-SQL/Ping replay passed, frontend59 test files accepted after corrected stale assertion; полный E2E1286 ещё выполняется.12.5 открыта.
|
||||
|
||||
Это актуальная матрица после 12.5.191. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии.
|
||||
Это актуальная матрица после 12.5.193. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии.
|
||||
|
||||
Стенд: Debian13/Compose, PostgreSQL18.6, два CHR RouterOS7.24.5. Backend/frontend `ux-peak191`; production lab использует AUTH_REQUIRED=false. Подписанные JWT/RBAC проверялись в изолированных процессах. Все собственные объекты112 удалены, исходные13 коллекций×2 (включая logging/certificates/files/routes) проверены; пароли не менялись.
|
||||
Стенд: Debian13/Compose, PostgreSQL18.6, два CHR RouterOS7.24.5. Backend `ux-peak193`, frontend `ux-peak191`; production lab использует AUTH_REQUIRED=false. Подписанные JWT/RBAC проверялись в изолированных процессах. Все собственные объекты112 удалены, исходные13 коллекций×2 (включая logging/certificates/files/routes) проверены; пароли не менялись.
|
||||
|
||||
| Раздел | Подтверждено | Осталось / условие завершения |
|
||||
| --- | --- | --- |
|
||||
@@ -26,7 +26,7 @@
|
||||
|
||||
## Следующая последовательность — 2026-10-13
|
||||
|
||||
1. **191 — временная агрегация пиков:** исправить reproducer200→100Mbps, проверить confidence несовпадающих timestamps и missing parts. Baseline готов, исправление не принято.
|
||||
1. **192 — общая регрессия:** завершить полный E2E1286, разобрать ошибки; backend24 профиля/отдельные SQL controls и frontend59 test files уже проверены.191 temporal peak и193 request cache приняты, runtime backend193/frontend191.
|
||||
2. **Профильный контроль:** проверить изменённые readers/API/UI и актуальный runtime; полную регрессию выполнить один раз после согласованного завершения доработок.
|
||||
3. **Внешние зависимости:** Portal issuer/login/revoke, Telegram bot/chat/разрешённое сообщение, клиентские ОС, независимые WAN/public IPv6 и scale/multi-instance — отдельные группы по таблице выше. Ограничения текущего стенда не превращать в обещание приёмки всех конфигураций.
|
||||
|
||||
@@ -1223,10 +1223,22 @@ Unit проверил partial high point → последующая complete0 wa
|
||||
|
||||
Backend build и frontend TypeScript passed. Все77 уникальных E2E трафика прошли1.6m; начальные4 focused cases22.4s входят в77 и повторно не считаются. Production backend/frontend build passed; source manifests совпали461 backend+524 frontend файлов,1040 compiled backend artifacts совпали. Runtime backend/frontend ux-peak191, PostgreSQL healthy; frontend healthcheck отсутствует, работа подтверждена HTTP/browser. До backend rollout новый frontend принят с backend190. Actual API200 и fresh measurements обоих CHR, live UI1440/320 без page errors/overflow. Native конфигурация/пароли не менялись, messages0.
|
||||
|
||||
Протоколы: [SQL](ux-ui/acceptance/traffic-peak191-sql191-result.json), [source](ux-ui/acceptance/traffic-peak191-source191-result.json), [compiled](ux-ui/acceptance/traffic-peak191-compiled191-result.json), [runtime](ux-ui/acceptance/traffic-peak191-runtime191-result.json), [API](ux-ui/acceptance/traffic-peak191-peak191-api-result.json), [E2E](ux-ui/acceptance/traffic-peak-e2e-2026-10-13.json), [interop](ux-ui/acceptance/traffic-peak-interop-2026-10-13.json), [live UI](ux-ui/acceptance/traffic-peak-deployed-2026-10-13.json).
|
||||
Протоколы: [SQL](ux-ui/acceptance/traffic-peak191-sql191-result.json), [source](ux-ui/acceptance/traffic-peak191-source191-result.json), [compiled](ux-ui/acceptance/traffic-peak191-compiled191-result.json), [runtime](ux-ui/acceptance/traffic-peak191-runtime191-result.json), [API](ux-ui/acceptance/traffic-peak191-peak191-api-result.json), [E2E](ux-ui/acceptance/traffic-peak-e2e-2026-10-13.json), [interop](ux-ui/acceptance/traffic-peak-interop-2026-10-13.json), [live UI](ux-ui/acceptance/traffic-aggregate-peak-deployed-2026-10-13.json).
|
||||
|
||||
| Референс | Схема |
|
||||
| --- | --- |
|
||||
| [ReUI Stats12](https://reui.io/preview/base/stats-12?ref=mcp) | Совпадающие интервалы всех привязок → подтверждённая сумма → максимум периода; нет совпадения → «—», объём сохранён |
|
||||
|
||||
Следующий192: одна согласованная общая backend-регрессия; фиксировать реальные skipped/external ветки отдельно. Последующий объём определяется результатом этой проверки и матрицей внешней приёмки. Portal/Telegram/client OS/multi-WAN/scale не приняты по fixture-тестам.12.5 открыта.
|
||||
|
||||
## 12.5.193 — трафик пользователей: одно чтение истории общего сервера (2026-10-13)
|
||||
|
||||
Устранены повторные одновременные SELECT истории при Promise.all пользователей. Cache раньше заполнялся только после await, поэтому100 пользователей с общим сервером успевали начать100 независимых чтений. Теперь Promise сохраняется перед await, потребители используют одну выборку этого сервера в рамках текущего запроса. Cache не сохраняется между запросами/периодами; другой serverId читает собственные данные. Ошибка распространяется как прежде, следующий запрос выполняет новое чтение и восстанавливается. Это не глобальный cache и не обещание транзакционно согласованного snapshot всех серверов/каталога.
|
||||
|
||||
Изменён traffic-users.ts, добавлен traffic-users-cache.test.ts в профиль traffic-rate. Проверка выполняет actual function body из исходника с подменой DB boundaries:100 concurrent consumers →1 server history read, unchanged1024bytes/user, новый запрос →новое чтение, другая serverId →отдельная выборка, failure/recovery. Это подтверждение call count алгоритма, не production SQL benchmark. Реальный профиль PostgreSQL/API прошёл все71 SQL cases41959ms без unavailable skip, включая100 bindings/user, volume/temporal peak/source/freshness. Собственные DB/role/container удалены.
|
||||
|
||||
Backend build passed. Production backend ux-peak193/version1.0.0-test.peak193 развёрнут, frontend ux-peak191 сохранён.462 backend source files и1040 compiled artifacts совпали. Frontend не пересобирался; его источник/production bundle остаются подтверждёнными191. Backend/PG healthy, frontend HTTP/browser passed. Actual API200 и current measurements обоих CHR, live UI1440/320 без page errors/overflow. Native конфигурация и пароли не менялись, messages0.
|
||||
|
||||
Протоколы: [cache](ux-ui/acceptance/traffic-users-cache-2026-10-13.json), [SQL](ux-ui/acceptance/traffic-users193-sql193-result.json), [source](ux-ui/acceptance/traffic-users193-source193-result.json), [compiled](ux-ui/acceptance/traffic-users193-compiled193-result.json), [runtime](ux-ui/acceptance/traffic-users193-runtime193-result.json), [API](ux-ui/acceptance/traffic-users193-peak193-api-result.json), [live UI](ux-ui/acceptance/traffic-users-cache-deployed-2026-10-13.json).
|
||||
|
||||
Общая регрессия192 начата на backend191; её24 backend профиля passed, текущий cache193 отдельно принят полным traffic-rate профилем. Не повторять общие неизменённые разделы. Полный браузерный прогон1286 ещё выполняется — не считать его завершённым. Исправлена ссылка live UI191: его evidence теперь хранится отдельно от исторического190, исходный протокол190 восстановлен. Следующий шаг — завершить192, разобрать ошибки полного E2E и восстановить только снимки текущего тестового запуска с сохранением8 исходно изменённых пользовательских PNG. Затем multi-instance/scale и внешние группы матрицы.12.5 открыта.
|
||||
+14
-2
@@ -1,6 +1,6 @@
|
||||
# Этап 12: итоговая приёмка UX/UI
|
||||
|
||||
Актуальное продолжение 2026-10-13: завершён191 — общий пик привязок по совпадающим подтверждённым интервалам; backend/frontend ux-peak191 развёрнуты. ownSQL71/41228ms, E2E77/1.6m, source985/compiled1040/API/live UI2 passed. Начата192 — общая backend-регрессия в отдельной временной БД.12.5 открыта.
|
||||
Актуальное продолжение 2026-10-13: завершены191 и193 — общий пик подтверждённых интервалов и одно чтение истории сервера на запрос пользователей. Runtime backend ux-peak193/frontend ux-peak191 healthy/API/live UI2 passed.192: backend24 профиля passed321237ms; отдельные Monthly SQL/IPv6 UDP-worker-SQL/Ping replay passed, frontend59 test files accepted after corrected stale assertion; полный E2E1286 ещё выполняется.12.5 открыта.
|
||||
|
||||
План: [ux-ui-plan.md](ux-ui-plan.md). Фактические результаты: [ux-ui-progress.md](ux-ui-progress.md). Подготовлен после сводных проверок 11Б; завершение каждого блока требует локального коммита без push.
|
||||
|
||||
@@ -3612,10 +3612,22 @@ Unit проверил partial high point → последующая complete0 wa
|
||||
|
||||
Backend build и frontend TypeScript passed. Все77 уникальных E2E трафика прошли1.6m; начальные4 focused cases22.4s входят в77 и повторно не считаются. Production backend/frontend build passed; source manifests совпали461 backend+524 frontend файлов,1040 compiled backend artifacts совпали. Runtime backend/frontend ux-peak191, PostgreSQL healthy; frontend healthcheck отсутствует, работа подтверждена HTTP/browser. До backend rollout новый frontend принят с backend190. Actual API200 и fresh measurements обоих CHR, live UI1440/320 без page errors/overflow. Native конфигурация/пароли не менялись, messages0.
|
||||
|
||||
Протоколы: [SQL](ux-ui/acceptance/traffic-peak191-sql191-result.json), [source](ux-ui/acceptance/traffic-peak191-source191-result.json), [compiled](ux-ui/acceptance/traffic-peak191-compiled191-result.json), [runtime](ux-ui/acceptance/traffic-peak191-runtime191-result.json), [API](ux-ui/acceptance/traffic-peak191-peak191-api-result.json), [E2E](ux-ui/acceptance/traffic-peak-e2e-2026-10-13.json), [interop](ux-ui/acceptance/traffic-peak-interop-2026-10-13.json), [live UI](ux-ui/acceptance/traffic-peak-deployed-2026-10-13.json).
|
||||
Протоколы: [SQL](ux-ui/acceptance/traffic-peak191-sql191-result.json), [source](ux-ui/acceptance/traffic-peak191-source191-result.json), [compiled](ux-ui/acceptance/traffic-peak191-compiled191-result.json), [runtime](ux-ui/acceptance/traffic-peak191-runtime191-result.json), [API](ux-ui/acceptance/traffic-peak191-peak191-api-result.json), [E2E](ux-ui/acceptance/traffic-peak-e2e-2026-10-13.json), [interop](ux-ui/acceptance/traffic-peak-interop-2026-10-13.json), [live UI](ux-ui/acceptance/traffic-aggregate-peak-deployed-2026-10-13.json).
|
||||
|
||||
| Референс | Схема |
|
||||
| --- | --- |
|
||||
| [ReUI Stats12](https://reui.io/preview/base/stats-12?ref=mcp) | Совпадающие интервалы всех привязок → подтверждённая сумма → максимум периода; нет совпадения → «—», объём сохранён |
|
||||
|
||||
Следующий192: одна согласованная общая backend-регрессия; фиксировать реальные skipped/external ветки отдельно. Последующий объём определяется результатом этой проверки и матрицей внешней приёмки. Portal/Telegram/client OS/multi-WAN/scale не приняты по fixture-тестам.12.5 открыта.
|
||||
|
||||
## 12.5.193 — трафик пользователей: одно чтение истории общего сервера (2026-10-13)
|
||||
|
||||
Устранены повторные одновременные SELECT истории при Promise.all пользователей. Cache раньше заполнялся только после await, поэтому100 пользователей с общим сервером успевали начать100 независимых чтений. Теперь Promise сохраняется перед await, потребители используют одну выборку этого сервера в рамках текущего запроса. Cache не сохраняется между запросами/периодами; другой serverId читает собственные данные. Ошибка распространяется как прежде, следующий запрос выполняет новое чтение и восстанавливается. Это не глобальный cache и не обещание транзакционно согласованного snapshot всех серверов/каталога.
|
||||
|
||||
Изменён traffic-users.ts, добавлен traffic-users-cache.test.ts в профиль traffic-rate. Проверка выполняет actual function body из исходника с подменой DB boundaries:100 concurrent consumers →1 server history read, unchanged1024bytes/user, новый запрос →новое чтение, другая serverId →отдельная выборка, failure/recovery. Это подтверждение call count алгоритма, не production SQL benchmark. Реальный профиль PostgreSQL/API прошёл все71 SQL cases41959ms без unavailable skip, включая100 bindings/user, volume/temporal peak/source/freshness. Собственные DB/role/container удалены.
|
||||
|
||||
Backend build passed. Production backend ux-peak193/version1.0.0-test.peak193 развёрнут, frontend ux-peak191 сохранён.462 backend source files и1040 compiled artifacts совпали. Frontend не пересобирался; его источник/production bundle остаются подтверждёнными191. Backend/PG healthy, frontend HTTP/browser passed. Actual API200 и current measurements обоих CHR, live UI1440/320 без page errors/overflow. Native конфигурация и пароли не менялись, messages0.
|
||||
|
||||
Протоколы: [cache](ux-ui/acceptance/traffic-users-cache-2026-10-13.json), [SQL](ux-ui/acceptance/traffic-users193-sql193-result.json), [source](ux-ui/acceptance/traffic-users193-source193-result.json), [compiled](ux-ui/acceptance/traffic-users193-compiled193-result.json), [runtime](ux-ui/acceptance/traffic-users193-runtime193-result.json), [API](ux-ui/acceptance/traffic-users193-peak193-api-result.json), [live UI](ux-ui/acceptance/traffic-users-cache-deployed-2026-10-13.json).
|
||||
|
||||
Общая регрессия192 начата на backend191; её24 backend профиля passed, текущий cache193 отдельно принят полным traffic-rate профилем. Не повторять общие неизменённые разделы. Полный браузерный прогон1286 ещё выполняется — не считать его завершённым. Исправлена ссылка live UI191: его evidence теперь хранится отдельно от исторического190, исходный протокол190 восстановлен. Следующий шаг — завершить192, разобрать ошибки полного E2E и восстановить только снимки текущего тестового запуска с сохранением8 исходно изменённых пользовательских PNG. Затем multi-instance/scale и внешние группы матрицы.12.5 открыта.
|
||||
@@ -1,6 +1,6 @@
|
||||
# Тестовый сервер UX/UI — 2026-10-10
|
||||
|
||||
Актуальное продолжение 2026-10-13: завершён191 — общий пик привязок по совпадающим подтверждённым интервалам; backend/frontend ux-peak191 развёрнуты. ownSQL71/41228ms, E2E77/1.6m, source985/compiled1040/API/live UI2 passed. Начата192 — общая backend-регрессия в отдельной временной БД.12.5 открыта.
|
||||
Актуальное продолжение 2026-10-13: завершены191 и193 — общий пик подтверждённых интервалов и одно чтение истории сервера на запрос пользователей. Runtime backend ux-peak193/frontend ux-peak191 healthy/API/live UI2 passed.192: backend24 профиля passed321237ms; отдельные Monthly SQL/IPv6 UDP-worker-SQL/Ping replay passed, frontend59 test files accepted after corrected stale assertion; полный E2E1286 ещё выполняется.12.5 открыта.
|
||||
|
||||
| Параметр | Проверенное состояние |
|
||||
| --- | --- |
|
||||
@@ -708,7 +708,7 @@ flowchart LR
|
||||
|
||||
## 12.5.77 — основной блок IPsec (2026-10-09)
|
||||
|
||||
Актуальное продолжение 2026-10-13: завершён191 — общий пик привязок по совпадающим подтверждённым интервалам; backend/frontend ux-peak191 развёрнуты. ownSQL71/41228ms, E2E77/1.6m, source985/compiled1040/API/live UI2 passed. Начата192 — общая backend-регрессия в отдельной временной БД.12.5 открыта.
|
||||
Актуальное продолжение 2026-10-13: завершены191 и193 — общий пик подтверждённых интервалов и одно чтение истории сервера на запрос пользователей. Runtime backend ux-peak193/frontend ux-peak191 healthy/API/live UI2 passed.192: backend24 профиля passed321237ms; отдельные Monthly SQL/IPv6 UDP-worker-SQL/Ping replay passed, frontend59 test files accepted after corrected stale assertion; полный E2E1286 ещё выполняется.12.5 открыта.
|
||||
|
||||
Подробный объём, протоколы, схема и ограничения: [12.5.77 в журнале](ux-ui-progress.md).
|
||||
|
||||
@@ -2038,10 +2038,22 @@ Unit проверил partial high point → последующая complete0 wa
|
||||
|
||||
Backend build и frontend TypeScript passed. Все77 уникальных E2E трафика прошли1.6m; начальные4 focused cases22.4s входят в77 и повторно не считаются. Production backend/frontend build passed; source manifests совпали461 backend+524 frontend файлов,1040 compiled backend artifacts совпали. Runtime backend/frontend ux-peak191, PostgreSQL healthy; frontend healthcheck отсутствует, работа подтверждена HTTP/browser. До backend rollout новый frontend принят с backend190. Actual API200 и fresh measurements обоих CHR, live UI1440/320 без page errors/overflow. Native конфигурация/пароли не менялись, messages0.
|
||||
|
||||
Протоколы: [SQL](ux-ui/acceptance/traffic-peak191-sql191-result.json), [source](ux-ui/acceptance/traffic-peak191-source191-result.json), [compiled](ux-ui/acceptance/traffic-peak191-compiled191-result.json), [runtime](ux-ui/acceptance/traffic-peak191-runtime191-result.json), [API](ux-ui/acceptance/traffic-peak191-peak191-api-result.json), [E2E](ux-ui/acceptance/traffic-peak-e2e-2026-10-13.json), [interop](ux-ui/acceptance/traffic-peak-interop-2026-10-13.json), [live UI](ux-ui/acceptance/traffic-peak-deployed-2026-10-13.json).
|
||||
Протоколы: [SQL](ux-ui/acceptance/traffic-peak191-sql191-result.json), [source](ux-ui/acceptance/traffic-peak191-source191-result.json), [compiled](ux-ui/acceptance/traffic-peak191-compiled191-result.json), [runtime](ux-ui/acceptance/traffic-peak191-runtime191-result.json), [API](ux-ui/acceptance/traffic-peak191-peak191-api-result.json), [E2E](ux-ui/acceptance/traffic-peak-e2e-2026-10-13.json), [interop](ux-ui/acceptance/traffic-peak-interop-2026-10-13.json), [live UI](ux-ui/acceptance/traffic-aggregate-peak-deployed-2026-10-13.json).
|
||||
|
||||
| Референс | Схема |
|
||||
| --- | --- |
|
||||
| [ReUI Stats12](https://reui.io/preview/base/stats-12?ref=mcp) | Совпадающие интервалы всех привязок → подтверждённая сумма → максимум периода; нет совпадения → «—», объём сохранён |
|
||||
|
||||
Следующий192: одна согласованная общая backend-регрессия; фиксировать реальные skipped/external ветки отдельно. Последующий объём определяется результатом этой проверки и матрицей внешней приёмки. Portal/Telegram/client OS/multi-WAN/scale не приняты по fixture-тестам.12.5 открыта.
|
||||
|
||||
## 12.5.193 — трафик пользователей: одно чтение истории общего сервера (2026-10-13)
|
||||
|
||||
Устранены повторные одновременные SELECT истории при Promise.all пользователей. Cache раньше заполнялся только после await, поэтому100 пользователей с общим сервером успевали начать100 независимых чтений. Теперь Promise сохраняется перед await, потребители используют одну выборку этого сервера в рамках текущего запроса. Cache не сохраняется между запросами/периодами; другой serverId читает собственные данные. Ошибка распространяется как прежде, следующий запрос выполняет новое чтение и восстанавливается. Это не глобальный cache и не обещание транзакционно согласованного snapshot всех серверов/каталога.
|
||||
|
||||
Изменён traffic-users.ts, добавлен traffic-users-cache.test.ts в профиль traffic-rate. Проверка выполняет actual function body из исходника с подменой DB boundaries:100 concurrent consumers →1 server history read, unchanged1024bytes/user, новый запрос →новое чтение, другая serverId →отдельная выборка, failure/recovery. Это подтверждение call count алгоритма, не production SQL benchmark. Реальный профиль PostgreSQL/API прошёл все71 SQL cases41959ms без unavailable skip, включая100 bindings/user, volume/temporal peak/source/freshness. Собственные DB/role/container удалены.
|
||||
|
||||
Backend build passed. Production backend ux-peak193/version1.0.0-test.peak193 развёрнут, frontend ux-peak191 сохранён.462 backend source files и1040 compiled artifacts совпали. Frontend не пересобирался; его источник/production bundle остаются подтверждёнными191. Backend/PG healthy, frontend HTTP/browser passed. Actual API200 и current measurements обоих CHR, live UI1440/320 без page errors/overflow. Native конфигурация и пароли не менялись, messages0.
|
||||
|
||||
Протоколы: [cache](ux-ui/acceptance/traffic-users-cache-2026-10-13.json), [SQL](ux-ui/acceptance/traffic-users193-sql193-result.json), [source](ux-ui/acceptance/traffic-users193-source193-result.json), [compiled](ux-ui/acceptance/traffic-users193-compiled193-result.json), [runtime](ux-ui/acceptance/traffic-users193-runtime193-result.json), [API](ux-ui/acceptance/traffic-users193-peak193-api-result.json), [live UI](ux-ui/acceptance/traffic-users-cache-deployed-2026-10-13.json).
|
||||
|
||||
Общая регрессия192 начата на backend191; её24 backend профиля passed, текущий cache193 отдельно принят полным traffic-rate профилем. Не повторять общие неизменённые разделы. Полный браузерный прогон1286 ещё выполняется — не считать его завершённым. Исправлена ссылка live UI191: его evidence теперь хранится отдельно от исторического190, исходный протокол190 восстановлен. Следующий шаг — завершить192, разобрать ошибки полного E2E и восстановить только снимки текущего тестового запуска с сохранением8 исходно изменённых пользовательских PNG. Затем multi-instance/scale и внешние группы матрицы.12.5 открыта.
|
||||
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"date": "2026-10-13",
|
||||
"block": "12.5.191",
|
||||
"runtime": {
|
||||
"backend": "ux-peak191",
|
||||
"frontend": "ux-peak191"
|
||||
},
|
||||
"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"
|
||||
]
|
||||
}
|
||||
@@ -1,9 +1,9 @@
|
||||
{
|
||||
"date": "2026-10-13",
|
||||
"block": "12.5.191",
|
||||
"block": "12.5.190",
|
||||
"runtime": {
|
||||
"backend": "ux-peak191",
|
||||
"frontend": "ux-peak191"
|
||||
"backend": "ux-peak190",
|
||||
"frontend": "ux-warning183"
|
||||
},
|
||||
"apis": [
|
||||
{
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"date": "2026-10-13",
|
||||
"block": "12.5.193",
|
||||
"testedActualFunction": true,
|
||||
"concurrentUsers": 100,
|
||||
"sharedServerReads": 1,
|
||||
"requestScopedCache": true,
|
||||
"separateServerReads": true,
|
||||
"errorPropagates": true,
|
||||
"nextRequestRecovers": true,
|
||||
"bounds": [
|
||||
"Function tested with real source and replaced SQL boundary; counts are not a production PostgreSQL benchmark",
|
||||
"Actual PostgreSQL/API traffic profile passed separately"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"date": "2026-10-13",
|
||||
"block": "12.5.193",
|
||||
"runtime": {
|
||||
"backend": "ux-peak193",
|
||||
"frontend": "ux-peak191"
|
||||
},
|
||||
"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"
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"date": "2026-10-13",
|
||||
"block": "12.5.193",
|
||||
"version": "1.0.0-test.peak193",
|
||||
"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.012681146152317524,
|
||||
"txTotalGiB": 0.0009067924693226814,
|
||||
"currentState": "current"
|
||||
},
|
||||
{
|
||||
"sourceId": "2",
|
||||
"volumeUnit": "GiB",
|
||||
"rxTotalGiB": 0.0011999299749732018,
|
||||
"txTotalGiB": 0.0014469381421804428,
|
||||
"currentState": "current"
|
||||
}
|
||||
],
|
||||
"newRouterOSCommands": 0,
|
||||
"passwordChanges": 0,
|
||||
"messages": 0
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"date": "2026-10-13",
|
||||
"block": "12.5.193",
|
||||
"secretEnvCopied": false,
|
||||
"rollbackTags": {
|
||||
"MMAPP_IMAGE_TAG": "ux-peak191",
|
||||
"BACKEND_IMAGE_TAG": "ux-peak191"
|
||||
},
|
||||
"services": {
|
||||
"backend": {
|
||||
"image": "mmapp-test/backend:ux-peak193",
|
||||
"imageId": "sha256:f354f99c1ee3b67899f139cdc2d0a1b492aaffc8da9d3abdd1b3bfe5b93d486f",
|
||||
"state": "running",
|
||||
"health": "healthy",
|
||||
"matchedVerifiedImage": true
|
||||
},
|
||||
"frontend": {
|
||||
"image": "mmapp-test/frontend:ux-peak191",
|
||||
"imageId": "sha256:1d9f85dbb5c791f09dad2863041d0fae5a291b02f5e73a5e96185a7866c673c7",
|
||||
"state": "running",
|
||||
"health": null,
|
||||
"matchedVerifiedImage": true
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"date": "2026-10-13",
|
||||
"block": "12.5.193",
|
||||
"matched": {
|
||||
"backend": 462,
|
||||
"frontend": 0
|
||||
},
|
||||
"different": [],
|
||||
"missing": []
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"date": "2026-10-13",
|
||||
"block": "12.5.193",
|
||||
"passed": true,
|
||||
"profiles": [
|
||||
{
|
||||
"date": "2026-10-13",
|
||||
"block": "12.5.193",
|
||||
"database": "mm_accept_166_1791875479842",
|
||||
"scope": "ephemeral role and precreated owned database; no copied production credentials",
|
||||
"tests": [
|
||||
{
|
||||
"command": "npm --prefix backend run test:traffic-rate",
|
||||
"passed": true,
|
||||
"durationMs": 41959,
|
||||
"ownedTrafficSqlCases": 9,
|
||||
"ownedHistorySqlCases": 14,
|
||||
"ownedLiveSqlCases": 10,
|
||||
"ownedVolumeSqlCases": 17,
|
||||
"ownedStatusSqlCases": 21,
|
||||
"postgresUnavailableSkip": false
|
||||
}
|
||||
],
|
||||
"scopedRoleVerified": true,
|
||||
"passed": true,
|
||||
"databaseRemoved": true,
|
||||
"roleRemoved": true,
|
||||
"testContainerRemoved": true
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in new issue
Block a user