docs(domain C): Shell/UX — спека + ревью-фиксы; cage→smithay

- спека домена C: композитор, слот-модель, декларативный UI-DSL (резолв вопроса),
  тема, driver-distraction, интеграция ассистента, ввод
- КОРРЕКЦИЯ: shell = кастомный multi-client композитор на smithay (Rust); cage
  (single-app kiosk) не годится для мульти-поверхностной слот-модели → правка
  в tech-stack и dev-environment
- ревью-де-риск v0: shell стартует как Slint-ап без внешних поверхностей, полный
  smithay-композитор — с первым surface-апом
- ревью-фазинг: статус машины в статус-баре → v2; distraction по GPS-скорости в v1
  (раньше OBD); день/ночь v0 по времени/GPS; настройки растут с фичами

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-20 20:53:05 +03:00
parent a8895ab99f
commit 47d53d0956
3 changed files with 116 additions and 3 deletions
+2 -2
View File
@@ -39,7 +39,7 @@
``` ```
L1 Mac host редактор · git · Rust-тулчейн · НАТИВНЫЙ Slint (быстрый UI) · justfile · Lima L1 Mac host редактор · git · Rust-тулчейн · НАТИВНЫЙ Slint (быстрый UI) · justfile · Lima
L2 Linux dev-VM systemd · D-Bus · SocketCAN(vcan) · PipeWire · Wayland(cage) L2 Linux dev-VM systemd · D-Bus · SocketCAN(vcan) · PipeWire · Wayland(shell/smithay)
(Lima, vz, ← интегрированный стек; сервисы = systemd-юниты + bubblewrap (как в проде) (Lima, vz, ← интегрированный стек; сервисы = systemd-юниты + bubblewrap (как в проде)
ARM64) ARM64)
@@ -53,7 +53,7 @@ L4 Реальный RK3588 (позже) сборка образа → флеш
| Задача | Инструмент | Зачем | | Задача | Инструмент | Зачем |
|--------|-----------|-------| |--------|-----------|-------|
| Linux dev-VM | **Lima** (vz-backend) | нативная ARM64-виртуализация, open-source, scriptable YAML | | Linux dev-VM | **Lima** (vz-backend) | нативная ARM64-виртуализация, open-source, scriptable YAML |
| Итерация UI | **нативный Slint на macOS** + `cage`/`weston` в VM | гибрид: быстрый дизайн-цикл + проверка реального Wayland | | Итерация UI | **нативный Slint на macOS** + shell-композитор (`smithay`), вложенно в `weston`, в VM | гибрид: быстрый дизайн-цикл + проверка реального Wayland |
| Виртуальный CAN | **SocketCAN `vcan`** (в VM) | тест Vehicle-Data без железа | | Виртуальный CAN | **SocketCAN `vcan`** (в VM) | тест Vehicle-Data без железа |
| Симуляция OBD | **ELM327-emulator** + `python-can` + `can-utils` | OBD-II PID и DTC без авто | | Симуляция OBD | **ELM327-emulator** + `python-can` + `can-utils` | OBD-II PID и DTC без авто |
| Сборка Rust | **в VM** (та же арка) + кросс `aarch64-unknown-linux-gnu` с хоста | target-arch бинари | | Сборка Rust | **в VM** (та же арка) + кросс `aarch64-unknown-linux-gnu` с хоста | target-arch бинари |
+113
View File
@@ -0,0 +1,113 @@
# Домен C — Shell / UX / лаунчер
> Лицо продукта и **UI-хост**: Wayland-композитор, который рисует home/тайлы и темы,
> и в слоты которого встраивается UI всех апов/плагинов. v0-артефакт и главный
> UX-дифференциатор («красиво и не лагает» против китайских блоков).
Статус: **v1 (на ревью).**
Связано с: [architecture.md](../architecture.md) (#6 хостинг UI) · [ipc.md](../contracts/ipc.md) (`Shell`) · [plugin-sdk.md](../contracts/plugin-sdk.md) (UI-вклад) · [tech-stack.md](../tech-stack.md) (Slint) · [security-privacy.md](../contracts/security-privacy.md) (consent UI) · [principles.md](../principles.md) (#6,#11) · домены D, E
---
## 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-апом (нав/медиа) |
| Статус-бар: время, сеть | **MVP** | Connectivity | v0 |
| Статус-бар: быстрый статус машины | later | E | v2 |
| Анимации/переходы (полировка) | **MVP** | — | v0 |
| Экран настроек (растёт: тема/единицы v0 → голос/LLM v1 → плагины v3) | **MVP** | Settings | v0+ |
| Интеграция ассистента (PTT + лог диалога) | **MVP** | D | v1 |
| Driver-distraction режим | **MVP** | GPS(speed)→E | v1 (GPS) / v2 (OBD) |
| Ввод с мультируля (кнопки руля) | later | K/E | v1/v2 |
| UI управления разрешениями (review/revoke) | later | security-privacy | v3 |
| Мультидисплей · профили водителей · виджеты | later | — | later |
## 4. Слот-модель (решение #6)
Слоты: **home-грид**, **полноэкранная зона**, **оверлей** (ассистент/уведомления),
**статус-бар**. Ап вкладывает в слот **декларативный элемент** или **Wayland-поверхность**.
## 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 уже в v1** (раньше, чем OBD), уточняется
OBD-скоростью (E) в v2. Конкретные пороги/что блокируется — в открытых вопросах.
## 8. Интеграция ассистента (D)
- Лаконично, **как Grok/Tesla**: всегда доступная PTT-аффорданс + оверлей диалога в
отдельном слоте; не отдельное «приложение», а ткань интерфейса.
## 9. Ввод
- Тач + **мультируль** (кнопки руля, чтение из K/E) → навигация по UI без касания
(важно для distraction).
## 10. Зависимости
- **Графика:** Wayland (smithay) + Panfrost/Mesa; **Slint** (tech-stack).
- **Хостит:** UI апов/плагинов (App-Host их запускает; Shell композитит).
- **Данные:** E (speed для distraction, быстрый статус), 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.
---
## Журнал решений (домен 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 |
+1 -1
View File
@@ -36,7 +36,7 @@
| **Языки (прод)** | **Rust** | единственный шипимый рантайм | | **Языки (прод)** | **Rust** | единственный шипимый рантайм |
| **Языки (dev)** | Python | прототипы, Vehicle Simulator, скрипты — не в проде | | **Языки (dev)** | Python | прототипы, Vehicle Simulator, скрипты — не в проде |
| **UI** | **Slint** | декларативный, GPU-ускоренный, Rust-native | | **UI** | **Slint** | декларативный, GPU-ускоренный, Rust-native |
| **Графика** | **Wayland** (`cage` kiosk) · Panfrost/Mesa | один композитор — shell | | **Графика** | **Wayland** — shell = кастомный композитор на `smithay` (Rust) · Panfrost/Mesa | `cage` не годится (single-app) — только ранний bring-up |
| **Аудио/видео plane** | **PipeWire** + WirePlumber | микрофон, TTS, медиа, BT-аудио | | **Аудио/видео plane** | **PipeWire** + WirePlumber | микрофон, TTS, медиа, BT-аудио |
| **IPC (control plane)** | **D-Bus** | низкополосное управление и события | | **IPC (control plane)** | **D-Bus** | низкополосное управление и события |
| **Песочница** | **bubblewrap** + systemd-hardening | апы/плагины; WASM-тир — позже | | **Песочница** | **bubblewrap** + systemd-hardening | апы/плагины; WASM-тир — позже |