Commit Graph

6 Commits

Author SHA1 Message Date
Kazeia 6a81b17c0a feat(questionnaires): échelles QCM cliniques (PHQ-9), assignation par patient, scores au dossier
Feature médicale central-only (passation on-device = future spec RPC).

- store: 3 tables (questionnaires template clair, assignments, results chiffrés
  PII); PHQ-9 semé d'office (builtin non supprimable), scoring sum + bandes.
- backend: features/medical/questionnaires (CRUD authoring, scoring +
  interprétation, assignation fréquence once|recurring, record_result, lecture
  par dossier patient); router câblé dans app.py.
- UI: catalogue niveau flotte + éditeur QCM dynamique; assignation & résultats
  par patient; résultats aussi dans le dossier patient (section Patients).
- tests: +5 (seeding, scoring 0/27, authoring, assign/deactivate, chiffrement
  au repos). 59/59. Vérifié end-to-end via TestClient (gate 423, CRUD, scoring,
  builtin protégé).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-01 21:57:44 +02:00
alf 84793cdd76 feat(medical): feature RAG thérapeutique — authoring corpus + retrieval (RPC)
Débloqué par rag_dump/rag_upsert/rag_delete/rag_query (RPC vc19).
- provider : + rag_delete (content delete /rag/{source}).
- service : status, list_docs, get_doc (rag_dump, texte riche), upsert_doc (rag_upsert +
  audit sans le contenu), delete_doc, query (test retrieval).
- router /api/rag/{serial}[/status|/doc/{source}|/query] ; enregistré dans _FEATURES.
- UI : section RAG (statut index, corpus, éditeur de fiche multiligne, test retrieval).
- tests +3. 54/54.
- validé LIVE : PUT fiche riche → rag_dump la relit intacte (':' + saut de ligne) → DELETE.
  (retrieval renvoie vide car l'index device n'est pas prêt sur tablette fraîche —
  mécanisme OK, données à venir.)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-01 19:33:31 +02:00
alf afdf033f8f feat(medical): feature Conversations — rapatriement chiffré + export/purge (RGPD)
Cœur RGPD, débloqué par conversations_export/export_purge (RPC vc19).
- store : archived_sessions (liste), purge_turns (RGPD) ; réutilise turns/archive_turns.
- service.collect : conversations_export → adb pull NDJSON → archive chiffrée (dédup) →
  export_purge IMMÉDIAT (plaintext MVP côté app) ; sessions/session_turns/export_session/purge.
- router /api/conversations/{serial}/collect|{session_id}|/export|/purge ; enregistré.
- UI : section Conversations (rapatrier, sessions, lecture en bulles patient/kazeia,
  export JSON, purge RGPD par session).
- tests +5 (archive richtext ':'+\n déchiffrée, dédup, purge auto device, sessions, purge). 50/50.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-01 18:52:33 +02:00
alf 06f08bd82f feat(medical): feature Patients — dossier clinique chiffré + langue poussée (RPC)
Première feature médicale (features/medical/patients/), valide le patron features/medical
ET le round-trip d'écriture RPC live.
- store : table patient_fiche (identité/contact/clinique CHIFFRÉES, PC-only) + language ;
  save_fiche/fiche/fiches/set_fiche_language.
- service : list_patients (profils on-device × fiche centrale), get_patient (profile_dump
  riche + fiche), save_fiche (central, ne touche pas la tablette), set_language
  (profile_dump → +language → profile_upsert → miroir central).
- router /api/patients/{serial}[/{profile_id}][/fiche|/language] ; enregistré dans _FEATURES.
- UI : section Patients (liste + détail, fiche clinique éditable par rubriques, sélecteur
  de langue + push sur la tablette).
- tests +4 (fiche chiffrée, merge, get, push langue). 46/46.
- validé LIVE vc19 : profile_upsert (langue es + prompt riche ':' intact) round-trip + delete.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-01 18:12:01 +02:00
alf bf02f6ca5d refactor+ui: distinction nette Technique / Médical
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>
2026-07-01 16:54:43 +02:00
alf 2731b37b20 refactor: architecture modulaire core/features + routers par domaine (phase 1)
Refonte évolutive (pas de page blanche) : on garde le code validé hardware, on impose
la structure.
- core/ : adb, provider, store (socle validé) + context.py (Ctx injecté + guard
  centralisé exceptions→HTTP) + operator_router (santé/unlock/audit).
- features/ : voices/ (ex-voice/, sous-système complet) + fleet/ (service + router) ;
  chaque feature expose make_router(ctx). Ajouter un domaine = un dossier + l'enregistrer.
- app.py slim : compose les routers (_FEATURES). Fini le monolithe api/app.py.
- imports migrés, __main__ et tests adaptés. VoiceWorkerError.http_status=503 (découplage).
- 42/42 ; validé live (santé, devices, voices/catalog).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 16:57:26 +02:00