You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Audit du modèle de données annotations (revue prod-grade, mai 2026) :
une annotation annotation_type IN ('auto', 'auto_confirmed') ne porte aucune trace du modèle qui l'a produite. Seule la table corrections
mémorise model_name + model_version, et uniquement si une correction
ultérieure a eu lieu.
Conséquence : impossible de reconstituer le training set d'une prochaine
version du modèle (« annotations produites par ResNet50-v2.3 puis
validées par un pathologiste »). Bloque #346, #340, #341, #347.
Contexte
Audit du modèle de données annotations (revue prod-grade, mai 2026) :
une annotation
annotation_type IN ('auto', 'auto_confirmed')ne porteaucune trace du modèle qui l'a produite. Seule la table
correctionsmémorise
model_name + model_version, et uniquement si une correctionultérieure a eu lieu.
Conséquence : impossible de reconstituer le training set d'une prochaine
version du modèle (« annotations produites par ResNet50-v2.3 puis
validées par un pathologiste »). Bloque #346, #340, #341, #347.
Objectif
Enregistrer sur chaque annotation produite par l'IA :
ml_models(créé par feat(ml): foundation model registry + adapter (UNI, CONCH, Virchow, GigaPath, mSTAR) #346)source_confidence, distinct deconfidence(recalculable)source_tile_refsJSONB structuré, pour explicabilité AI Act art. 12Approche technique proposée
Migration
010_annotation_source_traceability.pyBackfill best-effort depuis
correctionsquand un seul(model_name, model_version)existe pour une annotation.Schéma Pydantic
source_tile_refsModifications routes ML
routes/ml.py::predict: passersource_model_idà la matérialisationroutes/ml.py::detect: idemroutes/annotations.py::POST: siannotation_type IN ('auto', 'auto_confirmed'),source_model_iddevient obligatoire (422 sinon)Backward-compat
Annotations historiques sans
source_model_idrestent valides (NULL OK).Endpoint admin
GET /api/v1/admin/annotations/orphansliste ces orphelins.Acceptance criteria (fonctionnel)
010_*créée, up + down testésAnnotationétendu avec les 3 colonnesTileRef,SourceTileRefsdansschemas/ml_source.pypredict,detect,annotations POSTrejettent les annotations IA sanssource_model_id(HTTP 422 avec message explicite)GET /api/v1/admin/annotations/orphans(réservé ADMIN_TECHNIQUE)docs/Admin/services/annotation-provenance.mdReview checklist (conditions de validation pour le reviewer PR)
Code
predict → matérialiser → GET annotationretournesource_model_idnon-nullannotationsexistantes (tests anciens passent)CHANGELOG.mdBase de données
down()testée — restitue la DB dans son état pré-migrationWHERE source_model_id IS NOT NULLcréé (économie d'espace)N annotations updated, M orphans)ON DELETE SET NULLvalidée par un test (supprimer unml_modelsne casse pas les annotations)Sécurité & RGPD
source_model_idfiltré par tenant (un user du tenant A ne peut pas référencer un modèle du tenant B)require_role("ADMIN_TECHNIQUE")uniquementsource_tile_refsvalidé strictement par Pydantic (pas de JSONB libre)autoDocumentation
backend/models/info.mdmis à jour (description des 3 nouveaux champs)docs/architecture/ANNOTATION_DATA_MODEL_AUDIT.md: G1 + G10 marquésRESOLVEDField(description=...))Dépendances
ml_models)Hors-scope
ml_modelsorphelins (couvert par feat(ml): foundation model registry + adapter (UNI, CONCH, Virchow, GigaPath, mSTAR) #346)Références
docs/architecture/ANNOTATION_DATA_MODEL_AUDIT.md§3 (G1 + G10)