diff --git a/docs/specs/230-hatch-density-normalization.md b/docs/specs/230-hatch-density-normalization.md index 572bca9c..57cb41bf 100644 --- a/docs/specs/230-hatch-density-normalization.md +++ b/docs/specs/230-hatch-density-normalization.md @@ -186,12 +186,25 @@ export function wallHatchNeedsSolid(stepUnits: number, pxPerUnit: number): boole шага: в неё попадает 0–1 полоса в зависимости от фазы паттерна. Поведение сегодняшнее и остаётся; порог `solid` по толщине его прикрывает. Проверяется отдельным AC, чтобы правка не превратила такую стену в пятно. -2. **Golden.** Все golden-фикстуры используют `cell_cm: 5` - (`demo/fixtures/*.mjs`, `demo/golden/harness.mjs`) и не меняют зум, поэтому - эталоны не должны измениться ни в одном пикселе. Это проверяемое - утверждение: `golden:verify` обязан пройти без переснятия. Расхождение хоть - одной сцены — сигнал, что правка задела больше заявленного, и разбирается до - мержа. +2. **Golden.** Все фикстуры используют `cell_cm: 5` + (`demo/fixtures/*.mjs`, `demo/golden/harness.mjs`), где новая формула даёт + ровно сегодняшние 8 юнитов. Но две сцены снимают план при зуме, отличном от + единицы (`demo/golden/matrix.mjs:328-331`): + + | сцена | zoom | шаг сейчас | шаг после | + |---|---|---|---| + | `large-house-zoom-040-dark` | 0.4 | 20.0 юнитов | 8.0 | + | `large-house-zoom-250-dark` | 2.5 | 3.2 юнита | 8.0 | + + Обе изменятся — и это прямое следствие решения владельца §4.2, а не побочный + ущерб: именно ради этого зумовая компенсация и убирается. Их переснятие + входит в задачу (§13, AC11) и делается отдельным шагом с доказательством: + `npm run golden:accept -- --reviewed` после того, как расхождение осмотрено + глазами и признано ожидаемым. + + Все остальные сцены обязаны совпасть побайтно (AC10). Расхождение любой + третьей сцены — сигнал, что правка задела больше заявленного, и разбирается + до мержа. 3. **Расхождение рендереров.** Сегодня карта и статический рендерер расходятся при зуме ≠ 1; правка их сводит. Побочный эффект желателен, но должен быть зафиксирован тестом, иначе следующий рефакторинг разведёт их снова. @@ -228,14 +241,28 @@ export function wallHatchNeedsSolid(stepUnits: number, pxPerUnit: number): boole **AC9.** Стена 3 см при `cell_cm: 5` не превращается в сплошное пятно из-за нового множителя: `wallHatchNeedsSolid` для неё ложна при типичном `pxPerUnit`. -**AC10.** `golden:verify` проходит без переснятия эталонов. +**AC10.** `golden:verify` расходится ровно на двух сценах — +`large-house-zoom-040-dark` и `large-house-zoom-250-dark`. Любая третья +разошедшаяся сцена означает провал этого критерия. + +**AC11.** Обе зумовые сцены переснимаются осознанно: расхождение осмотрено, +принято `npm run golden:accept -- --reviewed`, и в отчёте на код-ревью +объяснено, что именно изменилось и почему это ожидалось. + +**AC12.** Статический рендерер (`space-render.ts`) строит паттерн по той же +функции: при `cell_cm: 25` его `width`/`height` равны `wallHatchStepUnits(25)`, +а `patternTransform` не содержит `scale`. Без этого критерия нереализованная +правка второго рендерера прошла бы незамеченной — все golden-сцены снимаются +при `cell_cm: 5`, где старая и новая формулы совпадают. ## 13. План автотестов - `test/wall-thickness.test.mjs` — AC1–AC6, AC9. -- `demo/smoke_wall_hatch_density.mjs` (новый) — AC7, AC8: разметка паттерна на - реальной карте при `cell_cm` 5 и 25 и при двух значениях зума. -- `npm run golden:verify` — AC10. +- `demo/smoke_wall_hatch_density.mjs` (новый) — AC7, AC8, AC12: разметка + паттерна при `cell_cm` 5 и 25 и при двух значениях зума, на интерактивной + карте и в статическом рендерере (`hp-space-card`) в одном прогоне. +- `npm run golden:verify` — AC10; затем `npm run golden:accept -- --reviewed` + и повторный `verify` — AC11. ## 14. Мутационный гейт (`scripts/mutation-gate.mjs`) @@ -246,13 +273,16 @@ export function wallHatchNeedsSolid(stepUnits: number, pxPerUnit: number): boole | `hatch-step-unclamped` | кламп пределов снят | юниты `wall-thickness` | | `hatch-stroke-not-scaled` | толщина штриха не следует за шагом | смок | | `hatch-zoom-compensation-back` | вернулся множитель `1/zoom` | смок | +| `hatch-static-renderer-untouched` | `space-render.ts` снова с константой 8 | смок | | `hatch-density-solid-threshold-off` | порог по шагу на экране не срабатывает | юниты `wall-thickness` | ## 15. Release-артефакты `User-Visible: yes`: обе редакции CHANGELOG, строка в `docs/USER-GUIDE.ru.md` в -разделе про толщину стены. Скриншоты документации переснимаются, если этого -потребует `check-docs.mjs`. +разделе про толщину стены. `docs/WALL-THICKNESS.md` — канонический документ +подсистемы, которую задача меняет: правило шага штриховки описывается там же, +где живёт правило толщины стены. Скриншоты документации переснимаются, если +этого потребует `check-docs.mjs`; два golden-эталона — по AC11. ## 16. Откат