- 4 крупные карточки статистики → компактная строка stat-пиллов
- тулбар: фильтр по типу + поиск по названию + счётчик (N из M)
- таблица: иконка-чип по типу + название с описанием в одной ячейке,
цветные бейджи типов, колонка ID убрана (id ушёл в подпись)
- состояния «Нет товаров» / «Ничего не найдено»
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
registry: поле requires (questions.delete→manage, templates.public→manage,
courses.interactive→manage, simulations.quiz→access), проброшено в byRole.
auth.requirePermission: вынесен isEnabled(); право = own AND все requires
(дочернее не работает без родителя). /me и /users/🆔 effective с учётом
requires + requires в ответе. UI permissions.js: каскад — дочернее с
невыполненной зависимостью неактивно (тумблер заблокирован + «Требует: …»).
Тест зависимости. План: plans/permissions-rework/PLAN.md. Backend 216 pass.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Инлайн-панель формы внизу страницы заменена на модалку через LS.modal:
- shopAdminCreateItem/EditItem открывают окно openItemModal (create/edit)
- валидация: обязательное название + проверка JSON в поле «Данные»
- блокировка кнопки на время сохранения, ошибки через m.setError
- удалены инлайн-форма из admin.html и неактуальные
shopAdminSaveItem/shopAdminCancelForm/showShopForm + стейт
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Начисление монет осталось в «Пользователях» (быстрое действие quickAwardCoins)
и во вкладке «Геймификация». Из магазина удалены: HTML-блок «Начислить монеты»,
функции shopSearchUser/shopPickUser/shopAdminAwardCoins, их window-экспорты и
неиспользуемые стейт-переменные. Эндпоинт /shop/admin/award-coins не тронут —
им пользуется quickAwardCoins.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- shopAdminCreateItem/EditItem открывали форму под таблицей на 51 строку —
вне экрана, выглядело как «кнопки не работают». Добавлен showShopForm():
scrollIntoView + фокус в поле названия.
- В выпадающем списке типов «Тема» (theme) не поддерживается бэкендом
(валидация POST: frame/title/effect/background) → создание падало с 400.
Заменён на рабочий «Фон» (background); добавлена подпись в typeLabels.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
«Доступ к учебникам» → «Доступ · контент» (видимость контента по классам),
«Права доступа» → «Доступ · роли» (способности ролей), поставлены рядом.
Устраняет путаницу двух похоже названных вкладок (P0 из ревью). Полное слияние
в одну вкладку с под-вкладками — возможно позже (структурно крупнее).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
История: GET /api/access/log (admin-only) — кто/когда открыл/закрыл/сбросил
правило для контента (из admin_audit_log, имена классов/учеников резолвятся).
Клиент LS.accessLog; в режиме «По контенту» — кнопка «История изменений».
Пресет: в режиме «По классу» — «Скопировать доступ из класса [выбор]» (дополняет
текущие правила открытыми правилами класса-источника). Тест: история (admin
видит запись, учителю 403). content-access 13/13.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Панель кнопок по предметам: один клик открывает выбранному классу весь контент
этого предмета (учебники/экзамены/симуляции/курсы вместе). Нормализация поля
предмета (subject|subject_slug), метки через SUBJ_LABEL. Чистый фронтенд на
существующем accSetRule. Закрывает находку ревью «нет операции открыть весь предмет».
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
select использовал var(--bg-2,#1a1a2e) — переменная не определена в светлой
теме, поэтому фон падал на тёмно-синий, а текст оставался тёмным (--text):
список сливался с фоном. Заменено на белый фон + явные цвета option.
Клик по названию контента в матрице открывает/закрывает его сразу ВСЕМ классам;
клик по имени класса (заголовок столбца) — открывает/закрывает ВЕСЬ контент этому
классу. Массовое закрытие спрашивает подтверждение; перерисовывается только tbody.
Использует существующий accSetRule (без новых эндпоинтов).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Миграция 052: мост «открыть все опубликованные курсы всем существующим классам»
(тип 'course' уже в CHECK из 051). courseController.list/search фильтруют курсы
для НЕпривилегированных по allowedRefs(uid,'course') (content_ref = courses.id как
TEXT); admin/teacher — все. /api/access/catalog отдаёт курсы; CONTENT_TYPES в
админ-UI = textbook,exam,sim,course → курсы управляются во всех режимах «Доступ».
Тест course-access 4/4 (allowlist+класс+privileged+каталог). Полный набор: 213 pass.
ВАЖНО: новый опубликованный курс по умолчанию закрыт (allowlist) — открыть классам
в админке. Мост сохранил видимость текущих опубликованных курсов у существующих
классов. class_courses остаётся для назначений с дедлайном (сверх видимости).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Бэкенд /api/access обобщён на тип 'sim': catalog отдаёт симуляции (lab_sims),
summary/matrix/class — карты по всем типам. Админ-секция «Доступ» теперь
показывает «Симуляции» во всех трёх режимах (по контенту / по классу / матрица)
+ поиск; helpers (bucket/keyName/itemsOf) обобщены через карты типов
(CONTENT_TYPES=textbook,exam,sim; course зарезервирован). Теперь админ/учитель
могут открывать/закрывать конкретные симуляции классам и ученикам — закрыт UX-
разрыв из 1a (новые классы без UI-управления). Тест: каталог включает sims; 210 pass.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Режим «По контенту»: поиск по названию в левой колонке (обновляет только список,
фокус сохраняется) + подзаголовки по предмету (Математика/Физика/…). У раскрытого
класса рядом с tri-state каждого ученика — бейдж итогового доступа «видит/не видит
· лично|по классу|по умолч.» (считается клиентски из загруженных правил) — снимает
путаницу «наследовать/открыт/закрыт».
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
GET /api/access/matrix (классы + карта открытого контента одним запросом,
скоуп учителя). Клиент LS.accessMatrix. Третий режим вкладки «Доступ»:
таблица контент × классы с чекбоксами (правка в один клик) + поиск по
названию (обновляет только tbody — фокус ввода сохраняется), залипающие
заголовки. Тест /api/access смонтирован в харнесс; content-access.test 11/11
(+матрица: учитель видит свои классы и открытый контент, ученику 403).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- contentAccess.purgeAccessFor(scope,id) — единая точка очистки content_access
(нет FK). deleteClass и _deleteUserTx переведены на неё (убрано дублирование).
- Админ-UI: confirm() перед «Закрыть у всех / Закрыть весь» (необратимая массовая
операция больше не срабатывает мгновенно).
- Новый тест content-access.test.js (9/9): allowlist, ученик>класс, наследование
главой хаба, admin/teacher bypass, allowedRefs/filterTextbooks, purgeAccessFor,
чистка правил при DELETE класса. Полный backend-набор: 203/206 (3 — baseline Auth).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Дроби и доли, основное свойство и сокращение, смешанные числа, сравнение,
сложение/вычитание/умножение/деление дробей, задачи на дроби; геометрия:
параллельные/перпендикулярные прямые, периметр многоугольника, площадь и
площадь треугольника, среднее арифметическое, столбчатые диаграммы,
параллелепипед и объём (2D-изометрия). Inline-SVG визуалы (полоса долей,
сетка умножения, изометрия). Реализовано Sonnet-агентом инкрементально по
образцу math_5_ch1; проверено: грузится без ошибок, §1–18 без заглушек.
Учебник «Математика 5» наполнен ЦЕЛИКОМ (3 главы, 44 §). Тесты math5: 12/12.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Числовые выражения и порядок действий, выражения с переменными, уравнение
(SVG-весы + решение/проверка корня), формулы (P,S,путь), решение задач
уравнением, угол (SVG-рисунок + классификация острый/прямой/тупой/развёрнутый),
прикладные/занимательные/исторические § + финал-боссы. Реализовано Sonnet-агентом
по образцу math_5_ch1, проверено: грузится без ошибок, §1–9 без заглушек. Тесты: 11/11.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
§15 Математика вокруг нас (задачи из жизни + прикидка в уме). §16 Движение/
взвешивание/переливание (s=v·t тренажёр + логические задачи). §17 Исторические
сведения (системы счисления; тренажёр римских цифр + квиз по истории чисел).
Глава 1 целиком: §1–17 + финал, все § наполнены (тест «нет заглушек»). Эталон
для Sonnet по Гл.2–3. Тесты math5: 9/9.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
§10 Степень (a^n, основание/показатель; квадрат из клеток a×a + тренажёр степеней).
§11 Деление с остатком (a=bq+r; точки по b в ряд, остаток красным + тренажёр
неполного частного). §12 Делители/кратные, НОД/НОК (делители-чипсы с подсветкой
общих → НОД + тренажёр НОК). Шпаргалки/типсы §10–12. Тесты math5: 8/8.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
§7 Округление (правило + округление на координатном луче до десятков + до
сотен/тысяч). §8 Сложение/вычитание (столбик, свойства + тренажёр + «найди
неизвестное» как подготовка к уравнениям). §9 Умножение/деление (прямоугольник
из точек a×b как визуал + тренажёр ×/÷). Шпаргалки/типсы §7–9. Тесты math5: 8/8.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
§1: 4 шага решения (Пойа) + тренажёр «на каком шаге ученик» + решатель задач.
§2: натуральные числа и нуль, классы/разряды, интерактивная разрядная таблица
(ввод числа → раскладка по классам единицы/тысячи/миллионы) + тренажёр «цифра
в разряде». Финал главы 1 — 5 боссов (разряды/округление/действия/степень).
Шпаргалки/типсы/глоссарий для §1/§2/финала. §3–17 пока заглушки движка.
Тесты math5: 8/8.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Math6Anim.triangleDrag (SVG): тащишь вершины A/B/C — тип пересчитывается
вживую по сторонам и по углам, штрихи равных сторон + метка прямого угла.
Блок «Песочница» перед интерактивами §3. Тесты math6: 20/20.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Math6Anim.barModel — полоса 0..100%, заполняется (easing) к проценту,
синхронно %↔десятичная↔дробь; вшита в §2.1 на тот же ползунок, что и сетка 100.
Math6Anim.setFilter — числа 1..12 по очереди проходят сквозь «фильтр свойства»
(чётные/кратные 3/больше 6), подходящие падают в множество; кнопки смены свойства;
вшита в §3.1. Теперь во ВСЕХ 6 главах есть canvas-анимации + stepPlayer везде.
Headless-safe. Тесты math6: 20/20.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Math6Anim.reflectFold: на координатной плоскости треугольник плавно
переходит на свой образ — центральная (поворот 180° вокруг O, режим
'central') или осевая (отражение через Oy, режим 'axial'); образ показан
красным пунктиром, ось/центр выделены. Один компонент закрыл §4 и §5.
Headless-safe. Тесты math6: 20/20.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Math6Anim.numberLineJumps — a·b как a прыжков-дуг по b на числовой прямой
(зелёные вправо, красные влево, приземление на произведение); ползунки a,b.
Math6Anim.coordGame — «поставь точку (x;y)»: клик по узлу сетки, проверка,
счёт, при промахе показывает верную точку. План: 3D-тела исключены.
Headless-safe. Тесты math6: 20/20.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Math6Anim.thermometer: вертикальный термометр на canvas, ртуть плавно
поднимается/опускается к значению (easing), выше нуля — красный, ниже — синий;
подпись поясняет знак и |x| как расстояние до нуля. Ползунок −10..10.
Вшит в Гл.4 §1. Headless-safe. Тесты math6: 20/20.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Math6Anim.stepPlayer (DOM): пошаговый плеер с кнопками Назад/Дальше/Авто
и точками прогресса, рендерит KaTeX по шагам. Math6Anim.stepifyExamples
сканирует секцию и превращает карточки «Разбор по шагам» (<ol> в теле) в
такой плеер. Движок зовёт stepifyExamples в goTo (guarded) → автоматически
во ВСЕХ главах и параграфах, включая простые работы с дробями/столбиком.
Подключён math6_anim в Гл.2,3 (теперь во всех 6). Тесты math6: 20/20.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Math6Anim.plotLive: canvas-плоскость с сеткой/осями; кривая плавно «перетекает»
(easing к целевому k). Переключатель прямая (y=kx, через начало) / обратная
(y=k/x, две ветви). Слайдер k (−4..4, шаг 0,5) двигает кривую вживую.
Вшито в Гл.5 §3 рядом со статичным графиком. Headless-safe. Тесты 19/19.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Новый headless-safe движок window.Math6Anim (по канве chem7_anim:
RAF-цикл с паузой вне экрана через IntersectionObserver, prefers-reduced-motion,
в jsdom/HeadlessChrome getContext НЕ вызывается → тесты не падают).
Демо: rollingCircle (колесо катится → путь = C=2πr=πd), sweepArea
(радиус заметает круг → S=πr²), areaModel (площадная модель умножения a·b
на сетке 0,1). Вшито: Гл.6 §2 (колесо + заметание), Гл.1 §6 (умножение).
Тесты math6: 19/19 (+canvas-демо монтируются headless-safe).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Каждый содержательный параграф 6 глав дополнен (Sonnet, по главе):
- карточка «Где это в жизни» (реальный контекст темы);
- «Разбор по шагам» (нумерованный алгоритм решения);
- «А знаешь ли ты?» (интересный факт/история);
- доведено до ≥2 рабочих интерактивов (где было меньше — добавлены).
Движок/общие файлы не трогались; структура M6/порядок init сохранены.
Проверено: тесты math6 18/18, честный рендер 4 глав — контент появляется,
рантайм-ошибок нет (только jsdom scrollTo-заглушка).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Реальная причина пустых §1 (заглушки) во всех главах: в math6_engine.js
вызов init() стоял ВЫШЕ строк window.makeCard=…/secNav=…. При обычной
загрузке через defer скрипт исполняется при readyState='interactive',
поэтому ветка `else init()` срабатывала синхронно — init→goTo→buildP1()
звал makeCard ДО его экспорта → ReferenceError 'makeCard is not defined'
→ перехват в ensureBuilt → заглушка. В jsdom-тестах баг не воспроизводился
(там старт шёл через DOMContentLoaded, экспорты успевали).
- init() теперь вызывается СТРОГО после всех window.* экспортов.
- ensureBuilt перечитывает window.M6 (надёжнее против устаревшего замыкания).
- html учебника всегда no-store (убрал кэш-причину стале-страниц).
- регресс-тест: init() обязан идти после window.makeCard. Тесты 18/18.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Капстоун-бой из 6 испытаний (по одному из каждой главы: десятичные,
проценты, множества, рациональные, координаты, геометрия) с HP-баром.
Победа 5/6 → +150 XP (LS.xp) + звание «Математик 6 класса» (зажигается
ачивка-strip, флаг localStorage math6_course_done). Тесты math6: 17/17.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
§1 множество/элементы/∅ (∈ или ∉ + счёт элементов);
§2 способы задания (свойство→множество + проверка по свойству);
§3 операции ∩/∪ (наглядно через Math6.venn + счёт результата);
§4 круги Эйлера (задача с числами в областях + формула |A∪B|=|A|+|B|−|A∩B|);
финал — 5 боссов. Добавлен Math6.venn (две окружности с заливкой
областей и числами). Тесты math6: 16/16.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
§1 тела (куб/призма/пирамида/цилиндр/конус) + развёртки: квиз грани/рёбра/
вершины + «какое тело из развёртки»; §2 окружность и круг (слайдер r → C, S
при π=3,14) + тренажёр; §3 виды треугольников по сторонам и по углам
(классификация вычисляется из координат, штрихи равных сторон, метка прямого
угла); §4 центральная симметрия (построй A'); §5 осевая симметрия (Oy/Ox);
финал — 5 боссов. SVG: тела/развёртки/треугольники inline, симметрия на
Math6.plane. Тесты math6: 14/14.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
§1 чтение координат + определение четверти (плоскость с точкой);
§2 чтение графиков реальных процессов + изменение величины (polyline);
§3 слайдер y=kx + классификатор прямая/обратная пропорциональность;
§5 прикладной (путь–время); финал — 5 боссов (координаты, четверти,
график, k для y=kx и y=k/x). Math6.plane получил поддержку polyline.
Тесты math6: 13/13.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
§12 «Математика вокруг нас»: задачи из жизни (покупки, сдача, измерения)
+ среднее значение. Финал главы: бой с 5 боссами (разряды, округление,
сложение/вычитание, умножение, деление на дробь) с HP-баром; победа 4/5+
даёт +40 XP и достижение «Глава 1 пройдена». Эталонная Глава 1 готова: все
12 параграфов наполнены. Тесты 12/12.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Перенесён подход из редактора теории:
- модалка «Вставить формулу»: палитра символов по категориям
(греческие/операции/степени/отношения/стрелки/скобки/физика),
LaTeX-поле, живое KaTeX-превью, режим «в строке \( \)» / «блоком \[ \]»
- кнопка «ƒₓ» у каждой стороны карточки и в add-bar; вставка в активное поле
- палитра на data-tex + делегирование (inline-onclick схлопывал «\» в латехе)
- Ctrl+Enter в поле формулы = вставить; разделители совпадают с рендером изучения
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- модалка в 2 шага: текст -> предпросмотр карточек, к каждой стороне
можно прикрепить картинку перед импортом
- addCardsBulk принимает front_image/back_image (через safeImg) и теперь
санитизит front/back (stripTags) — раньше bulk пропускал теги
- общий ensureImgPicker() переиспользуется редактором и предпросмотром
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
renderFlashcardWidget рисует front_image/back_image на обеих сторонах;
.fcw-inner.has-img расширяет высоту карточки под изображение.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>