Commit Graph

42 Commits

Author SHA1 Message Date
mikkeli d838531410 REPOS: svc-core row lists orin-status and obd-poller
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz
2026-10-13 00:10:34 +09:00
mikkeli 180ad16730 obd-poller done (mode 01); DTC/MUT-III and first decoding captures next
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz
2026-10-12 23:25:04 +09:00
mikkeli 8a82cb1c78 Decision 25 accepted: the recorder reads SocketCAN and gpsd directly
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz
2026-10-12 22:33:45 +09:00
mikkeli b7c958ed68 Decision 4: raw CAN rate confirmed on the car Orin
No loss at a saturated bus; 10 ms batches cost the broker ~1 % of a core.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz
2026-10-12 20:48:41 +09:00
mikkeli b254bb2c55 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 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz
2026-10-12 16:37:11 +09:00
mikkeli 66b7269f3c svc-vision: new repo for the camera; decision 29 (Python for vision)
The live view moved from app-flutter's test tool to svc-vision, running as
yukart-vision.service on the car Orin.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz
2026-10-12 16:15:04 +09:00
mikkeli a290a01f03 Camera in the plan: roadmap Phase 5 split into camera then inference; proposed decisions 27 (live view) and 28 (paced Orin -> tablet senders)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz
2026-10-11 17:21:41 +09:00
mikkeli e6ca835992 Phase 1 recorder running; svc-core current; boundary v0 started
The recorder runs on the car unit and reads SocketCAN and gpsd directly
(decision 25, proposed). svc-gw and app-flutter talk boundary v0, both
channels on one WebSocket with their own semantics (decision 26, proposed).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz
2026-10-09 20:24:32 +09:00
mikkeli 9a1512793d Roadmap: link the car power plan and its open restart problem
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 17:10:52 +09:00
mikkeli e171d7ae99 Roadmap: note UPS holdover from the first bench test
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 17:03:21 +09:00
mikkeli dfa692d763 Phase 0: GNSS fix achieved; moving map no longer blocked
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 16:39:31 +09:00
mikkeli ccd5b54450 Record measured Z27AG CAN: 500 kbps, ungatewayed OBD port
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 16:38:45 +09:00
mikkeli 668b40f330 ORIN-RUNTIME: buffer-to-terminator receiver is an acceptable first step
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 16:10:48 +09:00
mikkeli 16b1031b8c REPOS: remove the stale duplicate of Naming..Scaffolding
The front-matter commit (d234a2d) accidentally appended a second copy of
the Naming through Scaffolding sections. The current-state rewrite
(574df14) then updated only the first copy, leaving the tail with old
wording and the superseded `type: default` front-matter rule. The tail
held nothing the first copy and the Front matter section don't.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 00:51:59 +09:00
mikkeli feb9564ce4 Link drops: restoring PD costs ~2.2 s with the tablet awake
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 00:46:34 +09:00
mikkeli 5c7c0677cb Link-drop section: attach the ignition remark to the PD reset
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 00:43:52 +09:00
mikkeli 3422b084ac Link drops: PD change costs ~3.5 s; app must keep the tablet awake
Further USB tests showed the 5-15 s outages were Android suspending on
battery, not the hub. Kept awake, a PD unplug costs ~3.5 s. Adds the
requirement that the app keeps the tablet awake while it is the display,
and notes a sleeping tablet is invisible to link state.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 00:43:38 +09:00
mikkeli 6300006859 Link-drop section: replug outage is invisible to link state
Measured: plugging the hub's PD back in leaves the Orin's USB interface
up while the tablet stops answering for ~5 s, which only a heartbeat
detects.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 00:25:55 +09:00
mikkeli 5bff21265b Treat link drops as routine: Orin detects, redelivers or expires
PD changes through the tablet's hub reset the USB link for 5-12 s at
every ignition change. The app still re-dials, but the Orin must notice
dead clients by heartbeat (TCP alone leaves half-open sockets), keep
pending reliable traffic to redeliver or expire by age, and accept
idempotent commands so retries across reconnects never act twice.
Recorded as proposed decision 24; no implementation yet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 00:18:50 +09:00
mikkeli ac4626640c USB display link is NCM; app must bind to the Ethernet network
Tested with the tablet: it picks NCM, not RNDIS, from the Orin's L4T
gadget. Android won't route app traffic over a network without internet
while WiFi or cellular is up, so app-flutter has to request and bind
the Ethernet network. The Orin's USB-C port has no PD, so the tablet is
charged through a PD hub in the car.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 00:12:45 +09:00
mikkeli 6fc187570c Orin is headless: drop local video out, ALSA instead of PipeWire
The tablet app is the display, so the diagram's hud (local video out)
branch goes; displays are all remote. The car unit now runs no desktop
and no sound server, so the host layer lists ALSA, and mic capture for
Whisper reads it directly.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 00:02:05 +09:00
mikkeli ce4eaa1aaf Note the LTE/GNSS hat is car-unit only
The hat sits in a custom enclosure on the car Orin and isn't swapped
to the development unit, so modem and gpsd testing happens on the car
unit and gnss development elsewhere runs on its mock input.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 09:59:08 +09:00
mikkeli c395d4e3b0 Architecture: note the stale boot clock and the metered povo SIM
The car unit has no RTC battery, so before NTP the clock sits near the
last shutdown time; that is the case the two-clock envelope exists for.
The LTE SIM is povo, not an IoT SIM, and its connection now carries
the metered flag the map-sync guard relies on.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 09:58:51 +09:00
mikkeli f05fda71ee Phase 0: record host bring-up progress on the car unit
LTE is up over QMI on povo, metered and ranked below Ethernet/WiFi, with
failover tested. CAN interfaces now have stable udev names (can_pcan,
can_onboard) since canN order raced at boot, so references to can1/can0
go. GNSS stays open: gpsd runs but has no fix until an open-sky test,
which is now what blocks the moving map. Kernel-update rebuild steps
are documented for both out-of-tree modules; time sync is pinned to NICT.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 09:58:51 +09:00
mikkeli d8c40eb9ed Name the two Orin units by hostname
The hardware table listed mikkeli-orin-nano-2 as the main compute, but
that is the development unit; the car unit is mikkeli-orin-nano. Both
the README and the REPOS units table now say which is which.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 09:58:51 +09:00
mikkeli cbd31cf8fc Record the runner-mode requirement for Orin builds
A container-mode runner builds against the image's glibc, not the Orin's,
which discards the reason for building on the target in the first place.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013kj58Jugkic783b8ZrtTVZ
2026-09-05 15:26:00 +09:00
mikkeli 30db6b3430 Point the build docs at the glibc check script
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013kj58Jugkic783b8ZrtTVZ
2026-09-05 15:24:50 +09:00
mikkeli f49af26898 Build natively on the development Orin
Two units with different jobs: one builds and runs CI, the other is the
deployment target. Building on the target architecture makes the glibc
constraint structural rather than configured.

