fix(certificates): учитывать подтверждённый часовой пояс устройства

This commit is contained in:
Denozordec committed 2026-10-14 21:50:11 +07:00
1 parent e78bc2d7cb
commit 0e86628d58
12 files changed
+176 -22

No files matched your search

+11 -1
View File
@@ -1,6 +1,6 @@
# UX/UI: протокол внешней приёмки 12.5
Актуальное продолжение 2026-10-14: 254 — разрешённый первый выпуск exact mmt253-8e62a941.pngs.top выполнен через UI, native leaf/private-key совпал с доверенным TLS SHA-256. Renewal не запускался: RouterOS даты без timezone дают canonical unknown/null; guard252 сохранён. Полный own cleanup/DNS0/SQL settings/native stable export подтверждён, оба CHR доступны. Backend252/frontend251 сохранены. Следующий255 — корректное определение времени native сертификата без угадывания timezone, затем реальный renewal по сохранённому разрешению. Этап12.5 открыт.
Актуальное продолжение 2026-10-14: 255 — canonical native даты учитывают явно наблюдаемый стабильный gmt-offset, сохраняя raw и unknown при отсутствии/сбое/смене clock. Каталог и renewal используют общий reader; профиль8 scripts/build/lint прошёл. Runtime backend ux-certificates255/frontend ux-certificates251. Следующий256 — повторная реальная issuance + scheduler renewal/fingerprint по уже сохранённому разрешению254, свежий baseline и полный откат; реальный renewal пока не принят. Этап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,16 @@ 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.255 — native даты с подтверждённым offset для каталога и renewal (2026-10-14)
После измерения254 добавлен общий readCertificateRowsWithClock: читает gmt-offset перед каталогом, для native timezone-less дат повторно читает clock после; принимает только одинаковые валидные offsets. Native YYYY-MM-DD HH:mm:ss преобразуется в offset-qualified datetime с проверкой календаря, затем UTC; explicit ISO сохраняет свой offset. Не предполагается UTC/пояс backend/будущий DST. rawValidFrom/rawValidUntil остаются исходными. Отсутствующий/некорректный/сменившийся/недоступный clock сохраняет unknown/null и не обходит renewal guard252; ошибка самого каталога сохраняет error. Legacy старые форматы без надёжного контекста не угадываются.
Общий reader подключён к live catalog и default renewal dependency, disabled/strict-ID guards сохранены. В штатном цикле добавлены read-only clock запросы, мутаций native/DNS нет. Успех этой калибровки подтверждён для CHR7.24.5; другие версии/форматы остаются ограничением до соответствующих измерений. Все восемь certificate profile scripts прошли, contracts/backend build и scoped lint passed. Новые проверки покрывают точные from/until254, январский expiry с текущим +02:00, raw preservation, explicit ISO, неверный календарь/offset и missing/changed/failed clock. Полная регрессия249 не повторялась для ограниченного изменения.
Production backend ux-certificates255 собран и развёрнут, source528/compiled1080 matched, healthy; frontend ux-certificates251 и DB/Portal сохранены. Read-only Portal/state после обновления: оба CHR200 без ошибки,1440/390 без overflow/JS errors/API writes. [Проверки/deployment](ux-ui/acceptance/certificates255-deployment.json), [live](ux-ui/acceptance/certificates255-live-ui.json). Собственных сертификатов после cleanup254 нет, поэтому этот read не объявляется real native-date/renewal acceptance нового образа. Новые выпуски255 не запускались.
Следующий256: по уже полученному разрешению254 снова снять свежий baseline, выполнить first issue exact mmt253-8e62a941.pngs.top, подтвердить canonical date против trusted X509; затем один enable-triggered scheduler renewal с порогом90/интервалом86400 без дополнительного run-now, сравнить изменённый native/TLS fingerprint и выполнить полный откат. Если импорт оставит старый TLS leaf или даты останутся unknown — зафиксировать реальный отказ, не маскировать. Из-за малого остатка лимита новый внешний цикл сейчас не начат: для него нужен запас на cleanup. Повторное разрешение на этот же сценарий не требуется.
## 12.5.254 — реальный выпуск и выявленное препятствие renewal (2026-10-14)
Пользователь разрешил first issue + scheduler renewal + полный откат для exact mmt253-8e62a941.pngs.top на CHR104. Сняты свежие приватные native/SQL baselines: сертификаты0, issue jobs0, CF token отсутствует. Renewal временно выключен штатным API. Token/zone/account проверены200; один UI POST с сохранённым requestId → terminal done/stepdone, UI завершение и JS errors0. [UI](ux-ui/acceptance/acme254-live-ui.json).
+11 -1
View File
@@ -1,9 +1,19 @@
# План реализации UX/UI по пятичасовым окнам
Актуальное продолжение 2026-10-14: 254 — разрешённый первый выпуск exact mmt253-8e62a941.pngs.top выполнен через UI, native leaf/private-key совпал с доверенным TLS SHA-256. Renewal не запускался: RouterOS даты без timezone дают canonical unknown/null; guard252 сохранён. Полный own cleanup/DNS0/SQL settings/native stable export подтверждён, оба CHR доступны. Backend252/frontend251 сохранены. Следующий255 — корректное определение времени native сертификата без угадывания timezone, затем реальный renewal по сохранённому разрешению. Этап12.5 открыт.
Актуальное продолжение 2026-10-14: 255 — canonical native даты учитывают явно наблюдаемый стабильный gmt-offset, сохраняя raw и unknown при отсутствии/сбое/смене clock. Каталог и renewal используют общий reader; профиль8 scripts/build/lint прошёл. Runtime backend ux-certificates255/frontend ux-certificates251. Следующий256 — повторная реальная issuance + scheduler renewal/fingerprint по уже сохранённому разрешению254, свежий baseline и полный откат; реальный renewal пока не принят. Этап12.5 открыт.
Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-14. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат.
## 12.5.255 — native даты с подтверждённым offset для каталога и renewal (2026-10-14)
После измерения254 добавлен общий readCertificateRowsWithClock: читает gmt-offset перед каталогом, для native timezone-less дат повторно читает clock после; принимает только одинаковые валидные offsets. Native YYYY-MM-DD HH:mm:ss преобразуется в offset-qualified datetime с проверкой календаря, затем UTC; explicit ISO сохраняет свой offset. Не предполагается UTC/пояс backend/будущий DST. rawValidFrom/rawValidUntil остаются исходными. Отсутствующий/некорректный/сменившийся/недоступный clock сохраняет unknown/null и не обходит renewal guard252; ошибка самого каталога сохраняет error. Legacy старые форматы без надёжного контекста не угадываются.
Общий reader подключён к live catalog и default renewal dependency, disabled/strict-ID guards сохранены. В штатном цикле добавлены read-only clock запросы, мутаций native/DNS нет. Успех этой калибровки подтверждён для CHR7.24.5; другие версии/форматы остаются ограничением до соответствующих измерений. Все восемь certificate profile scripts прошли, contracts/backend build и scoped lint passed. Новые проверки покрывают точные from/until254, январский expiry с текущим +02:00, raw preservation, explicit ISO, неверный календарь/offset и missing/changed/failed clock. Полная регрессия249 не повторялась для ограниченного изменения.
Production backend ux-certificates255 собран и развёрнут, source528/compiled1080 matched, healthy; frontend ux-certificates251 и DB/Portal сохранены. Read-only Portal/state после обновления: оба CHR200 без ошибки,1440/390 без overflow/JS errors/API writes. [Проверки/deployment](ux-ui/acceptance/certificates255-deployment.json), [live](ux-ui/acceptance/certificates255-live-ui.json). Собственных сертификатов после cleanup254 нет, поэтому этот read не объявляется real native-date/renewal acceptance нового образа. Новые выпуски255 не запускались.
Следующий256: по уже полученному разрешению254 снова снять свежий baseline, выполнить first issue exact mmt253-8e62a941.pngs.top, подтвердить canonical date против trusted X509; затем один enable-triggered scheduler renewal с порогом90/интервалом86400 без дополнительного run-now, сравнить изменённый native/TLS fingerprint и выполнить полный откат. Если импорт оставит старый TLS leaf или даты останутся unknown — зафиксировать реальный отказ, не маскировать. Из-за малого остатка лимита новый внешний цикл сейчас не начат: для него нужен запас на cleanup. Повторное разрешение на этот же сценарий не требуется.
## 12.5.254 — реальный выпуск и выявленное препятствие renewal (2026-10-14)
Пользователь разрешил first issue + scheduler renewal + полный откат для exact mmt253-8e62a941.pngs.top на CHR104. Сняты свежие приватные native/SQL baselines: сертификаты0, issue jobs0, CF token отсутствует. Renewal временно выключен штатным API. Token/zone/account проверены200; один UI POST с сохранённым requestId → terminal done/stepdone, UI завершение и JS errors0. [UI](ux-ui/acceptance/acme254-live-ui.json).
+12 -2
View File
@@ -1,6 +1,6 @@
# UX/UI: журнал реализации
Актуальное продолжение 2026-10-14: 254 — разрешённый первый выпуск exact mmt253-8e62a941.pngs.top выполнен через UI, native leaf/private-key совпал с доверенным TLS SHA-256. Renewal не запускался: RouterOS даты без timezone дают canonical unknown/null; guard252 сохранён. Полный own cleanup/DNS0/SQL settings/native stable export подтверждён, оба CHR доступны. Backend252/frontend251 сохранены. Следующий255 — корректное определение времени native сертификата без угадывания timezone, затем реальный renewal по сохранённому разрешению. Этап12.5 открыт.
Актуальное продолжение 2026-10-14: 255 — canonical native даты учитывают явно наблюдаемый стабильный gmt-offset, сохраняя raw и unknown при отсутствии/сбое/смене clock. Каталог и renewal используют общий reader; профиль8 scripts/build/lint прошёл. Runtime backend ux-certificates255/frontend ux-certificates251. Следующий256 — повторная реальная issuance + scheduler renewal/fingerprint по уже сохранённому разрешению254, свежий baseline и полный откат; реальный renewal пока не принят. Этап12.5 открыт.
Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения. Записи расположены от новых к старым; подробная история этапа12 также сохранена в [ux-ui-stage-12.md](ux-ui-stage-12.md).
@@ -36,7 +36,17 @@
| 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–254 в записанных scopes (254 — renewal остановлен на unknown dates) в записанных scopes. Runtime backend ux-certificates252/frontend ux-certificates251. Общая регрессия249 и профиль сертификатов252 прошли; реальный renewal остаётся открытым. |
| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная12.3.83; внешняя12.5 открыта, блоки1–255 в записанных scopes; исправление timezone255 проверено локально, реальный renewal256 ещё открыт в записанных scopes. Runtime backend ux-certificates255/frontend ux-certificates251. Общая регрессия249 и профиль сертификатов252 прошли; реальный renewal остаётся открытым. |
## 12.5.255 — native даты с подтверждённым offset для каталога и renewal (2026-10-14)
После измерения254 добавлен общий readCertificateRowsWithClock: читает gmt-offset перед каталогом, для native timezone-less дат повторно читает clock после; принимает только одинаковые валидные offsets. Native YYYY-MM-DD HH:mm:ss преобразуется в offset-qualified datetime с проверкой календаря, затем UTC; explicit ISO сохраняет свой offset. Не предполагается UTC/пояс backend/будущий DST. rawValidFrom/rawValidUntil остаются исходными. Отсутствующий/некорректный/сменившийся/недоступный clock сохраняет unknown/null и не обходит renewal guard252; ошибка самого каталога сохраняет error. Legacy старые форматы без надёжного контекста не угадываются.
Общий reader подключён к live catalog и default renewal dependency, disabled/strict-ID guards сохранены. В штатном цикле добавлены read-only clock запросы, мутаций native/DNS нет. Успех этой калибровки подтверждён для CHR7.24.5; другие версии/форматы остаются ограничением до соответствующих измерений. Все восемь certificate profile scripts прошли, contracts/backend build и scoped lint passed. Новые проверки покрывают точные from/until254, январский expiry с текущим +02:00, raw preservation, explicit ISO, неверный календарь/offset и missing/changed/failed clock. Полная регрессия249 не повторялась для ограниченного изменения.
Production backend ux-certificates255 собран и развёрнут, source528/compiled1080 matched, healthy; frontend ux-certificates251 и DB/Portal сохранены. Read-only Portal/state после обновления: оба CHR200 без ошибки,1440/390 без overflow/JS errors/API writes. [Проверки/deployment](ux-ui/acceptance/certificates255-deployment.json), [live](ux-ui/acceptance/certificates255-live-ui.json). Собственных сертификатов после cleanup254 нет, поэтому этот read не объявляется real native-date/renewal acceptance нового образа. Новые выпуски255 не запускались.
Следующий256: по уже полученному разрешению254 снова снять свежий baseline, выполнить first issue exact mmt253-8e62a941.pngs.top, подтвердить canonical date против trusted X509; затем один enable-triggered scheduler renewal с порогом90/интервалом86400 без дополнительного run-now, сравнить изменённый native/TLS fingerprint и выполнить полный откат. Если импорт оставит старый TLS leaf или даты останутся unknown — зафиксировать реальный отказ, не маскировать. Из-за малого остатка лимита новый внешний цикл сейчас не начат: для него нужен запас на cleanup. Повторное разрешение на этот же сценарий не требуется.
## 12.5.254 — реальный выпуск и выявленное препятствие renewal (2026-10-14)
+14 -4
View File
@@ -1,10 +1,20 @@
# Оставшаяся внешняя приёмка — 2026-10-14
Актуальное продолжение 2026-10-14: 254 — разрешённый первый выпуск exact mmt253-8e62a941.pngs.top выполнен через UI, native leaf/private-key совпал с доверенным TLS SHA-256. Renewal не запускался: RouterOS даты без timezone дают canonical unknown/null; guard252 сохранён. Полный own cleanup/DNS0/SQL settings/native stable export подтверждён, оба CHR доступны. Backend252/frontend251 сохранены. Следующий255 — корректное определение времени native сертификата без угадывания timezone, затем реальный renewal по сохранённому разрешению. Этап12.5 открыт.
Актуальное продолжение 2026-10-14: 255 — canonical native даты учитывают явно наблюдаемый стабильный gmt-offset, сохраняя raw и unknown при отсутствии/сбое/смене clock. Каталог и renewal используют общий reader; профиль8 scripts/build/lint прошёл. Runtime backend ux-certificates255/frontend ux-certificates251. Следующий256 — повторная реальная issuance + scheduler renewal/fingerprint по уже сохранённому разрешению254, свежий baseline и полный откат; реальный renewal пока не принят. Этап12.5 открыт.
Это актуальная матрица после 12.5.254. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии.
Это актуальная матрица после 12.5.255. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии.
Стенд: Debian13/Compose, PostgreSQL18.6, два CHR RouterOS7.24.5. Backend `ux-certificates252`, frontend `ux-certificates251`; production lab с195 использует AUTH_REQUIRED=true и Portal1.3.1. Подписанные JWT/RBAC проверялись в изолированных процессах. Все собственные объекты112 удалены, исходные13 коллекций×2 (включая logging/certificates/files/routes) проверены; пароли не менялись.
Стенд: Debian13/Compose, PostgreSQL18.6, два CHR RouterOS7.24.5. Backend `ux-certificates255`, frontend `ux-certificates251`; production lab с195 использует AUTH_REQUIRED=true и Portal1.3.1. Подписанные JWT/RBAC проверялись в изолированных процессах. Все собственные объекты112 удалены, исходные13 коллекций×2 (включая logging/certificates/files/routes) проверены; пароли не менялись.
## 12.5.255 — native даты с подтверждённым offset для каталога и renewal (2026-10-14)
После измерения254 добавлен общий readCertificateRowsWithClock: читает gmt-offset перед каталогом, для native timezone-less дат повторно читает clock после; принимает только одинаковые валидные offsets. Native YYYY-MM-DD HH:mm:ss преобразуется в offset-qualified datetime с проверкой календаря, затем UTC; explicit ISO сохраняет свой offset. Не предполагается UTC/пояс backend/будущий DST. rawValidFrom/rawValidUntil остаются исходными. Отсутствующий/некорректный/сменившийся/недоступный clock сохраняет unknown/null и не обходит renewal guard252; ошибка самого каталога сохраняет error. Legacy старые форматы без надёжного контекста не угадываются.
Общий reader подключён к live catalog и default renewal dependency, disabled/strict-ID guards сохранены. В штатном цикле добавлены read-only clock запросы, мутаций native/DNS нет. Успех этой калибровки подтверждён для CHR7.24.5; другие версии/форматы остаются ограничением до соответствующих измерений. Все восемь certificate profile scripts прошли, contracts/backend build и scoped lint passed. Новые проверки покрывают точные from/until254, январский expiry с текущим +02:00, raw preservation, explicit ISO, неверный календарь/offset и missing/changed/failed clock. Полная регрессия249 не повторялась для ограниченного изменения.
Production backend ux-certificates255 собран и развёрнут, source528/compiled1080 matched, healthy; frontend ux-certificates251 и DB/Portal сохранены. Read-only Portal/state после обновления: оба CHR200 без ошибки,1440/390 без overflow/JS errors/API writes. [Проверки/deployment](ux-ui/acceptance/certificates255-deployment.json), [live](ux-ui/acceptance/certificates255-live-ui.json). Собственных сертификатов после cleanup254 нет, поэтому этот read не объявляется real native-date/renewal acceptance нового образа. Новые выпуски255 не запускались.
Следующий256: по уже полученному разрешению254 снова снять свежий baseline, выполнить first issue exact mmt253-8e62a941.pngs.top, подтвердить canonical date против trusted X509; затем один enable-triggered scheduler renewal с порогом90/интервалом86400 без дополнительного run-now, сравнить изменённый native/TLS fingerprint и выполнить полный откат. Если импорт оставит старый TLS leaf или даты останутся unknown — зафиксировать реальный отказ, не маскировать. Из-за малого остатка лимита новый внешний цикл сейчас не начат: для него нужен запас на cleanup. Повторное разрешение на этот же сценарий не требуется.
## 12.5.254 — реальный выпуск и выявленное препятствие renewal (2026-10-14)
@@ -282,7 +292,7 @@ Portal offline JWT действует доexp после logout/role change; э
## Следующая последовательность — 2026-10-14
1. **Сертификаты255:** устранить неизвестные native dates без угадывания timezone; повторить first issuance + scheduler renewal/fingerprint по разрешению254, с новым baseline и полным откатом. Первый выпуск254/TLS приняты, renewal не запускался.
1. **Сертификаты256:** live catalog/renewal timezone fix255 проверен локально; повторить first issuance + scheduler renewal/fingerprint по действующему разрешению254 с новым baseline и полным откатом. Реальная замена leaf ещё не принята.
2. **Профильный контроль:** для новых изменений выполнять затронутые SQL/API/UI проверки. Общая регрессия192 выполнена; не повторять её без изменений общей основы или нового основания.
3. **Внешние зависимости:** Portal issuer/login/revoke, Telegram bot/chat/разрешённое сообщение, клиентские ОС, независимые WAN/public IPv6 и scale/multi-instance — отдельные группы по таблице выше. Ограничения текущего стенда не превращать в обещание приёмки всех конфигураций.
+11 -1
View File
@@ -1,6 +1,6 @@
# Этап 12: итоговая приёмка UX/UI
Актуальное продолжение 2026-10-14: 254 — разрешённый первый выпуск exact mmt253-8e62a941.pngs.top выполнен через UI, native leaf/private-key совпал с доверенным TLS SHA-256. Renewal не запускался: RouterOS даты без timezone дают canonical unknown/null; guard252 сохранён. Полный own cleanup/DNS0/SQL settings/native stable export подтверждён, оба CHR доступны. Backend252/frontend251 сохранены. Следующий255 — корректное определение времени native сертификата без угадывания timezone, затем реальный renewal по сохранённому разрешению. Этап12.5 открыт.
Актуальное продолжение 2026-10-14: 255 — canonical native даты учитывают явно наблюдаемый стабильный gmt-offset, сохраняя raw и unknown при отсутствии/сбое/смене clock. Каталог и renewal используют общий reader; профиль8 scripts/build/lint прошёл. Runtime backend ux-certificates255/frontend ux-certificates251. Следующий256 — повторная реальная issuance + scheduler renewal/fingerprint по уже сохранённому разрешению254, свежий baseline и полный откат; реальный renewal пока не принят. Этап12.5 открыт.
План: [ux-ui-plan.md](ux-ui-plan.md). Фактические результаты: [ux-ui-progress.md](ux-ui-progress.md). Подготовлен после сводных проверок 11Б; завершение каждого блока требует локального коммита без push.
@@ -4152,6 +4152,16 @@ 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.255 — native даты с подтверждённым offset для каталога и renewal (2026-10-14)
После измерения254 добавлен общий readCertificateRowsWithClock: читает gmt-offset перед каталогом, для native timezone-less дат повторно читает clock после; принимает только одинаковые валидные offsets. Native YYYY-MM-DD HH:mm:ss преобразуется в offset-qualified datetime с проверкой календаря, затем UTC; explicit ISO сохраняет свой offset. Не предполагается UTC/пояс backend/будущий DST. rawValidFrom/rawValidUntil остаются исходными. Отсутствующий/некорректный/сменившийся/недоступный clock сохраняет unknown/null и не обходит renewal guard252; ошибка самого каталога сохраняет error. Legacy старые форматы без надёжного контекста не угадываются.
Общий reader подключён к live catalog и default renewal dependency, disabled/strict-ID guards сохранены. В штатном цикле добавлены read-only clock запросы, мутаций native/DNS нет. Успех этой калибровки подтверждён для CHR7.24.5; другие версии/форматы остаются ограничением до соответствующих измерений. Все восемь certificate profile scripts прошли, contracts/backend build и scoped lint passed. Новые проверки покрывают точные from/until254, январский expiry с текущим +02:00, raw preservation, explicit ISO, неверный календарь/offset и missing/changed/failed clock. Полная регрессия249 не повторялась для ограниченного изменения.
Production backend ux-certificates255 собран и развёрнут, source528/compiled1080 matched, healthy; frontend ux-certificates251 и DB/Portal сохранены. Read-only Portal/state после обновления: оба CHR200 без ошибки,1440/390 без overflow/JS errors/API writes. [Проверки/deployment](ux-ui/acceptance/certificates255-deployment.json), [live](ux-ui/acceptance/certificates255-live-ui.json). Собственных сертификатов после cleanup254 нет, поэтому этот read не объявляется real native-date/renewal acceptance нового образа. Новые выпуски255 не запускались.
Следующий256: по уже полученному разрешению254 снова снять свежий baseline, выполнить first issue exact mmt253-8e62a941.pngs.top, подтвердить canonical date против trusted X509; затем один enable-triggered scheduler renewal с порогом90/интервалом86400 без дополнительного run-now, сравнить изменённый native/TLS fingerprint и выполнить полный откат. Если импорт оставит старый TLS leaf или даты останутся unknown — зафиксировать реальный отказ, не маскировать. Из-за малого остатка лимита новый внешний цикл сейчас не начат: для него нужен запас на cleanup. Повторное разрешение на этот же сценарий не требуется.
## 12.5.254 — реальный выпуск и выявленное препятствие renewal (2026-10-14)
Пользователь разрешил first issue + scheduler renewal + полный откат для exact mmt253-8e62a941.pngs.top на CHR104. Сняты свежие приватные native/SQL baselines: сертификаты0, issue jobs0, CF token отсутствует. Renewal временно выключен штатным API. Token/zone/account проверены200; один UI POST с сохранённым requestId → terminal done/stepdone, UI завершение и JS errors0. [UI](ux-ui/acceptance/acme254-live-ui.json).
+11 -1
View File
@@ -1,6 +1,6 @@
# Тестовый сервер UX/UI — 2026-10-10
Актуальное продолжение 2026-10-14: 254 — разрешённый первый выпуск exact mmt253-8e62a941.pngs.top выполнен через UI, native leaf/private-key совпал с доверенным TLS SHA-256. Renewal не запускался: RouterOS даты без timezone дают canonical unknown/null; guard252 сохранён. Полный own cleanup/DNS0/SQL settings/native stable export подтверждён, оба CHR доступны. Backend252/frontend251 сохранены. Следующий255 — корректное определение времени native сертификата без угадывания timezone, затем реальный renewal по сохранённому разрешению. Этап12.5 открыт.
Актуальное продолжение 2026-10-14: 255 — canonical native даты учитывают явно наблюдаемый стабильный gmt-offset, сохраняя raw и unknown при отсутствии/сбое/смене clock. Каталог и renewal используют общий reader; профиль8 scripts/build/lint прошёл. Runtime backend ux-certificates255/frontend ux-certificates251. Следующий256 — повторная реальная issuance + scheduler renewal/fingerprint по уже сохранённому разрешению254, свежий baseline и полный откат; реальный renewal пока не принят. Этап12.5 открыт.
| Параметр | Проверенное состояние |
| --- | --- |
@@ -34,6 +34,16 @@ 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.255 — native даты с подтверждённым offset для каталога и renewal (2026-10-14)
После измерения254 добавлен общий readCertificateRowsWithClock: читает gmt-offset перед каталогом, для native timezone-less дат повторно читает clock после; принимает только одинаковые валидные offsets. Native YYYY-MM-DD HH:mm:ss преобразуется в offset-qualified datetime с проверкой календаря, затем UTC; explicit ISO сохраняет свой offset. Не предполагается UTC/пояс backend/будущий DST. rawValidFrom/rawValidUntil остаются исходными. Отсутствующий/некорректный/сменившийся/недоступный clock сохраняет unknown/null и не обходит renewal guard252; ошибка самого каталога сохраняет error. Legacy старые форматы без надёжного контекста не угадываются.
Общий reader подключён к live catalog и default renewal dependency, disabled/strict-ID guards сохранены. В штатном цикле добавлены read-only clock запросы, мутаций native/DNS нет. Успех этой калибровки подтверждён для CHR7.24.5; другие версии/форматы остаются ограничением до соответствующих измерений. Все восемь certificate profile scripts прошли, contracts/backend build и scoped lint passed. Новые проверки покрывают точные from/until254, январский expiry с текущим +02:00, raw preservation, explicit ISO, неверный календарь/offset и missing/changed/failed clock. Полная регрессия249 не повторялась для ограниченного изменения.
Production backend ux-certificates255 собран и развёрнут, source528/compiled1080 matched, healthy; frontend ux-certificates251 и DB/Portal сохранены. Read-only Portal/state после обновления: оба CHR200 без ошибки,1440/390 без overflow/JS errors/API writes. [Проверки/deployment](ux-ui/acceptance/certificates255-deployment.json), [live](ux-ui/acceptance/certificates255-live-ui.json). Собственных сертификатов после cleanup254 нет, поэтому этот read не объявляется real native-date/renewal acceptance нового образа. Новые выпуски255 не запускались.
Следующий256: по уже полученному разрешению254 снова снять свежий baseline, выполнить first issue exact mmt253-8e62a941.pngs.top, подтвердить canonical date против trusted X509; затем один enable-triggered scheduler renewal с порогом90/интервалом86400 без дополнительного run-now, сравнить изменённый native/TLS fingerprint и выполнить полный откат. Если импорт оставит старый TLS leaf или даты останутся unknown — зафиксировать реальный отказ, не маскировать. Из-за малого остатка лимита новый внешний цикл сейчас не начат: для него нужен запас на cleanup. Повторное разрешение на этот же сценарий не требуется.
## 12.5.254 — реальный выпуск и выявленное препятствие renewal (2026-10-14)
Пользователь разрешил first issue + scheduler renewal + полный откат для exact mmt253-8e62a941.pngs.top на CHR104. Сняты свежие приватные native/SQL baselines: сертификаты0, issue jobs0, CF token отсутствует. Renewal временно выключен штатным API. Token/zone/account проверены200; один UI POST с сохранённым requestId → terminal done/stepdone, UI завершение и JS errors0. [UI](ux-ui/acceptance/acme254-live-ui.json).
@@ -0,0 +1,21 @@
{
"date": "2026-10-14",
"block": "12.5.255",
"backendImage": "mmapp-test/backend:ux-certificates255",
"frontendImage": "mmapp-test/frontend:ux-certificates251",
"sourceMatched": 528,
"compiled": {
"matched": 1080,
"missing": 0,
"different": 0
},
"productionBuild": "passed",
"backendHealth": "healthy",
"composeExit": 0,
"certificateProfileScripts": 8,
"localProfile": "passed",
"contractsAndBackendBuild": "passed",
"scopedLint": "passed",
"realRenewalTestExecuted": false,
"postgresAndPortalRecreated": false
}
@@ -0,0 +1,41 @@
{
"date": "2026-10-14",
"block": "12.5.255",
"realPortalLogin": true,
"noMocks": true,
"results": [
{
"path": "/api/certificates/state",
"status": 200,
"servers": [
{
"serverId": "1",
"error": null,
"certificates": 0
},
{
"serverId": "2",
"error": null,
"certificates": 0
}
]
},
{
"path": "/api/certificates/renew-settings",
"status": 200,
"renewEnabled": true
}
],
"views": [
{
"width": 1440,
"overflow": false
},
{
"width": 390,
"overflow": false
}
],
"pageErrors": [],
"nonAuthApiWrites": 0
}