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

43 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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).