Conversation authority
Characters, prompts, voice stacks, STT, LLM, TTS, VAD, endpointing, interruptions, LiveKit agent jobs, transcripts and call timing.
Keep the existing RoboVoice call stack exactly where it works. Make each Pi a headless participant with local motion detection, camera, microphone and speaker. Rebuild RoboPark as fleet control, monitoring, history and remote operations around that path.
The session scheduler leaves the critical path. LiveKit remains media transport, not business orchestration.
Characters, prompts, voice stacks, STT, LLM, TTS, VAD, endpointing, interruptions, LiveKit agent jobs, transcripts and call timing.
Motion detection, camera capture, microphone capture, speaker playback, local media locks, reconnects and device health.
Fleet identity, production toggles, health, history, audit, always-on preview, tests, configuration editing and remote lifecycle commands.
| Rule | Production contract |
|---|---|
| Room identity | One deterministic room per active robot call. The second start request returns the current call instead of creating another room. |
| Motion mode | Local motion opens the same RoboVoice call used by the web UI, with the robot as the headless browser participant. |
| Manual mode | The operator starts the same call from Control Center or CLI. Only the initiation source differs. |
| Camera | RoboVision MJPEG remains always-on and independent of LiveKit calls. LiveKit video is optional for vision tools, not dashboard preview. |
| Events | Robot and RoboVoice emit state transitions to a thin event API. Events never block audio. |
| Failure | If Control Center or its database is down, the local motion-to-RoboVoice call still works. |
Extend the proven backend instead of running a second scheduler database and state machine.
Canonical ID, display name, character, hardware profile, site, production mode and last heartbeat.
Call source, timestamps, state events, transcript, latency, errors, end reason and selected voice stack.
Start/stop call, arm motion, reconnect camera, media tests, restart runtime and update package.
| Endpoint family | Purpose |
|---|---|
| /api/control/robots | Registry, heartbeat, production mode, hardware inventory and effective configuration. |
| /api/control/sessions | Start, stop, active call, history, transcript, latency and end reason. |
| /api/control/events | Append-only lifecycle events and server-sent live updates. |
| /api/control/media | Always-on camera relay, microphone diagnostics and speaker test requests. |
| /api/control/config | Existing RoboVoice characters, prompts, voice stacks and provider settings. |
Rich robot cards, live state, production mode, camera thumbnail, current character, latency, health and alerts.
Spatial robot view, always-on camera, fullscreen operations, current conversation stage and quick controls.
Current transcript, listening/thinking/speaking state, audio levels, errors, timers and remote stop.
Persistent paged history, full transcripts, timeline, latency breakdown, selected stack and end reason.
Keep the original RoboVoice call UI, browser devices, character editor, prompt editor and voice-stack editor.
Copy-ready commands, camera/audio tests, heartbeat, logs, update, permissions and audit trail.
One control URL, one robot token, one runtime per Pi. Re-running setup repairs configuration instead of creating duplicates.
One Pi runtime opens camera, microphone and speaker. All tests request access through that owner.
Match USB product identity and udev aliases, not volatile hw:2,0 indexes. Persist tested gain and volume.
Camera, call and control reconnect independently. A camera fault does not restart voice; a UI fault does not stop motion.
Local motion continues using cached effective config. Events queue locally and upload after reconnect.
One immutable robot ID with editable display name. BMW and VIXEN cannot become separate device records.
A call passes only after transcript input, LLM output, TTS output and physical playback are all recorded.
Record a successful RoboVoice web call and Pi local motion call. Capture configuration, latency and device paths. No architecture changes yet.
Point BMW motion directly at the existing RoboVoice call entrypoint. Remove scheduler allocation from this path while retaining current rollback command.
Persist call lifecycle and transcripts from RoboVoice. Add Pi heartbeat and effective hardware/config reporting.
Connect Fleet, Park, Sessions, Voice Studio and Setup pages to the RoboVoice-native control API and camera relay.
Run motion sessions for four hours. Test reconnects, silence endings, repeated triggers, camera continuity and Control Center restart.
Apply the identical USB hardware profile and runtime to each robot. Keep per-robot differences limited to identity, character and site.
Make old session-allocation endpoints read-only, export historical data, remove UI calls, then delete only after the rollback window.
| Acceptance gate | Required evidence |
|---|---|
| Motion-to-greeting | BMW begins audible greeting within 1.5 seconds of accepted motion. |
| Real conversation | At least ten consecutive onsite turns persist user transcript, LLM response, TTS completion and robot playback. |
| Call parity | Same RoboVoice AgentSession, character, model, endpointing and interruption behavior as the web UI call. |
| Always-on video | Camera remains visible before, during and after calls and reconnects automatically. |
| Failure isolation | Restarting Control Center does not stop motion detection or an active conversation. |
| Remote recovery | Operator can inspect logs, test hardware, restart and update without onsite assistance. |
| Soak | Four-hour BMW run and one-hour five-robot run complete without duplicate sessions or media ownership conflicts. |