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

57 lines
4.2 KiB
Markdown
Raw Permalink 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.

# Отчёт сессии 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 (снэпбэк,
«сеть», тэнуки-ответы); метрика веса — только прямые ассеты.