A name-filtered `node --test` that matches no test exits 0 and TAP reports
only the file itself. The clean run took that for a healthy witness and the
mutant run for `survived`, although no assertion ran either time — as in
Validate 36151140394 on #649, where a renamed test left a guard pattern empty.
- mutation-guard-outcome: nodeTestSelection/executedTestNames/
emptyTestSelection; a green oracle with a name filter and zero executed
named tests is `setup-failure` (clean run: «FAIL чистая подготовка»,
diff mode: attributed like any setup failure, #568).
- mutation-gate --check: staticTestSelectionProblems — every pattern must
match a literal test(/it(/describe( name in the guard's files; files with
${…} names only warn. POSIX quoting keeps \( inside "…".
- Registry today: 349 unique name-filtered commands run on dev, all execute
≥ 1 test; --check: 0 errors, 3 warnings (dynamic names).
- Tests: 6 new in test/mutation-guard-outcome.test.mjs (incl. the installed
node's real TAP and a registry-wide static check); 3 mutants.
- Docs: TESTING.md pointer, testing-notes/infrastructure.md section.
Issue: #650
User-Visible: no
На окне не шире 480 px шапка карточки и страницы бокового меню занимает одну
строку ≤ 56 px: вкладки пространств (без шестерёнок и «+», прокрутка вбок,
текущая вкладка докручивается в видимую область), масштаб, одна шестерёнка
«Действия и настройки» и у админа слот крестика #647. Заголовок скрыт.
Меню шестерёнки (src/header-menu.ts): редакторы, настройки и добавление
пространства, общие настройки, PDF, помощь, сводная панель и объёмный вид
(alpha) — в фиксированном порядке и с теми же условиями и действиями, что у
прежних кнопок. Пункт закрывает меню; Escape возвращает фокус на шестерёнку;
касание вне меню поглощается прозрачной подложкой. На > 480 px шапка прежняя,
в киоске меню нет.
- три кнопки шапки вынесены в renderHeaderActions — шапка карточки не растёт;
- сводная панель отдаёт свои пункты методом menuItems();
- i18n: title.header_menu (en/ru/de/fr);
- потолок initial View 291 000 → 292 600 (замер 291 635), база bundleBytes;
- смок smoke_mobile_view_header, юнит header-menu, 10 мутантов; смоки
support_feedback, gear_tabs, modes, toolbar_stable_width переведены на
меню на ≤ 480 px; подпись вкладки в span.tabtitle без pointer-events;
- USER-GUIDE.ru, UX-MODES, TOUCH-SUPPORT, STYLING-HOOKS, data-hp-contract,
оба changelog.
Issue: #616
User-Visible: yes
Keep the critical file-sync subsection under Local Windows workstation and place the repository-maintenance section after it, as requested by review r1.
Issue: #628
User-Visible: no
Owner-selected option 1 only: document the one-time Windows clone GC, its before/after measurements, and the 2026-10-25 growth checkpoint. No LFS, tracked-bundle removal, or history rewrite.
Issue: #628
User-Visible: no
PROCESS.md §11.5: перед стабильным релизом — одно ревью поверхностей всей
линии бет «с нуля», без ТЗ и документов раундов, по SCOPE и USER-GUIDE.
- scripts/release-review.mjs: вход линии — прошлый стабильный тег, issue по
трейлерам в схеме RELEASE-MEMBERSHIP.json, продуктовые файлы; бриф промпта.
- .github/workflows/release-review.yml (workflow_dispatch, исполняется с dev):
prepare → model_review (модель без прав на запись, github_token #556) →
publish (docs/reviews/RELEASE-REVIEW-vX.Y.Z.md в dev токеном процесса,
индекс тем же коммитом, review-doc-guard). Повтор на тот же тег не тратит
модель, если документ уже в dev.
- release.yml: job independent-review ставит ревью в очередь сразу после
candidate, continue-on-error; ни один job выпуска от него не зависит
(решение владельца 2026-09-25).
- REVIEWER.md, AGENTS.md, DEVELOPMENT.md; тесты и четыре мутанта.
Issue: #638
User-Visible: no
Счётчик «N устр.» и ключ count.devices удалены вместе с правилом
`.head .count` (скрывало счётчик на ≤1100 px). Крестик закрытия редактора
вынесен из активной кнопки режима в отдельный слот `.editor-close-slot`
сразу после группы кнопок режимов: 24 × 24 px (--hp-editor-close-size),
одинаковый в редакторе и вне его; вне редактора слот пуст, aria-hidden,
без фокуса и pointer-events. Кликабельная зона × — весь слот (≥24×24, #195),
глиф 13 px; × виден на любой ширине, где видны кнопки режимов.
Смок smoke_toolbar_stable_width (1400/1000/768/390 px, en/ru): ширина
шапки и отступы кнопок стабильны во всех переходах, × виден, попадание
в край зоны закрывает редактор, нет нового overflow. smoke_editor_tabs,
smoke_edge_cases, smoke_hidden_flag переведены на слот/список устройств.
6 мутантов. docs: UX-MODES.md, STYLING-HOOKS.md, data-hp-contract.json.
Issue: #647
User-Visible: yes
Транзитная геометрия Resize теперь только вычисляет центр для текущего кадра и не удаляет сессионную позицию. Окончательная геометрия по-прежнему очищает точку, если она действительно вышла за комнату.
Issue: #645
User-Visible: yes
Linux CI при параллельном npm test мог потерять последнюю отдельную запись
stdout после длинной таблицы --count. Формируем отчёт целиком и пишем его
одним вызовом, чтобы итоговая строка всегда доходила до unit-теста.
Issue: #645
User-Visible: no
Кнопка сохраняет положение в пределах комнаты только на время сессии редактора,
корректно отменяется при pinch/cancel и учитывается подписями Resize.
Issue: #645
User-Visible: yes
- Ветка переиграна поверх dev с #642 (диалог «Оптимизировать планы» —
свой модуль), #627 (ленивые словари), #617 (загрузка плана по HTTP),
#618 (пакетное скрытие в каталоге), #615 (шахматка альфы в плитках цвета).
Текстовые конфликты — в сгенерированном (бандл) и в
demo/smoke_grid_snap.mjs (#642 сменил адрес вызова на
_editorRuntime.optimizePlans.open/run, #629 — ввод через фасад; оставлены
оба); scripts/mutation-registry.mjs слит без конфликта;
docs/reviews/INDEX.md пересобран reviews-index.mjs.
- После ребейза поверх #615 в дереве остался осиротевший чанк
namespace-language-ani9_pFw.js (переименование с обеих сторон, разрешено
версией dev без удаления нашей) — каталоги ассетов собраны с нуля,
bundle-tree чист.
- #642 опустил потолок src/houseplan-card.ts до факта; хук mode-tab
перенесён на строку data-editor-navigation (коммит хука), ядро не растёт.
- Бандл пересобран, три копии совпадают; monolith-baseline — числа равны
базе dev.
Issue: #629
User-Visible: no
- scripts/no-new-private-writes.mjs: смоки и demo/helpers/** не добавляют
записей в приватное состояние карточки (присваивание, ++/--, delete по
цепочке с сегментом _x; от this — нет) и вызовов _setMode/_openRoomEdit/
_openMarkerDialog/_openSpaceDialog. Зачёт правки по полю, перенос блока —
movedLinesByFile из no-new-any; исключение // private-ok: <причина>.
--count — остаток на HEAD. Подключён в gate:small и в шаг frontend рядом с
no-new-any, с той же базой.
- demo/helpers/hp-test.mjs: 10 операций через контрактные хуки и события
фикстуры (setMode, setTool, switchSpace, openRoomEdit, openMarkerDialog,
openSpaceDialog, setServerConfig, setLayout, input, close); ставится
launch*() из demo/serve.mjs. В бандле фасада нет.
- demo/srv/demo.html: доставка houseplan_config_updated/_layout_updated,
__pushServerConfig/__pushServerLayout; после доставки запись со старым
expected_rev — conflict, как у настоящего сервера.
- HP_SMOKE_CHECKS=1 печатает имена проверок в finish().
- smoke_area_relocation, smoke_glow, smoke_grid_snap переведены на фасад без
потери утверждений; новый smoke_test_facade доказывает каждую операцию.
- 7 мутантов, docs/TESTING.md (раздел + правило №6), PROCESS.md §2.7, AGENTS.md.
Issue: #629
User-Visible: no
Единственная дыра контракта #489 для тестового фасада харнесса: у вкладок
plan/devices/decor был только data-editor-navigation, которого нет в JSON-
контракте. Хук описан в docs/data-hp-contract.json (audience test, since
1.78.0-beta.2) и STYLING-HOOKS §7.4; присутствует только вместе с самими
вкладками (право на редактирование). Стилями не выбирается, пикселей не
меняет. Бандл пересобран.
Issue: #629
User-Visible: no
golden-capture-provenance accept() left a ~20 MB baselines sandbox in
TMPDIR on every call (433 copies, 8.5 GB, ENOSPC in the shared sandbox).
It now reads what it needs and removes the sandbox in finally; fixtures
are removed via t.after. Same fix for the three other leaking sites
(bundle-assets hp-tree-, docs-accept hp-identical-, rebase-generated
hp-runner- outside finally).
test/temp-dir-hygiene.test.mjs parses test/**/*.mjs with the TypeScript
AST: every mkdtemp/mkdtempSync must be bound to a name removed by
rm*/rmSync in a finally block or an after/afterEach/t.after hook of the
same function, or returned by a named helper whose every call site does
so; exception `// tmp-ok: <reason>`. Two mutants witness the lint.
Issue: #646
User-Visible: no
General settings colour tiles (room fills and glow) paint their colour at
its opacity over the checkerboard again, so "No light sources" at 0 % no
longer looks like solid grey. The label ink is chosen from the visible
colour (hex mixed with the checkerboard by alpha). Colour plates
(flat-swatch without cover-swatch) stay solid — now witnessed by the
- hp-color-opacity: one `_solidSwatch` condition drives background and
opacity; cover-swatch keeps the checkerboard
- editors/color-tile-ink.ts: pure isLightHex/colorTileInk, unit-tested
- smoke_dialog_polish_605: tileAlpha, defaultsDiffer, noneInkDark,
liveAlpha, platesFlat, plateSolid; oneSurface drops the opaque check
- mutants M-615-tile, M-615-plate, M-615-label
- USER-GUIDE (ru/en): "Colour tile" row; both changelogs
Issue: #615
User-Visible: yes
Код-ревью r1 зелёное; слияние отказало на конфликте с dev. Ветка
переиграна на origin/dev 2b3959e5 (32 коммита).
- Конфликты: бандл — версия dev + пересборка; оба changelog — запись
#618 под записью #617 в том же разделе; bundle-budget.mjs и
monolith-baseline.json — версия dev, числа #618 измерены заново;
docs/reviews/INDEX.md — node scripts/reviews-index.mjs.
- Ключи device_inbox.* остаются в основных словарях: #627 вынес в
ленивые чанки только settings/support/topology, каталог устройств
туда не входит.
- bundle-budget: LAZY_EDITOR_GZIP_CEILING 229 600 → 231 200 (замер
230 208, база dev 228 997, +1 211 Б gzip); initial View 289 558 →
289 884 (+326 Б, en-строки), в пределах потолка 290 400.
- monolith-baseline: hostRefs 4872 → 4883 (+11, как в r1),
bundleBytes 2509909 → 2515825.
- src/houseplan-card.ts: снято type-зеркало `selected?` в
DeviceInboxDialogState карточки (2 строки). После #627 запаса под
потолком ядра (12889) не осталось; карточка поле не читает, пишет и
читает его только рантайм через свой тип — так же, как черновики
фильтров #44. Типы стираются, поведение не меняется.
Issue: #618
User-Visible: no
На вкладках «На плане» и «Скрытые» — флажки строк, «Выбрать все (N)» по
всему отфильтрованному набору (включая строки за «Показать ещё»), панель
«Выбрано: K · Скрыть/Показать выбранные (K) · Снять выбор» в отдельном
контейнере .device-inbox-batch вне .device-inbox-filters.
- src/device-inbox.ts: чистые inboxVisibilityAllowed (один источник для
canHide/canShow и выбора), selectableInboxRows, effectiveInboxSelection,
applyInboxVisibility — свёртка одиночных действий; одиночное = пакет из
одной строки.
- src/device-inbox-batch.ts (новый, lazy editor): выбор, панель, строка-
флажок и writeInboxVisibility — одна запись houseplan/config/set с
expected_rev на пакет, busy='__batch__' (inert), откат маркеров при отказе,
выбор сохраняется и сужается. Одиночный _setInboxHidden рантайма — тонкая
обёртка над той же записью; рантайм стал короче базы на 14 строк.
- сброс выбора при смене вкладки (клик и стрелка), поиска и «Только новые».
- i18n en/ru/de/fr: 9 ключей по ТЗ §8.
- смок demo/smoke_device_inbox_batch.mjs (AC1–AC8, AC10), юниты
test/device-inbox.test.mjs (AC2, AC4), 4 мутанта в реестре.
- docs: USER-GUIDE ru/en, FILTERING.md, оба changelog.
- monolith-baseline: hostRefs 4948→4959, bundleBytes 2500387→2505569 —
новая фича (состояние выбора и запись идут через порт хоста).
- bundle-budget: LAZY_EDITOR_GZIP_CEILING 245 400 → 246 600 (замер 245 610,
+1 190 Б gzip от базы 244 420); initial View 289 449 → 289 765 (+316 Б,
строки en-словаря), в пределах потолка.
Golden device-inbox-* изменятся ожидаемо — пересъёмка предрелизным гейтом
на Linux CI (§11.4).
Issue: #618
User-Visible: yes
- Ветка переиграна поверх dev с #642 (вынос диалога «Оптимизировать
планы») и #627 (ленивые словари settings/support/topology). Текстовые
конфликты — только в сгенерированном (бандл, база монолита) и в
docs/reviews/INDEX.md (пересобран reviews-index.mjs); src/**, i18n,
реестр мутантов, smoke-links слились без конфликтов.
- Бандл пересобран, три копии совпадают, bundle-tree: 30 ассетов.
- monolith-baseline: hostRefs 4 869 → 4 872 (+3 — те же три обращения к
хосту, что и до ребейза: 4 948 → 4 951, приняты на ревью r1),
bundleBytes 2 508 211 → 2 509 909 (+1 698, в полосе ±2 000); прочие
числа равны базе dev.
- bundle-budget: потолки не менялись, все замеры в полосе.
Issue: #617
User-Visible: no
HA-тест test_issue_617_plan_upload_validates_fields_like_ws_plan_set слал
FormData только с текстовыми полями. aiohttp в этом случае кодирует тело
как application/x-www-form-urlencoded, а не multipart: view отвечал
bad_request (контракт ТЗ — «битый multipart»), и ожидание no_file в тесте
было неверным — дефект фикстуры, а не view (Validate 35952858822).
Теперь случай «multipart без части file» задаётся явно
(FormData(default_to_multipart=True)) и ждёт no_file, а тело без multipart
проверяется отдельно и ждёт bad_request. Ни одно ожидание не ослаблено:
добавлена ещё одна проверка ветки отказа.
Issue: #617
User-Visible: no
План уходил base64 в WebSocket-кадре: файл больше ~3 МиБ давал кадр больше
4 МиБ, HA закрывал сокет до обработчика, и обещанные 8 МБ были недостижимы.
- бэкенд: HouseplanPlanUploadView (POST /api/houseplan/plans/upload), потоковый
предел MAX_PLAN_BYTES (read_bounded), общий writer store_plan_upload для view
и ws_plan_set (контракт WS без изменений);
- карточка: stagePlanFile/uploadPlanFile/renderPlanBackdropGuard в
backdrop-pick.ts для обоих рантаймов; PlanFilePayload хранит Blob вместо b64;
SVG больше предела — тост при выборе, растр — диалог #39 только с уменьшенной
копией, копия больше предела не попадает в staging, 413 называет предел;
- i18n toast.plan_too_large, backdrop.over_limit_body (en/ru/de/fr);
USER-GUIDE ru/en, CHANGELOG ru/en, docs/testing-notes (#617);
- тесты: test/plan-upload-limit.test.mjs, tests_backend/test_plan_upload.py,
test_ha_upload.py (#617), smoke_plan_upload_limit.mjs; три смока переведены
с b64/plan/set на blob/fetchWithAuth; мутанты plan-upload-*;
- база монолита: hostRefs +3 (общий хелпер плана вместо двух копий в рантаймах,
новый тост уменьшенной копии).
Issue: #617
User-Visible: yes
- Бандл пересобран поверх dev с #642 (вынос диалога «Оптимизировать
планы»), три копии совпадают.
- bundle-budget: потолок ленивого графа редактора 246 000 (#642) → 229 600,
замер 228 621 (до ребейза 228 900 при 227 869; +752 — модуль диалога #642).
Центр полосы: 979 Б сверху, 1 021 Б до нижней границы. Потолок онбординга
28 500 без изменений (замер 27 468).
- monolith-baseline bundleBytes 2 499 182 → 2 508 211 (+9 029: десять новых
чанков словарей и записи манифеста, та же причина, что и до ребейза);
прочие числа равны базе dev.
- smoke_optimize_geometry_preflight: ожидание языкового гейта #627 перед
открытием диалога через новый порт #642 (`_editorRuntime.optimizePlans.open()`),
разрешено в коммите задачи.
Issue: #627
User-Visible: no
smoke_danger_confirmation asked for a confirmation as soon as btn.cancel was
translated. With #627 the settings namespace of de/fr settles after the main
catalog; while it is pending the host gate is warm and #417 refuses the
request — the dialog never painted and the smoke crashed intermittently.
The switch now waits until the host drops aria-busy (the gate settled), and
the settings-de/fr chunks are delayed by 300 ms so the slower-namespace order
is deterministic instead of a CI-speed coincidence. New checks name the lost
dialog directly instead of a TypeError.
Issue: #627
User-Visible: no
- ru/de/fr трёх словарей пространств — девять ленивых чанков (по одному на
пару «пространство × язык»), английский статически как слой отката;
рантайм — тот же LanguageRuntime (две попытки, отпечаток сборки, fallback,
общий тост отказа), src/i18n/namespace-language.ts.
- Загрузчики рантаймов онбординга и редактора отдают поверхность в рендер
только после того, как словарь текущего языка осел; гейт хоста учитывает
словари загруженной на нём поверхности (смена языка на лету — ветка warm).
Оверлей Zigbee ждёт topology до первой отрисовки.
- bundle-manifest: граф lazyNamespaceLocaleFiles, девять retry-токенов со
строгим счётом «ровно один». bundle-budget: потолок онбординга 28 500
(замер 27 470), редактор 245 400 → 228 900 (замер 227 869), проверки
ленивости и владения по содержимому.
- Смок smoke_lazy_admin_locale (AC4–AC7); регресс-смоки, переключавшие язык
синхронно, ждут гейт вместо ослабления проверок; пять мутантов.
- monolith-baseline bundleBytes 2 500 387 → 2 508 676: +10 чанков (rollup intro
и export на каждый) и записи манифеста; gzip каждой поверхности при этом
уменьшился.
Issue: #627
User-Visible: no
Первый вынос из монолита по образцу live-*/RadarSetupController.
src/optimize-plans-dialog.ts: OptimizePlansDialogState, чистые
preflightDiagnostics/preflightVersionsDiffer и класс OptimizePlansDialog
(open/preview/toggleLivePositions/run/copyDiagnostics/
reportPreflightFailure/render, clipboardFallback) за портом из 18 членов.
Модуль не знает HouseplanEditorHostPort; импортирует его только рантайм,
карточка берёт тип.
Инлайн-фолбэк буфера обмена — WeakMap по объекту диалога
(CODE-REVIEW-295-r1 M2), дедуп dev-лога — поле класса: из карточки и порта
ушли _preflightClipboardFallback и _reportedPreflightFingerprint, пять
делегатов и две стрелки-заглушки. Харнесс (13 смоков, wall-draw-click,
golden) зовёт card._editorRuntime.optimizePlans.* — меняется только адрес.
11 текстовых утверждений i18n.test.mjs о разметке и тосте диалога и гварды
8 мутантов переехали в юнит test/optimize-plans-dialog.test.mjs
(test-build); новый мутант optimize-dialog-imports-host-port.
monolith-baseline: delegates 159→154, portMembers 350→348,
hostRefs 4948→4869, portPrivates 96→94, harnessPrivates 107→101,
bundleBytes 2499647→2499182. Потолки ядер опущены на выигрыш;
потолок lazy editor gzip пересчитан (+555 Б gzip при −465 Б сырых).
Issue: #642
User-Visible: no
Six workflows run from the default branch (issues, schedule, workflow_run):
process, process-resume, process-reconcile, mutation-gate, nightly,
process-metrics. Their bodies move to _<name>.yml (on: workflow_call); the
original files keep only triggers, run-name, permissions, concurrency and one
job `uses: Matysh/houseplan-card/.github/workflows/_<name>.yml@dev` with
`secrets: inherit`. A pipeline change becomes one commit to dev.
- caller job permissions = union of body job permissions (#556 minimum kept
per job inside the body); caller `if` repeats the body guard for process and
process-resume so unrelated events stay skipped;
- dispatch inputs forwarded via workflow_call inputs of the same names;
- _mutation-gate.yml keys evidence/marker on job.workflow_sha (the body SHA):
in a called workflow github.workflow_sha belongs to the caller in main;
- action-pins: narrow exception for this repo's _*.yml at @dev with a reason;
- preflight workflow_sync compares all six thin callers (was 3 of 6);
performance.yml excluded: its schedule judges main with main's own body;
- tests read bodies from _*.yml; new test/default-branch-workflows.test.mjs;
six mutants; PROCESS.md §10.4, AGENTS.md, REVIEWER.md updated.
Issue: #623
User-Visible: no
A pipeline doc commit carries the review document and the rebuilt
INDEX.md; while the task waits, dev receives other tasks' documents with
their own INDEX.md, and the rebase of the branch conflicts in the index
every time. 24.09 this bounced green #617, #618, #629, #642 to S6.
scripts/rebase-generated.mjs: shared rebase helper. At every stop, if ALL
conflicting paths are docs/reviews/INDEX.md (or paths the caller
resolves itself), the index is rebuilt from the directory in the stop
tree, staged, and the rebase continues; any other path aborts and
returns the full list. CLI exit 3 = refusal with paths on stdout.
Wired into process.yml «Привести ветку к dev» (helper taken from dev via
git archive; conflict/conflicts outputs, lease, ref wait and
--commit-if-stale kept), merge-candidate rebaseOnto (claude[bot]
identity, --commit-if-stale kept) and rebase-on-dev.mjs (index next to
GENERATED_ROOTS; bundle still dev copy + rebuild).
Issue: #643
User-Visible: no
#620. Mutants were ~70 % of CI machine time.
1. mutation-gate.yml: a green full run (aggregator verified all six shards)
leaves a cache marker keyed by material tree + workflow SHA. A scheduled
night with the same tree and workflow, marker not older than 7 days, skips
the shards and writes "reused from run N" to the run summary. Red runs
leave no marker, so the next night runs again and still files the issue
(#472). Manual dispatch always runs the full registry. Decision is a pure
function in scripts/mutation-nightly-reuse.mjs.
2. changed_mutants: the shard plan (already computed before setup, #518) now
names the environment of its guards (plan-browser=/plan-python=, from
scripts/mutation-environment.mjs). Python + backend deps only for shards
with pytest guards, Chromium only for shards whose guards reach
Playwright; pip wheels cached. Every shard still runs and reports, so the
six mutant jobs of the review proof are unchanged.
Item 3 of the issue (smoke guards -> node --test) is out of scope here.
Issue: #620
User-Visible: no
dialog-baseline.ts and the four *-form-state.ts modules were proven only by
browser smokes. Unit tests on test-build now pin stableKey (top-level order,
transient filter, nested values as-is), no-baseline => dirty, warm transfer,
the transient set of each dialog, and every *Problems code with its order.
room-form-state.ts joins tsconfig.test.json. Three form-state mutants move
from smoke guards to these units; six new mutants cover the new contracts.
Issue: #631
User-Visible: no
The trivial track (PROCESS §5.1) goes S2 -> S5 without a spec or a spec
review, so in S6/S7 its label is the only product-flow evidence. Without
it a trivial bug whose branch has no class A yet got the same false
"class A forbidden" as #607. productFlowEvidence now takes labels;
new test on the #612 body shape and mutant task-packet-trivial-is-product-flow.
Issue: #632
User-Visible: no
A product issue in S5-S7 whose branch holds only its spec review was
classified as infrastructure and told "class A is forbidden". The track is
now decided by product-flow evidence first (S1-S5 status, "## ТЗ" in the
body, docs/specs file, spec review doc or verdict); the "diff without
class A" heuristic applies only outside the product flow. docs/reviews/**
no longer counts as branch material. Three mutants guard both directions.
Issue: #632
User-Visible: no
Вход агента до первого файла кода стоил ≈ 26 700 слов (аудит 22.09).
- docs/process/AUTHOR.md и REVIEWER.md — выжимки PROCESS.md: каждый пункт
ссылается на раздел канона, ключевые формулировки дословные;
test/process-digests.test.mjs сверяет якоря, ссылки и правила.
- scripts/entry-cost.mjs — маршрут чтения по роли и бюджет (автор ≤ 12 000
слов, AC1); AGENTS.md «Read this first» называет те же маршруты.
- docs/STATUS.md: блок Snapshot генерирует scripts/status-snapshot.mjs
(версии — release-contract, счётчики — inventory, теги — git); feature
surface и ранние milestones перенесены дословно в docs/STATUS-FEATURES.md.
- docs/TESTING.md — действующая инструкция (684 строки, AC3); ручные
чек-листы и приложения по issue перенесены дословно в docs/testing-notes/
с индексом и тестом на полноту.
- Промпт ревьюера в process.yml читает конспект вместо пересказа правил;
машинные требования (строка вердикта, REVIEW_DOC, запрет fetch, таблица
«чем краснеет», разделы повторного раунда) сохранены и закреплены тестом.
- PROCESS.md: правила не менялись; добавлены ссылка на конспекты в шапке и
уточнение в §10.4, что ревьюер конвейера читает конспект.
- 7 мутантов в реестре.
Issue: #634
User-Visible: no
- .githooks/pre-push + scripts/pre-push-gate.mjs --hook: gate:small runs by
default for issue/* branches with an executable diff; C/D-only diffs and
non-issue refs are skipped, HP_PREPUSH_GATE=0 turns it off, =1 forces it.
A non-HEAD push with an executable diff is rejected (the gate checks the
working tree). The gate runs with every GIT_* variable removed: git gives
hooks GIT_DIR (and GIT_CONFIG_PARAMETERS with the pusher's -c), and unit
tests that `git init` temporary repositories otherwise write into the real
one — seen on the first live run. The manual #343 mode is unchanged.
- scripts/sandbox-bootstrap.sh: idempotent worktree / deps / chromium (npm
@sparticuz/chromium@152.0.0 + Playwright shims) / bundle / check steps,
no owner paths or credentials.
- scripts/test-chunk.mjs, npm run test:chunk -- N/M: round-robin over
test/*.test.mjs sorted by code point.
- Tests, seven mutants, docs/DEVELOPMENT.md «Локальный контур за 5 минут»,
docs/TESTING.md. package.json changed → bundle rebuilt (fingerprint input).
Issue: #633
User-Visible: no
- scripts/workflow-jobs.mjs: разбор job-уровня validate.yml (id, name,
inline matrix) без зависимостей; незнакомые формы — громкая ошибка.
- ci-proof: JOB_RULES по id job с именем-контрактом; число и точные имена
экземпляров — из матрицы YAML (константы count: 6 нет); resolveJobRules
на каждом evaluateCiProof — переименование даёт failed с названной job;
jobContractProblems — сверка в обе стороны, UNCONSUMED_JOBS для proof.
- validate-gate: MUTANT_JOB_PREFIX — из контракта ci-proof.
- e2e-gate: E2E_JOB_NAME — зеркало name: из houseplan-e2e e2e.yml
(43899da5), распознавание выводится из шаблона; missing называет
завершённые прогоны без job по контракту.
- тесты: фикстуры имён выводятся из validate.yml; новый
test/workflow-jobs.test.mjs; 5 мутантов в реестре.
Issue: #622
User-Visible: no
conftest.py без Home Assistant исключает test_ha_*.py через
collect_ignore_glob — это не skip, в итоговой строке их нет вовсе. Теперь
шапка и итог прогона печатают «HA harness NOT collected: N files (M tests)»
со ссылкой на канон (Linux CI / WSL scripts/wsl-setup.sh --verify). N и M
считаются при каждом запуске по тому же glob.
Тест test_conftest_harness_notice.py проверяет обе ветки conftest в
отдельном процессе pytest (homeassistant перекрыт заглушкой), счёт по
временному каталогу и по реальному харнессу против AST-счёта. Мутанты
ha-harness-notice-silent, ha-harness-notice-count-frozen. TESTING.md и
AGENTS.md: «silently skips» заменено точной формулировкой.
Issue: #630
User-Visible: no
Карточка и редакторский рантайм держали ≈380 неиспользуемых импортов, 56
мёртвых объявлений и дублей типов (warm-boot, LS_*, GLOW_*, debounce,
navigate, lruRead — копии карточки в рантайме) и 112 приватных членов
карточки, которых не читал никто — делегаты `_editorRuntimeOrThrow()._x()`,
оставшиеся от выноса #425, и аксессоры glow-состояния. Всё это снято; в 9
других файлах — по одиночной ошибке. Делегаты и поля, которых касаются
браузерные смоки (`card._x(...)`), оставлены и посчитаны отдельно.
Гейт `npm run lint:unused` (scripts/unused-locals-gate.mjs, в gate:small и
Validate после сборки): `tsc --noUnusedLocals` чист, кроме приватных членов
карточки из порта HouseplanEditorHostPort / `host.` (portPrivates) и членов,
которых зовёт харнесс (harnessPrivates); храповик по шести числам
scripts/monolith-metrics.mjs против scripts/monolith-baseline.json —
delegates 260→159, portMembers 350, hostRefs 4948, portPrivates 96,
harnessPrivates 107, bundleBytes 2 510 141→2 500 387. `npm run inventory`
печатает те же числа. Заморозка 54 тестов, читающих монолит как текст
(test/monolith-text-anchors.test.mjs); PROCESS.md §2.7 — правило.
Логический исходник для контрактных тестов (test/houseplan-source.mjs)
дописывает члены рантайма без делегата в карточке — контракт продукта не
зависит от наличия заглушки. Потолки ядер и initial gzip опущены на выигрыш
(292 000 → 290 400). Бандл пересобран, три копии синхронны.
Issue: #624
User-Visible: no
Интеграционный тест запускает настоящий accept.mjs в канонической Linux-среде и подтверждает fail-closed отказ до записи эталонов.
Issue: #641
User-Visible: no
Полный прогон для #640 выявил устаревший parity-свидетель после уже слитого #614: прямой путь теперь обязан задавать и сырой текст числовых полей.
Issue: #640
User-Visible: no
Прогон 35871441981: свидетель «предполётные проверки не прячут друг друга»
(#336) считает continue-on-error по списку шагов; новый шаг reviews_index в
список добавлен.
Issue: #635
User-Visible: no
Прогон 35870123732 на 49bae62e: тест «индекс свеж» покраснел на материале,
который конвейер сам же ребейзнул на dev (#614) — process.yml исполняется из
main и о `--commit-if-stale` ещё не знает; так красился бы любой раунд, пока
правка не отзеркалена, а на issue-ветках коммиты конвейера индекс ветки знать
не обязан. Свежесть судится там, где её держит конвейер: шаг preflight
`reviews-index --check` только на push в dev, в вердикте предполёта; skipped
не считается отказом. Юнит-тест байтовой свежести снят, вместо него — свидетель
на проводке. PROCESS.md §2.10: правка docs/reviews руками сопровождается
пересборкой в том же коммите. INDEX.md пересобран на текущем дереве.
Issue: #635
User-Visible: no
r2 H1: INDEX.md — снимок каталога, и ребейз ветки на dev, получивший чужие
документы ревью, устаревал его молча. Теперь `--commit-if-stale` пересобирает
и коммитит индекс коммитом конвейера после приведения к dev (process.yml) и
после ребейза кандидата (merge-candidate.mjs); тест «индекс свеж» сравнивает
закоммиченный файл с пересборкой и красит Validate при расхождении.
r2 M1: находка без заголовка — первый абзац секции, склеенный из перенесённых
строк, без маркера буллета и кода `**M1.**`; «не найдено», служебные скобки
«(унаследовано…)» — не находка. Нумерованные пункты тоже забирают перенесённые
строки. Мутант reviews-index-paragraph-tail. PROCESS.md §2.10 дополнен.
Issue: #635
User-Visible: no
r1 H1: parseCounts брал первое «High: N» по тексту (часто цитата чужого
раунда), parseFindings знал только «### H1 — …». Теперь: счётчик — своя
строка «Вердикт» → секция «## Вердикт» → единственное значение → подсчёт по
заголовкам; находки — «### Medium (…) — …», секции с «**M1. …**»,
«## Находка N (High…)», «### [High] …», «### Low L1 — …»; «— нет» не
находка. Новая колонка «Файлы» — пути из находок, чтобы grep по имени файла
отвечал на «что находили по X». Пересказ чужого вердикта строчными в шапке
не перебивает свой. INDEX.md пересобран; мутант reviews-index-counts-first-match.
Перезаход без изменения дерева: dispatch-прогон на 3719a06d покраснел
рассинхроном process.yml main/dev (исправлено зеркалом 0c933449), а
validate-gate считает завершённый красный dispatch на SHA окончательным.
Issue: #635
User-Visible: no
scripts/reviews-index.mjs собирает docs/reviews/INDEX.md: одна строка на
документ — issue, этап, раунд, вердикт (явная строка, раздел «Вердикт»,
свободная форма хвоста; 936 из 986 распознаны), High/Medium по строке вердикта
или заголовкам находок, до шести заголовков находок. Индекс детерминирован,
не индексирует сам себя, перечисляет файлы вне схемы имён; `--check` — гейт
свежести. process.yml публикует INDEX.md тем же коммитом, что документ ревью.
docs/LESSONS.md — датированные уроки со ссылками на источники (12 записей из
аудитов и разборов недели). PROCESS.md §2.10 — где искать решения.
Тесты: разбор имён, вердиктов, счётчиков, находок; фикстурный каталог;
живой каталог (100 % покрытие, >90 % вердиктов); контракт шага конвейера.
Мутанты reviews-index-skips-self-check, reviews-index-verdict-substring.
Issue: #635
User-Visible: no
У `contents` API потолок 1 000 записей с молчаливой обрезкой; каталог подошёл к
нему (986 файлов). Guard теперь спускается по дереву commit → docs → reviews и
трактует `truncated` как отказ листинга (счёт по файлам отключается, страховка
по комментариям остаётся). Предупреждение о потолке снято. Тесты: фикстура на
2 400+ имён со своими документами в хвосте; свидетель на проводке workflow.
Issue: #621
User-Visible: no
#608 поменял событие коммита числа в form-kit, а смоки форм комнаты и
устройства красными увидел только ночной реестр: smoke-select связывал
form-kit лишь с новым smoke_range_line_draft. Явная связь rangeLine/unitInput →
три смока форм, чтобы правка набора контролов гонялась на кандидате ревью.
Issue: #639
User-Visible: no
scripts/process-metrics.mjs — чистые функции над снимками GitHub: по issue
(таймлайн меток) вход по первой статусной метке, S4→S5, вход→S7, S7→S8,
повторные постановки S7; раунды ревью — по документам docs/reviews, не по
событиям метки (конвейер с #636 ставит S7 сам); прогоны Actions по workflow —
исходы, wall-time, события (прогоны конвейера сведены в одну строку); минуты
S4/S7 конвейера без skipped; при наличии jobs — job-минуты и доля «Мутанты».
Markdown-отчёт со сводкой и таблицей по issue; CLI на gh (только чтение).
process-metrics.yml — понедельник 05:00 UTC и по кнопке; отчёт в step summary
и артефакт на 90 дней; прав на запись нет.
Тесты на фикстурах, в т. ч. воспроизведение формы аудита 22.09 (30 issue:
15 r1/13 r2/2 r3 → 1,57; Validate 226/178/37/11). Мутанты
metrics-count-skipped-pipeline-runs, metrics-rounds-by-s7-events.
Issue: #637
User-Visible: no
Стадия prepare спала ≈ 28 минут на раунд, пока шёл Validate с мутантами на
материале (модель работает 10–12); за неделю ≈ 420–500 job-минут простоя и
потолок бюджета стадии 55 минут.
- validate-gate.mjs: `--no-wait` — гейт диспатчит прогон, убеждается, что тот
встал на материал (#539 сохранён), и возвращает `pending` (код 2) вместо
ожидания; завершённый зелёный/красный отдаёт сразу, как прежде.
- process.yml prepare: третий исход `proceed=pending`: запечатанный маркер
`review-pending-<issue>-<run>-<attempt>` (issue, stage, branch, material_sha,
validate run) и выход; модель и интеграция не запускаются; возврат автору —
только на явном `false`.
- process-resume.yml + scripts/process-resume.mjs: на `workflow_run: completed`
Validate по ветке issue/* — если метка S7 стоит, активного прогона нет и
последний прогон оставил маркер на этот SHA, переставить S7 (HP_PROCESS_TOKEN);
новый прогон находит завершённый dispatch сразу. Без маркера не будит.
- process-reconcile.mjs: читает маркер и состояние Validate на материале;
идёт — wait, завершился/пропал без продолжения — retry; без маркера — прежний
escalate. Общий loadSealedArtifact, экспорт processRuns/artifactNames.
- preflight сверяет process-resume.yml между main и dev наравне с process.yml.
- Тесты: validate-gate (4), process-resume (8, включая контракт трёх workflow),
process-reconcile (2); мутанты gate-no-wait-still-sleeps,
resume-wakes-round-without-marker, resume-ignores-active-run,
reconcile-wakes-pending-while-validate-active. PROCESS.md §10.4, AGENTS.md.
Issue: #636
User-Visible: no
Repair both incoming routes and safe target-reference recovery, with backend
and mutation coverage for foreign and same-instance imports.
Issue: #611
User-Visible: yes
Extend the authentic pinned-HA diagnostic with explicit light and dark palettes, a 32 px root-font case, one-scroller geometry assertions, and reviewed evidence images. Correct stale AC references in the mutation descriptions.
Issue: #609
User-Visible: no
The mobile mutant now changes both public height bounds, so the browser test observes the intended 48 px regression instead of CSS min-height precedence masking it.
Issue: #609
User-Visible: no
Use Home Assistant's public dialog tokens for the reviewed 560 px canvas, height cap, single scroller and mobile fullscreen layout. Keep generic dialogs and the native fallback unchanged, with authentic-HA evidence and mutation witnesses.
Issue: #609
User-Visible: yes
Promote the tested 1.77 beta line without new product behavior. Aggregate the stable notes since v1.76.0 and sync all version authorities and installable bundles.
Issue: #584
Issue: #588
Issue: #593
Issue: #594
Issue: #598
Issue: #600
User-Visible: yes
Release: v1.77.0
Reviewed the complete Linux Validate artifact 35606718247: one new furniture scene and eight expected dialog-polish changes; 166 other scenes remain unchanged.
Release: v1.77.0-beta.5
Baseline-Reviewed: https://github.com/Matysh/houseplan-card/actions/runs/35606718247
Issue: #603
Issue: #605
Issue: #606
User-Visible: no
Publish corrected 0.4.1 pack, preserve old cactus objects as a read-only alias, and cover the catalog, renderers, editor, PDF and visual scene.
Issue: #606
User-Visible: yes
Шард 2/4 прогона 35565222849 снят по timeout-minutes: реестр вырос до 810
мутантов (~203 на шард), длительность за 11 дней 42 → 61 мин при потолке 60.
Отчёт назвал его «ok»: лог без строк FAIL считался зелёным, а обрыв по
таймауту строк FAIL не содержит. Агрегатор проверял identity, но не
завершённость — evidence шага `if: always()` было на месте.
- mutation-gate.yml: matrix из шести шардов, `--shard=i/6`, `--shards=6`;
шаг прогона получил id, его `outcome` пишется в evidence.
- mutation-gate-report.mjs: шард `ok` только с итоговой строкой
`поймано N из M`, N = M, без FAIL и с исходом шага `success`; лог без
итога или исход `cancelled`/`skipped` — `interrupted`, отказ; агрегатор
отвергает прерванный шард как неполный. `outcome` в evidence необязателен
ради старых артефактов, но, если назван, обязан быть из известного набора.
- тесты: обрыв → interrupted, исходы шага, evidence с outcome; делитель
шардов один во всех местах workflow; фикстуры зелёных логов получили итог.
- мутанты: mutation-report-truncated-log-is-ok,
mutation-evidence-ignores-cancelled-step.
- docs/TESTING.md: шесть шардов, итоговая строка.
Потолок 60 минут остаётся стражем от зависшего Chromium. Ledger в ночном
прогоне не включён: ночь гоняет всё.
Issue: #604
User-Visible: no
Count the Optimize action by its label instead of the removed alignall layout class, so the clean mutation guard still protects the action after the polish.
Issue: #605
User-Visible: no
The new smoke already names the changed color-picker symbols; an explicit registry link would duplicate the selector's direct evidence.
Issue: #605
User-Visible: no
Make colour tiles solid, readable and fully clickable; align Data actions and device icon field with the form kit. Cover narrow Windows layouts and both icon-picker branches with a focused browser smoke.
Issue: #605
User-Visible: yes
Reviewed room settings desktop/mobile and the new 320px discard confirmation from Linux Validate 35566453055; 171 scenes unchanged and 106 environment witnesses.
Issue: #603
User-Visible: no
Release: v1.77.0-beta.4
Baseline-Reviewed: https://github.com/Matysh/houseplan-card/actions/runs/35566453055
Package the dialog-polish release from #602 together with the validated CI optimization from #601; synchronize version authorities, generated bundles and bilingual release metadata.
Release: v1.77.0-beta.4
Issue: #601
Issue: #602
User-Visible: yes
С Linux CI Validate 35538133817 приняты ровно восемь визуально проверенных сцен: три базовых диалога устройства, три help/popover-сцены и два цветовых поповера. Остальные 165 сцен сохранены без изменений; строгий allowlist accept.mjs исключил необъявленные расхождения.
Issue: #602
User-Visible: no
Release: v1.77.0-beta.3
Baseline-Reviewed: https://github.com/Matysh/houseplan-card/actions/runs/35538133817
`mutantsRequested` отвечает true лишь на PR и `workflow_dispatch mutants=true`
(конвейер ревью, слияние кандидата). Трейлер `Release:` и `full=true` включают
тяжёлые гейты — смоки, golden, performance_smoke — но не мутантов: к бете каждая
задача прогнана ими на ревью и на слитом после ребейза кандидате, ночь покрыта
полным реестром (mutation-gate.yml, #513), а ручной полный прогон ради
артефакта эталонов и приёмка эталонов с трейлером на ветке задачи платили
шестью job впустую. `schedule` мутантов тоже не запрашивает.
Политика release в ci-proof — `mutants: false`: иначе proof кандидата беты
без запрошенных mutant-jobs объявлялся бы stale. review и merge по-прежнему
требуют шесть исполненных job (#541).
Тесты: #510 AC1 переписан под новый список, ci-proof — release без мутантов
green, лёгкий stale, review/merge без запроса stale. Мутанты протокола:
`mutants-run-on-every-push` перепривязан, новые `mutants-run-on-beta-candidate`,
`mutants-run-on-full-dispatch`, `release-proof-demands-mutant-jobs`.
PROCESS.md §10.4, AGENTS.md, docs/TESTING.md, комментарии workflow.
Issue: #601
User-Visible: no
Package the designer-aligned settings dialogs from #600 as the next beta candidate and refresh the synchronized frontend bundles and bilingual release documentation.
Release: v1.77.0-beta.3
Issue: #600
User-Visible: yes
Съёмка — Linux CI, Validate 35515236776 на ec97fd95; приёмка — Windows
владельца с HP_ALLOW_FOREIGN_CAPTURE (#455).
Просмотрены toggle-entity-dialog-desktop-en и
space-room-color-popover-desktop-ru. Остальные 171 сцена совпали; accept.mjs
отказал бы при любом необъявленном расхождении.
Issue: #600
User-Visible: no
Release: v1.77.0-beta.3
Baseline-Reviewed: https://github.com/Matysh/houseplan-card/actions/runs/35515236776
`node demo/capture_design_pairs_600.mjs` на дереве ec97fd95: room-* больше не
показывают «Temperatur/e» — ровно тот кадр, которым ревью r1 (M1) доказывало
дефект; сегменты остальных диалогов дали сдвиг в пределах строки. Все восемь
файлов меняются целиком из-за 256-цветной палитры, содержательные отличия —
только в сегментах.
Issue: #600
User-Visible: no
`npm run docs:accept -- --identical` (#512) после 8dc60aec и ec97fd95: все
11 документационных сцен попиксельно совпали с закоммиченными, принят только
отпечаток исходников. Ту же вершину снял Linux Docs Screenshots 35515141317 —
артефакт docs-screenshots лежит для сверки.
Issue: #600
User-Visible: no
Продолжение r1 M1: полные fill.* в RU («По силе зигби-сигнала», «По
температуре») не входили одной строкой в четыре колонки сегмента пространства
и переносились на вторую строку кнопками. Референс (§4.2 reference/app.js
fillOptions, §6.1) даёт короткие подписи Custom | Zigbee | Lights |
Temperature — они и стоят в обоих сегментах общими ключами ленивого словаря
fill.seg_* (en/ru/de/fr); room.fill_seg_* удалены. USER-GUIDE ru/en,
ACCEPTANCE.md и smoke_ux_fixes обновлены; changelog называет короткие подписи.
Три эталона меняются к лучшему и требуют повторной приёмки:
device-dialog-desktop-en и toggle-entity-dialog-desktop-en («Colour and
brightness» одной строкой вместо двух), space-room-color-popover-desktop-ru
(сегмент RU без разорванных слов); остальные десять сцен — passed на этом
дереве диагностически.
Issue: #600
User-Visible: yes
M1. Подпись сегмента больше не рвётся посреди слова: колонка `.hpf-seg label`
не сжимается ниже самого длинного слова (`min-width: fit-content`, для
браузеров без него — прежний `0` строкой выше), слова переносятся только по
пробелам (`overflow-wrap: normal`), не поместившийся сегмент переносится на
вторую строку целыми кнопками (`flex-wrap`). Новый свидетель
demo/smoke_dialog_segments_i18n.mjs — четыре диалога × en/ru/de/fr: у каждой
подписи число строк (по Range текстового узла: span — flex-элемент, у блока
один прямоугольник даже при переносе) не больше числа слов, текст внутри
кнопки. На разметке r1 краснеет на en/ru/fr комнаты («Temperature» в 2
строки, «По температуре» в 3). Мутант form-kit-segment-breaks-words
возвращает прежние две строки CSS. ACCEPTANCE.md — строка про подписи
сегмента переписана.
M2. Glow radius — не условие Save: как на dev, нечисло или неположительное
значение при сохранении молча становится общим радиусом. Удалены
glowRadiusValid, MarkerProblem marker.error_glow_radius, ключ в четырёх
локалях словаря settings, aria-invalid у поля; смок device_settings_form
утверждает обратное прежнему (badRadiusDoesNotBlockSave,
zeroRadiusKeepsSaveEnabled) и проверяет «Review N fields» на привязке в
create-режиме. Changelog EN/RU и USER-GUIDE ru/en больше не называют радиус
среди ошибок; таблица устройства говорит про молчаливый общий радиус.
M3. Свидетель дефекта №5 (поповер «?» обрезается границей диалога комнаты):
demo/smoke_dialog_help_clipping.mjs — короткое окно 900×620, диалог комнаты
скроллится, «?» нижней карточки прижат к краю; подсказка выходит за край
скроллера и остаётся hit-test'ируемой во всех пяти точках (elementsFromPoint
сквозь теневые корни — обрезанная часть не hit-test'ится). Четыре ветки:
нативный <dialog> и ha-dialog × Popover API и портальный fallback; ветка
ha-dialog — заглушка с ловушками настоящей mwc-поверхности (transform +
overflow: hidden + собственный скроллер), portal вне поверхности проверен
явно. Настоящий ha-dialog (#505, загрузка колеса HA-frontend) — отдельная
диагностическая приёмка владельца; так и записано в ACCEPTANCE.md, где
появилась таблица AC8 «девять дефектов — свидетель на каждый».
M4. ACCEPTANCE.md: эталонов 13, а не 11 — одиннадцать из ТЗ (список AC10
унаследован от #598 без комнаты) плюс две room-temperature-dialog-*.
L1. USER-GUIDE.ru.md: испорченная строка таблицы настроек пространства
(хвост удалённой строки про декоративный слой) — убран; пояснение «в
редакторе подложки остаются видимыми» вернулось в строку «Видимые слои»;
строка про солнце говорит «слой Двери, окна и ворота выключен» вместо
«Скрыть проёмы включено».
Фикстуры листа диалогов набора пересняты (панель — байт в байт).
Бюджет: initial 289 852 / 290 900; lazy editor 242 989 / 243 900.
Гейты: typecheck, build, bundle:sync (три копии), npm test 2794 pass по
четырём частям, no-new-any, mutation-gate --check, check-inputs --coverage,
смоки: segments_i18n, help_clipping, четыре формы, config_parity,
help_affordance, room_settings, settings_dialog_cards.
Issue: #600
User-Visible: yes
Linux Docs Screenshots 35506234074 снял ветку после исправления скроллера.
Просмотрены space-create, device-editor и device-display-preview; кадр preview
отличается от обычного и показывает блок Display preview. Остальные восемь
сцен совпали побайтово.
Issue: #600
User-Visible: no
После #600 единственный скроллер диалога находится в shadow-root .content.
Съёмка продолжала менять scrollTop у старой .body, поэтому обычный кадр
устройства и кадр Display preview получались побайтово одинаковыми.
Тест фиксирует владельца скролла и запрещает возврат к неработающей .body.
Issue: #600
User-Visible: no
Съёмка — Linux CI, Validate 35504549764 на 504c1609; приёмка — Windows
владельца с HP_ALLOW_FOREIGN_CAPTURE (#455).
Объявлены ровно 13 сцен AC10; остальные 160 сцен совпали побайтово,
иначе accept.mjs отказал бы до записи.
Issue: #600
User-Visible: no
Release: v1.77.0-beta.3
Baseline-Reviewed: https://github.com/Matysh/houseplan-card/actions/runs/35504549764
Единственный красный смок полного набора Validate #3417 (шард 2/3 и гард
мутанта в шарде 5/6): проверка localizedControl искала строку «Show the room
information window on hover» как label.srcrow с чекбоксом. С серии 2 это
строка-тумблер набора #gs-room-tooltip: название в .hpf-toggle-title, подпись
отдельно, переключатель — нативный чекбокс. Смок утверждает то же самое на
новой разметке.
Issue: #600
User-Visible: no
Гейт «новый код не добавляет any» (#342) поймал две строки диалога устройства,
унаследованные от прежней разметки: ключ подписи действия собирается как
I18nKey, событие ha-icon-picker — CustomEvent<{ value?: string }>.
Issue: #600
User-Visible: no
demo/smoke_dialog_config_parity.mjs: для каждого из четырёх диалогов одни и
те же правки делаются дважды — контролами набора с нажатием Save и прямой
записью в черновик с вызовом save-метода (путь прежних обработчиков и
существующих смоков); JSON.stringify(_serverCfg) совпадает побайтово, и оба
отличаются от исходного конфига. Заодно числовое поле размера шрифта
карточек в «Пространстве» получило id (space-card-font) — подпись for
раньше указывала в пустоту.
Issue: #600
User-Visible: no
Завершение четырёх серий по референсу docs/design/600-settings-dialogs/:
- из eager-листов dialogs.styles.ts и chrome.styles.ts сняты стили прежней
разметки диалогов (.bindsel/.bindharow/.entcheck, .ctrlchip*, .markerhelp*,
.helpfieldlabel, .markerradios, .markerlightdisabled, .markerbadgetechnical,
.markerglowvalue, .fileupload, .descin, .pdfedit/.pdftag, .gsrow,
.ripple-*row, .radaradditional, .togglehint, футеры marker/room) — 5,8 КБ
исходника; с разметки сняты уже пустые классы;
- «Additional actions» карточки Details — подзаголовок и строка действий
набора, без раскрывашки (radar-section.ts, только additional-placement);
- Q3 уточнён по кадру: hp-device-preview стоит без обёртки — у него свой
заголовок «Display preview · Now», второй над ним удваивался; пустое
состояние — блок на тинте;
- §6.1: «?» у комнаты стоит у поля Home Assistant area, а не у заголовка
Basics; подписи сегмента заливки — None · Zigbee · Lights · Temperature ·
Custom (два коротких ключа room.fill_seg_*), источники — «Average of the
room’s sensors / Specific device or entity», режим свечения — «Colour and
brightness» (тексты прежних ключей укорочены под сегменты);
- подпись поля с «?» и без стоят на одной линии в сетке (min-height 32 по
кнопке hp-help); иконка внутри подсказки — inline;
- парные кадры: demo/capture_design_pairs_600.mjs снимает четыре диалога в
двух темах на 560 в состояниях макетов → docs/design/…/pairs/ (8 PNG,
палитра 256, ~0,5 МБ); ACCEPTANCE.md — статус по диалогам, расхождения с
референсом по каждому со ссылкой на пункт SPEC и принятые адаптации (шапка
hp-dialog по §3, тумблеры набора по К7, секции радара/пылесоса по §7.2);
- changelog EN/RU («Не выпущено»), USER-GUIDE ru/en: раздел «Как устроены
диалоги настроек», таблица настроек пространства по новым карточкам,
диалог комнаты, диалог устройства, ссылка «Как у пространства»;
- бюджет: стартовый граф 289 853 — потолок 291 600 → 290 900 (снятые стили);
ленивый редакторский 243 149 — итоговый потолок 243 900 с разбором по
сериям в bundle-budget.mjs.
Golden: 11 сцен диалогов (device-dialog-*, room-temperature-dialog-*,
toggle-entity-dialog-*, device-help-popover-light-ru,
general-color-popover-desktop-en, settings-help-zoom-200-*,
device-ripple-color-popover-mobile-ru, space-room-color-popover-desktop-ru)
прогнаны диагностически (capture, HP_ALLOW_FOREIGN_CAPTURE, только
artifacts/): харнесс проходит все пути без исключений, кадры «different» —
эталоны переснимаются на Linux CI / машине владельца по #455.
Скриншоты документации (06-device-editor, 06-device-display-preview и др.)
устарели по отпечатку — пересъёмка перед кандидатом беты (#479).
Гейты: typecheck, build, bundle:sync (три копии байт в байт), npm test
2793 pass по четырём частям, mutation-gate --check, check-inputs --coverage,
фокусные смоки четырёх форм и смоки диалога устройства.
Issue: #600
User-Visible: yes
Срез «от export function segmented до конца файла» находил type="radio" у
radioRow и choiceCards ниже, и подмена радио на чекбокс внутри самого
сегмента проходила зелёной. Срез ограничен телом функции; мутант
form-kit-segment-drops-radio-semantics снова красит тест.
Issue: #600
User-Visible: no
§7 SPEC.md референса. Пять карточек #598 остались, менялось содержимое; все
ключи _markerDialog и все записи в них прежние (§7.2):
- Basics — баннеры привязки стали callout'ами; Name с подсказкой «Shown on
the plan»; привязка — сегмент [Virtual | From the HA list] (те же радио
bmode) и кнопка выбора #marker-binding с панелью в потоке (sourcePicker
набора), чекбокс «Show entities» — внутри панели рядом с поиском (решение
владельца Q8); Room селектом с подсказкой «по зоне / переопределяет»;
секции радара и пылесоса — своими модулями без изменений;
- Tap action — селект с подсказкой Target/Now, «Ask for confirmation» —
строка-тумблер только при toggle/run (Q8), Entity to toggle и What to run
теми же условиями (список целей — панель набора), «Controls other light
sources» — чипы набора и поиск с панелью в потоке;
- Light and glow — «Include the device temperature…» строкой-тумблером;
роль — сегмент [Auto | Always | Never] с подсказкой результата Auto;
Leading light entity по условиям; блок свечения (.hpf-block): подзаголовок
с «?», сегмент [From source | Set colour | Colour and brightness] с
отключёнными вариантами и aria-describedby на объяснение, плашка цвета
вокруг прежнего hp-color-opacity (Q5), яркость и радиус строками с
числом и единицей, при Never блок неактивен целиком (aria-disabled) с
callout'ом причины;
- Appearance — поле иконки с превью, очисткой и ссылкой Pin в подсказке;
Display селектом с подсказкой режима; пульс — плашка цвета и строка
размера; Value source по условиям; подраздел Value badge — компактный
тумблер, Value селектом с техническим идентификатором, Position сегментом
[Above | Right | Below | Left]; предупреждения бейджа — заметки и
callout'ы; Display preview — прежний hp-device-preview целиком в блоке на
тинте с тегом Now (решение владельца Q3); «Icon size and rotation» —
две строки range-line в сетке;
- Details — Model и Link в ряд, Description textarea набора, Manuals чипами
и строкой действий Attach…, «Additional actions» подзаголовком набора.
Футер: Hide и Delete слева, статус, Cancel и Save справа. К10: снимок
черновика при _openMarkerDialog (marker-form-state.ts поверх
dialog-baseline; транзиентные ключи — раскрытие и фильтры списков, busy,
объявление подсказки, autoIcon, uploadId); в edit Save только при
изменениях, закрытие с изменениями спрашивает через _confirmDanger. Прежние
запреты Save (busy, калибровка радара, привязка не выбрана/не подтверждена)
остались; привязка и радиус свечения названы словами под полем
(marker.error_binding, marker.error_glow_radius), «Review N fields» ведёт к
полю. Тумблеры диалога — строки набора (нативный чекбокс, К7), а не
ha-switch; слайдеры — прежний _rangeInput (ha-slider в HA).
Набор: sourcePicker получил toolbar и disabled; сегмент — value у радио,
disabled и describedBy у варианта; callout — role note и id; unitInput —
describedBy; rangeLine — id; новые классы .hpf-block/.hpf-disabled,
.hpf-toolbar/.hpf-check, .hpf-iconfield/.hpf-iconpreview, .hpf-mono,
.hpf-note, .hpf-hint-line, textarea.hpf-input. settingsCopy вынесен в
editors/settings-copy.ts (общий для пространства, комнаты, устройства).
Смоки переписаны осознанно, с пометкой #600: binding_ui (#marker-binding,
.hpf-panel, #marker-show-entities), tap_run (панель набора, #marker-tap-
confirm), value_face_source (.hpf-cand.sel), static_icon (callout'ы),
climate_temp (#marker-use-climate-temp), help_affordance (#marker-name,
.hpf-block.hpf-disabled вместо fieldset[disabled]; второй Escape в грязном
диалоге спрашивает — К10), size_angle_parity (сетка Appearance),
color_picker_consumers (подписи полей), device_preview_parity (сегмент
стороны), ha_controls (тумблеры набора — нативные чекбоксы по К7, ha-slider
прежний). Golden-harness device — .hpf-field/.hpf-block, скроллер .content.
Новый фокусный свидетель demo/smoke_device_settings_form.mjs: пять карточек
без старой разметки, оболочка, привязка/панель/Show entities, Q8, сегменты и
блок свечения, плашки, иконка, бейдж, превью на тинте, размеры, Details,
цели 44, Save/dirty/вопрос при закрытии, create-режим, семь полос экранов.
Мутанты: marker-save-enabled-without-changes, marker-discard-without-asking,
marker-confirm-row-shown-for-do-nothing, marker-never-keeps-glow-block-live,
marker-badge-position-forgets-touch; якоря same-binding-click-resets-source,
state-callout-hidden-under-help, form-kit-segment-drops-radio-semantics
переставлены на новую разметку.
Контрактные тесты: color-picker (два поля набора вместо flex-строк),
native-select-contract (сторона бейджа — сегмент), i18n dead-keys (34 → 38
подсказок), German=English (marker.name_label). Словарь i18n/settings: 21
ключ marker.* на четыре локали; в основном каталоге marker.name_label
«Name», marker.size_label «Icon size and rotation», удалены мёртвые
marker.room_override, marker.light_role_always/never. Фикстуры листа
диалогов набора пересняты намеренно (панель — байт в байт, AC11).
Бюджет: стартовый граф 290 489 (потолок 291 600 без изменений); ленивый
редакторский 243 173 — потолок 240 100 → 243 900 с разбором в
bundle-budget.mjs; старые стили диалога устройства снимаются в финале.
Гейты: typecheck, build, bundle:sync (три копии байт в байт), npm test
2790+ pass по четырём частям, mutation-gate --check, 39 смоков диалога
устройства + новый + три формы серий 1–3.
Issue: #600
User-Visible: no
§6 SPEC.md референса. Четыре карточки #594 остались, менялось содержимое:
- Basics — Display name и Home Assistant area в одну строку из двух полей
(#room-name, #room-area — контролы набора); подстановка имени из зоны при
пустом имени прежняя;
- Fill — «Как у пространства» стала строкой-тумблером (#room-fill-inherit,
решение владельца Q4): включена — подсказка «Следует за пространством:
режим»; выключена — сегмент из пяти режимов, который стартует с
действующего режима пространства, а не с «None». «Свой цвет» — плашка
вокруг прежнего hp-color-opacity (Q5): свотч, hex, число прозрачности,
Reset у своего цвета. Границы комфорта при эффективной «Температуре» —
два поля с единицей °C (#room-temp-min/-max) с плейсхолдерами границ
пространства, легендой Cold / Comfort / Hot, ошибкой под полями и ссылкой
«Как у пространства». Модуль room-temperature-controls.ts удалён — его
разметку заменили поля набора;
- Sensor sources — подзаголовки, прежний сегмент «среднее / конкретный», при
конкретном — кнопка выбора в стиле селекта и панель с поиском в потоке
карточки (sourcePicker набора, роль listbox/option; общая с диалогом
устройства в серии 4). Кандидаты и запись прежние;
- Font sizes — две строки «слайдер + число % + Reset to 100%» с концами шкалы,
подсказка про размер карточек пространства, образец карточки сохранён
внутри .hpf-tint (решение владельца Q2).
Футер: Cancel | статус | Save; в create — Keep as walls слева. К10: снимок
черновика при _openRoomEdit (room-form-state.ts поверх dialog-baseline),
в edit Save только при изменениях, закрытие с изменениями спрашивает через
_confirmDanger; в create Save по прежнему условию (имя или зона), отмена без
вопроса — она и раньше значила «не создавать» и возвращала контур на план.
Ошибки черновика: имя (edit) / имя-или-зона (create), нечисло в границах —
подпись под полем, «Review N fields» в футере ведёт к первому полю.
Из eager-листа dialogs.styles.ts удалены .roomtemprange*, .roomdialog .srcrow
и .dropbtn; `overflow-x: hidden` у .body убран — скроллер один (К3).
Смоки переписаны осознанно, с пометкой #600: smoke_room_settings (тумблер
вместо радио, #room-name/#room-area, .hpf-panel .hpf-cand, старт сегмента с
режима пространства), smoke_room_temperature_thresholds (.hpf-temprange,
ссылка сброса). Golden-harness room-temperature — те же селекторы. Новый
фокусный свидетель demo/smoke_room_settings_form.mjs: четыре карточки без
старой разметки, имя и зона в одну строку, оболочка 560 и один скроллер,
тумблер/сегмент/плашка/границы/источники/размеры пишут в свои ключи, Save и
вопрос при закрытии, create-режим, семь полос экранов.
Мутанты: room-save-enabled-without-changes, room-discard-without-asking,
room-fill-segment-starts-at-none, room-temp-min-writes-max. Якорь
form-kit-writes-to-a-neighbour-key прежний. smoke-links: символ
roomTemperatureControls заменён на renderRoomSettingsDialog.
Словарь i18n/settings: девять ключей room.* на четыре локали; в основном
каталоге room.area_label без «(unassigned)». Фикстуры листа диалогов набора
пересняты намеренно (панель — байт в байт, AC11).
Бюджет: стартовый граф 290 575 — потолок ОПУЩЕН 292 200 → 291 600 (ушли CSS
диалога комнаты и модуль границ); ленивый редакторский 239 391 — потолок
238 600 → 240 100 с разбором в bundle-budget.mjs.
Гейты: typecheck, build, bundle:sync (три копии байт в байт), npm test
2790+ pass по четырём частям, mutation-gate --check, смоки: room_settings,
room_settings_form, room_temperature_thresholds, editor_tabs, font_scales,
resize_labels, room_autoclose, binding_ui, color_picker_consumers,
lazy_editor_chunk, space_settings_form, general_settings_form, ux_fixes,
settings_dialog_cards, dialog_footer_width.
Issue: #600
User-Visible: no
§5 SPEC.md референса. Семь карточек #598 остались, менялось содержимое:
- Display — две полные строки с иконкой, подписью и тумблером справа; пояснение
радара по §5.2 стало подписью строки (текст прежний, ключ переехал в ленивый
словарь как gs.radar_show_live_hint, «?» у строки больше нет);
- Zigbee links — заголовок и «?» функции (topology.help) рисует карточка, а
блок hp-zigbee-topology-settings получил режим embedded: строка-тумблер,
callout «сохраните настройку», подзаголовки ZHA / Zigbee2MQTT, поле тем и
строки действий контролами набора. Заголовок больше не удваивается
(дефект 1). Лист набора вносится в теневой корень компонента; токены
--hpf-* наследуются с хоста. Прежний render без embedded не тронут — его
держит контракт #459;
- Room fill colors — три подзаголовка (Lights / Temperature / Zigbee signal,
Q6) и плитки цвета по три в ряд: название на свотче, hex, число
прозрачности; свотч — trigger прежнего hp-color-opacity (Q5);
- Light-source glow — две плитки и поле радиуса с единицей внутри рамки;
- Plan — плашка цвета стен, сегмент фона, при Static — плашка фона с Reset и
подсказкой (тема / свой цвет);
- Sun — gs.sun_missing остаётся callout'ом (К5); север: поле градусов с «°»,
ссылка Clear, «N» и компас 44 px справа — индикатор набора, но тянуть его
по-прежнему можно (smoke_sun гоняет настоящий drag; старый 120-px SVG и его
CSS в plan.styles.ts удалены); лучи — строка-тумблер с подписью; источник
лучей — сегмент (sun-settings-view.ts переписан с <select> на segmented,
логика та же);
- Data — подзаголовки с «?» и строки действий набора.
К10 (Q1): Save только при изменениях и без ошибок (радиус > 0, север 0–359),
статус в футере, вопрос при закрытии с изменениями; снимок при открытии —
editors/general-form-state.ts поверх общего editors/dialog-baseline.ts (на него
же переведён space-form-state.ts). _settingsDialog не получил новых ключей.
Удалено мёртвое: _renderColorRow (рантайм и карточка), .sunrow/.suncol,
ключи gs.wall_group, gs.bg_group, gs.bg_theme, gs.radar_show_live.help(.aria)
в четырёх локалях. Девять новых ключей — в i18n/settings.
Смоки переписаны осознанно, с пометкой #600: smoke_general_settings (инвентарь
по классам набора, подзаголовки .hpf-sub h4, пояснения под «?» и подписью,
ни одного .rhint), smoke_sun (сегмент источника лучей вместо select, поле
#gs-north, radius drag 18 px), smoke_backup_transfer (подзаголовок и строка
действий), smoke_settings_dialog_cards (callout вместо .rhint). Новый фокусный
свидетель demo/smoke_general_settings_form.mjs: семь карточек и отсутствие
старой разметки, один заголовок у Zigbee, десять плиток, компас 44, цели 44,
запись плиток/плашки/радиуса/севера/сегментов в свои ключи, Save/dirty/вопрос
при закрытии.
Мутанты: general-save-enabled-without-changes,
general-tile-opacity-writes-a-neighbour-key, general-north-clear-writes-zero,
topology-embedded-draws-its-own-heading; якоря state-callout-hidden-under-help
и dialog-card-loses-its-heading переставлены на новую разметку.
Контрактные тесты: houseplan-source.mjs приводит `host.` к `this.` и в телах
вынесенных диалогов; color-picker — три явных showOpacity=true (плитки, плашка
стены, цвет комнаты); счётчик производных .aria 35 → 34.
Бюджет: стартовый граф 290 711 — потолок ОПУЩЕН 292 500 → 292 200 (ушёл
120-px компас из eager-листа и мёртвые ключи); ленивый редакторский 237 929 —
потолок 236 300 → 238 600 с разбором в bundle-budget.mjs.
Гейты: typecheck, build, bundle:sync, npm test 2792 pass, mutation-gate
--check, семь смоков «Общих», smoke_color_picker_consumers без правок.
Issue: #600
User-Visible: no
§4 SPEC.md референса, четыре карточки: Basics (имя и масштаб в сетке 1fr/175,
подложка двумя choice-карточками, callout о пересчёте масштаба), Appearance
(строка-тумблер границ с иконкой и подписью, сегмент стиля стен с образцами
линии, плашка цвета с hex/прозрачностью/Reset, сегмент заливки с деталями
режима, компактный список «Видимые слои» с логикой «включено = видно» — К2),
Room cards (строка-тумблер названий, четыре плитки значений с отключением и
callout-ссылкой, слайдер размера с числом, концами и «Сбросить до 100%», образец
карточки внутри блока на тинте — Q2), Sun & light (сегмент фона, плашка цвета
фона, радио «свет через окна» в строку, север селектом с компасом 44 px и полем
градусов, строка-тумблер свечения).
Одна форма на два рантайма. `renderSpaceForm` в `editors/space-form.ts`
собирает тело и футер; редакторский вход (`space-settings-dialog.ts`) и
онбординг подают порт с тем, что у них различается, и сами рисуют
`<hp-dialog data-kind=…>` — контракт #489 требует литеральный kind. Копия
разметки онбординга на 300 строк удалена; локальные дубли CELL_CM_* и
strictNumber там же — тоже («одно число — один источник»).
К10 (решение владельца Q1): Save активен только при изменениях и без ошибок,
в футере «Есть несохранённые изменения» либо ссылка «Проверьте поля: N» к
первому ошибочному; «✕», Cancel и Escape с изменениями спрашивают через
`_confirmDanger`, без изменений закрывают сразу. Снимок делается при открытии
(`editors/space-form-state.ts`, WeakMap по хосту) — `SpaceDialogState` не
получил ни одного ключа. Валидация: имя, подложка без изображения, диапазон
температур, север 0–359 — с `aria-invalid` и текстом под полем.
Строки. 51 новый ключ живёт в ленивом словаре `i18n/settings` (приём
#423/#459), не в первом кадре: стартовый граф 291 260 при потолке 292 500.
Отдельный словарь, а не `support`, — иначе онбординг тянул бы весь словарь
редактора ради одной формы. 11 существующих ключей переименованы по Q6
(«Space name», «Appearance», «Room cards», «Draw it myself», «Zigbee signal
next to devices»…), 9 мёртвых удалены из четырёх локалей. `hp-color-opacity`
получил `hide-label`: подпись рисует плашка, `label` остаётся для title/aria и
`smoke_color_picker_consumers` проходит без правок (AC5).
Смоки. Переписаны осознанно (К6 снят), каждый — с пометкой #600 у правки:
smoke_hide_layers (компактные строки, инверсия К2 проверяется кликом),
smoke_ux_fixes (сегмент, строка-тумблер, поля °C, ширина 560 — Q7),
smoke_dialog_footer_width (560 для form-shell), smoke_temp_fill (два поля по
id), smoke_settings_dialog_cards (три сегмента), smoke_space_settings и
smoke_space_create_display_defaults и smoke_lazy_editor_chunk (choice-карточка
по смыслу, не по индексу — порядок §4.2 draw → file), smoke_space_scale_defaults
(поле с единицей). Новый фокусный свидетель demo/smoke_space_settings_form.mjs:
состав карточек и отсутствие старой разметки, оболочка 560 и один скроллер,
цели 44, запись каждого нового контрола в свой ключ, Save/dirty/вопрос при
закрытии, семь контрольных ширин (320…1920).
Мутанты: space-fill-segment-writes-a-neighbour-key,
space-save-enabled-without-changes, space-discard-without-asking,
space-layer-toggle-loses-inversion.
Контрактные тесты: `houseplan-source.mjs` дописывает общие модули диалогов к
логическому исходнику; коллектор i18n видит `help(...)` порта и `shelp(...)`
(заодно встал на учёт `radar.help`, проходивший мимо счётчика — 30 → 35).
Потолок ленивого редакторского графа 225 900 → 236 300 (замер 235 560) с
разбором в bundle-budget.mjs: словарь на четыре локали и подписи — большая
часть роста; промежуточно, итог в конце серий.
Гейты: typecheck, build, bundle:sync, npm test 2792 pass (красным был только
потолок — поднят с доводом), 10 смоков пространства зелёные,
smoke_color_picker_consumers без правок, mutation-gate --check.
Issue: #600
User-Visible: no
Серия 0 из пяти по #600. Ничего из четырёх диалогов ещё не переложено — эта
серия даёт им инструменты и оболочку.
Набор (`form-kit.ts` + `form-kit.styles.ts`), числа из §3.1 SPEC.md референса,
цвета через переменные темы HA:
- полная строка настройки `toggleRow` — сетка 28/1fr/44: иконка, название +
«?», подпись, тумблер справа; тумблер — нативный чекбокс, нарисованный CSS,
как у редактора панели: один вид в HA, на стенде и в golden, и всё тот же
`input[type=checkbox]` для смоков; компактный вариант для однотипных списков;
- `field`, `fieldGrid` (две колонки и 1fr/175), `subsection`, `unitInput`,
`rangeLine`, `rangeEnds`, `radioRow`, `choiceCards`;
- `valueTiles` (4 колонки), плитки цвета в CSS; `colorField` — компактная
плашка вокруг существующего `hp-color-opacity` (Q5): свотч открывает ту же
панель, рядом hex, число прозрачности и Reset; нативного пикера нет;
- `callout` (К5: сообщения о состоянии остаются на виду), `compass` 44 px,
`footerStatus`, `chip`, `tintBlock`, `textLink`, `divider`;
- `segmented` получил образцы линии, иконки и `disabled`; вид — как в
референсе: контейнер на канве, активный сегмент на тинте.
Оболочка (`hp-dialog.ts`, атрибут `form-shell` у четырёх диалогов настроек):
ширина 560 через `--hp-dialog-wide-width`, которую `:host([wide])` уже читал;
высота min(940px, 100vh − 48); единственный скроллер — `.content`, тело формы
высотой не владеет (К6, дефект 7 из issue); «✕» 44 px; бейдж имени пространства
в заголовке (`badge`). Generic `wide` и остальные диалоги не тронуты (Q7).
`hp-dialog[form-shell] .body` — без max-height и overflow, канва 16 px.
Фикстуры листа диалогов `test/fixtures/form-kit-card-dialog*.css` пересняты
намеренно; лист панели совпал с замороженным побайтово (К9, AC11).
`editor.loading` → «Загрузка…» в четырёх локалях (дефект 9); aria-текст прежний.
Потолок ленивого редакторского графа 222 900 → 225 900 с доводом в
`bundle-budget.mjs`: рост — CSS-строки набора, не код; значение промежуточное,
серии 1–4 выкидывают старые правила, итог замеряется в конце.
Гейты: typecheck, build, bundle:sync, `npm test` (2791 pass; красными были
только потолок — поднят — и неотслеженные файлы манифеста — добавлены),
`smoke_settings_dialog_cards`, `smoke_room_settings`.
Issue: #600
User-Visible: no
AC0 задачи: пока референс лежит вложением в issue, ревью сравнивает продукт с
макетом «на глаз», и ровно это дало выпущенный в 1.77.0-beta.2 ложный паритет —
карточки снаружи, старая разметка внутри.
Содержимое архива `houseplan-settings-design-2026-09-18.zip`
(SHA-256 06f07fc212947ee9da1a39aaab2d14cbd41154cc9effe39bc48e1c2e1517255b,
сверен побайтово с вложением #591) разложено по образцу #505:
- `SPEC.md`, `IMPLEMENTATION-GUIDE.md`, `OPEN-POINTS.md`, карта полей Space —
с этого коммита часть ТЗ: расхождение называется ссылкой на пункт документа;
- `reference/` — свёрстанный прототип четырёх форм;
- `screenshots/` — четыре формы целиком, 560 px, 2x;
- `README.md` — происхождение, отпечаток, границы использования;
- `ACCEPTANCE.md` — место для парных кадров «референс / продукт» по AC1.
Автор — сотрудник владельца (подтверждено 20.09 в #600), внешний грант не нужен.
Windows-лаунчеры `START.cmd` и `START.ps1` не переносились: `node serve.mjs`
делает то же самое. `room-fill.test.mjs` перенесён как документ намерения, CI
его не запускает — под `docs/**` не попадает ни один тестовый glob.
В бандл отсюда не попадает ничего; `repo-hygiene` и полный набор зелёные
(2793 pass).
Issue: #600
User-Visible: no
Точный поиск добавляет дорогие события границ комнаты только когда более близкий кандидат действительно отброшен этой границей. Корректность кеш-хинта сохраняется, обычный pan/zoom не платит за лишний fallback.
Issue: #585
User-Visible: no
Linux Docs Screenshots 35476276726 подтвердил отсутствие визуальных изменений во всех 11 сценах; обновлён только fingerprint исходников.
Issue: #585
User-Visible: no
Кешированное смещение больше не завершает поиск до точной проверки пересечений с границами комнаты и стен. Добавлен регрессионный тест для более близкого решения у диагональной границы.
Issue: #585
User-Visible: no
Перечисляются только реальные пересечения конечных границ, новые границы обрабатываются инкрементально, а дробные координаты дают только необходимые floor/ceil-соседи.
Issue: #585
User-Visible: no
Строгий docs-гейт #585 обнаружил отложенную визуальную дельту уже
смёрженного #598: карточки групп в диалогах пространства и устройства.
Все три кадра просмотрены; остальные восемь Linux-сцен совпали побайтно.
Съёмка и проверка воспроизводимости:
https://github.com/Matysh/houseplan-card/actions/runs/35465854646
Issue: #585
User-Visible: no
Съёмка — Linux CI, Validate 35454723038 на acf179e4; приёмка — Windows
владельца с HP_ALLOW_FOREIGN_CAPTURE (#455).
Объявлены ровно одиннадцать сцен AC8; необъявленных расхождений нет —
иначе accept.mjs отказал бы до записи.
Issue: #598
User-Visible: no
Release: v1.77.0-beta.1
Baseline-Reviewed: https://github.com/Matysh/houseplan-card/actions/runs/35454723038
`scripts/check-docs.mjs` считает отпечаток от всего `src/**`, поэтому правка
трёх диалогов его состарила, хотя ни один из десяти сценариев `demo/docs`
диалоги настроек не открывает.
`npm run docs:accept -- --identical`: все 11 кадров совпали попиксельно,
принят только отпечаток исходников (81fa92d2). Переснятых кадров нет.
Issue: #598
User-Visible: no
Закрывает находки код-ревью r1 по #598.
M1 — неприкосновенный смок восстановлен. `demo/smoke_tap_run.mjs` вернулся
побайтово к версии `origin/dev`: он один из девяти `.srcrow`-смоков, которые
ТЗ объявило неизменяемыми, и правка в нём обесценивала собственное
доказательство AC2/AC3. Проверки карточек переехали в новый
`demo/smoke_settings_dialog_cards.mjs` — отдельного свидетеля ТЗ не запрещало.
M2 — сегментированный переключатель сделан там, где он обещан и уместен:
`space-bg-mode` и `space-zero-wall-style` переведены из `<select>` в
`segmented`. Остальные выборы в трёх диалогах остаются списками осознанно:
привязка маркера, роль света и режим свечения уже `role="radiogroup"`
(`.markerradios`), позиция значения закреплена смоком
`smoke_device_preview_parity`, списки сущностей и тем длинные. Сокращение
объявлено в ТЗ и в обоих changelog.
M3 — мутант `state-callout-hidden-under-help` патчит теперь оба состояния:
`marker.run_target_gone` и `gs.sun_missing`; гард — новый смок.
Заодно: `ensureFormKitStyles(this.host)` не вызывался ни в одном из трёх
диалогов — стили набора приезжали только из диалога комнаты, и без него
сегменты имели высоту 14 px вместо 44. Нашёл новый смок проверкой
`bgSegmentTargetIsBigEnough`.
Гейты: typecheck, test (2788 pass), build, bundle:sync, три смока,
mutation-gate --check, оба мутанта задачи.
Issue: #598
User-Visible: yes
«Общие настройки», «Пространство» и «Устройство на плане» были плоскими
столбцами. В «Общих» девять подписей-заголовков шли вперемешку с рядами и
абзацами; в «Устройстве» на 760 строк формы не было ни одного деления, и
«Название» лежало в одном списке с «Дополнительными действиями».
Теперь это карточки общего набора: семь в «Общих», четыре в «Пространстве»,
пять в «Устройстве». Набор взят как есть — он поднят в #594 и доказан на диалоге
комнаты и редакторе панели (#597).
Шесть пояснений переехали под «?» к своему заголовку, подзаголовку или строке;
текст не переписан. Два сообщения о СОСТОЯНИИ остались на виду — решение
владельца: `gs.sun_missing` и `marker.run_target_gone` говорят, что настройка
сломана прямо сейчас, а второе ещё и называет пропавшую цель подстановкой,
которой в статической подсказке взяться неоткуда.
`gs.hint` при этом переехал из ленивого support-словаря в основной: «?» читает
текст через `_t`, а не `supportT`. Тест мёртвых ключей сливает оба словаря, так
что копия в support удалена во всех четырёх локалях.
Классы-опоры сохранены намеренно: `.srcrow`, `.dispsection`, `.gsrow`,
`.colorrow`, `.namein`, `.areasel`, `.tempin` остались на своих элементах, а
карточки добавились вокруг. За эти имена держатся одиннадцать смоков, и потеря
любого превратила бы ревью в чтение переписанных свидетелей.
Изменён ровно один смок — `smoke_general_settings`, и изменён в сторону
строгости: вместо одного списка подписей он снимает теперь два (заголовки
карточек и подзаголовки внутри), требует непустоты каждой карточки, проверяет
что радиус свечения лежит ВНУТРИ карточки свечения (подпись такой границей не
была), что четыре переехавших пояснения доступны кнопкой и что их абзацев в
форме не осталось.
`src/houseplan-onboarding-runtime.ts` затронут двумя строками: он второй
потребитель переименованных ключей `space.hide_*_tip` → `space.hide_*.help`.
Один текст — один ключ; дублировать его ради неприкосновенности файла хуже.
Потолок стартового графа поднят 291 400 → 292 500. Выросли СТРОКИ, а не код:
12 новых ключей в четырёх локалях плюс переехавший `gs.hint`. Разметка диалогов
как была в ленивом редакторском графе, так там и осталась.
Свидетели: `state-callout-hidden-under-help` прячет сообщение о состоянии под
«?» и краснит новый блок `smoke_tap_run`; `dialog-card-loses-its-heading`
обнуляет заголовок карточки и краснит `smoke_general_settings` — карточка без
заголовка это снова плоский список, только с рамкой.
Issue: #598
User-Visible: yes
`node scripts/check-docs.mjs` краснел на материале ревью: диф трогает два файла
`src/**`, а отпечаток скриншотов считается от всего `src/**` и устарел. PROCESS.md
§8 называет этот гейт безусловным при любом диффе по `src/**`, и пропуск уже
стоил инцидента — #230, #234 оставили `dev` с красным job `docs` до #237.
Расхождения пиксельного нет и быть не могло: стили панели собираются побайтово
тем же текстом.
npm run docs:accept -- --identical
Все 11 кадров попиксельно совпали с закоммиченными:
принят только отпечаток исходников (f561ec99).
Issue: #597
User-Visible: no
Набор контролов был поднят из редактора боковой панели в #594, но сама панель
осталась на своей копии тех же правил. Две копии расходятся молча: правка в
наборе не доедет до панели, и наоборот.
Просто вызвать `formKitCss` из панели нельзя. Общие правила в её листе не идут
подряд: между карточкой-группой и обводкой фокуса стоит сетка `.summary-general-grid`,
между фокусом и выключенным состоянием — `button { font: inherit }`, между ним и
рядом-переключателем — `svg`. Вставить один общий кусок значило бы переставить её
объявления, а перестановка правил равной специфичности — уже не подстановка:
проверять пришлось бы каждое правило по отдельности.
Поэтому генератор разрезан на пять именованных фрагментов — карточка-группа,
обводка фокуса, выключенное состояние, ряд-переключатель, подпись ряда, — и
панель подставляет каждый на своё место. `formKitCss` остаётся их композицией,
чтобы у диалогов не появилось пяти вызовов вместо одного.
Доказательство вместо обещания. У настроек панели нет ни одного golden-кадра: в
матрице нет сцены `dialog: 'summary'`, и «панель не изменилась» показать
пикселями нечем. Замена эталону — побайтовое сравнение собранного листа с
замороженным снимком с `origin/dev`:
длина было 14585 стало 14585 — ПОБАЙТОВО СОВПАЛО
Две находки ревью ТЗ закрыты тестами, а не формулировками:
- проверка «копии не осталось» ловила один фрагмент из пяти (`min-height: 54px`
встречается только в ряду-переключателе). Теперь цикл по всем пяти текстам;
проба — фрагмент карточки-группы, оставленный в комментарии, — краснит именно
этот цикл, а прежняя проверка была бы зелёной;
- «выход `formKitCss` остаётся байт в байт» опиралось на тесты, сравнивающие
подстроки и счётчики. Добавлены две фикстуры с полным текстом обеих форм листа
диалогов — с рядом-переключателем и без. Форма с переключателем сегодня не
используется никем, и её расхождение не поймал бы никто до первого потребителя.
Три замороженные фикстуры — осознанный долг: они удаляются на том шаге эпика,
который законно меняет вид панели. Записано рядом с фикстурой.
Issue: #597
User-Visible: no
Правка заголовочного комментария `src/furniture-art-runtime.ts` (коммит
`0565c7ad`) входит в корпус отпечатка исходников, поэтому предполёт кандидата
объявил индекс скриншотов устаревшим — строгий режим работает с #586.
Снято локально в каноническом Chromium 151.0.7922.34 через
`docs-accept --identical`: **все одиннадцать кадров совпали попиксельно**,
принят только отпечаток (047e917c). Ровно то, что предписывает ТЗ §9:
комментарий ничего не рисует, и кадры это подтверждают.
`check-docs --strict` зелёный.
Issue: #593
User-Visible: no
Приняты с полного линуксового артефакта Validate (прогон 35441152733,
`full=true` на вершине задачи, Chromium 151.0.7922.34): остальные 169 сцен
сохранены без изменений, свидетелей среды 106 при пороге 10.
Список объявленных сцен — измеренный, а не предсказанный. Прежняя редакция ТЗ
ожидала расхождения всего мебельного среза: рисунок и правда поменялся у всех 44
прежних символов (сверил `d` каждого против `origin/dev` — совпавших ноль), но
0.4.0 перерисовывает те же формы с другой точностью координат, и в пикселях
сдвиг остаётся ПОД порогом сцены 0,0005. Разошлись ровно те кадры, где видны
иконки меню:
| сцена | diffRatio | что видно |
|---|---|---|
| `furniture-categories-light` | 0,003388 | в «Технике» появились «Компьютер», «Вытяжка», «Духовка» |
| `furniture-placement-preview-light` | 0,003061 | превью размещения с новым набором |
| `tray-narrow-palette-en` | 0,002200 | та же палитра на узком вьюпорте (найдено ревью r1 M2) |
| `furniture-new-symbols-light` | новая | четыре новых предмета, каждый в своём default-размере |
Каждый кадр просмотрен глазами: в палитре прибавились три плитки, мебельные
иконки на месте и той же формы; на новой сцене видны компьютер, вытяжка, духовка
и кактус — вид сверху, к масштабу, спинкой к стене.
Сцены `furniture-variants-*`, `furniture-plan-art-dark`, `furniture-transform-*`,
`decor-over-*` и `isometric-stage3-overlays-dark` остались `passed` при
diffRatio 0,000003…0,000413 — они не объявлены намеренно: декларация утверждает
«я знаю, почему кадр другой», а они не другие.
Индекс эталонов впервые записан по схеме 2 (#571): `capturedOn: linux` — из
отчёта съёмки, `acceptedOn` — среда приёмки, рядом лежит прогон CI 35441152733.
Issue: #593
User-Visible: no
Release: v1.77.0-beta.1
Baseline-Reviewed: https://github.com/Matysh/houseplan-card/actions/runs/35441152733
Та же находка, что Medium 1 ревью, но в коде: заголовочный комментарий
`src/furniture-art-runtime.ts` до сих пор говорил «The 44 designer symbols carry
~10 KB gzip». После пакета 0.4.0 их 60, чанк весит 16 943 B gzip по манифесту
собранного бандла, а главное — исчез союз с примитивами, поэтому абзац про
`fallback` описывает поведение всей библиотеки, а не 48 предметов из 60.
Это же место читает всякий, кто разбирается, почему при отказе чанка на плане
ничего нет: раньше двенадцать предметов рисовались всегда, теперь — никто, и
сказать об этом надо там, где живёт механизм.
Бандл пересобран в трёх копиях (правка комментария меняет содержимое чанка и
его хеш).
Issue: #593
User-Visible: no
Medium 1 по делу: ТЗ §9 называло условие явно — «если там названо число 44 или
союз с примитивами», — условие сработало, а правки не было. Абзац про ленивый
граф арта (#474) до сих пор говорил «the 44 SVG drawings» и молчал о том, что
двенадцати примитивов больше нет.
Теперь там 60 и прямо сказано: библиотека состоит только из дизайнерского арта,
поэтому чанка ждут все предметы, а не 48 из 60. Это же снимает последнее место в
документации, где жило прежнее обещание «двенадцать рисуются всегда» (Q2).
Issue: #593
User-Visible: no
Встроенная библиотека мебели была смешанной: 44 предмета рисовал дизайнер, а
12 — код, прямоугольниками и эллипсами в unit box. Они выбивались из стиля, и
три категории меню (`computer`, `hood`, `oven`) вообще не открывались, потому
что вида сверху для них не было.
Пакет 0.4.0 перерисовывает все 56 существующих публичных ID и добавляет четыре
новых: `computer`, `hood`, `oven`, `cactus`. Каталог становится равен поставке:
60 символов, 32 непустые категории.
Совместимость. Ни один сохранённый план не мигрирует: положение, размер,
поворот, отражение, цвет, прозрачность и толщина линии не трогаются, а
default-размеры всех 56 прежних ID совпадают со старыми до числа — таблица
зашита в `test/furniture.test.mjs`, чтобы сдвиг было видно тестом, а не глазами.
Ловушка, ради которой примитивы удалены целиком. Библиотека собиралась союзом
каталога и `LEGACY_FURNITURE`, и обе половины несли ОДНИ И ТЕ ЖЕ публичные ID.
`BY_ID` — это `Map`, она оставляет последнюю запись, поэтому примитив молча
побеждал дизайнерский рисунок, который его заменял: задача выглядит выполненной,
12 предметов не обновились, ни один существующий тест этого не видит. Поэтому
`LEGACY_FURNITURE`, `RETAINED_IDS`, тип `Prim`, `box()` и `primitivePathD`
удалены, а на дубликаты в каталоге стоит тест и мутант.
Два продуктовых решения владельца (#593):
- `cactus` живёт в категории `plant`, а не `exercise`, как предлагал пакет:
плитка «Тренажёр» рисует тренажёр, и открывать её на кактус — врать о
содержимом палитры. `exercise` остаётся скрытой пустой категорией, непустых
становится 32, а не 33;
- при отказе ленивого чанка с рисунками не рисуется НИЧЕГО. Прежде 12
примитивов рисовались всегда, и `docs/FURNITURE.md` это обещал; обещание
снято. Это единственное место, где задача ухудшает наблюдаемое поведение, и
оно проверяется смоком, а не словом.
Бюджеты. Ревью ТЗ показало, что «бюджет ленивого графа защищён» было
заявлением без гейта: размеры печатались в отчёт и ни с чем не сравнивались.
Добавлены `lazyGraphCeilingViolation` и два настоящих потолка со своим мутантом.
Стартовый граф ушёл ниже полосы, поэтому `INITIAL_VIEW_GZIP_CEILING` опущен
292 400 → 291 400 — вторая половина храповика, без которой выигрыш отыграется.
Провенанс. Документ пакета воссоздан под 0.4.0: грант владельца, имя архива и
его SHA-256. Это единственная исполнимая защита от повторения истории #159, и
она не ослаблена — число проверок в тесте не уменьшилось, а мутант подменяет
хеш и обязан её покраснить.
Свидетели: пять новых мутантов, новая golden-сцена `furniture-new-symbols-light`
для четырёх новых ID, матрица 63 → 64. Шестой мутант правится, а не добавляется:
`furniture-placement-needs-art` ссылался на удалённое поле `g` и переставал
компилироваться — раннер честно отличал это от «пойман» и отчитывался
setup-failure. Ложь мутанта осталась прежней по смыслу, убрана только ветка про
примитив.
i18n: 7 ключей × 4 локали. `furn.cat_exercise` не добавлен — категория скрыта.
Issue: #593
User-Visible: yes
Приняты с полного линуксового артефакта Validate (прогон 35407468491,
full=true на материале ec23a351); остальные сцены сохранены без изменений.
Две пары кадров разного происхождения:
- room-temperature-dialog-desktop-en, room-temperature-dialog-mobile-ru —
объявленные AC7 сцены #594: диалог настроек комнаты собран из карточек
набора контролов, поля и их порядок соответствуют ТЗ;
- device-icon-state-table-light, device-icon-state-table-dark — долг #588,
расхождение воспроизводится на чистом dev и к #594 отношения не имеет;
принимаются здесь потому, что goldenAcceptanceRefusal запрещает приёмку
при любой неназванной разошедшейся сцене.
Issue: #594
User-Visible: no
Release: v1.76.0-beta.5
Baseline-Reviewed: https://github.com/Matysh/houseplan-card/actions/runs/35407468491
Две находки код-ревью r1 из трёх; третья — эталоны — снаружи песочницы, см.
комментарий в issue.
**Отпечаток скриншотов.** `check-docs` краснел ожидаемо: отпечаток считается от
всего `src/**`, а диф его трогает. Прогнал `npm run docs:accept -- --identical`
— все одиннадцать кадров совпали с закоммиченными **попиксельно**, поэтому
принят только отпечаток исходников (`b678af43`), ни один PNG не переснят. Это
и есть доказательство среды по правилу #334/#401: снимать можно где угодно,
принять получится лишь там, где кадры воспроизводятся.
**Свидетель полей.** Ревьюер прав: снимок черновика доказывал «пишет только
своё» для трёх полей из восьми, а перетипизированный `FILL_CHOICES` и выбор
зоны исполнимого oracle не имели вовсе. Добавлены две проверки по образцу
соседних: смена зоны меняет только `_areaSel`, смена режима заливки — только
`_roomFill`. Зона переключается на «Без зоны»: свободных зон в фикстуре может
не остаться, а этот вариант есть всегда, и имя уже заполнено, поэтому
автоподстановка имени по зоне в игру не вступает.
Issue: #594
User-Visible: no
Validate вернул задачу с красным `no-new-any`: одна строка в переработанном
диалоге комнаты, `this.host._t(k as any)`. Послабление переноса (#592) её
справедливо не покрыло — вокруг строки код действительно изменился, а блок
короче порога переносом не считается.
Причина `any` была в форме данных: пара «значение, ключ» собиралась кортежами,
и ключ, полученный конкатенацией, терял литеральный тип. Теперь варианты
заливки объявлены явно — режим остаётся значением `_roomFill`, а ключ
проверяется компилятором как настоящий `I18nKey`. Приведение не понадобилось
вовсе: долг не обоснован, а снят.
Issue: #594
User-Visible: no
Шаг 1 эпика #591. Набор поднят из редактора боковой панели — он сделан по
макетам дизайнера и уже живёт в продукте, — а не собран заново по прототипу.
Стили набора выдаёт генератор, параметризованный именами: контейнер формы,
префикс классов, карточки, футер и токены цвета. Это не украшение архитектуры,
а условие переезда панели на общий источник: тест с замороженной фикстурой
показывает, что с параметрами панели генератор отдаёт её нынешние правила
дословно — карточку, обводку фокуса, выключенное состояние и ряд-переключатель.
После этого переезд станет подстановкой, а не редизайном, и пиксели панели не
дрогнут. Сама панель в этом коммите не тронута.
Диалог комнаты собран в четыре карточки: «Основное», «Заливка», «Источники»,
«Размеры шрифтов». Порядок полей прежний, записи прежние — те же ключи
черновика, те же условия «Сохранить», тот же `hp-color-opacity` с атомарной
записью цвета и прозрачности. Пояснения уехали под «?» у заголовков групп
(решение владельца 18.09), выбор источника стал сегментированным
переключателем — под капотом это по-прежнему радиогруппа, поэтому стрелки и
скринридер работают как раньше.
Два измерения определили форму решения, и оба стоило сделать до кода.
Первое: лист набора в синхронном графе дал +1459 Б gzip и пробил потолок
initial View на 415 Б. Диалоги — инструмент администратора, во View их не
открывают, поэтому лист уехал в ленивый редакторский граф и вносится в теневой
корень при открытии диалога — тем же способом, которым это делает боковая
панель. Потолок не поднимался.
Второе: `css` с интерполяцией запрещён минификатором сборки (он намеренно
падает, чтобы не зависеть от рантайма), поэтому лист собирается `unsafeCSS`.
Цена — несжатые пробелы генератора, замерено 59 Б gzip; копия литералом стоила
бы расхождения с генератором, то есть единого источника.
Оставшийся рост initial View — 291 356 → 291 872 Б (+516) — это четыре текста
подсказок в двух встроенных локалях. Тексты сокращены до одного предложения:
подсказка под «?» и должна быть короткой.
`_renderRoomSource` переехал в модуль комнаты вместе со стабом карточки: у него
остался ровно один потребитель.
Issue: #594
User-Visible: yes
Шаг слияния конвейера считает patch-id материала и кандидата через
`git diff --full-index`, когда `dev` сдвинулся за время ревью. Дифф задачи,
пересобирающей бандл, несёт три копии `houseplan-card.js` — у #594 это
7 103 616 байт. `sh()` не задавал `maxBuffer`, умолчание `spawnSync` — 1 МиБ,
и процесс убивался по ENOBUFS на 1 027 868 байтах.
Вторая половина дефекта прятала первую: `r.error` нигде не читался, а
`status: r.status ?? 1` выдавало `null` за «git вернул 1». `must()` брал
`r.stderr || r.stdout`, stderr был пуст — и в issue уезжало
«Слияние не выполнено: diff: <огрызок диффа>». Огрызок выглядит осмысленным
и уводит разбор в сторону.
Путь исполняется только при сдвинувшемся `dev`, поэтому дефект дремал. Но
конвейер сам пушит в `dev` документ ревью на каждом раунде, так что
`devMoved` — норма, а не исключение.
Что изменено:
- `MAX_COMMAND_OUTPUT_BYTES` (256 МиБ) и явный `maxBuffer` в `sh()`;
- `sh()` называет сбой запуска в `stderr` результата вместо молчания;
- `sh()` экспортирован, у обоих пунктов есть исполнимый свидетель;
- мутант `merge-candidate-truncates-the-candidate-diff` возвращает 1 МиБ.
Issue: #596
User-Visible: no
`test/release-gate.test.mjs` строил ожидания из живого состояния репозитория, а
`localEvidence` читает `baselines.reviewedRun` из сообщения HEAD-коммита. Пока
вершиной был обычный коммит, поле оставалось `null` и всё сходилось. Как только
вершиной становился коммит приёмки эталонов, поле становилось непустым, и
`evaluateCiProof` законно требовал объявленный прогон — которого заглушка
`loadContext` не отдавала. Тест краснел на всей ветке, ради которой #573 и
писалась, и вместе с ним краснел бы `dev` сразу после слияния такой ветки.
Воспроизведено на `issue/594-form-kit-room@68bb7558`: 2776 pass / 1 fail, из-за
чего конвейер ревью не запустился вовсе.
Продуктовый код не менялся: контракт «объявленный прогон обязан существовать,
быть завершённым, не отменённым и быть Validate» — ровно то, что задумано, и он
намеренно не требует `success`, потому что приёмка эталонов по определению
ссылается на прогон, где golden покраснел.
Что изменено:
- зелёный путь теста считается на evidence с `baselines.reviewedRun: null` и
больше не зависит от того, каким коммитом оказалась вершина;
- контракт объявленного прогона вынесен в отдельный тест и проверяется с трёх
сторон: завершённый неотменённый Validate с `conclusion: 'failure'` — зелёно;
прогона нет — отказ; прогон отменён — отказ;
- мутант `declared-baseline-review-run-never-checked` обнуляет объявление и
краснеет на новом тесте.
Доказательство на фикстуре «вершина — приёмка эталонов»: старый тест 8 pass /
1 fail, новый 10 pass / 0 fail.
Issue: #595
User-Visible: no
if gh workflow run release-review.yml --repo "${{ github.repository }}" --ref dev \
-f tag="$TAG" -f candidate="$SHA"; then
echo "Независимое ревью $TAG поставлено в очередь: release-review.yml на dev" >> "$GITHUB_STEP_SUMMARY"
else
echo "::warning::ревью линии $TAG не запущено — выпуск продолжается; запустить руками: gh workflow run release-review.yml --ref dev -f tag=$TAG -f candidate=$SHA"
exit 1
fi
gate:
name:"Гейт: контракт, Validate, Full Performance и E2E на точном SHA"
<pathd="M 78.52464784,10.06903664 Q 78.5377513,9.82334385 78.5377513,9.57437515 C 78.5377513,4.28597428 74.26056466,0 68.98533141,0 L 21.01357664,0 C 15.73943534,0 11.4622487,4.28597428 11.4622487,9.57437515 Q 11.4622487,9.82334385 11.4742602,10.06903664 M 80.08614309,74.58141228 Q 80.73039638,74.68078136 81.40304049,74.68187333 C 86.15085961,74.68187333 90,70.8239505 90,66.06406212 L 90,18.19218636 C 90,13.43229799 86.15085961,9.57437515 81.40304049,9.57437515 C 80.39407433,9.57437515 79.42441853,9.74909003 78.52464784,10.06903664 A 8.61562727,8.61552274 90 0,0 72.80608097,18.19109439 L 72.80608097,18.35270565 A 9.50012133,9.50000607 90 0,1 68.98533141,19.14984227 L 21.01357664,19.14984227 A 9.50012133,9.50000607 90 0,1 17.19282707,18.35270565 M 72.80608097,18.35270565 L 72.80608097,66.06406212 A 8.61562727,8.61552274 90 0,0 80.08614309,74.58141228 M 11.4742602,10.06794467 A 8.61562727,8.61552274 90 0,1 17.19282707,18.19000243 L 17.19282707,18.35161369 L 17.19282707,66.06406212 A 8.61562727,8.61552274 90 0,1 9.91385691,74.58141228 Q 9.26960362,74.68078136 8.59695951,74.68187333 C 3.84914039,74.68187333 0,70.8239505 0,66.06406212 L 0,18.19218636 C 0,13.43229799 3.84914039,9.57437515 8.59695951,9.57437515 C 9.60592567,9.57437515 10.57448951,9.74909003 11.4742602,10.06903664 M 80.08614309,74.58141228 C 78.35539486,83.37175443 70.62217153,90 61.34383228,90 L 28.65507577,90 C 19.37782847,90 11.64460514,83.37175443 9.91385691,74.58141228"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 60.12480149,17.08328496 Q 60.12480149,16.66780357 60.06834946,16.27038659 M 51.18618701,11.38735127 L 13.81381391,11.38735127 A 5.69036465,5.69028856 0 0,1 9.79038036,9.71870864 A 5.69036465,5.69028856 0 0,1 8.12570733,5.69367564 M 8.12570733,5.69367564 A 5.69036465,5.69028856 0 0,1 9.79038036,1.66864264 A 5.69036465,5.69028856 0 0,1 13.81381391,0 M 13.81381391,0 L 51.18844509,0 M 51.18844509,0 A 5.69036465,5.69028856 0 0,1 55.21187864,1.66864264 A 5.69036465,5.69028856 0 0,1 56.87655166,5.69367564 M 56.87655166,5.69367564 A 5.69036465,5.69028856 0 0,1 55.21187864,9.71870864 A 5.69036465,5.69028856 0 0,1 51.18844509,11.38735127 M 13.81381391,11.38735127 L 10.56217696,11.38735127 A 5.69036465,5.69028856 0 0,0 4.9327805,16.26812854 M 51.18731605,11.38735127 L 54.43782395,11.38735127 A 5.69036465,5.69028856 0 0,1 60.06722042,16.26925757 M 60.12480149,44.29844483 A 4.87745542,4.87739019 0 0,0 63.57342145,42.86789464 A 4.87745542,4.87739019 0 0,0 64.99999882,39.41766756 M 64.99999882,39.41766756 L 64.99999882,21.15003484 M 64.99999882,21.15003484 A 4.87745542,4.87739019 0 0,0 63.55272454,17.68002711 A 4.87745542,4.87739019 0 0,0 60.06722042,16.27038659 M 60.12480149,44.29957385 A 4.87745542,4.87739019 0 0,1 56.67618152,42.86902366 A 4.87745542,4.87739019 0 0,1 55.24960415,39.41879658 M 55.24960415,39.41879658 L 55.24960415,21.15003484 A 4.87745542,4.87739019 0 0,1 60.06722042,16.27038659 M 46.69937964,58.31529651 L 52.00022529,58.31529651 C 52.83119917,58.31529651 53.632818,58.18997468 54.38814617,57.95739542 A 8.14038277,8.14027391 0 0,0 60.12480149,50.1795387 L 60.12480149,44.29957385 M 4.9327805,16.26925757 L 4.87519943,16.26925757 M 4.87519943,16.26925757 A 4.87745542,4.87739019 0 0,0 1.42657946,17.69980776 A 4.87745542,4.87739019 0 0,0 0.00000209,21.15003484 L 0.00000209,39.41766756 M 0.00000209,39.41766756 A 4.87745542,4.87739019 0 0,0 1.42617995,42.86862456 A 4.87745542,4.87739019 0 0,0 4.87519943,44.29957385 M 4.87519943,44.29957385 A 4.87745542,4.87739019 0 0,0 8.32308951,42.86862466 A 4.87745542,4.87739019 0 0,0 9.74926772,39.41879658 M 9.74926772,39.41879658 L 9.74926772,21.15003484 A 4.87745542,4.87739019 0 0,0 4.9327805,16.26925757 M 18.40788013,58.31416748 L 12.99977563,58.31416748 A 8.12909236,8.12898366 0 0,1 10.69653279,57.98223398 A 8.14038277,8.14027391 0 0,1 4.87519943,50.18066772 L 4.87519943,44.29844483 M 46.70050868,58.31416748 L 52.5455519,64.16590669 C 53.63959225,65.26106143 55.40654079,65.28025487 56.52429099,64.20880966 A 2.85195657,2.85191843 0 0,0 57.39975759,62.18274316 A 2.85195657,2.85191843 0 0,0 56.56719454,60.1386727 L 54.38814617,57.95739542 M 46.69937964,58.31416748 L 18.40900917,58.31416748 M 10.69766183,57.98223398 L 8.54232332,60.1386727 C 7.41554079,61.26769821 7.43586352,63.10462271 8.58522686,64.20880966 C 9.70297706,65.28025487 11.46992561,65.26106143 12.56396596,64.16590669 L 18.40900917,58.31416748"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 0.00104789,2.5 C 0.00104789,1.11888889 1.12019281,0 2.50130986,0 L 167.49973803,0 C 168.88085508,0 170,1.11888889 170,2.5 L 170,72.5 C 170,73.88111111 168.88085508,75 167.49973803,75 L 2.50026197,75 C 1.11914492,75 0,73.88111111 0,72.5 L 0.00104789,2.5 M 10.00104789,37.5 C 10.00104789,22.31222222 22.31373782,10 37.50078592,10 L 132.50026197,10 C 147.68731007,10 160,22.31222222 160,37.5 C 160,52.68777778 147.68731007,65 132.50026197,65 L 37.49973803,65 C 22.31268993,65 10,52.68777778 10,37.5 M 29.00136226,37.5 C 29.00136226,39.98555556 26.98627266,42 24.50068113,42 C 22.01508959,42 20.00104789,39.98555556 20.00104789,37.5 C 20.00104789,35.01444444 22.01613748,33 24.50068113,33 C 26.98627266,33 29.00136226,35.01444444 29.00136226,37.5"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 0.0000009,2.49992528 A 2.4978076,2.4978076 90 0,1 0.73159091,0.73159091 A 2.4978076,2.4978076 90 0,1 2.49992528,0.0000009 M 2.49992528,0.0000009 L 137.70540387,0.0000009 C 138.97230035,0.0000009 140,1.02664216 140,2.29459703 C 140,78.34754644 78.34754644,140 2.29459703,140 A 2.29671292,2.29671292 90 0,1 0.0000009,137.70540387 L 0.0000009,2.49992528 M 9.99969844,30.0001519 C 9.99969844,18.95370364 18.95370364,9.99969844 30.0001519,9.99969844 L 122.7450181,9.99969844 A 2.2543772,2.2543772 90 0,1 124.9993953,12.25407563 C 124.9993953,74.52251395 74.52251395,125.00045369 12.25513403,125.00045369 A 2.2543772,2.2543772 90 0,1 10.66067431,124.33978775 A 2.2543772,2.2543772 90 0,1 10.00075683,122.7450181 L 9.99969844,30.0001519 M 30.0001519,25.00030314 A 5.00037797,5.00037797 90 0,1 24.99977394,30.0006811 A 5.00037797,5.00037797 90 0,1 19.99939597,25.00030314 A 5.00037797,5.00037797 90 0,1 24.99977394,19.99992517 A 5.00037797,5.00037797 90 0,1 30.0001519,25.00030314"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 0,10.58300164 C 0,16.42914748 4.74612788,21.1680845 10.60206776,21.1680845 L 149.39688128,21.1680845 C 155.25177021,21.1680845 159.99894904,16.42914748 159.99894904,10.58300164 M 74.69791516,59.65815968 L 74.69791516,44.26233773 C 74.69791516,38.94794349 70.38268021,34.63981893 65.0595762,34.63981893 L 43.85438972,34.63981893 C 38.53128572,34.63981893 34.21710172,38.94794349 34.21710172,44.26233773 L 34.21710172,59.65815968 M 128.67408468,59.65815968 L 128.67408468,44.26233773 C 128.67408468,38.94794349 124.35779877,34.63981893 119.03469476,34.63981893 L 97.83055924,34.63981893 C 92.50745524,34.63981893 88.19222028,38.94794349 88.19222028,44.26233773 L 88.19222028,59.65815968 M 0,59.65815968 L 159.99894904,59.65815968 M 159.99894904,82.7513723 L 0.00105096,82.7513723 M 9.63833896,200 L 150.36166104,200 C 155.68476505,200 160,195.69187544 160,190.3774812 L 160,9.6225188 C 160,4.30812456 155.68476505,0 150.36166104,0 L 9.63833896,0 C 4.31628591,0 0.00105096,4.30812456 0.00105096,9.6225188 L 0.00105096,190.37644059 C 0.00105096,195.69083483 4.31628591,199.99895939 9.63833896,199.99895939"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 0,10.53299756 C 0,16.34997607 4.71506048,21.06599513 10.53190328,21.06599513 L 79.46700477,21.06599513 C 85.28493952,21.06599513 90,16.34997607 90,10.53299756 M 65.10670824,59.36856126 L 65.10670824,44.04670232 C 65.10670824,38.75835085 60.81969401,34.4721014 55.5313573,34.4721014 L 34.46755075,34.4721014 C 29.18030599,34.4721014 24.89329176,38.75939145 24.89329176,44.04670232 L 24.89329176,59.36752066 M 0,59.36752066 L 89.99890805,59.36752066 M 89.99890805,82.34926846 L 0,82.34926846 M 9.57425899,200 L 80.42574101,200 C 85.71298577,200 90,195.71270994 90,190.42435847 L 90,9.57564153 C 90,4.28729006 85.71298577,0 80.42574101,0 L 9.57425899,0 C 4.28592228,0 0,4.28729006 0,9.57564153 L 0,190.42435847 C 0,195.71270994 4.28592228,200 9.57425899,200"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 22.99978716,0 L 22.99978716,11.50052266 C 22.99978716,12.88035731 21.88087202,14.00019006 20.50047128,14.00019006 L 19.50074493,14.00019006 C 18.11912798,14.00019006 17.00021284,12.88149767 17.00021284,11.50052266 L 17.00021284,0 M 22.99978716,10.0009503 L 26.50004561,10.0009503 C 27.88044635,10.0009503 29.0005777,8.88111755 29.0005777,7.50014254 L 29.0005777,6.50004751 C 29.0005777,5.12021287 27.88166256,4.00038012 26.50004561,4.00038012 L 22.99978716,4.00038012 M 17.00021284,10.0009503 L 13.49995439,10.0009503 C 12.11955365,10.0009503 11.00063851,8.88111755 11.00063851,7.50014254 L 11.00063851,6.50004751 C 11.00063851,5.12021287 12.11955365,4.00038012 13.49995439,4.00038012 L 17.00021284,4.00038012 M 2.50053209,0 L 37.49946791,0 C 38.88108486,0 40,1.11869239 40,2.4996674 L 40,40.64468308 C 40,51.33441034 31.33448873,60 20.64520052,60 L 19.35601569,60 C 8.66551127,60 0,51.33441034 0,40.64582343 L 0,2.50080775 C 0,1.11869239 1.11891514,0 2.50053209,0 M 7.49916385,18.00057018 L 32.49961993,18.00057018 C 33.88123689,18.00057018 35.00015203,19.11926257 35.00015203,20.50023757 L 35.00015203,40.80661408 C 35.00015203,48.64544331 28.64544377,55.00066521 20.80695673,55.00066521 L 19.19304327,55.00066521 C 11.35455623,55.00066521 4.99984797,48.64544331 4.99984797,40.80661408 L 4.99984797,20.50137793 C 4.99984797,19.12154329 6.11876311,18.00171054 7.50038007,18.00171054 M 24.00072973,27.00142545 C 24.00072973,29.21030124 22.21046551,31.00180557 20.00182432,31.00180557 C 17.79196692,31.00180557 16.00048648,29.2114416 16.00048648,27.00142545 C 16.00048648,24.79140929 17.79196692,23.00218569 20.00182432,23.00218569 C 22.21168172,23.00218569 24.00072973,24.79254965 24.00072973,27.00142545"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 16.73872723,9.99953191 L 6.93605765,9.99953191 C 5.86579099,9.99953191 4.99984797,10.86549489 4.99984797,11.93507618 L 4.99984797,30.8060477 C 4.99984797,38.64418284 11.35455623,44.99964893 19.19304327,44.99964893 L 20.80695673,44.99964893 C 28.64544377,44.99964893 35.00015203,38.64535306 35.00015203,30.80487748 L 35.00015203,11.9362464 C 35.00015203,10.86666511 34.13299279,10.00070213 33.06515856,10.00070213 L 23.26005655,10.00070213 M 22.99857095,0.00117022 L 22.99857095,11.50092447 C 22.99857095,12.88178435 21.87965581,14.0005149 20.49925507,14.0005149 L 19.49952872,14.0005149 C 18.11791176,14.0005149 16.99899663,12.88178435 16.99899663,11.50092447 L 16.99899663,0 M 29.99908784,9.99953191 L 29.99908784,0 M 9.99847973,0 L 9.99847973,9.99953191 M 2.50053209,0 L 37.49946791,0 C 38.88108486,0 40,1.11873055 40,2.49959042 L 40,30.64455731 C 40,41.33451916 31.33448873,50 20.64520052,50 L 19.35601569,50 C 8.66551127,50 0,41.33451916 0,30.64455731 L 0,2.49959042 C 0,1.11873055 1.11891514,0 2.50053209,0 M 24.00072973,22.99833829 C 24.00072973,25.20771409 22.20924929,26.99815105 19.99939189,26.99815105 C 17.78953449,26.99815105 16.00048648,25.20771409 16.00048648,22.99833829 C 16.00048648,20.78896248 17.79075071,18.99852552 20.00060811,18.99852552 C 22.20924929,18.99852552 23.99951352,20.78896248 23.99951352,22.99833829"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 57.70667129,21.235 L 45.09910046,21.235 C 44.542709,21.235 44.00796701,21.39 43.61394659,21.66625 C 43.21992618,21.9425 42.99910155,22.31625 42.99910155,22.70625 M 47.41126422,12.41125 L 53.29342614,12.41125 M 2.4994317,0 L 97.49948583,0 C 98.88072223,0 100,1.11875 100,2.5 L 100,32.5 C 100,33.88125 98.88072223,35 97.49948583,35 L 2.50051417,35 C 1.12036025,35 0,33.88125 0,32.5 L 0,2.5 C 0,1.11875 1.12036025,0 2.50051417,0 M 57.70667129,8 L 57.70667129,25.6475 L 45.10018294,25.6475 A 2.55,2.20824628 90 0,1 43.61502906,25.00125 A 2.125,1.84020524 90 0,1 43.00018402,23.44125 L 43.00018402,10.20625 C 43.00018402,9.62125 43.22100865,9.06 43.61502906,8.64625 A 2.55,2.20824628 90 0,1 45.10018294,8 L 57.70667129,8"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 39.69311439,15.91375 L 41.35449151,13.91875 M 42.60631986,17.85625 L 44.2952946,15.68375 M 2.50034497,35 L 77.49965503,35 C 78.88064026,35 80,33.88125 80,32.5 L 80,2.5 C 80,1.11875 78.88064026,0 77.50075893,0 L 2.50034497,0 C 1.11935974,0 0,1.11875 0,2.5 L 0,32.5 C 0,33.88125 1.11935974,35 2.50034497,35 M 48.82682489,17.11875 L 47.63902304,17 A 4.25,3.75327722 90 0,1 45.63764316,16.1175 L 40.57844625,11.5925 C 39.18311025,10.3425 36.96094936,11.185 36.74237616,13.04375 C 36.53815372,14.78125 34.55333241,15.66875 33.12156755,14.6675 L 31.43038499,13.48375 C 30.36180488,12.8425 29.00179385,13.6125 29.00179385,14.85875 L 29.00179385,19.1875 C 29.00179385,21.13625 30.58037809,22.71625 32.52987443,22.71625 L 48.54753691,22.71625 C 50.09741962,22.71625 51.35366358,21.46 51.35366358,19.91 C 51.35366358,18.46875 50.26079757,17.2625 48.82682489,17.11875"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 0,2.49959042 C 0,1.11873055 1.11935974,0 2.50034497,0 L 77.49965503,0 C 78.88064026,0 80,1.11873055 80,2.49959042 L 80,47.49923936 C 80,48.88009923 78.88064026,50 77.50075893,50 L 2.50034497,50 C 1.11935974,50 0,48.88009923 0,47.49923936 L 0,2.49959042 M 35.68152339,33.34893627 C 38.46888368,35.54895031 42.53125431,35.54895031 45.3186146,33.34893627 C 48.10597489,31.14892223 48.81468194,27.37964285 46.9965503,24.41196433 L 40.50669242,14.99988298 L 34.00137988,24.41196433 C 32.18655996,27.37964285 32.8941631,31.14658179 35.68152339,33.34893627"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 55.99957664,17 L 61.62493574,17 L 67.25029484,17 M 61.62493574,17 L 61.62493574,27.96904762 M 72.03105628,17 L 77.65641537,28.25 L 83.28071608,17 M 2.4999244,45 L 137.5000756,45 C 138.88127854,45 140,43.88095238 140,42.5 L 140,2.5 C 140,1.11904762 138.88127854,0 137.5000756,0 L 2.4999244,0 C 1.11872146,0 0,1.11904762 0,2.5 L 0,42.5 C 0,43.88095238 1.11872146,45 2.4999244,45"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 41.91143767,10.29325717 L 8.08739211,10.29325717 A 5.14662859,5.14662858 90 0,1 2.94076353,5.14662859 A 5.14662859,5.14662858 90 0,1 8.08739211,0 L 41.91143767,0 A 5.14662859,5.14662858 90 0,1 47.05806625,5.14662859 A 5.14662859,5.14662858 90 0,1 41.91143767,10.29325717 M 8.08739211,10.29325717 L 5.14662867,10.29325717 A 5.14896903,5.14896902 90 0,0 0.00000009,15.44105598 L 0.00000009,42.64633596 M 0.00000009,42.64633596 A 7.35249373,7.35249371 90 0,0 2.15308186,47.84609063 A 7.35249373,7.35249371 90 0,0 7.35249381,49.99999991 M 7.35249381,49.99999991 L 42.64633597,49.99999991 M 42.64633597,49.99999991 A 7.35249373,7.35249371 90 0,0 47.84650445,47.84650445 A 7.35249373,7.35249371 90 0,0 49.99999991,42.64633596 M 49.99999991,42.64633596 L 49.99999991,15.44105598 C 49.99999991,12.59742081 47.69466605,10.29325717 44.85220111,10.29325717 L 41.91143767,10.29325717"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 41.6420124,15.95288922 C 43.22061234,18.92793522 43.95991141,23.03717335 43.95991141,26.63643725 C 43.95991141,38.43533309 34.35259503,48 22.5011905,48 C 10.64978597,48 1.04127909,38.43533309 1.04127909,26.63643725 C 1.04127909,23.03717335 1.73891074,18.91969084 3.31751068,15.94464483 M 41.6420124,15.95288922 A 4.27388672,4.22819286 0 0,1 37.67408359,14.80338609 M 41.6420124,15.95288922 A 4.28579169,4.23997056 0 0,0 43.74324083,14.80338609 M 3.47227538,15.97644461 L 3.31751068,15.94464483 A 4.28579169,4.23997056 0 0,1 1.25675917,14.80338609 M 37.67408359,14.80338609 A 21.42895847,21.19985278 0 0,0 30.71205308,10.17239603 A 21.34562363,21.11740891 0 0,0 14.28794692,10.17239603 A 21.42895847,21.19985278 0 0,0 7.32591641,14.80338609 A 4.27388672,4.22819286 0 0,1 3.47227538,15.97644461 M 37.67408359,14.80338609 A 4.27388672,4.22819286 0 0,0 40.70866221,16.0541972 A 4.27388672,4.22819286 0 0,0 43.74324083,14.80338609 M 3.47227538,15.97644461 A 4.28579169,4.23997056 0 0,1 1.25675917,14.80338609 A 4.33817359,4.29179242 0 0,1 1.25675917,8.76142805 A 30.00054185,29.67979389 0 0,1 11.00336378,2.2778064 A 29.88149208,29.56201693 0 0,1 22.5,0 A 29.88149208,29.56201693 0 0,1 33.99663622,2.2778064 A 30.00054185,29.67979389 0 0,1 43.74324083,8.76142805 A 4.33817359,4.29179242 0 0,1 43.74324083,14.80338609"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 0,2.4996674 C 0,1.11983275 1.11965812,0 2.5,0 L 117.5,0 C 118.88141026,0 120,1.11869239 120,2.4996674 L 120,57.49919225 C 120,58.88130761 118.88141026,60 117.5,60 L 2.5,60 C 1.11965812,60 0,58.88130761 0,57.5003326 L 0,2.4996674 M 106,13.00123539 L 106,6.99952485 M 106,6.99952487 A 1.00009503,1 90 0,1 106.29289321,6.29235088 A 1.00009503,1 90 0,1 106.99999999,5.99942982 M 107,5.99942982 L 113,5.99942982 A 1.00009503,1 90 0,1 113.70710678,6.29235087 A 1.00009503,1 90 0,1 114,6.99952485 L 114,13.00009503 M 114,13.00009502 A 1.00009503,1 90 0,1 113.70710679,13.707269 A 1.00009503,1 90 0,1 113.00000001,14.00019006 M 113,14.00019006 L 107,14.00019006 M 107,14.00019006 A 1.00009503,1 90 0,1 106.29289322,13.70726901 A 1.00009503,1 90 0,1 106,13.00009503 M 106,53.00161551 L 106,47.00104533 M 106,47.00104534 A 1.00009503,1 90 0,1 106.29289321,46.29387136 A 1.00009503,1 90 0,1 106.99999999,46.0009503 M 107,46.0009503 L 113,46.0009503 M 113,46.0009503 A 1.00009503,1 90 0,1 113.70710678,46.29387135 A 1.00009503,1 90 0,1 114,47.00104533 M 114,47.00104533 L 114,53.00161551 M 114,53.00161549 A 1.00009503,1 90 0,1 113.70710679,53.70878948 A 1.00009503,1 90 0,1 113.00000001,54.00171054 M 113,54.00171054 L 107,54.00171054 M 107,54.00171054 A 1.00009503,1 90 0,1 106.29289322,53.70878949 A 1.00009503,1 90 0,1 106,53.00161551 M 6,13.00123539 L 6,6.99952485 M 6,6.99952487 A 1.00009503,1 90 0,1 6.29289321,6.29235088 A 1.00009503,1 90 0,1 6.99999999,5.99942982 M 7,5.99942982 L 13,5.99942982 A 1.00009503,1 90 0,1 13.70710678,6.29235087 A 1.00009503,1 90 0,1 14,6.99952485 L 14,13.00009503 M 14,13.00009502 A 1.00009503,1 90 0,1 13.70710679,13.707269 A 1.00009503,1 90 0,1 13.00000001,14.00019006 M 13,14.00019006 L 7,14.00019006 A 1.00009503,1 90 0,1 6.29289322,13.70726901 A 1.00009503,1 90 0,1 6,13.00009503 M 6,53.00161551 L 6,47.00104533 M 6,47.00104533 A 1.00009503,1 90 0,1 6.29289322,46.29387135 A 1.00009503,1 90 0,1 7,46.0009503 M 7,46.0009503 L 13,46.0009503 M 13,46.0009503 A 1.00009503,1 90 0,1 13.70710678,46.29387135 A 1.00009503,1 90 0,1 14,47.00104533 M 14,47.00104533 L 14,53.00161551 A 1.00009503,1 90 0,1 13.70710678,53.70878949 A 1.00009503,1 90 0,1 13,54.00171054 M 13,54.00171054 L 7,54.00171054 M 7,54.00171054 A 1.00009503,1 90 0,1 6.29289322,53.70878949 A 1.00009503,1 90 0,1 6,53.00161551"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 0,30.00057018 C 0,13.43115081 13.43162393,0 30,0 L 90,0 C 106.56944444,0 120,13.43115081 120,30.00057018 C 120,46.56998955 106.56944444,60 90,60 L 30,60 C 13.43162393,60 0,46.56998955 0,30.00057018 M 82,13.00123539 L 82,6.99952485 M 82,6.99952487 A 1.00009503,1 90 0,1 82.29289321,6.29235088 A 1.00009503,1 90 0,1 82.99999999,5.99942982 M 83,5.99942982 L 89,5.99942982 A 1.00009503,1 90 0,1 89.70710678,6.29235087 A 1.00009503,1 90 0,1 90,6.99952485 L 90,13.00009503 M 90,13.00009502 A 1.00009503,1 90 0,1 89.70710679,13.707269 A 1.00009503,1 90 0,1 89.00000001,14.00019006 M 89,14.00019006 L 83,14.00019006 M 83,14.00019006 A 1.00009503,1 90 0,1 82.29289322,13.70726901 A 1.00009503,1 90 0,1 82,13.00009503 M 82,53.00047515 L 82,46.99990497 M 82,46.99990498 A 1.00009503,1 90 0,1 82.29289321,46.292731 A 1.00009503,1 90 0,1 82.99999999,45.99980994 M 83,45.99980994 L 89,45.99980994 M 89,45.99980994 A 1.00009503,1 90 0,1 89.70710678,46.29273099 A 1.00009503,1 90 0,1 90,46.99990497 M 90,46.99990497 L 90,53.00047515 M 90,53.00047513 A 1.00009503,1 90 0,1 89.70710679,53.70764912 A 1.00009503,1 90 0,1 89.00000001,54.00057018 M 89,54.00057018 L 83,54.00057018 M 83,54.00057018 A 1.00009503,1 90 0,1 82.29289322,53.70764913 A 1.00009503,1 90 0,1 82,53.00047515 M 30,13.00123539 L 30,6.99952485 M 30,6.99952487 A 1.00009503,1 90 0,1 30.29289321,6.29235088 A 1.00009503,1 90 0,1 30.99999999,5.99942982 M 31,5.99942982 L 37,5.99942982 M 37,5.99942982 A 1.00009503,1 90 0,1 37.70710678,6.29235087 A 1.00009503,1 90 0,1 38,6.99952485 L 38,13.00009503 A 1.00009503,1 90 0,1 37,13.9990497 L 31,13.9990497 A 1.00009503,1 90 0,1 30,13.00009503 M 30,53.00047515 L 30,46.99990497 M 30,46.99990497 A 1.00009503,1 90 0,1 30.29289322,46.29273099 A 1.00009503,1 90 0,1 31,45.99980994 M 31,45.99980994 L 37,45.99980994 M 37,45.99980994 A 1.00009503,1 90 0,1 37.70710678,46.29273099 A 1.00009503,1 90 0,1 38,46.99990497 M 38,46.99990497 L 38,53.00047515 A 1.00009503,1 90 0,1 37,53.99942982 L 31,53.99942982 A 1.00009503,1 90 0,1 30,53.00047515"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 0,40 A 40,40 0 0,0 40,80 A 40,40 0 0,0 80,40 A 40,40 0 0,0 40,0 A 40,40 0 0,0 0,40 M 57.94949634,25.60507796 L 53.70718918,21.3627708 A 1.00013799,1.00013799 0 0,1 53.70718918,19.94977232 L 57.94949634,15.70636125 A 1.00013799,1.00013799 0 0,1 59.36359873,15.70636125 L 63.6070098,19.94866841 A 1.00013799,1.00013799 0 0,1 63.6070098,21.3627708 L 59.36359873,25.60618187 A 1.00013799,1.00013799 0 0,1 57.95060025,25.60618187 M 57.94949634,63.86753139 L 53.70718918,59.62522423 A 1.00013799,1.00013799 0 0,1 53.70718918,58.21112184 L 57.94949634,53.96771078 A 1.00013799,1.00013799 0 0,1 59.36359873,53.96771078 L 63.60590589,58.21112184 A 1.00013799,1.00013799 0 0,1 63.60590589,59.62412033 L 59.36359873,63.86753139 A 1.00013799,1.00013799 0 0,1 57.94949634,63.86753139 M 19.94977232,25.60618187 L 15.70746516,21.36387471 A 1.00013799,1.00013799 0 0,1 15.70746516,19.94977232 L 19.94977232,15.70636125 A 1.00013799,1.00013799 0 0,1 21.36387471,15.70636125 L 25.60728577,19.94977232 A 1.00013799,1.00013799 0 0,1 25.60728577,21.3627708 L 21.36387471,25.60618187 A 1.00013799,1.00013799 0 0,1 19.95087622,25.60618187 M 19.94977232,63.86753139 L 15.70746516,59.62522423 A 1.00013799,1.00013799 0 0,1 15.70746516,58.21112184 L 19.94977232,53.96881468 A 1.00013799,1.00013799 0 0,1 21.36387471,53.96881468 L 25.60728577,58.21112184 A 1.00013799,1.00013799 0 0,1 25.60728577,59.62522423 L 21.36387471,63.86753139 A 1.00013799,1.00013799 0 0,1 19.95087622,63.86753139"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 0,10.00057016 C 0,4.47802041 4.47649573,0 10,0 L 110,0 C 115.52350427,0 120,4.47802041 120,10.00057016 L 120,49.99942984 C 120,55.52197959 115.52350427,60 110,60 L 10,60 C 4.47649573,60 0,55.52197959 0,49.99942984 L 0,10.00057016 M 106,13.00188152 L 106,7.00039911 M 106,7.00039913 A 1.00005702,1 90 0,1 106.29289321,6.29325202 A 1.00005702,1 90 0,1 106.99999999,6.00034209 M 107,6.00034209 L 113,6.00034209 A 1.00005702,1 90 0,1 113.70710678,6.29325201 A 1.00005702,1 90 0,1 114,7.00039911 L 114,13.00074121 M 114,13.00074119 A 1.00005702,1 90 0,1 113.70710679,13.70788829 A 1.00005702,1 90 0,1 113.00000001,14.00079822 M 113,14.00079822 L 107,14.00079822 M 107,14.00079822 A 1.00005702,1 90 0,1 106.29289322,13.7078883 A 1.00005702,1 90 0,1 106,13.00074121 M 106,53.00074121 L 106,47.00039911 M 106,47.00039913 A 1.00005702,1 90 0,1 106.29289321,46.29325202 A 1.00005702,1 90 0,1 106.99999999,46.00034209 M 107,46.00034209 L 113,46.00034209 M 113,46.00034209 A 1.00005702,1 90 0,1 113.70710678,46.29325201 A 1.00005702,1 90 0,1 114,47.00039911 M 114,47.00039911 L 114,53.00074121 M 114,53.00074119 A 1.00005702,1 90 0,1 113.70710679,53.70788829 A 1.00005702,1 90 0,1 113.00000001,54.00079822 M 113,54.00079822 L 107,54.00079822 M 107,54.00079822 A 1.00005702,1 90 0,1 106.29289322,53.7078883 A 1.00005702,1 90 0,1 106,53.00074121 M 6,13.00188152 L 6,7.00039911 M 6,7.00039913 A 1.00005702,1 90 0,1 6.29289321,6.29325202 A 1.00005702,1 90 0,1 6.99999999,6.00034209 M 7,6.00034209 L 13,6.00034209 A 1.00005702,1 90 0,1 13.70710678,6.29325201 A 1.00005702,1 90 0,1 14,7.00039911 L 14,13.00074121 M 14,13.00074119 A 1.00005702,1 90 0,1 13.70710679,13.70788829 A 1.00005702,1 90 0,1 13.00000001,14.00079822 M 13,14.00079822 L 7,14.00079822 M 7,14.00079822 A 1.00005702,1 90 0,1 6.29289322,13.7078883 A 1.00005702,1 90 0,1 6,13.00074121 M 6,53.00074121 L 6,47.00039911 M 6,47.00039911 A 1.00005702,1 90 0,1 6.29289322,46.29325201 A 1.00005702,1 90 0,1 7,46.00034209 M 7,46.00034209 L 13,46.00034209 M 13,46.00034209 A 1.00005702,1 90 0,1 13.70710678,46.29325201 A 1.00005702,1 90 0,1 14,47.00039911 M 14,47.00039911 L 14,53.00074121 M 14,53.00074121 A 1.00005702,1 90 0,1 13.70710678,53.7078883 A 1.00005702,1 90 0,1 13,54.00079822 M 13,54.00079822 L 7,54.00079822 M 7,54.00079822 A 1.00005702,1 90 0,1 6.29289322,53.7078883 A 1.00005702,1 90 0,1 6,53.00074121"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 14.99935186,32.00009362 L 14.99935186,29.99906385 M 18.99969753,35.99981277 L 20.99857408,35.99981277 M 14.99935186,41.9993915 L 14.99935186,39.99953192 M 9.00012963,35.99981277 L 10.99900618,35.99981277 M 3.12535108,50 L 26.87594521,50 C 28.60130493,50 30,48.60044935 30,46.8755851 L 30,3.1244149 C 30,1.39838045 28.60130493,0 26.87594521,0 L 3.12405479,0 C 1.39869507,0 0,1.39838045 0,3.1244149 L 0,46.87324471 C 0,48.59927916 1.39869507,49.99765961 3.12405479,49.99765961 M 21.99801236,14.99719154 C 21.99801236,18.86350871 18.86488355,21.99728515 14.99805557,21.99728515 C 11.13382016,21.99728515 7.99809878,18.86350871 7.99809878,14.99836173 C 7.99809878,11.13321475 11.13382016,7.99826811 14.99805557,7.99826811 C 18.86488355,7.99826811 21.99801236,11.13204456 21.99801236,14.99836173 M 20.0004321,35.99981277 C 20.0004321,38.76146789 17.76174221,41.00004681 15.00064814,41.00004681 C 12.23955408,41.00004681 10.00086419,38.76146789 10.00086419,35.99981277 C 10.00086419,33.23815765 12.23825779,30.99957873 14.99935186,30.99957873 C 17.76044592,30.99957873 19.99913581,33.23815765 19.99913581,35.99981277"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 0,2.5007596 C 0,1.11940895 1.11872146,0 2.4999244,0 L 137.5000756,0 C 138.88127854,0 140,1.11940895 140,2.5007596 L 140,67.50035981 C 140,68.88171046 138.88127854,70 137.5000756,70 L 2.4999244,70 C 1.11872146,70 0,68.88059105 0,67.50035981 L 0,2.5007596 M 6.00003024,12.99969616 L 6.00003024,6.99966418 A 1.00018144,0.99963219 0 0,1 6.2929766,6.29281747 A 1.00018144,0.99963219 0 0,1 7.00021168,6.00003198 L 13.00130031,6.00003198 A 1.00018144,0.99963219 0 0,1 14.00042336,6.99966418 L 14.00042336,12.99969616 M 14.00042336,12.99969616 A 1.00018144,0.99963219 0 0,1 13.70787328,13.70726661 A 1.00018144,0.99963219 0 0,1 13.00024192,14.00044776 M 13.00024192,14.00044776 L 7.00021168,14.00044776 A 1.00018144,0.99963219 0 0,1 6.29258032,13.70726661 A 1.00018144,0.99963219 0 0,1 6.00003024,12.99969616 M 125.99957664,13.00081557 L 125.99957664,7.00078359 M 125.99957664,7.00078359 A 1.00018144,0.99963219 0 0,1 126.29212672,6.29321313 A 1.00018144,0.99963219 0 0,1 126.99975808,6.00003198 L 133.00084671,6.00003198 M 133.00084671,6.00003198 A 1.00018144,0.99963219 0 0,1 133.70779377,6.29358707 A 1.00018144,0.99963219 0 0,1 133.99996976,7.00078359 M 133.99996976,7.00078359 L 133.99996976,13.00081557 A 1.00018144,0.99963219 0 0,1 132.99978832,14.00044776 L 126.99975808,14.00044776 A 1.00018144,0.99963219 0 0,1 125.99957664,13.00081557 M 5.99897185,63.00033582 L 5.99897185,57.00030384 M 5.99897185,57.00030384 A 1.00018144,0.99963219 0 0,1 6.29229231,56.29308288 A 1.00018144,0.99963219 0 0,1 7.00021168,56.00067165 M 7.00021168,56.00067165 L 13.00024192,56.00067165 A 1.00018144,0.99963219 0 0,1 13.707477,56.29345714 A 1.00018144,0.99963219 0 0,1 14.00042336,57.00030384 L 14.00042336,63.00033582 M 14.00042336,63.00033582 A 1.00018144,0.99963219 0 0,1 13.70787328,63.70790627 A 1.00018144,0.99963219 0 0,1 13.00024192,64.00108743 M 13.00024192,64.00108743 L 6.99915329,64.00108743 M 6.99915329,64.00108743 A 1.00018144,0.99963219 0 0,1 6.29220623,63.70753234 A 1.00018144,0.99963219 0 0,1 6.00003024,63.00033582 M 126.00063504,63.00145523 L 126.00063504,57.00142325 M 126.00063504,57.00142325 A 1.00018144,0.99963219 0 0,1 126.29318511,56.2938528 A 1.00018144,0.99963219 0 0,1 127.00081647,56.00067165 L 133.00084671,56.00067165 A 1.00018144,0.99963219 0 0,1 133.70847808,56.2938528 A 1.00018144,0.99963219 0 0,1 134.00102815,57.00142325 L 134.00102815,63.00145523 A 1.00018144,0.99963219 0 0,1 133.00084671,64.00108743 L 126.99975808,64.00108743 A 1.00018144,0.99963219 0 0,1 126.00063504,63.00145523 M 22.99993952,60.00031983 L 117.00006048,60.00031983"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 159.99894904,65.49825605 A 2.50129729,2.50128086 90 0,1 157.49871914,67.99955334 L 94.99927747,67.99955334 C 81.19178676,67.99955334 69.99908041,79.19233321 69.99908041,92.99886364 L 69.99908041,157.49870271 A 2.50129729,2.50128086 90 0,1 67.49885051,160 L 2.49917894,160 A 2.50129729,2.50128086 90 0,1 0,157.49870271 L 0,2.49814439 A 2.50129729,2.50128086 90 0,1 2.49917894,0 L 157.49871914,0 A 2.50129729,2.50128086 90 0,1 160,2.49919535 L 159.99894904,65.49825605 M 5.99992118,12.99938913 L 5.99992118,6.99837757 M 5.99992118,6.99837757 A 0.99841698,0.99841043 90 0,1 6.29272029,6.29201832 A 0.99841698,0.99841043 90 0,1 6.99938256,5.99996059 M 6.99938256,5.99996059 L 13.0003547,5.99996059 A 0.99841698,0.99841043 90 0,1 13.99876512,6.99837757 L 13.99876512,12.99938913 M 13.99876512,12.99938913 A 0.99841698,0.99841043 90 0,1 13.70670931,13.70605604 A 0.99841698,0.99841043 90 0,1 13.0003547,13.99885708 M 13.0003547,13.99885708 L 6.99938256,13.99885708 A 0.99841698,0.99841043 90 0,1 6.29234827,13.70642806 A 0.99841698,0.99841043 90 0,1 5.99992118,12.99938913 M 146.00018392,13.00044009 L 146.00018392,6.99942854 M 146.00018392,6.99942854 A 0.99841698,0.99841043 90 0,1 146.29261101,6.2923896 A 0.99841698,0.99841043 90 0,1 146.9996453,5.99996059 M 146.9996453,5.99996059 L 153.00061744,5.99996059 A 0.99841698,0.99841043 90 0,1 153.70697205,6.29276163 A 0.99841698,0.99841043 90 0,1 153.99902786,6.99942854 L 153.99902786,13.00044009 M 153.99902786,13.00044009 A 0.99841698,0.99841043 90 0,1 153.70697205,13.707107 A 0.99841698,0.99841043 90 0,1 153.00061744,13.99990804 L 146.9996453,13.99990804 A 0.99841698,0.99841043 90 0,1 146.29261101,13.70747903 A 0.99841698,0.99841043 90 0,1 146.00018392,13.00044009 M 146.00018392,61.0001248 L 146.00018392,54.99911325 M 146.00018392,54.99911325 A 0.99841698,0.99841043 90 0,1 146.29298209,54.29170176 A 0.99841698,0.99841043 90 0,1 147.00069626,53.9996453 M 147.00069626,53.9996453 L 153.00061744,53.9996453 M 153.00061744,53.9996453 A 0.99841698,0.99841043 90 0,1 153.70765173,54.29207431 A 0.99841698,0.99841043 90 0,1 154.00007882,54.99911325 L 154.00007882,61.0001248 M 154.00007882,61.0001248 A 0.99841698,0.99841043 90 0,1 153.70765173,61.70716374 A 0.99841698,0.99841043 90 0,1 153.00061744,61.99959275 M 153.00061744,61.99959275 L 146.9996453,61.99959275 A 0.99841698,0.99841043 90 0,1 146.29329069,61.70679171 A 0.99841698,0.99841043 90 0,1 146.00123488,61.0001248 M 5.99887022,152.9995205 L 5.99887022,147.00061087 M 5.99887022,147.00061087 A 0.99841698,0.99841043 90 0,1 6.29129565,146.29251931 A 0.99841698,0.99841043 90 0,1 6.99938256,146.00009196 M 6.99938256,146.00009196 L 12.99930374,146.00009196 A 0.99841698,0.99841043 90 0,1 13.70671058,146.29289205 A 0.99841698,0.99841043 90 0,1 13.99876512,147.00061087 L 13.99876512,153.00057146 M 13.99876512,153.00057146 A 0.99841698,0.99841043 90 0,1 13.70633803,153.7076104 A 0.99841698,0.99841043 90 0,1 12.99930374,154.00003941 M 12.99930374,154.00003941 L 6.9983316,154.00003941 A 0.99841698,0.99841043 90 0,1 6.29129731,153.7076104 A 0.99841698,0.99841043 90 0,1 5.99887022,153.00057146 M 55.99926433,153.00057146 L 55.99926433,147.00061087 M 55.99926433,147.00061087 A 0.99841698,0.99841043 90 0,1 56.2920625,146.29319939 A 0.99841698,0.99841043 90 0,1 56.99977667,146.00114292 M 56.99977667,146.00114292 L 62.99969785,146.00114292 A 0.99841698,0.99841043 90 0,1 63.70673214,146.29357194 A 0.99841698,0.99841043 90 0,1 63.99915923,147.00061087 L 63.99915923,153.00162243 M 63.99915923,153.00162243 A 0.99841698,0.99841043 90 0,1 63.70636012,153.70798168 A 0.99841698,0.99841043 90 0,1 62.99969785,154.00003941 M 62.99969785,154.00003941 L 56.99872571,154.00003941 M 56.99872571,154.00003941 A 0.99841698,0.99841043 90 0,1 56.29206344,153.70798168 A 0.99841698,0.99841043 90 0,1 55.99926433,153.00162243 M 109.99960589,57.99856806 L 96.36237044,57.99856806 A 36.36339751,36.36315866 90 0,0 70.64973437,68.6491606 A 36.36339751,36.36315866 90 0,0 59.99921178,94.36196557 L 59.99921178,107.9992906"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 0.00000104,2.4996673 C 0.00000104,1.1198327 1.11869337,0 2.4996683,0 L 57.49919004,0 C 58.88130533,0 59.99999766,1.11869234 59.99999766,2.4996673 L 59.99999766,57.49919 M 59.99999766,57.49919 A 2.49738658,2.49738654 90 0,1 59.26893509,59.26812834 A 2.49738658,2.49738654 90 0,1 57.5003304,59.99999766 M 57.5003304,59.99999766 L 2.50080866,59.99999766 M 2.50080866,59.99999766 A 2.49738658,2.49738654 90 0,1 0.73187035,59.26893508 A 2.49738658,2.49738654 90 0,1 0.00000104,57.50033036 M 0.00000104,57.50033036 L 0.00000104,2.4996673"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 46.03081776,41.46966756 A 2.50060665,2.50060665 0 0,0 48.53142441,43.97027421 L 87.49939335,43.97027421 A 2.50060665,2.50060665 0 0,1 89.26758927,44.70268494 A 2.50060665,2.50060665 0 0,1 90,46.47088085 L 90,87.49939335 A 2.50060665,2.50060665 0 0,1 89.26758927,89.26758927 A 2.50060665,2.50060665 0 0,1 87.49939335,90 M 87.49939335,90 L 2.50060665,90 A 2.50060665,2.50060665 0 0,1 0.73241073,89.26758927 A 2.50060665,2.50060665 0 0,1 0,87.49939335 L 0,2.50060665 A 2.50060665,2.50060665 0 0,1 2.50060665,0 L 43.53239505,0 A 2.50060665,2.50060665 0 0,1 46.0330017,2.50060665 L 46.03081776,41.46966756"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 39.41423548,6.00088937 L 51.49976243,6.00088937 C 52.88073743,6.00088937 54.00057018,7.11961991 54.00057018,8.50047979 L 54.00057018,41.50069043 C 54.00057018,42.88155031 52.88073743,44.00028085 51.49976243,44.00028085 L 8.50137793,44.00028085 C 7.12154329,44.00028085 6.00171054,42.88155031 6.00171054,41.50069043 L 6.00171054,8.50047979 C 6.00171054,7.11961991 7.12040293,6.00088937 8.50137793,6.00088937 L 20.58804523,6.00088937 M 33.00085527,0 L 33.00085527,13.50200108 C 33.00085527,14.88286095 31.88216288,16.0015915 30.50118787,16.0015915 L 29.50109284,16.0015915 C 28.1212582,16.0015915 27.00142545,14.88169073 27.00142545,13.50200108 L 27.00142545,0 M 33.00085527,9.00016383 L 36.50175805,9.00016383 C 37.8815927,9.00016383 39.00142545,7.88143329 39.00142545,6.50057341 L 39.00142545,5.50003511 C 39.00142545,4.11917523 37.8815927,3.00044468 36.50175805,3.00044468 L 33.00085527,3.00044468 M 27.00142545,9.00016383 L 23.50052266,9.00016383 C 22.12068802,9.00016383 21.00085527,7.88143329 21.00085527,6.50057341 L 21.00085527,5.50003511 C 21.00085527,4.11917523 22.12068802,3.00044468 23.50166302,3.00044468 L 27.00142545,3.00044468 M 2.4996674,50 L 57.5003326,50 C 58.88016725,50 60,48.88126945 60,47.50040958 L 60,2.50076064 C 60,1.11990077 58.88130761,0 57.5003326,0 L 2.50080775,0 C 1.11983275,0 0,1.11990077 0,2.50076064 L 0,47.50040958 C 0,48.88126945 1.11983275,50 2.4996674,50 M 33.99980994,25.99995319 C 33.99980994,28.209329 32.20944598,29.99976596 30.00057018,29.99976596 C 27.79169438,29.99976596 26.00019006,28.209329 26.00019006,25.99995319 C 26.00019006,23.79174761 27.79055402,22.00014043 30.00057018,22.00014043 C 32.21058633,22.00014043 33.99980994,23.79057739 33.99980994,25.99995319"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 0.85755013,34.41625 L 58.7307802,0.6575 M 0.85526941,0.5825 L 58.72849948,34.3425 M 2.4996674,35 L 57.49919225,35 C 58.88130761,35 60,33.88125 60,32.5 L 60,2.5 C 60,1.11875 58.88130761,0 57.5003326,0 L 2.50080775,0 C 1.11869239,0 0,1.11875 0,2.5 L 0,32.5 C 0,33.88125 1.11869239,35 2.4996674,35"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 0.09122874,29.53302228 L 29.86372655,0.78798922 M 1.00123537,58.99990268 L 58.99990394,30.00056953 M 0.55079349,0.78798922 L 30.99952431,28.00037958 M 0,29.00047456 L 58.99990394,58.99990268 M 28.18739854,0.00000104 L 2.49966735,0.00000104 C 1.11983273,0.00000104 0,1.11869337 0,2.4996683 L 0,57.49919004 C 0,58.88130533 1.11869237,59.99999766 2.49966735,59.99999766 L 57.49919125,59.99999766 M 57.49919125,59.99999766 A 2.49738663,2.49738654 0 0,0 59.26812963,59.26893509 A 2.49738663,2.49738654 0 0,0 59.99999896,57.5003304 M 59.99999896,57.5003304 L 59.99999896,31.81260022 C 59.99999896,30.43276565 58.88130659,29.31293296 57.5003316,29.31293296 L 33.1878736,29.31293296 A 2.49738663,2.49738654 0 0,1 31.41893522,28.5818704 A 2.49738663,2.49738654 0 0,1 30.68706589,26.81326571 L 30.68706589,2.50080866 M 30.68706589,2.50080866 A 2.49738663,2.49738654 0 0,0 29.9560033,0.73187035 A 2.49738663,2.49738654 0 0,0 28.18739854,0.00000104"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 2.49959042,0.00000027 L 47.49923936,0.00000027 M 47.49923936,0.00000027 A 2.50053206,2.49959042 90 0,1 49.26747323,0.73197514 A 2.50053206,2.49959042 90 0,1 50,2.50053233 L 50,37.49946767 M 50,37.49946767 A 2.50053206,2.49959042 90 0,1 49.26747323,39.26802486 A 2.50053206,2.49959042 90 0,1 47.49923936,39.99999973 M 47.49923936,39.99999973 L 2.49959042,39.99999973 A 2.50053206,2.49959042 90 0,1 0,37.49946767 L 0,2.50053233 A 2.50053206,2.49959042 90 0,1 2.49959042,0.00000027"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 16.00095257,0 L 16.00095257,3.50051819 C 16.00095257,4.88054328 14.88168691,6.00010909 13.50046546,6.00010909 L 12.50027062,6.00010909 C 11.12013163,6.00010909 10.00086597,4.88190694 10.00086597,3.50051819 L 10.00086597,0 M 90.00021649,0 L 90.00021649,3.50051819 C 90.00021649,4.88054328 88.88095083,6.00010909 87.49972938,6.00010909 L 86.49953454,6.00010909 C 85.11939555,6.00010909 83.99904743,4.88190694 83.99904743,3.50051819 L 83.99904743,0 M 2.50048711,0 L 97.49951289,0 C 98.88073434,0 100,1.11820215 100,2.4995909 L 100,22.5004091 C 100,23.88043419 98.88073434,25 97.49951289,25 L 2.50048711,25 C 1.12034812,25 0,23.88179785 0,22.5004091 L 0,2.4995909 C 0,1.11956581 1.12034812,0 2.50048711,0"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 89.9994774,17.00719477 L 89.9994774,79.3698208 M 89.9994774,17.00828672 L 89.9994774,4.25097973 M 89.9994774,17.00610281 C 89.9994774,19.35489742 88.08050309,21.25817449 85.71418617,21.25817449 L 27.85648339,21.25817449 A 11.68391551,11.18356492 90 0,1 23.53356521,20.35731185 M 89.9994774,17.00719477 C 89.9994774,19.35598937 91.91845172,21.25926645 94.28476863,21.25926645 L 152.14247142,21.25926645 C 153.68099549,21.25926645 155.14322047,20.93823176 156.46643479,20.3584038 M 89.9994774,79.3698208 C 89.9994774,85.24016937 85.20204161,90 79.28624932,90 L 27.8554382,90 C 22.35145195,90 17.81635959,85.8811468 17.21014766,80.58189054 M 89.9994774,79.3698208 C 89.9994774,85.24016937 94.7969132,90 100.71270548,90 L 152.14247142,90 C 157.64645767,90 162.18155002,85.8811468 162.78776195,80.58189054 M 89.9994774,4.25207168 C 89.9994774,1.90436903 88.07945789,0 85.71314098,0 L 27.85648339,0 C 21.93964591,0 17.14325531,4.75873867 17.14325531,10.6301792 Q 17.14325531,11.08443237 17.18088226,11.53104185 M 89.9994774,4.25207168 C 89.9994774,1.90436903 91.91845172,0 94.28476863,0 L 152.14247142,0 C 158.0593089,0 162.8556995,4.75873867 162.8556995,10.6301792 Q 162.8556995,11.08443237 162.81807255,11.53104185 A 11.68391551,11.18356492 90 0,1 167.14203592,10.6301792 L 169.28468154,10.6301792 C 175.20256421,10.6301792 180,15.38891787 180,21.25926645 L 180,70.86676939 C 180,76.73711797 175.20256421,81.49585664 169.28572673,81.49585664 L 167.14308111,81.49585664 C 165.59201473,81.49585664 164.11829262,81.16827022 162.78776195,80.58189054 C 159.04074511,78.92539523 156.42880784,75.19855377 156.42880784,70.86567744 L 156.42880784,21.2603584 Q 156.42880784,20.80501329 156.46643479,20.35949576 C 156.80089654,16.40443576 159.31772125,13.06523823 162.81807255,11.5321338 M 17.18088226,11.5321338 C 20.68227875,13.06523823 23.19910346,16.40443576 23.53356521,20.35949576 Q 23.57119216,20.80501329 23.57119216,21.2603584 L 23.57119216,70.86786135 C 23.57119216,75.19964572 20.9582097,78.92648718 17.21119286,80.58298249 A 11.68391551,11.18356492 90 0,1 12.85691889,81.49694859 L 10.71427327,81.49694859 C 4.7963906,81.49694859 0,76.73820992 0,70.86676939 L 0,21.2603584 C 0,15.39000983 4.79743579,10.63127116 10.71322808,10.63127116 L 12.85587369,10.63127116 C 14.39544296,10.63127116 15.85766794,10.95230584 17.18088226,11.5321338"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 92.54139418,17.60590034 L 92.54139418,83.62724067 M 92.54139418,17.60485243 L 92.54139418,4.40121311 M 92.54139418,17.60485243 C 92.54139418,20.03599872 90.56883033,22.00606554 88.13534854,22.00606554 L 28.64290558,22.00606554 A 11.31740513,11.1362726 90 0,1 24.19767677,21.07342752 M 92.54139418,17.60485243 C 92.54139418,20.03599872 94.51498915,22.00606554 96.94847094,22.00606554 L 163.05049792,22.00606554 C 165.48397971,22.00606554 167.45757469,20.03599872 167.45757469,17.60485243 M 92.54139418,83.62933649 C 92.54139418,89.70720221 87.609469,94.63341717 81.52473339,94.63341717 L 28.64290558,94.63341717 C 22.98299815,94.63341717 18.32019956,90.3705279 17.69636207,84.88368223 M 92.54139418,83.62933649 C 92.54139418,89.70720221 97.47435048,94.63341717 103.55805496,94.63341717 L 156.4409139,94.63341717 C 162.52461838,94.63341717 167.45757469,89.70720221 167.45757469,83.6303844 M 167.45757469,17.60694825 L 167.45757469,83.62724067 M 167.45757469,17.60485243 L 167.45757469,4.40121311 M 167.45757469,17.60485243 C 167.45757469,20.03599872 169.43116967,22.00606554 171.86362032,22.00606554 L 231.35606328,22.00606554 C 232.93782644,22.00606554 234.44225438,21.67387874 235.80232323,21.07342752 M 167.45860582,83.62828858 L 167.45860582,158.99696723 C 167.45860582,165.07378504 172.38949986,170 178.47526661,170 L 231.35606328,170 C 237.01700185,170 241.67980044,165.73711073 242.30260679,160.25026506 L 242.30260679,84.88263432 M 92.54139418,4.40121311 C 92.54139418,1.97006682 90.56883033,0 88.13534854,0 L 28.64290558,0 C 22.55920111,0 17.6262448,4.92516705 17.6262448,11.00303277 Q 17.6262448,11.47459132 17.66542798,11.93567078 M 92.54139418,4.40121311 C 92.54139418,1.97006682 94.51498915,0 96.94847094,0 L 163.05049792,0 C 165.48397971,0 167.45757469,1.97006682 167.45757469,4.40121311 C 167.45757469,1.97006682 169.43116967,0 171.86362032,0 L 231.35606328,0 C 237.43976776,0 242.3737552,4.92516705 242.3737552,11.00303277 C 242.3737552,11.31006978 242.39850247,11.6181547 242.3737552,11.91890426 M 242.30157566,84.88263432 C 243.66989359,85.49042089 245.18566403,85.82994304 246.78083197,85.82994304 L 248.98333922,85.82994304 C 255.06807483,85.82994304 260,80.90268018 260,74.82586237 L 260,22.00711345 C 260,15.92924773 255.06807483,11.00408068 248.98333922,11.00408068 L 246.78083197,11.00408068 C 241.01059294,11.00408068 236.27664595,15.4335873 235.80232323,21.07447543 Q 235.76314005,21.5355549 235.76314005,22.00711345 L 235.76314005,74.82481446 C 235.76314005,79.3098602 238.44925024,83.16720911 242.30260679,84.88158641 M 17.66645912,11.93567078 A 11.31740513,11.1362726 90 0,0 13.22019917,11.00303277 L 11.01666078,11.00303277 C 4.93295631,11.00303277 0,15.92924773 0,22.00606554 L 0,74.82586237 C 0,80.90372809 4.93192517,85.82889514 11.01666078,85.82889514 L 13.22019917,85.82889514 C 14.81433597,85.82889514 16.33010641,85.4914688 17.69739321,84.88263432 C 21.55074976,83.16825702 24.23685995,79.3109081 24.23685995,74.82586237 L 24.23685995,22.00711345 Q 24.23685995,21.5355549 24.19870791,21.07447543 C 23.85430837,16.98029933 21.26615612,13.52325123 17.66645912,11.93671869"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 85.42409676,16.16420572 L 85.42409676,79.89832688 M 85.42409676,16.16529768 L 85.42409676,4.04132442 M 85.42409676,16.16420572 C 85.42409676,18.39616117 83.60262573,20.20553014 81.35628263,20.20553014 L 26.44130873,20.20553014 C 24.98061715,20.20553014 23.59228821,19.89978282 22.33731328,19.34943764 M 85.42409676,16.16420572 C 85.42409676,18.39616117 87.24556779,20.20553014 89.49191089,20.20553014 L 150.50808911,20.20553014 C 152.75546596,20.20553014 154.57590324,18.39616117 154.57590324,16.16529768 M 85.42409676,79.89614297 C 85.42409676,85.47603159 80.87145294,89.99890805 75.25507831,89.99890805 L 26.44130873,89.99890805 C 21.21672611,89.99890805 16.91218277,86.08425037 16.3363829,81.04706325 M 85.42409676,79.89614297 C 85.42409676,85.47603159 89.97674058,89.99890805 95.59311521,89.99890805 L 144.40688479,89.99890805 C 150.02325942,89.99890805 154.57590324,85.47603159 154.57590324,79.89614297 M 154.57590324,16.16311377 L 154.57590324,79.89832688 M 154.57590324,16.16529768 L 154.57590324,4.04132442 M 154.57590324,16.16420572 C 154.57590324,18.39616117 156.39737427,20.20553014 158.64475112,20.20553014 L 213.55972502,20.20553014 C 215.0204166,20.20553014 216.40874554,19.89978282 217.66372047,19.34943764 M 154.57590324,79.89723493 C 154.57590324,85.47712355 159.12958081,90 164.74595545,90 L 213.55972502,90 C 218.78430764,90 223.08885098,86.08534233 223.66465085,81.0481552 M 85.42409676,4.04132442 C 85.42409676,1.80936897 83.60262573,0 81.35628263,0 L 26.44130873,0 C 20.8249341,0 16.27125653,4.52287645 16.27125653,10.10276507 Q 16.27125653,10.53517914 16.30743785,10.95885757 M 85.42409676,4.04132442 C 85.42409676,1.80936897 87.24556779,0 89.49191089,0 L 150.50808911,0 C 152.75546596,0 154.57590324,1.80936897 154.57590324,4.04023247 C 154.57590324,1.80936897 156.39737427,0 158.64475112,0 L 213.55972502,0 C 219.17609965,0 223.72977723,4.52287645 223.72977723,10.10276507 C 223.72977723,10.38448939 223.75251977,10.66730566 223.72977723,10.94357021 M 223.66465085,81.0481552 C 224.92582829,81.60723602 226.32552851,81.91735116 227.79759136,81.91735116 L 229.83098155,81.91735116 C 235.44735618,81.91735116 240,77.39447471 240,71.81458609 L 240,20.20553014 C 240,14.62564152 235.44735618,10.10276507 229.83098155,10.10276507 L 227.79759136,10.10276507 C 222.47066729,10.10276507 218.10099757,14.17029641 217.66372047,19.34943764 Q 217.6265054,19.77202412 217.62753915,20.20553014 L 217.62753915,71.81458609 C 217.62753915,75.93234734 220.10751021,79.47464845 223.66465085,81.0481552 M 16.30743785,10.95885757 A 11.24713362,10.64764563 90 0,0 12.20344239,10.10276507 L 10.1700522,10.10276507 C 4.55367757,10.10276507 0,14.62564152 0,20.20553014 L 0,71.81458609 C 0,77.39447471 4.55367757,81.91735116 10.1700522,81.91735116 L 12.20344239,81.91735116 C 13.67550525,81.91735116 15.07417171,81.60723602 16.3363829,81.0481552 C 19.89352354,79.47464845 22.3734946,75.93234734 22.3734946,71.81458609 L 22.3734946,20.20553014 A 9.82759248,9.30376803 90 0,0 22.33731328,19.34943764 C 22.01995141,15.58983754 19.63095053,12.41661712 16.30743785,10.95885757"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 0,2.50060665 C 0,1.11926717 1.11927063,0 2.49917894,0 L 157.49871914,0 C 158.87967841,0 160,1.11926717 160,2.50060665 L 160,87.49939335 C 160,88.88073283 158.87967841,90 157.49871914,90 L 2.49917894,90 C 1.11927063,90 0,88.88073283 0,87.49939335 L 0,2.50060665 M 142.00023647,16.99975734 L 142.00023647,10.99939335 A 1.00051234,1.00024266 0 0,1 142.99969785,10.00024266 L 149.00066999,10.00024266 A 1.00051234,1.00024266 0 0,1 149.99908041,10.99939335 L 149.99908041,16.99975734 A 1.00051234,1.00024266 0 0,1 149.00066999,18 L 142.99969785,18 A 1.00051234,1.00024266 0 0,1 142.00023647,16.99975734 M 141.99918551,78.99951468 L 141.99918551,72.99915069 A 1.00051234,1.00024266 0 0,1 142.99969785,72 L 148.99961903,72 A 1.00051234,1.00024266 0 0,1 149.99908041,72.99915069 L 149.99908041,78.99951468 A 1.00051234,1.00024266 0 0,1 148.99961903,79.99975734 L 142.99864689,79.99975734 A 1.00051234,1.00024266 0 0,1 142.00023647,78.99951468 M 9.99986863,16.99975734 L 9.99986863,10.99939335 A 1.00051234,1.00024266 0 0,1 10.99933001,9.99915069 L 17.00030215,9.99915069 A 1.00051234,1.00024266 0 0,1 17.99871258,10.99939335 L 17.99871258,16.99975734 A 1.00051234,1.00024266 0 0,1 17.00030215,17.99890803 L 10.99933001,17.99890803 A 1.00051234,1.00024266 0 0,1 9.99986863,16.99975734 M 9.99881767,79.00060665 L 9.99881767,73.00024266 A 1.00051234,1.00024266 0 0,1 10.99933001,72 L 16.99925119,72 A 1.00051234,1.00024266 0 0,1 17.99871258,73.00024266 L 17.99871258,79.00060665 A 1.00051234,1.00024266 0 0,1 16.99925119,79.99975734 L 10.99827906,79.99975734 A 1.00051234,1.00024266 0 0,1 9.99986863,79.00060665"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 0,50 C 0,22.38579779 22.38594332,0 49.99994193,0 L 129.99901287,0 C 157.61301149,0 180,22.38579779 180,50 C 180,77.61420221 157.61301149,100 129.99901287,100 L 49.99994193,100 C 22.38594332,100 0,77.61420221 0,50 M 123.99960515,16.99935051 L 123.99960515,10.99805153 A 1.00024968,1.0002165 0 0,1 124.99880964,9.99783503 L 130.99821737,9.99783503 M 130.99821737,9.99783503 A 1.00024968,1.0002165 0 0,1 131.70617646,10.29042188 A 1.00024968,1.0002165 0 0,1 131.99951224,10.99805153 M 131.99951224,10.99805153 L 131.99951224,16.99826802 A 1.00024968,1.0002165 0 0,1 130.99926256,17.99848452 L 124.99985483,17.99848452 A 1.00024968,1.0002165 0 0,1 124.29189574,17.70589767 A 1.00024968,1.0002165 0 0,1 123.99855996,16.99826802 M 123.99960515,89.00086599 L 123.99960515,83.00064949 M 123.99960515,83.00064951 A 1.00024968,1.0002165 0 0,1 124.29257149,82.29338963 A 1.00024968,1.0002165 0 0,1 124.99985482,82.00043299 M 124.99985483,82.00043299 L 130.99926256,82.00043299 A 1.00024968,1.0002165 0 0,1 131.70654589,82.29338962 A 1.00024968,1.0002165 0 0,1 131.99951224,83.00064949 L 131.99951224,89.00086599 M 131.99951224,89.00086597 A 1.00024968,1.0002165 0 0,1 131.7065459,89.70812585 A 1.00024968,1.0002165 0 0,1 130.99926257,90.00108249 M 130.99926256,90.00108249 L 124.99985483,90.00108249 A 1.00024968,1.0002165 0 0,1 124.2925715,89.70812586 A 1.00024968,1.0002165 0 0,1 123.99960515,89.00086599 M 47.99944256,17.00043299 L 47.99944256,11.0002165 M 47.99944256,11.00021648 A 1.00024968,1.0002165 0 0,1 48.29240892,10.29295662 A 1.00024968,1.0002165 0 0,1 48.99969226,10 M 48.99969225,10 L 54.99909997,10 A 1.00024968,1.0002165 0 0,1 55.70705907,10.29258685 A 1.00024968,1.0002165 0 0,1 56.00039485,11.0002165 L 56.00039485,16.99935051 M 56.00039485,16.99935052 A 1.00024968,1.0002165 0 0,1 55.70742849,17.70661039 A 1.00024968,1.0002165 0 0,1 55.00014515,17.99956701 M 55.00014517,17.99956701 L 49.00073744,17.99956701 A 1.00024968,1.0002165 0 0,1 48.29277835,17.70698015 A 1.00024968,1.0002165 0 0,1 47.99944256,16.99935051 M 47.99944256,89.00194847 L 47.99944256,83.00173198 M 47.99944256,83.00173199 A 1.00024968,1.0002165 0 0,1 48.2924089,82.29447212 A 1.00024968,1.0002165 0 0,1 48.99969223,82.00151548 M 48.99969225,82.00151548 L 54.99909997,82.00151548 A 1.00024968,1.0002165 0 0,1 55.70638331,82.29447211 A 1.00024968,1.0002165 0 0,1 55.99934966,83.00173198 L 55.99934966,89.00194847 A 1.00024968,1.0002165 0 0,1 54.99909997,90.00108249 L 48.99969225,90.00108249 M 48.99969225,90.00108249 A 1.00024968,1.0002165 0 0,1 48.29240891,89.70812586 A 1.00024968,1.0002165 0 0,1 47.99944256,89.00086599"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 0,15.00018199 C 0,6.71552153 6.71566792,0 14.99937599,0 L 144.99957305,0 C 153.28433208,0 160,6.71552153 160,15.00018199 L 160,74.99981801 C 160,83.28447847 153.28433208,90 144.99957305,90 L 14.99937599,90 C 6.71566792,90 0,83.28447847 0,74.99981801 L 0,15.00018199 M 142.0011692,16.99955109 L 142.0011692,10.9992599 A 1.00051891,1.00023052 0 0,1 143.00063715,10.00012133 L 149.0016487,10.00012133 A 1.00051891,1.00023052 0 0,1 150.00006569,10.9992599 L 150.00006569,16.99955109 A 1.00051891,1.00023052 0 0,1 149.0016487,17.99978161 L 143.00063715,17.99978161 A 1.00051891,1.00023052 0 0,1 142.0011692,16.99955109 M 142.00011823,78.99855619 L 142.00011823,72.99826501 A 1.00051891,1.00023052 0 0,1 143.00063715,71.99912644 L 149.00059774,71.99912644 A 1.00051891,1.00023052 0 0,1 150.00006569,72.99826501 L 150.00006569,78.99855619 A 1.00051891,1.00023052 0 0,1 149.00059774,79.99878672 L 142.99958618,79.99878672 A 1.00051891,1.00023052 0 0,1 142.0011692,78.99855619 M 9.99993431,16.99955109 L 9.99993431,10.9992599 A 1.00051891,1.00023052 0 0,1 10.99940226,9.99902937 L 17.00041382,9.99902937 A 1.00051891,1.00023052 0 0,1 17.9988308,10.9992599 L 17.9988308,16.99955109 A 1.00051891,1.00023052 0 0,1 17.00041382,17.99868965 L 10.99940226,17.99868965 A 1.00051891,1.00023052 0 0,1 9.99993431,16.99955109 M 9.99888335,78.99964815 L 9.99888335,72.99935696 A 1.00051891,1.00023052 0 0,1 10.99940226,71.99912644 L 16.99936285,71.99912644 A 1.00051891,1.00023052 0 0,1 17.9988308,72.99935696 L 17.9988308,78.99964815 A 1.00051891,1.00023052 0 0,1 16.99936285,79.99878672 L 10.9983513,79.99878672 A 1.00051891,1.00023052 0 0,1 9.99993431,78.99964815"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 0,55 A 55,55 90 0,0 55,110 A 55,55 90 0,0 110,55 A 55,55 90 0,0 55,0 A 55,55 90 0,0 0,55 M 82.94844112,30.60630783 L 78.70638697,26.36425368 A 0.99952125,0.99952125 90 0,1 78.41321383,25.65706553 A 0.99952125,0.99952125 90 0,1 78.70638697,24.94987738 M 78.70638697,24.94987738 L 82.94844112,20.70674848 A 0.99952125,0.99952125 90 0,1 83.65562927,20.41357533 A 0.99952125,0.99952125 90 0,1 84.36281742,20.70674848 L 88.60594632,24.94987738 M 88.60594632,24.94987738 A 0.99952125,0.99952125 90 0,1 88.89911946,25.65706553 A 0.99952125,0.99952125 90 0,1 88.60594632,26.36425368 L 84.36281742,30.60630783 A 0.99952125,0.99952125 90 0,1 83.65562927,30.89948097 A 0.99952125,0.99952125 90 0,1 82.94844112,30.60630783 M 82.94844112,89.6070797 L 78.70638697,85.3639508 A 0.99952125,0.99952125 90 0,1 78.41321383,84.65676265 A 0.99952125,0.99952125 90 0,1 78.70638697,83.9495745 L 82.94844112,79.70752035 A 0.99952125,0.99952125 90 0,1 83.65562927,79.4143472 A 0.99952125,0.99952125 90 0,1 84.36281742,79.70752035 L 88.60594632,83.9495745 A 0.99952125,0.99952125 90 0,1 88.89911946,84.65676265 A 0.99952125,0.99952125 90 0,1 88.60594632,85.3639508 L 84.36174266,89.6070797 A 0.99952125,0.99952125 90 0,1 83.65455451,89.90025284 A 0.99952125,0.99952125 90 0,1 82.94736636,89.6070797 M 24.94934,30.60738258 L 20.70728586,26.36425368 A 0.99952125,0.99952125 90 0,1 20.70728586,24.95095213 L 24.95041476,20.70782323 A 0.99952125,0.99952125 90 0,1 26.3637163,20.70782323 L 30.60684521,24.95095213 A 0.99952125,0.99952125 90 0,1 30.60684521,26.36425368 L 26.3637163,30.60738258 A 0.99952125,0.99952125 90 0,1 24.95041476,30.60738258 M 24.94934,89.29325152 L 20.70728586,85.05012262 A 0.99952125,0.99952125 90 0,1 20.41411271,84.34293447 A 0.99952125,0.99952125 90 0,1 20.70728586,83.63574632 L 24.95041476,79.39369217 A 0.99952125,0.99952125 90 0,1 26.3637163,79.39369217 L 30.60684521,83.63574632 A 0.99952125,0.99952125 90 0,1 30.90001835,84.34293447 A 0.99952125,0.99952125 90 0,1 30.60684521,85.05012262 L 26.3637163,89.29325152 A 0.99952125,0.99952125 90 0,1 24.95041476,89.29325152"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 0,50.64541922 C 0,61.33577471 8.66551127,70 19.35479948,70 L 20.64520052,70 C 31.33570495,70 40,61.33577471 40,50.64541922 L 40,2.49964019 C 40,1.11940895 38.88108486,0 37.49946791,0 L 2.50053209,0 C 1.12013135,0 0,1.11940895 0,2.5007596 L 0,50.64541922 M 4.99984797,50.80661411 C 4.99984797,58.645835 11.35455623,65.00071962 19.19304327,65.00071962 L 20.80695673,65.00071962 C 28.64544377,65.00071962 35.00015203,58.645835 35.00015203,50.80661411 L 35.00015203,31.50016791 C 35.00015203,30.11993667 33.88123689,29.00052772 32.49961993,29.00052772 L 7.50038007,29.00052772 C 6.11997932,29.00052772 4.99984797,30.11993667 4.99984797,31.50016791 L 4.99984797,50.80661411 M 36.77460549,0 C 38.55635623,0 40,1.44403755 40,3.2261366 L 40,16.77434315 C 40,18.5564422 38.55635623,20.00047975 36.77460549,20.00047975 L 3.22661072,20.00047975 C 1.44485998,20.00047975 0,18.5564422 0,16.77434315 L 0,3.2261366 C 0,1.44515696 1.44485998,0 3.22661072,0 L 36.77460549,0 M 24.99923987,51.99990405 C 24.99923987,54.76148594 22.76140959,57.00030384 20.00060811,57.00030384 C 17.23980662,57.00030384 15.00076013,54.76148594 15.00076013,51.99990405 C 15.00076013,49.23832217 17.23859041,47.00062367 19.99939189,47.00062367 C 22.76019338,47.00062367 25.00045608,49.23944157 25.00045608,51.99990405"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 0,35.64551996 C 0,46.33352214 8.66551127,55 19.35479948,55 L 20.64520052,55 C 31.33570495,55 40,46.33467598 40,35.64436612 L 40,2.49921329 C 40,1.11922294 38.88108486,0 37.49946791,0 L 2.50053209,0 C 1.12013135,0 0,1.11922294 0,2.49921329 L 0,35.64551996 M 4.99984797,35.80705729 C 4.99984797,43.64507941 11.35455623,49.99926574 19.19304327,49.99926574 L 20.80695673,49.99926574 C 28.64544377,49.99926574 35.00015203,43.64507941 35.00015203,35.80705729 L 35.00015203,12.49952798 C 35.00015203,11.11838379 33.88123689,9.99916085 32.49961993,9.99916085 L 7.50038007,9.99916085 C 6.11997932,9.99916085 4.99984797,11.11838379 4.99984797,12.49952798 L 4.99984797,35.80705729 M 24.99923987,36.99897204 C 24.99923987,39.76126041 22.76140959,41.9997063 20.00060811,41.9997063 C 17.23980662,41.9997063 15.00076013,39.76126041 15.00076013,36.99897204 C 15.00076013,34.23668366 17.23859041,31.99939161 19.99939189,31.99939161 C 22.76019338,31.99939161 25.00045608,34.2378375 25.00045608,36.99897204"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 44.11752137,9.73109561 L 2.5,9.73109561 C 1.11965812,9.73109561 0,10.850462 0,12.23118989 L 0,15.76881011 C 0,17.14821799 1.11965812,18.26758439 2.5,18.26758439 L 44.11752137,18.26758439 M 44.11752137,9.73109561 L 44.11752137,2.50009429 C 44.11752137,1.1193664 45.23717949,0 46.61752137,0 L 75.1474359,0 C 76.52777778,0 77.6474359,1.1193664 77.6474359,2.50009429 L 77.6474359,9.73109561 M 44.11752137,9.73109561 L 77.6474359,9.73109561 L 117.5,9.73109561 C 118.88141026,9.73109561 120,10.850462 120,12.23118989 L 120,15.76881011 C 120,17.14821799 118.88141026,18.26758439 117.5,18.26758439 L 77.6474359,18.26758439 M 44.11752137,18.26758439 L 44.11752137,25.49990571 C 44.11752137,26.8806336 45.23717949,28 46.61752137,28 L 75.1474359,28 C 76.52777778,28 77.6474359,26.8806336 77.6474359,25.49990571 L 77.6474359,18.26758439 M 44.11752137,18.26758439 L 77.6474359,18.26758439"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 34.42622951,13.23529412 C 33.88293401,13.23529412 33.44262295,13.63088235 33.44262295,14.11764706 C 33.44262295,14.60441176 33.88293401,15 34.42622951,15 L 34.42622951,13.23529412 M 86.49957966,15 C 87.04287516,15 87.48318621,14.60441176 87.48318621,14.11764706 C 87.48318621,13.63088235 87.0418243,13.23529412 86.49957966,13.23529412 L 86.49957966,15 M 3.44262295,0.88235294 L 3.44262295,1.76470588 L 116.55737705,1.76470588 L 116.55737705,0 L 3.44262295,0 L 3.44262295,0.88235294 M 119.01639344,3.08823529 L 118.03278689,3.08823529 L 118.03278689,5.73529412 L 120,5.73529412 L 120,3.08823529 L 119.01639344,3.08823529 M 116.55737705,7.94117647 L 116.55737705,7.05882353 L 3.44262295,7.05882353 L 3.44262295,8.82352941 L 116.55737705,8.82352941 L 116.55737705,7.94117647 M 0.98360656,5.73529412 L 1.96721311,5.73529412 L 1.96721311,3.08823529 L 0,3.08823529 L 0,5.73529412 L 0.98360656,5.73529412 M 3.44262295,7.94117647 L 3.44262295,7.05882353 C 2.62820513,7.05882353 1.96721311,6.46617647 1.96721311,5.73529412 L 0,5.73529412 C 0,7.44117647 1.54161412,8.82352941 3.44262295,8.82352941 L 3.44262295,7.94117647 M 119.01639344,5.73529412 L 118.03278689,5.73529412 C 118.03278689,6.46617647 117.37179487,7.05882353 116.55737705,7.05882353 L 116.55737705,8.82352941 C 118.45943674,8.82352941 120,7.44117647 120,5.73529412 L 119.01639344,5.73529412 M 116.55737705,0.88235294 L 116.55737705,1.76470588 C 117.37179487,1.76470588 118.03278689,2.35735294 118.03278689,3.08823529 L 120,3.08823529 C 120,1.38235294 118.45838588,0 116.55737705,0 L 116.55737705,0.88235294 M 3.44262295,0.88235294 L 3.44262295,0 C 1.54056326,0 0,1.38235294 0,3.08823529 L 1.96721311,3.08823529 C 1.96721311,2.35735294 2.62820513,1.76470588 3.44262295,1.76470588 L 3.44262295,0.88235294 M 67.86885246,7.05882353 L 66.8852459,7.05882353 L 66.8852459,14.11764706 L 68.85245902,14.11764706 L 68.85245902,7.05882353 L 67.86885246,7.05882353 M 52.13114754,14.11764706 L 53.1147541,14.11764706 L 53.1147541,7.05882353 L 51.14754098,7.05882353 L 51.14754098,14.11764706 L 52.13114754,14.11764706 M 34.42622951,14.11764706 L 34.42622951,15 L 86.49957966,15 L 86.49957966,13.23529412 L 34.42622951,13.23529412 L 34.42622951,14.11764706"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 2.49961234,45 L 237.50038766,45 A 2.5,2.49961234 90 0,0 239.2678805,44.26776695 A 2.5,2.49961234 90 0,0 240,42.5 L 240,2.5 A 2.5,2.49961234 90 0,0 239.2678805,0.73223305 A 2.5,2.49961234 90 0,0 237.50038766,0 L 2.49961234,0 A 2.5,2.49961234 90 0,0 0,2.5 L 0,42.5 M 0,42.5 A 2.5,2.49961234 90 0,0 0.7321195,44.26776695 A 2.5,2.49961234 90 0,0 2.49961234,45 M 47.72005996,38 L 47.72005996,7 M 95.71923296,38 L 95.71923296,7 M 143.71943971,38 L 143.71943971,7 M 191.71964646,38 L 191.71964646,7"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
<pathd="M 94.04437425,18.88320821 A 3.7631854,3.44913684 90 0,0 92.92392737,16.13836358 A 4.33336501,3.97173334 90 0,0 90.22105832,15.00142545 C 89.20722112,15.00142545 88.23519165,15.40967405 87.51714407,16.13836358 A 3.7631854,3.44913684 90 0,0 86.39774238,18.88320821 C 86.39774238,22.11954766 87.67810379,24.70702271 90.22105832,26.64905445 L 90.20538042,26.64905445 L 105.44429412,35.24394184 C 106.04005412,35.58034781 106.53756598,36.07184263 106.88352486,36.66939086 C 107.22948373,37.26579873 107.41134731,37.94659318 107.41134731,38.63879122 L 107.41134731,40.23643448 A 3.7631854,3.44913684 90 0,1 106.29194563,42.9812791 A 4.33336501,3.97173334 90 0,1 103.58803138,44.1193576 L 76.82272946,44.1193576 A 4.33336501,3.97173334 90 0,1 74.11986041,42.9812791 A 3.7631854,3.44913684 90 0,1 72.99941353,40.23643448 L 72.99941353,38.63993158 C 72.99941353,37.94659318 73.18127711,37.26579873 73.52723599,36.66939086 A 4.04827521,3.71043509 90 0,1 74.96646673,35.24394184 L 90.20538042,26.64905445 M 2.50010162,0 L 177.49989838,0 C 178.87955312,0 180,1.11869239 180,2.4996674 L 180,57.49919225 C 180,58.88130761 178.88059831,60 177.49989838,60 L 2.50010162,60 C 1.11940169,60 0,58.88130761 0,57.5003326 L 0,2.50194811 C 0,1.11983275 1.11835649,0.00114036 2.50010162,0.00114036"fill="none"stroke="currentColor"stroke-width="1.5"stroke-linecap="round"stroke-linejoin="round"/>
"notes":"Существующий публичный ID House Plan; меняются только рисунок и default-размер нового размещения."
},
{
"id":"tv",
@@ -695,11 +695,11 @@
"back":"top",
"file":"svg/plan/tv.svg",
"menu_icon":"tv",
"notes":"Задняя сторона экрана сверху."
"notes":"Существующий публичный ID House Plan; меняются только рисунок и default-размер нового размещения."
},
{
"id":"tv_wall",
"operation":"add",
"operation":"replace",
"name_ru":"Телевизор на кронштейне",
"name_en":"Wall-mounted TV",
"group":"appliance",
@@ -708,7 +708,7 @@
"back":"top",
"file":"svg/plan/tv_wall.svg",
"menu_icon":"tv",
"notes":"Сторона крепления к стене сверху."
"notes":"Существующий публичный ID House Plan; меняются только рисунок и default-размер нового размещения."
},
{
"id":"toilet",
@@ -721,11 +721,11 @@
"back":"top",
"file":"svg/plan/toilet.svg",
"menu_icon":"toilet",
"notes":"Сторона подключения к стене сверху."
"notes":"Существующий публичный ID House Plan; меняются только рисунок и default-размер нового размещения."
},
{
"id":"toilet_built_in",
"operation":"add",
"operation":"replace",
"name_ru":"Унитаз встроенный",
"name_en":"Built-in toilet",
"group":"sanitary",
@@ -734,7 +734,7 @@
"back":"top",
"file":"svg/plan/toilet_built_in.svg",
"menu_icon":"toilet",
"notes":"Инсталляция находится сверху."
"notes":"Существующий публичный ID House Plan; меняются только рисунок и default-размер нового размещения."
},
{
"id":"bathtub",
@@ -747,11 +747,11 @@
"back":"top",
"file":"svg/plan/bathtub.svg",
"menu_icon":"bathtub",
"notes":"Длинная задняя сторона сверху."
"notes":"Существующий публичный ID House Plan; меняются только рисунок и default-размер нового размещения."
},
{
"id":"bathtub_corner",
"operation":"add",
"operation":"replace",
"name_ru":"Ванна угловая",
"name_en":"Corner bathtub",
"group":"sanitary",
@@ -760,7 +760,7 @@
"back":"top",
"file":"svg/plan/bathtub_corner.svg",
"menu_icon":"bathtub",
"notes":"Угловая ванна; основной BACK сверху."
"notes":"Существующий публичный ID House Plan; меняются только рисунок и default-размер нового размещения."
},
{
"id":"bidet",
@@ -773,11 +773,11 @@
"back":"top",
"file":"svg/plan/bidet.svg",
"menu_icon":"bidet",
"notes":"Сторона подключения к стене сверху."
"notes":"Существующий публичный ID House Plan; меняются только рисунок и default-размер нового размещения."
},
{
"id":"bidet_built_in",
"operation":"add",
"operation":"replace",
"name_ru":"Биде встроенное",
"name_en":"Built-in bidet",
"group":"sanitary",
@@ -786,7 +786,7 @@
"back":"top",
"file":"svg/plan/bidet_built_in.svg",
"menu_icon":"bidet",
"notes":"Инсталляция находится сверху."
"notes":"Существующий публичный ID House Plan; меняются только рисунок и default-размер нового размещения."
},
{
"id":"kitchen_sink",
@@ -799,11 +799,11 @@
"back":"top",
"file":"svg/plan/kitchen_sink.svg",
"menu_icon":"kitchen_sink",
"notes":"Задняя сторона столешницы сверху."
"notes":"Существующий публичный ID House Plan; меняются только рисунок и default-размер нового размещения."
},
{
"id":"kitchen_sink_double",
"operation":"add",
"operation":"replace",
"name_ru":"Кухонная мойка двойная",
"name_en":"Double kitchen sink",
"group":"sanitary",
@@ -812,7 +812,215 @@
"back":"top",
"file":"svg/plan/kitchen_sink_double.svg",
"menu_icon":"kitchen_sink",
"notes":"Задняя сторона столешницы сверху."
"notes":"Существующий публичный ID House Plan; меняются только рисунок и default-размер нового размещения."
},
{
"id":"fridge",
"operation":"replace",
"name_ru":"Холодильник",
"name_en":"Refrigerator",
"group":"appliance",
"width_cm":60,
"depth_cm":65,
"back":"top",
"file":"svg/plan/fridge.svg",
"menu_icon":"fridge",
"notes":"Существующий публичный ID House Plan; меняются только рисунок и default-размер нового размещения."
},
{
"id":"dishwasher",
"operation":"replace",
"name_ru":"Посудомоечная машина",
"name_en":"Dishwasher",
"group":"appliance",
"width_cm":60,
"depth_cm":60,
"back":"top",
"file":"svg/plan/dishwasher.svg",
"menu_icon":"dishwasher",
"notes":"Существующий публичный ID House Plan; меняются только рисунок и default-размер нового размещения."
},
{
"id":"washer",
"operation":"replace",
"name_ru":"Стиральная машина",
"name_en":"Washing machine",
"group":"appliance",
"width_cm":60,
"depth_cm":60,
"back":"top",
"file":"svg/plan/washer.svg",
"menu_icon":"washer",
"notes":"Существующий публичный ID House Plan; меняются только рисунок и default-размер нового размещения."
},
{
"id":"dryer",
"operation":"replace",
"name_ru":"Сушильная машина",
"name_en":"Dryer",
"group":"appliance",
"width_cm":60,
"depth_cm":60,
"back":"top",
"file":"svg/plan/dryer.svg",
"menu_icon":"dryer",
"notes":"Существующий публичный ID House Plan; меняются только рисунок и default-размер нового размещения."
},
{
"id":"ac",
"operation":"replace",
"name_ru":"Кондиционер",
"name_en":"Air conditioner",
"group":"appliance",
"width_cm":90,
"depth_cm":25,
"back":"top",
"file":"svg/plan/ac.svg",
"menu_icon":"air_conditioner",
"notes":"Существующий публичный ID House Plan; меняются только рисунок и default-размер нового размещения."
},
{
"id":"water_heater",
"operation":"replace",
"name_ru":"Бойлер",
"name_en":"Water heater",
"group":"appliance",
"width_cm":45,
"depth_cm":45,
"back":"top",
"file":"svg/plan/water_heater.svg",
"menu_icon":"boiler",
"notes":"Существующий публичный ID House Plan; меняются только рисунок и default-размер нового размещения."
},
{
"id":"shower",
"operation":"replace",
"name_ru":"Душ",
"name_en":"Shower",
"group":"sanitary",
"width_cm":90,
"depth_cm":90,
"back":"top",
"file":"svg/plan/shower.svg",
"menu_icon":"shower",
"notes":"Существующий публичный ID House Plan; меняются только рисунок и default-размер нового размещения."
},
{
"id":"sink",
"operation":"replace",
"name_ru":"Раковина",
"name_en":"Sink",
"group":"sanitary",
"width_cm":60,
"depth_cm":45,
"back":"top",
"file":"svg/plan/sink.svg",
"menu_icon":"sink",
"notes":"Существующий публичный ID House Plan; меняются только рисунок и default-размер нового размещения."
},
{
"id":"stairs",
"operation":"replace",
"name_ru":"Лестница",
"name_en":"Stairs",
"group":"other",
"width_cm":100,
"depth_cm":280,
"back":"top",
"file":"svg/plan/stairs.svg",
"menu_icon":"stairs",
"notes":"Существующий публичный ID House Plan; меняются только рисунок и default-размер нового размещения."
},
{
"id":"fireplace",
"operation":"replace",
"name_ru":"Камин",
"name_en":"Fireplace",
"group":"other",
"width_cm":120,
"depth_cm":40,
"back":"top",
"file":"svg/plan/fireplace.svg",
"menu_icon":"fireplace",
"notes":"Существующий публичный ID House Plan; меняются только рисунок и default-размер нового размещения."
},
{
"id":"plant",
"operation":"replace",
"name_ru":"Растение",
"name_en":"Plant",
"group":"other",
"width_cm":40,
"depth_cm":40,
"back":"top",
"file":"svg/plan/plant.svg",
"menu_icon":"plant",
"notes":"Существующий публичный ID House Plan; меняются только рисунок и default-размер нового размещения."
},
{
"id":"rug",
"operation":"replace",
"name_ru":"Ковёр",
"name_en":"Rug",
"group":"other",
"width_cm":200,
"depth_cm":140,
"back":"top",
"file":"svg/plan/rug.svg",
"menu_icon":"rug",
"notes":"Существующий публичный ID House Plan; меняются только рисунок и default-размер нового размещения."
},
{
"id":"computer",
"operation":"add",
"name_ru":"Компьютер",
"name_en":"Computer",
"group":"appliance",
"width_cm":120,
"depth_cm":60,
"back":"top",
"file":"svg/plan/computer.svg",
"menu_icon":"computer",
"notes":"Новый ID для расширения встроенной библиотеки House Plan."
},
{
"id":"hood",
"operation":"add",
"name_ru":"Вытяжка",
"name_en":"Range hood",
"group":"appliance",
"width_cm":60,
"depth_cm":50,
"back":"top",
"file":"svg/plan/hood.svg",
"menu_icon":"hood",
"notes":"Новый ID для расширения встроенной библиотеки House Plan."
},
{
"id":"oven",
"operation":"add",
"name_ru":"Духовка",
"name_en":"Oven",
"group":"appliance",
"width_cm":60,
"depth_cm":60,
"back":"top",
"file":"svg/plan/oven.svg",
"menu_icon":"oven",
"notes":"Новый ID для расширения встроенной библиотеки House Plan."
},
{
"id":"cactus",
"operation":"add",
"name_ru":"Кактус",
"name_en":"Cactus",
"group":"other",
"width_cm":70,
"depth_cm":120,
"back":"top",
"file":"svg/plan/cactus.svg",
"menu_icon":"plant",
"notes":"Новый ID для расширения встроенной библиотеки House Plan."
}
]
}
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.