Un seul conflit, docs/architecture/50-cicd.md : les deux côtés ajoutaient une section au même endroit, après « Secrets ». Les deux sont conservées. Celle de la branche, « Pourquoi le job d'intégration ML installe aussi le backend », remonte sous « Le job d'intégration, et pourquoi il ne suffisait pas d'un postgres », dont elle est le prolongement : posée après « Secrets », elle en devenait une sous-section. openapi.json régénéré : dev a renommé le schéma de sécurité « Jeton d'accès » en « JetonAcces » pour l'analyseur de contrat de ZAP, et la route /api/v1/monitoring/drift ajoutée ici portait encore l'ancien nom dans le contrat figé. Aucune fusion textuelle ne pouvait le voir.
Documentation
adr: décisions d'architecture, une par fichier, numérotées et immuables.architecture: les vues du système. Point d'entrée : architecture/README.md.
Décisions en vigueur
| ADR | Sujet |
|---|---|
| 0001 | PostgreSQL avec l'extension TimescaleDB |
| 0002 | Authentification par JWT d'accès et jeton de rafraîchissement opaque |
| 0003 | Autorisation RBAC à trois rôles, relecture du compte à chaque requête |
| 0004 | Journal d'audit en ajout seul, garanti par PostgreSQL |
| 0005 | LightGBM pour la prédiction de consommation, un modèle global |
| 0006 | Le moteur de règles de recommandation vit dans le backend, pas dans ml/ |
| 0007 | Terminaison TLS par un reverse proxy Nginx, en Docker Compose |
| 0008 | Airflow exécute le code du backend en sous-processus, dans son propre environnement |
| 0009 | Deux environnements sur la VM ENI, un projet Compose chacun, déployés par un runner auto-hébergé |
| 0010 | Terraform provisionne la machine, GitHub Actions déploie l'application |
| 0011 | La surveillance de dérive vit dans le backend et écrit sa propre table |