[infra] Manuels d'exploitation, un par geste sensible #44
Labels
No labels
Compat/Breaking
EC01
EC02
EC03
EC04
EC05
EC06
Kind/BDD
Kind/Back
Kind/Bug
Kind/CICD
Kind/Cloud
Kind/Contenu
Kind/Data
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Front
Kind/IA
Kind/Infra
Kind/Monitoring
Kind/Security
Kind/Testing
Portée/Post-jury
Priority
Critical
Priority
High
Priority
Low
Priority
Medium
Reviewed
Confirmed
Reviewed
Duplicate
Reviewed
Invalid
Reviewed
Won't Fix
Status
Abandoned
Status
Blocked
Status
Need More Info
ops/alerte
No milestone
No project
No assignees
2 participants
Notifications
Due date
Depends on
#41 [infra] Déploiement Ansible et compte deploy dédié
g2/enervision
Reference
g2/enervision#44
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Exigence couverte
ENF-16
Épreuve servie
EC02 — Management
Charge estimée
2 j.h
Ce qu'on veut obtenir
Qu'un geste sensible puisse être exécuté par quelqu'un d'autre que celui qui l'a construit, ce qui est la seule preuve que la documentation vaut quelque chose.
Critères d'acceptation
Comment on le vérifie
Commande une procédure rejouée par un tiers, sans aide de l'auteur
Attendu elle aboutit sans question
Preuve le nom de celui qui l'a rejouée et la date
Manuel d'exploitation à mettre à jour
docs/runbooks/, les quatre fichiers
Risque et retour arrière
Un manuel écrit après coup et jamais rejoué ne vaut rien devant le jury. Prévoir la relecture croisée avant le jour 8.
Point du 4 septembre. Le ticket est à 0 sur 4 alors que douze manuels
existent, treize avec
etl.mdqui arrive par la #143. Voilà ce qui estréellement fait et ce qui ne l'est pas.
Critère 1, les quatre manuels : trois sur quatre
deploiement.mdreprise.mdcollecteur.mdmlflow.mdcouvre la promotion d'un modèle, pas le réentraînement lui-même.Critère 2, écrit par celui qui tient le geste : c'est le blocage
Le manuel qui manque est celui de Justine. Le ticket dit « par celui qui tient le
geste, pas par le PO », et c'est le bon critère : un manuel de réentraînement
écrit par quelqu'un qui n'entraîne pas serait une paraphrase du code.
Critère 3, rejoué par quelqu'un d'autre : pas fait
La restauration a bien été rejouée intégralement, le 2 septembre en 9 min 51 s,
mais par l'auteur du manuel. Le critère demande une autre personne, et il a
raison : un manuel se juge sur ce qu'il permet à quelqu'un qui n'était pas là.
C'est la seule chose de ce ticket qui demande de bloquer une heure à deux.
Critère 4, quoi faire quand ça échoue
Vérifié sur
reprise.md, qui le fait bien : trois points de friction nommés(
shared_preload_libraries, le doublonforgejo-db.sql, l'app.iniqui écouteen 127.0.0.1) et deux limites assumées par écrit. Les autres restent à relire un
par un, je ne les ai pas tous ouverts.
Ce qu'il faut demander aujourd'hui
Deux choses, à la réunion de mi-développement du #79 :
l'entraînement diverge ou que la promotion échoue.
consignant ce qui a manqué.
reprise.mdest le meilleur candidat, il est déjàchronométré.
Plan de réalisation
Relecture des quatre manuels visés et des tickets liés. Le ticket n'est pas un
travail de rédaction pour moi : le CA2 m'interdit d'écrire le contenu. Mon rôle
est de tenir le gabarit, distribuer les plumes et organiser le rejeu croisé.
Où on en est, critère par critère
deploiement.md,reprise.md,collecteur.md. Le réentraînement n'existe pas :services/inference/n'a qu'un README « à compléter »,mlflow.mddocumente le registre et la promotion, pas le geste d'entraînement.git log: Lénaïc sur déploiement, reprise, collecteur ; Olivier sur MLflow), aucun écrit par le PO. Mais Lénaïc tient 3 gestes sur 4.reprise.md, 02/09, 9 min 51 s) a été joué par Lénaïc, qui est l'auteur du manuel. C'est le seul critère qui coûte vraiment.mlflow.mda le bon gabarit (§8 panne, §9 retour arrière),collecteur.mda codes de sortie et arbre de décision.deploiement.mdn'a qu'un « Garde-fou » préventif,reprise.mdn'a rien.Lot A — le gabarit (Gabriel, ce soir)
docs/runbooks/README.md: marquer les quatre gestes sensibles ENF-16comme tels. Les quinze manuels sont aujourd'hui sur le même plan, rien ne dit
au jury lesquels répondent à l'exigence.
## Quand ça échoue(symptôme → cause → geste, gabarit de
stockage-minio.md) et## Journal des rejeux(date | opérateur | auteur du manuel | durée | ce quia bloqué), sur le modèle du tableau déjà présent dans
reprise.md.Lot B — le manuel manquant, réentraînement (Olivier + Justine, 2 h)
Point dur : #36 et #37 sont en J3 et non commencés, alors que l'horizon utile
est le 09/09. On n'écrit pas le manuel d'un geste que personne n'a joué —
c'est exactement le risque nommé dans ce ticket.
docs/runbooks/reentrainement.mdse limite donc à ce qui est réellement tenu :la promotion d'un modèle (
mlflow.md§5, déjà jouée avec une exécutionfactice) et les trois verrous de rejouabilité de l'ADR 0013 (fenêtre bornée par
deux instants UTC,
random_statejournalisé, jeu figé comme entrée del'exécution). En tête du manuel, dire noir sur blanc ce qui n'est pas encore
jouable. Un manuel court et honnête se défend ; un manuel écrit d'avance se
démonte en une question.
Lot C — le rejeu croisé (demain matin) — c'est le vrai livrable
Deux rejeux, par des non-auteurs :
reprise.mdrejoué par Marvin (~1 h). Celui qui pèse le plus devant lejury. Lénaïc ne dit rien pendant l'exercice : toute question posée est un
défaut du manuel, à noter et à corriger.
collecteur.mdrejoué par Justine (~20 min, sans risque). Filet desécurité si le rejeu de reprise déraille : « Est-ce que ça tourne » puis un
rattrapage
--jours 1.Preuve consignée dans le
Journal des rejeuxde chaque manuel et encommentaire ici : nom, date, durée, questions posées.
Lot D — CA4, la partie manquante (Lénaïc, 1 h, en parallèle du lot C)
reprise.md: section d'échec. Les trois frictions du 02/09 sont déjà dans letableau de l'exercice, elles doivent remonter en procédure —
pg_restoresans-c shared_preload_libraries=timescaledb,forgejo.dbrejoué par-dessus levidage (doublons),
app.inirestaurée qui écoute sur 127.0.0.1.deploiement.md:## Quand ça échoue— échec du coffre, UFW qui coupe SSH,--tags appqui repose la crontab, retour arrière du front.Deux arbitrages assumés
Si le temps manque demain, on sacrifie la profondeur du lot B, jamais le lot
C. Le CA1 et le CA3 ne pèsent pas pareil : « quatre fichiers existent » se
constate en dix secondes, « une procédure a été rejouée sans son auteur » est la
seule preuve que l'exigence ENF-16 demande vraiment.
Lénaïc tient trois gestes sur quatre. C'est précisément ce qu'ENF-16 cherche
à mesurer. Le lot C y répond, à condition que ce soit Marvin et Justine qui
jouent : je co-tiens Ansible (10 commits
infra/ansible), je ne suis pas untiers sur le déploiement.
Clôture
Les quatre critères sont tenus. Le détail, et surtout ce qui ne l'est pas.
deploiement.md,reprise.md,reentrainement.md,collecteur.md. LeREADME.mdles désigne comme les quatre gestes sensibles ENF-16 et nomme leur porteur — les quinze manuels du dossier n'étaient jusque-là pas distinguables.git log: Lénaïc sur déploiement, reprise, collecteur ; Olivier sur réentraînement. Aucun contenu opératoire du PO. Réserve honnête plus bas.CA3 — les deux rejeux
collecteur.md, Justine, 08/09, 30 min. C'est celui qui satisfait le critère à la lettre : les deux gestes d'exploitation du manuel joués intégralement, sans l'auteur. Un défaut trouvé — la commande de rattrapage manquaitENERVISION_RACINE=/opt/enervision/.repoet sortait sur uncdvers un répertoire absent — corrigé par le rejeu lui-même, pas en demandant à l'auteur. C'est exactement ce que le ticket appelle « aboutir sans question ».reprise.md, Marvin, 09/09, ~55 min. Le manuel qui pèse le plus. Rejeu à blanc — lecture pas à pas, sans exécution sur cible. Il n'a pas abouti sans question : trois points où la procédure n'était pas exécutable telle quelle, consignés dansreprise-rejeu-2026-09-09-marvin.md— étape 1 sans prérequis ni renvoi, étape 2 sans variante cloud ni--check, étape 4 sans commande copiable. Comblés par la PR #230.C'est ce deuxième rejeu qui vaut le plus, précisément parce qu'il a échoué. Un tiers qui documente ses propres trous produit une preuve qu'un rejeu réussi ne donne pas.
Les limites, dites ici plutôt que trouvées par le jury
restore.ymln'a pas tourné sur une cible. Le rejeu réel et chronométré reste dû — les deux manuels le portent en tête, ce n'est pas une omission.reprise.mdn'a donc pas de ligne pour elles : on n'écrit pas au journal au nom de quelqu'un qui n'a pas joué. Si Marvin relit les étapes corrigées, c'est lui qui l'inscrit.deploiement.mdet deux commandes déjà publiées et vérifiées ailleurs — aucune commande n'a été inventée. L'approbation de Lénaïc rend le geste à son auteur ; c'est pour ça qu'elle passe en PR et non en commit direct.deploiement.mdetreentrainement.mdn'ont aucun rejeu. Leur journal le dit, vide. Le CA demande « au moins une procédure » : un journal vide et honnête vaut mieux qu'un rejeu bâclé la veille du jury.collecteur.mdn'a pas de section au titre## En cas de panneque le README impose aux quatre. Le fond y est — codes de sortie, arbre de décision, « les alertes ne se rattrapent pas », arrêt et reprise. C'est un écart de gabarit, pas de contenu : le CA4 est tenu, l'alignement du titre est cosmétique.Ce que le ticket a réellement mesuré
Trois gestes sur quatre tenaient à Lénaïc. C'est le point qu'ENF-16 cherche, et les manuels ne le disaient pas : les quinze fichiers étaient sur le même plan. Le README le dit maintenant noir sur blanc, et les deux rejeux croisés ont désolidarisé deux gestes de leur auteur — l'un en réussissant, l'autre en échouant utilement.
Fermé une fois la PR #230 approuvée par Lénaïc.