Files
houseplan-card/docs/specs
Codex f514fb27fe feat: junction limits refuse the write in every editing surface (#329)
П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-27 23:31:42 +03:00
..
2026-08-09 21:51:33 +03:00
2026-08-09 21:51:33 +03:00
2026-08-09 21:51:33 +03:00
2026-08-09 21:51:33 +03:00
2026-08-09 21:51:33 +03:00

Спецификации задач

Актуально на 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.