Прежняя git-история утрачена при переносе проекта на машину владельца (снапшот без .git). Хэши коммитов в docs/reports/* относятся к утраченной истории. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
4.7 KiB
4.7 KiB
План этапа 6 — курс и цумэ-го
Дата: 2026-08-06. Статус: в работе. Предшественник: этап 5 (игровой UI) завершён, main = 4aee5b7 + hotfix play.html.
Ключевые решения (не пере-решать)
- Контент — оригинальный, авторский (не скачиваем чужие сборники цумэ-го): это снимает лицензионный вопрос; атрибуция — CREDITS.md. Спека допускает «свободная лицензия с атрибуцией ЛИБО формат импорта»; собственный контент строго безопаснее (ADR-0001, I.16).
- Интерактив в Markdown — raw HTML-элемент
<go-task data-task-id="…">, гидратация клиентским скриптом страницы. Никаких remark/rehype-плагинов и новых зависимостей. Теория читаема без JS (запасной текст внутри элемента). - Критерий успеха задачи — goal-предикат, вычисляемый движком (apps/web/src/lib/goals.ts поверх @go-learn/core), НЕ сравнение с координатами решения. Дерево вариантов в SGF — только автоответы соперника и подсказки.
- Формальный глаз — упрощение v1 (пустая область 1–3 пункта, окружённая одним цветом); ложный глаз не отличаем, уроки про ложный глаз строятся на capture-target. Уточнение — через ADR, не в этой фазе.
- Прогресс — ключ
go-learn:progress(ProgressV1) в том же конверте version+checksum, API — расширение существующего storage.ts. Серия дней — чистая функция touchStreak. - Зона работы — apps/web + CREDITS.md + docs; packages/board и packages/ai не трогаем (goal-предикаты живут в apps/web). Исключение по ADR-0003: в core добавлена одна аддитивная функция buildPosition (parseSgf не умеет AB/AW), разметка connect — CR вместо MA.
- Параллельные ветки: stage-6-core (механика: goals, storage, виджет, страницы, строки) и stage-6-content (уроки, цумэ-го, CREDITS, контентные тесты). Мерж: core → content.
Объём
- Механика: goals.ts (4 предиката + формальные глаза), прогресс в storage.ts, виджет задачи (канва board, автоответы по дереву, сброс/подсказка), страницы /learn, /learn/[id], /tsumego, /progress, навигация, strings.ts.
- Контент: 10 уроков (по разделу каждый, программа из мастер-промпта), ≥30 цумэ-го (difficulty 1–5, ≥3 на градацию), задачи для уроков (≥1 интерактив там, где уместно), CREDITS.md.
- Тесты: goals (все предикаты + ложный/формальный глаз), storage roundtrip прогресса, touchStreak (вчера/сегодня/разрыв), валидация контента (все TaskV1 парсятся, SGF легальны движком, goal-разметка присутствует, id уникальны, у уроков валидный frontmatter и существующие task-id), wiring-страниц.
Приёмка этапа
- npm run gates зелёные (0 warnings), astro build PASS.
- ≥10 уроков, ≥30 цумэ-го, фильтры работают, прогресс и серия дней сохраняются в localStorage (roundtrip).
- Страница урока читаема без JS (проверка отключением гидратации).
- Вес страниц остаётся скромным (жёсткий бюджет ≤300 КБ — гейт этапа 7, но не раздуваем заранее).
Риски
- suggestDeadGroups грубовата (PROJECT_STATE) — two-eyes предикат пишем собственный, на неё не опираемся.
- Контент-объём большой: качество SGF важнее количества сверх минимума; валидационный тест — обязательный страховочный гейт.