From b254bb2c55c065d6d45cd48a6065513230d1d761 Mon Sep 17 00:00:00 2001 From: Mikkeli Date: Mon, 12 Oct 2026 16:37:11 +0900 Subject: [PATCH] The bus is up: decision 4 accepted; orin-status publishes yukart/host/* Also: std::process::Command breaks the cross-compile fallback (GLIBC_2.39). Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz --- docs/ARCHITECTURE.md | 6 ++++-- docs/ORIN-RUNTIME.md | 2 +- docs/REPOS.md | 7 +++++++ docs/ROADMAP.md | 6 ++++-- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 78029af..97c58bf 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -35,6 +35,7 @@ The Orin runs headless: no local video out. The tablet app is the display. | `decoder` | Raw frames → named signals via DBC | No | | `recorder` | Persist raw + decoded sessions to disk; raw CAN and GNSS read directly, not via the bus (decision 25) | No | | `telemetry-gw` | Serve external display clients | No | +| `orin-status` | The Orin's own health: temperatures, CPU/GPU load, memory, network links, UPS battery → `yukart/host/*` | No | | `vision` | Camera capture (any V4L2 camera; in practice USB UVC, MJPEG), live view, software H.264 recording; on-device inference later. Repo `svc-vision`, Python (decision 29) | No | Each ships as a systemd unit. The host-level prerequisites they depend on @@ -60,7 +61,7 @@ traffic; discovered signals are recorded as a DBC rather than as code. ## Message bus -**Proposed: MQTT (mosquitto) on the Jetson.** Rationale: +**MQTT (mosquitto) on the Jetson**, listening on localhost only: displays reach the bus through `svc-gw`. Rationale: - First-class client libraries on every display target — ESP32 (Arduino `PubSubClient` / ESP-IDF) and Android (Paho) — which is the deciding factor. @@ -74,6 +75,7 @@ traffic; discovered signals are recorded as a DBC rather than as code. yukart/can/raw high-rate raw frames, not retained yukart/vehicle/ decoded signals (rpm, speed, coolant, …), retained yukart/gnss/fix position/speed/time, retained +yukart/host/ the Orin itself: temperatures, load, links, UPS battery, retained yukart/system/ health and status, retained yukart/nav/guidance next manoeuvre, distance, street name, retained yukart/nav/route active route geometry, retained @@ -350,7 +352,7 @@ rewriting the document. | 1 | Separate services over a message bus, not one process | Accepted | 2026-08-14 | | 2 | Displays are bus subscribers; no display-specific logic upstream | Accepted | 2026-08-14 | | 3 | Listen-only sniffing + active OBD-II, single writer | Accepted | 2026-08-14 | -| 4 | MQTT as the bus | **Proposed** | 2026-08-14 | +| 4 | MQTT as the bus (raw CAN rate still to confirm) | Accepted | 2026-10-12 | | 5 | Rust for on-Orin services, Python for off-car tooling, Dart for the display client. One exception: decision 29 | Accepted | 2026-09-04 | | 21 | Two clocks per envelope; `monotonic` orders, `timestamp` references | Accepted | 2026-09-05 | | 22 | `signals.json` is the single source for signal name and unit; both are derived, never authored twice | Accepted | 2026-09-05 | diff --git a/docs/ORIN-RUNTIME.md b/docs/ORIN-RUNTIME.md index 4956a33..e780d37 100644 --- a/docs/ORIN-RUNTIME.md +++ b/docs/ORIN-RUNTIME.md @@ -68,7 +68,7 @@ Ordered by what is lost if a tier is late. |---|---|---| | 0 | kernel modules, gpsd, network | Host layer; nothing of ours can precede it | | 1 | `mosquitto`, `can-bridge`, `recorder` | **Data is lost if late.** Must reach ready fastest | -| 2 | `decoder`, `gnss`, `obd-poller` | Derive from tier 1; a late start loses nothing | +| 2 | `decoder`, `gnss`, `obd-poller`, `orin-status` | Derive from tier 1; a late start loses nothing | | 3 | `svc-gw`, `svc-nav`, `svc-vision` | Serving; a display can wait | | 4 | voice — ASR, TTS | Interactive; seconds late is harmless | diff --git a/docs/REPOS.md b/docs/REPOS.md index ac689aa..555189d 100644 --- a/docs/REPOS.md +++ b/docs/REPOS.md @@ -215,6 +215,13 @@ because everything above 2.30 comes from one event: glibc 2.34 merged `libpthread` and `libdl` into `libc` and re-versioned the moved symbols. Stable, but not guaranteed the way a native build is. +⚠ **`std::process::Command` breaks it.** Any binary that spawns a process links +`pidfd_spawnp` and `pidfd_getpid` (GLIBC_2.39) from the workstation's sysroot. +They are weak references, but the version requirement is not, so the car Orin +refuses to load the binary. `check-glibc.sh` catches it; such binaries build +natively (svc-core's `orin-status` runs `mmcli`, so its deploy script builds on +the development Orin). + ### Writing style Documents describe **what is and what will be**. They are not changelogs — git diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 89dc1dd..c011ff2 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -67,8 +67,10 @@ provides a cross-check for reverse-engineered ones. ## Phase 3 — Bus and contracts -- [ ] Stand up the broker; confirm MQTT holds up at real CAN rates (decision 4 - in [ARCHITECTURE.md](ARCHITECTURE.md) is still *proposed*) +- [x] Stand up the broker, 2026-10-12: mosquitto 2.0.11 on the car Orin, + localhost only. First publisher `orin-status` (svc-core, + `yukart/host/*`); `svc-gw` subscribes and serves it to the tablet +- [ ] Confirm MQTT holds up at real CAN rates (`yukart/can/raw`) - [ ] Freeze v1 of topic names and payload schemas - [ ] `telemetry-gw` — external client access, including the serial bridge