go-learn/docs/plans/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

62 lines
4.7 KiB
Markdown
Raw Permalink 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.

# План этапа 6 — курс и цумэ-го
Дата: 2026-08-06. Статус: завершён (413/413, dist 280 КБ). Предшественник: этап 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 важнее количества сверх минимума;
валидационный тест — обязательный страховочный гейт.