Commit Graph
2119 Commits
Author SHA1 Message Date
Codex 371f2e9869 docs: #396 spec revision 3 per SPEC-REVIEW-396-r2
User-Visible: no
Issue: #396
2026-08-31 01:36:53 +03:00
claude[bot]andCodex 334dcf2bf8 docs: review document for #396
Issue: #396
User-Visible: no
2026-08-31 01:36:53 +03:00
Codex 7cf22cb54f docs: #396 spec revision 2 per SPEC-REVIEW-396-r1
User-Visible: no
Issue: #396
2026-08-31 01:36:53 +03:00
claude[bot]andCodex 4132e03642 docs: review document for #396
Issue: #396
User-Visible: no
2026-08-31 01:36:53 +03:00
Codex 54f9efb798 docs: specify the camera transition fixes (#396)
User-Visible: no
Issue: #396
2026-08-31 01:36:53 +03:00
claude[bot] cc6bbdf24c docs: review document for #32
Issue: #32
User-Visible: no
2026-08-30 22:28:41 +00:00
Matysh 2f021046aa Update remaining dangerous-action smokes
User-Visible: no
Issue: #32
2026-08-31 01:18:00 +03:00
claude[bot] 2b3d5613f2 docs: review document for #32
Issue: #32
User-Visible: no
2026-08-30 22:06:44 +00:00
Matysh f3ac0ac061 Update free-walls smoke for shared confirmation
User-Visible: no
Issue: #32
2026-08-31 00:59:37 +03:00
Matysh 7b363caabc Accept canonical documentation screenshots
Canonical run: https://github.com/Matysh/houseplan-card/actions/runs/33337407834

User-Visible: no
Issue: #32
2026-08-31 00:50:44 +03:00
Matysh 751769908a Update destructive action smokes
User-Visible: no
Issue: #32
2026-08-31 00:49:56 +03:00
Matysh c91ac74e19 Implement unified dangerous-action confirmation
User-Visible: yes
Issue: #32
2026-08-31 00:46:54 +03:00
claude[bot] 2782f3b1f3 docs: review document for #32
Issue: #32
User-Visible: no
2026-08-30 21:29:56 +00:00
Matysh 4ba1b2730f docs: budget unified confirmation surface
User-Visible: no
Issue: #32
2026-08-31 00:24:32 +03:00
claude[bot] a6b5161f07 docs: review document for #32
Issue: #32
User-Visible: no
2026-08-30 21:23:04 +00:00
Matysh 206bcd1ae7 docs: refresh danger confirmation spec
User-Visible: no
Issue: #32
2026-08-31 00:17:19 +03:00
Matysh 8955c02e3a build: prepare v1.70.0-beta.1 candidate
Package smooth plan navigation, device position history, visible discovery filters, furniture transforms, localized backend errors and the reviewed fixes since v1.69.0.

Issue: #33
Issue: #44
Issue: #74
Issue: #82
Issue: #86
Issue: #381
Issue: #383
Issue: #384
Issue: #385
Issue: #391
User-Visible: yes
v1.70.0-beta.1
2026-08-30 22:52:02 +03:00
Codex 7e27bc7922 fix: type-check against python 3.14, as the runner does (#42)
The new typing step failed on its first CI run — not on our code:
mypy parses the sources of the installed homeassistant, and after #392
that is HA 2026.8.3 on python 3.14, which uses 3.14-only syntax
(parenthesis-free `except`). With python_version = 3.13 mypy stopped at
a syntax error in someone else's file before reaching a single module of
ours, which is exactly the silent-nothing the gate exists to prevent —
except loud.

ruff keeps target-version py313 deliberately: it lints OUR sources and a
lower target only withholds newer-syntax suggestions, while mypy has to
read the dependency tree the runner actually installs.

User-Visible: no
Issue: #42
2026-08-30 22:05:33 +03:00
Codex dddbbe5522 ci: make the strict typing gate actually run (#42)
r6 Medium: AC4 was measurable only on a developer's machine — no
workflow invoked mypy, so a typing regression in any of the six
allowlist modules reached dev unnoticed while the issue claimed
measurable backend quality. Coverage and lint had continuous gates;
typing had a text comparison of a committed list.

The backend job now runs mypy right after ruff, from the same pinned
dependency file (mypy==2.3.1 — an unpinned checker would redden on code
that never changed). The step derives its module list from the
pyproject.toml strict allowlist instead of duplicating it, because a
drifted duplicate is a green step checking the wrong modules, and it
refuses an empty list rather than passing silently.

Guarded twice: a contract test pins all three facts (pinned checker,
a step that really invokes it, list read from pyproject) and the new
typing-gate-stops-running mutant reddens when the invocation is
neutered.

User-Visible: no
Issue: #42
2026-08-30 22:00:52 +03:00
claude[bot] 01fbb77f3b docs: review document for #42
Issue: #42
User-Visible: no
2026-08-30 18:52:32 +00:00
Codex 972e708a71 build: refresh bundle trees and the doc capture after the #392 rebase (#42)
User-Visible: no
Issue: #42
2026-08-30 21:34:32 +03:00
Codex 569867487c fix: adopt the #392 dependency file as the single source (#42)
Rebase resolution: dev's #392 introduced tests_backend/requirements.txt
(python 3.14, phcc 0.13.357, homeassistant 2026.8.3) — exactly the
single-source-of-pins AC of this issue, so the duplicate
requirements_test.txt is dropped and both workflows keep installing from
the #392 file; ruff is added there for the lint step. The backend
reuse key no longer names the dead file (tests_backend/ as a root
already covers the new one); ARCHITECTURE.md points at the real path.

User-Visible: no
Issue: #42
2026-08-30 21:34:32 +03:00
Codex 9f50778df5 test: close the r4 mediums — structural tuple scan and reuse-key inputs (#42)
M1: the AC5 scanner parses the (field, code, message) literal tuple in
validation.py structurally instead of naming the two known codes — a
third tuple entry with an unregistered code now fails the registry test
(verified with an injected invalid_ghost_entity_mutant_probe), and a
tuple whose string count is not a multiple of three refuses instead of
guessing.
M2: the backend reuse key now includes its direct job inputs introduced
by this issue — scripts/backend-coverage-baseline.txt (the threshold the
comparison step reads), requirements_test.txt (the pip source) and
pyproject.toml (ruff/mypy config) — verified: the key changes when the
baseline changes and is restored byte-for-byte with the file.

User-Visible: no
Issue: #42
2026-08-30 21:34:32 +03:00
Codex 26d45cf405 build: refresh bundle trees and the doc capture after the dev rebase (#42)
Rebased onto dev with #82 (camera transitions), #74 (marker undo) and
the re-accepted goldens; bundle trees are rebuilt from the rebased
sources and the screenshot capture is retaken on this HEAD — manifest
AND all PNGs committed together.

User-Visible: no
Issue: #42
2026-08-30 21:34:32 +03:00
Codex fa1aa7a877 test: record the real backend coverage baseline (#42)
87.2% line coverage, taken from the first fully green backend CI job of
this branch (run 33321192996, coverage.xml line-rate 0.8716) — replaces
the 80.0 placeholder as promised before the verdict. The gate refuses
any run below baseline minus 0.1.

User-Visible: no
Issue: #42
2026-08-30 21:34:32 +03:00
Codex f7ae00019c test: the jamb-margin harness assert reads the JSON details (#42)
The harness test still parsed the legacy 'space=... opening=...
margin_cm=...' string; #42 replaced that message with structured JSON
details (the client localizes from the code and reads the fields). The
assert now parses the payload and checks the same three facts.

User-Visible: no
Issue: #42
2026-08-30 21:34:32 +03:00
Codex 778da930cb fix: the quality test no longer stubs packages in sys.modules (#42)
Same defect class as #389: _const() planted bare ModuleType stand-ins
for custom_components(.houseplan) and never removed them, so the HA
harness running later in the same pytest process saw a package without
async_setup — 85 test_ha_* failures with 'No setup or config entry
setup function defined'. const.py imports nothing, so the loader needs
no package context at all: load it by file path under a standalone
module name and leave sys.modules untouched (verified: no
custom_components* keys after _const()).

User-Visible: no
Issue: #42
2026-08-30 21:34:32 +03:00
claude[bot]andCodex 92cf0ab17c docs: review document for #42
Issue: #42
User-Visible: no
2026-08-30 21:34:32 +03:00
Codex 512ab7f279 docs: commit the recaptured screenshot images, not only the manifest (#42)
The previous commit refreshed docs/images/screenshots.json but left the
re-rendered PNGs out of the index — CI compared the committed manifest
against the committed (stale) images and failed on every hash.

User-Visible: no
Issue: #42
2026-08-30 21:34:32 +03:00
Codex 6582a06e17 build: refresh bundle trees after the dev rebase (#42)
Bundle trees are rebuilt from the rebased sources (the pre-rebase build
commit was dropped during the rebase and the trees recreated), and the
doc capture is retaken on the rebased HEAD.

User-Visible: no
Issue: #42
2026-08-30 21:34:32 +03:00
Codex c9dd3401fe fix: pin the last py3.13-compatible test harness and refresh the doc capture (#42)
pytest-homeassistant-custom-component 0.13.317+ require python >=3.14
while the CI runner is 3.13: 0.13.316 is the newest installable release
and resolves to the same homeassistant==2026.2.3 the previously green
unpinned pip line produced. voluptuous is unpinned again — homeassistant
pins 0.15.2 itself and a 0.16.0 pin deadlocks the resolver.
The screenshot capture is refreshed after the any-gate source fix of
e8243d1e, which changed src/ without recapturing (the standing rule:
every src commit needs capture + check-docs).

User-Visible: no
Issue: #42
2026-08-30 21:34:32 +03:00
claude[bot]andCodex fa20e37330 docs: review document for #42
Issue: #42
User-Visible: no
2026-08-30 21:34:32 +03:00
Codex 09adfd73a0 fix: CI-compatible dependency pins and an any-free JSON branch (#42)
pytest-homeassistant-custom-component transitively pins the pytest
family and the homeassistant version — re-pinning them deadlocked the
resolver (the sandbox pip index is py3.10-bound and suggested stale
versions). The structured-details branch no longer copies the legacy
(item: any) annotation the new-code any gate rightly rejects.

User-Visible: no
Issue: #42
2026-08-30 21:34:32 +03:00
Codex d274e38d57 test: mutation-gate accepts python guard files (#42)
User-Visible: no
Issue: #42
2026-08-30 21:34:32 +03:00
Codex 10cdba8435 test: the JSON-details contract counts both branches (#42)
User-Visible: no
Issue: #42
2026-08-30 21:34:32 +03:00
Codex 323b7803e0 feat: measurable backend engineering quality — stage 1 (#42)
Tooling: requirements_test.txt becomes the single source of backend CI
dependencies; pyproject.toml configures ruff (E/F/B/I, E501 excluded by
decision) and mypy strict for a grow-only allowlist of six pure modules
(junction_limits annotated to pass). The 42 substantive ruff findings
are fixed — the B023 loop-variable closures bind their variables as
parameter defaults instead of hiding behind noqa, and every remaining
noqa carries a reason (guarded by a test).

Errors: const.ERROR_CODES / ERROR_CODE_FAMILIES formalise the stable
contract; the scanner test proves every emitted code across BOTH paths
(send_error literals; class attrs, literal and variable-passed
MarkerControlError codes, f-string families) is registered and has a
localized message — 22 missing backup.error.* keys added in all four
languages. invalid_passage_fields / invalid_partition_opening_jamb_margin
ship structured JSON details (legacy format read-compat for one beta),
and _errText renders code-first: unknown codes localize, raw English
messages go to the console.

CI: the backend job lints with ruff, refuses a silently skipped HA
harness (import + collect threshold), measures branch coverage over
pure+harness, fails below the committed baseline and uploads
coverage.xml. quality_scale: docs-troubleshooting/examples honestly
done, test-coverage/strict-typing carry staged progress.

User-Visible: yes
Issue: #42
2026-08-30 21:34:31 +03:00
Codex 066cf44c2f fix: count spec and code review documents apart (#395)
Проверка (CI) / Классификация изменённых файлов (push) Successful in 20s
Проверка (CI) / Предполётные проверки: документация, провенанс, процесс (push) Failing after 52s
Проверка (CI) / Переиспользование: это дерево уже проверено (push) Successful in 55s
Проверка (CI) / HACS: валидация репозитория (push) Failing after 20s
Проверка (CI) / Hassfest: манифест интеграции (push) Failing after 19s
Проверка (CI) / Фронтенд: типы, юниты, мутанты, синхрон бандла (push) Failing after 9m52s
Проверка (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
Проверка (CI) / Бэкенд: pytest в Home Assistant (push) Failing after 1h5m50s
The p.7 limit bucketed every review document of an issue together, so a
task that honestly passed both stages was refused for having passed
them: #42 has 4 SPEC-REVIEW plus 3 CODE-REVIEW documents — 4 and 3
rounds per stage, both inside the budget — and its already-published
GREEN r5 verdict could not publish its own artefact for three runs in a
row, blocking the merge each time.

The counter is now keyed by stage and issue, and the refusal names the
stage. The threshold itself is unchanged: seven documents of one kind
still fail, and the comment above the constant already said what the
number means — the round budget of ONE stage.

User-Visible: no
Issue: #395
2026-08-30 21:34:19 +03:00
claude[bot] e2a681b543 docs: review document for #391
Issue: #391
User-Visible: no
2026-08-30 17:13:01 +00:00
claude[bot] 2518abd961 docs: review document for #391
Issue: #391
User-Visible: no
2026-08-30 17:13:01 +00:00
Matyshandclaude[bot] 31cb2827bf chore: refresh docs source fingerprint (#391)
Record the unchanged screenshot set against the typed editor runtime source after verifying the capture output and preserving the reviewed PNG bytes.

Issue: #391
User-Visible: no
2026-08-30 17:13:01 +00:00
Matyshandclaude[bot] a577fde799 refactor: type editor i18n keys (#391)
Remove legacy any casts from device inbox, marker, and geometry preflight translation calls. Refresh the moved preflight mutation anchor.

Issue: #391
User-Visible: no
2026-08-30 17:13:01 +00:00
Matysh 8dfb0a9e36 test: put the package stub in one place, under an honest condition
Чистые тесты подменяли custom_components и custom_components.houseplan
пустышками и не убирали их никогда. В CI это не стреляло только потому, что
настоящий пакет успевал импортироваться из файла, который идёт раньше по
алфавиту: условие «если ещё не импортирован» оказывалось ложным. То есть
корректность HA-харнесса держалась на именах файлов в каталоге, и хватило бы
переименования, чтобы получить #389 заново.

Подмена переехала в conftest и стала условной по единственному честному
признаку: есть Home Assistant — работаем с настоящим пакетом и не подменяем
ничего; нет — HA-тесты и так пропущены, ломать нечего.

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

Проверено в обе стороны: в песочнице 240 passed, а в эмуляции «HA есть»
объект пакета после прогона тот же, что был до.

Issue: #394
User-Visible: no
2026-08-30 20:11:31 +03:00
Matysh a3dcee5241 ci: move the harness to the current Home Assistant
Замер по AC5 #392 изменил решение. Я собирался заморозить набор на том, что
резолвилось (HA 2026.2.3, февральский), и вынести обновление в отдельную
задачу «на потом» — потому что шесть месяцев дрейфа API вслепую в dev не
отправляют.

Проверил на ветке experiment/392-py314: Python 3.14, phcc 0.13.357,
homeassistant 2026.8.3 — `450 passed, 2 skipped`. Ровно то же, что на старом
наборе, ни одного падения. Обновление оказалось бесплатным, и держать гейт на
февральском HA после такого замера нельзя.

Взята 0.13.357, а не последняя: она последняя, которая пинует стабильный
2026.8.3, дальше пинуются беты. Гейт на бете невоспроизводим — бету могут
перевыпустить под тем же номером.

pytest не закреплён намеренно: phcc задаёт совместимый диапазон сам, жёсткий
пин с ним конфликтует (ResolutionImpossible на 9.0.0, проверено).

Issue: #392
User-Visible: no
2026-08-30 20:00:17 +03:00
Matysh eb5aa2a0f8 ci: pin the HA harness and stop tests from editing sys.path
Два независимых хвоста из разбора #389, оба про то, что «зелёный» значит не
то, что читается.

#392. Оба места, где поднимается HA-харнесс, ставили зависимости без единой
версии. Python при этом закреплён на 3.13, а pytest-homeassistant-custom-
component с 0.13.348 требует 3.14 — резолвер молча уезжал на 0.13.316, а та
тянет homeassistant 2026.2.3. Интеграция полгода проверялась против
февральского HA, и состав окружения мог измениться без нашего коммита.
Версии закреплены в tests_backend/requirements.txt ровно те, что резолвились
30.08; шаг печатает установленное в лог. Это остановка дрейфа, а не
обновление: переход на 3.14 и свежий phcc — отдельная задача с отдельным
измерением.

#393. test_trails.py клал каталог пакета в sys.path при коллекции — на всю
сессию, включая HA-харнесс. Модули интеграции становились импортируемыми ещё
и как модули верхнего уровня, то есть один файл мог оказаться в sys.modules
дважды. Вставка при этом не работала ни на что: TrailBook берётся чтением
текста и exec среза, а не импортом. Убрана вместе с мёртвым spec.

Гейт статический, по исходникам: он ловит намерение, а рантайм поймал бы
последствие и только при сегодняшнем порядке тестов.

Issue: #392
User-Visible: no
2026-08-30 19:49:37 +03:00
claude[bot] 162c8a3bef docs: review document for #391
Issue: #391
User-Visible: no
2026-08-30 16:44:22 +00:00
Matysh a47ec97a04 docs: self-review document for #390
Саморевью по указанию владельца, с оговоркой о независимости. Одна находка
Low на себя: утверждение «эмит тот же» в сообщении cbf5cc1b неверно —
побайтовая сверка нормализованных сборок показала расхождение в одном месте.
Поведение при этом тождественно, разбор в документе.

Отдельно разобрано, почему восемь разошедшихся golden-сцен не из этого
коммита.

Issue: #390
User-Visible: no
2026-08-30 19:29:13 +03:00
claude[bot] b2074c103c docs: review document for #82
Issue: #82
User-Visible: no
2026-08-30 16:11:36 +00:00
claude[bot] a015f31376 docs: review document for #82
Issue: #82
User-Visible: no
2026-08-30 16:11:35 +00:00
Matyshandclaude[bot] f2d620b5d5 test: accept inherited dev golden updates
The same eight changes are present on origin/dev and are unrelated to the smooth camera implementation. Review confirmed the catalog actions, toolbar undo/redo controls and dialog help/status icons are the intended current dev UI. Accept only those named Linux candidates; keep 139 existing scenarios unchanged.

Issue: #82
User-Visible: no
Release: v1.70.0-beta.1
Baseline-Reviewed: https://github.com/Matysh/houseplan-card/actions/runs/33319326145
2026-08-30 16:11:35 +00:00
Matyshandclaude[bot] fd301b6b08 docs: accept settled camera captures
Canonical capture: https://github.com/Matysh/houseplan-card/actions/runs/33319234994

Issue: #82
User-Visible: no
2026-08-30 16:11:35 +00:00