flochai flochai Audit de plateforme ← flochai.com EN
Exemple

Nordvantage Logistics SA n'existe pas. Chaque nom d'entreprise, nom de service, chiffre, sortie de commande, identifiant et date ci-dessous est inventé. Ceci n'est pas le compte rendu d'un travail réalisé pour un client, réel ou prospectif. nordvantage.example est un domaine réservé, non routable.

Les situations décrites viennent de missions réelles, chiffres décalés et noms retirés. Les conditions se répètent ; le client, non.

Audit de plateforme · Rapport v1.0

Nordvantage Logistics SA

Une semaine de revue des pipelines CI/CD, de l'infrastructure, des déploiements, de l'observabilité, de la reprise après sinistre et du facteur bus. En lecture seule sur tout ce qui est en service, plus un test de restauration dans une instance jetable.

En un coup d'œil

Une page · si vous ne transférez qu'une chose, transférez celle-ci

1
Constat Élevé
notifié le jour même
3 + 5
Moyens et Faibles
listés en intégralité
7 164 €
Par an, rattachés
à rien
3 h 40
Restauration mesurée
jusqu'ici inconnue
12/14
Items du plan faisables
par votre équipe seule

Ce que cette semaine a coûté, face à ce qu'elle a trouvé. L'audit était à 4 900 €. Le premier tableau de coûts fait 7 164 € par an et ne demande de décision à personne : le montant de l'audit revient donc en environ sept mois sur ce seul tableau. Le second tableau représente 24 360 € de plus par an, et chacune de ses lignes coûte du temps d'ingénierie à capturer. Aucun des deux chiffres ne compte le constat Élevé, et aucun ne compte le fait de savoir que la restauration prend 3 h 40.

Je n'ai pas multiplié tout ça pour en faire un titre. Les chiffres sont ci-dessus ; la division vous appartient.

Tout le reste est Moyen ou Faible et rien ne brûle. Deux conditions que j'ai soulevées pendant la semaine ont été tuées par leur propre contre-argument et sont imprimées au §8 avec l'argument qui les a tuées.

Emportez le résumé de trois pages

Le PDF reprend le résumé qui ouvre ce rapport, mis en page pour l'A4. Laissez un email et il est à vous ; cela nous dit aussi que quelqu'un lit.

Télécharger le résumé (PDF)

§ 0Ce que vous avez entre les mains

MissionAudit de plateforme, prix fixe, une semaine de revue
PérimètreSix domaines : pipelines CI/CD · infrastructure · déploiements · observabilité · reprise après sinistre · facteur bus
MéthodeObservation en lecture seule de tout ce qui est en service, plus un test de restauration dans une instance jetable. 58 contrôles pré-enregistrés, envoyés le 6 mai, avant le début de la semaine
Accès détenusViewer GCP sur 3 projets · viewer du compte de facturation · Reporter GitLab sur le groupe nordvantage · Owner GitLab de groupe limité à CI-01, accordé le 12/05 et révoqué le 15/05 · Datadog en lecture seule. Registre complet des accès accordés et refusés en annexe D
Preuves71 éléments capturés, livrés sous la forme evidence-nordvantage-2026-05.tar.age, chiffrés vers votre clé
LivrablesCe rapport : un registre de risques classé par impact, un plan sur 90 jours ordonné par valeur contre effort, et un call de restitution d'une heure

Cet audit n'a rien changé à ce que vous exploitez. Aucune configuration n'a été modifiée et aucun correctif n'a été appliqué. Chaque commande de ce rapport est en lecture seule et vous pouvez toutes les rejouer vous-mêmes. La seule exception est dite clairement parce qu'elle compte : le test de restauration (R-009) a provisionné une instance jetable, y a restauré une sauvegarde, et l'a détruite le jour même. Rien de ce qui est en service n'a été touché à aucun moment.

Contractuellement hors périmètre, donc absent : tout correctif, développement ou changement de configuration ; tests de sécurité applicative ; tests d'intrusion ; revue de code applicatif ; audit de conformité réglementaire. Là où un contrôle a frôlé l'un de ces sujets, la limite est indiquée au contrôle. DE-01 est le cas le plus net : j'ai lu quels chemins chaque merge request touchait, et le DDL de vos fichiers de migration. Je n'ai pas lu la logique applicative.

Chaque chiffre tiré de vos systèmes porte sa source en ligne. Les décomptes de mes propres contrôles, et mes estimations de l'effort de votre équipe, sont de moi et ne portent aucun marqueur. Ce sont les seuls nombres non marqués de ce document.

§ 1La version courte

Nordvantage exploite une plateforme de réservation et de suivi de fret sur GCP : deux clusters GKE Autopilot, nv-prod et nv-staging, portant 23 services kubectl · relevé du 13/05, une instance Cloud SQL PostgreSQL régionale, un cluster Kafka managé pour les événements transporteurs, et une instance GitLab auto-hébergée qui est à la fois votre source de vérité et votre chemin de déploiement. Une quarantaine d'ingénieurs déclaré · call 1, qui livrent chaque semaine avec des hotfixes au besoin.

J'ai passé 58 contrôles sur six domaines. 34 sont revenus conformes, 9 ont produit un constat, 2 ont produit un constat de coûts, 5 n'ont pas pu être tranchés en cinq jours, 8 ne s'appliquaient pas à votre installation.

Sur les 9 constats, 1 est classé Élevé, ce qui veut dire que j'ai observé chaque étape d'une séquence menant à une exposition d'identifiants, sauf l'événement déclencheur lui-même. C'est R-001, votre instance GitLab, et j'ai appelé Marc le 12 mai plutôt que de garder ça pour ce document. Fermer l'exposition coûte une demi-journée plus une fenêtre de maintenance. Les huit autres sont trois Moyens et cinq Faibles, listés en intégralité, chacun avec la raison pour laquelle il n'a pas passé la barre.

12 des 14 items du plan sur 90 jours sont des choses que votre équipe peut faire sans aide extérieure. Les cinq premières, qui ferment le constat Élevé et deux Moyens, représentent environ deux jours-personne plus une fenêtre de maintenance. Le reste s'étale sur le trimestre et chaque action porte sa propre estimation au §10. Les deux qui demandent une compétence que vous n'avez peut-être pas en interne sont nommées comme telles, avec la capacité précise écrite noir sur blanc.

En dehors du registre, la revue de facturation a identifié 7 164 € par an de dépense rattachée à des ressources qui ne servent rien, et 24 360 € de plus par an qui valent la peine mais demandent une décision de votre part. Les coûts ne sont pas du risque, donc rien de tout ça n'est dans le registre ; c'est au §7, avec la méthode qui l'a produit.

