Смена пространства выбрасывает слой, а не сверяет его поэлементно

#525 увёл оба списка сцены с `map()` на `repeat(items, (item) => item.id, …)`,
чтобы Lit не переиспользовал узлы по позиции и не проигрывал анимацию двери,
которой не было. Правка верная, но на плане с двумя сотнями маркеров она
оказалась дорогой ровно там, где пользы не приносит: при смене пространства
ключи не пересекаются вовсе, и `repeat` строит две карты ключей и обходит оба
списка, чтобы затем всё равно выбросить всё и создать заново.

Бисект по медиане `switchCycleMs` на `large-house`: 871,2 перед #525 → 953,5
после. На раннере эти 80 мс распадаются на шесть-девять дополнительных длинных
задач, и `longTask.countP95` вышел за порог стабильного гейта.

Теперь оба списка рендерятся как `keyed(space.id, repeat(…))`. Внешний ключ
делает смену пространства: поддерево выбрасывается целиком, дифа нет. Внутренний
остаётся, потому что состав списков едет и внутри пространства — у маркеров от
призраков редактора и живого синка, у проёмов от записи с нерешённым хостом,
которая живёт только в режиме plan, — а переходы на `.device-shell-frame`,
`.op-leaf` и `.op-arc` никуда не делись.

Замер после правки: `switchCycleMs` 889,1 против 936,0 на `main` и 871,2 до
#525. Потолок карточки поднят на одну строку — на `import { keyed }`;
переносить нечего, сам рендер не вырос ни на символ.

Issue: #534
User-Visible: yes
This commit is contained in:
Codex
2026-09-11 22:30:11 +03:00
parent a9a6d37bba
commit 5afdb644c7
55 changed files with 650 additions and 563 deletions
+5 -4
View File
@@ -7438,8 +7438,9 @@ const MUTANT_DEFINITIONS = [
+ 'animates a door that never moved (#525 AC1)',
patches: [{
file: 'src/houseplan-card.ts',
find: ' return svg`<g class="openinglayer">${repeat(items, (o) => o.id, (o) => {',
replace: ' return svg`<g class="openinglayer">${items.map((o) => {',
find: " return svg`<g class=\"openinglayer\">${keyed(space.id, repeat(items,"
+ " (o) => o.id, (o) => {",
replace: " return svg`<g class=\"openinglayer\">${keyed(space.id, items.map((o) => {",
}],
},
{
@@ -7450,8 +7451,8 @@ const MUTANT_DEFINITIONS = [
+ 'painter, which finds the dragged marker by that attribute (#525 AC2)',
patches: [{
file: 'src/houseplan-card.ts',
find: ' ${repeat(devs, (d) => d.id, (d) => this._renderDevice(',
replace: ' ${devs.map((d) => this._renderDevice(',
find: ' ${keyed(space.id, repeat(devs, (d) => d.id, (d) => this._renderDevice(',
replace: ' ${keyed(space.id, devs.map((d) => this._renderDevice(',
}],
},
{