# История изменений > Русская версия [docs/CHANGELOG.md](CHANGELOG.md). Переведены записи начиная > с v1.42.0 (2026-07-26); более ранние доступны только в английском файле. > > **Правило проекта:** оба файла пополняются в одном коммите с самим > изменением — как и остальная документация (см. docs/STATUS.md). ## v1.46.5 — 2026-07-28 (ревизия всех автоматических удалений) - **Отцеплённый план не удаляется никогда, ни в каком возрасте.** В v1.46.4 ему давался месяц; теперь это навсегда, и причина записана там, где её увидит следующая правка. Правило, оно же в docs/SCOPE.md: компонент вправе удалить файл только тогда, когда об этом говорит действие пользователя — замена плана, удаление вложения, удаление устройства. «На это больше никто не ссылается» таким действием не является. Ошибки несимметричны: занятое зря место видно, стоит копейки и обратимо; удалённый файл — ничего из этого. - **`houseplan/files/cleanup` больше не сносит папку по слову клиента.** После перепривязки устройства файлы копируются под новый id, а старая папка удалялась — через `rmtree`, по тому id, который прислала карточка. Два плохих исхода: при частичном копировании часть ссылок продолжает указывать внутрь этой папки (миграция намеренно их не переписывает — то есть это были живые ссылки на удаляемые файлы), а неверный или устаревший id от любого клиента уничтожил бы инструкции существующего устройства. Теперь сервер сам сверяется с сохранённой конфигурацией, под её блокировкой, и удаляет только то, на что никто не ссылается. - **План удалённого пространства ждёт тридцать дней вместо часа.** Удаление пространства осознанно, но час — короткое окно, чтобы заметить промах. ## v1.46.4 — 2026-07-28 (потеря данных: отцеплённые планы убирались как мусор) - **Отцеплённый план больше не удаляется через час.** Переключение пространства в режим «нарисовать» снимает ссылку и, как редактор всегда и говорил, оставляет картинку на диске, чтобы её можно было вернуть. Уборка, добавленная в v1.46.0, этой разницы не делала: считала «на файл сейчас никто не ссылается» синонимом «файл брошен» и применяла часовое правило. На установке автора плановый проход в итоге удалил два плана этажей, отцеплённых несколькими неделями раньше, — восстановить их было нечем. Если вы отцепляли план после v1.46.0 и инстанс перезапускался или проработал сутки — загляните в `config/houseplan/plans/` и напишите в Telegram-чат, если файла нет. Правило теперь такое: **коммит по-прежнему удаляет ровно то, что заменил**, — это он знает наверняка. Дальше вопрос в том, означает ли «непривязан» «брошен», и ответ зависит от случая. У пространства, у которого плана нет вовсе, его отцепили — и, возможно, вернут: его файлы не удаляются никогда. У пространства, у которого план есть, лишние файлы могут быть только его же отвергнутыми загрузками — они по-прежнему уходят через час. Вложения вне промежуточной папки диалога ждут месяц; сама промежуточная папка, где по построению лежит только загрузка из несохранённого диалога, сохраняет часовое правило. ## v1.46.3 — 2026-07-28 (перепроверка v1.46.2: HP-1462-01) - **Уборка при старте действительно убирает.** Она искала свои же runtime-данные по домену, а во время запуска Home Assistant ещё не считает интеграцию загруженной — поэтому поиск возвращал пустоту, и проход тихо вырождался в удаление незавершённых передач, оставляя настоящую работу таймеру через 24 часа. При перезапусках чаще, чем раз в сутки, она не выполнялась вообще. Теперь используется объект, который у неё и так был на руках. - **Тест, который должен был это доказать, проходил по неверной причине.** Он создавал лишние файлы *до* сохранения конфигурации, а сохранение тоже собирает мусор — так что к моменту перезапуска убирать было уже нечего. Переписан: файлы создаются после сохранения; добавлен второй тест, который дёргает плановый таймер отдельно, и третий, который запускает перезапуск и сохранение одновременно и проверяет, что принятая конфигурация никогда не ссылается на удалённый уборкой файл. ## v1.46.2 — 2026-07-28 (перепроверка v1.46.1: HP-1461-01, -02) - **Файл, который в итоге никому не понадобился, убирается, даже если больше ничего не сохраняют (HP-1461-01).** Сборка привязана к записи конфигурации — это верно для того, что запись вытесняет, но оставляет зазор: отмените диалог после того, как файл уже загрузился, потеряйте связь сразу после, или вызовите API загрузки напрямую — и на файл никто не ссылается, а будущей записи, которая бы это заметила, нет. Добавленное в v1.46.1 ежедневное подметание убирало только незавершённые передачи, поэтому обещание «отменённое вложение исчезнет через час» не выполнялось там, где никто ничего не правит. Теперь подметание сверяется с сохранённой конфигурацией — под той же блокировкой, что и запись, — и собирает устаревшие непривязанные вложения и планы тоже. - **Перетаскивание больше не отменяется чужим перемещением (HP-1461-02).** Когда в v1.46.1 полная карточка научилась следить за позициями, она защищала те, что вы подвинули, но ещё не отправили, — вот только читала этот список *после* сброса отложенной записи, а сброс его первым делом опустошает. При настоящем перетаскивании, когда запись уже запланирована, список оказывался пустым, и старая серверная позиция закрашивала ваше движение. Теперь снимок снимается до сброса, и вдобавок удерживаются позиции, отправленные, но ещё не подтверждённые: пока сервер не подтвердил позицию, авторитет по ней — та карточка, которая её подвинула. - Два теста доросли до своих же описаний: тест загрузки теперь действительно отменяет задачу запроса, а не только проходит по путям ошибок, а смоук синхронизации позиций планирует настоящую отложенную запись и задерживает её — именно этот порядок и терял перетаскивание. ## v1.46.1 — 2026-07-28 (перепроверка v1.46.0: HP-1460-01 … -03) - **Две загрузки с одинаковым именем больше не сталкиваются (HP-1460-01).** v1.46.0 перестала затирать вложения, но выбор свободного имени и его занятие были двумя шагами: две загрузки, попавшие между ними, сходились на одном имени, обе рапортовали успех, и одни байты заменяли другие. Теперь имя занимается атомарно в момент выбора — двадцать одновременных загрузок `manual.pdf` дают двадцать файлов. Тот же механизм используется при переносе файлов на перепривязке, где был ровно такой же зазор. Заодно там же: имя предельной длины теряло расширение, а суффикс коллизии выталкивал его за предел, и вложение сохранялось под именем, которое сервер обратно не отдаёт — вечный 404 на файл, который интерфейс считал прикреплённым. - **Прерванная загрузка больше не оставляет временный файл навсегда (HP-1460-02).** Уборка стояла в `except Exception`, мимо которого отменённый запрос проходит насквозь, а сборщик заглядывает только в папки маркеров — поэтому оборванная передача оставляла `.upload-*`, и убрать его было некому. Теперь убирает любой путь выхода, запрос с двумя файлами отклоняется сразу, а брошенные временные подметаются при старте и раз в сутки. Запись идёт порциями по мегабайту, а не отдельной задачей на каждые 64 КБ. - **Две полные карточки рядом держат одинаковые позиции (HP-1460-03).** v1.46.0 научила следить за перемещениями статическую карточку и оставила позади полную, поэтому перетаскивание иконки в одном окне не двигало её в другом до перезагрузки. Теперь следит — и не мешает собственному перетаскиванию: чужая ревизия, пришедшая в его разгар, сливается, а не накатывается сверху, и карточка не перечитывает то, что записала сама. ## v1.46.0 — 2026-07-28 (полный внешний аудит v1.45.4: HP-1454-01 … -10) **Безопасность** - **Загруженный SVG-план больше не является живым документом origin вашего Home Assistant (HP-1454-01, high — блокер релиза).** Внутри карточки план подключён через ``, где скрипты не выполняются; но тот же URL, открытый напрямую, становился документом верхнего уровня в origin самого HA, и `