47e24dbe59
server/services/base.py defines three abstract base classes with type annotations: TTSProvider (async synthesize/synthesize_all, voice_id), LLMProvider (async chat/chat_full, roleplay_model, debrief_model), Guardrail (async check, session_start_disclaimer). GuardrailVerdict/Context/TTSResult/LLMStreamChunk dataclasses carry typed metadata. server/services/registry.py resolves the active adapter from env (PRAXIS_TTS, PRAXIS_GUARDRAIL) so the pipeline never imports a concrete adapter directly — D-014/D-019/D-020 swap wiring. Verified: 'from server.services import TTSProvider, LLMProvider, Guardrail' succeeds. ---ci--- phase: 1 milestone: v0.1 plan: 02 task: 02-01 status: execute persona: backend-engineer requirements: covered: [REQ-VOICE-02, REQ-LLM-01, REQ-ORCH-02] ---/ci---