This page tests every layer of the voice-input stack and tells you exactly where the failure is. Bookmark it. The next time SPEAK doesn't do anything, open this page first.
Permissions-Policy blocks the microphone. The site server is sending a header that forbids ALL origins (including ours) from using the mic. Fix the Caddyfile: microphone=(self) instead of microphone=().
HTTPS not in use. Browsers require a secure context for getUserMedia. localhost works; plain HTTP does not.
Mic permission denied. The user clicked "Block" on the permission prompt, or the OS-level mic permission for the browser is off. Re-grant via the address-bar lock icon + browser settings.
OPENAI_API_KEY unset on server. /api/transcribe returns 503. Run grep OPENAI /etc/counsel-day-app/env.local on the server.
Daily Whisper budget hit. /api/transcribe returns 503 once we cross the $5/day cap. Check WHISPER_DAILY_BUDGET_USD in env.local.
Tier gate. /api/transcribe returns 402 for Solo Free decisions. Voice is a paid-tier benefit when scoped to a specific decision; on compose there is no decision_id so the gate doesn't fire.