Verification is part of done. Use the checks that match the changed surface.

Core gate

uv run pytest -q
uv run ruff check src tests
uv lock --check
bash -n setup.sh install.sh

Package gate

uv build --sdist --wheel
Use this when packaging metadata, entrypoints, dependencies, README, or release files change.

Runtime smoke

Mock backend:
USE_MOCK_CLIENT=true LIVE_LISTENING_ENABLED=false LIVE_SPEECH_ENABLED=false uv run python src/main.py
Real local backend:
uv run python src/main.py
Use real backend smoke only when Ollama and the configured model are available.

Voice checks

/voice-diagnose
/voice-test
Certification:
uv run python scripts/certify_voice_to_computer.py
uv run python scripts/certify_voice_to_computer.py --include-physical --human-phrase "human microphone release test"
uv run python scripts/certify_voice_to_computer.py --include-physical --synthetic-mic
Keep synthetic and physical microphone results separate.

Docs checks

cd doc
MINTLIFY_TELEMETRY_DISABLED=1 npx -y mint@4.2.565 validate --disable-openapi
MINTLIFY_TELEMETRY_DISABLED=1 npx -y mint@4.2.565 broken-links
Use --disable-openapi because Eyra docs do not define an OpenAPI spec. Use Node 24 LTS or another Mintlify-supported LTS runtime; mint@4.2.565 rejects Node 25+.

Focused tests

Use focused tests while iterating:
uv run pytest tests/test_tool_policy.py -q
uv run pytest tests/test_web_server.py -q
uv run pytest tests/test_voice_diagnostics.py -q
Run the full gate before closing broad work.