Прежняя git-история утрачена при переносе проекта на машину владельца (снапшот без .git). Хэши коммитов в docs/reports/* относятся к утраченной истории. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
5.2 KiB
5.2 KiB
Отчёт сессии 4 (для следующей сессии)
Дата: 2026-08-05 | Ветка: main | Этап 4 (MCTS ИИ ур. 4–6 + воркер) — завершён
Что сделано
- Контракт MCTS + протокол postMessage зафиксирован в docs/INTERFACES.md до кода: chooseMoveMcts (UCT c=1.4, ленивая экспансия, лёгкий плейаут, бюджеты {4:300, 5:800, 6:1500} мс, maxSimulations для тестов, topMoves до 3), WorkerRequest/WorkerResponse (позиция — списком ходов, cancel → result).
- packages/ai/src/mcts.ts — движок: лёгкая плейаут-политика (атари-реакция вокруг последнего хода + случайные точки с фильтром глаза), оценка scorePosition с komi, стоп по deadline/shouldStop/maxSimulations. Детерминированная экспансия (захваты первыми) — задокументирована.
- worker-protocol.ts + worker.ts — пересборка позиции из списка ходов с валидацией, createWorkerHandler(port, deps?) с инжектируемыми часами; браузерный self.onmessage опущен — подключает этап 5 (строка в комментарии).
- Тесты: 118/118 (+19): детерминизм, легальность 9×9/13×13, бюджет по фейк-часам, shouldStop, захват в атари за 200 симуляций (smoke качества), партия MCTS vs ур.3, протокол через фейк-порт, perf-smoke.
- 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 (игровой интерфейс) — первый этап с реальным сайтом:
- Astro в apps/web (проверить актуальную версию astro через npm view ДО конфигов — gotcha-llm-stale-configs; статический выход, без SSR).
- Страница партии: packages/board render + input-редьюсер, выбор доски/уровня/цвета, коми (defaultKomi + ручное), пас/сдаться/отмена/новая, счётчики пленников, скачивание SGF (serializeSgf) и загрузка для просмотра (parseSgf), режим подсказки на ур. 4+ (topMoves из MctsResult, дельта после хода игрока).
- Подключение worker.ts: строка подключения — комментарий в worker.ts; fallback: если Worker недоступен — синхронный вызов в основном потоке (fail-safe, с пометкой в UI).
- Строки UI — в один ресурсный файл с первого дня (спека).
- Смоук вручную: визуальная проверка кадра из матрицы plan-phase-2.
- Контракт: схема localStorage для настроек/прогресса партии — в INTERFACES.md ДО кода (version + checksum + миграция + roundtrip-тест).
- Создать docs/plans/plan-phase-5.md.