diff --git a/docs/specs/329-junction-limits.md b/docs/specs/329-junction-limits.md index dcafffba..2c62daa2 100644 --- a/docs/specs/329-junction-limits.md +++ b/docs/specs/329-junction-limits.md @@ -1,6 +1,6 @@ # Issue #329 — ограничения стыков стен и честная острая вершина -Статус: ревизия 1. Решения владельца (чат, 2026-08-27, зафиксированы в issue): +Статус: ревизия 2 (r1: M1 — каналы отказа по поверхностям, M2 — AC5 разделён, L1 — пороги абсолютные). Решения владельца (чат, 2026-08-27, зафиксированы в issue): пять ограничений приняты; проверки действуют на записи, легаси читается как есть; для остаточных острых вершин легаси-планов рендер закрывает остриё честной фаской вместо «трезубца». @@ -23,7 +23,19 @@ Все проверки выполняются над кандидатом структурной записи (фронт — в общем барьере перед записью; бэкенд — семантическая дельта-валидация §5). Нарушение -= отказ всей записи, план не изменён, тост называет конкретное правило. += отказ всей записи, план не изменён. Канал обратной связи — штатный канал +каждой поверхности (M1 spec-ревью r1): + +- **рисование/завершение контура, черновики, независимые стены, merge/ + split** — тост с конкретным правилом и значением (текущий канал отказов + рисования); +- **Resize** — существующий контракт ручек (USER-GUIDE «Изменение размеров»): + движение упирается в последнюю допустимую позицию; если безопасного шага + нет, ручка приглушена и объясняет запрет по hover/focus/нажатию — текст + объяснения называет нарушенное правило П1–П5; тост не используется; +- **инструмент «Толщина»** — отказ значением в трее по образцу существующего + отказа нуля для независимой стены (#313): значение не применяется, причина + показывается тостом с названием правила (П3/П5). - **П1. Минимальный угол:** угол между СОСЕДНИМИ по азимуту стенами одного узла ≥ **15°**. Считается по осям сегментов, для каждого узла кандидата. @@ -31,12 +43,14 @@ атомы, независимые стены и перегородки считаются вместе). - **П3. Минимальная длина сегмента:** длина ≥ **max(20 см, толщина сегмента)**. Для нулевых стен (#306) — ≥ 20 см. -- **П4. Минимальная дистанция:** несмежные узлы — не ближе **5 см** (1 - клетка); узел — не ближе 5 см к стене, которой он не принадлежит - (касание конца о середину чужой стены остаётся T-стыком и валидно — - правило про «почти-касание» без инцидентности). +- **П4. Минимальная дистанция:** несмежные узлы — не ближе **5 см**; узел — + не ближе 5 см к стене, которой он не принадлежит (касание конца о середину + чужой стены остаётся T-стыком и валидно — правило про «почти-касание» без + инцидентности). Порог абсолютный, в сантиметрах, и НЕ зависит от + `cell_cm` пространства. - **П5. Просвет комнаты:** после вычета тел стен внутренняя область комнаты - непуста и её площадь ≥ **25 см²** (1 клетка 5×5). + непуста и её площадь ≥ **25 см²**. Порог абсолютный и не зависит от + `cell_cm`. ## 3. Граница применения @@ -112,8 +126,14 @@ margin): правила П1–П5 применяются к элементам, толщине 30 см — отказ (длина < толщины). - **AC4 (П4).** Узел в 4 см от несмежного узла или чужой стены — отказ; 5 см — проходит; T-стык (конец на чужой стене) — проходит. -- **AC5 (П5).** Повторение «шпиля» из фикстуры issue рисованием — отказ по - просвету (даже если каждый угол ≥ 15°, но толщины съедают комнату). +- **AC5a (сквозной сценарий фикстуры).** Повторение «шпиля» из фикстуры + issue рисованием отклоняется первым же нарушенным правилом (П1, вершина + ≈9.9° < 15°) — сквозной смок поверх AC1. +- **AC5b (П5 независим от П1).** Равносторонний треугольник со стороной + 60 см и стенами 33 см: все углы 60° ≥ 15°, но inradius ≈ 17.3 см меньше + полутолщины 16.5 см плюс минимального просвета — внутренняя область после + вычета тел < 25 см², запись отклоняется по П5. Тот же треугольник со + стороной 120 см (inradius ≈ 34.6 см) проходит. Юнит с этими числами. - **AC6 (§4).** Легаси-фикстура issue рендерится без «трезубца»: одна фаска, ноль V-вырезов; golden-сцена + пиксельная проверка смоком (нет разрывов тела выше фаски).