Пять точечных клиентских правок (дизайн из адверсариального разбора #523):
1. Задержка hover-раскрытия при drag: `AUTO_EXPAND_MS` 500 → 2000 мс, чтобы
проведение курсора через дерево не раскрывало ряды — только осознанное
удержание.
2. Не раскрывать цель при drop внутрь (make-child): удалена строка
`onToggle(target, true)` в `onDrop` (drop оставляет узел свёрнутым; раскрытие
только по hover-hold). Восстановление раскрытости самого source не тронуто.
3. Guard от потери детей в `handleMove` (обязателен вместе с п.2): раньше эта же
`onToggle` была ЕДИНСТВЕННЫМ триггером корректирующего lazy-load. `treeModel.move`
материализует `target.children = [source]`; для НЕзагруженной цели (предикат
gate `treeModel.isUnloadedBranch`) это скрыло бы остальных серверных детей папки
(класс #159#1). Теперь для незагруженной make-child-цели оптимистичное дерево
строится БЕЗ материализации source: source удаляется из старого родителя, цели
ставится `hasChildren:true`; gate остаётся взведён и раскрытие догружает полный
набор. Для загруженной цели поведение прежнее (append сохраняет детей).
4. Инвалидация крошек: `updateCacheOnMovePage` инвалидирует
`["breadcrumbs", pageId]` — guard делает `remove(source)`, и для текущей
открытой страницы `findBreadcrumbPath` промахивается → крошки показывали бы
старого родителя до refocus.
5. Сигнал «уехало сюда»: транзиентный teal-пульс на строке при make-child-drop в
свёрнутую цель (узел НЕ раскрывается), отдельный `data-landed-child` +
`DROP_LANDED_HIGHLIGHT_MS`, таймер чистится при анмаунте; уважает
prefers-reduced-motion.
Тесты: `handleMove` — незагруженная make-child-цель не материализует `[source]`
(мутация guard'а краснит), загруженная цель append'ит и сохраняет детей,
genuinely-empty лист материализует; инвалидация `["breadcrumbs", pageId]`.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>