chore: восстановление репозитория из снапшота v0.3.1

Прежняя git-история утрачена при переносе проекта на машину владельца
(снапшот без .git). Хэши коммитов в docs/reports/* относятся к утраченной
истории.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
sab.code.lab 2026-08-07 09:34:02 +02:00
commit 1c85091186
184 changed files with 33303 additions and 0 deletions

62
docs/plan-phase-6.md Normal file
View file

@ -0,0 +1,62 @@
# План этапа 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 важнее количества сверх минимума;
валидационный тест — обязательный страховочный гейт.