diff --git a/docs/specs/234-chain-segment-thickness.md b/docs/specs/234-chain-segment-thickness.md index 7f451c81..cdc80348 100644 --- a/docs/specs/234-chain-segment-thickness.md +++ b/docs/specs/234-chain-segment-thickness.md @@ -153,7 +153,7 @@ Plan-редактор (десктоп, мышь): рисование цепоч поддерживается сегодня и этой задачей не вводится; safety floor `docs/TOUCH-SUPPORT.md` соблюдён по построению, поведение на тач не меняется. -## 9. Изменяемые файлы +## 9. Изменяемые файлы и i18n - `src/wall-face-graph.ts` — новая `chainSegmentCms`, `wallChainSegments` без собственного fallback; @@ -165,13 +165,21 @@ Plan-редактор (десктоп, мышь): рисование цепоч - `scripts/mutation-gate.mjs` — три записи (§11); - `docs/CHANGELOG.md`, `docs/CHANGELOG.ru.md`. -Миграции и compatibility-полей нет: формат не меняется (§4.3). +**i18n: не затронут.** Ни одной новой пользовательской строки не добавляется и +ни одна существующая не меняется: задача исправляет значение, которое пишется в +конфиг, а не текст интерфейса. Файлы `src/i18n/en.json` и `src/i18n/ru.json` в +диффе отсутствуют, и их отсутствие — часть контракта: появление там правок +означало бы, что скоуп разъехался. + +**Миграции и compatibility-полей нет:** формат не меняется (§4.3), поля +`partitions[].cm` и `room_drafts[].segments[].cm` сохраняют тип и смысл, +`docs/CONFIG-COMPATIBILITY.md` править не требуется. ## 10. Acceptance criteria | AC | Требование | Доказательство | |---|---|---| -| AC1 | `chainSegmentCms` возвращает массив длины `segmentCount`, все элементы `> 0`, для любых входов, включая пустой `recorded`, дырки в середине, мусор (`NaN`, `-5`, `null`) | unit | +| AC1 | `chainSegmentCms` возвращает массив длины `segmentCount`, все элементы `> 0`, для любых входов, включая пустой `recorded`, дырки в середине, мусор (`NaN`, `-5`, `null`) и **явный `0`** — прежняя `wallChainSegments` считала ноль валидным, контракт §6 сдвигает границу на `> 0`, и это должно быть закреплено примером, а не выводиться из текста | unit | | AC2 | Отсутствующая запись наследует предыдущий валидный отрезок; при отсутствии предыдущего — `activeCm`; при отсутствии и его — `defaultCm` | unit | | AC3 | Превью и запись дают **идентичный** вектор толщин на одних входных данных — проверяется через общую функцию, а не сравнением двух формул | unit | | AC4 | Незамкнутая цепочка из трёх отрезков, нарисованных 30 см при пропуске записи последнего, сохраняется как `30, 30, 30`, а не `30, 30, 15` | unit + smoke |