docs: spec #329 revision 2 — per-surface refusal channels, AC5 split, absolute thresholds

Issue: #329
User-Visible: no
This commit is contained in:
Codex
2026-08-27 19:39:50 +03:00
parent 9f7d1fd4f0
commit 783c04d181
+29 -9
View File
@@ -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-сцена + пиксельная проверка смоком (нет разрывов
тела выше фаски).