Kazeia-central/tests
alf 06b5cda214 feat(voice): ingestion depuis le stockage ADMIN (manifestes record-time §4.2)
Comble le gap : les voix fraîches + leur manifeste (scope/owner/reference_text) vivent
dans Android/data/com.kazeia.admin/files/voix/ (VoiceStorage.kt), pas dans /voices.
- admin_ingest.py : list_manifests (ls + pull .json), delete_admin_voice. Schéma fondé
  sur VoiceStorage.save().
- orchestrator : list_admin_voices, ingest_voice (pull→archive→scope/owner/consentement
  →verrou si exclusive→enroll ASR→deploy selon scope), sync_admin. pending = archivée,
  ni enrôlée ni déployée. exclusive owner absent = verrou_profil_absent.
- _patient_omnivoice_dir robuste : env → wav_path legacy → sonde MODELS_DIR device
  (post-migration /voices.wav_path est VIDE pour une voix déployée).
- store : colonnes scope/owner_name/consent_text_enc (consentement chiffré, PII) +
  migration + set_voice_manifest. consent_text déchiffré dans voice_record/voices.
- autosync → sync_admin (le déclencheur auto ingère depuis l'admin).
- API : GET /voices/{serial}/admin, POST /voices/{serial}/admin/sync.
- enroll = ASR du 16s (migration §6) ; reference_text gardé comme trace de consentement.
- tests +8. 46/46. Validé live : manifeste synthétique → .ovsp déployé sur tablette.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 10:30:58 +02:00
..
test_adb_parse.py feat: store chiffré, dashboard web flotte, accès réseau + durcissements 2026-06-18 22:41:55 +02:00
test_api_store.py feat(voice): verrou voix↔profil + sync verrou-conscient + déclencheur auto 2026-06-19 16:20:55 +02:00
test_fleet.py feat(voice): verrou voix↔profil + sync verrou-conscient + déclencheur auto 2026-06-19 16:20:55 +02:00
test_store.py feat: store chiffré, dashboard web flotte, accès réseau + durcissements 2026-06-18 22:41:55 +02:00
test_voice.py feat(voice): ingestion depuis le stockage ADMIN (manifestes record-time §4.2) 2026-06-23 10:30:58 +02:00