Three findings of the v1.70.0-beta.1 audit, all on the transition path added by #82, all of the same shape — the new path did not inherit a property the old one had. B1: persisting the zoom moved into _settleCameraTransition only, and a cancellation never settles. Touching the plan mid-flight — the literal scenario of the issue — froze the shown frame and threw it away; before which kind it is: the user one (_stagePointerDown) persists the frame that stays on screen, the eleven structural ones keep writing nothing. The distinction is now also written down in spec #82 §13, which had one line for both. B2: the anchor was read from the presented (lagging) frame while the zoom accumulated from the target, so a six-notch trackpad series walked the point under the cursor 17 px away — against §10's own promise. Both now come from the same state. Spec §10 said to use the presented frame and to keep the anchor within 0.5 px; those two are incompatible, and the paragraph is corrected rather than left as a trap. M2: the feather freeze keyed on the two gesture flags, which an animated transition does not set, so every tween frame rebuilt the blur region. It keys on 'the camera is still' now. Guards: unit tests pin the anchor at 1e-9 across 8/16/33 ms series and prove zoom accumulation is untouched; the smoke checks the shown zoom is the stored one, that a structural cancellation stores nothing, and that the anchor holds; three mutants (cancel-loses-zoom, anchor-from- presented, feather-thaws) were run by hand and each reddens. User-Visible: yes Issue: #396
Спецификации задач
Актуально на 2026-08-30.
GitHub Issues и GitHub Projects (v2) остаются единственным каноническим backlog проекта. Этот каталог содержит развёрнутые ТЗ: каждое ТЗ ссылается на issue, а issue — на соответствующий файл. Статус, приоритет и факт завершения меняются только в GitHub.
Статусы ТЗ:
- готово к реализации — продуктовые решения зафиксированы, остаётся техническая работа;
- черновик решения — в ТЗ дана рекомендация, но перед реализацией требуется принять отмеченные продуктовые решения;
- в реализации — работа уже ведётся в рамках текущего этапа;
- реализовано — ТЗ сохранено как проверяемый acceptance contract.
Обязательные release-артефакты номерного ТЗ
Если задача меняет пользовательское поведение, её ТЗ обязано явно перечислить:
- записи в
docs/CHANGELOG.mdиdocs/CHANGELOG.ru.md; - затронутую пользовательскую документацию;
- требуемые screenshots/golden и способ их review, если меняется визуал;
- release/performance/security artifacts, если они входят в acceptance gate.
Отсутствие этого раздела не означает, что документация необязательна. Для чистого refactoring ТЗ должно прямо зафиксировать отсутствие пользовательских изменений и перечислить технические доказательства безопасного поведения.
P1
| Issue | ТЗ |
|---|---|
| #6 Vacuum XCME path segments | 006-vacuum-xcme-path.md |
| #7 Valetudo room outlines | 007-vacuum-valetudo-room-outlines.md |
| #8 Vacuum support docs and XCME hint | 008-vacuum-support-docs-xcme-hint.md |
| #27 External vacuum source picker | 027-vacuum-external-source-picker.md |
| #28 Room View card | 028-room-view-card.md |
| #29 Device inbox lifecycle | 029-device-inbox-lifecycle.md |
| #30 Dialog information architecture | 030-dialog-information-architecture.md |
| #31 View accessibility | 031-view-accessibility.md |
| #32 Unified danger confirmation | 032-unified-danger-confirmation.md |
| #33 Config schema lifecycle | 033-config-schema-lifecycle.md |
| #34 Frontend decomposition | 034-frontend-decomposition.md |
| #35 Current UX documentation | 035-current-ux-docs.md |
| #50 Экспорт и импорт конфигурации | 050-config-export-import.md |
| #58 Vacuum integration coverage — Stage 1 | 058-vacuum-stage1.md |
| #89 Опциональный объёмный 2.5D/изометрический вид | 089-isometric-view.md |
| #89 Этап 1: объёмный вид за флагом Labs | 089-isometric-view-stage1.md |
| #98 Единая система пульсаций и активностей устройства | 098-device-pulse-system.md |
| #131 Полный первый кадр View у read-only-пользователя | 131-readonly-cold-start.md |
| #138 Автозамыкание комнаты по существующей стене | 138-adjacent-room-autoclose.md |
| #146 Четырёхфазный фон «Следует за Солнцем» | 146-four-phase-sun-background.md |
| #156 Регрессии Full Performance перед v1.64.0 stable | 156-full-performance-regressions.md |
| #164 Активный цикл стиральной машины должен быть жёлтым | 164-washer-active-cycle.md |
| #166 Солнечные лучи зеркально учитывают направление севера | 166-sun-north-rotation.md |
| #167 Экспорт «только планировка» | 167-plan-only-export.md |
| #170 HA-устройство не привязывается к комнате без HA-зоны | 170-room-without-area.md |
| #179 Новый визуальный язык маркеров устройств | 179-device-icons-redesign.md |
| #199 Geometry preflight перед записью Optimize | 199-optimize-geometry-preflight.md |
| #210 Фиксированное пространство экземпляра карточки | 210-fixed-floor-card.md |
| #211 Визуальное соответствие маркеров дизайн-пакету #179 | 211-device-icons-visual-parity.md |
| #217 Внешняя рамка Text-маркера должна быть капсулой | 217-text-shell-outline.md |
| #218 Floating-point шум комнаты не гасит Glow пространства | 218-glow-floor-geometry.md |
| #219 Единая палитра замков и glyph на оранжевых подложках | 219-lock-orange-palette.md |
| #205 Продолжение следа после короткой остановки пылесоса | 205-vacuum-trail-resume-grace.md |
| #220 Порядок пространств перетаскиванием вкладок | 220-space-tab-reorder.md |
| #229 Сращивание коллинеарных отрезков стен | 229-merge-collinear-partitions.md |
| #226 Entity-marker не дублируется родительским HA-устройством | 226-entity-parent-dedup.md |
| #223 Optimize канонизирует координаты без floating-point шума | 223-optimize-coordinate-canonicalization.md |
| #224 Канонические координаты на каждой записи | 224-config-coordinate-canonicalization.md |
| #228 Надёжное рисование стен и операции с готовым контуром | 228-plan-drawing-problems.md |
| #239 Масштаб сетки не меняет внешний вид плана; default 1 см/1 дюйм | 239-grid-scale-invariance.md |
| #231 Декоративный слой виден поверх заливок комнат | 231-decor-layer-order.md |
| #243 Рабочее перетаскивание вкладок и точный указатель вставки | 243-space-tab-drop-target.md |
| #276 Совпадающая partition становится одной общей стеной | 276-coincident-partition-reconciliation.md |
| #277 Безопасный Resize без изменения топологии | 277-safe-resize.md |
| #278 Локальный сбой extra-body union не гасит всю кладку | 278-wall-union-isolation.md |
| #279 Сплошной почти ортогональный T-стык | 279-near-orthogonal-junction.md |
| #280 Backend принимает доказанный Optimize rehost | 280-optimize-rehost-validation.md |
| #281 Честный Resize после outer-partition reconciliation | 281-resize-zero-range.md |
| #293 Активная рукоятка Resize выполняет pointer-жест | 293-resize-pointer-noop.md |
| #296 Optimize удаляет доказанно избыточные скрытые стены | 296-optimize-hidden-obstacles.md |
| #298 Resize сохраняет wall records на решётке и на carrier | 298-resize-wall-thickness-carrier.md |
| #299 Записи толщины не пересекают границу роли стены | 299-mixed-role-wall-records.md |
| #314 Атомарная запись v8 drafts и независимой геометрии | 314-v8-draft-write-regression.md |
| #306 Нулевые стены вместо виртуальных границ | 306-zero-thickness-walls.md |
| #348 Полная немецкая локализация | 348-german-localization.md |
P2
| Issue | ТЗ |
|---|---|
| #10 Roomba live position | 010-vacuum-roomba-live-position.md |
| #11 Vacuum source health | 011-vacuum-source-health.md |
| #12 Room cleaning highlight | 012-vacuum-room-cleaning-highlight.md |
| #13 Golden open context tray | 013-golden-open-context-tray.md |
| #19 Additive Glow blending | 019-glow-additive-blending.md |
| #20 Glow through open doors | 020-glow-open-door-spill.md |
| #21 Safe color CSS variables | 021-color-css-injection.md |
| #36 Room Glow override | 036-room-glow-override.md |
| #37 Room scale system | 037-room-scale-system.md |
| #38 Icon rule builder | 038-icon-rule-builder.md |
| #39 Large backdrops | 039-large-backdrops.md |
| #40 Floors/Areas onboarding | 040-floor-area-onboarding.md |
| #41 Keyboard object editing | 041-keyboard-object-editing.md |
| #42 Backend engineering quality | 042-backend-engineering-quality.md |
| #43 Private support report | 043-private-support-report.md |
| #44 Filtering/grouping policy | 044-filter-grouping-policy.md |
| #51 Custom decor images | 051-custom-decor-images.md |
| #52 Dimensions in View | 052-view-dimensions.md |
| #54 Zigbee topology overlay | 054-zigbee-topology-overlay.md |
| #55 Independent Glow overlay | 055-independent-glow-overlay.md |
| #56 Static room color | 056-static-room-color.md |
| #68 Подсказки к настройкам | 068-help-affordance.md |
| #74 Position-only Undo/Redo устройств | 074-device-position-undo.md |
| #75 + #76 Единый поток размещения проёмов | 075-076-opening-placement-flow.md |
| #82 Плавное масштабирование zoom/fit/reset | 082-smooth-zoom.md |
| #84 Источник «Всегда» без сущности HA + #88 ведущая сущность | 084-passive-forced-light-sources.md |
| #86 Подсказки к настройкам, партия 1 | 086-settings-help-content-party1.md |
| #90 Управляемый бейдж со значением | 090-device-value-badge.md |
| #378 Выбираемый источник для режима «Значение + состояние» | 378-value-face-source.md |
| #381 Действие по нажатию «Ничего не делать» | 381-no-op-tap-action.md |
| #383 Плавные трансформации и зеркалирование мебели | 383-furniture-transform.md |
| #94 Универсальное действие «Переключить состояние» | 094-universal-state-toggle.md |
| #101 Плавный переход View ↔ редакторы | 101-view-editor-transition.md |
| #107 Переключение виртуального источника света «Всегда» | 107-virtual-light-toggle.md |
| #113 Optional-контракт SpaceModel | 113-optional-space-model.md |
| #117 Registry-less entity у проёма | 117-registryless-opening-entity.md |
| #122 Изометрический режим Stage 2: скрытый режим и визуальная полировка | 122-isometric-stage2.md |
| #123 Split из вершины не меняет наружную геометрию стен | 123-corner-split-wall.md |
| #132 Проёмы в независимых стенах (+ bug #185) | 132-partition-openings.md |
| #137 Узлы и линии привязки в редакторе Плана | 137-plan-snap-overlay.md |
| #141 Бесшовные стыки перегородок и открытых контуров | 141-wall-junctions.md |
| #159 Новый набор мебели и двухуровневая библиотека | 159-furniture-pack.md |
| #361 Физическая толщина линий мебели при camera zoom | 361-furniture-stroke-zoom.md |
| #157 Тип проёма «Открытый проём» | 157-open-passage.md |
| #150 Точная геометрия коллинеарного перепада толщины | 150-wall-thickness-transition.md |
| #172 Нулевой Split-разделитель не получает ложную толщину | 172-zero-divider-taper.md |
| #173 Единый инструмент рисования стен и предложение комнаты по замыканию | 173-unified-wall-tool.md |
| #174 Связанный виртуальный источник следует реальному контроллеру | 174-linked-virtual-light-controller.md |
| #178 Выбор сущности для действия «Переключить состояние» | 178-toggle-entity.md |
| #197 Один junction-патч не гасит кладку всего плана | 197-junction-patch-fail-dark.md |
| #204 Честные defaults границ и имён при создании пространства | 204-space-create-display-defaults.md |
| #201 Наследование толщины для атомарного участка стены | 201-atomic-thickness-lookup.md |
| #203 Выключение названий скрывает все подписи комнат | 203-hide-room-names.md |
| #186 Безопасный остаток стены у торцов партиционного проёма | 186-partition-opening-jamb-margin.md |
| #234 Толщина отрезка цепочки не расходится между превью и записью | 234-chain-segment-thickness.md |
| #233 Ресайз показывает внутренние размеры, а не осевые | 233-resize-inner-dimensions.md |
| #300 Понятные подписи и измеряемые стены во время Resize | 300-resize-measurement-layout.md |
| #238 Размеры проёма до внутренних физических границ | 238-opening-inner-distances.md |
| #242 Символ проёма по центру толщины стены | 242-opening-symbol-center.md |
| #244 Восстановление маркеров с мёртвой ссылкой на пространство | 244-orphan-space-references.md |
| #248 Идемпотентный Optimize после записи и reload | 248-optimize-idempotence.md |
| #251 Доступность контроллера не наследуется от управляемой цели | 251-controller-target-availability.md |
| #252 Понятная и безопасная очистка забытых позиций в Optimize | 252-optimize-orphan-layout-report.md |
| #253 Resize не теряет интервалы толщины стен | 253-resize-wall-thickness.md |
| #258 Канонический wall key после Optimize и storage round-trip | 258-wall-key-storage-roundtrip.md |
| #262 Повторное добавление entity после удаления родительского устройства | 262-readd-child-entity-after-device-delete.md |
| #265 Единый контракт ссылочного шва импорта | 265-import-reference-seam.md |
| #267 Таблица решений для «лица» маркера | 267-device-presentation-decision-table.md |
| #274 Беспроводной контроллер одинаково выглядит на плане и в preview | 274-wireless-controller-presentation-parity.md |
| #317 Климат комнаты следует размещению датчика в House Plan | 317-room-climate-placement.md |
#318 Активный контроллер без собственных сущностей следует controls |
318-empty-controller-roster.md |
| #373 Плотное кадрирование static card по геометрии дома | 373-space-card-house-fit.md |
| #294 Esc завершает текущую цепочку стен без удаления геометрии | 294-wall-esc-detach.md |
P3
| Issue | ТЗ |
|---|---|
| #209 Плавный след пылесоса | 209-vacuum-trail-smoothing.md |
| #198 Optimize очищает изолированный микро-интервал толщины | 198-optimize-micro-interval.md |
| #103 Состояния в Toggle confirmation | 103-toggle-confirmation-state.md |
| #200 Одинаковая геометрия подписи комнаты в View и Plan editor | 200-room-label-parity.md |
| #340 Обязательная ревизия повторной записи config/set | 340-config-set-revision.md |
| #372 Компактное верхнее кадрирование static card без заголовка | 372-space-card-empty-title.md |
P3
| Issue | ТЗ |
|---|---|
| #57 Единый выбор цвета и прозрачности | 057-color-opacity-picker.md |
| #180 Единый picker во всех местах выбора цвета | 180-all-color-call-sites.md |
P3
| Issue | ТЗ |
|---|---|
| #62 Масштабируемая i18n-инфраструктура | 062-i18n-registry.md |
Правило актуализации
При изменении продуктового решения сначала обновляется соответствующее issue, затем ТЗ. Реализация не считается завершённой только по наличию кода: нужны выполненные acceptance criteria, предусмотренная ТЗ проверка и актуальный статус Project v2.