Séparation des deux domaines produit, code ET interface.
- code : features/technical/ (voices, fleet) vs features/medical/ (prêt pour patients,
conversations, rag, questionnaires). Imports cross-domaine en absolu (robustes aux
déplacements). 42/42.
- UI : nav en 2 blocs distincts — 🔧 Technique (Flotte, Voix, Mises à jour, Config &
moteur, Audit) et ⚕️ Médical/clinique (Patients & profils, Conversations, RAG
thérapeutique, Questionnaires — nouvelle section). Accents de couleur par domaine.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- store : colonne locked_profile_id (+ migration ALTER idempotente), lock_voice/
unlock_voice. Verrou = assignation exclusive à un profil ; NULL = voix généraliste.
- orchestrator : list_voices expose locked_profile_id + used_by_profiles (croise
profile.voice_id) ; sync_device enrôle+déploie les voix en attente, REFUSE de
déployer une voix verrouillée sur une tablette sans le profil propriétaire.
- autosync : VoiceAutoSync — watcher de connexions armable depuis l'UI (désarmé par
défaut), statut par tablette, ne fait rien si store verrouillé (PII), delete opt-in.
- API : lock/unlock, POST /{serial}/sync, GET/POST /voices/autosync (déclarées AVANT
/{serial} pour éviter la capture "autosync" comme serial).
- tests : +8 (verrou, sync verrou-conscient, autosync). 39/39.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>