VOICE STACK · END-TO-END HEALTH CHECK

Is the mic actually working?

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.

Layer checks
If something failed, here's what to do

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.