go-learn/docs/plans/plan-phase-5.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

82 lines
6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# План фазы 5: этап 5 — игровой интерфейс (apps/web, Astro)
Обновлено: 2026-08-05 | Статус: завершён (гейты зелёные, astro build собирает dist)
## Итоговые пометки (факт против плана)
- Astro запинен **5.18.2**, а не 7.1.6: astro 6/7 жёстко требуют Node
> =22.12.0 (bin/astro.mjs, проверено по tarball), в окружении Node 20.
> 5.18.2 — последняя линия с engines `^20.3.0`. Конфиг и объём — по плану
> (output: 'static', без интеграций).
- Зона расширена на 3 корневых конфига игноров: eslint.config.js,
.prettierignore, .gitignore — по одной записи `**/.astro/` (генерируемый
astro каталог ломал lint/format).
- AiClient дополнен `readonly fallback` (предусмотрено текстом контракта);
loadSettings/saveSettings — необязательным параметром StorageLike.
- Воркер собран Vite (chunk ai-worker-*.js в dist). Смоук dist в браузере:
доска рендерится, ход игрока + ответ бота работают.
## Критические долги (реестр — в начале, III.5)
- Нет.
## Ключевые решения (не пере-решать)
- Astro 7.1.6 (версия сверена npm view 2026-08-05), output: 'static', без
UI-фреймворков — vanilla TS + DOM (спека: «без тяжёлых UI-фреймворков»).
- Строки UI — один ресурсный файл src/ui/strings.ts с первого дня (спека).
- Отмена хода бота — terminate + пересоздание воркера (решение по известной
проблеме cancel в реальном Worker, отчёт сессии 4).
- Режим подсказки: topMoves последнего MCTS-ответа как разметка + оценка;
дельта = изменение winRate лучшего хода между запросами (упрощение —
оценка с точки зрения стороны, чей ход анализировался; зафиксировано).
- Схема localStorage и AiClient — контракты в docs/INTERFACES.md
(зафиксированы 2026-08-05 до кода).
- Страницы: / — заглушка-визитка со ссылкой на партию; /play — игра.
Курс — этап 6, полировка (a11y, .htaccess) — этап 7.
## Объём этапа 5
1. apps/web (Astro): package.json @go-learn/web 0.1.0, astro.config.mjs
(static), tsconfig (extends базового, lib DOM), workspaces += "apps/*".
2. Страница /play: доска (packages/board render + reduceInput + setupCanvas +
attachPointerInput), панель: выбор доски 9/13/19, уровня 16, цвета
(чёрные/белые/случайно), коми (auto/число), кнопки «Пас», «Сдаться»,
«Отменить ход», «Новая партия»; счётчики пленников; статус-строка
(чей ход, причина отказа из MoveError, итог партии).
3. Подсчёт по окончании (два паса): scorePosition + отметка мёртвых
(suggestDeadGroups + ручной toggle по клику) → итог.
4. SGF: «Скачать SGF» (serializeSgf, blob-скачивание), «Загрузка SGF» —
режим просмотра (parseSgf, навигация назад/вперёд без игры).
5. Подсказки ур. 4+ (переключатель, hintsEnabled): топ-3 хода маркерами с
оценкой; дельта winRate.
6. 19×19 при ур. 46 — честное предупреждение (спека этапа 4).
7. Тёмная минималистичная тема (согласована с палитрой packages/board),
адаптивность desktop+мобильные.
8. lib/storage.ts (по контракту), lib/ai-client.ts (по контракту),
lib/game-store.ts (чистый, без DOM: GameTree + действия), ui/strings.ts.
9. Воркер: entry ai-worker.ts (строка подключения — комментарий в
packages/ai/src/worker.ts), сборка воркера средствами Astro/Vite.
## Тесты (гейт приёмки этапа)
- storage: roundtrip save→load; битый JSON/checksum/неизвестная version →
дефолты + recovered; миграция-путь задокументирован.
- game-store (чистый): новая партия, ход игрока через pending→confirm,
отказ с reason при нелегальном, пас×2 → фаза подсчёта, toggle мёртвой
группы, итог, resign → result, отмена хода, viewer: загрузка SGF,
навигация prev/next.
- ai-client: фейк-worker (инжекция) — маршрутизация ур. 13 в синхронный
движок, ур. 46 в воркер; cancel → AiCancelledError; фолбэк при отказе
воркера.
- Матрица «чего НЕ покрывает ни один тест»: реальный кадр канвы в браузере,
pointer на тачах, реальный Worker, astro build — смоук этапа 7 +
ручная проверка владельцем.
- vitest.config: include += apps/*/src.
## Критерий выхода
Все тесты зелёные + `npm run gates` зелёный + `astro build` собирает dist.
Критерий v1 №4 («чистый клон собирается») проверяется сборкой в этой фазе;
№2 (партия против ур.5) и №5 (мобильный Safari) — ручная приёмка владельцем
после фазы 57.