chore: восстановление репозитория из снапшота v0.3.1

Прежняя git-история утрачена при переносе проекта на машину владельца
(снапшот без .git). Хэши коммитов в docs/reports/* относятся к утраченной
истории.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
sab.code.lab 2026-08-07 09:34:02 +02:00
commit 1c85091186
184 changed files with 33303 additions and 0 deletions

View file

@ -0,0 +1,56 @@
# Отчёт сессии 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) — после приёмки 17.