П3 measures the WALL, not the catalogue atom: a short filler segment that compensates a thickness step (owner's fixture, 5 cm = (30-20)/2) is a legal continuation of a long same-thickness wall, so the rule walks the maximal collinear run through the shared nodes before judging the length. Resize stops at the last allowed position and names the broken rule instead of the generic "geometry cannot be saved"; the Thickness dialog refuses through its own toast. Both channels are pinned by demo/smoke_junction_limits plus three mutants (angle threshold, write barrier, degenerate apex bevel). Issue: #329 User-Visible: yes
Спецификации задач
Актуально на 2026-08-25.
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 |
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 |
| #75 + #76 Единый поток размещения проёмов | 075-076-opening-placement-flow.md |
| #84 Источник «Всегда» без сущности HA + #88 ведущая сущность | 084-passive-forced-light-sources.md |
| #90 Управляемый бейдж со значением | 090-device-value-badge.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 |
| #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 |
| #294 Esc завершает текущую цепочку стен без удаления геометрии | 294-wall-esc-detach.md |
P3
| Issue | ТЗ |
|---|---|
| #198 Optimize очищает изолированный микро-интервал толщины | 198-optimize-micro-interval.md |
| #103 Состояния в Toggle confirmation | 103-toggle-confirmation-state.md |
| #200 Одинаковая геометрия подписи комнаты в View и Plan editor | 200-room-label-parity.md |
P3
| Issue | ТЗ |
|---|---|
| #57 Единый выбор цвета и прозрачности | 057-color-opacity-picker.md |
| #180 Единый picker во всех местах выбора цвета | 180-all-color-call-sites.md |
Правило актуализации
При изменении продуктового решения сначала обновляется соответствующее issue, затем ТЗ. Реализация не считается завершённой только по наличию кода: нужны выполненные acceptance criteria, предусмотренная ТЗ проверка и актуальный статус Project v2.