fb4e585152
Новый домен G: Connectivity-core (WiFi/LTE/tethering + BT-адаптер/паринг) + Phone-ап (HFP-звонки/контакты). Многоагентный adversarial-ревью: 24 находки, 15 подтверждено (default-refute; tech-измерение — 0, техника устояла), все применены. Ключевое из ревью: - BT-шов резолвнут двунаправленно: владелец BlueZ — Connectivity-core (G §3 ↔ H §6/§15 ✅). - Граница голоса: только HFP спаренного телефона; встроенный модем — data-only (VoLTE/eCall вне скоупа). - SIM PIN/PUK-флоу (sim_locked/no_sim) + captive-portal детект (portal/limited, не ложный online) — модем v1. - Connectivity поднимается на Stage 2 (синхр. с architecture §6). - Мультипаринг: ровно один active-телефон для HFP/PBAP (Dial/CallStateChanged однозначны). - SCO-loss mid-call → CallState=audio_lost + снятие роли phone_call → H раскорчивает медиа (не залипает). - Входящий-оверлей не перекрывает реверс-вид (z-order overlay-слота → C); tethering-петля AP+tether запрещена. - PBAP-синк фоновый; отказ-пути паринга/no_service симметрично J/H. Кросс-док: H §6/§15 (BlueZ ✅) + якоря D §147/§148→§10; architecture §3 (Connectivity+BT) /§6 (Stage 2); ipc §3 (Type+tether, State enum, CallState=audio_lost); security-privacy §7 (контакты/журнал/SMS local-first); hardware §4 (Bluetooth); tech-stack (NM/MM/BlueZ); C §11 (z-order overlay). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
141 lines
12 KiB
Markdown
141 lines
12 KiB
Markdown
# Домен 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 сокета. Гейтится capability `ui_screens` (тайлы — `ui_tiles`; plugin-sdk §4.1).
|
||
|
||
## 5. Декларативный UI-DSL *(резолв отложенного вопроса)*
|
||
|
||
- **Констрейнт-набор, не произвольная вёрстка:** `tile` (icon/title/value/state/action),
|
||
`card`, простой `list`/`form` (для настроек) — всё **data-bound**.
|
||
- Рендерит **сам shell** в Slint → единый стиль и безопасность (чужой код не исполняем).
|
||
- Что не выражается этим набором → **Wayland-поверхность** (ап рисует сам).
|
||
- Покрывает частые ~80% (тайлы/карточки/настройки); богатое (карта/видео) — поверхностью.
|
||
|
||
## 6. Тема и отклик
|
||
|
||
- День/ночь — **авто** (v0: **по времени** (RTC/NTP/fake-hwclock, a-base §7); **GPS-восход — v1**
|
||
(после поднятия домена K); датчик освещённости и сигнал машины — later), токены темы.
|
||
- Крупные тач-таргеты, **мгновенный отклик** (принцип #11): тяжёлое — фоном, UI-поток не блокируем.
|
||
|
||
## 7. Driver-distraction (принцип #6)
|
||
|
||
- Выше порога скорости → **упрощённый UI**, приоритет голосу, блокировка сложных взаимодействий.
|
||
- **Источник скорости:** **GPS (домен K, `ru.shturman.Location`) уже в v1** (раньше OBD),
|
||
уточняется OBD-скоростью (E) в v2. C потребляет **занулённую/quality-флагнутую `Speed`** от K §2
|
||
(не сырой Doppler-шум на стоянке) — это source-level фикс, ортогональный гистерезису ниже.
|
||
- **Fail-safe при неизвестной/устаревшей скорости** (тоннель/нет фикса GPS, stale OBD — #3):
|
||
гейт по умолчанию в **консервативное состояние** (к безопасности), таймаут staleness +
|
||
видимая пометка «скорость неизвестна».
|
||
- **Гистерезис/дебаунс:** раздельные пороги on/off, чтобы джиттер не мигал режимами.
|
||
- **Арбитраж (v2):** правило GPS vs OBD (что авторитетно, поведение при расхождении/устаревании).
|
||
- Конкретные числа порога и список блокируемого — в открытых вопросах.
|
||
|
||
## 8. Интеграция ассистента (D)
|
||
|
||
- Лаконично, **как Grok/Tesla**: всегда доступная PTT-аффорданс + оверлей диалога в
|
||
отдельном слоте; не отдельное «приложение», а ткань интерфейса.
|
||
|
||
## 9. Ввод
|
||
|
||
- Тач + **мультируль**: K нормализует кнопки (ADC-лесенка / проксированные CAN из E) в **uinput** →
|
||
композитор Shell маршрутизирует их фокусом (штатный Wayland-input), не «Shell сам потребляет».
|
||
Навигация по UI без касания; часть руль-действий сама гейтится distraction-режимом (K §3).
|
||
|
||
## 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.
|
||
- ◻️ **Источник день/ночь** (v0 время; **GPS-восход v1**; датчик освещённости / сигнал машины — later). → реализация + домен K.
|
||
- ◻️ **Мультидисплей, профили** — later.
|
||
- ✅ **Контракт Location/GPS** — в [k-sensors §2](k-sensors-peripherals.md) (QoS, FixQuality, zero-clamp скорости у нуля; C потребляет занулённую `Speed`). Арбитраж GPS-vs-OBD (v2) — открыт.
|
||
- ◻️ **Какие руль-действия гейтятся в distraction** — парный с K §10.
|
||
- ◻️ **Z-order overlay-слота** (входящий-вызов G §6 vs реверс-вид J §6 vs ассистент/уведомления) — правило «вид манёвра > уведомление». → §4 + G/J.
|
||
- 🟡 **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 |
|