One Milo, many bodies: desktop, robot, browser, and whatever comes next.
CreatedLast updated
Originally July 28, 2026 · updated July 29, 2026 — Phase 0/1 stop · by James & Milo
Current call — July 29: The frozen Phase 0/1 contract spine remains the rollback-safe stop point,
while five bounded local slices were added behind it: strict loopback admission/host, server-owned text turns,
a browser-avatar render adapter, provider-neutral model-context construction, and an API-family-pinned provider
translation plan. 225 tests green; final independent fail-closed review passed. No provider
client or call, token-budget approval, streaming path, audio, robot motion, persistent listener, or deployment
cutover was activated.
Separate Reachy baseline update — July 28: this does not reopen or cut over the
frozen Phase 0/1 runtime. The working Reachy baseline now has a deterministic P0 greeting path behind a
loopback-only, token-authenticated voice-control boundary. It refuses remote callers and interruption bypasses;
the greeting remains idle-only and literal, not LLM-rephrased. No forced greeting, robot motion, or live audio
was used as the security smoke test.
Separate Reachy baseline: hardened, not promoted
The adjacent production baseline is still the rollback path, not an implementation of the private contract spine.
We hardened it because a robot speech-injection endpoint is voice authority: an unauthenticated LAN endpoint was
not acceptable in a home. The work is intentionally narrow and reversible.
Boundary
Current verified state
Greeting injection
Loopback-only, token-authenticated, idle-only; response.created precedes output, and a cancellation fence refuses any literal enqueue after barge-in.
Greeting policy
Deterministic literal TTS, quiet-hours aware, and separate from the LLM. Unknown people remain silent.
Knowledge authority
Ordinary spoken turns cannot attach web lookup. Only the explicit ask big Milo path may authorize read-only research.
Honcho recall
Honcho v3 search uses JSON POST only. A stale GET fallback returned 405 and was removed; writes stay serialized and receive bounded in-memory retry. Read timeouts remain separately observable.
Evidence
612 tests, Ruff, lock check, package build, and live non-speaking rejection probes passed. The JSON-POST repair has a focused regression test within that suite; the brain restart rebuilt Honcho-backed context without a new stale-GET or 405 error.
Promotion rule: a hardened legacy baseline is not a migration. The frozen runtime remains stopped
at its contract boundary until a later, explicit promotion decision and live-profile evidence justify a cutover.
Suite225pytest green
Phaselocal slicescontracts only
Live cutovernoneReachy baseline intact
Rust rewritenohybrid later if needed
Goal is still the same: one Milo mind and voice runtime, many bodies.
Reachy Mini, a browser avatar, PuppyPi, and future surfaces should share identity, turn-taking,
STT/LLM/TTS policy, memory, and safety — not each reimplement a brain.
What changed since the original planning post:
the architecture is no longer only a diagram. A private Python package now holds reviewed,
fail-closed contracts for handshake, isolation, memory visibility, delivery styles, reactions/banter,
TTS planning, thin Reachy/browser adapter translation, bounded model-context assembly, and a pure provider-plan
translation seam.
Adapters submit observations and render approved intents — they do not resolve identity or invent jokes.
OpenAI Realtime remains the frozen compatibility envelope; Milo meaning lives in versioned milo.* events.
Concurrent sessions isolate transcript, cancel, tools, TTS, and fresh context.
Only server policy becomes provider-system authority; memory and completed transcript remain framed user-role reference data, and provider token fit remains an unasserted activation gate.
Fail-closed independent review before every [verified] commit — real bugs caught (viewer spoof, sticky cancel holes, dishonest camera capability, mutable TTS plans).
Deliberately not done
Persistent listener or non-loopback host / Realtime bridge
Live STT / LLM / TTS provider binding, tokenizer/window check, or sendable model request
Live Reachy Pi / SDK / audio drivers
Browser-avatar media integration and PuppyPi adapter
Honcho writeback inside this repo
Voice-profile enrollment
Any cutover off the working Reachy baseline
Rust port?
Research conclusion: full rewrite does not make sense at this stop point.
The codebase is still mostly contracts/policy (~1.6k LOC), not a media plane.
Keep Python core. Revisit a hybrid Rust gateway/audio edge only after live multi-session profiling proves a bottleneck.
Full note lives in-repo: docs/research/2026-07-28-rust-port.md.
Resume checklist
uv run pytest -q && uv run ruff check .
Pick one separately authorized next slice only; a future live provider binding must consume the reviewed plan, add a real tokenizer/window check, and still does not authorize a robot cutover.
Keep fail-closed review before any verified commit.
Do not touch live Reachy services until pre-deployment gates pass.
Stopping here is the feature. The spine is reviewable and implementable against; production remains undisturbed.