---
name: project_math6_textbook
description: "Новый интерактивный учебник «Математика 6» (Беларусь, Герасимов/Пирютко 2022): план + архитектура (переиспользует паттерн Алгебры 7, не движок химии)"
metadata: 
  node_type: memory
  type: project
  originSessionId: 60467058-b40e-4bd9-9f7f-d1e362e8039a
---

Создаём интерактивный учебник **«Математика 6»** (Беларусь, Герасимов В. Д., Пирютко О. Н., 2022, 2-е изд.). План: `plans/textbooks-6/PLAN_MATH_6.md` (составлен 2026-06-02, исполнитель — Sonnet, по волнам). PDF-источник: `matematika_6kl_gerasimov_rus_2022.pdf` (317 стр.) в [[reference_textbook_sources]]; оглавление на стр. 309–311.

**Программа: 6 глав, 47 § (38 содержательных + 6 «Тест» → Финалы + 5 «Математика вокруг нас» → прикладные §):**
1. Десятичные дроби (§1–12, indigo) 2. Проценты и пропорции (§1–9, cyan) 3. Множество (§1–5, violet) 4. Рациональные числа (§1–11, rose) 5. Координатная плоскость (§1–5, emerald) 6. Наглядная геометрия (§1–5, amber).

**Why:** первый математический (комбинированный: арифметика+алгебра+геометрия) учебник для 6 класса — нижняя ступень линейки до алгебры/геометрии 7.

**Архитектура (РЕАЛИЗОВАНА — общий движок + inline-билдеры).** Не дублируем движок в 6 глав (как algebra_7), а вынесли плумбинг в `frontend/js/math6_engine.js` (`window.M6engine`, читает конфиг `window.M6`): STATE/прогресс/XP/ачивки, генерация секций из `M6.paras`, para-selector, goTo/ensureBuilt, SIDEBARS/TIPS/buildSidebar, GLOSSARY+wrapGlossary, SEARCH, тема, confetti (с jsdom-guard), setupSorter (DnD). Экспортит глобально для билдеров: `makeCard, secNav, readBtn, feedback, renderMath, fmt, num, addXp, bumpProgress, achievement, setupSorter, confetti, goTo`. **Кастомные интерактивы § — inline-функции `buildPN()` на странице главы** (свобода как у algebra_7, без унифицированного пула химии). Страница главы = chrome + `window.M6={slug,lsPrefix,xpKey,paras,achLabels,startAch,finalAch,sidebars,tips,glossary,builders,footer}`. **§ без билдера → авто-заглушка** (движок). КРИТ. порядок скриптов: объявить data/builders, затем `Object.assign(window.M6,{...})` (const → нет TDZ); `init` перечитывает `window.M6`. **Русская запятая в KaTeX = `2{,}35`**; в JS-билдерах хелпер `_kf(x)` (число→KaTeX-строка с `{,}`), числа считать целочисленными мантиссами (`_mant/_dec`), не float.

`frontend/js/math6_svg.js` (`window.Math6`): готовы `fmt`, `box`, `numberLine` (прямая/луч, метки, точки, отрезки), `plane` (декартова плоскость + plot функции) — фундамент для Гл.5. ДОБАВИТЬ при Гл.5–6: `plotFn`, окружность/круг, треугольники, развёртки тел, симметрия.

**Файлы:** миграция `049_math6_hub.sql` ПРИМЕНЕНА (хаб `math-6` + `math-6-ch1..ch6`, para_count хаба=48=сумма 12/9/5/11/5/6, палитры indigo/cyan/violet/rose/emerald/amber); `frontend/css/math6.css` (общий фреймворк по образцу alg7); `math_6_hub.html` + 6 каркасов; тест `backend/tests/math6-page.test.js`. Маршруты/каталог общие — не трогать. Хаб **закрыт по умолчанию** (allowlist) → доступ через `/api/access/rules` ([[project_content_access]]) в финале.

**Геймификация:** `_TB_SLUG='math-6-chN'` (M6.slug), синк POST `/api/textbooks/math-6-chN/progress`; localStorage `math6_chN_*` + общий `math6_xp`; Финал главы = боссы (HP-бар), победа 4/5 → +40 XP и `finalAch` ачивка «Глава N пройдена» (через `bumpProgress('final',100)`). Курсовой финал на хабе + ачивка «Математик 6 класса» — TODO (финальная фаза).

