From 044002e7eb581df4de4303dd188e62ea564df069 Mon Sep 17 00:00:00 2001 From: Denozordec Date: Wed, 14 Oct 2026 15:14:51 +0700 Subject: [PATCH] =?UTF-8?q?chore(test):=20=D1=83=D1=82=D0=BE=D1=87=D0=BD?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D0=BF=D1=80=D0=B5=D0=B4=D0=BF=D0=BE=D1=81?= =?UTF-8?q?=D1=8B=D0=BB=D0=BA=D0=B8=20=D0=B2=D0=BD=D0=B5=D1=88=D0=BD=D0=B8?= =?UTF-8?q?=D1=85=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=20=D0=B8=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B5=D1=80=D0=B8=D1=82=D1=8C=20=D1=80=D0=B5=D0=BB?= =?UTF-8?q?=D0=B8=D0=B7=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../acceptance/external-jobs-availability.mjs | 34 +++++ docs/ux-ui-external-acceptance.md | 16 +- docs/ux-ui-plan.md | 16 +- docs/ux-ui-progress.md | 16 +- docs/ux-ui-remaining-acceptance.md | 24 ++- docs/ux-ui-stage-12.md | 16 +- docs/ux-ui-test-server.md | 16 +- .../external-jobs243-availability.json | 143 ++++++++++++++++++ .../acceptance/external-jobs243-live-ui.json | 37 +++++ docs/ux-ui/acceptance/release243-dry-run.json | 13 ++ 10 files changed, 321 insertions(+), 10 deletions(-) create mode 100644 backend/scripts/acceptance/external-jobs-availability.mjs create mode 100644 docs/ux-ui/acceptance/external-jobs243-availability.json create mode 100644 docs/ux-ui/acceptance/external-jobs243-live-ui.json create mode 100644 docs/ux-ui/acceptance/release243-dry-run.json diff --git a/backend/scripts/acceptance/external-jobs-availability.mjs b/backend/scripts/acceptance/external-jobs-availability.mjs new file mode 100644 index 00000000..285e9ad0 --- /dev/null +++ b/backend/scripts/acceptance/external-jobs-availability.mjs @@ -0,0 +1,34 @@ +import assert from 'node:assert/strict'; +import fs from 'node:fs'; +import { createHash } from 'node:crypto'; +const { pool } = await import('/app/backend/dist/db/index.js'); +const { MikrotikClient } = await import('/app/backend/dist/services/mikrotik.js'); +const { getAcmeSettingsPublic } = await import('/app/backend/dist/services/certificates-service.js'); +const rows = (await pool.query("SELECT * FROM servers WHERE host IN ('194.226.121.150','104.165.244.7') ORDER BY host")).rows; +assert.equal(rows.length, 2); assert(rows.every(s => s.enabled && s.port === 80 && !s.use_ssl)); +const report = { date: '2026-10-14', block: '12.5.243', scope: 'Read-only availability, not container lifecycle or ACME issuance', hosts: [], requests: [], routerosWrites: 0, databaseWrites: 0, dnsWrites: 0, passwordChanges: 0 }; +async function read(client, host, endpoint) { + try { const result = await client.get(endpoint, 8000); report.requests.push({ host, path: endpoint, status: 200 }); return result; } + catch (e) { report.requests.push({ host, path: endpoint, status: e.statusCode ?? null, errorName: e.name, errorBodySha256: e.body ? createHash('sha256').update(e.body).digest('hex') : null }); return undefined; } +} +try { + for (const server of rows) { + const client = new MikrotikClient({ host: server.host, port: 80, useSsl: false, verifySsl: false, username: server.username, password: server.password }); + const packages = await read(client, server.host, '/system/package'); + const resource = await read(client, server.host, '/system/resource'); + const mode = await read(client, server.host, '/system/device-mode'); + const disks = await read(client, server.host, '/disk'); + const containers = await read(client, server.host, '/container'); + const m = Array.isArray(mode) ? mode[0] : mode; + report.hosts.push({ host: server.host, packages: Array.isArray(packages) ? packages.map(p => ({ name: p.name, version: p.version, disabled: p.disabled })) : null, resource: resource ? { version: resource.version, architecture: resource['architecture-name'], boardName: resource['board-name'], freeHddSpace: resource['free-hdd-space'], totalHddSpace: resource['total-hdd-space'], freeMemory: resource['free-memory'] } : null, deviceMode: m ? { mode: m.mode ?? null, container: m.container ?? null, flagged: m.flagged ?? null } : null, disks: Array.isArray(disks) ? disks.length : null, containers: Array.isArray(containers) ? { count: containers.length, statuses: containers.map(c => c.status ?? null) } : null }); + } + const acme = await getAcmeSettingsPublic(); + report.acme = { tokenConfigured: acme.tokenConfigured, defaultZoneConfigured: Boolean(acme.defaultZoneId), directoryHost: null, directoryStatus: null }; + const directory = new URL(acme.directoryUrl); + assert(!directory.username && !directory.password); + report.acme.directoryHost = directory.hostname; + if (directory.protocol === 'https:' && ['acme-v02.api.letsencrypt.org','acme-staging-v02.api.letsencrypt.org'].includes(directory.hostname) && directory.pathname === '/directory') { + const r = await fetch(directory, { signal: AbortSignal.timeout(8000) }); report.acme.directoryStatus = r.status; + if (r.ok) { const data = await r.json(); report.acme.directoryKeys = Object.keys(data).sort(); } + } +} finally { await pool.end(); fs.writeFileSync('/checks/external-jobs243-availability.json', JSON.stringify(report, null, 2) + '\n'); console.log(JSON.stringify(report)); } diff --git a/docs/ux-ui-external-acceptance.md b/docs/ux-ui-external-acceptance.md index c65c8a44..75cf6572 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:242 — GeoIP mirror job принят в own SQL/files и реальном mirror:12 fetches200/304, две валидные MMDB12,380,575bytes, missing/corrupt recovery, concurrent409, partial error сохраняетlastSuccessAt. Исправлены false304/eager gate/body deadline; download120s/64MiB, HTTP boundary tests и15E2E прошли. Backend ux-geoip242 healthy, frontend ux-backups237 image/container unchanged; live readUI1440/320 passed. Следующий243 — аудит доступных container/certificate/release jobs и актуальных внешних ограничений. Этап12.5 открыт. +Актуальное продолжение 2026-10-14:243 — read-only audit: оба CHR7.24.5/x86_64 доступны, packages routeros/option, device-mode.container=true, /container400 и UIunsupported. Cloudflare token/zone не настроены, ACME directory200 не являетсяissuance. Gitea workflow публикуетimages/releases; local release dry-run valid, push/APIpublish0. Portal live containers/releases4views passed. Backend ux-geoip242/frontend ux-backups237. Следующий244 — подготовка реальной контейнерной приёмки с точным пакетом и отдельным согласованием перезапуска. Этап12.5 открыт. IPsec78: реальный PSK responder established, mode-config198.18.78.10 и online=true подтверждены API; точные собственные объекты удалены. Сертификатный/DN online, late failure и history restore остаются открытыми. [Отчёт](ux-ui/acceptance/ipsec-mode-config-2026-10-09.json), [журнал](ux-ui-progress.md). @@ -18,6 +18,20 @@ OSPF84: real GRE Full adjacency/private routes/Ping3/3 и4 live PC/320px URL/bro BFD85: Up/Full/own route/Ping,4 live UI и loss/withdrawal/recovery приняты; exact own cleanup8 коллекций×2 passed. Withdrawal5,245ms не подтверждает sub-second BFD timing; этот вопрос открыт. Runtime routing83 без новой сборки. [Отчёт](ux-ui/acceptance/ospf-bfd-loss-2026-10-09.json). +## 12.5.243 — реальные предпосылки контейнеров, ACME и релизов (2026-10-14) + +Десять direct read-only RouterOS запросов:system/package/resource/device-mode/disk/container ×2CHR. Оба доступны7.24.5 stable/x86_64, installed routeros иoption, container feature=true/flagged=false, freeHDD около10GiB/freeRAM около0.8GiB. /container400 на обоих; пакет с именемcontainer не обнаружен. Публичный отчёт сохраняет status/error SHA256, неcredentials/полные error bodies. Приложение GET containers/state200 классифицирует обаunsupported. Это доступность текущего набора функций, а не доказательство отсутствия контейнеров по пустому snapshot или успешного lifecycle. + +Vendor [Container](https://help.mikrotik.com/docs/spaces/ROS/pages/84901929/Container) и [Packages](https://help.mikrotik.com/docs/spaces/ROS/pages/40992872/Packages) указывают требуемый container package. Для positive lifecycle нужны проверенный пакет текущей версии и контролируемая подготовка CHR; установка/перезапуск не выполнены. Новые manual URLs были недоступны web tool; использованы доступные официальные vendor pages, без вывода о совместимости конкретного будущего image по памяти. + +ACME public settings:tokenConfigured=false/defaultZoneConfigured=false; Let’s Encrypt production directory GET200 с ожидаемыми endpoints. Это неDNS challenge, issuance, renew или deployment сертификата. Нужны явный test-domain/Cloudflare scoped token/право на временныеTXT и staging ACME. Секреты и зоны не выдумывались, DNS/account/certificate writes0. + +Gitea — pipeline.gitea/workflows/docker.yml с push main/workflow_dispatch, registry uploads/releases/webhook; соответствующего backend polling job нет. По поручениюno push публикация не запускалась. compute-release.mjs отработал в ignored tmp output, candidate1.47.7/schema valid/current-candidate notes coherent, tagsCreated/pushes/GiteaAPIwrites/registryUploads0. Candidate не является выпущенной версией и не меняетpackage.json/publicmanifest. Отдельно real Portal UIcontainers/releases1440/320 passed:unsupported states, labversion1.0.0-test.backups237, globaloverflow/pageerrors0/non-auth APIwrites0. Первичный UI счётчик включал2 login POST; исправлено разделение auth и business operations, не приложение. + +node --check availability helper passed; runtime code/images unchanged, профильная регрессия не повторялась без оснований. Два собственных сообщения локальных коммитов239/240 приведены к русскому тексту; author/date/trees/workspace dirty files сохранены, downstream commit IDs изменились, push0. + +Протоколы: [native/ACME availability](ux-ui/acceptance/external-jobs243-availability.json), [live UI](ux-ui/acceptance/external-jobs243-live-ui.json), [release dry-run](ux-ui/acceptance/release243-dry-run.json). Следующий244 готовит конкретный vendor package/artifact для контейнерного lifecycle; применение и перезапуск согласовать отдельно после подготовки. REST root cause, multi-instance, clientOS/WAN/publicIPv6 и границы выпуска остаются по матрице. + ## 12.5.242 — реальный GeoIP mirror job и честное состояние cache (2026-10-14) В collector обнаруженыfalse-success304 при отсутствующей локальной базе (старый тест прямо принимал это), race до acquisition lock из-за await settings и освобождение timeout после headers вместо body. Теперь gate захватывается до первогоawait; concurrent force409/backgroundskip. Conditional ETag отправляется только после проверки локальной MMDB; missing/corrupt cache требует200 полного файла.304 без validated cache — ошибка, неskippedUnchanged. Partial failures сохраняют дату последнего успешного update и предыдущий файл, добавляя lastError. Новая downloadGeoipDatabase держит120s deadline через streaming body, ограничивает declared/chunked file64MiB и закрывает непригодное тело. Базы проходят existing Country/ASN validation до atomic swap; формат/layout ReUI не менялись. diff --git a/docs/ux-ui-plan.md b/docs/ux-ui-plan.md index bab7b941..c2d8e730 100644 --- a/docs/ux-ui-plan.md +++ b/docs/ux-ui-plan.md @@ -1,9 +1,23 @@ # План реализации UX/UI по пятичасовым окнам -Актуальное продолжение 2026-10-14:242 — GeoIP mirror job принят в own SQL/files и реальном mirror:12 fetches200/304, две валидные MMDB12,380,575bytes, missing/corrupt recovery, concurrent409, partial error сохраняетlastSuccessAt. Исправлены false304/eager gate/body deadline; download120s/64MiB, HTTP boundary tests и15E2E прошли. Backend ux-geoip242 healthy, frontend ux-backups237 image/container unchanged; live readUI1440/320 passed. Следующий243 — аудит доступных container/certificate/release jobs и актуальных внешних ограничений. Этап12.5 открыт. +Актуальное продолжение 2026-10-14:243 — read-only audit: оба CHR7.24.5/x86_64 доступны, packages routeros/option, device-mode.container=true, /container400 и UIunsupported. Cloudflare token/zone не настроены, ACME directory200 не являетсяissuance. Gitea workflow публикуетimages/releases; local release dry-run valid, push/APIpublish0. Portal live containers/releases4views passed. Backend ux-geoip242/frontend ux-backups237. Следующий244 — подготовка реальной контейнерной приёмки с точным пакетом и отдельным согласованием перезапуска. Этап12.5 открыт. Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-14. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат. +## 12.5.243 — реальные предпосылки контейнеров, ACME и релизов (2026-10-14) + +Десять direct read-only RouterOS запросов:system/package/resource/device-mode/disk/container ×2CHR. Оба доступны7.24.5 stable/x86_64, installed routeros иoption, container feature=true/flagged=false, freeHDD около10GiB/freeRAM около0.8GiB. /container400 на обоих; пакет с именемcontainer не обнаружен. Публичный отчёт сохраняет status/error SHA256, неcredentials/полные error bodies. Приложение GET containers/state200 классифицирует обаunsupported. Это доступность текущего набора функций, а не доказательство отсутствия контейнеров по пустому snapshot или успешного lifecycle. + +Vendor [Container](https://help.mikrotik.com/docs/spaces/ROS/pages/84901929/Container) и [Packages](https://help.mikrotik.com/docs/spaces/ROS/pages/40992872/Packages) указывают требуемый container package. Для positive lifecycle нужны проверенный пакет текущей версии и контролируемая подготовка CHR; установка/перезапуск не выполнены. Новые manual URLs были недоступны web tool; использованы доступные официальные vendor pages, без вывода о совместимости конкретного будущего image по памяти. + +ACME public settings:tokenConfigured=false/defaultZoneConfigured=false; Let’s Encrypt production directory GET200 с ожидаемыми endpoints. Это неDNS challenge, issuance, renew или deployment сертификата. Нужны явный test-domain/Cloudflare scoped token/право на временныеTXT и staging ACME. Секреты и зоны не выдумывались, DNS/account/certificate writes0. + +Gitea — pipeline.gitea/workflows/docker.yml с push main/workflow_dispatch, registry uploads/releases/webhook; соответствующего backend polling job нет. По поручениюno push публикация не запускалась. compute-release.mjs отработал в ignored tmp output, candidate1.47.7/schema valid/current-candidate notes coherent, tagsCreated/pushes/GiteaAPIwrites/registryUploads0. Candidate не является выпущенной версией и не меняетpackage.json/publicmanifest. Отдельно real Portal UIcontainers/releases1440/320 passed:unsupported states, labversion1.0.0-test.backups237, globaloverflow/pageerrors0/non-auth APIwrites0. Первичный UI счётчик включал2 login POST; исправлено разделение auth и business operations, не приложение. + +node --check availability helper passed; runtime code/images unchanged, профильная регрессия не повторялась без оснований. Два собственных сообщения локальных коммитов239/240 приведены к русскому тексту; author/date/trees/workspace dirty files сохранены, downstream commit IDs изменились, push0. + +Протоколы: [native/ACME availability](ux-ui/acceptance/external-jobs243-availability.json), [live UI](ux-ui/acceptance/external-jobs243-live-ui.json), [release dry-run](ux-ui/acceptance/release243-dry-run.json). Следующий244 готовит конкретный vendor package/artifact для контейнерного lifecycle; применение и перезапуск согласовать отдельно после подготовки. REST root cause, multi-instance, clientOS/WAN/publicIPv6 и границы выпуска остаются по матрице. + ## 12.5.242 — реальный GeoIP mirror job и честное состояние cache (2026-10-14) В collector обнаруженыfalse-success304 при отсутствующей локальной базе (старый тест прямо принимал это), race до acquisition lock из-за await settings и освобождение timeout после headers вместо body. Теперь gate захватывается до первогоawait; concurrent force409/backgroundskip. Conditional ETag отправляется только после проверки локальной MMDB; missing/corrupt cache требует200 полного файла.304 без validated cache — ошибка, неskippedUnchanged. Partial failures сохраняют дату последнего успешного update и предыдущий файл, добавляя lastError. Новая downloadGeoipDatabase держит120s deadline через streaming body, ограничивает declared/chunked file64MiB и закрывает непригодное тело. Базы проходят existing Country/ASN validation до atomic swap; формат/layout ReUI не менялись. diff --git a/docs/ux-ui-progress.md b/docs/ux-ui-progress.md index 51f61ca5..ea18b21c 100644 --- a/docs/ux-ui-progress.md +++ b/docs/ux-ui-progress.md @@ -1,6 +1,6 @@ # UX/UI: журнал реализации -Актуальное продолжение 2026-10-14:242 — GeoIP mirror job принят в own SQL/files и реальном mirror:12 fetches200/304, две валидные MMDB12,380,575bytes, missing/corrupt recovery, concurrent409, partial error сохраняетlastSuccessAt. Исправлены false304/eager gate/body deadline; download120s/64MiB, HTTP boundary tests и15E2E прошли. Backend ux-geoip242 healthy, frontend ux-backups237 image/container unchanged; live readUI1440/320 passed. Следующий243 — аудит доступных container/certificate/release jobs и актуальных внешних ограничений. Этап12.5 открыт. +Актуальное продолжение 2026-10-14:243 — read-only audit: оба CHR7.24.5/x86_64 доступны, packages routeros/option, device-mode.container=true, /container400 и UIunsupported. Cloudflare token/zone не настроены, ACME directory200 не являетсяissuance. Gitea workflow публикуетimages/releases; local release dry-run valid, push/APIpublish0. Portal live containers/releases4views passed. Backend ux-geoip242/frontend ux-backups237. Следующий244 — подготовка реальной контейнерной приёмки с точным пакетом и отдельным согласованием перезапуска. Этап12.5 открыт. Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения. Записи расположены от новых к старым; подробная история этапа12 также сохранена в [ux-ui-stage-12.md](ux-ui-stage-12.md). @@ -38,6 +38,20 @@ | 11Б | Оповещения, сбор данных, интеграции, релизы и настройки | Завершён в границах локальной приёмки 2026-10-03; ограничения и evidence в11Б.7 | | 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка12.3.83 в границах журнала. Внешняя12.5: блоки1–236 завершены в записанных scopes, этап открыт. Runtime backend ux-backup234/frontend ux-routing218; backend25/UI52 и дополнительные SQL/UDP222 прошли. | +## 12.5.243 — реальные предпосылки контейнеров, ACME и релизов (2026-10-14) + +Десять direct read-only RouterOS запросов:system/package/resource/device-mode/disk/container ×2CHR. Оба доступны7.24.5 stable/x86_64, installed routeros иoption, container feature=true/flagged=false, freeHDD около10GiB/freeRAM около0.8GiB. /container400 на обоих; пакет с именемcontainer не обнаружен. Публичный отчёт сохраняет status/error SHA256, неcredentials/полные error bodies. Приложение GET containers/state200 классифицирует обаunsupported. Это доступность текущего набора функций, а не доказательство отсутствия контейнеров по пустому snapshot или успешного lifecycle. + +Vendor [Container](https://help.mikrotik.com/docs/spaces/ROS/pages/84901929/Container) и [Packages](https://help.mikrotik.com/docs/spaces/ROS/pages/40992872/Packages) указывают требуемый container package. Для positive lifecycle нужны проверенный пакет текущей версии и контролируемая подготовка CHR; установка/перезапуск не выполнены. Новые manual URLs были недоступны web tool; использованы доступные официальные vendor pages, без вывода о совместимости конкретного будущего image по памяти. + +ACME public settings:tokenConfigured=false/defaultZoneConfigured=false; Let’s Encrypt production directory GET200 с ожидаемыми endpoints. Это неDNS challenge, issuance, renew или deployment сертификата. Нужны явный test-domain/Cloudflare scoped token/право на временныеTXT и staging ACME. Секреты и зоны не выдумывались, DNS/account/certificate writes0. + +Gitea — pipeline.gitea/workflows/docker.yml с push main/workflow_dispatch, registry uploads/releases/webhook; соответствующего backend polling job нет. По поручениюno push публикация не запускалась. compute-release.mjs отработал в ignored tmp output, candidate1.47.7/schema valid/current-candidate notes coherent, tagsCreated/pushes/GiteaAPIwrites/registryUploads0. Candidate не является выпущенной версией и не меняетpackage.json/publicmanifest. Отдельно real Portal UIcontainers/releases1440/320 passed:unsupported states, labversion1.0.0-test.backups237, globaloverflow/pageerrors0/non-auth APIwrites0. Первичный UI счётчик включал2 login POST; исправлено разделение auth и business operations, не приложение. + +node --check availability helper passed; runtime code/images unchanged, профильная регрессия не повторялась без оснований. Два собственных сообщения локальных коммитов239/240 приведены к русскому тексту; author/date/trees/workspace dirty files сохранены, downstream commit IDs изменились, push0. + +Протоколы: [native/ACME availability](ux-ui/acceptance/external-jobs243-availability.json), [live UI](ux-ui/acceptance/external-jobs243-live-ui.json), [release dry-run](ux-ui/acceptance/release243-dry-run.json). Следующий244 готовит конкретный vendor package/artifact для контейнерного lifecycle; применение и перезапуск согласовать отдельно после подготовки. REST root cause, multi-instance, clientOS/WAN/publicIPv6 и границы выпуска остаются по матрице. + ## 12.5.242 — реальный GeoIP mirror job и честное состояние cache (2026-10-14) В collector обнаруженыfalse-success304 при отсутствующей локальной базе (старый тест прямо принимал это), race до acquisition lock из-за await settings и освобождение timeout после headers вместо body. Теперь gate захватывается до первогоawait; concurrent force409/backgroundskip. Conditional ETag отправляется только после проверки локальной MMDB; missing/corrupt cache требует200 полного файла.304 без validated cache — ошибка, неskippedUnchanged. Partial failures сохраняют дату последнего успешного update и предыдущий файл, добавляя lastError. Новая downloadGeoipDatabase держит120s deadline через streaming body, ограничивает declared/chunked file64MiB и закрывает непригодное тело. Базы проходят existing Country/ASN validation до atomic swap; формат/layout ReUI не менялись. diff --git a/docs/ux-ui-remaining-acceptance.md b/docs/ux-ui-remaining-acceptance.md index 18352811..aa887ba4 100644 --- a/docs/ux-ui-remaining-acceptance.md +++ b/docs/ux-ui-remaining-acceptance.md @@ -1,11 +1,25 @@ # Оставшаяся внешняя приёмка — 2026-10-14 -Актуальное продолжение 2026-10-14:242 — GeoIP mirror job принят в own SQL/files и реальном mirror:12 fetches200/304, две валидные MMDB12,380,575bytes, missing/corrupt recovery, concurrent409, partial error сохраняетlastSuccessAt. Исправлены false304/eager gate/body deadline; download120s/64MiB, HTTP boundary tests и15E2E прошли. Backend ux-geoip242 healthy, frontend ux-backups237 image/container unchanged; live readUI1440/320 passed. Следующий243 — аудит доступных container/certificate/release jobs и актуальных внешних ограничений. Этап12.5 открыт. +Актуальное продолжение 2026-10-14:243 — read-only audit: оба CHR7.24.5/x86_64 доступны, packages routeros/option, device-mode.container=true, /container400 и UIunsupported. Cloudflare token/zone не настроены, ACME directory200 не являетсяissuance. Gitea workflow публикуетimages/releases; local release dry-run valid, push/APIpublish0. Portal live containers/releases4views passed. Backend ux-geoip242/frontend ux-backups237. Следующий244 — подготовка реальной контейнерной приёмки с точным пакетом и отдельным согласованием перезапуска. Этап12.5 открыт. -Это актуальная матрица после 12.5.242. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии. +Это актуальная матрица после 12.5.243. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии. Стенд: Debian13/Compose, PostgreSQL18.6, два CHR RouterOS7.24.5. Backend `ux-geoip242`, frontend `ux-backups237`; production lab с195 использует AUTH_REQUIRED=true и Portal1.3.1. Подписанные JWT/RBAC проверялись в изолированных процессах. Все собственные объекты112 удалены, исходные13 коллекций×2 (включая logging/certificates/files/routes) проверены; пароли не менялись. +## 12.5.243 — реальные предпосылки контейнеров, ACME и релизов (2026-10-14) + +Десять direct read-only RouterOS запросов:system/package/resource/device-mode/disk/container ×2CHR. Оба доступны7.24.5 stable/x86_64, installed routeros иoption, container feature=true/flagged=false, freeHDD около10GiB/freeRAM около0.8GiB. /container400 на обоих; пакет с именемcontainer не обнаружен. Публичный отчёт сохраняет status/error SHA256, неcredentials/полные error bodies. Приложение GET containers/state200 классифицирует обаunsupported. Это доступность текущего набора функций, а не доказательство отсутствия контейнеров по пустому snapshot или успешного lifecycle. + +Vendor [Container](https://help.mikrotik.com/docs/spaces/ROS/pages/84901929/Container) и [Packages](https://help.mikrotik.com/docs/spaces/ROS/pages/40992872/Packages) указывают требуемый container package. Для positive lifecycle нужны проверенный пакет текущей версии и контролируемая подготовка CHR; установка/перезапуск не выполнены. Новые manual URLs были недоступны web tool; использованы доступные официальные vendor pages, без вывода о совместимости конкретного будущего image по памяти. + +ACME public settings:tokenConfigured=false/defaultZoneConfigured=false; Let’s Encrypt production directory GET200 с ожидаемыми endpoints. Это неDNS challenge, issuance, renew или deployment сертификата. Нужны явный test-domain/Cloudflare scoped token/право на временныеTXT и staging ACME. Секреты и зоны не выдумывались, DNS/account/certificate writes0. + +Gitea — pipeline.gitea/workflows/docker.yml с push main/workflow_dispatch, registry uploads/releases/webhook; соответствующего backend polling job нет. По поручениюno push публикация не запускалась. compute-release.mjs отработал в ignored tmp output, candidate1.47.7/schema valid/current-candidate notes coherent, tagsCreated/pushes/GiteaAPIwrites/registryUploads0. Candidate не является выпущенной версией и не меняетpackage.json/publicmanifest. Отдельно real Portal UIcontainers/releases1440/320 passed:unsupported states, labversion1.0.0-test.backups237, globaloverflow/pageerrors0/non-auth APIwrites0. Первичный UI счётчик включал2 login POST; исправлено разделение auth и business operations, не приложение. + +node --check availability helper passed; runtime code/images unchanged, профильная регрессия не повторялась без оснований. Два собственных сообщения локальных коммитов239/240 приведены к русскому тексту; author/date/trees/workspace dirty files сохранены, downstream commit IDs изменились, push0. + +Протоколы: [native/ACME availability](ux-ui/acceptance/external-jobs243-availability.json), [live UI](ux-ui/acceptance/external-jobs243-live-ui.json), [release dry-run](ux-ui/acceptance/release243-dry-run.json). Следующий244 готовит конкретный vendor package/artifact для контейнерного lifecycle; применение и перезапуск согласовать отдельно после подготовки. REST root cause, multi-instance, clientOS/WAN/publicIPv6 и границы выпуска остаются по матрице. + ## 12.5.242 — реальный GeoIP mirror job и честное состояние cache (2026-10-14) В collector обнаруженыfalse-success304 при отсутствующей локальной базе (старый тест прямо принимал это), race до acquisition lock из-за await settings и освобождение timeout после headers вместо body. Теперь gate захватывается до первогоawait; concurrent force409/backgroundskip. Conditional ETag отправляется только после проверки локальной MMDB; missing/corrupt cache требует200 полного файла.304 без validated cache — ошибка, неskippedUnchanged. Partial failures сохраняют дату последнего успешного update и предыдущий файл, добавляя lastError. Новая downloadGeoipDatabase держит120s deadline через streaming body, ограничивает declared/chunked file64MiB и закрывает непригодное тело. Базы проходят existing Country/ASN validation до atomic swap; формат/layout ReUI не менялись. @@ -99,7 +113,7 @@ Production backend/frontend ux-backups237 собраны и развёрнуты | REST и достоверность данных | Ошибки OSPF/BFD/BGP/GRE/WAN215–221 явные; latest API smoke222 прошёл | Correlated236:384 samples/40 diagnostics без отказов; current policies/address/load исправны.828/304 retained REST sessions и vendor inactive-session fix — гипотеза; 238:763.844s/624samples/24diagnostics все200, API records изменились без отказа; причинность401/500 и version control остаются открытыми | | Клиентские ОС и внешняя сеть | CHR↔CHR/Linux, private IPv4/ULA и synthetic IPv6/IPFIX; Android full-tunnel/reconnect227 подтверждены пользователем | Windows/macOS/iOS VPN, расширенная Android приёмка, независимые WAN/multi-WAN и public IPv6; public IPv6 на текущем стенде отсутствует | | Масштаб и длительная устойчивость | Контролируемые lock/dedupe/loss/recovery и короткие native проверки | Несколько backend/worker/writers, длительный rekey/REST/traffic, physical disconnect и maximum throughput | -| Внешние хранилища и jobs | Локальные API/errors/RBAC/owned SQL; реальные Portal1.3.1/Telegram195–201 и Selectel S3/client/API/ownSQL228–229 | Large native exports проверены HTTP fixture; Missing local files UX237 принят; Bridge-only S3 restore через UI239 принят; Retention240 в own scope принят; миграция между buckets/multi-instance; GeoIP mirror242 принят; прямой licensed MaxMind не реализован; provider/container/Gitea/ACME jobs с соответствующими endpoints/аккаунтами; private/paid credentials не выдумывать | +| Внешние хранилища и jobs | Portal/Telegram195–201; native S3230, persistence235, missing UX237, bridge-only live restore239, isolated retention240; real GeoIP mirror242; availability243 | Large native export только HTTP fixture; migration buckets/multi-instance. Containers:feature=true, package не обнаружен,/container400 — нужны package/lifecycle. ACME:no token/zone, нужен test-domain/scoped Cloudflare/staging. Gitea:local dry-run принят; publishing CI не запускался (no push). Direct licensed MaxMind не реализован | | Расширенные сетевые конфигурации | GRE/WG/VXLAN/IPsec/OSPF/BFD/BGP сценарии и точные границы записаны | from-pool/EUI-64/multiple-address import/export, outer IPv6, произвольная PKI/OID/policy/path-length и длительные переходы; BFD-only gate гарантией не стал | | Общий UX, доступность и производительность | Полная UI192 исторически; latest backend25/UI52, scoped contrast/live218 и keyboard206 | Свежая UI226 принята в записанных границах; профильный performance и ручная accessibility/screen-reader приёмка; scoped axe не полный WCAG | | Границы выпуска | План/доказательства/датированные блоки сохранены; коммиты локальные | Определить требуемые конфигурации и принять результат в этих границах; невыполненные варианты остаются явными ограничениями | @@ -119,14 +133,14 @@ Portal offline JWT действует доexp после logout/role change; э | BGP | Established83, exact /32 exchange/API/UI/administrative withdrawal92, BFD primary GRE loss/alternate/recovery93; basic native IPv6 eBGP/AFI/NLRI/Ping/withdrawal/API/UI155; native IPv6 BGP/BFD scoped withdrawal/recovery160; private4-byte ASN/as4/API/UI162 | Hold timer/TCP loss безBFD принят104; packet loss в переходе, разные внешние peers/WAN policy, basic BFDv6 принят160; IPv6 outer/public WAN/scale. Два логических пути используют тот же public WAN; physical redundancy не принята | | Recursive routes | Production PUT/change/own history restore88, disabled guards, partial/unknown/applied outcomes, live формы/контекст | Автоматический rollback/retry, durable receipts и несколько экземпляров отсутствуют; PUT не является idempotent noop. Полная произвольная legacy catalog миграция не принята | | Diagnostics/terminal | Allowlist/native reads, Ping/trace/route/MTU/DNS, actual avg-rtt, disabled guards, JWT/live PC/mobile89; real default memory tail/log limits/API/UI133 | DNS использует backend resolver; MTU — ограниченная оценка, не гарантированный максимум. Stop ожидания не доказывает остановку RouterOS команды; arbitrary CLI и physical disconnect не приняты | -| Portal/интеграции | Реальный Portal1.3.1/issuer/login/reader privacy195–196, expiry/reissue/role change/logout boundaries198, context/return_to199; actual Telegram delivery201 | Offline access JWT не отзывается logout/ролью мгновенно доexp; public IPv6 WAN, Selectel S3 client/API228–229 принят; native S3 backup/restore/live UI/retention открыты. Licensed MaxMind/container/certificate/Gitea jobs требуют отдельных endpoints/аккаунтов. Клиентские ОС/scale отдельно | +| Portal/интеграции | Portal1.3.1/issuer/login/RBAC/expiry/context195–199, actual Telegram201; Selectel S3 native/API/live limited restore/retention228–240; real GeoIP mirror242 | Offline JWT сохраняетдоступ доexp; S3 large-native/migration/multi-instance отдельно; containers package/lifecycle, Cloudflare DNS ACME test-domain/token, remote Gitea publishing не приняты; direct licensed MaxMind не реализован. ClientOS/scale/WAN отдельно | | Общая приёмка | Локальная12.3.83; UI1244/context221/compiled984 parity139; профильные build/E2E/live проверки последующих блоков | Traffic initial live mock-id gate passed141; IPv6 special ranges/cache passed142; unknown RIPE coordinates passed143; IPv6 synthetic UDP/worker/SQL passed144; native CHR ULA/IPFIX/API/UI passed145; ICMPv6/IPv6 endpoint labels passed146; HTTP DTO validation passed147; scoped flow catalog/serverId guards passed148; strict monthly calendar passed149; Sessions labels passed150; application GRE static IPv6 lifecycle151 passed; WireGuard static IPv6 lifecycle152 и disabled SQL/API gates passed; OSPF/BFD boundary/warning153 passed; OSPFv3 routes154 accepted in recorded bounds; BGP IPv6 basic155 passed; bigint ID/SQL guards156 passed; общая UI1260/context221/backend24 regression157 passed; IPv6 BFD correlation158 profile/deployed passed; native OSPFv3/BFDv6 boundary/recovery159 passed; BGP IPv6/BFD withdrawal/recovery160 passed; selected BGP/alert unknown guards161 replay/profiles/deployed passed (SQL stability skipped); private4-byte ASN162 native/API/UI passed; duplicate BGP alert keys163 replay/profiles/deployed passed; nullable selected BGP164 replay/profiles/API/UI passed; collector165 parallel/current guards/read-only PG passed; positive partial/error SQL166/full24 with PG passed (optional network SQL not repeated); GRE/BGP freshness167/SQL8 passed; other source audit168 выявил identity/disabled/freshness gaps; локальный server/traffic identity guard169 passed без SQL/deploy, source/per-probe/freshness170/ownSQL16/compiled1008/deployed passed; source diagnostics171/42E2E/ownSQL metadata/live2 passed; monitoring history172/ownSQL26/compiled1020/deployed passed; Ping known/error173/ownHTTP-SQL8/85uniqueE2E/native4/4/deployed passed; traffic confidence174 baseline reproduced/local guard passed; owned SQL9/9358ms/deploy175/1024compiled/live smoke passed; legacy history/provenance open; compound RTT176 local/native replay2 passed, SQL10/deploy177/1024compiled/live smoke passed; history178/legacy provenance/current TTL/manual truth/SQL9+14/35unique E2E/native GET/deployed passed; live179 complete/disable-config/bounded fallback/ownSQL10/nativeSSE2/liveUI2 passed; volume180 exact/unit marker/ownSQL6/18E2E/API/liveUI/deployed passed; binding status181 native/ownSQL9/8E2E/deployed passed; peer atomicity182 ownSQL3/native/API/UI passed; peer failure warning183 ownSQL2/4E2E/deployed passed; inactive history184 ownSQL2/deployed passed; gap185/identity186/restore187/wave188/sourceguard189/confirmed peak190 passed; aggregate peaks191, request dedupe193, cross-process lock194/200, full regression192 (1286 unique E2E и25-й профиль privacy196 scoped), Portal195–199/Telegram201 passed; последующие изменения проверять отдельно; scoped axe не означает полную WCAG сертификацию | Доказательства и точные ограничения: [полная история этапа12](ux-ui-stage-12.md), [внешний протокол](ux-ui-external-acceptance.md), [BGP93](ux-ui/acceptance/bgp-failover-2026-10-10.json), [паспорт стенда](ux-ui-test-server.md). Невыполненные пункты не являются все блокерами данного лабораторного сценария: для выпуска необходимо явно определить требуемые конфигурации и принять их либо согласовать ограничение. ## Следующая последовательность — 2026-10-14 -1. **243 — availability audit:** read-only packages/device-mode/storage/API/config для containers, ACME и releases; проверить реально доступные GET-сценарии, зафиксировать конкретные внешние зависимости. +1. **244 — контейнеры:** подготовить точный vendor package7.24.5/x86_64 и сценарий/cleanup; перед установкой и перезапуском получить согласие. ACME и remote Gitea publishing требуют своих доступов/разрешённого scope. 2. **Профильный контроль:** для новых изменений выполнять затронутые SQL/API/UI проверки. Общая регрессия192 выполнена; не повторять её без изменений общей основы или нового основания. 3. **Внешние зависимости:** Portal issuer/login/revoke, Telegram bot/chat/разрешённое сообщение, клиентские ОС, независимые WAN/public IPv6 и scale/multi-instance — отдельные группы по таблице выше. Ограничения текущего стенда не превращать в обещание приёмки всех конфигураций. diff --git a/docs/ux-ui-stage-12.md b/docs/ux-ui-stage-12.md index 12ccc4ab..431cd9aa 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:242 — GeoIP mirror job принят в own SQL/files и реальном mirror:12 fetches200/304, две валидные MMDB12,380,575bytes, missing/corrupt recovery, concurrent409, partial error сохраняетlastSuccessAt. Исправлены false304/eager gate/body deadline; download120s/64MiB, HTTP boundary tests и15E2E прошли. Backend ux-geoip242 healthy, frontend ux-backups237 image/container unchanged; live readUI1440/320 passed. Следующий243 — аудит доступных container/certificate/release jobs и актуальных внешних ограничений. Этап12.5 открыт. +Актуальное продолжение 2026-10-14:243 — read-only audit: оба CHR7.24.5/x86_64 доступны, packages routeros/option, device-mode.container=true, /container400 и UIunsupported. Cloudflare token/zone не настроены, ACME directory200 не являетсяissuance. Gitea workflow публикуетimages/releases; local release dry-run valid, push/APIpublish0. Portal live containers/releases4views passed. Backend ux-geoip242/frontend ux-backups237. Следующий244 — подготовка реальной контейнерной приёмки с точным пакетом и отдельным согласованием перезапуска. Этап12.5 открыт. План: [ux-ui-plan.md](ux-ui-plan.md). Фактические результаты: [ux-ui-progress.md](ux-ui-progress.md). Подготовлен после сводных проверок 11Б; завершение каждого блока требует локального коммита без push. @@ -4152,6 +4152,20 @@ Real Portal/browser API, provider local verified: создан один job ро Runtime backend ux-backup234/frontend ux-routing218 healthy; новое application image для volume-only fix не требовалось. Пароли CHR не менялись, S3 mutations0 в235, configs body/JWT не опубликованы, private local manifest удалён. Исходные10 missing local files не восстановлены и records не удалены. Force-recreate — не host reboot/power loss/fsync/DR приёмка. Далее236 — UX недоступных local files, затем version retention границы и оставшиеся7 группы матрицы; multi-instance guard не принимается. Этап12.5 открыт. +## 12.5.243 — реальные предпосылки контейнеров, ACME и релизов (2026-10-14) + +Десять direct read-only RouterOS запросов:system/package/resource/device-mode/disk/container ×2CHR. Оба доступны7.24.5 stable/x86_64, installed routeros иoption, container feature=true/flagged=false, freeHDD около10GiB/freeRAM около0.8GiB. /container400 на обоих; пакет с именемcontainer не обнаружен. Публичный отчёт сохраняет status/error SHA256, неcredentials/полные error bodies. Приложение GET containers/state200 классифицирует обаunsupported. Это доступность текущего набора функций, а не доказательство отсутствия контейнеров по пустому snapshot или успешного lifecycle. + +Vendor [Container](https://help.mikrotik.com/docs/spaces/ROS/pages/84901929/Container) и [Packages](https://help.mikrotik.com/docs/spaces/ROS/pages/40992872/Packages) указывают требуемый container package. Для positive lifecycle нужны проверенный пакет текущей версии и контролируемая подготовка CHR; установка/перезапуск не выполнены. Новые manual URLs были недоступны web tool; использованы доступные официальные vendor pages, без вывода о совместимости конкретного будущего image по памяти. + +ACME public settings:tokenConfigured=false/defaultZoneConfigured=false; Let’s Encrypt production directory GET200 с ожидаемыми endpoints. Это неDNS challenge, issuance, renew или deployment сертификата. Нужны явный test-domain/Cloudflare scoped token/право на временныеTXT и staging ACME. Секреты и зоны не выдумывались, DNS/account/certificate writes0. + +Gitea — pipeline.gitea/workflows/docker.yml с push main/workflow_dispatch, registry uploads/releases/webhook; соответствующего backend polling job нет. По поручениюno push публикация не запускалась. compute-release.mjs отработал в ignored tmp output, candidate1.47.7/schema valid/current-candidate notes coherent, tagsCreated/pushes/GiteaAPIwrites/registryUploads0. Candidate не является выпущенной версией и не меняетpackage.json/publicmanifest. Отдельно real Portal UIcontainers/releases1440/320 passed:unsupported states, labversion1.0.0-test.backups237, globaloverflow/pageerrors0/non-auth APIwrites0. Первичный UI счётчик включал2 login POST; исправлено разделение auth и business operations, не приложение. + +node --check availability helper passed; runtime code/images unchanged, профильная регрессия не повторялась без оснований. Два собственных сообщения локальных коммитов239/240 приведены к русскому тексту; author/date/trees/workspace dirty files сохранены, downstream commit IDs изменились, push0. + +Протоколы: [native/ACME availability](ux-ui/acceptance/external-jobs243-availability.json), [live UI](ux-ui/acceptance/external-jobs243-live-ui.json), [release dry-run](ux-ui/acceptance/release243-dry-run.json). Следующий244 готовит конкретный vendor package/artifact для контейнерного lifecycle; применение и перезапуск согласовать отдельно после подготовки. REST root cause, multi-instance, clientOS/WAN/publicIPv6 и границы выпуска остаются по матрице. + ## 12.5.242 — реальный GeoIP mirror job и честное состояние cache (2026-10-14) В collector обнаруженыfalse-success304 при отсутствующей локальной базе (старый тест прямо принимал это), race до acquisition lock из-за await settings и освобождение timeout после headers вместо body. Теперь gate захватывается до первогоawait; concurrent force409/backgroundskip. Conditional ETag отправляется только после проверки локальной MMDB; missing/corrupt cache требует200 полного файла.304 без validated cache — ошибка, неskippedUnchanged. Partial failures сохраняют дату последнего успешного update и предыдущий файл, добавляя lastError. Новая downloadGeoipDatabase держит120s deadline через streaming body, ограничивает declared/chunked file64MiB и закрывает непригодное тело. Базы проходят existing Country/ASN validation до atomic swap; формат/layout ReUI не менялись. diff --git a/docs/ux-ui-test-server.md b/docs/ux-ui-test-server.md index ce52b67e..512c5c83 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:242 — GeoIP mirror job принят в own SQL/files и реальном mirror:12 fetches200/304, две валидные MMDB12,380,575bytes, missing/corrupt recovery, concurrent409, partial error сохраняетlastSuccessAt. Исправлены false304/eager gate/body deadline; download120s/64MiB, HTTP boundary tests и15E2E прошли. Backend ux-geoip242 healthy, frontend ux-backups237 image/container unchanged; live readUI1440/320 passed. Следующий243 — аудит доступных container/certificate/release jobs и актуальных внешних ограничений. Этап12.5 открыт. +Актуальное продолжение 2026-10-14:243 — read-only audit: оба CHR7.24.5/x86_64 доступны, packages routeros/option, device-mode.container=true, /container400 и UIunsupported. Cloudflare token/zone не настроены, ACME directory200 не являетсяissuance. Gitea workflow публикуетimages/releases; local release dry-run valid, push/APIpublish0. Portal live containers/releases4views passed. Backend ux-geoip242/frontend ux-backups237. Следующий244 — подготовка реальной контейнерной приёмки с точным пакетом и отдельным согласованием перезапуска. Этап12.5 открыт. | Параметр | Проверенное состояние | | --- | --- | @@ -34,6 +34,20 @@ OSPF84: real GRE Full adjacency/private routes/Ping3/3 и4 live PC/320px URL/bro BFD85: Up/Full/own route/Ping,4 live UI и loss/withdrawal/recovery приняты; exact own cleanup8 коллекций×2 passed. Withdrawal5,245ms не подтверждает sub-second BFD timing; этот вопрос открыт. Runtime routing83 без новой сборки. [Отчёт](ux-ui/acceptance/ospf-bfd-loss-2026-10-09.json). +## 12.5.243 — реальные предпосылки контейнеров, ACME и релизов (2026-10-14) + +Десять direct read-only RouterOS запросов:system/package/resource/device-mode/disk/container ×2CHR. Оба доступны7.24.5 stable/x86_64, installed routeros иoption, container feature=true/flagged=false, freeHDD около10GiB/freeRAM около0.8GiB. /container400 на обоих; пакет с именемcontainer не обнаружен. Публичный отчёт сохраняет status/error SHA256, неcredentials/полные error bodies. Приложение GET containers/state200 классифицирует обаunsupported. Это доступность текущего набора функций, а не доказательство отсутствия контейнеров по пустому snapshot или успешного lifecycle. + +Vendor [Container](https://help.mikrotik.com/docs/spaces/ROS/pages/84901929/Container) и [Packages](https://help.mikrotik.com/docs/spaces/ROS/pages/40992872/Packages) указывают требуемый container package. Для positive lifecycle нужны проверенный пакет текущей версии и контролируемая подготовка CHR; установка/перезапуск не выполнены. Новые manual URLs были недоступны web tool; использованы доступные официальные vendor pages, без вывода о совместимости конкретного будущего image по памяти. + +ACME public settings:tokenConfigured=false/defaultZoneConfigured=false; Let’s Encrypt production directory GET200 с ожидаемыми endpoints. Это неDNS challenge, issuance, renew или deployment сертификата. Нужны явный test-domain/Cloudflare scoped token/право на временныеTXT и staging ACME. Секреты и зоны не выдумывались, DNS/account/certificate writes0. + +Gitea — pipeline.gitea/workflows/docker.yml с push main/workflow_dispatch, registry uploads/releases/webhook; соответствующего backend polling job нет. По поручениюno push публикация не запускалась. compute-release.mjs отработал в ignored tmp output, candidate1.47.7/schema valid/current-candidate notes coherent, tagsCreated/pushes/GiteaAPIwrites/registryUploads0. Candidate не является выпущенной версией и не меняетpackage.json/publicmanifest. Отдельно real Portal UIcontainers/releases1440/320 passed:unsupported states, labversion1.0.0-test.backups237, globaloverflow/pageerrors0/non-auth APIwrites0. Первичный UI счётчик включал2 login POST; исправлено разделение auth и business operations, не приложение. + +node --check availability helper passed; runtime code/images unchanged, профильная регрессия не повторялась без оснований. Два собственных сообщения локальных коммитов239/240 приведены к русскому тексту; author/date/trees/workspace dirty files сохранены, downstream commit IDs изменились, push0. + +Протоколы: [native/ACME availability](ux-ui/acceptance/external-jobs243-availability.json), [live UI](ux-ui/acceptance/external-jobs243-live-ui.json), [release dry-run](ux-ui/acceptance/release243-dry-run.json). Следующий244 готовит конкретный vendor package/artifact для контейнерного lifecycle; применение и перезапуск согласовать отдельно после подготовки. REST root cause, multi-instance, clientOS/WAN/publicIPv6 и границы выпуска остаются по матрице. + ## 12.5.242 — реальный GeoIP mirror job и честное состояние cache (2026-10-14) В collector обнаруженыfalse-success304 при отсутствующей локальной базе (старый тест прямо принимал это), race до acquisition lock из-за await settings и освобождение timeout после headers вместо body. Теперь gate захватывается до первогоawait; concurrent force409/backgroundskip. Conditional ETag отправляется только после проверки локальной MMDB; missing/corrupt cache требует200 полного файла.304 без validated cache — ошибка, неskippedUnchanged. Partial failures сохраняют дату последнего успешного update и предыдущий файл, добавляя lastError. Новая downloadGeoipDatabase держит120s deadline через streaming body, ограничивает declared/chunked file64MiB и закрывает непригодное тело. Базы проходят existing Country/ASN validation до atomic swap; формат/layout ReUI не менялись. diff --git a/docs/ux-ui/acceptance/external-jobs243-availability.json b/docs/ux-ui/acceptance/external-jobs243-availability.json new file mode 100644 index 00000000..7112c7b4 --- /dev/null +++ b/docs/ux-ui/acceptance/external-jobs243-availability.json @@ -0,0 +1,143 @@ +{ + "date": "2026-10-14", + "block": "12.5.243", + "scope": "Read-only availability, not container lifecycle or ACME issuance", + "hosts": [ + { + "host": "104.165.244.7", + "packages": [ + { + "name": "routeros", + "version": "7.24.5", + "disabled": "false" + }, + { + "name": "option", + "version": "7.24.5", + "disabled": "false" + } + ], + "resource": { + "version": "7.24.5 (stable)", + "architecture": "x86_64", + "boardName": "CHR OpenStack Foundation OpenStack Nova", + "freeHddSpace": "10179727360", + "totalHddSpace": "10691350528", + "freeMemory": "813223936" + }, + "deviceMode": { + "mode": "advanced", + "container": "true", + "flagged": "false" + }, + "disks": 0, + "containers": null + }, + { + "host": "194.226.121.150", + "packages": [ + { + "name": "routeros", + "version": "7.24.5", + "disabled": "false" + }, + { + "name": "option", + "version": "7.24.5", + "disabled": "false" + } + ], + "resource": { + "version": "7.24.5 (stable)", + "architecture": "x86_64", + "boardName": "CHR OpenStack Foundation OpenStack Nova", + "freeHddSpace": "10179719168", + "totalHddSpace": "10691350528", + "freeMemory": "814690304" + }, + "deviceMode": { + "mode": "advanced", + "container": "true", + "flagged": "false" + }, + "disks": 0, + "containers": null + } + ], + "requests": [ + { + "host": "104.165.244.7", + "path": "/system/package", + "status": 200 + }, + { + "host": "104.165.244.7", + "path": "/system/resource", + "status": 200 + }, + { + "host": "104.165.244.7", + "path": "/system/device-mode", + "status": 200 + }, + { + "host": "104.165.244.7", + "path": "/disk", + "status": 200 + }, + { + "host": "104.165.244.7", + "path": "/container", + "status": 400, + "errorName": "MikrotikError", + "errorBodySha256": "47ce8e1849d1d7b4ea646a2180e5c43ac664e936ab15086b73bc2fd699718f3a" + }, + { + "host": "194.226.121.150", + "path": "/system/package", + "status": 200 + }, + { + "host": "194.226.121.150", + "path": "/system/resource", + "status": 200 + }, + { + "host": "194.226.121.150", + "path": "/system/device-mode", + "status": 200 + }, + { + "host": "194.226.121.150", + "path": "/disk", + "status": 200 + }, + { + "host": "194.226.121.150", + "path": "/container", + "status": 400, + "errorName": "MikrotikError", + "errorBodySha256": "47ce8e1849d1d7b4ea646a2180e5c43ac664e936ab15086b73bc2fd699718f3a" + } + ], + "routerosWrites": 0, + "databaseWrites": 0, + "dnsWrites": 0, + "passwordChanges": 0, + "acme": { + "tokenConfigured": false, + "defaultZoneConfigured": false, + "directoryHost": "acme-v02.api.letsencrypt.org", + "directoryStatus": 200, + "directoryKeys": [ + "jFbFkoPAlNI", + "keyChange", + "meta", + "newAccount", + "newNonce", + "newOrder", + "renewalInfo", + "revokeCert" + ] + } +} diff --git a/docs/ux-ui/acceptance/external-jobs243-live-ui.json b/docs/ux-ui/acceptance/external-jobs243-live-ui.json new file mode 100644 index 00000000..08b1813e --- /dev/null +++ b/docs/ux-ui/acceptance/external-jobs243-live-ui.json @@ -0,0 +1,37 @@ +{ + "date": "2026-10-14", + "block": "12.5.243", + "realPortalLogin": true, + "noMocks": true, + "containerAvailability": [ + "unsupported", + "unsupported" + ], + "containerOperations": 0, + "labVersionShown": "1.0.0-test.backups237", + "releasePublicationConfirmed": false, + "views": [ + { + "page": "containers", + "width": 1440, + "globalOverflow": false + }, + { + "page": "containers", + "width": 320, + "globalOverflow": false + }, + { + "page": "releases", + "width": 1440, + "globalOverflow": false + }, + { + "page": "releases", + "width": 320, + "globalOverflow": false + } + ], + "pageErrors": [], + "nonAuthApiWrites": 0 +} diff --git a/docs/ux-ui/acceptance/release243-dry-run.json b/docs/ux-ui/acceptance/release243-dry-run.json new file mode 100644 index 00000000..1ea73567 --- /dev/null +++ b/docs/ux-ui/acceptance/release243-dry-run.json @@ -0,0 +1,13 @@ +{ + "date": "2026-10-14", + "block": "12.5.243", + "candidateVersion": "1.47.7", + "commitCount": 6, + "manifestSchemaValid": true, + "releaseNotesMatchCandidate": true, + "tagsCreated": 0, + "pushes": 0, + "giteaApiWrites": 0, + "registryUploads": 0, + "externalJobExecuted": false +}