Run this once after a build to confirm "fully functioning product".
Each item is a single user action with a single observable outcome.
If anything fails, copy the line into the chat and we fix it.
/Applications/HeyBrian.app/tmp/heybrian/wakeword.sock exists)/api/mac-events)Action: say "Hey Brian" in normal speaking voice.
Pass: orb appears bottom-right, animates to listening state, chime plays.
Fail: nothing happens → check pgrep -fl wakeword_daemon and
~/.heybrian/venv/bin/python3 -c "import openwakeword, sounddevice".
After wake, say a short instruction like "what time is it".
Pass: orb fades to interpreting → reply spoken or printed within ~2s.
Fail: orb stuck in listening, or no reply.
Wake the orb. Say one of:
• "start a call"
• "begin a call"
• "make a call"
• "call brian"
Pass: orb transitions to call mode, Gemini Live connects, you can speak.
Fail: routes to /api/brian/ask instead → CommandRouter regression.
When the orb is visible (or after wake), left-click on it.
Pass: same as #3 — call mode begins.
Fail: starts a one-shot voice command instead.
While in a Gemini Live call, say one of:
• "end call"
• "end the call"
• "hang up"
• "bye"
• "goodbye"
Pass: call disconnects, orb returns to idle.
Fail: Brian replies normally and call continues → server may not be
forwarding input_transcript.
In a Gemini Live call, ask Brian a normal question. Listen for Brian's
reply playing through your speakers.
Pass: Brian replies once and stops; mic does NOT pick up Brian's own
voice as your next utterance.
Fail: Brian replies, then immediately replies again to its own
playback (the loop you saw in chat history at 06:02–06:03).
Right-click the visible orb.
Pass: glassmorphic 9-item menu appears: Start/End Call · Start/Stop
Meeting · Pause/Resume Screen Memory · Text Input · Take Screenshot ·
Notifications · Send Message · Calendar · Settings.
Fail: nothing happens, or menu shows fewer items.
Click the menubar B icon.
Pass: menu shows Start Call (Cmd-C) · Start Meeting (Cmd-M) · Show Orb
· Start Listening · Wake Word Detection · Open Settings (Cmd-,) ·
Quit. Cmd-C while menu is open should start a call.
Fail: items missing or shortcuts not working.
Click menubar B → "Open Settings…" (or Cmd-, with menu open).
Pass: 980×720 window opens, embeds the cpanel UI, shows 12 cap rows
with risk-tier badges, permissions card, recent audit ring.
Fail: window doesn't open, or shows a 404/blank page.
Click menubar B → Start Meeting (Cmd-M). Wait 60+ seconds. Click again
to end (or Stop Meeting from the orb menu).
Pass: Brian speaks "Meeting recording started" and "Meeting ended,
processing transcript". Server-side: meeting state goes
recording → processing → completed within ~2 min.
Fail: 404 errors or no audio chunks transcribed → check server log
journalctl -u agent-api --since "2 min ago" | grep meeting.
Ask Brian: "what was I doing in the last 10 minutes?"
Pass: Brian recalls recent active apps + summaries (e.g. "you were
viewing Adobe Photoshop with the Vita Herbs design").
Fail: empty recall → screen-watcher may have stalled; check
pgrep -fl watcher.py on Mac and tail ~/Library/Logs/Brian/screen-watcher.log.
On phone, open https://mac.jonahtebaa.com/cpanel.
Pass: 🛰️ HeyBrian title, 12 cap rows with green pills + risk-tier
badges, permissions card with current TCC grants.
Fail: token prompt every time → localStorage didn't persist across
visits; copy token from ~/.brian/cpanel_token once via the URL
fragment trick #t=<hex>.
~/.heybrian/venv not /tmp/heybrian/venv.mac.jonahtebaa.com — sametail -50 ~/Library/Logs/HeyBrian/heybrian.log and copy.