Commit Graph
1295 Commits
Author SHA1 Message Date
claude[bot] 3c281bb12c docs: review document for #359
Issue: #359
User-Visible: no
2026-08-28 21:14:24 +00:00
Matysh 842dc373b1 docs: prove furniture preview edge cases
Issue: #359
User-Visible: no
2026-08-29 00:09:18 +03:00
claude[bot] d6d2ae4ae4 docs: review document for #359
Issue: #359
User-Visible: no
2026-08-28 21:08:22 +00:00
Matysh 392ef22c0d docs: specify furniture placement preview
Issue: #359
User-Visible: no
2026-08-29 00:00:55 +03:00
claude[bot] ccbbe94cab docs: review document for #209
Issue: #209
User-Visible: no
2026-08-28 20:54:22 +00:00
Matysh 6c0b3f7c31 docs: refresh screenshots for final #209 tree
Issue: #209
User-Visible: no
2026-08-28 23:28:09 +03:00
Matysh 3c2d9e8863 build: refresh bundle after golden contract (#209)
Issue: #209
User-Visible: no
2026-08-28 23:20:28 +03:00
Matysh 9d2ef12c96 feat: smooth vacuum trails (#209)
Issue: #209
User-Visible: yes
2026-08-28 23:16:58 +03:00
claude[bot] 2890b9a1ab docs: review document for #209
Issue: #209
User-Visible: no
2026-08-28 20:01:24 +00:00
Matysh 43516cc15f docs: specify bounded vacuum trail smoothing (#209)
Issue: #209
User-Visible: no
2026-08-28 22:55:58 +03:00
claude[bot] 52fbff6cbe docs: review document for #20
Issue: #20
User-Visible: no
2026-08-28 19:50:06 +00:00
Matysh f62926fbeb feat: make Glow follow door opening state (#20)
Issue: #20
User-Visible: yes
2026-08-28 22:33:07 +03:00
claude[bot]andMatysh 72e6939f67 docs: review document for #20
Issue: #20
User-Visible: no
2026-08-28 22:31:02 +03:00
Matysh 3fa98a0915 docs: actualize #20 door-state glow spec
Issue: #20
User-Visible: no
2026-08-28 22:31:02 +03:00
claude[bot] 50d3dbe7cc docs: review document for #358
Issue: #358
User-Visible: no
2026-08-28 18:59:48 +00:00
Codex bb3c1fd12f fix: a cold View survives a telemetry-bearing vacuum (#358)
Systematic audit after #357 ("can there be more bugs with this root
cause?"): _vacMapId was the one remaining hard stub reachable from the
eager View path. It runs inside willUpdate for every vacuum whose
integration reports live telemetry (Tasshack, XCME, Valetudo), so on a
cold tab the #337 stub threw there and the exception took the whole Lit
update cycle with it — the card froze on its very first frame. The demo
mower has no position attributes, telemetry resolved to null, and every
existing smoke (warm and cold) sailed past the branch.

The card now owns the implementation (both dependencies — _vacEntity and
vacMapIdWithFallback — were already eager); the editor runtime delegates
back to the host. The HP-1541-01 invariant (selected_map: 0 is a real map
id, nullish not truthy) moves verbatim and is pinned by the new smoke.

Hardened alongside (audit Lows): _decorShapeDown gets the same
cold-tab guard its twin _decorShapeDbl received in #337 — decor shapes
render in View and CSS pointer-events alone must not be what prevents a
throw; the _vacCalConfirm dialog renders behind the same _editorRuntime
gate as every other editor dialog instead of relying on the implicit
"only the runtime ever sets it".

smoke_cold_view_vacuum: cold tab, vacuum with vacuum_position and
selected_map: 0 — the card commits three successive telemetry frames
(willUpdate alive, not merely the first paint), map id resolves to '0',
no editor chunk requested, a decor pointerdown is a quiet no-op. A
registry mutant restores the delegation and is killed by that smoke.

Issue: #358
User-Visible: yes
2026-08-28 21:49:50 +03:00
claude[bot] 5a662d829d docs: review document for #358
Issue: #358
User-Visible: no
2026-08-28 18:39:51 +00:00
claude[bot] 61911b8656 docs: review document for #357
Issue: #357
User-Visible: no
2026-08-28 18:14:04 +00:00
Codex 49174e81f7 fix: a cold View resolves taps without the lazy editor runtime (#357)
Field report from the dacha: the wall switch "Гостиная основной свет",
whose controls name three virtual light sources, periodically ignored taps
— no toggle, no glow — until its settings dialog was opened once with no
changes. "Periodically" was every fresh tab: the #337 lazy split left
_toggleIntent (and the confirm-line helpers) on the card as stubs
delegating into the editor runtime, so a plain View tap on a cold tab
threw `Houseplan editor runtime is not loaded` synchronously inside the
click handler. Opening any editor surface loaded the runtime and "healed"
the tab for its lifetime.

The View card now owns toggle resolution: _toggleIntent calls
resolveToggleIntent directly (device-toggle.ts was already in the initial
graph; the card owns _planHass/_fullRegistryHass/_virtualLights), and
_toggleStateText/_toggleConfirmationStateText/_toggleConfirmationLines
moved with it. The editor runtime delegates back to the host — one source
of truth, editor consumers (dialog preview, hint lines) unchanged.

Every product smoke preloads the runtime, so none of them could see this
class of regression. The new smoke_cold_view_toggle mirrors the field
config on a genuinely cold tab: a real switch drives three passive
virtual lamps with one tap, a controlled lamp drives its switch back,
tap_confirm renders its state lines and confirms, and the editor chunk is
never requested. A registry mutant restores the old delegation and is
killed by that smoke.

Issue: #357
User-Visible: yes
2026-08-28 21:02:19 +03:00
claude[bot] c2cf4a6996 docs: review document for #357
Issue: #357
User-Visible: no
2026-08-28 17:50:59 +00:00
Matysh 399df907ee build: prepare v1.69.0-beta.2 candidate
Проверка (CI) / Классификация изменённых файлов (push) Successful in 15s
Проверка (CI) / Предполётные проверки: документация, провенанс, процесс (push) Failing after 45s
Проверка (CI) / Hassfest: манифест интеграции (push) Failing after 25s
Проверка (CI) / HACS: валидация репозитория (push) Failing after 27s
Проверка (CI) / Переиспользование: это дерево уже проверено (push) Successful in 44s
Проверка (CI) / Бэкенд: pytest в Home Assistant (push) Failing after 4m29s
Проверка (CI) / Фронтенд: типы, юниты, мутанты, синхрон бандла (push) Failing after 5m39s
Проверка (CI) / Смоки в браузере (шард 1 из 3) (push) Skipped
Проверка (CI) / Смоки в браузере (шард 2 из 3) (push) Skipped
Проверка (CI) / Смоки в браузере (шард 3 из 3) (push) Skipped
Проверка (CI) / Смоки: все шарды зелёные (push) Skipped
Проверка (CI) / Golden-кадры против принятых эталонов (push) Skipped
Проверка (CI) / Перф-смок: бюджет времени кадра (push) Skipped
Package the expanded furniture library, room-aware climate placement, controller-state parity, resilient editor delivery, revision-safe writes and the reviewed supporting fixes since beta.1.

Issue: #159
Issue: #317
Issue: #318
Issue: #335
Issue: #339
Issue: #340
Issue: #341
Issue: #353
Issue: #354
Issue: #356
User-Visible: yes
2026-08-28 20:37:13 +03:00
claude[bot] 07d59b1cad docs: review document for #159
Issue: #159
User-Visible: no
2026-08-28 16:42:00 +00:00
claude[bot] 3633a3db2b docs: review document for #159
Issue: #159
User-Visible: no
2026-08-28 16:20:21 +00:00
Matysh 3c3f85e10d docs: accept furniture screenshots
Capture: https://github.com/Matysh/houseplan-card/actions/runs/33187544417
Issue: #159
User-Visible: no
2026-08-28 18:58:17 +03:00
Matysh 7909ab6eed feat: expand furniture library
Issue: #159
User-Visible: yes
2026-08-28 18:52:03 +03:00
claude[bot]andMatysh cc05df0b33 docs: review document for #159
Issue: #159
User-Visible: no
2026-08-28 18:50:48 +03:00
Matysh 0a8d23bb21 docs: record MIT grant for furniture artwork
Issue: #159
User-Visible: no
2026-08-28 18:50:48 +03:00
Matysh e78e8ed0e1 docs: address first furniture spec review
Issue: #159
User-Visible: no
2026-08-28 18:50:48 +03:00
claude[bot]andMatysh 296edbf827 docs: review document for #159
Issue: #159
User-Visible: no
2026-08-28 18:50:48 +03:00
Matysh 8e2d995ef6 docs: specify furniture pack rollout
Issue: #159
User-Visible: no
2026-08-28 18:50:48 +03:00
claude[bot] 4808426369 docs: review document for #354
Issue: #354
User-Visible: no
2026-08-28 15:15:05 +00:00
Codex c1356fae18 test: prove the failure delivery itself, not only the unsubscription (#354 r1-M1)
The r1 reviewer cut the listener loop in the production registry and all
three #354 units stayed green — the subscription unit was the same class of
decoy the issue itself fights. The fan-out now lives in an exported
notifyLanguageLoadFailures(code); the unit drives it directly and asserts
real delivery, partial unsubscription and silence after the last listener
leaves; the contract unit additionally pins the runtime wiring
(`loadFailed` → notifyLanguageLoadFailures) in source. A new registry
mutant `locale-failure-delivery-cut` replays the reviewer's exact cut and
is killed by the unit. The r1 Low is taken too: both USER-GUIDEs now
mention the toast in the German-failure paragraph.

Issue: #354
User-Visible: no
2026-08-28 18:08:27 +03:00
claude[bot] 4e10f69cfb docs: review document for #354
Issue: #354
User-Visible: no
2026-08-28 15:04:07 +00:00
Codex 1397afefd5 fix: the locale runtime the card ships is the code the tests prove (#354)
The production LANGUAGE_RUNTIME was a handwritten twin of the tested
LanguageRuntime class (germanDictionary/Pending/Failed): equivalent on the
day it was written, invisible to every i18n-runtime test afterwards. The
registry now exports one page-scoped `new LanguageRuntime(LANGUAGE_REGISTRY,
…)` instance — the whole existing suite starts proving the object production
actually runs, and a contract unit (instanceof + source free of the old
field names) keeps the duplicate from returning.

The class gains an optional `loadFailed(code)` hook — fired once when a
dictionary load settles into English fallback — and the registry fans it out
through `subscribeLanguageLoadFailures`. Only the View card subscribes (it
alone owns toast infrastructure): a failed language pack now shows the new
`toast.locale_load_failed` message (en/ru/de) instead of a console-only
warning; space card and both GUI editors keep the console warning as before.

Proofs: contract unit, hook unit, subscription unit; smoke_german_locale
extended — the both-attempts-failed scenario now asserts the visible toast;
two new registry mutants (handwritten-twin returns, toast dropped).

Issue: #354
User-Visible: yes
2026-08-28 17:49:59 +03:00
claude[bot] 468eacdb3b docs: review document for #354
Issue: #354
User-Visible: no
2026-08-28 14:45:28 +00:00
claude[bot] 149b2af7f4 docs: review document for #354
Issue: #354
User-Visible: no
2026-08-28 14:40:08 +00:00
claude[bot] 77302eafb1 docs: review document for #353
Issue: #353
User-Visible: no
2026-08-28 14:32:08 +00:00
Codexandclaude[bot] 78c6020747 fix: lazy delivery survives flaky networks and stale caches (#353)
Network failure of the editor runtime is no longer terminal: the loader
re-arms to idle and the next explicit press starts a fresh cycle, while a
fingerprint mismatch on either attempt stays terminal. The toast now says
what actually helps — retry advice for the network, refresh advice for a
foreign build — via one shared lazyLoadFailureMessage helper (new i18n key
editor.retry_advice in en/ru/de).

The field smoke caught a second, deeper bug on the way: Chromium records a
FAILED module in the page module map permanently, so retrying the same URL
(even the cache-busted one) never touched the network again. Every retry
now carries a per-cycle nonce and becomes a genuinely new module request.

A proxy-cached stale entry no longer kills the card silently: the entry
facade is rewritten at build time from a static re-export into a top-level
`try{await import(...)}catch{...}` — importers keep the happy-path
guarantee (await import(entry) still resolves only after
customElements.define), and the catch defines a fallback element with a
localized "reload the page" panel. Content-hashed chunks are served with
`public, max-age=31536000, immutable`, and verifyBundleTree now fails on
orphan chunks that the manifest does not name.

Proofs: loader units for re-arm/terminality/toast wording + an AST check
that both loaders forward the terminality flag; smoke_entry_stale (en/ru)
against a tree without the main chunk; smoke_lazy_editor_chunk extended —
second press after network failure now really opens the editor; pytest for
the immutable header; orphan-tree unit; five new registry mutants.
TESTING.md budget line updated to the #352 ceiling alongside.

Issue: #353
User-Visible: yes
2026-08-28 14:32:08 +00:00
claude[bot] 8cacfda934 docs: review document for #356
Issue: #356
User-Visible: no
2026-08-28 14:30:04 +00:00
Matysh 24c9a169ac fix: require revision for saved layout replacements
Issue: #356
User-Visible: yes
2026-08-28 17:23:01 +03:00
claude[bot] 3a25b0d908 docs: review document for #317
Issue: #317
User-Visible: no
2026-08-28 14:05:47 +00:00
Matysh 6c9752f5e6 fix: follow marker placement for room climate
Issue: #317
User-Visible: yes
2026-08-28 16:48:10 +03:00
claude[bot] b3df25ab85 docs: review document for #317
Issue: #317
User-Visible: no
2026-08-28 13:33:25 +00:00
Matysh f19ed10f2f docs: specify room-aware climate placement
Issue: #317
User-Visible: no
2026-08-28 16:26:57 +03:00
claude[bot] a6d6d11dc1 docs: review document for #318
Issue: #318
User-Visible: no
2026-08-28 13:18:35 +00:00
Matyshandclaude[bot] 72913fee84 fix: show entityless active controllers
Issue: #318
User-Visible: yes
2026-08-28 13:07:58 +00:00
claude[bot] 4b81dc2ad9 docs: review document for #318
Issue: #318
User-Visible: no
2026-08-28 13:07:58 +00:00
Matyshandclaude[bot] 5514fdfe15 docs: specify empty-roster controller state
Issue: #318
User-Visible: no
2026-08-28 13:07:58 +00:00
Claude 583637313f test: гейт «новый код не добавляет any»
В src/** сейчас 1034 вхождения явного any в 49 файлах — больше, чем называл
аудит (330), потому что монолит с тех пор разделился и его обвязка уехала в
houseplan-editor-runtime.ts. Разовая замена такого объёма — месяц риска ради
нуля пользовательской ценности, поэтому долг снимается при плановом извлечении
подсистем (#34). Задача гейта одна: не давать долгу расти.

Судятся только добавленные строки диапазона. Изменённая строка со старым any
выглядит в диффе добавленной, и это намеренно: тронул — либо типизируй, либо
обоснуй на той же строке `// any-ok: <причина>`. Голый маркер, пустая причина и
шаблоны вроде todo, hack, потом не проходят.

Ложных срабатываний нет по построению, а не по старанию: текст разбирается
парсером TypeScript, и нарушением считается узел AnyKeyword. Регулярка по строке
ловила бы слово any в прозе внутри шаблона html и в комментариях; здесь
комментарии, строковые литералы, многострочные шаблоны и идентификаторы
company, anyOf, manyRooms узлами такого вида не являются вовсе.

Проверено исполнением на настоящем дереве, а не только юнитами: пробные коммиты
в src/wall-thickness.ts показали, что добавленный any падает с файлом и строкой,
типизированная строка в файле с 122 старыми any проходит, any-ok с конкретной
причиной проходит, а голый и «todo» — нет, и что any в прозе, строке и
идентификаторах не даёт ни одного срабатывания.

В job frontend checkout получил полную историю без блобов: diff-aware проверке
нужен диапазон, а содержимое старых ревизий — нет.

Заодно закрыта ловушка в test/validate-workflow.test.mjs: имя job искалось через
indexOf('  frontend:'), а эта строка встречается внутри `      frontend: ${{ ...
}}` в outputs job changes, поэтому срез уходил не туда. Теперь имя ищется с
начала строки.

Четыре мутанта проверены руками, два добавлены в реестр: гейт, судящий все
строки, и гейт, принимающий голый маркер.

Issue: #342
User-Visible: no
2026-08-28 16:02:17 +03:00
claude[bot] a7f0facf9a docs: review document for #341
Issue: #341
User-Visible: no
2026-08-28 11:52:12 +00:00