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

63
docs/reports/session-4.md Normal file
View file

@ -0,0 +1,63 @@
# Отчёт сессии 4 (для следующей сессии)
Дата: 2026-08-05 | Ветка: main | Этап 4 (MCTS ИИ ур. 46 + воркер) — завершён
## Что сделано
1. **Контракт MCTS + протокол postMessage** зафиксирован в docs/INTERFACES.md
до кода: chooseMoveMcts (UCT c=1.4, ленивая экспансия, лёгкий плейаут,
бюджеты {4:300, 5:800, 6:1500} мс, maxSimulations для тестов, topMoves до 3),
WorkerRequest/WorkerResponse (позиция — списком ходов, cancel → result).
2. **packages/ai/src/mcts.ts** — движок: лёгкая плейаут-политика (атари-реакция
вокруг последнего хода + случайные точки с фильтром глаза), оценка
scorePosition с komi, стоп по deadline/shouldStop/maxSimulations.
Детерминированная экспансия (захваты первыми) — задокументирована.
3. **worker-protocol.ts + worker.ts** — пересборка позиции из списка ходов с
валидацией, createWorkerHandler(port, deps?) с инжектируемыми часами;
браузерный self.onmessage опущен — подключает этап 5 (строка в комментарии).
4. **Тесты: 118/118** (+19): детерминизм, легальность 9×9/13×13, бюджет по
фейк-часам, shouldStop, захват в атари за 200 симуляций (smoke качества),
партия MCTS vs ур.3, протокол через фейк-порт, perf-smoke.
5. **Perf: ~147 симуляций за 300 мс на 9×9**; ур.6 на 13×13 ≈ 1500 мс wall —
критерий v1 №3 «<2 с» выполнен.
## Что НЕ сделано
- Этапы 59 не начаты. UI и реальное подключение воркера — этап 5.
## Подводные камни для следующей сессии (этап 5)
- **Cancel в реальном Worker**: синхронный handler не примет сообщение во время
счёта (event loop). Варианты: чанкование chooseMoveMcts через setTimeout в
воркере (меняет код движка/обёртки — через контракт!) или terminate воркера
- пересоздание (протокол stateless — позиция передаётся списком ходов,
поэтому пересоздание дёшево). Рекомендация: terminate+recreate, код не трогать.
- **Сила MCTS ограничена** ~147 сим/300 мс на 9×9 (applyMove копирует
positionHashes — O(n²) в плейаутах). Если на приёмке ур. 46 слабоваты —
отдельная задача оптимизации core (хэш инкрементальный), через ADR.
- **19×19 для MCTS**: UI обязан показать честное предупреждение (спека этапа 4);
рекомендуемые таргеты — 9×9 и 13×13.
- Среда: worktree в $HOME, пересоздание, коммитить всё; контракты дублировать
в задании; docs через prettier перед коммитом; project references не добавлять.
- Seed воркера: протокол передаёт seed в каждом choose — UI формирует
(например, seed партии + requestId); это часть воспроизводимости реплеев.
## С чего начать продолжение
Этап 5 (игровой интерфейс) — первый этап с реальным сайтом:
1. Astro в apps/web (проверить актуальную версию astro через npm view ДО
конфигов — gotcha-llm-stale-configs; статический выход, без SSR).
2. Страница партии: packages/board render + input-редьюсер, выбор
доски/уровня/цвета, коми (defaultKomi + ручное), пас/сдаться/отмена/новая,
счётчики пленников, скачивание SGF (serializeSgf) и загрузка для просмотра
(parseSgf), режим подсказки на ур. 4+ (topMoves из MctsResult, дельта
после хода игрока).
3. Подключение worker.ts: строка подключения — комментарий в worker.ts;
fallback: если Worker недоступен — синхронный вызов в основном потоке
(fail-safe, с пометкой в UI).
4. Строки UI — в один ресурсный файл с первого дня (спека).
5. Смоук вручную: визуальная проверка кадра из матрицы plan-phase-2.
6. Контракт: схема localStorage для настроек/прогресса партии — в INTERFACES.md
ДО кода (version + checksum + миграция + roundtrip-тест).
7. Создать docs/plans/plan-phase-5.md.