go-learn/docs/reports/session-4.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

5.2 KiB
Raw Blame History

Отчёт сессии 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.