Kazeia-central/kazeia_central
alf 23033384c7 feat(voice): verrou voix↔profil + sync verrou-conscient + déclencheur auto
- 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>
2026-06-19 16:20:55 +02:00
..
adb feat: store chiffré, dashboard web flotte, accès réseau + durcissements 2026-06-18 22:41:55 +02:00
api feat(voice): verrou voix↔profil + sync verrou-conscient + déclencheur auto 2026-06-19 16:20:55 +02:00
provider feat: store chiffré, dashboard web flotte, accès réseau + durcissements 2026-06-18 22:41:55 +02:00
store feat(voice): verrou voix↔profil + sync verrou-conscient + déclencheur auto 2026-06-19 16:20:55 +02:00
voice feat(voice): verrou voix↔profil + sync verrou-conscient + déclencheur auto 2026-06-19 16:20:55 +02:00
web feat(fleet): fan-out parc — vue d'ensemble + OTA groupé, rapport par device 2026-06-18 22:52:11 +02:00
__init__.py chore: socle Kazeia-central (étapes 0-1 lecture) + spec provider RPC 2026-06-18 14:51:41 +02:00
__main__.py feat: store chiffré, dashboard web flotte, accès réseau + durcissements 2026-06-18 22:41:55 +02:00
fleet.py feat(fleet): fan-out parc — vue d'ensemble + OTA groupé, rapport par device 2026-06-18 22:52:11 +02:00