Решили: у Лаборатории появился режим съёмки ?shot=<id> — голая страница из одних канвасов без шапки, транспорта и карточек, плюс скрипт scripts/lab-shot.ps1 вокруг него. Заодно сцены, не читающие часы, обёрнуты в still(): считаются один раз, дальше копируются картинкой.

Почему: показать Максу картинку стенда стоило полутора минут, и он это остановил. Разбор показал три независимые траты: браузер поднимал ВЕСЬ раздел (сорок с лишним процедурных сцен) ради одной; профиль браузера создавался новый на каждый запуск и грелся с нуля; пол пересчитывался тридцать раз в секунду, хотя не зависит от времени вообще. Стало 2,5 секунды на снимок без пересборки и 5 — с ней.

Отвергли два варианта. Рисовать стенды второй раз на PIL, как сделано у карты (scripts/map_shots.py): там это оправдано десятком примитивов, здесь — вторая реализация живописного пола, которая разойдётся с первой на первой же правке. Держать один браузер живым между снимками через devtools-протокол: сложность протокола против выигрыша в полторы секунды, а постоянный профиль забирает ту же экономию одной строкой.

Размер кадра скрипт не знает и знать не должен: страница красит фон магентой, а снимок обрезается по ней. Иначе каждый стенд пришлось бы прописывать в аргументах.

Сказано: «Так. Стоп. Компакт и продолжим. Надо разобраться с оптимизацией, а то СЛИШКОМ долго. Согласна?» (03.08.2026, сессия f76789b3).

Грабли: главные — не в скорости. Стенды неба и времени суток задавали кадр 430×330, а плита рисуется в натуральных пикселях (640×384 при PPU 32) и в такой кадр не влезала — она закрывала его целиком, и небо со всеми облаками оказывалось за краем. Час правок по облакам (горизонт, подсветка снизу, три варианта контура) ушёл в кадр, где облаков не было ВООБЩЕ, а я рассматривала снимки травы и рассуждала о воздушной перспективе.

Признак, который стоит запомнить: если правка не видна на снимке, сначала проверь, попадает ли предмет правки в кадр, и только потом правь саму правку. Починка — вписывать мир в кадр масштабом (fit), а не обрезать его.

Вторая: -Stand a,b,c без кавычек PowerShell разбирает в массив, и строковый параметр падает с невнятным «cannot convert value». Параметр объявлен [string[]].

Владелец правды: docs/lab/src/main.ts (режим съёмки), docs/lab/src/draw.ts (still), docs/lab/src/sections/gamefeel-floor.ts (вписывание плиты), scripts/lab-shot.ps1, docs/lab/assets/shell.css (метка кропа).