3d13bb5827
- tech-stack: Rust-first (один прод-рантайм; Python — dev-only), полный стек, крейты - architecture: ассистент Python→Rust для консистентности; boot-порядок (Broker+App-Host до Shell); потолок частоты сигналов ~10–20 Гц - contracts/ipc: реестр D-Bus (сервисы ядра/апов, соглашения, портал-брокеринг) + открытые вопросы из self-review - contracts/data-model: VSS-aligned каталог сигналов, OBD-PID маппинг, DTC-модель; добавлен MIL-статус (PID 0x01) для killer-фичи, состояние машины, расход-estimate Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
86 lines
5.2 KiB
Markdown
86 lines
5.2 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** (`cage` kiosk) · Panfrost/Mesa | один композитор — shell |
|
||
| **Аудио/видео 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`) | ELM327 на старте; `python-OBD` — только в симуляторе |
|
||
| **Wake-word** | openWakeWord / Porcupine | кастомная RU-фраза |
|
||
| **VAD** | Silero VAD | через ONNX Runtime |
|
||
| **STT** | Vosk · Silero | офлайн, RU; через биндинги / `ort` |
|
||
| **TTS** | Silero | офлайн, RU |
|
||
| **LLM онлайн** | GigaChat · YandexGPT | HTTP, provider-agnostic, 152-ФЗ |
|
||
| **LLM офлайн** | llama.cpp / Ollama | квантованная мелкая модель |
|
||
| **Карты (фаза 2)** | 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 |
|