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

4.7 KiB
Raw Permalink Blame History

План этапа 6 — курс и цумэ-го

Дата: 2026-08-06. Статус: в работе. Предшественник: этап 5 (игровой UI) завершён, main = 4aee5b7 + hotfix play.html.

Ключевые решения (не пере-решать)

  1. Контент — оригинальный, авторский (не скачиваем чужие сборники цумэ-го): это снимает лицензионный вопрос; атрибуция — CREDITS.md. Спека допускает «свободная лицензия с атрибуцией ЛИБО формат импорта»; собственный контент строго безопаснее (ADR-0001, I.16).
  2. Интерактив в Markdown — raw HTML-элемент <go-task data-task-id="…">, гидратация клиентским скриптом страницы. Никаких remark/rehype-плагинов и новых зависимостей. Теория читаема без JS (запасной текст внутри элемента).
  3. Критерий успеха задачи — goal-предикат, вычисляемый движком (apps/web/src/lib/goals.ts поверх @go-learn/core), НЕ сравнение с координатами решения. Дерево вариантов в SGF — только автоответы соперника и подсказки.
  4. Формальный глаз — упрощение v1 (пустая область 13 пункта, окружённая одним цветом); ложный глаз не отличаем, уроки про ложный глаз строятся на capture-target. Уточнение — через ADR, не в этой фазе.
  5. Прогресс — ключ go-learn:progress (ProgressV1) в том же конверте version+checksum, API — расширение существующего storage.ts. Серия дней — чистая функция touchStreak.
  6. Зона работы — apps/web + CREDITS.md + docs; packages/board и packages/ai не трогаем (goal-предикаты живут в apps/web). Исключение по ADR-0003: в core добавлена одна аддитивная функция buildPosition (parseSgf не умеет AB/AW), разметка connect — CR вместо MA.
  7. Параллельные ветки: 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 15, ≥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 важнее количества сверх минимума; валидационный тест — обязательный страховочный гейт.