Aller au contenu

Architecture

🔵 Tout tourne en conteneurs Docker, orchestrés par docker-compose.yml à la racine du repo. Les artefacts licenciés (index SNOMED, cartes UMLS) ne sont pas dans les images : ils sont montés en volumes RO depuis l’host (BYO) → Modèle de licence (open-core).

Le worker (pré-calcul des candidats, traitement imports/exports) tourne in-process dans le conteneur api. Le runner host est hors conteneur (l’API monte l’index en RO et n’embarque pas les builders) → Opérations & infra.

🔵 La frontière entre dépôts encode la frontière de licence et l’open-core.

DépôtRôleBranche
MB klouche/messierAPI + linking + workermessier-api-v1
Frontend klouche/messier-frontendNext.js (UI curation/dashboard)main
MC messier-compositionallib open-core : moteur compositionnel + buildersmain

MC contient les recettes de build (kb_builders) — jamais le contenu produit. MB consomme les index montés ; le frontend consomme l’API via le contrat.

🔵 Schéma greenfield (db/init_v1.sql). validations est append-only (correction = nouvelle ligne supersedes) ; mentions.status est dénormalisé (source de vérité = dernière validation, via trigger) pour le hot-path de la file.

Enums clés : mention_status (pending · pending_semantic · in_review · validated · rejected · pending_arbitration · arbitrated · pending_oncology), validation_kind (accept · reject · request_arbitration · arbitrate_accept · arbitrate_reject · undo), export_{format,scope,kind}, build_status.

🔵 contracts/openapi.yaml = source de vérité unique. On régénère :

  • features/api/types.ts (openapi-typescript v7) côté frontend ;
  • les schémas Pydantic côté API restent alignés.

Tout drift de contrat casse au compile-time TS — d’où la discipline « éditer le contrat d’abord ». ⚠️ openapi-typescript v7 traite les champs à valeur par défaut comme requis.

Détail des étapes : Imports & exports (interop) · Moteur de linking (cœur ML) · Produit de curation (UX) · Pont terminologique & émission (Mondo→SNOMED).