mirror of
https://github.com/Matysh/houseplan-card
synced 2026-10-02 21:01:21 +00:00
committed by
claude[bot]
parent
38e6869c90
commit
62f398d359
@@ -103,15 +103,19 @@ Optimize сообщает, что изменений нет.
|
||||
## 7. UX, запись и Undo
|
||||
|
||||
Preview остаётся существующим диалогом. В строку обслуживания добавляется
|
||||
отдельный показатель:
|
||||
отдельный показатель, а существующий счётчик `canonicalized` получает
|
||||
однозначное название по своей единице измерения:
|
||||
|
||||
- RU: «канонизировано координат: {p}»;
|
||||
- EN: «coordinates canonicalized: {p}».
|
||||
- RU: «нормализовано пространств: {c}; устранён шум координат: {p}»;
|
||||
- EN: «spaces normalized: {c}; noisy coordinate values removed: {p}».
|
||||
|
||||
Показатель выводится в общей строке всегда, включая ноль, так же как действующие
|
||||
счётчики миграций/планов/стен/виртуальных фрагментов. При единственном изменении
|
||||
из-за ULP-шума диалог не показывает «изменений нет»: он показывает нулевой
|
||||
видимый сдвиг и положительный `coordsCanonicalized`.
|
||||
`c` по-прежнему означает число пространств, где переписано представление
|
||||
`open_spans`/`open_to`/`walls`; `p` означает число отдельных coordinate values
|
||||
по §6. Два разных показателя не используют один термин «канонизировано» в одном
|
||||
предложении. Оба выводятся в общей строке всегда, включая ноль, так же как
|
||||
действующие счётчики миграций/стен/виртуальных фрагментов. При единственном
|
||||
изменении из-за ULP-шума диалог не показывает «изменений нет»: он показывает
|
||||
нулевой видимый сдвиг и положительный `coordsCanonicalized`.
|
||||
|
||||
Итоговый toast использует новый показатель в сумме обслуженных записей, поэтому
|
||||
после Apply не сообщает `0` обслуженных записей. Cancel не пишет candidate.
|
||||
@@ -141,9 +145,9 @@ entries и файлы сохраняются. Входные `config` и `layout
|
||||
| AC1 | Для канонического узла с добавленным/вычтенным ULP `snapN()` возвращает ближайший вычисленный узел точно, а не исходный шум. | Focused `align-grid` unit; mutant `snapn-returns-input-near-node`. |
|
||||
| AC2 | Значение дальше `EPS` продолжает выравниваться как раньше; не конечные числа сохраняют прежний результат. | Boundary unit matrix. |
|
||||
| AC3 | Воспроизводимый fixture из шести комнат после Optimize имеет точно совпадающие общие вершины, `changed: true`, `moved: 0`, `coordsCanonicalized > 0`; union/downstream geometry успешно строится. | `plan-optimizer` regression unit на fixture из #223/#218. |
|
||||
| AC4 | Счётчик считает отдельные компоненты только при разнице `<= EPS`, не дублирует заметно перемещённые элементы и не увеличивает `maxShift*`. | Units для room poly, rect/decor/layout и off-grid negative case. |
|
||||
| AC4 | Счётчик считает отдельные компоненты только при разнице `<= EPS`, не дублирует заметно перемещённые элементы и не увеличивает `maxShift*`. Принятая партиция и `wall_column` учитываются; у партиции с `hostedFit = false` вычисленный, но не записанный snap не учитывается и noisy endpoints сохраняются. | Units для room poly, rect/decor/layout, применённой и отклонённой partition, wall column и off-grid negative case. |
|
||||
| AC5 | Второй запуск над candidate возвращает `changed: false`, `coordsCanonicalized: 0` и побитово/глубоко тот же JSON. | Idempotence unit. |
|
||||
| AC6 | RU/EN preview показывает новый счётчик; случай `moved=0` не превращается в «нет изменений»; итоговый toast учитывает канонизированные координаты. | i18n/UI unit + targeted production-bundle browser smoke. |
|
||||
| AC6 | RU/EN preview разными терминами показывает «нормализованные пространства» (`canonicalized`) и «устранённый шум координат» (`coordsCanonicalized`); случай `moved=0` не превращается в «нет изменений»; итоговый toast учитывает очищенные координаты. | i18n/UI unit + targeted production-bundle browser smoke. |
|
||||
| AC7 | Preview не мутирует входы; Cancel ничего не пишет; Apply сохраняет exact candidate; Undo восстанавливает исходные noisy-координаты и неизвестные поля. | Optimizer immutability unit + targeted browser/backend smoke. |
|
||||
| AC8 | Обычные read/render/Save без явного Optimize не переписывают persisted config; устойчивость #218 остаётся зелёной. | Existing regression suite + focused negative unit. |
|
||||
| AC9 | Документация описывает явную exact-канонизацию и значение нового счётчика; три bundle-копии синхронны. | Docs check, bundle parity check. |
|
||||
@@ -151,9 +155,13 @@ entries и файлы сохраняются. Входные `config` и `layout
|
||||
|
||||
## 10. План реализации и тестов
|
||||
|
||||
В `alignAllToGrid()` вводится локальная tracked-обёртка над чистым `snapN()`.
|
||||
Она считает только успешные near-node записи по контракту §6; все существующие
|
||||
grid-bound call sites используют её вместо прямого вызова. Такой счётчик
|
||||
В `alignAllToGrid()` вводится локальный tracked-механизм над чистым `snapN()`.
|
||||
Он возвращает snapped value и признак near-node replacement отдельно, а вклад в
|
||||
`coordsCanonicalized` подтверждается только в месте фактической записи значения
|
||||
в candidate. В частности, `partitions` добавляет вклад четырёх endpoints лишь в
|
||||
ветке `snappedLength > EPS && hostedFit`; отклонённая ветка оставляет и координаты,
|
||||
и счётчик без изменения. `wall_columns` и остальные безусловно записываемые
|
||||
grid-bound call sites подтверждают вклад сразу после присваивания. Счётчик
|
||||
остаётся контекстом одного maintenance-pass и не добавляет глобального состояния
|
||||
в базовый helper.
|
||||
|
||||
@@ -175,6 +183,8 @@ tracked increment. Чистая ветка зелёная, мутант обяз
|
||||
| Риск | Мера |
|
||||
|---|---|
|
||||
| Счётчик вводит пользователя в заблуждение как число объектов | Точное название «координат» и семантика отдельных компонент в §6. |
|
||||
| Два разных счётчика выглядят одной категорией канонизации | «Нормализовано пространств» и «устранён шум координат» явно называют разные единицы и действия. |
|
||||
| Отклонённый snap партиции попадает в отчёт | Вклад подтверждается только после фактической записи; отдельный `hostedFit=false` unit. |
|
||||
| Near-node rewrite ошибочно считается физическим сдвигом | Раздельные counters; `moved` и `maxShift*` не растут при `<= EPS`. |
|
||||
| Идемпотентность нарушается из-за недвоичного шага сетки | Результат определяется тем же выражением узла; exact second-run unit для всех call sites. |
|
||||
| Часть координат остаётся noisy | Все grid-bound вызовы `snapN()` в batch переводятся на tracked wrapper; реальный fixture. |
|
||||
@@ -209,9 +219,11 @@ security artifact не нужны. Rollback — revert implementation-комми
|
||||
именно это даёт детерминированный отчёт для polygon и box call sites.
|
||||
2. Near-node означает `abs(s - v) <= EPS`; граница включительна и не меняет
|
||||
действующую константу tolerance.
|
||||
3. Новый счётчик включается в существующее число «обслужено записей» итогового
|
||||
3. Существующий `canonicalized` переименовывается только в пользовательском
|
||||
тексте: структура и семантика report field не меняются.
|
||||
4. Новый счётчик включается в существующее число «обслужено записей» итогового
|
||||
toast, хотя единица там исторически агрегирует разные виды обслуживания.
|
||||
4. Точное имя targeted smoke и размещение tracked wrapper являются техническим
|
||||
5. Точное имя targeted smoke и размещение tracked-механизма являются техническим
|
||||
решением, если AC и explicit-Optimize boundary сохраняются.
|
||||
5. Продуктовых вопросов нет; эти предположения технические и могут быть свободно
|
||||
6. Продуктовых вопросов нет; эти предположения технические и могут быть свободно
|
||||
скорректированы на ревью без дополнительного решения владельца.
|
||||
|
||||
Reference in New Issue
Block a user