diff --git a/.gitignore b/.gitignore index 4f7aca6..0682263 100755 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,6 @@ data/ # Local runtime logs logs/ -# Transient local scratch output; keep reports/ reviewable by default -/reports/tmp/ +# Local generated reports; deliberately publish reviewed/sanitized evidence with git add -f +/reports/ /tmp/ diff --git a/docs/product/implementation-roadmap.md b/docs/product/implementation-roadmap.md index c3803e7..468295f 100644 --- a/docs/product/implementation-roadmap.md +++ b/docs/product/implementation-roadmap.md @@ -71,6 +71,14 @@ follow-up по поиску, кабинету и лаборатории, лок этой документационной задаче. Сверяться с [отчётом visual-review](visual-review/README.md); не открывать снова выполненные пункты без нового воспроизводимого свидетельства. +Источники по состоянию на базовый commit этого PR сохранены постоянными +ссылками: [UI-план на `7ece39f`](https://git.vakanaut.ru/admin/akyldash/src/commit/7ece39f212b67e497a8dfb360d5d271ab088ef57/docs/product/interface-correction-plan.md) +и [план pixel-perfect на `7ece39f`](https://git.vakanaut.ru/admin/akyldash/src/commit/7ece39f212b67e497a8dfb360d5d271ab088ef57/docs/product/frontend-pixel-perfect-plan.md). +UI-01—UI-33 вошли в [PR #54](https://git.vakanaut.ru/admin/akyldash/pulls/54) +(merge commit [`01380d3c`](https://git.vakanaut.ru/admin/akyldash/commit/01380d3c09d71e32c965d974a39a4d82de0a15c5)); +последующий follow-up поиска, кабинета и лаборатории записан в +[commit `e5a8326a`](https://git.vakanaut.ru/admin/akyldash/commit/e5a8326a5e3def1bf5d5dc94794da82a2af801ab). + В исходном реестре **P1** означает обязательное исправление до визуальной приёмки/выпуска, **P2** — существенное улучшение понятности и последовательности. Отсутствие функции само по себе не считается багом; @@ -280,11 +288,30 @@ PR. | Окна | Заголовок, крестик, Escape, trap/return focus; окна не конкурируют слоями | | Лаборатория | Поиск → чтение → оценка → черновик → сохранение; текст не теряется, панель доступна при длинном документе | | Локализация | RU/KY labels и символы; язык UI не подменяет язык документа | +| Геометрия | При 1280×800 границы основных зон и отступы/размеры controls отличаются от измеренного fixture не более чем на 2 CSS px; согласованные исключения описаны | | Типографика и таблицы | Noto действительно загружается; читаемый длинный текст; у широкой таблицы собственный скролл | | Доступность | Контраст AA, focus, Tab/Shift+Tab/Enter/Escape, zoom/reflow, reduced motion и touch targets | | Авторизация | Неверный пароль, expired session и обязательная смена проверены только в безопасном тестовом контуре | | Снимки | 1440×900, 1280×800, 1024×768, 390×844 и 320 CSS px; стабильные fixture и объяснённые различия | +Допуск **до 2 CSS px** для границ крупных зон и отступов/размеров controls при +1280×800 перенесён из исторического pixel-perfect плана по стабильной ссылке +выше. Он применяется к одинаковым детерминированным fixture; расхождения +растра, вызванные сглаживанием текста или содержимым, сами по себе не дают +основания обрезать или уплотнять юридический текст. + +#### Нормативный орнамент и фактическое состояние + +`DESIGN.md` нормативно требует небольшой золотистый SVG-орнамент в свободной +нижней части desktop-панели фильтров, не перекрывающий длинные списки и не +резервирующий место за счёт управления. Follow-up из commit `e5a8326a` удалил +предыдущий декоративный SVG и его пустой резерв; в `backend/search/review.html` +на базовом `main` целевого орнамента нет. Это не выполненное требование, а +подтверждённое расхождение между `DESIGN.md` и реализацией. Дизайн остаётся +нормативным до отдельного решения владельца: UI-задача должна либо вернуть +орнамент в свободную область без влияния на управление, либо получить явное +одобрение на изменение `DESIGN.md` и подтвердить его визуальной приёмкой. + ### 2.3 Инфраструктура и переход к production Инфраструктурные источники содержали повторяющиеся этапы deployment и @@ -304,11 +331,16 @@ PR. Публикация образов должна фиксировать digest и provenance; release workflow не равен deployment. Production CD не включать до прохождения owner gates, безопасной сборки, backup и отдельного restore. -4. **Первое применение:** до запуска проверить реальные данные и - конфигурацию, требуемое свободное место, открытые порты, права, backup - readiness и совместимость схем. Выполнять через существующую ограниченную - процедуру; не добавлять общие sudo/Docker-привилегии. Базы данных и - внутренние сервисы не публиковать в интернет. DNS, reverse proxy и TLS +4. **Контролируемое изменение существующего production:** последняя датированная + проверка `https://akyldash.kg/review` вернула HTTP 200 25 октября 2026 года + ([CURRENT_STATE](../operations/CURRENT_STATE.md)); установленный на хосте + SHA остался неизвестен. План относится к безопасному + обновлению существующего сервиса, а не к первому развёртыванию. До изменения + проверять реальные данные и конфигурацию, доступное место, опубликованные + порты, права, совместимость схем и backup readiness. Выполнять через + существующую ограниченную процедуру; не добавлять общие sudo/Docker- + привилегии. Базы данных и внутренние сервисы не публиковать в интернет. + DNS, reverse proxy и TLS проверять до выпуска; для Cloudflare применять Full (strict). SSH/UFW и сетевые ограничения меняются только после owner approval. 5. **Проверка и recovery:** проверять health/API, RU/KY canaries, доступность @@ -320,6 +352,34 @@ PR. health gates и отказ без destructive cleanup. Не включать триггер только потому, что workflow завершился зелёным. +**Backup/maintenance gate:** настройки CI, проверка конфигурации и подготовка +release provenance должны быть отделены от production cutover. Production CD +в `CURRENT_STATE.md` остаётся неактивным. Перед каждым фактическим production +изменением, включая миграции, создать и проверить внешний pre-change backup. +Полный cold backup требует остановки Compose и может выполняться только в +заранее согласованное с владельцем окно. +Ни полный архив, ни его временная копия никогда не записываются на VPS. По +текущей утверждённой схеме архив передаётся напрямую на фиксированный +`D:\Dev\akyldash\.backups`; фактическая готовность D:, SSH и отдельное +восстановление всё ещё не подтверждены. На VPS остаётся только secret-free +идентификатор/manifest согласно `BACKUP.md`. Политика — одна retained, +проверенная внешняя копия. При замене прежняя копия сохраняется до тех пор, +пока новый candidate не опубликован и не проверен; на время этой проверки две +копии могут сосуществовать. После подтверждения новой копии retention может +изменить только владелец явным решением; автоматическая очистка запрещена. +При неудачной публикации или проверке прежняя подтверждённая копия остаётся. +Локальные VPS cold-backup команды из старых документов superseded и +использоваться не должны. + +#### Локальные generated reports + +`/reports/` и `/tmp/` игнорируются по умолчанию, чтобы generated bulk не +попадал в обычный `git status`. Уже отслеживаемые historical evidence остаются +отслеживаемыми. Если конкретный отчёт нужен в Git, сначала проверить его +содержимое, удалить секреты, персональные данные, production corpus и +временные файлы, затем добавить только предназначенный к публикации файл +явной командой `git add -f reports/`. Не добавлять каталоги целиком. + Нынешний статус не переопределяется этим roadmap: на сверенной документации production CD остаётся неактивным, а backup/restore и внешний bootstrap имеют непроверенные owner prerequisites. Все точные блокировки сверять с