Aller au contenu

Audit cloud-native (12 facteurs + extensions) — 2026-06-04

Date de l’audit : 2026-06-04. Méthode : workflow multi-agents (16 dimensions auditées en parallèle — les 12 facteurs de Twelve-Factor App plus 4 extensions modernes Beyond the Twelve-Factor : API-first, observabilité, sécurité, données stateful). Chaque constat est prouvé par le code (chemins de fichiers lus) puis vérifié de manière adversariale par un second agent qui rouvre les preuves ; 4 verdicts initialement optimistes ont été rétrogradés à la vérification.

Unités déployables évaluées : applications amarre, atlas-dashboard, crf-dashboard, ecrin, find-an-expert, sillage (SvelteKit) et le service services/crf (Hono). Le déploiement et l’infrastructure (dépôt cluster) sont hors périmètre.

4 appliqués · 8 partiels · 3 écarts · 1 non applicable.

Aucun écart n’est bloquant pour l’usage actuel (développement sur fixtures) ; ils cadrent le durcissement avant un déploiement multi-instance. Le résumé vivant est tenu à jour dans Normes et pratiques appliquées ; ce rapport en fige l’état au 2026-06-04 avec les preuves.

FacteurÉtatPreuve principaleÉcart constaté
I. CodebaseAppliquépnpm-workspace.yaml, remote git unique, versions par paquet
II. DependenciesAppliquépnpm-lock.yaml, packageManager pinné, ~ (ADR 0024)
III. ConfigAppliqué$env/static|dynamic, PUBLIC_*, .env*.example, gitleaks
IV. Backing servicesAppliquéCRF/BaaS/télémétrie par URL+credentials en env
V. Build / release / runPartielapps/sillage/Dockerfile (multi-stage)Pas d’image de déploiement pour 5 apps ni le service → issue
VI. Processes (stateless)PartielSessions via cookie/backing serviceQuelques états mémoire au niveau module (rate-limit de log)
VII. Port bindingPartielservices/crf/src/server/env.ts lit PORTPas de containerisation autonome pour 5 apps → issue
VIII. ConcurrencyÉcartCaches en fichiers JSON locaux sans verrou (dashboards) → issue
IX. DisposabilityÉcartadapter-node graceful côté appsService Hono sans handler SIGTERM/SIGINT → issue
X. Dev/prod parityÉcartSandboxes Docker reproduisant les backing services.nvmrc non figé, pas d’image prod pour le service → issue
XI. LogsPartielLogs applicatifs vers stdoutcrf-logs persiste des logs en fichier (.crf-stats.json) → issue
XII. Admin processesPartielCLIs (cli/*), scripts de bootstrapPas de pattern explicite pour l’admin en production
ext. API-firstPartielOpenAPI (services/crf, crf-openapi)Specs générées depuis le code, pas de politique « contrat d’abord » actée
ext. ObservabilitéPartielOpenTelemetry sur services/crf, Sentry sur 3 appsNon généralisé (3 apps sans Sentry), aucune métrique → issue
ext. Sécurité / authPartielCookies durcis, CSP, en-têtes, auth des appsService CRF sans middleware d’auth (routes ouvertes) → issue
ext. Données statefulNon applic.ADR 0029 (conçu)Plateforme stateful documentée mais pas encore implémentée

Les écarts actionnables sont tracés comme issues (label enhancement / tech-debt), milestone Transverse — Qualité applicative :

  • Arrêt propre du service Hono (SIGTERM/SIGINT) — facteur IX.
  • Logs en flux stdout plutôt qu’en fichiers (crf-logs) — facteur XI.
  • Caches non sûrs en multi-instance (dashboards) — facteur VIII.
  • Authentification du service CRF — extension sécurité.
  • Images de déploiement (5 apps + service) — facteurs V / VII / X.
  • Généralisation de l’observabilité — extension observabilité.

Requalification a posteriori (2026-06-30). Le finding « facteur XI » ci-dessus (crf-logs persiste des logs en fichier) reposait sur une mauvaise qualification : crf-logs n’est pas un journal applicatif mais un cache de données externes (audit logs REDCap fetchés par HTTP, puis analytics). Le facteur XI ne s’y applique pas ; le sujet relève des facteurs IV/VIII (backing service), traités par #443. Détail dans la Requalification de l’ADR 0040 (#305).

Conformément à la convention des audits, ce rapport est figé : il décrit l’état au 2026-06-04. Un futur audit produira un nouveau rapport daté.