v1.54.1: the v1.54.0 audit findings, sealed

Version 1.54.0 -> 1.54.1 in package.json, package-lock.json, manifest.json,
const.py and CARD_VERSION; rebuilt bundle in all three tracked copies
(dist/, demo/srv/assets/, custom_components/houseplan/frontend/).
Changelog entries (EN+RU) — one line per finding, HP-1540-01..06 — and
docs/STATUS.md bumped.

Suites on this exact tree: 161 frontend unit, 74 pure-backend, 74 browser
smokes — all green.
This commit is contained in:
Matysh
2026-07-31 13:07:37 +03:00
parent 257a71123a
commit a1f7fb4161
10 changed files with 110 additions and 45 deletions
+1 -1
View File
@@ -45,7 +45,7 @@ PLAN_ORPHAN_TTL_S = 3600
SCHEDULED_GRACE_S = 30 * 24 * 3600
FILES_DIR = "houseplan/files"
CONF_ADMIN_ONLY = "admin_only"
VERSION = "1.54.0"
VERSION = "1.54.1"
DEFAULT_CONFIG: dict = {
"spaces": [],
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -16,5 +16,5 @@
"issue_tracker": "https://github.com/Matysh/houseplan-card/issues",
"requirements": [],
"single_config_entry": true,
"version": "1.54.0"
"version": "1.54.1"
}
File diff suppressed because one or more lines are too long
+13 -13
View File
File diff suppressed because one or more lines are too long
+32
View File
@@ -1,5 +1,37 @@
# Changelog
## v1.54.1 — 2026-07-31
Patch release: everything the adversarial audit of v1.54.0 found
(HP-1540-01..06), each fix pinned by a regression test that fails on the
old code.
- **Fix: the first calibration of a freshly discovered vacuum silently did
nothing.** Until the device dialog was saved once, the robot had no config
marker — yet the «Живая позиция» section was fully interactive, and every
handler quietly bailed out while auto-calibration still announced success.
Any vacuum edit now materialises the marker itself, and the success toast
only appears after the matrix has verifiably landed in the config.
- **Fix: a robot whose first map is `map_index: 0` lost its server-side
trail.** The backend picked the map id by truthiness and dropped the zero,
so the recorded run was stored under a key the card never looked up. Both
sides now share one explicit rule — the first value that exists wins, and
zero is a value.
- **Fix: one robot on two floors recorded history for the last floor only.**
The recorder kept a single marker per source entity, so the second
placement silently evicted the first. Every marker fed by a source now
gets its own copy of the run.
- **Fix: auto-calibration ignored plans drawn with rectangle rooms.** The
room matcher only accepted polygon outlines and then blamed the room
names. Legacy rectangles count like everywhere else in the card.
- **Fix: overlapping recorder refreshes leaked state subscriptions.** Two
config saves racing each other could both subscribe and strand one
callback until restart; refreshes are serialised now and teardown wins
over any refresh still in flight.
- The «no rooms» / «no match» toasts and docs/VACUUM.md no longer send you
to the three-point calibration that no longer exists — they point at
«Подогнать вручную», which does.
## v1.54.0 — 2026-07-31
### Live robot vacuums
+33
View File
@@ -6,6 +6,39 @@
> **Правило проекта:** оба файла пополняются в одном коммите с самим
> изменением — как и остальная документация (см. docs/STATUS.md).
## v1.54.1 — 2026-07-31
Патч-релиз: всё, что нашёл adversarial-аудит v1.54.0 (HP-1540-01..06),
каждый фикс закреплён регрессией, падающей на старом коде.
- **Исправлено: первая калибровка только что обнаруженного пылесоса молча
ничего не делала.** Пока диалог устройства ни разу не сохранён, у робота
нет маркера в конфиге — а раздел «Живая позиция» уже полностью
интерактивен: каждый обработчик тихо выходил, но автокалибровка всё равно
объявляла успех. Теперь любая правка пылесоса сама создаёт маркер, а тост
успеха появляется только после того, как матрица действительно легла в
конфиг.
- **Исправлено: робот с первой картой `map_index: 0` терял серверный
след.** Бэкенд выбирал id карты по «истинности» и выбрасывал ноль, так
что записанная уборка хранилась под ключом, который карточка не искала.
Теперь обе стороны живут по одному явному правилу: побеждает первое
существующее значение, и ноль — значение.
- **Исправлено: один робот на двух этажах писал историю только для
последнего этажа.** Рекордер держал по одному маркеру на источник, и
второе размещение молча вытесняло первое. Теперь каждый маркер источника
получает свою копию уборки.
- **Исправлено: автокалибровка не видела планы из прямоугольных комнат.**
Сопоставление принимало только полигоны, а потом сваливало вину на имена
комнат. Старые прямоугольники считаются, как и во всей остальной
карточке.
- **Исправлено: пересекающиеся обновления рекордера текли подписками.**
Два одновременных сохранения конфига могли подписаться оба и бросить один
callback до перезапуска; обновления теперь сериализованы, а teardown
выигрывает у любого ещё летящего обновления.
- Тосты «нет комнат» / «имена не совпали» и docs/VACUUM.md больше не
отправляют к несуществующей калибровке по трём точкам — они ведут к
«Подогнать вручную», которая существует.
## v1.54.0 — 2026-07-31
### Роботы-пылесосы вживую
+1 -1
View File
@@ -15,7 +15,7 @@
| Item | State |
|---|---|
| Version | **v1.54.0** everywhere (manifest, const.py, package.json, CARD_VERSION); deployed to the home instance |
| Version | **v1.54.1** everywhere (manifest, const.py, package.json, CARD_VERSION); deployed to the home instance |
| Workflow | Since 2026-07-22: minor changes go to branch **`dev`** (build + smokes → deploy home → commit → push, NO release); releases are batched on the owner's command (merge dev→main, one tag, one release with a summary changelog, CI checked on dev beforehand) |
| GitHub | https://github.com/Matysh/houseplan-card — **`main` carries every published release, the latest tag is the current version above**; `dev` is where work lands and is merged into `main` at release time (so `dev` is normally equal to or ahead of `main`, never behind). Push via SSH key `ha_jb` (remote git@github.com:…); API releases via the fine-grained PAT in `~/.git-credentials` (Contents R/W, issued 2026-07-23) |
| CI | validate.yml (hacs + hassfest + frontend + backend) green; release.yml attaches the bundle on release publish |
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "houseplan-card",
"version": "1.54.0",
"version": "1.54.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "houseplan-card",
"version": "1.54.0",
"version": "1.54.1",
"license": "MIT",
"dependencies": {
"lit": "^3.1.3",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "houseplan-card",
"version": "1.54.0",
"version": "1.54.1",
"description": "Interactive house plan Lovelace card for Home Assistant",
"license": "MIT",
"type": "module",