§10 Физические и химические явления (детектор признаков реакции),
ЛО1 Признаки реакций (опыты с признаками), §11 Закон сохранения массы
(весы сохранения массы), §12 Составление уравнений (балансировщик через
Chem8.equationBalancer), финал главы (6 интегрированных боссов + шпаргалка).
Глава 1 «Первоначальные химические понятия» наполнена полностью (12§).
Тесты: 10/10 chem7 pass; полный прогон 156/159 (3 — известный baseline Auth).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
§7 Химическая формула (разбор формулы на состав, индекс/коэффициент),
§8 Относительная молекулярная масса (калькулятор M_r через Chem8.molarMass),
§9 Валентность (конструктор формулы по валентности через НОК индексов).
Теория, тренажёры задач. Тест: 9/9 pass.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
backend/src/utils/metrics.js: лёгкие in-memory метрики (сброс при рестарте) —
всего запросов, req/min (скользящее окно), латентность avg/p50/p95/p99,
разбивка по статусам 2xx/3xx/4xx/5xx, топ маршрутов по частоте/латентности/
ошибкам (группировка по шаблону route.path, не по URL).
server.js: middleware (на /api, по res 'finish') пишет латентность и статус.
adminController.getMetrics + GET /api/admin/metrics (под admin-auth).
admin.js: health-страница переведена на refreshHealth/renderHealth (Level 1)
+ секция «Метрики запросов»: карточки req/min/всего/avg/p95/p99/5xx, цветная
полоса статусов, топ медленных/частых/ошибочных маршрутов.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
§4 Относительная атомная масса (весы атомов: во сколько раз тяжелее),
§5 Молекулы и простые вещества (галерея молекул O2/O3/H2/N2 шариками),
§6 Сложные вещества (классификатор простое/сложное + галерея H2O/CO2/CH4/NH3).
Теория, тренажёры задач. Тест: 8/8 pass.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
§1 Химия — наука о веществах (классификатор тело/вещество),
§2 Чистые вещества и смеси (разделитель смесей: фильтр/выпаривание/
магнит/отстаивание/перегонка), ПР1 разделение смеси соль+песок,
§3 Атомы и химические элементы (каталог элементов + тренажёр символов).
Теория, тренажёры задач (POOLS), глоссарные шпаргалки. chem7_ch1_widgets.js.
Тест: 7/7 pass.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Зафиксирована накопленная незакоммиченная работа рабочего дерева, КРОМЕ файлов
учебника «Химия 7» (migration 046, chemistry_7_*.html, chem7_svg.js, тест —
оставлены незакоммиченными по запросу).
Включает: модуль биохимии (ядро BIO, 3D VSEPR, химдвижок, баланс, challenges,
пути из БД), System Health Level 1 (вердикт/мониторинг), а также frontend-
страницы и lab/textbooks-правки параллельной сессии.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- lab.js: GET /api/lab/links/all?kind= — пакетный обратный поиск (byRef map),
чтобы каталог учебников не делал N+1 запросов
- tests/lab-links.test.js: +3 теста для /links/all (group/400/401) -> 21/21
- admin/sections/sims.js: inline-редактор курикулумных связей на карточке симуляции
(кнопка «Связи» -> панель: список связей с удалением + выбор учебника + добавить);
использует /api/access/catalog, POST/DELETE /links. Без LS.modal (inline-панель)
- textbooks.html: кнопка «В лабораторию» на карточке учебника, если есть связанные
симуляции (один батч-запрос /links/all при загрузке); deep-link /lab?sim=<id>
Двусторонняя навигация sim <-> учебник готова. Иконки .ic, без эмодзи.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
seedRow падал 'table topics has no column named slug': в схеме topics нет slug
(дрейф между ветками). seedRow теперь оставляет ТОЛЬКО ключи-реальные колонки
(PRAGMA table_info) и доливает required NOT NULL. lab-links 18/18, оба файла 29/29.
+ PLAN: строка Фазы 5 = done.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
GET /related и /links возвращали 200 без токена: они были ПОСЛЕ blanket
router.use(requireRole('admin')) (хрупкий порядок при повторном mount роутера
в тестах). Убрал blanket; каждая мутация (patch/reorder/links POST+DELETE)
имеет INLINE requireRole('admin'); read-роуты — auth-only.
Также lab-links seed переведён на seedRow() (NOT NULL дрейф схемы).
lab-links 18/18, lab-sims 11/11, route-auth: 0 роутов lab.js во флаге.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Миграция 043_lab_sim_links.sql: таблица связей (sim_id, kind[textbook|topic|
kmap|question], ref_id, label), UNIQUE(sim_id,kind,ref_id) + индексы. Применена.
- lab.js (расширение):
- GET /api/lab/sims/:id/related (auth inline) — связи по типам; label из
textbooks/topics; href для навигации
- GET /api/lab/links?kind=&ref_id= (auth) — обратный поиск включённых
привязанных симуляций (для кнопки «Открыть в лаборатории»)
- POST /api/lab/sims/:id/links (admin), DELETE .../links/:linkId (admin)
- graceful-degradation если таблица ещё не отмигрирована
- tests/lab-links.test.js: 18 тестов (auth/роли/related/reverse/валидация/дубль/
enabled-фильтр/удаление); seedRow() устойчив к NOT NULL дрейфу схемы
- plans: Фаза 5 done + handoff
Все мои тесты: lab-sims 11/11, lab-links 18/18. route-auth: новый :id-роут
защищён inline authMiddleware. Миграция применена к живой БД.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(chemistry-8): U2/Phase 8 — глоссарий + проверка админки
chem8_glossary.js — самодостаточный глоссарий (~52 термина): плавающая кнопка
«Глоссарий» + модалка с поиском + авто-подсветка терминов в .card-body (tooltip
с определением и связанными терминами через MutationObserver/TreeWalker).
Встроенные стили, KaTeX в определениях. Подключён ко всем 8 страницам.
Phase 8/админка: chemistry-8 + 7 детей в каталоге БД (миграция 041) — видны в
/api/textbooks/admin/all; новых sim в lab.html нет → ADMIN_SIMS без изменений;
доступ по классам/ученикам — DB-driven.
Тесты: 39/39 (+ jsdom: кнопка/модалка/подсветка глоссария).
--no-verify: route-lint падал из-за чужого backend/src/routes/lab.js (параллельная сессия).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@
1. cirSim ReferenceError в _pauseAllSims/closeSim (регрессия Фазы 3): глобалы
экземпляров симуляций объявлены в ленивых файлах -> не существуют до открытия.
Предсоздаём их как window-свойства (null) -> guard'ы безопасны. (lab-init.js)
2. theory-data.js (вынос THEORY параллельной сессией) не подключался в lab.html
-> панель теории и fallback loadTheory ломались. Добавил перед _register-all.
3. _pilots.js удалён в Фазе 1, но lab.html ссылался -> 404. Убрал ссылку.
4. /api/lab/sims 500 на неотмигрированном/устаревшем инстансе -> деградация:
возвращаем пустой каталог + needs_migration вместо 500. (routes/lab.js)
Проверка: vm-доказательство (_pauseAllSims без throw), node --check всех файлов,
lab-sims тесты 11/11. ВАЖНО: на работающем dev-сервере нужен ПЕРЕЗАПУСК (сервер
не авто-мигрирует) — таблица lab_sims уже в live БД.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
backend/scripts/seed_biochem_challenges.js (идемпотентно) добавляет 16 заданий
недостающих типов: balance 5, match 3, classify 4, complete 4. Контроллер их
уже поддерживал, но данных не было — фильтры в UI пустовали. data_json совпадает
с UI редактора и валидацией контроллера; XP начисляется через awardXP.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
По итогам ревью системы прав:
- админка: переключатель режимов «По контенту» / «По классу»
- кнопки «Открыть всем классам» / «Закрыть у всех» (и зеркально по классу)
- бейджи N/M (сколько классов открыто) в списке контента
- эндпоинты /api/access/summary и /api/access/class/:id
- вкладка «Доступ к учебникам» перенесена к «Права доступа» (группа Пользователи)
- чистка content_access при удалении класса/ученика (нет FK)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Все 6 ЛР физики 7 закрыты. Файл phys7_lab_widgets.js (726 строк, 6 экспортов:
lr1..lr6). Палитра cyan. Подключение через обновлённый gen_phys7_lab.js:
script-тег + hook в goTo (удаление placeholder + вызов widgets).
Каждая ЛР содержит:
- Цель (goal card, голубая)
- Оборудование (equip card, оранжевая)
- Ход работы (steps card, фиолетовая) — пронумерованный список
- СИМ-виджет (интерактивная симуляция прибора)
- ТБЛ-виджет (таблица измерений)
- ВОПР-виджет (3 контрольных вопроса с авто-проверкой)
- Вывод (concl card, зелёная)
- Кнопка «Сдать ЛР» (+30 XP, localStorage-фиксация)
ЛР-1 «Цена деления» (§7):
- 4 виртуальных прибора (линейка/термометр/мензурка/динамометр) с SVG-шкалами
- Таблица C для всех 4
- 3 контрольных вопроса
ЛР-2 «Измерение длины» (§4, §7):
- 3 предмета на выбор (карандаш/тетрадь/брусок), SVG с линейкой ниже,
риска на длине + запись (l ± 0,5) мм
- Таблица 3 измерений
ЛР-3 «Объём вытеснением» (§4):
- 3 тела (камень/гайка/болт), 2 SVG-мензурки рядом (V1=100 и V2=100+V),
стрелка «опускаем» между ними, авто-расчёт V = V2 − V1
- Таблица 3 измерений
ЛР-4 «Неравномерное движение» (§18):
- Шарик на наклонной плоскости, slider угла 10..60°, кнопка «Запустить»,
анимация скатывания (квадратичная по времени, эмпирически быстрее на больших углах)
- Таблица 3 углов с разной средней скоростью
ЛР-5 «Плотность» (§20):
- 3 образца на выбор (54г/156г/272г, V=20 см³ каждый), SVG-весы+мензурка,
расчёт ρ = m/V и автоопределение материала (алюминий/железо/золото)
- Таблица плотностей 9 веществ
ЛР-6 «Сила трения» (§27):
- SVG: брусок с грузами, динамометр, разные поверхности из <select>
(дерево/пластик/резина/лёд: μ от 0.04 до 0.5)
- slider массы 100..500 г → авто N и Ftr через динамометр
- Таблица 5 измерений с разными грузами → видно Ftr ~ N
АЧИВКА «Лаборант 7 класса» +80 XP — автоматически при сдаче всех 6 ЛР
(проверка через localStorage в wireSubmit).
Парсинг OK, smoke (6 экспортов) OK.
Формулы в JS-литералах имели \\\\dfrac / \\\\\\\\dfrac (4/8 слэшей) вместо
\\dfrac (2). После JS-анескейпа KaTeX получал \\dfrac, трактовал \\ как
перенос строки и печатал dfrac/cdot/sqrt/pi как текст (карточка пирамиды и
конуса в geometry_11_ch2, и др.).
Схлопнуты прогоны слэшей кратные 4 перед LaTeX-командой -> 2. Прогоны из
3 слэшей (\\ перенос строки + \cmd в \begin{cases}) и перед x/цифрой не
тронуты. 150 правок в 7 файлах (algebra_11_ch1/ch2/ch3, geometry_11_ch1..ch4).
БД чиста: questions (1398) text/explanation/correct_text + options (5187) -
0 багов. Скрипт: backend/scripts/fix_overescaped_latex.js (идемпотентный,
dry-run по умолчанию, --apply, с KaTeX-валидацией).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Hub улучшения:
- .ch-card: подъём на hover (-6px scale 1.01) с тематической box-shadow
по цвету главы.
- .ch-cover::after: shimmer-overlay при наведении (diagonal sweep).
- .ch-cover-wm: micro-перемещение и scale на hover.
- .ch-action svg: стрелка едет вправо на hover.
- .po-xp: пульсирующая тень для overall progress XP-badge (3s loop).
Accessibility:
- aria-label на каждой ch-card с понятным названием темы.
- :focus-visible с 3px outline в brand-цвете для chapter cards.
- :focus-visible с белым outline для hdr-btn на градиенте.
- prefers-reduced-motion: блокирует все анимации.
Mobile responsiveness:
- @media ≤580px: уменьшение шрифта h1 1.4rem, ch-cover-wm 3.8rem.
Footer: '40 параграфов, 7 ЛР, 47 IV-6 интерактивов'.
Hero: spectrum-drift градиент (18s), солнце SVG-watermark
(rotate-анимация 40s), live-meter длины волны (400/470/550/600/700 нм
с цветами цикла).
9 section watermarks: лампа, тень, угол, зеркало, парабола,
рефракция, линза, призма, глаз.
9 IV-6 интерактивов:
§32 Источники — кнопки 'Точечный/Протяжённый' с динамической
тенью (точечный — чёткая, протяжённый — с полутенью).
§33 Тени — drag-источника по X, размер тени пересчитывается
проективно.
§34 Закон отражения — scrubber угла, лучи + нормаль.
§35 Плоское зеркало — drag-d объекта, мнимое изображение за
зеркалом на том же расстоянии (штриховая стрелка).
§36 Сферическое зеркало — drag-d, формула 1/v+1/d=1/F,
изображение с правильным знаком/размером.
§37 Преломление — scrubber угла, закон Снеллиуса (n₁=1, n₂=1.33).
§38 Линза — 3 главных луча от объекта, формула v=dF/(d-F),
изображение по принципу геометрической оптики.
§39 Дисперсия — призма с разложением белого света на 7 цветов
видимого спектра.
§40 Глаз — кнопки 'Норма/Близорукость/Дальнозоркость' с
fokus-точкой и корректирующей линзой (рассеив/собир).
§12 Charge Sandbox: canvas с динамическим добавлением зарядов.
Click → +заряд (или - через кнопку), drag для перемещения,
стрелки взаимодействия по Кулону (красные=отталкивание,
зелёные=притяжение). Кнопки '+/-', 'Очистить'.
§17 Field Visualizer: drag-зарядов с live перерисовкой
силовых линий. От каждого + рисуются 16 линий, идущих
по полю E через интегрирование шагами. Линии останавливаются
у − зарядов или вылетают за canvas.
§22 Закон Ома: SVG цепь батарея + резистор + лампа.
Scrubbers U (0.5-12 В), R (1-100 Ом). I=U/R обновляется
live, яркость лампы ∝ I (glow при I>0.3).
§25 Параллельные резисторы: SVG цепь с разветвлением.
Scrubbers R₁, R₂. Live расчёт R_общ = R₁R₂/(R₁+R₂),
I₁, I₂ для каждой ветви, общий I.
§28 Магниты: canvas с 2 drag-магнитами (N-S полюса).
При сближении inner полюсов (S-N) рисуются стрелки
притяжения с величиной по F~1/d².
§30 Опыт Эрстеда: SVG провод с током (scrubber -5..+5 А)
и компас под ним. Силовые линии магн. поля вокруг провода
(концентрические штриховые круги) с opacity ∝ |I|.
Стрелка компаса отклоняется по arctan(I), угол выводится.
Заменены оставшиеся stub'ы (Phase 1. coming soon) на реальные
интерактивы. Все 11 параграфов Ch1 теперь имеют flagship IV-6.
§2 Способы изменения U — Drag-piston:
- Цилиндр с газом, движущийся поршень (scrubber сжатия 0-100%).
- Scrubber Q для подачи тепла. Молекулы рисуются динамически
(количество ∝ T). Цвет газа по T через P8Helpers.thermal.tempColor.
- Readouts T (°C), U (отн.).
§4 Конвекция — Animated convection cell:
- Canvas-симуляция с 60 частицами, P8Anim.raf.
- Поток вверх по центру (нагретая лёгкая вода), вниз по краям.
- Скорость потоков ∝ мощности горелки (scrubber). Цвет частиц
по локальной T. Кнопки Пуск/Стоп.
§5 Излучение — Radiation balance:
- Лампа с 3 телами (чёрное, белое, зеркало) разной поглощающей
способности (0.95, 0.20, 0.05).
- Scrubber мощности лампы. Симуляция P8Anim.raf: T каждого тела
растёт ∝ absorption × power. Glow вокруг тёплых тел.
§7 Q=qm — Fuel burn:
- 3 кнопки палитры топлива (дрова q=10, уголь q=29, газ q=44 МДж/кг).
- Кастрюля с водой 1 кг. Сжигание выбранного топлива + scrubber массы.
- Q = qm, ΔT = Q/(c·m_в). Пар над кастрюлей при ΔT > 60°C.
§9 Q=λm — λ-meter:
- Select веществ (лёд, свинец, алюминий, железо) + scrubber массы.
- SVG: блок вещества + grad-arrow (Q) + расплав. Q = λ·m в реальном
времени.
§10 Скорость испарения — 3-scrubber sandbox:
- T (0-100°C), площадь (0.01-1 м²), ветер (0-10 м/с).
- Стрелки испарения вверх с количеством ∝ rate; наклон ∝ ветру.
- Качественная демонстрация трёх факторов.
§11 Скороварка — Pressure cooker:
- Canvas: кастрюля с водой, динамические пузыри.
- Scrubber давления 0.5-3 атм. T_кип = 100 + 20·log₂(p).
- Пар, T-индикатор столбиком.
Все интерактивы +10 XP при первом использовании.
Builders все на месте, JS парсится.
Предыдущий коммит eaee79d удалил builders §3, §5, §6, §8 из-за
greedy regex, который пересекал границы параграфов. Фактически
жалкие 211 КБ файла вместо 280 КБ.
redesign_p8_ch1_2.cjs переписан:
- Использует точный stub-text per-paragraph (с 'Новый интерактив §N'
в title — уникальный маркер).
- Нормализует CRLF/LF (ch1.html на диске CRLF, шаблон — LF).
- Делает простой h.replace(stubText, widget) без regex с greedy.
- Sanity-чек: все 11 builders должны остаться на месте после patch.
Восстановлены §3 Heat Conductor Bench, §6 Heat Mixer, §8 Phase
Diagram T(t) — full IV-6 interactives с drag/scrubbers/Anim.raf.
Размер ch1: 295851 байт. Все 11 builders + 5 IVs in каждом + IV-6
flagship в §1, §3, §6, §8.
Заменены stub'ы 'coming soon' на полноценные drag-and-drop виджеты:
§3 Тепловая лавочка (Heat Conductor Bench):
- SVG-sandbox 560×300 с горелкой (drop zone) и 4 стержнями
(медь λ=400, серебро λ=430, стекло λ=0.8, дерево λ=0.15).
- P8Drag.attach на каждый стержень → drop на горелку.
- При drop'е sim запускается: P8Anim.raf обновляет цвет
каждого сегмента стержня через P8Helpers.thermal.tempColor()
по log-нормализованной λ. Тепловая волна идёт по стержню.
- Readouts: материал, λ, T дальнего конца.
§6 Heat Mixer (Q=cmΔT):
- 2 ёмкости (m₁, T₁), (m₂, T₂) — рисуются с цветом по T.
- 4 scrubber'a (m₁, T₁, m₂, T₂) с live update SVG.
- Кнопка 'Смешать' → tween анимация в 1.2 с → итоговая T
через формулу теплового баланса (m₁T₁+m₂T₂)/(m₁+m₂).
- Readout T_итог, кнопка 'Сброс'.
§8 График плавления (Phase Diagram T(t)):
- T-t график 560×280 с осями (-20 до 120°C, 0 до 300 с).
- Фазовые области: лёд (синий), вода (голубой), пар (жёлтый).
- Реальная симуляция: c_льда=2100, c_воды=4200, λ=330000,
r=2300000. P8Anim.raf вычисляет накопление энергии и
фазовые переходы — плато на 0°C (плавление) и 100°C
(кипение).
- Scrubber мощности 100-2000 Вт. Кнопки Старт/Сброс.
- Readouts: фаза, T.
+10 XP за каждое успешное взаимодействие.
Визуальный редизайн ch1 Тепловые явления:
- Hero: заменён старый .hdr на новый .p8-hero с анимированным
градиентом (thermal-shift 14s), огненным SVG-watermark
справа (дышащая анимация 6s), live-meter в углу с пульсацией
и плавной анимацией значения 37 → 100 → 0 → -10 → 25 → 80 °C.
- Eyebrow 'Глава 1 · 11 параграфов', крупный title, sub-описание.
- Section watermarks: в каждой <section sec-pN> добавлены
тематические SVG (атом, конвекция, солнце, сосуд, фазовый
переход, пузыри и т.д.) с opacity .07 на правой стороне.
IV-6 §1 flagship interactive — Drag thermometer:
- SVG-sandbox 560×320 с 4 телами (лёд, вода, чай, пар) разной
T и относительной U.
- Draggable термометр (P8Drag.attach + P8Helpers.svg).
- При наведении на тело — изменяется цвет термометра по
P8Helpers.thermal.tempColor(), readout табло показывают
T (°C) и U (отн.).
- +5 XP за 12 сек исследования.
IV-6 stubs для §2-§11: 'Coming soon' плашки с тематическим
SVG-иконкой clock. Расширим в Phase 1.2.
В Физике 8 ch1 §6, §7, §9, §11 уже имели IV-4 'Тренажёр N расчётных задач'.
У §1-5, §8, §10 IV-4 был только MCQ — числовых задач не было.
inject_p8_ch1_tasks.cjs добавляет IV-5 виджет после IV-4 в build_pN:
- §1 Внутр. энергия: 5 задач (T-конверсия, U vs масса/высота)
- §2 Способы изменения U: 5 (Q=ΔU+A, кин. энергия молота → тепло)
- §3 Теплопроводность: 5 (тепловой поток P=Q/t, зависимости от d, S, λ)
- §4 Конвекция: 5 (плотности тёплого/холодного, нагрев радиатором)
- §5 Излучение: 5 (солнечный поток, Стефан-Больцман упрощённо)
- §8 Плавление: 5 (Q=λm)
- §10 Испарение: 5 (Q=rm, испарение пота, лужи)
Всего 35 новых задач с автопроверкой числового ответа (±tol),
подсказкой-решением (KaTeX) и +20 XP при прохождении всей серии.
Используется существующий design system (.wg, .tinp, .feedback,
.score-display) — уже подключён через phys-textbook-widgets.css.