Commit Graph
3268 Commits
Author SHA1 Message Date
claude[bot] 7ce9e6437f docs: review document for #592
Issue: #592
User-Visible: no
2026-09-18 19:31:17 +00:00
Claude 1403fb440b test: давать послабление переноса блоку, а не строке (#592)
Находка M1 код-ревью r1, воспроизведена: первая редакция сопоставляла
одиночные строки по всему диффу, и этого хватало для обхода. Несвязанная
уборка удаляет где-то строку с `any`, новый код добавляет свою — текстуально
такую же, — и гейт молчит. Совпадение здесь не экзотика: в базе 887 явных
`any`, типовые однострочники повторяются буквально, и две такие строки
встретились в самом коммите переноса.

Теперь перенесённым признаётся только непрерывный кусок не короче пяти строк,
встречающийся подряд и целиком среди удалённых строк ОДНОГО файла. Случайно
совпасть пятью строками подряд практически невозможно, а настоящее извлечение
подсистемы из таких кусков и состоит: на этом диффе признано 1296 строк из
1395 — на одну меньше, чем при построчном сопоставлении, и эта одна была ровно
случайным совпадением.

Каждый удалённый кусок оплачивает ровно одно добавление: повторная вставка того
же блока остаётся новым кодом.

Мутант заменён на `no-new-any-forgives-a-single-matching-line` — он опускает
порог до одной строки, то есть открывает ровно найденную дыру; тест обхода на
нём краснеет. Тестов пять: перенос куска, обход одиночной строкой, кусок короче
порога, бюджет на повторную вставку, смена отступа.

Issue: #592
User-Visible: no
2026-09-18 22:17:25 +03:00
claude[bot] d244329857 docs: review document for #592
Issue: #592
User-Visible: no
2026-09-18 17:34:42 +00:00
Claude 61c74a7012 test: не считать дословный перенос новым any (#592)
Validate вернул задачу с красным `no-new-any`: шесть строк в новых модулях
диалогов. Все шесть перенесены побайтово из редакторского рантайма — `as any`
в них написан годы назад и в этом диапазоне не менялся. Счёт долга это
подтверждает: явных `any` в `src/**` было 887 и осталось 887.

Гейт мерил «добавленные строки», и для извлечения подсистемы такая мера
ложна: она требует типизации ровно там, где ничего не изменилось. Причём
единственный способ её удовлетворить — дописать `any-ok` в перенесённое тело,
то есть сломать доказательство переноса (тела обязаны совпадать побайтово) ради
зелёного гейта. Это починка задом наперёд.

Теперь строка, дословно удалённая из одного файла диапазона и добавленная в
другой, новым кодом не считается. Бюджет ведётся мультимножеством: два
добавления при одном удалении оставляют одну находку, а перенос с изменённым
отступом переносом не считается — это уже правка. Отчёт печатает, сколько строк
признано перенесёнными, чтобы послабление было видно, а не подразумевалось.

Гейт #342 при этом остаётся собой: новый `any` без удаления-близнеца — находка,
и три новых теста проверяют обе стороны. Мутант
`no-new-any-counts-every-added-line-as-moved` признаёт перенесённой любую
добавленную строку — заявленный тест на этом краснеет.

Отклонение от скоупа ТЗ: `scripts/no-new-any.mjs` в нём не назван. Альтернатива
— шесть `any-ok` в перенесённом коде — стоила бы побайтовой сверки, на которой
держится вся приёмка задачи.

Issue: #592
User-Visible: no
2026-09-18 19:59:11 +03:00
Claude b76f3e5756 refactor: вынести четыре диалога настроек в модули (#592)
Шаг 0 эпика #591. Видимых изменений нет — это подготовка: оба ядра стояли в
трёх строках от жёсткого потолка, а разметка диалогов была крупнейшей
перемещаемой частью редакторского рантайма.

Перенос механический и проверяемый. Тела всех четырёх методов уехали
побайтово: тип `this` объявлен параметром функции, поэтому ни одна строка
разметки, ни один обработчик и ни один якорь мутанта не переписаны, а в классе
остались однострочные делегаты. Сверка при подготовке коммита: 43 617, 16 795,
10 590 и 6 719 символов совпали посимвольно с оригиналом.

  src/editors/marker-dialog.ts            диалог устройства на плане
  src/editors/space-settings-dialog.ts    диалог пространства
  src/editors/general-settings-dialog.ts  общие настройки
  src/editors/room-settings-dialog.ts     настройки комнаты

Имена файлов пространства и комнаты уточнены против ТЗ: рядом уже живёт
`src/space-dialog.ts` с логикой того же диалога, и два `space-dialog.ts` в
одном дереве путали бы обоих — и человека, и grep.

Попутно из рантайма уехали два словаря ярлыков режима отображения (их
единственный потребитель — диалог устройства) и границы шага сетки: последние
теперь объявлены в модуле, который рисует поле, а кламп записи импортирует их
оттуда. Направление импорта то же, что у самой функции рисования, цикла нет.

`_radarSetup` стал публичным: диалог устройства обращается к контроллеру из
своего модуля, а остальной класс и так живёт на `public _x`.

Потолок ядра опущен 14100 → 12810 — ровно на 1290 вынесенных строк, запас над
фактом прежний. Незафиксированный выигрыш ядро отыграло бы первой же правкой.

Сборщик логического исходника для контрактных тестов (`test/houseplan-source.mjs`)
научен подставлять тело вынесенной функции вместо делегата: шесть тестов,
читающих разметку, продолжают видеть ровно то же, что и до переноса, — иначе
их пришлось бы переучивать на новые пути в тот самый момент, когда они должны
доказать, что перенос ничего не изменил.

Issue: #592
User-Visible: no
2026-09-18 19:36:47 +03:00
claude[bot] b49b124cc6 docs: review document for #592
Issue: #592
User-Visible: no
2026-09-18 16:15:53 +00:00
claude[bot] 8ec85ac0f6 docs: review document for #592
Issue: #592
User-Visible: no
2026-09-18 15:55:17 +00:00
Claude 01fe735079 docs: убрать из документации отклонённую подсветку убираемой комнаты (#589)
Проверка (CI) / Геометрия: TS/Python parity исполнена (push) Successful in 2m50s
Проверка (CI) / Классификация изменённых файлов (push) Successful in 20s
Проверка (CI) / Мутанты по диффу (1/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (2/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (3/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (4/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (5/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (6/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Предполёт: документация, провенанс, процесс (push) Failing after 41s
Проверка (CI) / HACS: валидация репозитория (push) Failing after 15s
Проверка (CI) / Hassfest: манифест интеграции (push) Failing after 22s
Проверка (CI) / Переиспользование: это дерево уже проверено (push) Successful in 44s
Проверка (CI) / Бэкенд: pytest в Home Assistant (push) Failing after 6m13s
Проверка (CI) / Фронтенд: типы, юниты, мутанты, синхрон бандла (push) Failing after 7m57s
Проверка (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) / Доказательство выполненных проверок (push) Failing after 18s
`USER-GUIDE.ru.md`, `FILTERING.md` и `VACUUM.md` описывали «подсветку
убираемой комнаты» пылесоса как существующую фичу, которую подавляет
«Всегда статичный значок». Фичи нет: #12 закрыт `not_planned` 2026-08-27,
`room_highlight` встречается в `src/**` ровно один раз — объявлением поля
схемы в `types.ts:184`, без единого runtime-потребителя.

Формулировка уже утекла как факт в ТЗ #588 (ревью ТЗ r1, M2). Правится
источник: везде остаются только реально существующие слои — puck, след и
предупреждение о маршруте на несопоставленной карте. В `VACUUM.md` поле
схемы помечено как зарезервированное: оно принимается и сохраняется, чтобы
старые планы читались, но ничего не рисует.

Issue: #589
User-Visible: no
2026-09-18 16:08:02 +03:00
Claude 87a76bbff5 docs: убрать PDF из строки чек-листа нового режима (#588)
Находка Low код-ревью r1: архитектурный PDF-экспорт вообще не рисует маркеры
устройств — ни в одном режиме (`src/pdf/pdf-scene.ts`, намеренное ограничение
с 2026-09-07). Строка чек-листа требовала от ручного тестировщика проверить
поверхность, которой нет, и превращала давнее свойство архитектуры в
кажущийся дефект нового режима.

Issue: #588
User-Visible: no
2026-09-18 14:52:15 +03:00
claude[bot] 31864488a7 docs: review document for #588
Issue: #588
User-Visible: no
2026-09-18 11:44:41 +00:00
Claude 9b0855b3c0 test: связать предикаты режима со смоками (#588)
`smoke-select` на диффе задачи назвал `displayIsNeutral` и `displayWantsValue`
символами, которых нет ни в одном смоке: смок работает через DOM и по имени
предикаты не находит. Запись в реестре связывает их со свидетелями, которые
проверяют следствия — значение внутри маркера, отсутствие классов состояния и
пульсации, подавленный живой слой пылесоса, поля диалога устройства.

Issue: #588
User-Visible: no
2026-09-18 13:47:16 +03:00
Claude 99e1765d22 feat: режим «Значение + статичный значок» (#588)
Пятый вариант «Отображение»: маркер показывает выбранное значение и при этом
никогда не меняет цвет — ни по состоянию, ни по тревоге, ни по недоступности,
ни под цвет RGB-света, ни по активности.

Четыре прежних режима задавали одним выбором две независимые вещи: что
нарисовано внутри маркера и красится ли он состоянием. Поэтому вместо
сравнения с одним токеном появились два производных предиката рядом с
`normalizeDeviceDisplay` — `displayWantsValue` и `displayIsNeutral`, — и их
спрашивают политика, слой пульсации, внешний бейдж, редактор и три ветки
живого слоя пылесоса.

Две ловушки, из-за которых режим не сводится к одной строке в словаре:

- быстрый путь «статичному маркеру источники не нужны» (`sourceDetails: false`)
  — это основной путь рендера плана, карточки пространства и PDF. Он оставлен
  только режиму без значения: иначе число пропало бы именно на плане и
  осталось в предпросмотре редактора;
- три ветки живого пылесоса сравнивают режим строкой и не читают политику,
  поэтому зелёная политика их не гарантирует. Свидетель держит две
  конфигурации карты: сопоставленная доказывает puck и след, несопоставленная
  — бейдж маршрута (при совпадающей калибровке маршрут `ready`, и бейджа не
  было бы ни в одном режиме). Бейдж проверяется при наполненном буфере
  позиций, иначе его отсутствие объяснялось бы первой веткой.

Потолок initial View перецентрирован 291_700 → 292_400 без изменения общего
бюджета: измеренный факт 291 346 Б оставлял под прежним центром 354 Б —
внутри шумовой полосы метрики.

Эталон: в `device-icon-state-table-{light,dark}` включённая RGB-лампа
переведена в новый режим. Кадры обязаны разойтись; приёмка — отдельным
коммитом класса D с полного линуксового артефакта Validate.

Issue: #588
User-Visible: yes
2026-09-18 13:40:57 +03:00
claude[bot] 03aaad3e2b docs: review document for #588
Issue: #588
User-Visible: no
2026-09-18 08:54:38 +00:00
claude[bot] eaaba7ab42 docs: review document for #588
Issue: #588
User-Visible: no
2026-09-18 08:44:10 +00:00
claude[bot] 5b7add94d1 docs: review document for #588
Issue: #588
User-Visible: no
2026-09-18 08:29:07 +00:00
Claude a6185e295d Prepare v1.77.0-beta.1
Package the reviewed furniture footprint fix with synchronized release metadata; the golden-manifest platform, composite CI proof, strict screenshot-freshness switch and stable Full Performance base ride along internally.

Release: v1.77.0-beta.1
Issue: #571
Issue: #573
Issue: #584
Issue: #586
Issue: #587
User-Visible: yes
v1.77.0-beta.1
2026-09-18 09:32:55 +03:00
claude[bot] 0de14ead71 docs: review document for #571
Проверка (CI) / Классификация изменённых файлов (push) Successful in 18s
Проверка (CI) / Мутанты по диффу (1/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (4/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (5/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (6/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (2/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (3/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Предполёт: документация, провенанс, процесс (push) Failing after 31s
Проверка (CI) / HACS: валидация репозитория (push) Failing after 22s
Проверка (CI) / Hassfest: манифест интеграции (push) Failing after 22s
Проверка (CI) / Переиспользование: это дерево уже проверено (push) Successful in 43s
Проверка (CI) / Геометрия: TS/Python parity исполнена (push) Successful in 2m39s
Проверка (CI) / Бэкенд: pytest в Home Assistant (push) Failing after 5m47s
Проверка (CI) / Фронтенд: типы, юниты, мутанты, синхрон бандла (push) Failing after 7m38s
Проверка (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) / Доказательство выполненных проверок (push) Failing after 16s
Issue: #571
User-Visible: no
2026-09-17 20:59:57 +00:00
Codex f77bdaf52e docs: переснять индекс скриншотов после правки run.mjs (#571)
Разовая плата за провенанс: `demo/golden/run.mjs` входит в корпус отпечатка
исходников, поэтому правка объявила индекс скриншотов документации устаревшим.
Снято workflow «Скриншоты документации» (прогон 35270230061, ref — ветка
задачи). Все одиннадцать кадров совпали с закоммиченными **байт-в-байт**:
принят только отпечаток, картинки не менялись — сбор провенанса ничего не
рисует.

`check-docs --strict` зелёный.

Issue: #571
User-Visible: no
2026-09-17 23:23:37 +03:00
Codex 3f95dac451 fix: индекс эталонов хранит платформу съёмки, а не платформу приёмки (#571)
Аудит 14.09, §4 и §9. `golden-report.json` не нёс платформу вовсе, поэтому
приёмщик вызывал `captureEnvironment()` у себя и записывал СВОЮ платформу как
платформу кадров. На `ad4000f9` это дало `"platform": "win32"` у кадров,
снятых Linux-прогоном 34853080375, а причина осознанного обхода осталась в
stdout и в индекс не попала — хотя `AGENTS.md` обещает след в обоих местах.
Сами PNG были и остаются целы: 101 свидетель совпал байт-в-байт. Врал
провенанс.

Что сделано:

- отчёт съёмки получил раздел `capture`: платформа, архитектура, сборка
  Chromium, отпечаток материала и — в CI — прогон с попыткой и SHA. Схема
  отчёта поднята до 2;
- приёмка читает среду съёмки из отчёта. Гейт чужой среды теперь судит обе
  стороны: съёмку (из отчёта) и приёмку (свою). Отказ — до единой записи;
- индекс эталонов поднят до схемы 2 и различает `capturedOn` и `acceptedOn`,
  несёт раздел `capture` и причину осознанного обхода в `foreignCapture`;
- отчёт схемы 1 платформы съёмки не несёт физически: это отдельная явная
  ветка, `capturedOn` уезжает `null`. Выдумывать платформу нельзя — ровно этим
  задача и вызвана;
- `--baselines=<dir>` у приёмки: без него проверить «отказ произошёл ДО
  записи» можно было бы только порчей рабочего дерева, то есть никак (#556).

Осознанно отменено решение #455 «не трогать run.mjs»: ради ГЕЙТА цена
фингерпринта не окупалась, ради ПРОВЕНАНСА окупилась — платформу кадров знает
только тот, кто их снял. Плата разовая: пересобран бандл, индекс скриншотов
документации переснят отдельным коммитом. Тест #455 переписан под новый
инвариант, а не удалён.

Свидетели: `test/golden-capture-provenance.test.mjs` — семь проверок, все пять
сценариев приёмки из issue, включая «отказ до записи» и «подмена PNG и неполный
артефакт по-прежнему fail-closed». Мутанты `golden-index-invents-capture-platform`
(возвращает платформу приёмщика) и `golden-report-provenance-optional`
(разрешает отчёт схемы 2 без провенанса) прогнаны лично: оба краснеют.

npm test 2762/2761/0 fail, typecheck чистый.

Issue: #571
User-Visible: no
2026-09-17 23:19:56 +03:00
claude[bot] df9031b1ba docs: review document for #573
Issue: #573
User-Visible: no
2026-09-17 19:40:37 +00:00
Claude 2ea1e5e62a ci: reviewed run судится только release-потребителем (#573, ревью r1 M1)
`loadGithubProofContext` спрашивал объявленный `Baseline-Reviewed` run для
любого потребителя, а `evaluateCiProof` судил его при `reviewedRun: null` —
merge и review начинали зависеть от доступности старого run по чужой причине.
Теперь запрос делается только с `withReviewedRun` (release-gate передаёт его
вместе с ожиданиями), а проверка стоит внутри `if (expected)` — рядом со
сверкой evidence, где ей и место. Тест: без ожиданий merge/review green при
reviewedRun undefined/null/пустом; фейковый fetch доказывает, что запроса нет.

Issue: #573
User-Visible: no
2026-09-17 22:26:19 +03:00
claude[bot] da156dd10b docs: review document for #573
Issue: #573
User-Visible: no
2026-09-17 19:17:34 +00:00
Claude 47f36e571c ci: proof различает продуктовое дерево и overlay эталонов (#573)
Приёмка эталонов на beta.3 (`ad4000f9`) стоила второго полного Validate —
22 минуты, из них 17–22 на шард мутантов. Причина одна: корпус отпечатка
(`source-fingerprint.mjs`) называет `demo/golden` строкой-каталогом, а
замыкание входов раскрывало каталог во все текстовые файлы под ним, включая
`baselines-index.json`. Индекс становился входом smoke, performance_smoke и
каждого гарда через `serve.mjs`: на реальной паре C→B ключи smoke/perf были
DIFFERENT, отпечатки 181 из 183 браузерных свидетелей менялись, журнал их не
пропускал.

- `check-inputs.mjs`: `BASELINE_OVERLAY` — раскрытие каталога не выдаёт
  overlay; явный корень golden и явная ссылка на файл — как были. На паре
  C→B: ключи smoke/perf/parity/backend same, golden DIFFERENT; отпечатки
  743 из 744 равны; план мутантов B с журналом C — 0–1 на шард вместо 38–44
- `ci-proof.mjs`: составное evidence — product tree без overlay, overlay
  (tree, sha256 индекса, run из `Baseline-Reviewed`), content-ключи всех
  реюзных job (исполненных тоже); `evaluateCiProof({expected, reviewedRun})`
  сверяет с локальным расчётом, fail-closed на ключ, tree, индекс, reviewed
  run, маркер с чужим ключом; proof без evidence при ожиданиях — stale
- `release-gate.mjs` / `release-prerelease.mjs`: ожидания считаются на
  checkout кандидата (`candidateExpectations`), чужой checkout — notice
- мутанты: `baseline-overlay-leaks-into-every-key`,
  `proof-trusts-evidence-it-could-verify`,
  `reused-marker-key-unchecked-against-candidate`,
  `product-tree-identity-counts-baselines`; перенацелен
  `ci-proof-ignores-run-attempt`
- docs: TESTING (правило overlay), DEVELOPMENT (evidence в release proof),
  STATUS

Issue: #573
User-Visible: no
2026-09-17 22:00:15 +03:00
claude[bot] 06bf9b6921 docs: review document for #584
Проверка (CI) / Классификация изменённых файлов (push) Successful in 20s
Проверка (CI) / Мутанты по диффу (1/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (2/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (3/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (4/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (5/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (6/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Предполёт: документация, провенанс, процесс (push) Failing after 34s
Проверка (CI) / HACS: валидация репозитория (push) Failing after 19s
Проверка (CI) / Hassfest: манифест интеграции (push) Failing after 27s
Проверка (CI) / Переиспользование: это дерево уже проверено (push) Failing after 44s
Проверка (CI) / Геометрия: TS/Python parity исполнена (push) Skipped
Проверка (CI) / Бэкенд: pytest в Home Assistant (push) Skipped
Проверка (CI) / Фронтенд: типы, юниты, мутанты, синхрон бандла (push) Failing after 6m17s
Проверка (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) / Доказательство выполненных проверок (push) Failing after 15s
Issue: #584
User-Visible: no
2026-09-16 21:19:57 +00:00
claude[bot] 62d86e0f83 docs: review document for #584
Issue: #584
User-Visible: no
2026-09-16 21:12:40 +00:00
Codex 9bf41ec305 test: принять эталоны мебели и индекс скриншотов (#584)
Девять golden-кадров приняты с полного линуксового артефакта Validate (прогон
35144164510, `full=true` на материале задачи); остальные 163 сохранены без
изменений, свидетелей среды 107.

Каждый разошедшийся кадр просмотрен глазами и объяснён:

- шесть мебельных (`furniture-variants-*`, `furniture-placement-preview-light`,
  `furniture-plan-art-dark`, `furniture-transform-*`) — предметы занимают
  заявленный бокс целиком. Там же видна вторая правка: у значка «Журнальный
  стол, круглый» четыре ножки встали по местам внутри круга, а раньше две
  болтались у нижнего края — ровно тот механизм смещения деталей, который
  назван в шапке issue;
- два декоративных (`decor-over-opaque-hover-light`, `decor-over-glow-base-dark`)
  — в сцене стоит диван, его контур дорос до границ бокса; форма, цвет и
  положение прежние;
- `isometric-stage3-overlays-dark` — та же мебель в скрытом 2.5D-виде.

Посторонних изменений нет: расхождение 0,16–1,48 % пикселей кадра и целиком
внутри силуэтов мебели.

Индекс скриншотов документации переснят там же (прогон 35144241294): все
одиннадцать кадров совпали с закоммиченными байт-в-байт, принят только
отпечаток — мебель ни в один кадр документации не попадает.

Трейлер `Release:` называет ближайшую бету линейки по образцу #577 и #580;
если номер линейки окажется другим, он правится при подготовке кандидата.

Issue: #584
User-Visible: no
Release: v1.77.0-beta.1
Baseline-Reviewed: https://github.com/Matysh/houseplan-card/actions/runs/35144164510
2026-09-16 23:11:44 +03:00
Codex ef3bc6d133 fix: габарит мебели равен заявленным размерам (#584)
Указанные ширина и глубина теперь совпадают с видимым габаритом предмета.
Раньше рисунок занимал внутри своего бокса около 88 % стороны, поэтому
«Кухонный напольный модуль» 60 × 60 выглядел меньше «Посудомоечной машины»
60 × 60 примерно на 14 % по стороне и на 30 % по площади: цифры совпадали,
картинка врала.

Пак `fix-584-1` от дизайнера (issue, комментарий от 16.09) проверен исполнением
своей метрикой, а не его отчётом: границы считаются аналитически по той же
математике, что у продакшен-экспорта в PDF. Все 44 плановых SVG заполняют
`viewBox` с худшим отклонением 0.000000 при допуске ТЗ 0,1; `pack.json` и 33
иконки меню побайтно прежние. Для сравнения, прежний набор в `dev` давал 65
нарушений того же контракта.

Что сделано в коде:

- `scripts/svg-path-bounds.mjs` — границы рисунка по настоящим экстремумам
  кривых (дуги приводятся к кубикам). Контрольные точки в габарит не входят:
  иначе «заполняет бокс» проверялось бы по выпуклой оболочке и поля проходили
  бы мимо. Генератор — `.mjs` и обязан работать без сборки TypeScript, поэтому
  разбор здесь свой; тест сверяет его с `parseSvgPath` продакшена на всей
  библиотеке, чтобы реализации не разъехались молча.
- `scripts/furniture-path-join.mjs` — склейка нескольких `<path>` с
  канонизацией только начального `moveto`. Приём подсказан патчем в поставке
  дизайнера; реализация и свидетели свои. Прежний `paths.join(' ')` продолжал
  координаты предыдущего пути: замер показал, что у иконок меню `stairs` и `tv`
  части рисунка уезжали за `viewBox` 110 × 110 — до 119. Теперь склейка
  побайтно воспроизводит «каждый путь из своего нуля».
- генератор проверяет плановый символ по контракту: один путь, подконтуры с
  абсолютной `M`, рисунок заполняет `viewBox` (допуск 0,1).
- `src/furniture.ts` — legacy `plant` растянут от центра в 1/0.96. Это
  единственный из двенадцати retained-примитивов с полями (0.02…0.98 unit box);
  форма прежняя, габарит стал заявленным.

Свидетели: `test/furniture-visual-bounds.test.mjs` (AC1–AC3, AC5 и сверка двух
реализаций границ) и `test/furniture-path-join.test.mjs` (AC4, включая реальные
`stairs`/`tv`). У AC1 есть положительный контроль: та же функция обязана видеть
поля на геометрии из шапки issue — утверждение «полей нет» стоит ровно столько,
сколько стоит измерение. Мутанты `furniture-symbol-may-keep-inner-padding` и
`furniture-paths-joined-without-reset` возвращают прежнее поведение и краснеют;
прогнаны лично через `mutation-gate --id=`.

Миграции пользовательских данных нет: координаты, размеры, поворот и
зеркалирование сохраняются.

npm test 2743/2742/0 fail, typecheck чистый, furniture:check зелёный.

Issue: #584
User-Visible: yes
2026-09-16 23:02:11 +03:00
claude[bot] e0b16c76d7 docs: review document for #584
Проверка (CI) / Классификация изменённых файлов (push) Successful in 27s
Проверка (CI) / Мутанты по диффу (1/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (2/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (3/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (4/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (5/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (6/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Предполёт: документация, провенанс, процесс (push) Failing after 46s
Проверка (CI) / Переиспользование: это дерево уже проверено (push) Successful in 1m17s
Проверка (CI) / HACS: валидация репозитория (push) Failing after 20s
Проверка (CI) / Hassfest: манифест интеграции (push) Failing after 17s
Проверка (CI) / Геометрия: TS/Python parity исполнена (push) Successful in 3m24s
Проверка (CI) / Бэкенд: pytest в Home Assistant (push) Failing after 8m20s
Проверка (CI) / Фронтенд: типы, юниты, мутанты, синхрон бандла (push) Failing after 11m18s
Проверка (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) / Доказательство выполненных проверок (push) Failing after 16s
Issue: #584
User-Visible: no
2026-09-16 19:50:17 +00:00
claude[bot] 1c0ed73133 docs: review document for #584
Issue: #584
User-Visible: no
2026-09-16 19:42:43 +00:00
claude[bot] 7c5fd32a08 docs: review document for #586
Issue: #586
User-Visible: no
2026-09-16 19:23:02 +00:00
Codex 21923c344d docs: пересняты и приняты кадры документации (#586)
Долг, который копился ровно потому, что гейт свежести не включался. Последняя
приёмка (`1734b077`) была отпечаток-онли — `acceptance.lastWriteWasFingerprintOnly:
true`, — а сами картинки лежат с `15e0efe3`. С тех пор индекс разошёлся с
`src/**` и на кандидате обязан был краснеть, но краснеть ему было нечем.

Снято workflow «Скриншоты документации» (прогон 35137580137, `ref=dev`,
Chromium 151.0.7922.34, oxipng 10.2.0) — теми же, что и закоммиченный набор.
Семь кадров совпали с закоммиченными байт-в-байт: это и есть доказательство
среды по #401, порог свидетелей 2.

Разошлись четыре, и все четыре — подпиксельная кайма, а не содержимое:

| кадр | отличий всего | из них >10 | maxΔ |
|---|---|---|---|
| view-desktop | 177 (0,02 %) | 0 | 10 |
| view-touch | 83 (0,03 %) | 2 | 17 |
| room-card | 85 (0,17 %) | 0 | 10 |
| device-info | 137 (0,02 %) | 0 | 5 |

Посмотрел глазами при шестикратном увеличении: у `room-card` меняется свечение
красной подписи «35» на пару единиц канала, у `view-touch` — сглаживание
зелёного значка; геометрия, палитра, подписи и композиция те же.

Отдельно проверил, что это не шум съёмки: перезапустил тот же прогон вторым
заходом и сравнил артефакты — **все одиннадцать кадров совпали байт-в-байт**.
Харнесс детерминирован, значит расхождение принесено кодом, а не раннером, и
объявлять его декларацией — правильно, а не удобно.

`check-docs --strict` зелёный.

Issue: #586
User-Visible: no
2026-09-16 22:06:17 +03:00
Codex 245b7f9847 ci: строгий режим свежести скриншотов включается на кандидате (#586)
Проверка #479 обязана быть строгой на кандидате беты и на релизном гейте.
Фактически она не была строгой ни разу: preflight сравнивал со строкой
`heavy=true` ВЕСЬ вывод `classify-changes.mjs --heavy`, а вывод двухстрочный —
`heavy=…` и `mutants_requested=…`. В `$(…)` строки схлопываются через пробел,
сравнение не совпадало никогда, режим оставался `warn`.

Видно построчно в логе прогона 35091507839 на кандидате `4c44ef60`:

    скриншоты документации: режим warn (heavy=true
    WARN screenshot source fingerprint is stale; ...
    ok   документация

То есть проверка увидела устаревший индекс и пропустила кандидата. Обе беты
после `699ab471` уехали с ним; на чистом checkout того же SHA
`node scripts/check-docs.mjs --strict` падает с ERROR.

Правило, которое из этого следует: формат `$GITHUB_OUTPUT` — построчный
`ключ=значение`, читать его надо по ключу либо не читать вовсе. Где нужен один
ответ, CLI отдаёт один ответ: `--screenshots-mode` печатает `warn` или
`strict`, и в shell не остаётся ни разбора, ни развилки.

Свидетели в `test/classify-changes.test.mjs`: режим по каждому событию, форма
вызова в workflow (сравнение со строкой `heavy=true` не должно вернуться) и
прямая проверка того, что вывод `--heavy` многострочный — то есть целиком
сравнивать его нельзя. Мутант `screenshot-freshness-never-strict` возвращает
прежнее «никогда не strict» и обязан краснеть.

Issue: #586
User-Visible: no
2026-09-16 21:55:59 +03:00
claude[bot] 303c0843e7 docs: review document for #587
Issue: #587
User-Visible: no
2026-09-16 18:50:14 +00:00
Codex 978035c491 ci: база стабильного кандидата — предыдущий стабильный тег (#587)
Относительная половина «Полных бенчмарков» сравнивала кандидата с прошлой
вершиной `main`. Для стабильного релиза это давало круг, в котором гейт не
может покраснеть дважды: прогон идёт только на push в `main`, кандидат обязан
там оказаться, и следующий коммит той же линейки берёт базой первый — то есть
линейку саму. На выпуске v1.76.0 это видно построчно: прогон 35097102695 на
`c3d64789` честно показал resizePreview 603 → 981 и panZoom 91 → 205 в скрытой
изометрии, а прогон на `9683a590` был зелёным и был бы зелёным без всякой
правки бюджетов.

Теперь база выбирается по намерению коммита: head несёт трейлер `Release:` без
пре-релизного суффикса — сравниваем с предыдущим стабильным тегом. Бета,
обычный push и ручной `comparison_ref` не меняются.

Решение вынесено из shell в `scripts/performance-baseline.mjs` по тому же
доводу, что и разбор вердикта ревью (#556): отрицательные случаи — тега нет,
тег стоит на самой голове, база перестала быть предком, база старше
HP-PERF-01 — в YAML не прогнать ни одним тестом. Обращения к git инжектируются,
фикстуры описывают дерево. Отказы по-прежнему уводят в сторону БОЛЬШЕГО
сравнения: непригодная база → родитель → последний достижимый релизный тег.

Проверено исполнением на этом репозитории: стабильный кандидат v1.76.0 →
`2c6410bb` (v1.75.0); бета v1.76.0-beta.5 и обычный push → `push before`;
dispatch с `comparison_ref=v1.74.0` → `e63460f0`.

Свидетели: `test/performance-baseline.test.mjs` (10 проверок, включая AC2 —
второй коммит линейки не сравнивается сам с собой) и мутант
`stable-candidate-compares-against-itself`, который возвращает прежнее
поведение и обязан краснеть; проверено подменой руками — AC2 падает, оригинал
проходит.

AC4: других релизных гейтов, судящих о родителя, нет. `validate.yml` берёт
`github.event.before` только для ДИАПАЗОНА файлов, и там база уже заменена
доказанно зелёным предком (#387/#388), а не сырым родителем.

npm test 2731/2730/0 fail, typecheck чистый, check-docs зелёный (кроме
известного отпечатка скриншотов, #586).

Issue: #587
User-Visible: no
2026-09-16 21:34:39 +03:00
Codex 9683a59016 perf: принять шаг изометрии на жесте в бюджетах двух профилей (#585)
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (isometric) (push) Failing after 4m40s
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (interaction) (push) Failing after 5m4s
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (isometric-stage3) (push) Failing after 4m33s
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (blend) (push) Failing after 5m6s
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (space-default) (push) Failing after 3m55s
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (overlay) (push) Failing after 4m2s
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (plan-snap) (push) Failing after 4m1s
Проверка (CI) / Классификация изменённых файлов (push) Successful in 34s
Проверка (CI) / HACS: валидация репозитория (push) Skipped
Проверка (CI) / Hassfest: манифест интеграции (push) Skipped
Проверка (CI) / Фронтенд: типы, юниты, мутанты, синхрон бандла (push) Skipped
Проверка (CI) / Предполёт: документация, провенанс, процесс (push) Successful in 45s
Проверка (CI) / Переиспользование: это дерево уже проверено (push) Failing after 1m9s
Проверка (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) / Геометрия: TS/Python parity исполнена (push) Skipped
Проверка (CI) / Бэкенд: pytest в Home Assistant (push) Skipped
Проверка (CI) / Мутанты по диффу (1/6): затронутые свидетели краснеют (push) Failing after 1m47s
Проверка (CI) / Мутанты по диффу (2/6): затронутые свидетели краснеют (push) Failing after 2m21s
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (large-house) (push) Failing after 12m40s
Проверка (CI) / Мутанты по диффу (4/6): затронутые свидетели краснеют (push) Successful in 2m51s
Проверка (CI) / Мутанты по диффу (5/6): затронутые свидетели краснеют (push) Failing after 1m33s
Проверка (CI) / Мутанты по диффу (3/6): затронутые свидетели краснеют (push) Successful in 4m31s
Проверка (CI) / Мутанты по диффу (6/6): затронутые свидетели краснеют (push) Successful in 3m28s
Проверка (CI) / Доказательство выполненных проверок (push) Failing after 26s
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (space-glow) (push) Failing after 29m2s
Полные бенчмарки кандидата v1.76.0 (прогон 35097102695, SHA c3d64789) против
v1.75.0 покраснели на двух скрытых изометрических профилях:

| метрика | v1.75.0 | v1.76.0 | предел |
|---|---|---|---|
| large-house-isometric resizePreview | 603 | 981.4 | 753 |
| large-house-isometric panZoom | 90.8 | 205.2 | 150.8 |
| stage3-dense stateUpdate | 77.5 | 169.1 | 152.5 |
| stage3-dense resizePreview | 582.5 | 765.6 | 732.5 |
| stage3-dense panZoom | 90.6 | 171.7 | 150.6 |

Шаг настоящий и объяснённый: #583 добавил скрытому 2.5D-виду геометрии, а
поиск свободного места для подписей даже после ускорения решёткой стоит вдвое
дороже, чем до #583. Абсолютные потолки не тронуты и держатся с запасом
(panZoom 205 при 600, resize 981 при 2200); все семь пользовательских профилей
зелёные — регрессия целиком внутри вида за `hp_alpha`.

Решение владельца 2026-09-16: принять. Рычаг — допуск в миллисекундах, а не
коэффициент: он покрывает разовый сдвиг уровня и продолжает ловить рост от
нового уровня, тогда как поднятый коэффициент разрешил бы удвоение навсегда.
Значения одинаковы у обоих профилей — контракт #160 требует, чтобы плотный
двойник Stage 3 делил с историческим профилем каждый общий потолок, и тест
`performance-workflow` это стережёт.

Допуски временные. #585 переписывает поиск на перебор границ препятствий
вместо скана диска 48 px; когда он приедет, значения возвращаются к 150/60/75.
Тест `performance-budget` фиксирует и числа, и то, что наблюдённый шаг проходит,
а следующий такой же — уже нет.

Честно о границе метода: сравнение идёт с ПРЕДЫДУЩЕЙ вершиной main, а она уже
несёт эту же линейку, поэтому следующий прогон был бы зелёным и без правки
бюджетов. Правка сделана не ради зелёного прогона, а чтобы принятый уровень был
записан явно и проверялся тестом. Отдельно завожу, что базой стабильного
кандидата должен быть предыдущий стабильный тег, а не вершина main.

npm test 2721/2720/0 fail.

Issue: #585
User-Visible: no
Release: v1.76.0
v1.76.0
2026-09-16 17:36:47 +03:00
Codex c3d6478976 Release v1.76.0: вершина dev вбирает CI-коммит main
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (space-glow) (push) Failing after 2m58s
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (blend) (push) Failing after 3m0s
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (isometric-stage3) (push) Failing after 3m13s
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (isometric) (push) Failing after 3m37s
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (interaction) (push) Failing after 3m39s
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (plan-snap) (push) Failing after 2m51s
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (space-default) (push) Failing after 2m27s
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (large-house) (push) Failing after 25m7s
Проверка (CI) / Предполёт: документация, провенанс, процесс (push) Failing after 17m13s
Проверка (CI) / Классификация изменённых файлов (push) Successful in 31s
Проверка (CI) / Переиспользование: это дерево уже проверено (push) Failing after 57s
Проверка (CI) / HACS: валидация репозитория (push) Skipped
Проверка (CI) / Hassfest: манифест интеграции (push) Skipped
Проверка (CI) / Мутанты по диффу (1/6): затронутые свидетели краснеют (push) Failing after 1m38s
Проверка (CI) / Мутанты по диффу (2/6): затронутые свидетели краснеют (push) Successful in 2m47s
Проверка (CI) / Мутанты по диффу (3/6): затронутые свидетели краснеют (push) Failing after 1m41s
Проверка (CI) / Мутанты по диффу (4/6): затронутые свидетели краснеют (push) Successful in 3m25s
Проверка (CI) / Мутанты по диффу (5/6): затронутые свидетели краснеют (push) Failing after 1m45s
Проверка (CI) / Мутанты по диффу (6/6): затронутые свидетели краснеют (push) Failing after 1m44s
Проверка (CI) / Фронтенд: типы, юниты, мутанты, синхрон бандла (push) Skipped
Проверка (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) / Геометрия: TS/Python parity исполнена (push) Skipped
Проверка (CI) / Бэкенд: pytest в Home Assistant (push) Skipped
Проверка (CI) / Доказательство выполненных проверок (push) Failing after 26s
Полные бенчмарки производительности / Бенчмарки рендера и геометрии (overlay) (push) Failing after 38m42s
Слияние main (зеркало process.yml и mutation-gate.yml, a33cf8da) в
протестированный dev. Содержимое дерева не меняется: оба файла в main уже
равны своим версиям в dev — зеркало их оттуда и забрало.

Смысл коммита механический: после него main перематывается на эту вершину без
коммита слияния, поэтому Validate (push в dev) и Полные бенчмарки (push в
main) идут на ОДНОМ SHA — том самом, который получит тег. Гейт релиза требует
оба прогона на точном SHA кандидата.

Issue: #582
User-Visible: no
Release: v1.76.0
2026-09-16 15:38:07 +03:00
Codex ca74a5c2ee Release v1.76.0
Promotion-only на вершине v1.76.0-beta.5: семь источников версии, снимки
собранного бандла и релизные метаданные. Продуктовый код в этом коммите не
двигается.

Линейка агрегируется от стабильной v1.75.0. Пользователю: щипковое
масштабирование в приложении Home Assistant больше не рвёт картинку — на
больших планах с фоном «Следует за Солнцем» пропали фиксированные белые
провалы (#582), план перестал переключаться между режимами композитинга
посреди жеста (#579), а щипок, начатый на значке устройства, не запускает его
действие и не открывает два окна сразу (#578, #563). Появился выбор источника
солнечных лучей — от внутренних или внешних углов окна (#577). «Как у
пространства» снова возвращает комнате цвет пространства и лечит застрявшие
(#581). Близко стоящие значки не перехватывают нажатие друг у друга, а
клавиатурный фокус получает ту же подсказку, что и мышь (#564, #565). План,
изменённый в другом браузере, не откатывается (#543), и при перетаскивании у
края не появляется пустая полоса (#544). Мельче: #561, #554, #545, #580.
Внутреннее в линейке: #583, #547, #556, #560, #566, #567, #568, #569.

Из тела исключён #580: этот дефект жил только внутри бета-линейки — режим
внешних углов окна (#577) не выходил ни в одном стабильном релизе, поэтому
пользователю он «исправлением» не является. В ченджлоге он остаётся.

Записано, а не замолчано: индекс свежести скриншотов документации устарел с
коммита 699ab471, а гейт Validate, который обязан был это поймать, лишь
предупреждает — режим выбирается сравнением с многострочным выводом CLI
(#586). Одиннадцать кадров документации от той правки измениться не могли: ни
одна из сцен не рисует скрытый 2.5D-вид, а отпечаток считается по всему
`src/**`. Пересъёмка требует Chromium, которого в этой песочнице нет.

npm test 2720/2719/1 fail (только bundle-tree до этого коммита), typecheck
чистый, контракт релиза зелёный на всех семи источниках, тело проходит #328
(`release:notes --verify`), check-docs зелёный кроме отпечатка скриншотов.

Issue: #582
User-Visible: yes
Release: v1.76.0
2026-09-16 15:34:35 +03:00
Codex 4c44ef60bd Принять изометрические эталоны v1.76.0-beta.5
Двенадцать изометрических кадров приняты с полного линуксового артефакта
Validate прогона 35088061662; остальные 160 эталонов не менялись, свидетели
среды сходятся (104, floor 10).

Кадры пересняты дважды: сперва из-за продуктовой правки #583, затем из-за
ускорения расстановки подписей. Одиннадцать кадров совпадают с прогоном до
ускорения побайтно (maxΔ ≤ 2 — сглаживание), расстановку меняет один —
`isometric-large-warm-remount-dark`: в плотной комнате два маркера садятся друг
на друга вместо разъезда на 48 px. Это осознанная плата за скорость, заведена
отдельной задачей #585 с замерами обоих верных вариантов поиска; вид скрыт за
`hp_alpha` и пользователю не виден.

Issue: #583
User-Visible: no
Release: v1.76.0-beta.5
Baseline-Reviewed: https://github.com/Matysh/houseplan-card/actions/runs/35088061662
v1.76.0-beta.5
2026-09-16 14:39:38 +03:00
Codex c4cd1f6af6 Кандидат v1.76.0-beta.5 после починки перфоманса
Трейлер `Release:` просит CI прогнать тяжёлые гейты — смоки, golden и полное
сравнение производительности — на этом SHA: кандидат 1734b077 был задержан
собственным гейтом производительности изометрии, регрессия из #583 починена
коммитом выше по §11.4 (та же задача, без повторного ревью, команда и её
результат записаны в issue).

Issue: #583
User-Visible: no
Release: v1.76.0-beta.5
2026-09-16 13:58:51 +03:00
Codex 699ab4710f perf: coarse lattice with refinement for isometric overlay placement (#583)
Разрешение коллизий 2.5D-подписей сканировало диск смещений с шагом 1 px и
для каждого кандидата спрашивало пространственный хэш и все стены. Замер
показал: на large-house-isometric-v1 580 размещений дают 2 523 652 смещения и
1 742 740 проверок отпечатка против стен, 98 % позиций отвергают стены.

Поиск переведён на решётку 4 px с уточнением 1 px вокруг найденного места
(и вокруг лучшего конфликтующего кандидата — без второго уточнения качество
разрешения падало с 308 до 304). Дешёвая часть кандидата (позиция, габариты,
конфликты, штраф) отделена от дорогой (комната-владелец, непрерывность
сегмента, зазор до стены); соседи считаются один раз на элемент; расстояния
таблицы смещений предвычислены; добавлены AABB комнаты-владельца и широкая
фаза по стенам.

Групповой проход 9584 → 839 мс, смещений 2 523 652 → 157 618, разрешено
308 / остаток 272 — как до правки.

Issue: #583
User-Visible: no
2026-09-16 13:58:31 +03:00
Claude 1734b077af Prepare v1.76.0-beta.5
Package the reviewed sun-ray occlusion, room-colour inheritance and HA Companion day-cycle compositor fixes with synchronized release metadata; the hidden 2.5D refinement rides along internally.

Release: v1.76.0-beta.5
Issue: #580
Issue: #581
Issue: #582
Issue: #583
User-Visible: yes
2026-09-16 10:25:10 +03:00
claude[bot] 632e3969f5 docs: review document for #583
Проверка (CI) / Смоки в браузере (шард 1 из 3) (push) Skipped
Проверка (CI) / Смоки в браузере (шард 3 из 3) (push) Skipped
Проверка (CI) / Смоки: все шарды зелёные (push) Skipped
Проверка (CI) / Golden-кадры против принятых эталонов (push) Skipped
Проверка (CI) / Перф-смок: бюджет времени кадра (push) Skipped
Проверка (CI) / Геометрия: TS/Python parity исполнена (push) Skipped
Проверка (CI) / Бэкенд: pytest в Home Assistant (push) Skipped
Проверка (CI) / Предполёт: документация, провенанс, процесс (push) Failing after 46s
Проверка (CI) / Классификация изменённых файлов (push) Successful in 40s
Проверка (CI) / HACS: валидация репозитория (push) Skipped
Проверка (CI) / Hassfest: манифест интеграции (push) Skipped
Проверка (CI) / Мутанты по диффу (1/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (2/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (3/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (4/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (5/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (6/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Фронтенд: типы, юниты, мутанты, синхрон бандла (push) Skipped
Проверка (CI) / Переиспользование: это дерево уже проверено (push) Failing after 1m7s
Проверка (CI) / Смоки в браузере (шард 2 из 3) (push) Skipped
Проверка (CI) / Доказательство выполненных проверок (push) Failing after 24s
Issue: #583
User-Visible: no
2026-09-16 07:08:33 +00:00
Sergey Matyunin 85a5c7387e test: repair isometric golden host-face contract (#583)
Issue: #583
User-Visible: no
2026-09-16 09:29:25 +03:00
claude[bot] 8ae551167c docs: review document for #583
Issue: #583
User-Visible: no
2026-09-16 06:01:12 +00:00
Sergey Matyunin e2801e4e8b test: align isometric smoke with physical host faces (#583)
Issue: #583
User-Visible: no
2026-09-16 08:28:48 +03:00
Sergey Matyunin 5cae93501c fix: refine hidden 2.5D presentation (#583)
Issue: #583
User-Visible: no
2026-09-16 02:57:47 +03:00
claude[bot] ec2b3f3274 docs: review document for #583
Issue: #583
User-Visible: no
2026-09-15 18:18:06 +00:00
claude[bot] 5867ee02b6 docs: review document for #582
Проверка (CI) / Мутанты по диффу (4/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (5/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (6/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / HACS: валидация репозитория (push) Failing after 46s
Проверка (CI) / Hassfest: манифест интеграции (push) Failing after 59s
Проверка (CI) / Предполёт: документация, провенанс, процесс (push) Failing after 1m34s
Проверка (CI) / Переиспользование: это дерево уже проверено (push) Successful in 1m22s
Проверка (CI) / Геометрия: TS/Python parity исполнена (push) Successful in 3m28s
Проверка (CI) / Фронтенд: типы, юниты, мутанты, синхрон бандла (push) Failing after 9m8s
Проверка (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 6m3s
Проверка (CI) / Доказательство выполненных проверок (push) Failing after 16s
Проверка (CI) / Классификация изменённых файлов (push) Successful in 33s
Проверка (CI) / Мутанты по диффу (1/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (2/6): затронутые свидетели краснеют (push) Skipped
Проверка (CI) / Мутанты по диффу (3/6): затронутые свидетели краснеют (push) Skipped
Issue: #582
User-Visible: no
2026-09-15 11:10:06 +00:00
Sergey Matyunin 54dc836dee fix: закрыть compositor-пути day-cycle (#582)
Issue: #582
User-Visible: no
2026-09-15 13:41:51 +03:00
claude[bot] a0a108cf13 docs: review document for #582
Issue: #582
User-Visible: no
2026-09-15 10:25:24 +00:00