Files
shturman/docs/tech-stack.md
T
kk0t9 fb4e585152 docs(domain G): v2 — связь/телефон (Connectivity+Phone), после adversarial-ревью (15 находок) + кросс-док
Новый домен 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>
2026-06-22 19:08:52 +03:00

88 lines
5.8 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 (+ `module-echo-cancel` — AEC) | микрофон, TTS, медиа, BT-аудио; политика ducking — домен H |
| **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` — в симуляторе |
| **Связь / BT** | NetworkManager · ModemManager · BlueZ (+ obexd; опц. oFono) | GPL-демоны через D-Bus (изолированы, #12); HFP-аудио — PipeWire bluez5 |
| **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` |
| Аудио-декод (медиа) | `symphonia` (MP3/AAC/FLAC/Vorbis/WAV/ALAC) + `audiopus` (Opus) |
> Список крейтов уточняется при проектировании доменов; здесь — опорные.
---
## Журнал решений (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 |