From 47d53d0956e7d10c13944bd3a7edebadec1f7bc2 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sat, 20 Jun 2026 20:53:05 +0300 Subject: [PATCH] =?UTF-8?q?docs(domain=20C):=20Shell/UX=20=E2=80=94=20?= =?UTF-8?q?=D1=81=D0=BF=D0=B5=D0=BA=D0=B0=20+=20=D1=80=D0=B5=D0=B2=D1=8C?= =?UTF-8?q?=D1=8E-=D1=84=D0=B8=D0=BA=D1=81=D1=8B;=20cage=E2=86=92smithay?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - спека домена 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) --- docs/dev-environment.md | 4 +- docs/domains/c-shell-ux.md | 113 +++++++++++++++++++++++++++++++++++++ docs/tech-stack.md | 2 +- 3 files changed, 116 insertions(+), 3 deletions(-) create mode 100644 docs/domains/c-shell-ux.md diff --git a/docs/dev-environment.md b/docs/dev-environment.md index 6af60ef..72689b0 100644 --- a/docs/dev-environment.md +++ b/docs/dev-environment.md @@ -39,7 +39,7 @@ ``` 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 (как в проде) ARM64) │ @@ -53,7 +53,7 @@ L4 Реальный RK3588 (позже) сборка образа → флеш | Задача | Инструмент | Зачем | |--------|-----------|-------| | 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 без железа | | Симуляция OBD | **ELM327-emulator** + `python-can` + `can-utils` | OBD-II PID и DTC без авто | | Сборка Rust | **в VM** (та же арка) + кросс `aarch64-unknown-linux-gnu` с хоста | target-arch бинари | diff --git a/docs/domains/c-shell-ux.md b/docs/domains/c-shell-ux.md new file mode 100644 index 0000000..e8a9df0 --- /dev/null +++ b/docs/domains/c-shell-ux.md @@ -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 | diff --git a/docs/tech-stack.md b/docs/tech-stack.md index 8eb945e..8c7c8bb 100644 --- a/docs/tech-stack.md +++ b/docs/tech-stack.md @@ -36,7 +36,7 @@ | **Языки (прод)** | **Rust** | единственный шипимый рантайм | | **Языки (dev)** | Python | прототипы, Vehicle Simulator, скрипты — не в проде | | **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-аудио | | **IPC (control plane)** | **D-Bus** | низкополосное управление и события | | **Песочница** | **bubblewrap** + systemd-hardening | апы/плагины; WASM-тир — позже |