docs(spec): add resize user contract

Issue: #298
User-Visible: no
This commit is contained in:
Sergey Matyunin
2026-08-24 22:02:46 +03:00
parent 8221ad9b84
commit 55db16df6e
@@ -13,7 +13,19 @@
- **Связано:** #253, #277, #289, #291, #293, #297,
`docs/RESIZE.md`, `docs/WALL-THICKNESS.md`, `docs/CANVAS.md`
## 1. Сценарий и подтверждённая причина
## 1. Персона, поверхность, момент и видимый результат
Персона — администратор дома. Поверхность — desktop Plan editor, инструмент
Resize; момент — обычный ресайз стены готового плана. Повреждение копится
незаметно и может проявиться лишь через несколько следующих правок или дней.
**До:** после серии обычных ресайзов случайная стена в другом месте плана вдруг
рисуется другой толщиной или теряет рабочую ручку, хотя её никто не трогал.
**После:** ресайз либо проходит внешне как раньше, либо в редком неоднозначном
случае заканчивается прежним сообщением об ошибке без изменения плана, но
никогда не портит другую стену.
### Подтверждённая причина
Пользователь безопасно сдвигает одну стену комнаты. Moving wall едет
параллельно себе, а две соседние стены меняют длину. После жеста визуально всё
@@ -147,6 +159,12 @@ handle disabled до pointer capture. Непредсказуемый runtime rej
уже существующее сообщение `resize.commit_failed`; новый persisted reason или
новый UX в этой задаче не вводится.
### UX и i18n
Новых контролов, состояний и текстов нет. Enabled/disabled handle, toast и
доступные имена сохраняют существующий контракт #277/#293; новых RU/EN ключей
не добавляется. Меняется только атомарность данных за прежним жестом.
## 6. Scope
### Входит
@@ -223,6 +241,9 @@ midpoint на продолжении за пределами edge; endpoint на
настоящая off-grid coordinate дальше `LATTICE_NOISE_STEPS`; conflicting shared
destinations. Каждый negative candidate отклоняется до сохранения.
**Доказательство:** table-driven unit pure carrier preflight плюс integration
test отказа candidate builder до мутации preview/config.
### AC6. Шесть edit-walk запусков больше не несут этот долг
Проходят:
@@ -248,6 +269,9 @@ Valid pointer drag показывает exact candidate до release, затем
rooms/walls/open spans; Redo возвращает тот же exact candidate. Forced carrier
failure даёт ноль writes/history и существующую локализованную ошибку один раз.
**Доказательство:** production-bundle pointer smoke с чтением DOM preview,
persisted config и history до release, после commit, Undo/Redo и forced reject.
### AC8. Мутационный страж
Mutation возвращает proportional `t` mapping для interior endpoint либо