From b2024c6626713a8e04041651e442206b8d02354d Mon Sep 17 00:00:00 2001 From: Matysh Date: Fri, 21 Aug 2026 14:38:48 +0300 Subject: [PATCH] docs(spec): state that i18n is untouched, name the zero case MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The spec review found the i18n section missing outright — the analysis comment claimed it was untouched, the document itself said nothing, and a DoR section cannot be inferred from a comment. It now says so explicitly, and adds that the absence of i18n files from the diff is part of the contract rather than an accident. The waived Low is closed too: the old wallChainSegments treated a recorded zero as valid while the new contract requires strictly positive values, so zero is now named in the AC1 examples instead of being derivable from the prose. Issue: #234 User-Visible: no --- docs/specs/234-chain-segment-thickness.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) 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 |