Files
shturman/docs/tech-stack.md
T
kk0t9 c66ccf08ea docs: ретро-ревью pass-2 остаточные (data-model/plugin-sdk/hardware/C)
- 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>
2026-06-21 01:30:00 +03:00

86 lines
5.4 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.
# Технический стек
> Канонический список технологий Штурмана с обоснованием — источник правды по
> «на чём пишем». Архитектурные *решения* — в [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 |