**Паттерн волны (для Sonnet, ч.2–4):** в `math_6_chN.html` дописать `function buildPk(){...}` (теория `makeCard` + `.wg` интерактивы + `secNav`+`readBtn`), добавить ключ в `BUILDERS`/`SIDEBARS`/`TIPS`/`GLOSSARY`, тест-ассерт, прогон `node -e "require('./backend/tests/math6-page.test.js')"`, коммит поимённо + push. Эталон — **Глава 1** (`math_6_ch1.html`): 2 интерактива/§, тренажёры со счётом+XP, DnD-сопоставление, числовая прямая.

**Гочи:** ⛔ эмодзи ([[feedback_no_emoji]]); ⛔ Grep ([[reference_vex_search]]); Cyrillic-FS флака Edit — персист зелёным тестом ([[feedback_verify_edits_applied]]); БД node:sqlite ([[reference_sqlite_node]]); fetch+add поимённо ([[project_concurrent_sessions_branch]]); pre-commit hook гоняет полный backend-прогон при staged backend-файлах (baseline 3 Auth-фейла — не трогать).

**СТАТУС (2026-06-02): ВСЕ 6 ГЛАВ + КУРСОВОЙ ФИНАЛ ГОТОВЫ, всё на master (Opus целиком — пользователь сказал «делай ты»).** Тесты math6: **17/17** (полный backend-прогон 0 новых фейлов). Учебник функционально завершён.
- Гл.1 (12§, 4b949f7): разрядный конструктор, сравнение/округление на прямой, координатный луч, столбик, сдвиг запятой, умножение/деление, период (долгое деление), преобразования, прикладные, финал.
- Гл.2 (9§, a783565): процент-сетка 100 + конвертер, 3 типа задач, пропорция (крест-накрест), прямая/обратная зависимость, решение пропорцией, масштаб, круговые диаграммы (`Math6.pie`), финал.
- Гл.3 (5§, 203807a): ∈/∉, способы задания, операции ∩/∪ (`Math6.venn`), круги Эйлера (задачи + формула |A∪B|), финал.
- Гл.4 (11§, 21853bd): знак числа, модуль, противоположные, N⊂Z⊂Q, сравнение, сложение (на прямой), вычитание, законы, умножение (таблица знаков), деление, порядок действий, прикладной, финал (6 боссов).
- Гл.5 (5§, 09c61d8): координаты+четверти, графики процессов (`Math6.plane` polyline), y=kx/y=k/x, путь–время, финал.
- Гл.6 (5§, 670ae80): тела+развёртки, окружность/круг (C,S), виды треугольников (классификация из координат), центральная/осевая симметрия, финал.
- Курсовой финал на хабе (0bb48d3): 6 испытаний (по главе) + звание «Математик 6 класса» (+150 XP, `localStorage math6_course_done`, зажигает ach-strip).

`Math6` (math6_svg.js) теперь: `fmt, box, numberLine, plane(+polyline), pie, venn`. Геометрия тел/развёрток/треугольников — inline SVG в `math_6_ch6.html`.

