C-shell v2: - GPS-скорость для distraction — домен K (ru.shturman.Location), не E (E это OBD, v2); E — уточнение OBD-скорости в v2 + быстрый статус машины - механизм поверхности: Wayland slot-протокол ru.shturman.shell_slot + slot-token, не «handle по D-Bus» - fail-safe distraction при потере/устаревании скорости (консервативный дефолт, гистерезис, арбитраж GPS/OBD) - контракт статус-бара: network «unknown» до Connectivity; часы — до синка времени Кросс-док: - architecture §1 (ELM327-оговорка к «физическому» read-only), §5 (положение/GPS из Location/K, не Vehicle-Data), §7 (Perm-Broker = грантодатель, статика — прокси+sandbox), §8 (surface через Wayland slot-протокол) - ipc Shell.RegisterScreen → slot_token - dev-environment: cage → smithay/weston в журнале и списке пакетов Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
11 KiB
Домен C — Shell / UX / лаунчер
Лицо продукта и UI-хост: Wayland-композитор, который рисует home/тайлы и темы, и в слоты которого встраивается UI всех апов/плагинов. v0-артефакт и главный UX-дифференциатор («красиво и не лагает» против китайских блоков).
Статус: v2 (на ревью). v2 — после ретро-ревью (6 находок).
Связано с: architecture.md (#6 хостинг UI) · ipc.md (Shell, Location) · plugin-sdk.md (UI-вклад) · tech-stack.md (Slint) · security-privacy.md (consent UI) · principles.md (#6,#11) · домены D, E, K (GPS/Location)
1. Назначение и границы
- Что делает: хост UI + лаунчер + экраны + тема + driver-distraction; сам является Wayland-композитором.
- First-party, но с привилегированной ролью композитора (поднимается рано, Stage 1).
- Границы: не реализует логику апов (только хостит их UI); не трогает CAN/safety.
2. Композитор ⚠️ (корректировка cage)
- Shell = кастомный минимальный multi-client Wayland-композитор на
smithay(Rust, ложится на Rust-first). GPU — Panfrost/Mesa. - ⚠️
cage(значился в tech-stack/dev-env) НЕ подходит: это single-app kiosk-композитор, он не умеет хостить поверхности нескольких клиентских процессов — а наша слот-модель (решение #6) именно про это.cageостаётся лишь как инструмент раннего bring-up одного приложения. → правлю tech-stack и dev-environment. (Альтернатива smithay — wlroots, но это C-библиотека и нужны биндинги; smithay роднее.) - Объём/риск и v0: полноценный композитор — серьёзная работа, и v0 её не требует (нет сторонних плагинов, почти нет отдельных surface-апов). v0-shell стартует как Slint-приложение (home/тайлы/настройки, без внешних поверхностей); полный smithay-композитор включаем, когда придёт первый surface-ап (нав/медиа/камера) — это де-рискует v0.
3. Функции
| функция | MVP/later | зависит от | фаза |
|---|---|---|---|
| Home с крупными тайлами | MVP | — | v0 |
| Тема день/ночь (авто) | MVP | — | v0 |
| Быстрый boot / первый кадр (Stage 1) | MVP | architecture §6 | v0 |
| Slint-shell: home/тайлы/настройки (без внешних поверхностей) | MVP | — | v0 |
| Декларативный рендер тайлов/карточек | MVP | — | v0 |
| Полный smithay-композитор (мульти-клиент) + слот-поверхности | later | — | с первым surface-апом (нав/медиа) |
| Статус-бар: время, сеть (с initial «unknown») | MVP | Connectivity, время (a-base §7) | v0 |
| Статус-бар: быстрый статус машины | later | E | v2 |
| Анимации/переходы (полировка) | MVP | — | v0 |
| Экран настроек (растёт: тема/единицы v0 → голос/LLM v1 → плагины v3) | MVP | Settings | v0+ |
| Интеграция ассистента (PTT + лог диалога) | MVP | D | v1 |
| Driver-distraction режим | MVP | K (GPS speed) v1 / E (OBD speed) v2 | v1 / v2 |
| Ввод с мультируля (кнопки руля) | later | K/E | v1/v2 |
| UI управления разрешениями (review/revoke) | later | security-privacy | v3 |
| Мультидисплей · профили водителей · виджеты | later | — | later |
Статус-бар, начальный/деградированный контракт: индикатор сети на первом кадре — «unknown» (Connectivity не в Stage 1) → реактивно
GetStatus()/ConnectivityChanged;Onlineбинарный, «сервис не поднят» ≠ «offline» (не рисуем «offline» до первого ответа). Часы: до синка времени (a-base §7) — пометка неопределённости/скрыть, не показывать возможно-неверное cold-boot-значение.
4. Слот-модель (решение #6)
Слоты: home-грид, полноэкранная зона, оверлей (ассистент/уведомления), статус-бар. Ап вкладывает в слот декларативный элемент или Wayland-поверхность.
Механизм поверхности (не «handle по D-Bus»): ап подключается клиентом к Wayland-сокету
Shell (его пробрасывает bubblewrap при ui_*, security-privacy §4) и создаёт там surface;
привязка surface→слот — через приватный Wayland slot-протокол (ru.shturman.shell_slot),
не по D-Bus. RegisterScreen по D-Bus возвращает slot-token, который клиент предъявляет
в slot-протоколе; композитор сверяет peer-credentials сокета.
5. Декларативный UI-DSL (резолв отложенного вопроса)
- Констрейнт-набор, не произвольная вёрстка:
tile(icon/title/value/state/action),card, простойlist/form(для настроек) — всё data-bound. - Рендерит сам shell в Slint → единый стиль и безопасность (чужой код не исполняем).
- Что не выражается этим набором → Wayland-поверхность (ап рисует сам).
- Покрывает частые ~80% (тайлы/карточки/настройки); богатое (карта/видео) — поверхностью.
6. Тема и отклик
- День/ночь — авто (v0: по времени / GPS-восходу; датчик освещённости и сигнал машины — later, их нет на старте), токены темы.
- Крупные тач-таргеты, мгновенный отклик (принцип #11): тяжёлое — фоном, UI-поток не блокируем.
7. Driver-distraction (принцип #6)
- Выше порога скорости → упрощённый UI, приоритет голосу, блокировка сложных взаимодействий.
- Источник скорости: GPS (домен K,
ru.shturman.Location) уже в v1 (раньше OBD), уточняется OBD-скоростью (E) в v2. - Fail-safe при неизвестной/устаревшей скорости (тоннель/нет фикса GPS, stale OBD — #3): гейт по умолчанию в консервативное состояние (к безопасности), таймаут staleness + видимая пометка «скорость неизвестна».
- Гистерезис/дебаунс: раздельные пороги on/off, чтобы джиттер не мигал режимами.
- Арбитраж (v2): правило GPS vs OBD (что авторитетно, поведение при расхождении/устаревании).
- Конкретные числа порога и список блокируемого — в открытых вопросах.
8. Интеграция ассистента (D)
- Лаконично, как Grok/Tesla: всегда доступная PTT-аффорданс + оверлей диалога в отдельном слоте; не отдельное «приложение», а ткань интерфейса.
9. Ввод
- Тач + мультируль (кнопки руля, чтение из K/E) → навигация по UI без касания (важно для distraction).
10. Зависимости
- Графика: Wayland (smithay) + Panfrost/Mesa; Slint (tech-stack).
- Хостит: UI апов/плагинов (App-Host их запускает; Shell композитит).
- Данные: K (
ru.shturman.Location— GPS-скорость для distraction v1, день/ночь-восход), E (OBD-скорость уточнение v2 + быстрый статус машины), D (ассистент-UI), Settings, security-privacy (consent/permission UI), plugin-sdk (точки UI-вклада).
11. Открытые вопросы
- 🟡 Точная грамматика декларативного DSL (поля tile/card/list/form) — детализировать.
- ◻️ Пороги и политика driver-distraction (что именно блокируется и когда). → этот домен + principles #6.
- ◻️ UI управления разрешениями (review/revoke) — из security-privacy. → этот домен + Settings.
- ◻️ Источник день/ночь (время vs датчик освещённости vs сигнал машины). → реализация.
- ◻️ Мультидисплей, профили — later.
- ◻️ Контракт Location/GPS (домен K) — distraction v1 и день/ночь-восход гейтятся им; до K — мок-стаб (ipc
Location). - 🟡 Slot-протокол поверхностей (
ru.shturman.shell_slot: surface→слот, slot-token, peer-creds) — спроектировать (§4).
Журнал решений (домен C)
| Решение | Выбор | Дата |
|---|---|---|
| Композитор | кастомный multi-client на smithay (Rust); cage НЕ годится (single-app) |
2026-06-16 |
| Хостинг UI | слот-модель: декларативный элемент (рендерит shell) или Wayland-поверхность | 2026-06-16 |
| Декларативный DSL | констрейнт data-bound набор (tile/card/list/form); сложное → поверхность | 2026-06-16 |
| Тема | день/ночь авто; токены | 2026-06-16 |
| Скорость для distraction | GPS (домен K/Location) в v1, OBD (E) уточнение в v2; fail-safe при потере |
2026-06-16 |
| Поверхности | через Wayland slot-протокол ru.shturman.shell_slot + slot-token, не «handle по D-Bus» |
2026-06-16 |