Define display boundary protocol v0

What crosses between svc-gw and the app: hello, heartbeats both ways, state
snapshots of envelopes with mock flagged per message, and commands carrying an
idempotency key. TTS utterances are left for when a TTS exists.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz
This commit is contained in:
2026-10-09 20:19:05 +09:00
parent 73eff1c5d6
commit b55ccba268
3 changed files with 71 additions and 14 deletions
+4 -14
View File
@@ -20,20 +20,10 @@ observed traffic. They arrive as DBC entries plus registry rows with
`system/<service>` have their fields named in `topics.json` but no JSON Schema
yet. They get one when a publisher exists to constrain.
**The app ↔ `svc-gw` boundary protocol.** Bus topics are defined here, but the
two channels across the boundary (latest-wins state down, acknowledged commands
up) have no wire format yet. Project-yukart decision 24 (proposed) already
fixes what it must carry, because the USB link drops for ~3 s at every power
change and a sleeping tablet looks alive at the link layer:
- a **heartbeat** in both directions, with an agreed interval and timeout, so the
Orin reaps a silent client instead of trusting TCP or link state;
- an **idempotency key** on every upstream command, so retries across a
reconnect never act twice;
- for TTS, **utterance id + chunk sequence + terminator + an expiry**, so a
reconnect can resume or drop an utterance rather than replay it blindly.
Defined when `svc-gw` and `app-flutter` first talk, not before.
**The app ↔ `svc-gw` boundary protocol** is at v0 in [BOUNDARY.md](../../BOUNDARY.md):
heartbeat both ways, idempotency key on every command, mock flagged per message.
Still missing from it: the TTS utterance shape (id, chunk sequence, terminator,
expiry), defined when a TTS exists to send one.
## Order