Aller au contenu

2026-06-13 — Vérification des arêtes de stockage du graphe atomique

ChampContenu
Date2026-06-13
Typecartographie en éventail + revue adversariale
FondeADR 0066 Lot 1 — roundtrip.py consomme le graphe
Éventail17 agents (16 lecteurs, 1 composant chacun + synthèse adversariale)
Verdict5 arêtes de stockage BLOC manquantes confirmées (→ sc) ; 11 fausses alertes réfutées ; clôture dérivée == ancien _DEPENDENTS

Le Lot 1 doit faire dériver la clôture de roundtrip.py du graphe atomique (phase_closure) au lieu de son _DEPENDENTS codé à la main. En préparant la dérivation, un écart est apparu : la clôture dérivée de ceph/sc perdait gitops/gitops-seed que l’ancien _DEPENDENTS (validé à la main) incluait. Le graphe atomique (Lot 0) avait capté les arêtes S3/datalake (via s3-backing-*) mais omis les arêtes de stockage BLOC : un composant qui monte un PVC sur la StorageClass rook-ceph-block-replicated (produite par sc) dépend de sc — détruire sc orphelinerait ce PVC.

Avant de corriger le graphe, il fallait vérifier exhaustivement quelles arêtes manquaient, contre le code, sans deviner.

Synthèse (assainie — valeurs génériques, ADR 0023)

Section intitulée « Synthèse (assainie — valeurs génériques, ADR 0023) »

5 arêtes → sc confirmées, chacune par un PVC réel sur rook-ceph-block-replicated (fichier:ligne à l’appui) :

ComposantPreuve PVC blocEffet sur la clôture
prometheus-stackPVC Grafana / Alertmanager / Prometheusexhaustivité (déjà via S3)
registryregistry-pvc.yaml.j2exhaustivité (déjà via S3)
lokiloki_storage_class (en plus de son OBC S3)exhaustivité (déjà via S3)
cnpg-cluster-pgcluster.yaml storageClassexhaustivité (déjà via S3)
giteagitea-pvc.yaml.j2load-bearing

L’arête gitea → sc est load-bearing : c’est la seule qui fait entrer gitops (gitea) et gitops-seed (gitops-seed → gitea → sc) dans la clôture de sc/ceph. Les quatre autres corrigent l’exhaustivité du graphe (PVC bloc réels que le Lot 0 n’avait pas captés en intension) ; au niveau projeté sur les phases elles sont redondantes (monitoring/dataops dépendaient déjà de sc transitivement par le chemin S3).

Closure dérivée == ancien _DEPENDENTS, vérifié après ajout :

  • closure(sc){datalake, monitoring, gitops, dataops, gitops-seed}
  • closure(ceph) → tout ✅

ceph (CephCluster, ne monte aucun PVC bloc — racine), datalake (CephObjectStore RGW, pas de PVC bloc), dagster/marquez (consommateurs purs de la base CNPG, pas de PVC propre), argocd (volumes emptyDir/configMap/secret seulement), cnpg-operator/barman-plugin (operator/plugin sans stockage), s3-backing-* (créent une OBC, pas un PVC bloc), seaweedfs (PVC sur local-path, profil léger), gitops-seed (aucun PVC ni OBC ; devient dépendant de sc transitivement via gitea, pas par une arête directe).

  • component_deps (bench/lima/rollback-lib.sh) : 5 arêtes → sc ajoutées.
  • phase_closure / phase_involves_storage / phase_of_component ajoutés à la lib (projection du graphe atomique sur les phases) — source unique.
  • roundtrip.py : _DEPENDENTS, _MOUNT_ORDER, _STORAGE_LAYERS supprimés ; closure() / involves_storage() dérivent désormais de la lib (fin de la 2ᵉ source de vérité, ADR 0066 §invariant 3).
  • 10 invariants bats verrouillent la clôture dérivée contre l’ancien _DEPENDENTS (régression impossible).

2ᵉ entrée de la 4ᵉ trace empirique (ADR 0067), après la vérification du graphe atomique.