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/reports/session-7.md Normal file
View file

@ -0,0 +1,62 @@
# Отчёт сессии 7 (для следующей сессии)
Дата: 2026-08-06 | Ветка: main | Этап 7 (полировка) — завершён
## Что сделано
1. **Контракты этапа 7 в INTERFACES.md до кода** (раздел «Полировка:
.htaccess, a11y, бюджет веса») + docs/plans/plan-phase-7.md.
2. **.htaccess** (apps/web/public/.htaccess → dist): AddType
application/wasm, mod_deflate (html/css/js/json/svg), mod_expires
(_astro 1 год immutable, html no-cache, прочее 1 час), Options
-Indexes, DirectoryIndex index.html. HTTPS-редиректа НЕТ (комментарий
с gotcha-https-redirect-proxy). Wiring-тест проверяет директивы в dist.
3. **Клавиатура** (/play и go-task): чистый reduceCursor в
lib/keyboard.ts (кламп по краям, старт — центр), стрелки/Enter/Space/
Escape через существующий reduceInput (фантом → commit, единая
семантика с тачем); курсор — квадратный маркер accent через render.
4. **A11y**: role="status" aria-live="polite" на статусах партии/задачи/
отметки урока; prefers-reduced-motion глушит анимации; :focus-visible
outline; контраст посчитан: --text 13.2/11.6, --muted 5.64/4.97 —
≥4.5:1, осветление не потребовалось.
5. **Отметка «урок пройден»**: markLessonDone в storage.ts (чистая,
сохраняет tasksSolved авто-done этапа 6, streak через touchStreak) +
кнопка на странице урока.
6. **Бюджет веса**: wiring-тест — каждая страница урока ≤300 КБ (самая
тяжёлая ~10.3 КБ по формуле контракта, ~42 КБ с транзитивными чанками).
7. **Гейты main: 431/431** (+12 keyboard, +4 markLessonDone, +2 wiring),
0 lint warnings, astro build PASS, dist 296 КБ. Превью обновлено
(version 7f93e64).
## Инцидент среды
Финальное сообщение подагента stage-7 не доставлено (alive=0 при
посылке), но работа была полностью закоммичена в ветку stage-7 —
потерь нет. Правило «коммить всё» сработало как страховка. Независимая
проверка гейтов main loop выполнена после мержа.
## Состояние критериев приёмки v1
- №1 (тесты движка, суперко, сэки, wiring) — зелёные.
- №3 (тайминги) — частично: perf-smoke в packages/ai (ур.13 < 200 мс
среднее по 20 вызовам 19×19); полная проверка на ноутбуке владельца.
- №4 (чистый клон собирается) — проверяется каждым воркрием с нуля.
- №2 (партия vs ур.5 до подсчёта) и №5 (мобильный Safari) — ручные,
владельцу.
## Что осталось (этапы 17 завершены)
- Ручная приёмка владельцем (критерии №2, №3, №5).
- По желанию владельца: этап 8 (PHP+SQLite синхронизация прогресса,
ОПЦИОНАЛЬНО, требует до-триажа раздела V литании) и этап 9 (KataGo
ONNX, «этап мечты», не начинать до приёмки 17).
- Кандидаты на уточнение (через ADR, по жалобам): suggestDeadGroups
грубовата; контент v1 (снэпбэк невыразим, тема «сеть» только в тексте,
двухглазые авто-ответы иногда тэнуки); метрика веса — только прямые
ассеты (уточнить при росте).
## Подводные камни среды (без изменений)
Worktree в $HOME; коммитить всё перед делегированием и завершением;
контракты inline в задании; prettier на docs; sh без brace expansion;
не `git worktree prune`; чистка: remove --force + rm .git/worktrees/<n>.