3.8 KiB
3.8 KiB
Feature Context: Конструктор симуляций (SimForge)
Current State
- Фаза 0 не начата. Ветка
feature/sim-builderотmaster. - Лаборатория уже декларативна на уровне регистрации:
frontend/js/labs/_registry.js(LabRegistry.register/get/all/setActive/stop/destroy/resolvePreview), манифест сopen(ctx)/mount(host)/stop/destroy. ~40 симуляций — рукописные JS-модули вfrontend/js/labs/. - Каталог в БД: миграция
042_lab_sims.sql(lab_sims), роутыbackend/src/routes/lab.js(GET /api/lab/sims, PATCH/:id, POST /reorder, links). Привязка к программе:043_lab_sim_links.sql.
Архитектурные решения (зафиксированы при планировании)
- Спека = JSON-данные. Версия
specVersion. Корень:{ specVersion, meta, viewport, params[], objects[], physics?, plots[], controls }. - Движок выражений безопасный — собственный парсер (расширение
y=f(x)из graph.js): токенайзер → AST → eval по окружению{ params, t, объекты, whitelisted Math fns }. ⛔ Безeval/Function. Whitelist: + - * / ^ %, sin cos tan asin acos atan sqrt abs exp ln log min max floor ceil round sign pi e, сравнения, ?:. - Рантайм
window.SimEngine.mount(host, spec) -> instance{ play, pause, reset, setParam, destroy }. Рендер: canvas для геометрии/трасс + SVG/absolute-div оверлей для подписей (KaTeX). Регистрируется в LabRegistry адаптером (одна функция строит манифест из спеки). - Объект:
{ id, type, ...props-with-bindings }. type ∈ point|segment|vector|circle|rect|polyline|path|label|image. Любое числовое свойство может быть числом ИЛИ строкой-выражением. - Физический режим (Фаза 2): объект с
body:{ mass, vx, vy, fixed }интегрируется_fx_motion; силыphysics:{ gravity, springs[], collisions, friction, walls }. Формульный и физический режимы сосуществуют (формульные объекты — кинематические). - Безопасность шаринга: published-спека валидируется на сервере (размер, схема, глубина AST, число объектов/параметров); подписи-строки санитизируются как svg/текст.
Temporary Workarounds
- (нет)
Cross-Phase Dependencies
- Ф1 (графики/drag) зависит от рантайма Ф0.
- Ф2 (физика) зависит от Ф0 (модель объектов/цикл).
- Ф4 (билдер) зависит от Ф0–Ф2 (что строить) + Ф3 (куда сохранять).
- Ф5 (каталог) зависит от Ф3 (БД) + Ф0 (адаптер LabRegistry).
- Ф6 (раздача) зависит от Ф3+Ф5.
- Ф7 (доска) зависит от Ф0 (рантайм) + Ф5 (источник sim) + существующего
simOpen/simState.
Implementation Notes
- Каждая фаза должна оставлять /lab рабочим (Incremental).
- Тестировать рантайм Ф0–Ф2 рукописными спеками-фикстурами (без билдера).
- Reuse > переписывание: сначала смотреть
_fx_motion,_graph_panel,graph.js.
RESUME STATE
- Последний коммит фичи: — (ещё нет)
- Текущая фаза: Phase 0 — Runtime core (Not Started)
- Режим: Automated / Orchestrator / Incremental