Files
shturman/docs/domains/c-shell-ux.md
T
kk0t9 d112f5397d docs(C-shell + кросс-док): ретро-ревью (6 находок) + синхронизация
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>
2026-06-21 01:06:05 +03:00

137 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Домен C — Shell / UX / лаунчер
> Лицо продукта и **UI-хост**: Wayland-композитор, который рисует home/тайлы и темы,
> и в слоты которого встраивается UI всех апов/плагинов. v0-артефакт и главный
> UX-дифференциатор («красиво и не лагает» против китайских блоков).
Статус: **v2 (на ревью).** v2 — после ретро-ревью (6 находок).
Связано с: [architecture.md](../architecture.md) (#6 хостинг UI) · [ipc.md](../contracts/ipc.md) (`Shell`, `Location`) · [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, **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 |