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

76 lines
5.9 KiB
Markdown
Raw 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 | Ветка: main | Этап 6 (курс + цумэ-го) — завершён
## Что сделано
1. **Контракты этапа 6 в INTERFACES.md до кода** (раздел «Форматы данных
уроков и задач»): схема Markdown-урока (10 фиксированных разделов,
`<go-task data-task-id>` raw-HTML в теле), TaskV1 (goal-предикаты вместо
хардкода координат), ProgressV1 + touchStreak, страницы
/learn, /learn/[id], /tsumego, /progress. План — docs/plans/plan-phase-6.md.
2. **ADR-0003**: аудит контракта выявил, что parseSgf не умеет AB/AW и MA.
В core добавлена ОДНА аддитивная функция `buildPosition` (валидация:
вне доски/дубли/группа без дамэ → Error; корректный positionHashes);
разметка connect — CR вместо MA. +6 тестов core.
3. **Механика (подагент, ветка stage-6-core)**: goals.ts (4 предиката +
формальный глаз v1: пустая область 13 пункта, окружённая одним цветом),
storage.ts += ProgressV1 (тот же конверт), task-session.ts (чистая
машина: illegal/wrong с откатом/playing/solved, авто-ответ по дереву,
reset, hint), task-widget.ts (гидратация go-task, JSON-островок
#go-task-data), 4 страницы, content.config.ts (zod из astro:schema),
nav + строки в strings.ts.
4. **Контент (подагент, ветка stage-6-content)**: 10 уроков (300700 слов,
разделы 16 и 10 с интерактивом), 33 цумэ-го + 7 задач уроков
(capture 20 / connect 5 / two-eyes 5 / liberties 3; difficulty 15,
≥3 на градацию), валидационный content.test.ts (217 проверок: позиции
легальны buildPosition, вариации легальны applyMove, разметка цели),
CREDITS.md (контент оригинальный, CC BY 4.0).
5. **Интеграция (main loop)**: wiring-тесты переведены с placeholder на
реальный контент; добавлен тест «главная линия каждой задачи достигает
goal». Он поймал реальный дефект: goal проверялся только ПОСЛЕ
авто-ответа соперника → транзиентные цели (liberties) недостижимы.
Фикс task-session по контракту: проверка после КАЖДОГО хода игрока,
до авто-ответа. Placeholder-контент удалён.
6. **Гейты main: 413/413** (включая astro build в wiring-тесте),
0 lint warnings. dist = 15 страниц, 280 КБ. Превью обновлено
(version 89825fe).
## Принятые отклонения (подагенты задокументировали)
- env.d.ts в apps/web/src: tsc -b не видит сгенерированные типы astro:content
(каталог .astro/ в .gitignore) — модуль объявлен через entry astro.
- Для toPlay:'white' task-session инвертирует B/W в SGF перед parseSgf
(парсер моделирует от пустой доски с чёрных). Контент v1 весь
toPlay:'black' — инверсия не задействована.
- lessons.done = решены все lsn-задачи урока; чисто теоретические уроки
(79) пометки «пройден» не получают (в контракте нет UI для ручной
отметки) — кандидат на этап 7.
- Wiring-тест запускает реальный `npm run build` внутри vitest (timeout
240 с) — гейты включают сборку.
## Известные ограничения контента v1 (в PROJECT_STATE)
- Мотив снэпбэк невыразим (parseSgf падает на occupied при повторной игре
точки); тема «сеть» в цумэ-го отсутствует (есть в тексте урока 2);
у two-eyes задач авто-ответ иногда тэнуки.
## Подводные камни для следующей сессии (этап 7)
- Среда прежняя: worktree в $HOME, коммитить всё, контракты inline в
задании, prettier на docs, sh без brace expansion, no `worktree prune`.
- Удаление чужих worktree после мержа: `git worktree remove --force` +
при необходимости `rm -rf .git/worktrees/<name>`, затем `git branch -d`.
- Этап 7 по спеке: .htaccess (gzip, кэш, MIME application/wasm),
prefers-reduced-motion, клавиатурное управление доской, ARIA-live,
страница урока ≤ 300 КБ по сети, теория без JS (уже держим), HTTPS
ТОЛЬКО панелью хостинга (НЕ RewriteCond %{HTTPS} — вечный редирект за
SSL-прокси). Плюс кандидаты: ручная отметка «урок пройден», suggestDeadGroups
грубовата для уроков жизни и смерти (через ADR, зона core).
- Ручная приёмка владельцем: критерии v1 №2 (партия vs ур.5) и №5
(мобильный Safari) всё ещё открыты.
## С чего начать продолжение
Этап 7 (полировка) по мастер-промпту; docs/plans/plan-phase-7.md создать,
контракты .htaccess/a11y — в INTERFACES.md до кода.