**CANVAS-АНИМАЦИИ (коммиты 6b73495, 61de12e):** движок `frontend/js/math6_anim.js` (`window.Math6Anim`) — headless-safe по канве chem7_anim: RAF-цикл `loop()` с паузой вне экрана (IntersectionObserver), `prefers-reduced-motion`, **в jsdom/HeadlessChrome `getContext` НЕ вызывается** (HEADLESS-guard по navigator.userAgent → ctx=null, рисуется только DOM-каркас → тесты не падают). Подключается в главу тегом `<script src="/js/math6_anim.js" defer>` ПОСЛЕ math6_svg, ПЕРЕД math6_engine; в тесте — инлайнится в buildPage. Билдеры вызывают **через guard** `if(window.Math6Anim){…}`, демо возвращает `{stop}`, при смене ползунка — `ctrl.stop()` + пересоздать. Подключён во ВСЕХ 6 главах (тег `<script src="/js/math6_anim.js" defer>`). Готовые демо: `rollingCircle` (колесо→C=2πr, Гл.6§2), `sweepArea` (→S=πr², Гл.6§2), `areaModel` (a·b, Гл.1§6), `numberLineWalk` (a+b стрелками, Гл.4§4), `carGraph` (машина+график, Гл.5§2), `plotLive` (живой y=kx / y=k/x с easing+переключателем, Гл.5§3), `thermometer` (±числа/модуль, Гл.4§1). **`stepPlayer` (DOM, не canvas)** + **`stepifyExamples(root)`** — движок в `goTo` (guarded) АВТО-превращает ВСЕ карточки «Разбор по шагам» во ВСЕХ главах в интерактивный пошаговый плеер (Назад/Дальше/Авто+точки). Тесты «анимации монтируются» (20/20) проверяют `<canvas>`/`.m6-step-view`. Брейншторм всех визуализаций: `plans/textbooks-6/PLAN_MATH_6_VISUAL.md` (16 реюзабельных компонентов + карта §→визуал). **Дополнительно сделано (компоненты Math6Anim, коммиты до 302b062):** `numberLineJumps` (a·b как прыжки, Гл.4§7), `coordGame` («поставь точку», клик по сетке, Гл.5§1), `reflectFold` (симметрия осевая/центральная, Гл.6§4/§5), `barModel` (% полоса, Гл.2§1), `setFilter` (числа сквозь фильтр свойства, Гл.3§1). **Итог: во ВСЕХ 6 главах есть canvas-анимации + stepPlayer на всех «Разборах по шагам».** Тест «анимации монтируются» проверяет `<canvas>` в Гл.1§6,2§1,3§1,4§1/4/7,5§1/2/3,6§2/4/5. Тесты math6: 20/20.
**3D-тела ИСКЛЮЧЕНЫ** (по решению пользователя) — Гл.6§1 остаётся со статичной SVG-галереей.
**ОПЦИОНАЛЬНАЯ ПОЛИРОВКА ЗАВЕРШЕНА (2026-06-02, коммиты 51db000 + 21c18ce):** добавлены `pieGrow` (растущие сектора, Гл.2§7 — заменил статичный Math6.pie, цвета синхронны легенде), `balanceScale` (весы a·d ? b·c, Гл.2§3, кнопка «другой пример»), `constAreaRect` (обратная проп. = постоянная площадь, Гл.2§4, ползунок x), `triangleDrag` (SVG-треугольник с перетаскиваемыми вершинами + live-классификация по сторонам/углам, штрихи равных сторон, метка прямого угла; блок «Песочница» в Гл.6§3). `vennDrag` ПРОПУЩЕН осознанно — в Гл.3§3 уже есть хороший интерактивный Math6.venn с подсветкой ∩/∪. Тесты math6: 20/20. Визуально canvas/SVG в jsdom НЕ проверить — нужен реальный браузер (глаз пользователя).

**ОБОГАЩЕНИЕ (2026-06-02, коммит 85c516e):** воркфлоу `math6-enrich` — 6 агентов Sonnet (по главе) добавили в каждый содержательный § карточки «Где это в жизни» (хук), «Разбор по шагам», «А знаешь ли ты?» (факт) и довели до ≥2 интерактивов. План: `plans/textbooks-6/PLAN_MATH_6_ENRICH.md`. Проверено: тесты 18/18, честный рендер (jsdom-over-HTTP с реальными defer-скриптами) — контент появляется, рантайм-ошибок нет.

**КРИТИЧНЫЙ БАГ ИСПРАВЛЕН (коммит fe37837):** в `math6_engine.js` вызов `init()` стоял ВЫШЕ строк `window.makeCard=…`. При defer-загрузке (readyState='interactive') ветка `else init()` срабатывала синхронно → `init→goTo→buildP1()` звал `makeCard` ДО экспорта → `ReferenceError: makeCard is not defined` → ensureBuilt catch → ВСЕ §1 показывали заглушку «Содержание готовится». jsdom-тесты баг НЕ ловили (там старт через DOMContentLoaded). Фикс: `init()` — строго ПОСЛЕ всех `window.*` экспортов; добавлен регресс-тест (init после makeCard); html учебника всегда `no-store`. ВАЖНЫЙ УРОК: при defer-движке экспортировать хелперы в window ДО запуска init.

**ОСТАЛОСЬ ТОЛЬКО:** выдать **доступ ученикам/классам** (хаб закрыт по умолчанию, allowlist) — это действие админа через панель или `POST /api/access/rules {content_type:'textbook',content_ref:'math-6',scope:'class',target_id,allow:1}` ([[project_content_access]]). Опционально: проверка в браузере, расширение пулов задач.
