Прежняя git-история утрачена при переносе проекта на машину владельца (снапшот без .git). Хэши коммитов в docs/reports/* относятся к утраченной истории. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
62 lines
4.7 KiB
Markdown
62 lines
4.7 KiB
Markdown
# План этапа 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 (пустая область 1–3 пункта, окружённая
|
||
одним цветом); ложный глаз не отличаем, уроки про ложный глаз строятся
|
||
на 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 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 важнее количества сверх минимума;
|
||
валидационный тест — обязательный страховочный гейт.
|