docs(spec): state that i18n is untouched, name the zero case

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
This commit is contained in:
Matysh
2026-08-21 19:41:37 +03:00
committed by Sergey Matyunin
parent b7a9cc4edf
commit b2024c6626
+11 -3
View File
@@ -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 |