c66ccf08ea
- data-model: структура DTC-кода исправлена (буква + 2-битная категория + 3 hex, не «4 hex»; P0/P2 generic, P1/P3000-33FF производитель); module_voltage путь → Vehicle.OBD.ControlModuleVoltage (был неверный LowVoltageBattery) - plugin-sdk: пример id → dev.example.* (ru.shturman.* зарезервирован); i18n строк манифеста (per-locale, ru обязателен); ui_screens capability + гейт RegisterScreen - hardware: камера «фаза 2» → v2; требования к MCU-копилоту (обновляемость прошивки, fail-safe при его отказе, позиция в цепочке доверия) - tech-stack: карты «фаза 2» → v4 (нормализация фазовой номенклатуры) - C-shell: день/ночь v0 = время, GPS-восход v1 (был конфликт фаз); ui_screens-гейтинг Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
86 lines
5.4 KiB
Markdown
86 lines
5.4 KiB
Markdown
# Технический стек
|
||
|
||
> Канонический список технологий Штурмана с обоснованием — источник правды по
|
||
> «на чём пишем». Архитектурные *решения* — в [architecture.md](architecture.md);
|
||
> здесь — конкретные технологии и крейты.
|
||
|
||
Статус: **v1 (на ревью).**
|
||
Связано с: [architecture.md](architecture.md) · [principles.md](principles.md) (#11 отзывчивость, #12 лицензии) · [dev-environment.md](dev-environment.md)
|
||
|
||
---
|
||
|
||
## Язык: Rust-first, один прод-рантайм
|
||
|
||
**Всё, что мы шипим, — на Rust.** Core, SDK, shell и весь прикладной слой,
|
||
включая ассистента.
|
||
|
||
- **Почему:** один тулчейн, минимальный footprint (важно на RK3588 и 16 ГБ-dev),
|
||
единый sandbox-профиль, безопасность памяти, перформанс (принцип #11 — отзывчивость).
|
||
- **ML без Python в проде:** STT/TTS/VAD — через **ONNX Runtime** (крейт `ort`) и
|
||
нативные биндинги (Vosk, llama.cpp); облачные LLM — обычный HTTP. PyTorch в прод
|
||
не тащим.
|
||
- **Python — только в dev:** прототипы, Vehicle Simulator, скрипты, CI-утилиты.
|
||
- **Escape-hatch:** если у конкретной ML-возможности нет вменяемого Rust-пути —
|
||
она шипится **изолированным Python-sidecar процессом** (архитектура позволяет:
|
||
всё и так отдельные процессы на D-Bus + sandbox). Это исключение, не правило.
|
||
- **SDK язык-агностичен для плагинов:** транспорт — D-Bus, поэтому сторонний
|
||
плагин можно писать на любом языке. Биндинги: **Rust — first-class**, другие
|
||
(Python…) — по мере нужды экосистемы.
|
||
|
||
---
|
||
|
||
## Полный стек
|
||
|
||
| Слой / концерн | Выбор | Примечание |
|
||
|----------------|-------|------------|
|
||
| **Языки (прод)** | **Rust** | единственный шипимый рантайм |
|
||
| **Языки (dev)** | Python | прототипы, Vehicle Simulator, скрипты — не в проде |
|
||
| **UI** | **Slint** | декларативный, GPU-ускоренный, Rust-native |
|
||
| **Графика** | **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-тир — позже |
|
||
| **OS base** | Armbian/Debian (RK3588), ядро ближе к mainline | read-only rootfs + overlay |
|
||
| **Init / lifecycle** | **systemd** | ядро; апы/плагины — App-Host |
|
||
| **CAN/OBD (read-only)** | **SocketCAN** (`socketcan`) + **ISO-TP** (`can-isotp`/`CAN_ISOTP`) для нативного OBD | ELM327 (мульти-протокол, прячет ISO-TP) на старте; `python-OBD` — в симуляторе |
|
||
| **Wake-word** | **openWakeWord** | RU-фраза «Штурман»; Porcupine отвергнут (проприетарный, #12) |
|
||
| **VAD** | Silero VAD | через ONNX Runtime |
|
||
| **STT** | Vosk · Silero | офлайн, RU; через биндинги / `ort` |
|
||
| **TTS** | Silero | офлайн, RU |
|
||
| **LLM онлайн** | GigaChat · YandexGPT | HTTP, provider-agnostic, 152-ФЗ |
|
||
| **LLM офлайн** | llama.cpp / Ollama | квантованная мелкая модель |
|
||
| **Карты (v4)** | MapLibre + Valhalla/OSRM | офлайн |
|
||
| **Dev VM** | Lima (vz-backend) | ARM64, нативная виртуализация |
|
||
| **CI** | GitHub Actions, ARM64-Linux | совпадает с таргетом |
|
||
| **Сборка / оркестрация** | Cargo (workspace) + `justfile` | |
|
||
| **Лицензия / гигиена** | **MIT** · `cargo-deny` | без AGPL-заразы (принцип #12) |
|
||
|
||
---
|
||
|
||
## Ключевые крейты (Rust)
|
||
|
||
| Концерн | Крейт |
|
||
|---------|-------|
|
||
| D-Bus | `zbus` |
|
||
| UI | `slint` |
|
||
| Async-рантайм | `tokio` |
|
||
| SocketCAN | `socketcan` |
|
||
| ONNX-инференс (STT/TTS/VAD) | `ort` (ONNX Runtime) |
|
||
| Локальная LLM | биндинги `llama.cpp` |
|
||
| STT (Vosk) | `vosk` |
|
||
| HTTP (облачные LLM) | `reqwest` |
|
||
| Сериализация | `serde` |
|
||
| Логи/трейсинг | `tracing` |
|
||
|
||
> Список крейтов уточняется при проектировании доменов; здесь — опорные.
|
||
|
||
---
|
||
|
||
## Журнал решений (stack)
|
||
|
||
| Решение | Выбор | Дата |
|
||
|---------|-------|------|
|
||
| Язык прод-рантайма | **Rust-first, один рантайм** (Python — dev-only; sidecar как escape-hatch) | 2026-06-16 |
|
||
| ML в проде | ONNX Runtime (`ort`) + нативные биндинги, без PyTorch | 2026-06-16 |
|
||
| SDK для плагинов | язык-агностичен (D-Bus); Rust — first-class | 2026-06-16 |
|