diff --git a/docs/specs/445-furniture-wall-face-snap.md b/docs/specs/445-furniture-wall-face-snap.md index 6c191fb7..95d03a54 100644 --- a/docs/specs/445-furniture-wall-face-snap.md +++ b/docs/specs/445-furniture-wall-face-snap.md @@ -305,12 +305,25 @@ exact-SHA Validate. Для `src/**` обновляется canonical docs source Backend pytest и model-invariants неприменимы, если реализация не меняет Python или сохранённую геометрию стен. +### AC10. Выбор стены в углу детерминирован + +Unit fixture с двумя неколлинеарными поверхностями одного угла проверяет три +ветки выбора: при разных расстояниях выигрывает физически ближайшая поверхность; +при равном расстоянии сторона точки намерения учитывается раньше стабильного +tie-break; при полном равенстве перестановка входного массива не меняет выбранную +поверхность и конечные `x/y/angle`. Mutation, возвращающая прежний выбор первого +минимума из массива либо меняющая местами intent-критерий и стабильный tie-break, +обязана сделать соответствующий witness красным. + ## План тестирования - заменить центролинейные expectations секции wall magnet в `test/furniture.test.mjs` typed wall-face fixtures с 0/10/20 см; - добавить pure tests внешней/общей стены, intent point, exact-axis tie, permutation/winding, local thickness, threshold и independent faces; +- добавить отдельный AC10 unit для двух неколлинеарных стен в углу: ближайшая + поверхность, приоритет стороны намерения и инвариантность к порядку массива + при точном равенстве; - расширить `demo/smoke_furniture.mjs` production-bundle сценарием preview → commit → drag у толстой стены и touch safety; - зарегистрировать дорогие отрицательные варианты в @@ -374,4 +387,3 @@ Backend pytest и model-invariants неприменимы, если реализ - Нулевые стены и физические грани независимых тел сохраняют прежнее поведение. - Проёмы не участвуют в collision model этой задачи. - `Shift`, persisted schema, i18n и уже сохранённая мебель не меняются. -