Прежняя git-история утрачена при переносе проекта на машину владельца (снапшот без .git). Хэши коммитов в docs/reports/* относятся к утраченной истории. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
4.8 KiB
4.8 KiB
ADR-0004: личный кабинет email+пароль (этап 8) и до-триаж раздела V
Дата: 2026-08-06. Статус: принято (решение владельца).
Контекст
Владелец заказал «маленький личный кабинет» с хранением прогресса — активация этапа 8 (ОПЦИОНАЛЬНЫЙ по спеке: «только по отдельной команде»). Спека этапа 8 предписывала анонимный токен; владелец выбрал email + пароль (ask_user 2026-08-06) — осознанное отступление от «без сбора данных»: email — персональные данные, храним минимум (email + хэш пароля), никакой аналитики/трекинга не добавляется.
Решение
- Регистрация email+пароль, password_hash/password_verify, сессии PHP native (HttpOnly, SameSite=Lax). Контракт API — INTERFACES.md.
- Без верификации почты и восстановления пароля: на shared-хостинге нет гарантии SMTP; потерянный пароль = новая учётка. Это предупреждение показывается в UI при регистрации (зафиксировано в контракте).
- Прогресс — opaque-блоб ProgressV2 на сервере, last-write-wins по updatedAt; localStorage остаётся SoT для неавторизованных.
До-триаж раздела V литании (требование мастер-промпта для этапа 8)
| Пункт | Вердикт | Комментарий |
|---|---|---|
| V.1 (агент не трогает прод) | IN | Прод-деплой — только команды владельцу блоком; агент не выполняет |
| V.2 (деплой-чеклист) | IN | docs/deploy.md: ВСЕ артефакты (dist → web root, server/ → /api, config.php, БД вне web root), smoke = health.php, откат = перезаливка предыдущего dist |
| V.3 (один скрипт деплоя) | OUT | Нет SSH/контейнеров, деплой по FTP; чек-лист V.2 покрывает |
| V.4 (секрет-гигиена) | IN | config.php с путём БД — вне репо (.gitignore), в репо config.example.php с плейсхолдерами [SECRET]; секретов в коде нет |
| V.5 (канонические пути) | IN | Пути на хостинге фиксируются в docs/deploy.md письменно при первом деплое (владельцем) |
| V.6 (наблюдаемость) | IN (минимум) | health.php {"status":"ok"}; внешний наблюдатель/алерты — OUT (нет сервера в нашем управлении) |
| V.7 (бэкап) | IN (минимум) | Бэкап = копия SQLite-файла средствами панели хостинга; процедура restore в deploy.md; автоматика — OUT |
| V.8 (приёмка/ворота) | IN | Приёмка этапа 8 = smoke.sh зелёный локально + ручной прогон на хостинге владельцем |
Последствия
- В превью (статический хостинг) API недоступен — UI кабинета обязан деградировать тихо («синхронизация недоступна»), без алертов.
- CI-гейты не запускают PHP (в среде его нет у GitHub runner по умолчанию — есть: shivammathur/setup-php при желании; в v1 smoke.sh локальный/на хостинге, зафиксировано в PROJECT_STATE).