Deux conditions que j'ai soulevées mardi ne sont pas du tout dans le registre. Elles ont échoué à leur propre contre-argument et partent en rejets, parce qu'un registre qui ne fait que grossir est un document commercial.

§ 2Couverture

58 contrôles, pré-enregistrés et qui vous ont été envoyés le 6 mai, cinq jours avant le début de la semaine. Vous pouviez voir la liste avant que je ne voie vos systèmes. Cet ordre est voulu : il empêche que la liste de contrôles soit écrite à rebours, à partir de ce que j'aurais fini par trouver.

DomaineContrôlesConformesConstatsCoûtsNon déterminéN/A
Pipelines CI/CD1281012
Infrastructure1463212
Déploiements952011
Observabilité851011
Reprise après sinistre952011
Facteur bus650001
Total58349258

Quand un contrôle échantillonnait au lieu d'énumérer, la population, la taille de l'échantillon et la règle de sélection ont été notées au moment de l'échantillonnage. Rien ici ne reconstruit sa propre logique d'échantillonnage après coup, parce qu'une logique reconstruite est toujours flatteuse.

§ 3Ce qui fonctionne, et qu'il ne faut pas toucher

Un rapport qui n'est que constats est à la fois un document commercial et une description inexacte de votre plateforme. Les éléments ci-dessous sont porteurs, et je plaiderais contre le moindre changement sur chacun d'eux.

Tous les pipelines exécutent le même template à sept étapes. 21 des 23 services étendent un composant CI partagé issu d'une bibliothèque interne plutôt que de porter du YAML sur mesure GitLab · API, 13/05. C'est la première raison pour laquelle votre surface CI est auditable tout court, et pourquoi le contrôle CI-04 a pris vingt minutes plutôt que deux jours.

Une politique d'organisation bloque les adresses IP externes sur les VM du dossier de production, avec une liste d'autorisation de trois IDs d'instance gcloud org-policies describe, 13/05. La liste d'exceptions est assez courte pour être lue, et quelqu'un a veillé à ce qu'elle le reste.

Le state Terraform est distant, versionné et verrouillé, et le plan nocturne tourne sur planification, avec sa sortie conservée GitLab · pipelines planifiés, 12/05. La dérive est visible dès le lendemain matin, sans que personne ait à penser à la chercher.

Chaque déploiement est traçable jusqu'à une merge request. Chaque déploiement en production dans la fenêtre d'audit portait une MR liée et un approbateur qui n'était pas l'auteur GitLab · API deployments, du 11/05 au 15/05.

Le routage des alertes a un propriétaire par service, et le planning d'astreinte est à jour et nomme une seconde personne pour chaque créneau Datadog · monitors, 14/05. Le facteur bus était le domaine dont j'attendais le plus un constat, et il n'en a produit aucun.

Le wiki de runbooks est utilisé, pas seulement présent. 11 des 14 runbooks ont été modifiés dans les 90 derniers jours Wiki GitLab · historique des pages, 14/05. C'est inhabituel à cette taille, et ça mérite d'être protégé.

§ 4À ne pas faire

Deux choses qu'un trimestre plein de bonnes intentions pourrait produire, et qui rendraient votre plateforme pire.

Ne restreignez pas gitlab-deploy@ à objectViewer sans vérifier d'abord ce qu'il écrit

C'est le nettoyage qui a l'air évident, et il peut faire tomber la production. Avant d'y toucher, lancez git grep -nE 'terraform (plan|apply|init)' restreint aux jobs de déploiement, et lisez 90 jours de logs d'accès aux données du bucket, filtrés sur les écritures de ce principal. Si l'un des deux renvoie quoi que ce soit, le droit est porteur. Si vous le faites quand même, le rollback consiste à ré-accorder objectAdmin. Notez aussi que l'item 9 du plan met un job Terraform dans la CI ce trimestre, ce qui entrerait en collision avec le droit restreint.

N'adoptez ni modèle de maturité ni dashboard de scoring pour ce registre

Huit constats n'ont pas besoin d'une heat map, et dès qu'un registre a un score, c'est le score qu'on se met à gérer. Ceci est une liste de conditions précises avec des actions suivantes nommées, et elle doit le rester.

§ 5Si vous ne faites que trois choses

#ItemRegistreEffortQui
1Sortir l'instance GitLab de son adresse publique, ou placer un proxy d'authentification devantR-001une demi-journée + fenêtrevotre équipe
2Patcher bastion-ops et l'inscrire à un calendrier de mises à jour de sécuritéR-003quelques heuresvotre équipe
3Débloquer la migration d'arrière-plan coincée pour ouvrir le chemin de mise à niveauR-002plusieurs joursvotre équipe

Cela représente une journée et demie du temps de votre équipe, plus une fenêtre de maintenance, et cela solde le seul Élevé ainsi que deux des trois Moyens.

Cette liste est ordonnée autrement que la liste courte à la fin du §10, délibérément. Ici, le classement se fait par réduction du risque. Là-bas, par ce qui tient dans un après-midi. R-002 est le plus gros chantier et il arrive troisième parce que l'item 1 n'en dépend pas : vous pouvez fermer l'exposition aujourd'hui, et mettre à niveau dans la fenêtre que vous avez déjà réservée.

§ 6Registre de risques

NiveauNombreEffort total
Élevé1une demi-journée + fenêtre
Moyen3plusieurs jours, plus quelques heures
Faible5environ 3 jours
Total9

Les niveaux sont dérivés, pas choisis. Chaque entrée énonce une classe de conséquence et un grade de preuve du déclencheur, et le niveau est la lecture croisée des deux dans la table ci-dessous. Pour faire monter une entrée, je dois produire une preuve qui la déplace d'une case. Je ne peux pas taper un niveau à la main.

Classe de conséquence ↓ / déclencheur →observed-in-windowmechanism-presenthypothetical
data-lossélevéélevémoyen
credential-exposureélevéélevémoyen
outage-hoursélevémoyenfaible
outage-minutesmoyenfaiblefaible
degradedmoyenfaiblefaible
toilfaiblefaibleécarté
latentfaiblefaibleécarté

observed-in-window — la chaîne complète, événement déclencheur compris, s'est produite dans vos données, datée.
mechanism-present — chaque étape de la chaîne observée ; seul l'événement déclencheur absent.
hypothetical — au moins une étape de la chaîne est supposée plutôt qu'observée.

Notez ce que les deux dernières lignes suppriment : un agacement hypothétique n'est pas un constat, ce n'est rien. Deux conditions ont été écartées par cette règle cette semaine et figurent en §8.

