# План этапа 8.1 — регистрация отдельной страницей, восстановление пароля, капча Дата: 2026-08-06. Статус: завершён (467/467 + smoke 58 OK). Предшественник: этап 8 завершён, main = 7da814c (461/461 + smoke OK). Решения владельца: своя автономная капча; OAuth — позже (дизайн docs/design/oauth-vk-yandex.md). ## Ключевые решения (не пере-решать) 1. Регистрация — ОТДЕЛЬНАЯ страница /register.html (не модалка): проще, доступнее (a11y), диплинкабельна. /account.html становится страницей входа со ссылками «Нет аккаунта? Зарегистрируйтесь» и «Забыли пароль?». 2. Капча — автономная SVG (БЕЗ GD): glyph-повроты + шумовые кривые; код в сессии (sha256, 10 мин), одноразовая; только на регистрации (login прикрыт rate limit). SVG выбран вместо GD: GD не везде есть на хостингах, а локальный рантайм из deb — тем более. 3. Восстановление — токен 1 час, sha256 в БД, request всегда 200 (нет enumeration), сбой mail() → 503; тестовый режим GOLEARN_TEST=1: письмо в файл, капча-код в заголовке X-Captcha-Debug. 4. Параллельные ветки: stage-8-1-server (эндпоинты + миграция password_resets + smoke) и stage-8-1-web (страницы + строки); зоны не пересекаются. Мерж: server → web. ## Объём - server/: api/captcha.php, api/password-reset/request.php, api/password-reset/confirm.php; register.php += captcha; миграция password_resets; config.example.php += base_url, mail_from; smoke.sh += сценарии капчи и восстановления. - apps/web: pages/register.html, pages/password-reset.html (два режима по query), правки account.astro (ссылки), sync-client.ts += requestPasswordReset/confirmPasswordReset + captcha в register, strings.ts. - docs/deploy.md += шаги: проверка mail() (тестовое письмо), base_url в config.php. ## Приёмка - npm run gates зелёные; smoke.sh (с новыми сценариями) зелёный локально; astro build PASS (18 страниц). ## Риски - Доставляемость mail() с shared-хостинга (SPF/DKIM) — ручная проверка владельцем на деплое; риск в PROJECT_STATE. - SVG-капча слабее GD/сервисной к OCR-ботам — для учебного сайта приемлемо; при злоупотреблениях — Yandex SmartCaptcha через ADR.