Прежняя git-история утрачена при переносе проекта на машину владельца (снапшот без .git). Хэши коммитов в docs/reports/* относятся к утраченной истории. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
63 lines
5.2 KiB
Markdown
63 lines
5.2 KiB
Markdown
# Отчёт сессии 4 (для следующей сессии)
|
||
|
||
Дата: 2026-08-05 | Ветка: main | Этап 4 (MCTS ИИ ур. 4–6 + воркер) — завершён
|
||
|
||
## Что сделано
|
||
|
||
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 с» выполнен.
|
||
|
||
## Что НЕ сделано
|
||
|
||
- Этапы 5–9 не начаты. UI и реальное подключение воркера — этап 5.
|
||
|
||
## Подводные камни для следующей сессии (этап 5)
|
||
|
||
- **Cancel в реальном Worker**: синхронный handler не примет сообщение во время
|
||
счёта (event loop). Варианты: чанкование chooseMoveMcts через setTimeout в
|
||
воркере (меняет код движка/обёртки — через контракт!) или terminate воркера
|
||
- пересоздание (протокол stateless — позиция передаётся списком ходов,
|
||
поэтому пересоздание дёшево). Рекомендация: terminate+recreate, код не трогать.
|
||
- **Сила MCTS ограничена** ~147 сим/300 мс на 9×9 (applyMove копирует
|
||
positionHashes — O(n²) в плейаутах). Если на приёмке ур. 4–6 слабоваты —
|
||
отдельная задача оптимизации 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.
|