4 des 9 entrées étaient déjà identifiées chez vous, dont 0 sur 1 Élevé. Sur ces quatre, l'apport est la datation, la conséquence et l'ordre, pas la découverte. 7 des 9 sont corrigeables par votre équipe seule.

R-001 · infrastructure

Un GitLab auto-hébergé répond sur une adresse publique tout en exécutant une version visée par des avis de sécurité publiés et non corrigésÉlevé

credential-exposure×mechanism-present Élevé base measured · une demi-journée + fenêtre · votre équipe
NotifiéMarc D., téléphone, le 12/05 à 16 h 20. C'était en service quand je l'ai trouvé et vous l'avez su l'après-midi même, pas par ce fichier.

gitlab.nordvantage.example résout vers une règle de forwarding globale portant une adresse externe, et une règle de pare-feu admet 0.0.0.0/0 sur le port 443 vers le tag de l'instance gcloud forwarding-rules; firewall-rules, 12/05. La version en service est la 16.9.1 GitLab /api/v4/version, 12/05, contre laquelle l'éditeur a publié trois avis décrivant une exécution de code à distance authentifiée, aucun corrigé en 16.9.1 GitLab · notes de version, lues le 12/05. L'instance détient 14 variables CI/CD au périmètre du groupe, dont 6 sont référencées par leur nom dans le job de déploiement de production GitLab · métadonnées des réglages CI/CD, 12/05.

Chaque étape de cette chaîne est observée. La seule étape absente, c'est un attaquant qui décide de la parcourir.

Une inférence, nommée comme telle. Que ces six variables soient suffisantes pour déployer est inféré de leurs noms, de leur environment scope et du job de déploiement qui les référence. Je n'ai lu aucune valeur et je n'aurais pas pu : l'accès était limité aux métadonnées (annexe D). Si vous savez que l'une d'elles est inerte, dites-le au call de restitution et le constat descend d'un niveau.

L'argument le plus fort contre ce constat

L'objection que vous avez faite pendant le call, et c'est la bonne : l'instance exige une connexion, le SSO est imposé, aucune route anonyme n'existe, donc un inconnu ne peut pas simplement lire les variables. C'est vrai, et c'est pour ça que ce n'est pas pire. Ça ne lève pas le constat, parce que deux des trois avis ne demandent que le niveau de privilège authentifié le plus bas, et que votre instance accepte les inscriptions depuis n'importe quelle adresse qui l'atteint. La distance entre joignable et exploité, ici, c'est une technique publiée et un compte, pas un projet de recherche.

Des preuves que vous pouvez rejouer

# 1. Joignable de l'extérieur ? À lancer depuis une machine qui n'est PAS sur votre réseau.
curl -sS -o /dev/null -w 'HTTP %{http_code} from %{remote_ip}\n' \
  https://gitlab.nordvantage.example/users/sign_in

# 2. Quelles règles ingress créent un chemin public (périmètre : ingress seul, règles actives seules)
gcloud compute firewall-rules list \
  --filter='direction=INGRESS AND disabled=false AND sourceRanges:0.0.0.0/0' \
  --format='table(name,priority,network,targetTags.list(),
                  allowed[].map().firewall_rule().list())'

# 3. Ce qui s'applique réellement à l'instance, pas ce qui existe simplement dans le projet
gcloud compute instances network-interfaces get-effective-firewalls gitlab-01 \
  --zone=europe-west1-b \
  --format='table(type,direction,disabled,priority,sourceRanges.list())'

# 4. Les six variables, métadonnées seulement. jq supprime .value avant que quoi que ce soit ne touche le disque.
curl -sS -H "PRIVATE-TOKEN: $TOKEN" \
  'https://gitlab.nordvantage.example/api/v4/groups/nordvantage/variables?per_page=100' \
  | jq -r '.[] | [.key, .protected, .masked, .environment_scope] | @tsv'

Ce que ces commandes renvoient : la commande 1 est celle qui prouve le constat, et c'est celle à lancer en premier : un statut HTTP obtenu par une requête non authentifiée faite hors de votre réseau. Les commandes 2 et 3 disent pourquoi elle répond, et la 3 fait foi, parce qu'elle rapporte les règles effectives sur l'instance plutôt que toutes les règles qui existent dans le projet. La commande 4 renvoie quatre colonnes de métadonnées par variable et aucune valeur.

Les métadonnées des variables plaident dans les deux sens, alors les voici. Des six que le job de déploiement référence, quatre sont masked et deux ne le sont pas ; aucune n'est protected ; les six portent environment_scope: * GitLab · métadonnées des réglages CI/CD, 12/05. Non protégées et sans périmètre, voilà ce qui les rend lisibles par un pipeline sur n'importe quelle branche. Le masquage cache une valeur dans les logs de job ; il n'empêche pas l'API de la renvoyer à une session capable de lire la page des réglages.

R-002 · CI/CD

Une batched background migration échoue depuis le 14 avril, et elle bloque le chemin de mise à niveauMoyen

outage-hours×mechanism-present Moyen base measured · plusieurs jours · votre équipe

Une batched background migration réessaie et échoue depuis le 14/04 GitLab Admin · background migrations, 13/05. Le chemin de mise à niveau de GitLab refuse d'avancer tant qu'une batched migration n'est pas terminée GitLab · documentation de mise à niveau, donc votre prochaine mise à niveau s'arrête en cours de route et l'instance reste indisponible le temps du diagnostic, dans la fenêtre plutôt qu'avant. Chaque étape de cette chaîne est observée ; l'étape absente, c'est quelqu'un qui lance la mise à niveau. Horizon : la première tentative de mise à niveau, que R-001 vient de rendre urgente.

L'argument le plus solide contre ce constat

L'objection qui mérite d'être faite, et celle qui a rétrogradé cette entrée : les batched background migrations sont des backfills de données post-déploiement, pas des changements de schéma en cours de vol. La base n'est pas à moitié convertie, et une restauration n'hériterait pas d'un schéma cassé. C'est exact. J'avais soulevé ce point comme perte de données mardi, et il n'a pas survécu au contact de ce que la table de suivi montre réellement. Ce qui reste est réel et plus étroit : une mise à niveau dont vous avez désormais besoin pour R-001 échouera dans la fenêtre si ce point n'est pas réglé d'abord.

Preuves que vous pouvez rejouer

# Le statut symbolique, et seulement ce qui n'est pas terminé. status_name évite
# l'enum numérique, qui est ce qui rend la table brute pénible à lire.
sudo gitlab-rails runner '
  Gitlab::Database::BackgroundMigration::BatchedMigration
    .where.not(status: :finished)
    .each { |m| puts [m.id, m.job_class_name, m.table_name,
                      m.status_name, m.updated_at].join("  ") }'

