go-learn/docs/reports/session-8.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.2 KiB
Raw Blame History

Отчёт сессии 8 (для следующей сессии)

Дата: 2026-08-06 | Ветка: main | Этап 8 (личный кабинет, синхронизация) — завершён

Что сделано

  1. ADR-0004: владелец выбрал email+пароль (отступление от «анонимного токена» спеки); до-триаж раздела V литании выполнен и задокументирован (IN: V.1, V.2, V.4, V.5, V.6-минимум, V.7-минимум, V.8; OUT: V.3, внешняя наблюдаемость). Без верификации почты/восстановления пароля (нет SMTP) — предупреждение в UI.
  2. Контракты этапа 8 в INTERFACES.md до кода: схема SQLite, 7 эндпоинтов, ProgressV2 (+updatedAt) с миграцией V1→V2, mergeDecision (pull/push/noop/unauthorized/unavailable), тихая деградация.
  3. server/ (подагент stage-8-server): PHP 8 без фреймворка, PDO SQLite (WAL, busy_timeout, foreign_keys, идемпотентная init-миграция), prepared statements везде, 256 КБ лимит тела (413), rate limit 10/10мин по IP (429), X-GoLearn-Client как CSRF-мера (403), security-заголовки, config.example.php ([SECRET], config.php в .gitignore), health.php (200 {"status":"ok"}; 503 при сбое БД без текста исключений). smoke.sh: 30+ проверок — зелёный.
  4. apps/web (подагент stage-8-web): ProgressV2 + миграция + Clock- инжекция, sync-client.ts (mergeDecision + fetch-обёртки + метка серверного времени после push → следующая сверка noop), страница /account (вход/регистрация/выход/ручной sync, role=status), навигация «Кабинет». Интеграционная доработка main loop: тихий авто-sync на /progress при активной сессии (до отрисовки цифр).
  5. docs/deploy.md (V.2): 3 артефакта (dist → web root, server/ → /api, config.php + БД вне web root), порядок, smoke, откат, бэкап/ restore SQLite, канонические пути — заполнить при первом деплое.
  6. Гейты main: 461/461, 0 warnings, astro build PASS (16 страниц). Smoke PHP прогнан main loop независимо — SMOKE OK.

Среда: локальный PHP-рантайм

Системного PHP нет и apt недоступен. Решение: deb-пакеты Debian bookworm (php8.2-cli/common/sqlite3) распаковываются dpkg-deb -x в /tmp/debs, обёртка /tmp/php-run (pdo → pdo_sqlite → sqlite3, порядок важен). ВНИМАНИЕ: /tmp между сессиями обнуляется — рантайм пересоздавать (команды в отчёте кодера stage-8-server и в этом абзаце). Статический бинарь с dl.static-php.dev не скачался (обрывы ~14 МБ).

Известные ограничения (в PROJECT_STATE)

  • Кабинет в статическом превью = «сервер синхронизации недоступен» (by design; API оживает на хостинге).
  • Риски хостинга: Secure-cookie за TLS-прокси без HTTPS=on; rate limit общий за NAT; WAL на NFS медленный; Apache 2.2 игнорирует Require (защита config.php — тогда БД строго вне web root).

Что осталось

  • Ручная приёмка владельцем: деплой на хостинг по docs/deploy.md + критерии v1 №2/№3/№5.
  • Этап 9 (KataGo ONNX) — «этап мечты», только после приёмки 17.
  • Кандидаты через ADR: suggestDeadGroups грубовата; контент v1 (снэпбэк, «сеть», тэнуки-ответы); метрика веса — только прямые ассеты.