- спека домена C: композитор, слот-модель, декларативный UI-DSL (резолв вопроса), тема, driver-distraction, интеграция ассистента, ввод - КОРРЕКЦИЯ: shell = кастомный multi-client композитор на smithay (Rust); cage (single-app kiosk) не годится для мульти-поверхностной слот-модели → правка в tech-stack и dev-environment - ревью-де-риск v0: shell стартует как Slint-ап без внешних поверхностей, полный smithay-композитор — с первым surface-апом - ревью-фазинг: статус машины в статус-баре → v2; distraction по GPS-скорости в v1 (раньше OBD); день/ночь v0 по времени/GPS; настройки растут с фичами Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
7.8 KiB
Среда разработки
Как вести разработку Штурмана корректно и изолированно — не выходя с Mac, ничего не ломая, со спокойным тестированием подсистем без реального железа.
Статус: v1 (на ревью). Связано с: architecture.md · principles.md (#13) · contracts/hardware.md
Цель
- Вся разработка и тестирование с текущего Mac.
- Изоляция: эксперименты не трогают хост.
- Безопасное тестирование подсистем без машины.
Хост и что это даёт
Apple M4 (ARM64), 10 ядер, 16 ГБ, macOS 26.5.
- ARM64-хост ↔ ARM64-таргет (RK3588). Linux в ARM64-VM крутится нативно-быстро через Apple Virtualization (без эмуляции). Бинари, собранные в VM, уже целевой архитектуры.
- QEMU-эмуляция нужна только если захотим эмулировать сами периферии RK3588 — редкий случай, не базовый поток.
- 16 ГБ RAM — единственное ограничение. VM держим лёгкой; локальную офлайн-LLM по умолчанию мокаем, реальную квантованную модель гоняем точечно (закрыв лишнее) или уже на железке.
Изоляция «ничего не сломать» — бесплатно
Весь Linux / CAN / systemd живёт в VM. Хост-Mac держит только редактор, нативный Slint и менеджер VM. Сломал что-то в стеке — сбросил VM, хост цел.
Четыре слоя
L1 Mac host редактор · git · Rust-тулчейн · НАТИВНЫЙ Slint (быстрый UI) · justfile · Lima
│
L2 Linux dev-VM systemd · D-Bus · SocketCAN(vcan) · PipeWire · Wayland(shell/smithay)
(Lima, vz, ← интегрированный стек; сервисы = systemd-юниты + bubblewrap (как в проде)
ARM64)
│
L3 Симуляция Vehicle Simulator (vcan) · моки LLM/STT/TTS · фейк-GPS · мок-сеть
│
L4 Реальный RK3588 (позже) сборка образа → флеш → путь «VM → железка»
Стек инструментов
| Задача | Инструмент | Зачем |
|---|---|---|
| Linux dev-VM | Lima (vz-backend) | нативная ARM64-виртуализация, open-source, scriptable YAML |
| Итерация UI | нативный Slint на macOS + shell-композитор (smithay), вложенно в weston, в VM |
гибрид: быстрый дизайн-цикл + проверка реального Wayland |
| Виртуальный CAN | SocketCAN vcan (в VM) |
тест Vehicle-Data без железа |
| Симуляция OBD | ELM327-emulator + python-can + can-utils |
OBD-II PID и DTC без авто |
| Сборка Rust | в VM (та же арка) + кросс aarch64-unknown-linux-gnu с хоста |
target-arch бинари |
| Аудио | PipeWire в VM | тест аудио-пайплайна |
| Изоляция сервисов | systemd-юниты + bubblewrap | dev зеркалит прод, а не Docker-огород |
| Оркестрация | justfile |
единые dev-команды (just vm-up, just sim, just test…) |
| CI | GitHub Actions, ARM64-Linux | совпадает с таргетом |
| License-check | cargo-deny |
принцип #12 (без AGPL-заразы) |
Vehicle Simulator (first-class актив)
«Виртуальная машина» — то, чем тестируется killer-фича без авто. Реализует принцип #13. Умеет:
- писать реалистичные кадры в vcan;
- отвечать на OBD-II PID-запросы (ELM327-стиль и raw CAN);
- инжектить/чистить DTC (set/clear) — для теста расшифровки и объяснения;
- проигрывать реальные CAN-дампы (
candump→canplayer); - гонять сценарии: холостой / езда / неисправность.
Строим тонко поверх can-utils (cangen/candump/canplayer), python-can,
ELM327-emulator. Эталонный тест killer-фичи: симулятор инжектит P0420 →
ассистент через Vehicle-Data → контекст → объясняет по-русски.
Моки
- LLM — заглушка (canned-ответы/echo) или крошечная локальная модель.
- STT — обход голоса вводом текста; TTS — тихий/лог-режим.
- GPS — NMEA-реплей; модем/сеть — управляемые состояния (для теста offline-first).
Воспроизводимость
- Lima-шаблон (
lima.yaml): Ubuntu ARM64, модули (vcan), пакеты (systemd, dbus, pipewire, cage, can-utils, rust, python). - Provisioning-скрипт +
justfileс целями для подъёма/симуляции/тестов. - Минимальный порог входа для контрибьюторов.
- Nix — опция позже для эталонно-пиннутого тулчейна (power-users), не сейчас.
CI
GitHub Actions на ARM64-Linux-раннерах:
- lint (clippy + rustfmt), unit, интеграция (vcan + симулятор + моки,
сервисы на шине), license (
cargo-deny), позже — сборка образа. - Если ARM64-раннеры вне бесплатного тира — фолбэк: x86 + кросс или self-hosted.
Пирамида тестов
- Unit — на хосте/в VM, по крейтам/модулям.
- Интеграция — сервисы на шине против Vehicle Simulator и моков. Здесь тестируется контекст машины без авто.
- E2E — полный стек в VM: boot < 10 c, graceful shutdown по ACC, реверс→камера,
поток «почему горит чек» (
P0420), офлайн-фолбэк при выключенной мок-сети. - HW-in-the-loop — на реальном RK3588 (позже).
Связи
- Процессная модель и planes, которые здесь воспроизводим, — architecture.md.
- Тестируемость-без-машины как принцип — principles.md #13.
- Путь «VM → железка», флеш, board support — contracts/hardware.md.
- Vehicle Simulator кормит домен — domains/ (E: Vehicle-Data).
Журнал решений (dev-environment)
| Решение | Выбор | Дата |
|---|---|---|
| Linux-окружение | Lima (vz-backend), ARM64, нативная виртуализация | 2026-06-16 |
| Итерация UI | гибрид: нативный Slint на macOS + cage в VM |
2026-06-16 |
| Изоляция сервисов в dev | systemd-юниты + bubblewrap (зеркало прода) | 2026-06-16 |
| Воспроизводимость | Lima-шаблон + provisioning + justfile (Nix — позже) |
2026-06-16 |
| CI | GitHub Actions, ARM64-Linux | 2026-06-16 |