Stay with the person.
Test the whole conversation.

October 26, 2026. Robby combines speech recognition, approximate speaker memory, turn decisions, a dialogue model and streamed speech. This update repairs several interactions between those stages and introduces a repeatable test protocol. The measurements below use authored synthetic audio and actual services. They are development evidence, not physical-room or held-out human accuracy.

ChangeCurrent behaviorReason
Current-speaker retentionCosine default 0.28; existing slider remainsKeep a plausible voice through delivery changes; preserve known-rival and echo checks.
Speech boundary700-ms normal pause; foreground-relative activity; 400-ms pre-roll and 320-ms post-rollQuiet TV should not keep extending a main turn, and short identity windows must not crop full words.
Guest participationExplicit spoken invitations and a shared admitted roster; manual handover clears stale workA guest can join without replacing the original person. “Only talk to me” revokes other participants.
Live interruptionExisting 320-ms controller also runs in sentence mode; configured Laya handles Stop decisionsA transcribed Stop is not enough unless the active reply is actually cancelled.
Visual actionsDirect spins, grimaces and emotion chains dispatch immediately while speech streamsDelayed optional model metadata should not lose a requested trick.
Task continuityJoke/follow-up hints distinguish a new joke from a longer retelling; interrupted generated text stays in context with an explicit hearing warning“Another one” should keep the latest subject and deliver new work instead of repeating, drifting or offering to help.
TestingVersioned runner, pinned 13-clip synthetic pack, source/input hashes and twelve-candidate threshold/pause search planCompare configurations with the same inputs and preserve failed attempts.

The short-Stop tradeoff: a fresh clear foreground Stop can cancel speech despite uncertain one-word identity. Strong known-rival and bot-echo checks still apply, and the cue never trains an identity. A loud unknown voice might still cancel. Approximate speaker similarity is not authentication. A lower ordinary threshold cannot separate every pair of voices or repair heavily overlapping ASR.

Actual current receipts

The final frozen-runtime run passed all eight stages: 432 offline tests, six Laya decisions, sixteen component mixtures, eighteen real-model task turns, eleven combined browser checks, four short Stops with recovery, and six session-owned/TTS dialogue turns. Source/runtime signatures stayed unchanged during that run. A later two-stage run also verified the added before/after asset-inventory instrumentation.

These links expose the evidence and scope. A component pass does not establish a complete conversation, and a long answer is not automatically a good joke. The combined browser test matters because it carries state through multiple features.

CheckCurrent resultWhat it proves
Loading receipts…See linked JSON below if JavaScript is unavailable.No status is inferred from a missing file.

Combined browser · Four short Stops · Isolated guest flow · Laya route · 18 real-model task turns · Session-memory browser turns · Run summary

Two foreground voices, sixteen component mixtures

The current question is mixed with two other synthetic voices, authored chord-like music and decaying foley impacts. Sources have full-clip RMS 0.055 before linear gains. Gains are not in-room SNR. The second background voice has pauses but genuinely overlaps the other sources. Seed 42 and exact source/mixture hashes make the inputs repeatable.

Main voiceConditionMain admittedBackground-only admittedWER

Important limit: the speaker/crop gates passed even where ASR inserted background words. In the initial two-voice matrix, Selma's two strongest overlaps had WER 1.0 and 1.167; Christoph's hardest row had WER 0.429. WER can exceed 1 because insertions are counted. This is why conversation admission, transcription and reply quality must be scored separately.

What the browser really exercises

A fresh CPU Chromium page receives paced 20-ms digital microphone blocks through its actual client method. Recognition, Qwen/Cerebras, TTS, cancellation, reply IDs, audio scheduling and 3-D rendering are real. The script checks quiet TV, a returning voice with changed delivery and multiple distractors, a handover during speech, a full rotation with simultaneous audio, emotion/grimace/nod, live banana-rule interjections, short Stop and recovery, and spoken invite/revoke permissions.

Digital injection bypasses microphone permissions, capture hardware and the acoustic echo path. The browser records scheduled PCM, not measured loudspeaker sound. Stop latency in the receipt starts at input-file capture, including phrase duration and padding; it is not last-word reaction time. A 320-ms controller hop is not a promise of a 320-ms response.

Jokes, follow-ups and complete tasks

The real-model test uses three independent six-turn conversations: robot joke → another → expand the last one → another robot joke at a station → cat joke → another cat joke. Each actual answer becomes the following request's history. The first baseline repeated a whole cat joke verbatim. The revised path distinguishes a new example from a retelling and preserves generated task context after an interruption, explicitly warning that only a prefix may have been heard.

The separate browser sequence supplies no history in its requests: it tests the application's own session memory and actual streamed TTS. Automatic checks cover content, topic, exact repetition and completion; human review is still needed for coherence and a convincing punchline. The full authored dialogues remain inspectable. Retained failed baseline.

Why longer stateful tests are necessary

The isolated guest flow passed, but a combined conversation revealed that a previously heard unnamed guest could not receive the later introduced name. The candidate guard had compared the new clip with the best-matching participant, instead of specifically with the inviter. The repair uses the inviter's identity for that guard and reuses the unnamed guest profile. Retained failing combined attempt. Other retained failures included a short Stop rejected despite a correct ASR preview and a harness helper-shadowing error. Harness failures are recorded separately from assistant accuracy.

Separate local E4B gpu-unlock investigation: shared-GPU baseline and kernel build blocker.

Reproduce, extend and search

The Voice Assistant Test Protocol specifies service/model pins, exact commands, source/input hashes, fixture generation and its nondeterminism, metric denominators, clock definitions, real-room checks and proposed release gates. The small synthetic fixture archive provides fixed inputs without private recordings. Fixture hashes and attribution.

python run_voice_assistant_checks.py --suites unit,decision,stress,continuity
python plan_voice_assistant_search.py
# With Playwright and an installed CPU Chromium:
python run_voice_assistant_checks.py --suites browser,stops,dialogue \
  --url https://YOUR-CURRENT-TUNNEL.trycloudflare.com

Audio suites run serially and never evict a real user. Every run gets its own manifest/log/receipt directory. A stale earlier success is rejected; failures are not silently retried. The first search grid is four retention thresholds × three pause settings. Screen with component tests, validate finalists through actual browser conversations, select a recall/false-trigger/latency tradeoff, then freeze it for different held-out voices and rooms. The plan itself does not execute twelve experiments.

Next priorities are command-onset phase sweeps, long TV-only exposure, changing user distance and emotion, measured echo/reverb/jitter, similar voices and multi-person rooms. Count main-turn recall and background-induced replies/aborts together. Preserve complete tasks, participant permissions and post-Stop recovery as hard constraints. Zero false triggers in a tiny test is not proof of a low hourly failure rate.