# Горячая замена: смена графа — Mercury LMS > Как `@fiberfx/hypergraph` переносит состояние модели через правку кода: правка только тел функций заменяет слоты на месте; любая другая загружает новое поколение и сохраняет каждое хранилище (store) с совпадающими sid и описанием структуры (shape), указывая причину потери каждого отброшенного значения. Механизм реализован внутри пакета; `@fiberfx/hypergraph/hmr` и доставка через `mx dev` запланированы. ## Когда читать Если вы объясняете сохранение или сброс значения после правки, проектируете хранилища модели с учётом правок либо читаете строку журнала `hmr:` или наблюдение `reset`. ## Контракт (уровень готовности: Planned — реализовано и проверено векторами, но не экспортируется и не доставляется через mx dev; сегодня правка перезагружает страницу) - Режим слотов: каждый изменённый модуль совпадает с загруженным, кроме тел функций → тела заменяются на месте; изолированная область состояния (scope), значения, наблюдатели и выполняющиеся эффекты (effect) не меняются. - Иначе режим замены: новое поколение; восстановление только сохраняемых sid; фиксация; отчёт; завершение старого поколения. Наблюдатели старого кода завершаются вместе с его поколением. Дескрипторы `Scope` переходят к зафиксированному поколению. - Участвуют изменяемые хранилища с sid, в том числе в регионах. Не участвуют события (event), эффекты, производные хранилища, хранилища без sid и с `serialize: 'ignore'` по любую сторону правки. - keep: совпадают sid и структура. Изменённый `init` при прежней структуре сохраняет текущее значение. - new: sid есть только в новом поколении; это информация, а не сброс. - Причины сброса (`ResetReason`): `{kind: 'shape', from, to}`, `{kind: 'removed'}`, `{kind: 'renamed', to}` (подсказка для ПРЕЖНЕГО sid, никогда не применяется; требует одинакового имени ровно у одного удалённого и одного нового хранилища), `{kind: 'positional'}` (позиционные ключи никогда не сохраняют значение в изменившемся модуле). - Структура сегодня: `runtime:`, ключи объекта отсортированы, например `runtime:object{age:number,name:string}`. Добавление поля вызывает сброс. - Списки упорядочены по sid в порядке кодовых единиц UTF-16. - Каждый reset/new → наблюдение `inspect` вида `reset`/`declare fresh` и строка журнала `hmr: : `. - Отказы: `DiffError` `duplicate-sid` | `no-shape`; обновление выбрасывает исключение, загруженное поколение остаётся действующим, вызывающая сторона перезагружает страницу. Обновление во время другого обновления отклоняется. ## Минимальный пример ```ts import { store } from "@fiberfx/hypergraph"; // before: store(0, { sid: "count" }) → shape runtime:number // after: store({}, { sid: "count" }) → shape runtime:object{} // result: reset count, "shape changed from runtime:number to runtime:object{}" export const $count = store({}, { sid: "count" }); export const $user = store(null, { sid: "user" }); // kept ``` ## Никогда не генерируйте Импорт из `@fiberfx/hypergraph/hmr` (ещё не экспортируется), `createRootScope`, `hmrScope`, причину "init changed", переименование с переносом значения к новому sid и любые импорты из `effector`. ## Дальше - Серверный рендеринг: /ru/hypergraph/server-rendering (/ru/hypergraph/server-rendering/llms.txt) - Эта версия страницы для агентов: /ru/hypergraph/hot-replacement/llms.txt ## Навигация - [Страница в браузере](/ru/hypergraph/hot-replacement) - [Индекс для агентов](/ru/llms.txt) - [Все английские текстовые версии](/llms-full.txt) - [Карта сайта](/sitemap.xml) - [Текст курса](/ru/hypergraph/llms.txt)