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

57
docs/reports/session-8.md Normal file
View file

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