# Отчёт сессии 9, этап 8.1 (для следующей сессии) Дата: 2026-08-06 | Ветка: main | Этап 8.1 (кабинет 2.0) — завершён ## Что сделано 1. **Контракты 8.1** в INTERFACES.md + plan-phase-8-1.md; дизайн OAuth VK ID / Яндекс ID — docs/design/oauth-vk-yandex.md (что нужно от владельца: приложения в консолях id.vk.com/business/go и oauth.yandex.ru, ключи в config.php, HTTPS redirect URI; реализация — этап 8.2, ~1 сессия, когда будут ключи). 2. **server (подагент)**: api/captcha.php (SVG-капча БЕЗ GD: 5 символов, повороты/шумовые кривые, sha256+expires 10 мин в сессии, одноразовая); register += captcha (порядок: 429→403→422 captcha→422→409→201); api/password-reset/request.php (всегда 200, anti-enumeration; токен bin2hex(32), sha256 в БД, 1 час; mail() со ссылкой; сбой → 503; 5/10мин) и confirm.php (200/400/422; 10/10мин); миграция password_resets; config.example.php += base_url/mail_from; тестовый режим GOLEARN_TEST=1 (X-Captcha-Debug, письмо в GOLEARN_TEST_MAIL). 3. **web (подагент)**: /account.html — только вход + ссылки «Нет аккаунта? Зарегистрируйтесь» и «Забыли пароль?»; новые страницы /register.html (email, пароль ×2, капча с кнопкой обновления, авто-login → /account) и /password-reset.html (два режима по ?token=); sync-client += requestPasswordReset/confirmPasswordReset, register(email, password, captcha); все статусы role=status. 4. **Гейты main: 467/467** (+6), 0 warnings, astro build PASS (18 страниц). **smoke.sh: 58 проверок**, прогнан main loop независимо — SMOKE OK (капча, полный цикл reset: письмо→токен→новый пароль→login старым 401/новым 200, 429-е). 5. docs/deploy.md += base_url/mail_from и шаг проверки почты (4.1). ## Отклонения исполнителей (приняты) - confirm.php: 422 (пароль <8) проверяется до 400 token_invalid — контракт порядок не фиксировал, оба кода по контракту. - rate_check в register — до проверки заголовка (403-пробы не тратят лимит); запись попытки после заголовка. - Тема письма — сырой UTF-8 без RFC 2047 (риск отображения темы на части MTA; ссылка не страдает) — в PROJECT_STATE. ## Среда - /tmp обнуляется между сессиями: PHP-рантайм (debs в /tmp/debs + /tmp/php-run) пересоздавать; рецепт — в session-8.md. Статический бинарь с dl.static-php.dev не докачивается (обрывы); deb-способ рабочий. - Финальные сообщения подагентов второй раз приходят пустыми/теряются, но «коммить всё» спасает: проверять ветки гитом перед повторной делегацией. ## Что осталось - Этап 8.2 (VK ID / Яндекс ID) — когда владелец получит ключи; дизайн готов. - Ручная приёмка: деплой по docs/deploy.md (включая проверку почты), критерии v1 №2/№3/№5. - Этап 9 (KataGo ONNX) — после приёмки 1–7.