Files
Learn_System/plans/lab-content-engine/CONTEXT.md
T
Maxim Dolgolyov 0888a707cc fix(lab-content-engine): phase 0 - устранены 3 блокера ревью
- подключён _registry.js в lab.html (был отсутствует -> LabRegistry был undefined)
- регистрация 3 пилотов в _pilots.js (graph/quadratic/pendulum), подключён последним
- loadTheory (lab-glue.js) адаптирован: реестр в приоритете, иначе THEORY

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-30 13:04:39 +03:00

5.0 KiB
Raw Blame History

Feature Context: Контент-движок лаборатории

Current State

  • Лаборатория работает на захардкоженной регистрации (см. PLAN.md Summary).
  • Ветка feature/lab-content-engine создана от master.

Architecture map (как было ДО рефактора)

  • frontend/lab.html — sim-тела <div id="sim-xxx"> (inline HTML, ~3000 строк) + 58 <script> тегов (4800-4861) + three.js.
  • frontend/js/labs/lab-glue.js:
    • _catFilter, _disabledSimIds, _simModuleDisabled (вкл/выкл из админки)
    • filterSims(), renderSims() (карточки каталога)
    • preview-хелперы _grid/_axes/_svg + ~60 констант P_*
    • массив SIMS (821-866), window.SIMS/window.LAB_SIMS
  • frontend/js/labs/lab-init.js:
    • объявления переменных симуляций (gSim, pSim, …)
    • ALL_SIM_BODIES / ALL_CTRL_BARS (33-48)
    • _pauseAllSims() (54-91), openSim(id) if-цепочка (93-160), closeSim() (212-258)
    • _simShow(), _addTouchSupport() (touch-bridge + ResizeObserver)
    • объект THEORY + loadTheory() + _theoryToggle()
    • функции _openXxx() (603-756) — единый шаблон: _simShow('sim-xxx') + ленивое new XxxSim(...) + показ ctrl-xxx
  • frontend/js/admin/sections/sims.js — админ-секция (пока только вкл/выкл, _disabledSimIds).

Загрузочный порядок (КРИТИЧНО)

В lab.html: движки _fx_*, _phys_visuals, _graph_panel, _chem_visuals грузятся ПЕРЕД симуляциями. lab-init.js (4826) грузится ПЕРЕД lab-glue.js (4827). renderSims() вызывается в конце lab-glue. Некоторые sim-файлы (graph.js) грузятся РАНЬШЕ lab-glue.js → preview P_* ещё не определены на момент исполнения их тел. => В манифестах preview поддерживает функцию (ленивое вычисление в renderSims), не только строку.

Контракт LabRegistry (Фаза 0)

LabRegistry.register(manifest)  // manifest.id уникален; повторная регистрация перезаписывает
LabRegistry.get(id)             // по base-id (без ':arg')
LabRegistry.has(id)
LabRegistry.all()               // в порядке регистрации
LabRegistry.setActive(sim) / stopActive() / destroyActive()  // менеджер жизненного цикла

manifest: { id, cat, title, desc, preview(string|fn), theory?, bodyId?, mount?(host), open(ctx), stop?(), destroy?(), subject?, grade?, topics? }

Адаптер (Фаза 0): реестр в приоритете, иначе legacy

  • renderSims() — порядок берём из исходного SIMS; для id, который есть в реестре, используем манифест (resolve preview), иначе legacy-запись; в конце добавляем registry-only записи, которых нет в SIMS.
  • openSim(id)base = id.split(':')[0]; если LabRegistry.has(base)stopActive(); get(base).open({arg}); setActive; иначе старый if-путь.
  • loadTheory(id) — если get(base).theory есть → рендерим из него; иначе THEORY[base].
  • closeSim()/_pauseAllSims() — дополнительно LabRegistry.stopActive() / destroyActive().

Temporary Workarounds

  • Пилоты (graph/quadratic/pendulum) оставлены в SIMS/THEORY для порядка карточек и единого источника теории; merge перекрывает по id. Удалить в Фазе 1.

Known follow-ups (из ревью Фазы 0)

  • При переключении на LEGACY-симуляцию LabRegistry._active не очищается → лишний destroyActive() на неактивной. Безвредно сейчас; очистить _active на legacy-open в Фазе 1.

Cross-Phase Dependencies

  • Фаза 1 опирается на ядро реестра из Фазы 0.
  • Фаза 3 (ленивая загрузка) опирается на манифесты с зависимостями движков (Фаза 1/2).
  • Фаза 4 (БД) мёржит код-манифесты Фазы 1 с оверрайдами.
  • Фаза 5 использует поля subject/grade/topics из манифестов.

openSim('stereo:figure'), ?stereofig=, обратная совместимость magnetic/coulomb→emfield, thinlens/mirrors/refraction→opticsbench.

Проектные правила (НЕ нарушать)

  • Иконки: только inline SVG .ic, НЕ эмоджи.
  • Поиск по коду: ast-index, НЕ Grep tool.
  • БД: встроенный node:sqlite DatabaseSync, НЕ better-sqlite3.
  • Git: коммитить только изменённые файлы.