# Les jobs en échec sous l'une d'elles. `attempts` et l'exception vivent
# ici, sur la table des jobs, pas sur la ligne de la migration.
sudo gitlab-psql -c "select batched_background_migration_id as mig, status, \
  attempts, left(exception_class, 48) as exception, updated_at \
  from batched_background_migration_jobs \
  where batched_background_migration_id = 4291 \
  order by updated_at desc limit 10;"

Ce que ces commandes retournent : la première liste les batched migrations non terminées avec un statut lisible ; la seconde liste les échecs de jobs individuels sous l'une d'elles, avec le nombre de tentatives et la classe d'exception. Notez ce qui n'est pas ici : gitlab-rake db:migrate:status rapporte les migrations de schéma classiques et ne voit pas du tout les batched background migrations, donc il ne peut pas soutenir ce constat et je ne l'ai pas cité. Aucune des deux commandes ne dit si une restauration réussirait ; ça, c'est R-009.

R-003 · infrastructure

bastion-ops cumule 34 mises à jour de sécurité en attente, dont une mise à jour du noyauMoyen

credential-exposure×hypothetical Moyen base measured · quelques heures · votre équipe

L'hôte de rebond bastion-ops rapporte 34 mises à jour en attente, toutes les 34 issues du pocket security, et le noyau en service a deux versions d'ABI de retard sur le paquet le plus récent installé apt-check; uname -r, 13/05. L'hôte porte le SSH agent forwarding du projet de production et il est la route documentée vers les instances Cloud SQL runbook db-access, 13/05. Une élévation de privilèges locale à cet endroit atteint les identifiants de la base de production.

L'argument le plus solide contre ce constat

L'objection qui manque de le tuer : l'hôte n'a pas d'adresse externe, il est derrière la politique d'organisation du §3, et l'atteindre demande IAP plus une identité Google dans votre annuaire. Un attaquant qui détient déjà ça a des chemins plus faciles qu'un exploit noyau. C'est exactement pourquoi le déclencheur est hypothetical et pas mechanism-present : l'étape où un attaquant obtient une session sur cette machine est supposée, pas observée. L'entrée reste au registre parce que le correctif se compte en heures, pas parce que la chaîne est complète.

Preuves que vous pouvez rejouer

gcloud compute ssh bastion-ops --tunnel-through-iap --command \
  '/usr/lib/update-notifier/apt-check --human-readable; uname -r; dpkg -l "linux-image-*" | tail -5'

Ce que ça retourne : le nombre de mises à jour en attente et en attente côté sécurité, la version du noyau en service, et les paquets noyau installés. Ça n'établit pas qu'une mise à jour en attente soit exploitée quelque part, et je n'en ai testé aucune.

R-004 · déploiements

La production tourne sur des tags d'image flottants, donc un rollback ne peut pas désigner un artefact réputé sainFaible

degraded×mechanism-present Faible base measured · une demi-journée · votre équipe

9 workloads sur 23 référencent un tag mutable plutôt qu'un digest kubectl · instantané du 13/05. Le tag est écrit par la CI depuis le nom de branche ou de release, donc tag vers pipeline se trace ; digest vers pipeline, non, parce qu'aucune image ne porte de label de révision source gcloud artifacts docker images list, 13/05. Un rollback re-pull donc ce sur quoi ce tag pointe aujourd'hui, qui n'est pas forcément ce qui tournait au moment où l'incident a commencé.

Cette entrée fusionne un point que j'avais d'abord soulevé à part : la promotion de staging vers production est manuelle, sans lien automatisé entre le build validé en QA et l'image déployée. Les deux partagent la même prochaine action, et une seule entrée vous sert plus que deux.

L'argument le plus solide contre ce constat

Votre registry a les tags immuables activés pour le préfixe release-* gcloud artifacts repositories describe, 13/05, donc le chemin de release est déjà épinglé en pratique, et les neuf références flottantes sont toutes sur des services qui suivent main et n'atteignent la production qu'en passant par staging. L'exposition, c'est un rollback pendant un incident sur un service en cours de déploiement, ce qui est étroit. C'est juste, et c'est pourquoi ce constat est Faible plutôt que Moyen.

Preuves que vous pouvez rejouer

