Files
houseplan-card/docs/specs/006-vacuum-xcme-path.md
T
Claudeandclaude[bot] c081f59a15 chore(hygiene): убрать мёртвые скрипты и старый архив, разовые документы — в legacy/ (#678)
Волна 1 эпика #674 — мёртвое без риска, каждое имя проверено git grep по
текущему dev.

Удалено: шесть demo/shot_*.mjs без читателей (shot_furniture ещё и не
работает с #159), demo/capture_wall_strip_backup.mjs,
demo/benchmark_coordinate_write_barrier.mjs (нигде не запускался, но входил
в манифест smoke через demo/benchmark_*.mjs — теперь лист покрытия чист),
scripts/dev/styles-split.mjs (падает на текущем src/styles.ts),
docs/README.ru.md (индекс четырёх документов из 38 — роль у README.ru.md),
demo/README.md (одна строка в карте пакета AGENTS.md вместо него) и из
legacy/ — снимок аудита v1.58.0, черновик 089, завершённые планы,
продуктовые снимки и две разовые диагностики; история git хранит.
legacy/docs/SUN-CONTRAST.md остаётся: на него ссылаются src/sun.ts и SUN.md.

Перенесено в legacy/docs/: superpowers/specs (11 дизайн-документов до
процесса), QUALITY-560.md, ROADMAP.md, STATUS-FEATURES.md. Ссылки
поправлены там, где они были: FILTERING.md, ТЗ 006/007/058, testing-notes,
комментарии src/open-spans.ts и validation.py (только путь документа),
SCOPE.md, STATUS.md, smoke_household_journeys.mjs, опись legacy/README.md;
ложный маркер benchmark_coordinate_write_barrier снят с чек-листа.

Issue: #678
User-Visible: no
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018qZfe7YS4rqEMKoVeS3GKd
2026-09-27 16:23:39 +00:00

3.5 KiB

ТЗ #6 — XCME: многосегментный путь без ложных перемычек

  • Issue: https://github.com/Matysh/houseplan-card/issues/6
  • Приоритет: P1
  • Статус ТЗ: реализовано по HP-VAC-02 rev.7; целевой gate v1.61.0-beta.1 пройден, ожидается публикация
  • Родительский контракт: legacy/docs/superpowers/specs/2026-08-09-vacuum-integration-coverage-design.md, §4.1

Цель

Корректно принимать Xiaomi Cloud Map Extractor attributes.path.path как набор независимых траекторий. Разрыв между подмаршрутами не должен превращаться в нарисованный переезд робота.

Требования

  1. Канонический тип frontend — VacPath = Pt[][], где каждая внутренняя последовательность является отдельным drawable subpath.
  2. Парсер принимает плоский legacy path, path.points и path.path.
  3. Невалидные точки отбрасываются; subpath короче двух валидных точек не участвует в отображении и арбитраже источников.
  4. Сначала фильтруются недорисовываемые сегменты, затем остаются последние 64.
  5. Общий бюджет — 4000 точек. У каждого subpath сохраняются обе крайние точки; остаток распределяется largest-remainder, при равенстве выигрывает более старый из оставшихся subpath.
  6. Рендер формирует один SVG path с отдельной командой M на каждый subpath, без L между ними.
  7. Один resolver выбирает drawable integration path, затем server trail, затем локальный runtime trail. Пустой/одноточечный integration path не блокирует следующий источник.
  8. При скрытии terminal target изменяется только последний drawable subpath.

Совместимость и ограничения

  • Сохранённый server trail и формат backend не мигрируют.
  • Dreame/Valetudo integration path не заявляется без подтверждённого формата.
  • Никаких CSS-фильтров или соединительных пунктирных линий между subpath.

Проверки

  • unit: все поддерживаемые формы, невалидные точки, cap после фильтрации;
  • unit: точный бюджет, сохранение концов и old→new tie-break;
  • unit: drawable arbitration и обрезка последнего target;
  • browser: несколько M, отсутствие моста между удалёнными сегментами;
  • performance: 64/4000 остаются в текущем render budget.

Приёмка

  • XCME history виден полностью в пределах бюджета;
  • визуальных перемычек между разрывами нет;
  • fallback trail появляется, если integration path не рисуем;
  • flat legacy path выглядит как до изменения.