Волна 5 эпика #674, перенос ТЗ (класс C). Из 240 файлов `docs/specs/` в `legacy/specs/` уехали 219: на них не ссылается ни один живой файл (код, тесты, скрипты, workflow, документы вне архива и ревью). Остались 21 ТЗ — на которые ссылаются код, ADR, ISOMETRIC, SUN, RADAR, LIGHT (`docs/specs/067`), DECOR-EDITOR, support-relay, и те, на которые ссылаются они сами; README каталога объясняет, где искать остальное. Открытых issue с файлом ТЗ среди перенесённых нет. Относительные ссылки перенесённых файлов переписаны (`../X` → `../../docs/X`, соседние оставшиеся ТЗ → `../../docs/specs/…`) — все 26 резолвятся. Попутно: битая ссылка в `089-isometric-view-stage1.md:8` на удалённый `089-isometric-view.md` — теперь команда `git show` по истории. Строка в `legacy/README.md`. Issue: #682 User-Visible: no Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018qZfe7YS4rqEMKoVeS3GKd
3.1 KiB
ТЗ #37 — Одна объяснимая система масштабов room card
- Issue: https://github.com/Matysh/houseplan-card/issues/37
- Приоритет: P2
- Статус ТЗ: draft, рекомендованная migration semantics зафиксирована
Цель
Пользователь видит два понятных effective размера — название и метрики — с одним space default и room overrides. Скрытый третий layout multiplier больше не создаётся.
Каноническая формула
После явной миграции:
effectiveName = space.card_font_scale × (room.name_scale ?? 1)
effectiveMeta = space.card_font_scale × (room.label_scale ?? 1)
Диапазон каждого stored multiplier остаётся 0.5..3; итоговый CSS size имеет
отдельный safe clamp. Layout record rl_<roomId>.k — только read compatibility.
UX
- Space dialog показывает общий default и preview.
- Room dialog показывает override «Наследовать» либо процент, рядом effective процент; отдельный Reset для name и metrics.
- Visual corner resize масштабирует оба effective room значения одним ratio:
materializes
name_scaleиlabel_scale, сохраняя их относительное отличие. Он больше не пишетlayout.k. - Context tray при выборе room label показывает два effective значения и Reset.
Legacy
До Optimize renderer умножает старый layout.k как сегодня, поэтому нет
скачка. «Оптимизировать планы» preview:
name_scale = clamp(existingName × k);label_scale = clamp(existingLabel × k);- удалить только поле
k, сохранив x/y/s layout record; - показать rooms, где clamp изменил точное значение;
- atomic write config+layout и one-deep undo.
Обычный Save room/space не мигрирует k неявно. Если пользователь делает
visual resize конкретной legacy card, migration только этой room является
явным следствием жеста и сохраняет текущий visual до первого delta.
Edge cases
Room без metrics всё равно хранит independent label_scale; будущие metrics его используют. Rename/delete/remap room обрабатывает layout owner. Zoom карточки не меняет stored scale. Несколько клиентов конфликтуют через существующие rev.
Проверки и приёмка
- truth table defaults/overrides/k compatibility;
- zero-delta first drag без скачка; ratio с разными name/meta;
- Optimize preview/apply/undo/clamp;
- room/space dialogs, context tray, ru/en narrow layout;
- после Optimize нет
k, а screenshot до/после совпадает в tolerance.