# Phase 1: Миграция всех симуляций на манифесты

**Status:** ✅ Done (ebb2a9b, reviewed PASS, pushed)
**Parent plan:** [PLAN.md](./PLAN.md)
**Domain:** frontend

## Objective
Перевести все ~49 симуляций на сам/регистрацию через `LabRegistry`. Перенести данные
(catalogue meta, preview, theory) и поведение (open/stop/destroy) в манифесты. Удалить
legacy-структуры. Сохранить глобальные имена через shim.

## Tasks
- [ ] Для каждой симуляции зарегистрировать манифест (метаданные из SIMS, preview из P_*, theory из THEORY, open/stop/destroy из _openXxx + _pauseAllSims/closeSim веток).
- [ ] Удалить массив `SIMS` (lab-glue.js) и объект `THEORY` (lab-init.js).
- [ ] Удалить if-цепочку `openSim`, `_pauseAllSims`, switch в `closeSim`, `ALL_SIM_BODIES`/`ALL_CTRL_BARS`.
- [ ] lab-init.js усохнуть до generic-логики (openSim/closeSim через реестр).
- [ ] Shim глобальных имён (gSim, pSim, …) — их дёргают deep-link/поиск/инлайн-обработчики.
- [ ] Сохранить обратную совместимость id (magnetic/coulomb→emfield, thinlens/mirrors/refraction→opticsbench, stereo:fig, hydrostatics:arg, molphys:arg, chemistry:arg, dynamics:arg, emfield:mode, opticsbench:mode).

## Files to Modify/Create
- Все `frontend/js/labs/*.js` симуляции — добавить `LabRegistry.register(...)`.
- `frontend/js/labs/lab-glue.js`, `frontend/js/labs/lab-init.js` — удалить legacy.

## Acceptance Criteria
- Все симуляции открываются/работают как раньше (паритет).
- Удалены все 6 точек дублирования из CONTEXT.md.
- Deep-links и алиасы работают.

## Notes
- Мигрировать пачками (по категориям) с проверкой паритета после каждой пачки (Big Bang допускает временную поломку между пачками).
- Превью с зависимостями (random в P_ELECTROLYSIS) перенести как есть.

## Review Checklist
- [ ] Ни одна симуляция не потеряна
- [ ] Глобальные shim'ы на месте
- [ ] Алиасы/deep-links работают
- [ ] Legacy полностью удалён

## Handoff to Next Phase
- РЕАЛИЗАЦИЯ ОТЛИЧАЕТСЯ ОТ ИСХОДНОГО ПЛАНА (осознанно): вместо ручного переписывания манифестов в каждом sim-файле сделана централизованная data-driven регистрация в `frontend/js/labs/_register-all.js`. Манифесты строятся из существующих SIMS (метаданные+preview) + THEORY (теория) + карта OPEN (40 обёрток над глобальными _openXxx). Это структурно гарантирует паритет каталога и диспетчеризации.
- УДАЛЕНО: if-цепочка openSim (~60 строк), _pilots.js. ДОБАВЛЕНО: LAB_SIM_ALIASES (magnetic/coulomb/thinlens/mirrors/refraction).
- НЕ УДАЛЕНО (осознанно, для паритета без браузера): SIMS (lab-glue) и THEORY (lab-init) остаются ИСТОЧНИКАМИ данных; _pauseAllSims()/closeSim() «дробовик» и ALL_SIM_BODIES/ALL_CTRL_BARS остаются — управляют скрытием тел и остановкой. Поэтому stop/destroy в манифестах НЕ заданы.
- ОСТАТОК ИЗ ПЛАНА (перенесено в Фазу 2+): полное удаление SIMS/THEORY/ALL_SIM_BODIES/ALL_CTRL_BARS и сворачивание lifecycle в манифесты (stop/destroy per-sim) — делать вместе с ленивым mount (Фаза 2), т.к. требует знания тел симуляций. Глобальные имена (gSim, pendSim…) НЕ трогались — shim не понадобился.
- ВЕРИФИКАЦИЯ: исполняемый vm-harness (40 регистраций + dispatch + алиасы + :arg) ALL PASS; независимое ревью PASS (coverage 40/40, dispatch parity, node --check). В БРАУЗЕРЕ НЕ ПРОВЕРЕНО.
- РИСК ДЛЯ ФАЗЫ 2: параллельная сессия активно правит lab.html (откатывала мои правки include дважды). Фаза 2 = вынос ~3000 строк ИЗ lab.html → высокий риск конфликтов. Координировать.