The remaining risk is version parity between the two units, not architecture.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013kj58Jugkic783b8ZrtTVZ
2026-09-05 15:23:10 +09:00
mikkeli 23ee20f9be Correct the glibc constraint: the sysroot sets the floor, not the toolchain
Rust std targets 2.17. Everything above 2.30 comes from glibc 2.34's
libpthread/libdl merge re-versioning moved symbols, which makes the ceiling
stable rather than a one-release margin.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013kj58Jugkic783b8ZrtTVZ
2026-09-05 15:19:35 +09:00
mikkeli b7b291a3d5 Record the aarch64 build path and its glibc ceiling
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013kj58Jugkic783b8ZrtTVZ
2026-09-05 13:52:30 +09:00
mikkeli e5adcf1afe Index contracts; record the envelope's two clocks and single-source rule
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013kj58Jugkic783b8ZrtTVZ
2026-09-05 12:54:28 +09:00
mikkeli b9d138652e Settle decision 5: Rust services, Python tooling, Dart client
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013kj58Jugkic783b8ZrtTVZ
2026-09-04 17:15:57 +09:00
mikkeli 0b929d30ca Drop rejected-alternatives note from the message bus section
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013kj58Jugkic783b8ZrtTVZ
2026-09-04 16:03:25 +09:00
mikkeli 574df1471c Rewrite reference docs as current state; record the style rule
Reference, guidelines and plan documents describe what is and what will be.
Retirement stories, resolved-risk narration and against-the-alternative
argument moved out or were cut; reports keep that material.

What survives the cut is the mechanism that can bite again (driving side is a
country-level property) and the condition that would change a decision (a
permanently installed, car-powered panel), both stated generally.

Also removes a duplicated Japan section from a bad edit.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013kj58Jugkic783b8ZrtTVZ
2026-09-04 15:23:08 +09:00
mikkeli 102cf38082 Drop video out; every display is data-only
No dedicated display is in scope, so Class A has nothing to drive and app-hud
is cancelled. Records why it will not come back: no connector-powered display
exists (DP_PWR is 3.3V/500mA and deliberately unconnected at the sink, HDMI
gives 55mA, a panel needs 5-15W), the dev kit exposes no DSI, and a data-only
client on one USB cable is simpler anyway.

