# Phase 3: Ленивая загрузка кода симуляций

**Status:** ✅ Done (70762be) — vm-harness + owner-in-files инвариант пройдены; нужна браузер-проверка
**Parent plan:** [PLAN.md](./PLAN.md)
**Domain:** frontend

## Objective
Грузить тяжёлый код симуляции и движков по клику, а не 58 скриптов + three.js сразу.
Лёгкий манифест каталога загружается сразу.

## Tasks
- [ ] Вынести лёгкие метаданные каталога (id/cat/title/desc/preview) в отдельный `sims.manifest.js`, грузимый сразу.
- [ ] Тяжёлый код симуляции (Sim-класс + open/mount) грузить динамически при openSim (инъекция script или import()).
- [ ] Объявить зависимости движков в манифесте (`deps: ['_fx_core','_phys_visuals',...]`); загрузчик резолвит и грузит до кода симуляции, кешируя загруженное.
- [ ] three.js грузить только для 3D-симуляций (stereo).
- [ ] Лоадер с дедупликацией (один и тот же файл не грузится дважды).

## Files to Modify/Create
- `frontend/js/labs/_loader.js` — новый: динамический загрузчик + резолв зависимостей.
- `frontend/js/labs/sims.manifest.js` — новый: лёгкий каталог.
- `frontend/lab.html` — убрать массовые `<script>`, оставить ядро (api, registry, loader, manifest).

## Acceptance Criteria
- Первый рендер каталога без загрузки кода симуляций.
- Открытие симуляции догружает её код+движки и работает.
- three.js грузится только для 3D.
- Заметное падение объёма стартовой загрузки lab.html.

## Notes
- Учесть defer-скрипты (solutions/organic/periodic/qualanalysis).
- Кеш загруженных модулей в Map.

## Review Checklist
- [ ] Нет двойной загрузки
- [ ] Зависимости движков соблюдены
- [ ] Старт лаборатории легче

## Handoff to Next Phase
- РЕАЛИЗОВАНО: каркас (~530KB) грузится eager; код симуляций (~2.5MB) + three.js (~600KB) — лениво по клику. Старт /lab легче в ~6 раз.
- Файлы: `_loader.js` (LabLoader.ensure + кеш + self-heal), `_sim_deps.js` (СГЕНЕРИРОВАННЫЙ манифест SIM_DEPS + LAB_LAZY_FILES), правки `_register-all.js` (open→ensure.then), `lab-init.js` (openSim обрабатывает Promise), `lab.html` (eager сокращён до 12 labs-скриптов + framework).
- EAGER framework: _registry,_loader,_sim_deps,_fx_*,_graph_panel,_phys_visuals,_chem_visuals,_util,graph.js,lab-init,lab-glue,_register-all. graph.js eager (даёт GRID для 15 сим). _periodic_data — ЛЕНИВЫЙ (dep periodic).
- three.js — лениво, только для crystal/orbitals/stereo/periodic (THREE_SIMS).
- SELF-HEAL: если после загрузки манифестных файлов window[openName] не функция → грузятся ВСЕ ленивые файлы. Поэтому ошибка манифеста не ломает симуляцию (худший случай = поведение до Ф3).
- РЕГЕНЕРАЦИЯ МАНИФЕСТА: скрипт-генератор был временным (в %TEMP%), НЕ в репо. При добавлении/переименовании симуляции: либо вручную дописать SIM_DEPS в _sim_deps.js, либо восстановить генератор (логика в CONTEXT). СТОИТ положить генератор в tools/ при Фазе 4/5.
- БРАУЗЕР-ПРОВЕРКА (обязательна): открыть /lab → Network: на старте НЕ должно быть 45 sim-js и three.js; кликнуть pendulum (грузит pendulum.js), molphys (gas+states+brownian+diffusion), stereo (three.js+stereo.js), periodic (_periodic_data+periodic+three), chemistry (5 файлов), geometry, opticsbench; проверить deep-link stereo:cube, opticsbench:mirror, alias #magnetic.
- РИСК для Ф4/5: lab.html сильно изменён; параллельные сессии правят его — fetch+проверка перед работой.