kubectl get deploy,statefulset,daemonset -A -o json | jq -r '
  .items[] as $w
  | ($w.spec.template.spec.containers
     + ($w.spec.template.spec.initContainers // []))[]
  | select(.image | test("@sha256:") | not)
  | [$w.kind, $w.metadata.namespace, $w.metadata.name, .name, .image] | @tsv'

Ce que ça retourne : une ligne par conteneur référencé par tag plutôt que par digest, sur les Deployments, StatefulSets et DaemonSets, initContainers compris. Le par-conteneur compte : un grep au niveau ligne écarte le workload entier dès qu'un seul sidecar est épinglé, ce qui masque exactement les cas mixtes qui vous intéressent. Ça ne dit pas si un tag est immuable dans le registry en ce moment ; la politique du repository est un appel à part.

R-005 · infrastructure

Les requests des pods sont un bloc copié-collé, donc Autopilot facture un chiffre que personne n'a choisiFaible

degraded×mechanism-present Faible base measured · plusieurs jours · flochai ou un responsable interne compétent

19 workloads sur 23 portent un bloc de requests CPU et mémoire identique kubectl · instantané du 13/05. Sur GKE Autopilot, c'est la request qui est facturée, pas l'usage documentation tarifaire GCP, donc la réservation est la facture. Deux conséquences tirent dans des sens opposés et les deux sont invisibles aujourd'hui : des services largement sous leur request sont payés sans être utilisés, et deux services montrent un throttling CPU soutenu contre cette même request Cloud Monitoring · métriques conteneurs, 30 jours jusqu'au 13/05, ce qui est un problème de latence plutôt qu'un problème de coûts.

L'argument le plus solide contre ce constat

Le bloc a presque certainement été choisi délibérément une fois, pour le premier service, et le copier est la façon dont une petite équipe garde 23 services cohérents sans ingénieur plateforme. Remplacer un chiffre uniforme par 23 valeurs ajustées à la main échange un problème de coûts contre un problème de maintenance. C'est une objection réelle, et c'est pourquoi la prochaine action est une règle de dimensionnement mesurée plutôt qu'un réglage service par service, et pourquoi ce constat est classé Faible.

Preuves que vous pouvez rejouer

kubectl get deploy,statefulset,daemonset -A -o json | jq -r '
  .items[] as $w | $w.spec.template.spec.containers[]
  | [(.resources.requests.cpu // "unset"),
     (.resources.requests.memory // "unset")] | @tsv' \
  | sort | uniq -c | sort -rn

Ce que ça renvoie : les paires distinctes de requests CPU et mémoire en service, et combien de conteneurs de workloads portent chacune. Le comptage se fait par workload et non par pod, délibérément : compter les pods laisse un déploiement à dix replicas voter dix fois et gonfle l'uniformité apparente. Ça ne montre pas l'utilisation, et la décision de dimensionnement a besoin des deux.

R-006 · observabilité

Les logs conteneurs n'ont pas de destination commune, donc le triage commence par les retrouverFaible

toil×observed-in-window Faible base measured · plusieurs jours · flochai ou un responsable interne compétent

Les logs sont lisibles cluster par cluster via Cloud Logging, avec le sink _Default par défaut et sans destination agrégée gcloud logging sinks list, 14/05. La rétention est de 30 jours gcloud logging buckets describe, 14/05. Dans les deux fils d'incident que vous avez partagés, le premier message contenant une ligne de log est arrivé 34 et 51 minutes après le message d'ouverture Slack · INC-2026-03 et INC-2026-07, fournis le 12/05. Cet écart est le constat : il a eu lieu, il est daté, et il est dans vos propres données. Deux fils, c'est un échantillon de deux, et je n'en extrapole pas une moyenne.

L'argument le plus solide contre ce constat

Les deux incidents ont de toute façon été résolus en moins d'une heure, et une rétention de 30 jours répond à la seule obligation que vous avez nommée. L'agrégation améliore un processus qui n'est pas en train d'échouer. Exact, et c'est pourquoi la classe est toil plutôt que degraded : ce que ça vous coûte, c'est de l'attention d'ingénieur par incident, pas du service visible par vos clients.

Preuves que vous pouvez rejouer

gcloud logging sinks list --format='table(name,destination,filter)'
gcloud logging buckets describe _Default --location=global --format='value(retentionDays)'

Ce que ces commandes renvoient : les sinks configurés avec destinations et filtres, et la rétention du bucket par défaut. Elles établissent qu'aucune destination agrégée n'existe dans ce projet. Elles ne mesurent pas le temps de triage ; ça vient des deux fils que vous avez fournis.

R-007 · déploiements

Aucun environnement n'exerce les intégrations transporteur et paiement hors productionFaible

degraded×hypothetical Faible base observed · plusieurs jours · votre équipe

nv-staging fait tourner l'application mais pointe vers les sandboxes des fournisseurs pour deux intégrations sur cinq, et vers les endpoints de production pour les trois autres ConfigMap integration-endpoints, 13/05. Les changements sur ces trois-là sont validés contre la production, ou pas du tout. Je n'ai pas observé de panne causée par ça et je ne vais pas en sous-entendre une.

L'argument le plus solide contre ce constat

Deux des trois n'ont pas de sandbox proposée par le fournisseur, ce que vous ne pouvez pas corriger, et votre équipe compense avec un test manuel documenté contre un compte réel qui vous appartient runbook integration-release, 13/05. C'est un vrai contrôle, et c'est pourquoi le déclencheur est hypothetical et le constat classé Faible.

Preuves que vous pouvez rejouer

kubectl -n nv-staging get configmap integration-endpoints -o yaml

Ce que ça renvoie : l'endpoint configuré par intégration en staging, ce qui montre lesquelles pointent vers des sandboxes. Ça ne montre pas où va réellement le trafic, puisqu'un service pourrait surcharger la valeur à l'exécution.

R-008 · reprise après sinistre

Pas de point de reprise convenu pour la production, donc chaque runbook suppose le sienFaible

latent×mechanism-present Faible base observed · quelques heures · votre équipe

Les sauvegardes automatiques Cloud SQL tournent chaque jour, avec le point-in-time recovery (PITR) activé et 7 jours de journaux de transactions conservés gcloud sql instances describe, 14/05. Ce qui n'existe pas, c'est un énoncé écrit de la perte de données acceptable, convenu avec quelqu'un en dehors de l'ingénierie. En son absence, trois hypothèses différentes cohabitent dans les runbooks : l'un dit restaurer à ce matin, l'autre dit aucune perte puisqu'il y a le PITR, le troisième ne dit rien wiki GitLab, 14/05. Le mécanisme est complet ; l'étape manquante est une décision de restauration que personne n'a encore eu à prendre.

L'argument le plus fort contre ce constat

Votre capacité technique réelle est bonne, et un PITR avec 7 jours de journaux fait mieux que la plupart des entreprises de cette taille. Écrire un chiffre ne change rien à ce que la plateforme sait faire. C'est vrai, et c'est précisément pour ça que ce constat est Faible : c'est une demi-page à faire valider, pas un projet d'ingénierie. Ce que ça rapporte, c'est que la personne qui tranche à 3h du matin n'a pas en plus à décider la politique.

R-009 · reprise après sinistre

La restauration mesurée prend 3 h 40 ; tous les runbooks la supposent plus rapideMoyen

outage-hours×mechanism-present Moyen base measured · quelques heures · votre équipe

J'ai restauré votre sauvegarde de base de production la plus récente dans une instance jetable mercredi après-midi, et je l'ai détruite le jour même. Ça a fonctionné. C'est la première chose à dire, et ce n'est pas acquis : environ un tiers des sauvegardes que je soumets à un test de restauration ne fonctionnent pas.

Il a fallu 3 heures 40 minutes de bout en bout test de restauration, 13/05, chronométrage dans les preuves : 26 minutes pour provisionner, 2 h 51 pour restaurer et rejouer les journaux de transactions, 23 minutes pour vérifier les comptages de lignes contre la source. Vos trois runbooks supposent tantôt « restaurer à ce matin », tantôt « aucune perte, on a le PITR » wiki GitLab, 14/05. Aucun ne nomme de durée, et le chiffre que personne n'avait est celui qui décide si vous basculez ou si vous attendez.

L'argument le plus fort contre ce constat

3 h 40, ce n'est pas un mauvais chiffre pour une base de cette taille, et le test a tourné sur une instance jetable, sans contention ; une vraie restauration sous charge serait différente. Les deux sont vrais. Le constat n'est pas que le chiffre est mauvais, c'est que personne ne l'avait, et une attente de temps de restauration qui vit dans trois runbooks sous trois hypothèses différentes n'est pas une attente. C'est Moyen plutôt qu'Élevé parce que la chaîne se termine en quelques heures d'indisponibilité, et que l'événement déclencheur, une vraie panne, ne s'est pas produit.

Une chose à accepter et à ne pas corriger

Le pont nv-edi n'utilise pas le template CI partagé, et il ne faut pas l'y forcer. C'est le connecteur EDI historique, il se déploie deux fois par an, et son pipeline fait 40 lignes qu'une personne comprend GitLab · .gitlab-ci.yml, 13/05. Le migrer coûterait plusieurs jours pour acheter de la cohérence sur un service dont toute la valeur est de ne pas avoir changé depuis 2023. Consigné ici pour que la prochaine personne qui greppe les pipelines non conformes n'y passe pas un sprint.

§ 7Ce que ça vous coûte, et ce qui n'a pas besoin de coûter

Les coûts ne sont pas des risques, donc rien de tout ceci ne figure au registre. C'est ici parce que c'est la partie de la semaine qui porte un chiffre, et parce que le premier tableau reste vrai quoi que vous décidiez par ailleurs.

Comment ces chiffres ont été produits. Chaque ligne vient de l'export de facturation, comparé mois par mois sur les trois mois jusqu'au 30 avril export de facturation GCP. Quand une ligne a grossi parce que vous avez livré davantage, cette croissance est isolée et n'est pas comptée comme du gaspillage. Votre plateforme a coûté 14 200 € par mois en moyenne sur cette fenêtre export de facturation GCP.

Supprimable dès maintenant, sans argument contre

Chacune de ces lignes est une ressource rattachée à rien, qui ne sert aucune requête. Il n'y a pas de contre-argument à formuler, et c'est pour ça qu'elles sont séparées du tableau qui suit.

Une précaution sur la ligne des images. R-004 a constaté que 9 des 23 workloads tirent leurs images par tag mutable, donc une politique de nettoyage non ciblée peut supprimer une image dont la production aura besoin au prochain rescheduling d'un pod. Comparez d'abord le registry à l'ensemble en service et ne supprimez que les digests non référencés. C'est quinze minutes, pas une décision, et c'est pour ça que la ligne reste dans ce tableau plutôt que dans le suivant.

QuoiComment je le saisPar moisPar an
11 disques persistants rattachés à rien, 2,4 To au total, le plus ancien détaché il y a 14 moisgcloud compute disks list --filter='-users:*'310 €3 720 €
6 adresses statiques réservées, aucune rattachée à une ressourcegcloud compute addresses list --filter='status!=IN_USE'33 €396 €
1,8 To de snapshots sans politique de cycle de vie, le plus ancien a 14 moisgcloud compute snapshots list47 €564 €
890 Go d'images de conteneurs, nettoyage limité aux digests qu'aucun workload ne référencegcloud artifacts docker images list, comparé à l'ensemble en service89 €1 068 €
Lignes de health-check et de readiness probes, 38 % du volume de logs ingéréIngestion Cloud Logging, export de facturation118 €1 416 €
Total597 €7 164 €

Ça représente 4,2 % de votre facture mensuelle et environ deux heures de travail. C'est l'item 1 du plan sur 90 jours pour cette raison : rien là-dedans ne demande de décision à personne.

À faire, mais chaque ligne demande une décision

Ces lignes sont plus grosses et aucune n'est gratuite. L'argument contre chacune est réel, et je l'énonce plutôt que de vous laisser le trouver.

QuoiPar moisPar anL'argument contre
nv-staging ne sert aucun trafic pendant 128 des 168 heures de la semaine Cloud Monitoring, 30 jours au 13/05740 €8 880 €Vos ingénieurs travaillent à des heures irrégulières, et descendre un cluster Autopilot à zéro sur un planning, c'est du vrai travail d'ingénierie, pas un réglage
Cloud SQL tourne un palier au-dessus de ce que 90 jours de CPU justifient : le p95 est à 14 % Cloud Monitoring, 90 jours au 13/05310 €3 720 €Il a été dimensionné pour le pic de la migration. De la marge choisie délibérément, ce n'est pas du gaspillage, et un redimensionnement demande un redémarrage
Aucune remise d'engagement (committed use) sur le plancher de compute en régime stable, qui n'est pas descendu sous 62 % du pic en 90 jours export de facturation GCP980 €11 760 €Un engagement d'un an sur une plateforme que vous allez peut-être ré-architecturer. Le plancher est stable aujourd'hui ; l'engagement survivra à cette certitude
Total2 030 €24 360 €

Non chiffré, délibérément

R-005 — Dimensionnement des requests Autopilot. La réservation, c'est la facture, mais la direction n'est pas uniforme : deux services ont besoin de plus. Pas de chiffre tant que la vue d'utilisation sur 30 jours n'existe pas, c'est l'item 11 du plan.

U-001 — Provisionnement Kafka. Le débit est mesuré ; le plancher fixé par les partitions, la réplication et la rétention ne l'est pas. Chiffrer une économie avant d'avoir répondu à ça, ce serait avancer un nombre que je ne peux pas défendre.

Identifié n'est pas réalisé. 31 524 € par an figurent ci-dessus. Rien n'est économisé tant que quelqu'un ne fait pas le travail, et le deuxième tableau coûte du temps d'ingénierie à capter. Traitez le premier tableau comme de l'argent et le second comme une courte liste de décisions.

Je n'ai pas appliqué de multiplicateur, projeté de run rate, ni compté deux fois la même ressource. Si vous voulez vérifier une ligne, la requête sur les disques est la plus rapide : elle renvoie une liste qui se lit en une minute.

§ 8Examiné et non retenu

Des choses que j'ai contrôlées et qui se sont révélées conformes, et deux conditions qui sont mortes de leur propre contre-argument. Les deux étaient sur ma liste mardi. Aucune des deux n'a passé le jeudi.

Rejeté

« Les échecs de CI n'arrivent à personne »

Les résultats de pipeline ne sont publiés dans aucun canal de chat, ce qui est un vrai manque dans l'absolu. Le contre-argument tient : le chemin d'e-mail à l'auteur de GitLab est intact et activé, et sur les pipelines que j'ai pu lire, un échec était généralement suivi d'un commit correctif du même auteur le même jour ouvré GitLab · API pipelines, du 11/05 au 15/05. Cet appel ne filtre que les pipelines en échec, donc il ne peut pas me montrer le correctif directement et je n'en tire pas de temps moyen de rétablissement. Un notificateur de chat serait un confort. Ce n'est pas une réduction de risque et ça n'a pas sa place dans un registre.

Rejeté

« Le cluster Kafka est surprovisionné »

Le cluster est provisionné au-dessus du débit que j'ai mesuré sur 30 jours Confluent · API metrics, au 13/05, et l'écart, c'est de l'argent réel. Ce n'est pas un risque. Rien là-dedans ne peut vous faire mal, et mettre une condition de coûts dans un registre de choses qui peuvent vous faire mal dévalue les deux. C'est l'item 12 du plan sur 90 jours à la place, et U-001 consigne la question à laquelle il faut répondre avant que quiconque agisse dessus.

Contrôlé et conforme, en bref : clés de comptes de service gérées par l'utilisateur (aucune) · âge des clés de comptes de service · ACL publiques de buckets (aucune) · scan de secrets sur l'ensemble des 23 dépôts · protection de branche sur main à l'échelle du groupe · drift Terraform sur le plan nocturne · actualité et profondeur du planning d'astreinte · réglages d'approbation des merge requests · scoping des tags de runners · IP publique Cloud SQL (désactivée) · héritage des org policies sur le dossier de production.

§ 9Ce que je n'ai pas pu déterminer en cinq jours

Cinq contrôles n'ont pas abouti. Cette section est une propriété d'un audit de cinq jours, pas un aveu. Notez ce qui ne figure pas ici : la question de savoir si vos sauvegardes se restaurent. Elle trouve sa réponse dans R-009, parce que le test de restauration est dans le périmètre.

U-001 — Si le provisionnement du cluster Kafka dépasse réellement son besoin.

J'ai mesuré le débit, pas le plancher. Le nombre de partitions, le facteur de réplication et la rétention peuvent fixer un minimum bien au-dessus de ce que le débit seul suggère. Ce qu'il faudrait : lire la configuration des topics au regard des règles de dimensionnement de l'éditeur, environ une demi-journée. Personne ne devrait agir sur l'item 12 du plan avant d'avoir cette réponse.

U-002 — Si un ancien salarié conserve encore un accès.

Je ne dispose pas de la liste des départs, donc je ne peux pas en faire la différence avec l'annuaire. Ce qu'il faudrait : une liste RH des départs sur les 24 derniers mois, et vingt minutes.

U-003 — Si les neuf services à tag flottant ont déjà fait un rollback vers un autre artefact que celui prévu.

L'historique de déploiement ne conserve pas le digest résolu GitLab · API deployments, 13/05. Ce qu'il faudrait : activer la capture du digest à partir de maintenant. Le passé n'est pas récupérable.

U-004 — Si les deux services en throttling de R-005 throttlent d'une façon que les utilisateurs ressentent.

J'ai les métriques CPU des conteneurs mais aucun objectif de latence des requêtes avec lequel les corréler Datadog · monitors, 14/05. Ce qu'il faudrait : un objectif de latence sur ces deux services, ce qui est aussi le correctif.

U-005 — Si les trois exceptions à la politique d'organisation du §3 sont encore justifiées.

J'ai confirmé la politique et lu la liste d'autorisation gcloud, 13/05. Je n'ai pas établi ce que sont ces trois instances ni si elles ont encore besoin de l'exception. Ce qu'il faudrait : dix minutes avec la personne qui les a ajoutées.

§ 10Le plan sur 90 jours

Classé par valeur rapportée à l'effort. 12 des 14 items sont à faire chez vous, sans moi. Les deux marqués flochai nomment la capacité plutôt que l'entreprise, pour que vous puissiez chiffrer l'embauche de cette capacité face à son achat.

Jours 1 à 14 — configuration uniquement, chaque item se ferme en une après-midi

#ItemRegistreEffortQui
1Supprimer les disques, adresses et snapshots non attachés ; ajouter des politiques de nettoyage et de cycle de vie ; exclure les lignes de health-check de l'ingestion de logs§72 heuresvotre équipe
2Placer GitLab derrière IAP ou le VPNR-001une demi-journée + fenêtrevotre équipe
3Patcher bastion-ops, activer les unattended upgrades sur le pocket securityR-003quelques heuresvotre équipe
4Faire le diff des départsU-00220 minvotre équipe
5Rédiger l'objectif de point de reprise, une pageR-008quelques heuresvotre équipe + COO

Jours 15 à 45

#ItemRegistreEffortQui
6Résorber la background migration bloquéeR-002plusieurs joursvotre équipe
7Mettre à niveau GitLab au-delà de 16.9, puis effectuer la rotation des six variables de déploiementR-001plusieurs jours + fenêtrevotre équipe
8Acter 3 h 40 comme temps de restauration mesuré et décider s'il est acceptableR-009quelques heuresvotre équipe
9Écrire le digest résolu dans le manifest au moment du déploiementR-004une demi-journéevotre équipe

Jours 46 à 90

#ItemRegistreEffortQui
10Job terraform plan en CI sur les merge requestsplusieurs joursvotre équipe
11Construire la vue d'utilisation sur 30 jours, puis dimensionner par workloadR-005plusieurs joursflochai — planchers de requests Autopilot et contraintes de ratio
12Répondre à U-001, puis agir sur le provisionnement Kafka si ça se confirmeU-001une demi-journée, puis plusieurs joursvotre équipe, puis l'un ou l'autre
13Agréger les deux clusters dans un seul dataset de logs maîtriséR-006plusieurs joursflochai — conception du routage des logs et de l'expiration des partitions
14En staging, basculer hors production la seule intégration qui dispose d'une sandboxR-007plusieurs joursvotre équipe

Si vous ne pouvez pas y consacrer six jours

Faites les items 1, 2 et 3. C'est une après-midi plus une fenêtre. Ça clôt l'Élevé, un Moyen, et l'intégralité du premier tableau de coûts. Ce n'est pas le même ensemble qu'au §5, et la différence est délibérée : le §5 classe par réduction du risque, ici on classe par ce qui tient dans une après-midi. R-002 est le chantier le plus gros et sa valeur dépend de la mise à niveau effectivement tentée, donc si vous avez une après-midi plutôt que trois, achetez d'abord la fermeture de l'exposition.

Pas dans les 90 jours, et pourquoi

Migrer nv-edi vers le template partagé (accepté, §6). Un notificateur de chat pour la CI (rejeté, §8). Des objectifs de latence par service au-delà des deux de U-004 : c'est un trimestre à part entière, qui ne devrait pas démarrer dans le même trimestre que le chantier de dimensionnement.

§ 11Méthode, et comment contester ce document

Une personne seule ne peut pas avoir de séparation des tâches. Voici le substitut honnête.

La liste de contrôles a été figée avant la semaine. 58 contrôles, liste envoyée le 06/05. Les constats ne pouvaient sortir que de cette liste, ce qui empêche de l'écrire à rebours à partir de ce que j'ai trouvé.

La sévérité est une lecture de table, pas une opinion. Chaque entrée énonce ses deux paramètres. Si vous n'êtes pas d'accord avec un niveau, attaquez l'un des deux paramètres : il y a alors une chose définie à débattre, plutôt qu'un ressenti à marchander.

Le registre a été gelé vendredi à 17 h 00 et les accès ont pris fin lundi. Une idée sans preuve le mardi n'est pas un constat, et rien n'a été ajouté après le gel. Le plan sur 90 jours a été écrit après, délibérément, pour que la sévérité ne puisse pas être ajustée après coup pour coller à un plan.

Vous l'avez contesté jeudi. Le call n°2 a mis le brouillon du registre sous vos yeux alors qu'il restait un jour ouvré pour agir sur une rétrogradation. R-002 est passé d'Élevé à Moyen en conséquence directe, et la raison est écrite dans l'entrée. Ce que vous n'avez pas vu avant le gel : les cinq entrées Faible et les deux rejets, que j'ai mentionnés jeudi mais sans les dérouler ligne à ligne.

Je ne chiffre pas les conséquences en euros, parce que je ne connais pas votre chiffre d'affaires horaire. Je chiffre en revanche les économies en euros, à partir de votre propre facture fournisseur, et le §7 est le seul endroit où ça se produit.

Les corrections sont gratuites pendant 30 jours après la livraison. Ensuite, le registre est à vous. Chaque entrée porte une commande que vous pouvez relancer seul ; une entrée qui renvoie encore la même réponse dans six mois, sans que rien ne se soit produit ni déclenché, signifie que je me suis trompé sur elle. Vous n'avez pas besoin de moi pour le voir.

Le call de restitution

Une heure, ordre du jour fixé : R-001 et sa fenêtre, puis R-002 parce que l'item 6 en dépend, puis les deux items flochai pour que vous puissiez décider s'ils valent une aide extérieure ou une embauche. Dix minutes à la fin pour les rejets, parce que la façon dont un constat se fait tuer vous est plus utile que la façon dont il se fait lever.

Merci de révoquer mes accès à la fin de ce call, pas avant. Je me suis engagé à corriger tout ce que vous pouvez réfuter pendant 30 jours, et il faut que je puisse vérifier.

AnnexeAccès, preuves et contrôles

Accès demandés, accordés et refusés

AccèsDemandéAccordéNote
GCP project viewer, 3 projets06/0511/05
Billing account viewer06/0511/05Sur le compte de facturation, pas sur le projet
GitLab Reporter, groupe nordvantage06/0511/05
GitLab Owner sur le groupe, limité à CI-0106/0512/05, révoqué le 15/05Exception. Métadonnées uniquement : key, protected, masked, environment scope. Aucune valeur lue, filtré au niveau de la commande
Datadog en lecture seule06/0511/05Historique des monitors antérieur à 02/2026 non visible
BigQuery metadata viewer06/05refuséU-001 partiellement bloqué
Liste RH des départs12/05non fournieU-002 livré ouvert
Instance jetable pour le test de restauration06/0512/05, détruite le 13/05Dans le périmètre. Résultat dans R-009

Délibérément non demandés : accès aux données de la base de production ; code source applicatif au-delà de la configuration CI et du DDL de migration ; Auth0 read:users ; données clients de toute nature.

Preuves

71 pièces, archivées automatiquement au fil de l'exécution des commandes. Rien de non nettoyé n'a touché le disque. Le scrubber s'exécute avant toute écriture, et l'outil de capture s'arrête s'il est absent. Le smoke test du jour 1, lancé avant toute autre commande : une fausse clé AWS passée dans l'outil a produit une pièce archivée contenant AWS_KEY_REDACTED. S'il avait échoué, rien d'autre n'aurait tourné.

Valeurs des secrets. Pour GCP, la capture est sans valeurs par construction, parce que le rôle détenu ne peut pas lire les payloads des secrets. Pour GitLab, ce n'est pas vrai : l'endpoint des variables renvoie les valeurs. La capture a été filtrée au niveau de la commande pour qu'aucune valeur n'atteigne le disque, le droit était limité à CI-01, et borné dans le temps du 12/05 au 15/05.

Données personnelles. Le bundle contient des données personnelles : identités IAM, participants aux incidents, identifiants de routage des alertes. Il est chiffré pour votre clé, la copie locale est détruite 30 jours après la livraison, et les clauses de traitement des CGV signées s'y appliquent.

Les 58 contrôles — lignes représentatives

IDContrôleRésultatDécision
IN-01Org policy sur les IP externes, dossier productionAppliquée, 3 exceptions nomméesconforme
IN-04Niveau de patch des hôtes, toutes les VM longue duréebastion-ops : 34 en attente, 34 de sécuritéR-003
IN-10Exposition publique des surfaces d'admin, par cloudGitLab joignable depuis 0.0.0.0/0 sur le 443R-001
IN-12Revue de l'export de facturation, 3 mois, croissance isolée597 €/mois rattachés à rien§7
IN-13Analyse des engagements et du plancher d'usage stableAucune remise face à un plancher à 62 %§7
IN-11Distribution des requests et limits des workloads19 sur 23 identiquesR-005
CI-01Métadonnées des variables CI/CD, scope et protection14 au scope groupe, 6 dans le job de déploiementR-001
CI-04Conformité au template de pipeline21 sur 23 étendent le composant partagéconforme
CI-09Chemin de notification des échecsEmail à l'auteur intact, pas d'intégration chatrejeté
DE-01Traçabilité MR vers déploiement (chemins et DDL uniquement)Chaque déploiement prod relié, approbateur ≠ auteurconforme
DE-03Immutabilité des références d'images9 sur 23 par tag, pas par digestR-004
OB-02Topologie des sinks de logs et rétentionPas de sink agrégé, rétention 30 joursR-006
DR-02Configuration des sauvegardes, base de productionQuotidienne plus PITR, 7 jours de logsconforme
DR-03Test de restauration vers une instance jetableRéussi, 3 h 40 de bout en boutR-009
BF-01Actualité et profondeur du planning d'astreinteÀ jour, un second nom sur chaque créneauconforme

Comment je suis payé, et ce que j'en ai fait

Cet audit est à prix fixe, et son montant est déduit du premier mois s'il débouche sur un abonnement. Ce document a donc un intérêt permanent à faire paraître votre plateforme pire qu'elle n'est, et vous devriez le lire en le sachant.

Ce que vous pouvez vérifier vous-même. Chaque niveau se déduit de deux paramètres énoncés, donc un niveau ne peut pas être saisi à la main. Le registre est sorti à un Élevé, trois Moyens, cinq Faibles, et deux conditions que j'ai soulevées mardi ont été tuées par leur propre contre-argument et figurent au §8 avec l'argument qui les a tuées. Un constat a été rétrogradé pendant le call de jeudi et le dit dans sa propre entrée. 12 des 14 items du plan routent vers votre équipe, pas vers moi, et les deux restants nomment la compétence, pour que vous puissiez comparer le prix de l'embaucher à celui de l'acheter.

Si vous pensez que ce document exagère quelque chose, le §11 dit exactement comment le contester, et la fenêtre de correction est ouverte pendant 30 jours.