Video out generated the enclosure, power and cabling complexity this project
set out to solve. Removing it removed the problem.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013kj58Jugkic783b8ZrtTVZ
2026-09-04 14:52:50 +09:00
mikkeli d234a2da37 Adopt designed front matter: typed, with staleness on plans
Replaces `type: default` — one value across every document, read by nothing,
so it discriminated nothing. Types are now reference, guidelines, plan and
report, applied to every markdown file with no exceptions for the hub.

Plans carry status and updated, reports carry date. REPOS.md already noted
that plans go stale and reports do not, but nothing made that visible: a plan
from months ago looked identical to one written today.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013kj58Jugkic783b8ZrtTVZ
2026-09-04 14:14:17 +09:00
mikkeli 691bd3d3d3 Document scaffolding convention; drop frontmatter the hub does not use
No template repo: fork-at-create cannot reach existing repos, and the
scaffolding is three markdown files. Records what every component repo carries
instead, and the frontmatter rule inferred from orin-nano-env-setup — living
documents carry it, historical reports do not, the hub carries none.

ORIN-RUNTIME.md had frontmatter no other hub document uses. Removed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013kj58Jugkic783b8ZrtTVZ
2026-09-04 14:05:39 +09:00
mikkeli 2fe9665664 Keep streaming TTS open; name the swappable-provider pattern
Utterances cross as chunks with an explicit terminator, so whole-utterance is
a stream of one chunk and a streaming TTS needs no protocol change. Records
what must not be built — a single-body download-then-play player — since that
forecloses streaming silently.

Also notes the transport is fully exercisable with espeak-ng or a canned WAV,
so audio transport need not wait on GPT-SoVITS.

The provider-behind-an-interface shape has now been picked three times
independently, so it is named as the project idiom rather than re-derived.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013kj58Jugkic783b8ZrtTVZ
2026-09-04 14:02:41 +09:00
mikkeli 1d24d90c36 Flip decision 12: the tablet owns aux, not the Orin
The earlier decision assumed the Orin would be the media source. It is not —
the tablet is the music player and that role is staying put, so it holds the
aux cable regardless. Giving the Orin its own aux line would have added a
second permanent cable rather than freeing the display unit.

TTS therefore crosses the boundary as discrete utterances over the reliable
channel rather than a real-time stream, and ducking moves to Android audio
focus, which handles cross-application ducking natively.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013kj58Jugkic783b8ZrtTVZ
2026-09-04 13:57:40 +09:00
mikkeli fa49976efd Verify Valhalla on arm64; correct driving-side and retention decisions
arm64 is no longer a risk: verified end to end on mikkeli-orin-nano-2
(L4T R36.4.7). The official image publishes linux/arm64, runs natively, and
the full pipeline works including a served route.

Corrects the Japan guidance. Advising a regional extract was wrong for the
admin build: driving side is a country-level property, and a Shikoku extract
produces no country row and drive_on_right=1, silently giving right-hand
traffic routing. Admins must come from the full extract; routing tiles may
still come from a region.

Decision 14 closed: recordings bounded with rotation, enforced by the writer.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013kj58Jugkic783b8ZrtTVZ
2026-09-04 10:56:14 +09:00
mikkeli 449aa0c99e Add navigation, Orin runtime and data flow design; rework repo naming
Navigation: self-hosted MapLibre + Valhalla + PMTiles, offline-first, with
Japan specifics (left-hand traffic via valhalla_build_admins, data volume,
CJK labels). Map matching pulled forward as Phase 2 ground truth.

Orin runtime: new document covering the 8 GB shared-memory budget,
capture-first startup tiers, failure isolation, storage and the audio graph.

Data flow: direction belongs to topics inside the Orin; the display boundary
is two simplex channels rather than one duplex socket; cloud links are
outbound-initiated only; services mock themselves rather than having separate
stub implementations.

Naming: repositories are <group>-<thing> with no project prefix, so lexical
order matches semantic grouping. Indexes the five new repos.

Decisions 8-19 recorded; 14 (recording retention) left open.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013kj58Jugkic783b8ZrtTVZ
2026-09-04 08:25:26 +09:00
mikkeli 62ac7bd09d Populate design, architecture and repo layout docs
project-yukart becomes the code-free hub: overview, roadmap and cross-cutting
design only. Each app or app cluster gets its own repo, indexed from here.

- ARCHITECTURE.md: separate services over a message bus, with displays as bus
  subscribers so the directly-driven screen, Android client and ESP32 panel
  share one contract. Records CAN scope (listen-only + OBD-II as sole writer)
  and a decisions table for choices still in flux.
- REPOS.md: repo splitting rule, planned repos, naming, and Gitea template-repo
  policy (scaffolding only — no upstream link after instantiation).
- ROADMAP.md: phases 0-5, capture and decode before displays.

Bus choice (MQTT) is marked proposed pending a check against real CAN rates;
implementation language is still open.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-14 09:22:35 +09:00