go-learn/docs/decisions/ADR-0004-account-email-password.md
sab.code.lab 1c85091186 chore: восстановление репозитория из снапшота v0.3.1
Прежняя git-история утрачена при переносе проекта на машину владельца
(снапшот без .git). Хэши коммитов в docs/reports/* относятся к утраченной
истории.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-07 09:34:02 +02:00

4.8 KiB
Raw Blame History

ADR-0004: личный кабинет email+пароль (этап 8) и до-триаж раздела V

Дата: 2026-08-06. Статус: принято (решение владельца).

Контекст

Владелец заказал «маленький личный кабинет» с хранением прогресса — активация этапа 8 (ОПЦИОНАЛЬНЫЙ по спеке: «только по отдельной команде»). Спека этапа 8 предписывала анонимный токен; владелец выбрал email + пароль (ask_user 2026-08-06) — осознанное отступление от «без сбора данных»: email — персональные данные, храним минимум (email + хэш пароля), никакой аналитики/трекинга не добавляется.

Решение

  1. Регистрация email+пароль, password_hash/password_verify, сессии PHP native (HttpOnly, SameSite=Lax). Контракт API — INTERFACES.md.
  2. Без верификации почты и восстановления пароля: на shared-хостинге нет гарантии SMTP; потерянный пароль = новая учётка. Это предупреждение показывается в UI при регистрации (зафиксировано в контракте).
  3. Прогресс — 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).