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

5.9 KiB
Raw Permalink Blame History

Отчёт сессии 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 до кода.