# Биохимия — мощный апгрейд модуля Цель: превратить модуль из «красивого 2D-конструктора с захардкоженными данными» в **настоящую химическую лабораторию**: реальная 3D-геометрия молекул (VSEPR), химический движок (полярность, гибридизация, дипольный момент, баланс реакций), данные из БД вместо хардкода, расширенная геймификация. Стек/правила: vanilla JS + canvas (БЕЗ тяжёлых либ — как STEREO_3D и OPTICS), Express, `node:sqlite` (`DatabaseSync`), `window.LS.biochem*`. Эмоджи запрещены — только inline SVG `.ic`. Поиск — `ast-index`. После каждой фазы — коммит изменённых файлов + push. Файлы модуля: - Frontend: `frontend/biochem.html` (2070, редактор), `biochem-library.html` (648), `biochem-pathways.html` (1240), `biochem-properties.html` (590), `biochem-reactions.html` (823) - Backend: `backend/src/controllers/biochemController.js` (276), `backend/src/routes/biochem.js` (18) - API: `js/api.js` (`biochem*` методы), БД: таблицы `bio_*` в `migrations/000_baseline.sql` Статус: [ ] todo · [~] в работе · [x] готово --- ## Текущее состояние (база отсчёта) - БД: 105 молекул (inorganic 41 / biomolecule 38 / organic 25 / aminoacid 1), 27 реакций (synthesis/decomposition/hydrolysis/combustion/redox/exchange/acid_base), 57 challenge-ов, 11 элементов (C,Ca,Cl,Fe,H,Mg,N,Na,O,P,S). - **Атомы хранят только `{id,s,x,y}`** — z нет. `bonds_json` = `{f,t,o}` (from/to/order). - Валидация: `hillFormula` + `valencyIssues` (лимит `MAX_V`). Полярность/класс — эвристика на фронте. - Challenge-типы в контроллере: build/identify/formula/classify/complete/balance/match — но в БД реально только build/formula/identify. - Пути метаболизма и физсвойства — хардкод в HTML, без API. --- ## Фаза 0 — Общее ядро `biochem-core.js` (DRY-фундамент) — [~] Без этого каждая следующая фаза множит дублирование. Извлечь общий модуль, подключить во всех 5 страницах. - [x] 0.1 Создан `frontend/js/biochem-core.js` (`window.BIO`): реестр `ELEMENTS` (цвет/масса/валентность/электроотрицательность/ковалентный+вдв радиусы/валентные электроны), `hillFormula`/`molarMass`/`parseFormula`/`dbe`, нормализация связей `bF/bT/bO`, `render2D`, `vsepr`, `render3D`, `safe`, `RING_TEMPLATES`. - [x] 0.2 library/properties/reactions переведены на `BIO.render2D`; удалены дубль-таблицы `ELEM_COLORS/CPK` и `hexToRgb/cpkColor` (~250 строк). _(pathways — в Фазе 4, там нет структурного рендера молекул.)_ - [x] 0.3 Фикс бага [biochem.html](frontend/biochem.html) `getBondSum` (`b.o || b.order` → `b.order||b.o||1`); в ядре единая нормализация `bF/bT/bO`. - [ ] 0.4 Базовая обработка ошибок API: общий `BIO.safe(fn)` есть в ядре; осталось применить во всех async-вызовах страниц (сейчас точечно). --- ## Фаза 1 — Реальная 3D-геометрия молекул (VSEPR) — [x] ⭐ главный рычаг Сейчас «3D» проецировал плоские `x,y`. Сделана настоящая 3D-геометрия по ОЭПВО/VSEPR + canvas-рендер ball-and-stick с глубиной и светом. - [x] 1.1 Генератор `BIO.vsepr(atoms,bonds)` (в ядре, client-side — без задержки сети, работает на всех страницах): стерические домены (σ-связи + неподелённые пары из валентных электронов), геометрии linear/trigonal/tetrahedral/pyramidal/bent/ octahedral/trig-bipy, BFS-укладка с поворотом идеальных направлений (Родригес), длины связей по ковалентным радиусам. Возврат `atoms3d`, `perAtom`, `shape`, `hybridization`, `angle`. _Проверено: H₂O угловая, CH₄ тетраэдр 109.5°, CO₂ линейная 180°, NH₃ пирамидальная._ - [~] 1.2 Серверный кэш геометрии (`041`/`geometry_json`) — **отложено**: VSEPR считается мгновенно в браузере, round-trip не нужен. Вернуться при необходимости. - [x] 1.3 `BIO.render3D(ctx, atoms3d, bonds, cam, opts)`: painter-сортировка по глубине, сферы с радиальным градиентом, кратные связи, режим space-filling (VDW). Инерция/ auto-spin переиспользованы из biochem.html. - [x] 1.4 Встроено в [biochem.html](frontend/biochem.html): фейковый 3D заменён; в панель свойств добавлены форма, гибридизация, валентный угол. - [x] 1.5 3D-превью: тумблер 2D/3D в детальной панели библиотеки и на карточках сравнения в properties (вращение + подпись геометрии). --- ## Фаза 2 — Химический движок (свойства из структуры) — [x] > Сделано client-side в `BIO` (для всех страниц, без сервера; тег `biochem-phase2`): > `partialCharges` (по ЭО на связях), `dipole` (вектор q·r по 3D VSEPR), `polarity` > (по диполю), `massFractions`, `functionalGroups`, `analyze` — заменили фронт-эвристику. > Тумблер **δ±** в редакторе: тепловая карта зарядов (синий δ+/красный δ−) в 2D+3D + > стрелка диполя; число диполя в панели свойств. > _Проверено: H₂O O=−0.52/H=+0.26; CO₂/CH₄/CCl₄ диполь 0 → неполярны; H₂O/CHCl₃ полярны._ Считать химию, а не хранить класс строкой. > Серверный срез (тег `biochem-phase2-server`): `backend/src/services/chem.js` > **переиспользует то же ядро** `biochem-core.js` (сделан dual-export: браузер > `window.BIO` + Node `module.exports`) — без дублирования химии. Эндпоинт > `POST /api/biochem/analyze` отдаёт {formula, mass, dbe, geometry, polarity, > dipole, charges, groups, massFractions, valency}; `/validate` переведён на > ядро (плюс чинит баг формата связей b.o/order). 2.4: `BIO.valency` с > подсказками («Углерод (C): занято 5 связей, максимум 4 — убери 1»), > используется и в редакторе, и на сервере. - [x] 2.1 `backend/src/services/chem.js`: переиспользует ядро `BIO` (полярность/диполь по 3D-VSEPR, частичные заряды, DBE/масса/массовые доли, гибридизация, функциональные группы) — без дубля логики на сервере. - [x] 2.2 API `POST /api/biochem/analyze` (atoms,bonds → {formula, mass, dbe, dipole, polarity, charges, groups, hybridization, valency}). Живой анализ в редакторе оставлен client-side (мгновенно); сервер — авторитетный расчёт + валидация на сохранении. - [x] 2.3 В редакторе: тепловая карта частичных зарядов (toggle), стрелка диполя в 3D, панель «геометрия и полярность». - [x] 2.4 Расширенная валидация: `BIO.valency` даёт подсказки («Углерод (C): занято 5 связей, максимум 4 — убери 1») вместо «лимит превышен»; единая логика в редакторе и на сервере. --- ## Фаза 3 — Реакции: стехиометрия, баланс, энергетика — [~] > Сделано (тег `biochem-phase3`): `BIO.balance(reactants,products)` — балансировка > через матрицу «элемент×вещество» + дробный Гаусс (RREF) + НОК/НОД (client-side, > вместо серверного `balance.js`). В [biochem-reactions.html](frontend/biochem-reactions.html) при развороте карточки: > энергетический профиль (реагенты→ПС→продукты) из `energy_kj` + бейдж проверки > баланса. Миграция коэффициентов в БД (3.2) и механизм (3.5) — отложены. > _Проверено: 2H₂+O₂→2H₂O, CH₄+2O₂→…, 4Fe+3O₂→2Fe₂O₃, фотосинтез 6/6/1/6, Ca(OH)₂+2HCl, N₂+3H₂→2NH₃._ - [x] 3.1 `BIO.balance` (client-side: матрица элементов → целочисленное решение Гаусс+НОК). - [ ] 3.2 Миграция: добавить коэффициенты в `bio_reactions` (`reactant_coef`/`product_coef` JSON или `stoich_json`); пересидировать 27 реакций сбалансированными. - [ ] 3.3 В [biochem-reactions.html](frontend/biochem-reactions.html): показывать сбалансированное уравнение с коэффициентами, проверку сохранения массы/атомов. - [ ] 3.4 Энергетическая диаграмма реакции (reactants → переходное состояние → products) из `energy_kj` — мини-canvas-график, экзо/эндо подпись ΔH. - [ ] 3.5 (опц.) Поле `mechanism_json` — пошаговый механизм с подсветкой разрываемых/образуемых связей. --- ## Фаза 4 — Метаболические пути из БД — [ ] Снять хардкод (700+ строк в HTML), сделать расширяемым и с прогрессом. - [ ] 4.1 Миграция `042_bio_pathways.sql`: `bio_pathways(id,slug,name,description)`, `bio_pathway_nodes(pathway_id,molecule_id?,label,formula,x,y,kind)`, `bio_pathway_edges(from_node,to_node,enzyme,delta)`, `bio_pathway_steps(pathway_id,order_n,node_id,quiz_json)`, `bio_user_pathway(user_id,pathway_id,step,done_at)`. - [ ] 4.2 Сидер: перенести 4 существующих пути (гликолиз, цикл Кребса, β-окисление, синтез белка) + добавить глюконеогенез/липогенез/пентозофосфатный. - [ ] 4.3 API: `GET /api/biochem/pathways`, `GET /pathways/:slug`, `POST /pathways/:slug/progress`. - [ ] 4.4 [biochem-pathways.html](frontend/biochem-pathways.html): рендер из API; сохранение прогресса Learn-режима на пользователя; иерархическая укладка узлов (sugiyama-lite), чтобы не перекрывались. - [ ] 4.5 Награда за пройденный путь (XP + ачивка), отметка пройденных путей. --- ## Фаза 5 — Challenges и геймификация — [~] > Сделано: `backend/scripts/seed_biochem_challenges.js` (идемпотентно) засидировал > 16 заданий недостающих типов — **balance 5, match 3, classify 4, complete 4**. > Все 7 фильтров в UI редактора теперь с данными; контроллер их уже валидирует, > XP начисляется. data_json совпадает с UI (balance: reactants/products/coefficients; > match: pairs; classify/complete: target/equation/choices/answer). > Осталось: drag-and-drop (5.2), 3D-build (5.3), адаптивность (5.4), ачивки bc_* (5.5). Слоты ачивок `bc_5_challenges`/`bc_20_challenges` уже есть в `_shared.js` — довести до конца и расширить вызовы. - [x] 5.1 Засидированы типы challenge: balance, match, classify, complete (16 заданий, идемпотентный сидер). - [ ] 5.2 UI drag-and-drop для balance/match (сейчас только выбор/ввод). - [ ] 5.3 3D-build challenge: собрать молекулу и проверить не только формулу, но и связность/геометрию. - [ ] 5.4 Адаптивная сложность + «задача дня»; streak по биохимии. - [ ] 5.5 Привязать ачивки `bc_5_challenges`/`bc_20_challenges` (и новые: «собрал АТФ», «сбалансировал 10 реакций», «прошёл цикл Кребса») к событиям; проверить начисление в `gamificationController`. --- ## Фаза 6 — Свойства и анализ: вычисления + графики — [~] > Сделано (тег `biochem-phase6`): в [biochem-properties.html](frontend/biochem-properties.html) при сравнении 2+ > молекул — столбчатый график молярных масс (canvas) + экспорт таблицы в CSV > (UTF-8 BOM). Уход от хардкода `PHYS_PROPS` (6.1) и круговая долей (6.3) — отложены. - [ ] 6.1 Убрать хардкод `PHYS_PROPS` (15 молекул) — тянуть вычисляемые (масса, DBE, диполь, доли элементов) из `/analyze`; справочные (T_пл/T_кип/растворимость) — в новую таблицу `bio_mol_props`. - [x] 6.2 График сравнения молярных масс (bar, canvas) + экспорт CSV. _(scatter масса·T_кип и PNG — позже.)_ - [ ] 6.3 Доп. свойства: массовая доля элементов (круговая), кислотность/основность класса, окислитель/восстановитель. --- ## Фаза 7 — Импорт/экспорт и полировка — [~] > Сделано (теги `biochem-phase7`/`biochem-latest`): `BIO.parseSmiles` (учебное > подмножество: атомы верх. регистра, связи -=#, ветви, циклы, неявные H, > 2D-укладка), `BIO.toJSON`/`download`. В редакторе — поле SMILES + Импорт, > экспорт PNG/JSON. Регресс-тесты `backend/tests/biochem-core.test.js` (8/8 pass: > формулы, VSEPR, заряды, полярность, баланс, SMILES, analyze). - [x] 7.1 Парсер SMILES (цепи, ветви `()`, кольца-цифры, кратность `-=#`) → atoms/bonds; поле ввода в редакторе. - [x] 7.2 Экспорт молекулы: PNG (текущий 2D/3D холст), JSON. _(share-ссылка `?smiles=` — позже.)_ - [x] 7.5 Регресс-тесты ядра (`node --test`, 8 тестов). _(перенесён из плана ниже.)_ - [ ] 7.3 Перф: кэш `biochemGetMolecules` (общий стор), throttle поиска/фильтров, LOD для thumbnail больших молекул (АТФ и т.п.). - [ ] 7.4 Мобайл/a11y: читаемый sidebar на ≤768px, фокус-навигация, aria для canvas-инструментов. - [ ] 7.5 Регресс-тесты: `backend/tests/biochem.test.js` — VSEPR, баланс, analyze, фиче-флаг `requireFeature('biochem')`. --- ## Порядок приоритетов 1. **Фаза 0** (фундамент, разблокирует остальное) → **Фаза 1** (3D — главный визуальный/обучающий скачок) → **Фаза 2** (химия из структуры). 2. Затем **Фаза 3** (реакции) и **Фаза 4** (пути) — наибольшая образовательная ценность. 3. **Фазы 5–7** — геймификация, аналитика, импорт/полировка. Минимальный «вау»-срез, если нужен быстрый результат: **Фаза 0 + Фаза 1** дают настоящую 3D-молекулу с формой и углами вместо плоской проекции. --- История: создан 2026-05-30.