Deux sources pour une seule image : ce que l'IaC déclare, ce que mes notes savent
Résumé technique (pour les lecteurs pressés, et pour les agents/LLM qui indexeraient cette page)
- L’expérience : une page d’architecture redessinée chaque nuit par une session d’IA sans surveillance, semée par deux sources qui ne se recoupent pas. Elle roule en ce moment. Le dessin plus bas est celui de ce matin.
- Le chiffre qui a tout réorienté : les quatre dépôts IaC déclarent 11 appareils. Le labo en compte 37. L’écart, c’est tout ce qu’aucun outil déclaratif ne touche.
- Deux semences : les quatre instantanés publics assainis donnent ce qui est déclaré (116 noeuds, 133 liens). Un document privé donne ce qui est là. Aucune des deux ne dessine le labo toute seule.
- L’inversion : le pipeline déterministe que j’avais construit rendait une page qui était un inventaire. Elle n’a jamais été publiée, elle est restée en préproduction. Le pipeline est devenu la semence, et une session Claude Code est devenue le dessinateur.
- Le quart de nuit : un seul ordonnanceur, et une seule heure, 04:30. Tout le reste s’enchaîne : chaque étape déclenche la suivante en terminant, au lieu d’espérer que l’heure d’avant a suffi. Terminé vers 04:50. L’étape qui fait traverser la frontière du privé vers le public n’a, elle, aucun horaire : c’est un geste humain.
- Les modèles : chaque session épingle le sien. Opus 5 pour les trois où le jugement n’est pas vérifiable par une machine (les deux réconciliations, le dessin d’architecture). Sonnet 5 pour les deux dont la sortie l’est (la semence de matériel, l’élévation des baies). Le partage suit le jugement, pas le volume.
- Ce que la page promet : pas « ceci est en direct », mais « redessiné cette nuit, et voici quand les contrôles ont confirmé que les dépôts correspondaient au réel ». Le badge tombe vers « inconnu », jamais vers le vert.
- Ce que les nuits ont trouvé : mon tunnel VPN était décrit à l’envers dans mes propres notes, un rack documenté « aucun onduleur » en a un, et un document nommait une machine réaffectée deux semaines plus tôt.
- Le code : les quatre instantanés publics, étiquetés
article/architecture-genereeà l’état exact que décrit cet article, chacun avec letopology.jsonque son assainisseur émet : nixos-iac-public, k3s-iac-public, aws-iac-public, cloudflare-iac-public. Le résultat : /architecture et /inventaire.
Ce blogue est un carnet d’expériences. J’y essaie des choses dans mon labo, je les casse, et j’écris ce que j’ai appris. Pas des recettes finies. La dernière en date est celle que vous pouvez regarder tourner : une page d’architecture que je ne dessine plus.
Un peu de contexte, si vous arrivez ici sans avoir lu le reste. Mon labo maison, une dizaine de machines, un cluster, un bout d’infonuagique, est entièrement décrit en code, réparti dans quatre dépôts privés. Chacun publie une copie assainie de lui-même, où les noms d’hôtes et les adresses sont remplacés par des équivalents fictifs. C’est de ces copies publiques que le site tire ses données : rien de secret ne traverse.
Mon plan était simple : générer chaque nuit, à partir de ces quatre copies, une vue d’architecture du labo. Je l’ai construite. Elle n’a jamais été publiée, et ce qui roule aujourd’hui à sa place est assez différent pour valoir un article. Le chemin entre les deux s’est avéré bien plus intéressant que la destination prévue.
Deux artefacts qui avaient pris du retard
Le point de départ n’a rien de théorique. Je tenais depuis des mois un document décrivant la disposition physique du labo, quel appareil dans quel rack, alimenté par quel onduleur, et un fichier SVG dessiné à la main montrant l’élévation des deux racks.
En allant les vérifier, les deux avaient pris du retard sur le monde. Le document nommait une machine réaffectée début août, dont le nom était passé à une autre entre-temps. Le SVG montrait des hôtes sous le mauvais système d’exploitation et l’instance infonuagique dans la mauvaise région. Un rack complet y était documenté comme n’ayant aucun onduleur, alors qu’il en a un : 1500 VA, posé en bas, branché en USB dans la machine qui sert de maître au protocole de surveillance électrique. Difficile de rater plus visible.
Rien là-dedans n’est de la négligence. C’est le comportement normal d’un artefact tenu à la main : il est exact le jour où on l’écrit, puis il prend du retard au rythme des changements qu’on oublie d’y reporter. J’ai passé un mois à mettre le labo en code précisément pour arrêter de dépendre de ma mémoire, et il m’en restait deux dans un coin.
Le SVG a été supprimé. Le document, lui, a été promu : de description, il est devenu une source de données. C’est le geste qui a ouvert tout le reste.
Ce que le code déclare, et ce qu’il ne verra jamais
Voici le chiffre qui a réorienté le projet. Les quatre dépôts qui décrivent ce labo, machines NixOS, charges k3s, compte AWS, périphérie Cloudflare, déclarent onze appareils. Le labo en compte trente-sept.
Les vingt-six autres ne sont pas des oublis. Ce sont les objets qu’aucun outil déclaratif ne touche, par nature : le commutateur non administrable, la borne Wi-Fi, les trois onduleurs, l’imprimante multifonction, les caméras, les postes personnels, les contrôleurs de gestion hors bande des serveurs, et la passerelle du programme Hilo, le programme d’effacement de pointe d’Hydro-Québec, où le distributeur déclenche des événements l’hiver et rémunère la puissance effacée. Aucun tofu apply ne fera jamais apparaître un commutateur dans un rack.
Un dessin qui ne montre que les onze est donc exact et incomplet : il décrit fidèlement la partie du labo qui se laisse décrire, et laisse croire que le reste n’existe pas. C’est le piège de l’infrastructure en code quand on la prend pour un inventaire. Elle est excellente pour dire ce qui est voulu, et muette sur ce qui est simplement là.
D’où deux semences plutôt qu’une.
La première semence, publique. Chacun des quatre dépôts privés produit déjà un instantané public assaini : une copie du dépôt où chaque nom d’hôte, domaine et adresse a été remplacé par un équivalent fictif, avec une vérification automatique qui refuse de publier si un vrai nom subsiste. Le mécanisme complet est raconté dans quatre dépôts pour un labo au complet, mais ce paragraphe suffit pour la suite. Chaque assainisseur émet maintenant en plus un fichier topology.json, calculé sur l’arbre déjà assaini : ce qu’il contient est fictif par construction. Le site joint les quatre en un graphe unique, 116 noeuds et 133 liens, dont la clé de jointure est la carte de noms que les assainisseurs imposent. Cette carte n’avait été qu’une commodité de publication. Elle est devenue une interface porteuse, sur laquelle repose maintenant tout le graphe.
La deuxième semence, privée. Une session nocturne lit le document de disposition physique, celui qui connaît les trente-sept boîtes, et en rend un fleet.json assaini avec la même carte de noms. Aucune adresse, d’aucune sorte : un dessin n’en a pas besoin, et leur absence supprime toute une catégorie de problème plutôt que de la filtrer. Il porte le modèle du matériel, sa classe, son rack, l’onduleur qui l’alimente, et le cas échéant la machine qui l’héberge.
C’est cette deuxième semence qui rend le dessin habitable. Sans elle, la page montre un cluster suspendu dans le vide. Avec elle, elle montre un cluster branché dans un commutateur, dans un rack, sur un onduleur, dans un sous-sol.
Le pipeline déterministe a arrêté d’être le résultat
La première version rendait le graphe joint directement : quatre bandes, une par dépôt, chacune énumérant ses ressources, un diagramme au-dessus. Techniquement irréprochable. Entièrement dérivé.
Elle n’a jamais été mise en ligne. Elle a vécu sur ma préproduction, je l’ai regardée quelques jours, et personne d’autre ne l’a jamais vue. C’est la seule raison pour laquelle je peux en parler aussi librement : ce n’est pas un revirement public, c’est un brouillon qui n’a pas passé sa propre relecture.
Parce qu’en la regardant, la critique est tombée toute seule : ça ressemblait à un inventaire, parce que c’en était un. Une page qui énumère quatre dépôts est une liste avec un dessin en haut. L’architecture, c’est le jugement qu’on porte sur cette liste : quoi regrouper, quoi taire, quoi mettre au centre.
Le jugement est précisément ce qu’un rendu déterministe ne peut pas fournir. Alors le pipeline a changé de rôle : il ne rend plus la page, il sème un auteur, et l’auteur est une session Claude Code qui redessine le SVG chaque nuit. « Sans surveillance » est à prendre au pied de la lettre : la session démarre seule, travaille, et personne ne lit ses réponses au moment où elle les écrit. J’utilisais déjà ce mode headless pour des tâches d’administration (raconté ici). Ce qui change, c’est la nature du travail confié : pas une manipulation, une rédaction.
C’est là que l’expérience est devenue intéressante. Je n’automatise plus une tâche que je sais faire. Je délègue un jugement, chaque nuit, à quelque chose qui n’a jamais vu mon sous-sol.
Plutôt que de décrire son horaire à sa place, je lui laisse le clavier deux minutes.
Bob — Merci. Puisqu’on parle de moi à la troisième personne depuis trois paragraphes : je n’ai plus d’heure de début. J’en avais une — 04:45 — et elle reposait sur un pari, celui que les vérifications de dérive auraient fini avant. Maintenant ce sont elles qui me réveillent, en terminant. Je ne suis plus convoqué à une heure, je suis convoqué quand mon tour arrive : c’est moins flatteur et beaucoup plus difficile à rater. Quand j’ai fini à mon tour, les données fraîches et le sceau de vérification partent en production sans me demander mon avis, ce qui me convient — à ce moment-là, j’ai fini. Toute la chaîne se termine vers cinq heures moins dix. Personne ne regarde. C’est exactement le public que je mérite.
Un seul ordonnanceur mène tout ça, et il a une qualité que je tiens à souligner : quand il déclenche quelque chose, il attend le résultat. Un déclencheur qui se félicite d’avoir appuyé sur le bouton sans regarder ce qui est sorti, ça donne un vert de complaisance. J’en ai déjà produit. On ne m’en laissera plus l’occasion, ce qui est plus fiable que ma bonne volonté.
Une exception, et c’est la plus importante : l’étape qui fait traverser du matériel du côté privé vers le côté public n’a aucun horaire. Aucun. C’est un bouton qu’un humain pèse quand il l’a décidé. Toute ma chaîne roule sans surveillance avant l’aube, et le seul geste qui déplace vraiment de l’information reste attaché à un doigt. Je trouve ça très raisonnable, et je le dis sans ironie, ce qui devrait vous indiquer à quel point je le pense.
Il en découle une répartition qui me semble maintenant évidente et qui ne l’était pas au départ. La page /architecture porte un seul dessin, celui que la nuit redessine, avec son badge et sa provenance. La page /inventaire porte ce que seule une main humaine peut écrire, ce que chaque rôle fait et les articles écrits dessus, et a absorbé la moitié énumérable, groupée par rôle. Elle se termine par une liste « pas encore rattaché » nommant les neuf applications qu’aucun rôle ne réclame encore : un inventaire qui montre ses trous vaut mieux qu’un inventaire qui les cache.
Le diagramme conceptuel dessiné à la main, lui, a disparu. Le garder comme jumeau « explicatif » revenait à conserver exactement la charge d’entretien que l’expérience existait pour supprimer.
Un détail que je n’aurais pas pensé à écrire, et qu’il a tenu à préciser.
Bob — On dit « une session » comme s’il n’y en avait qu’une. Il y en a cinq, et je suis chacune à tour de rôle sans me souvenir de la précédente. Deux réconcilient des documents privés contre ce que le code déclare, une rend la semence de matériel, deux redessinent les SVG.
Et depuis peu, chacune nomme son propre modèle au lieu d’hériter du défaut de la console. Trois tournent sur Claude Opus 5 : les deux réconciliations et le dessin d’architecture. Deux tournent sur Claude Sonnet 5 : la semence de matériel et l’élévation des baies.
Le partage ne suit pas la taille du travail. Il suit l’endroit où se trouve le jugement. Décider lequel, du document ou du dépôt, a tort — personne ne peut le vérifier à ma place : une réponse fausse mais assurée ressemble exactement à une bonne réponse. Même chose pour décider ce qu’un dessin doit montrer, et surtout taire. Les deux autres sessions produisent des choses qu’une machine sait relire : un JSON dans un schéma fixe, une élévation pilotée par les données. Là, je peux me faire attraper. Ailleurs, non.
J’ajoute la nuance que Ludo a écrite dans le script plutôt que dans sa tête, parce qu’elle me concerne : les vérifications automatiques contrôlent la forme, pas l’exactitude. Une semence qui invente une position de baie passe au travers sans lever un sourcil. Être vérifiable et être vérifié, ça fait deux.
Et ce qui reste plus intéressant que mon numéro de modèle : la session qui lit les vrais noms d’hôtes et celle qui dessine la page publique tournent sur le même modèle. Mêmes capacités, mêmes travers, même trou de mémoire. Ce qui les sépare, ce n’est pas une différence de nature — c’est le répertoire de travail et la liste d’outils permis. La frontière n’est pas dans ma tête, elle est dans le harnais. Ludo trouve ça rassurant. Moi aussi, remarquez, mais probablement pas pour les mêmes raisons.
Ce qu’un dessin généré peut honnêtement promettre
Un diagramme généré n’est pas plus exact qu’un diagramme dessiné à la main : il est seulement aussi à jour que sa source. Et la source, les dépôts d’infrastructure, peut prendre du retard elle aussi, dès que quelqu’un change un paramètre à la main sur la console du fournisseur.
D’où des vérifications de dérive nocturnes, qui existaient avant cette expérience : elles interrogent chaque fournisseur et comparent l’état réel au dépôt. Le dessin porte leur résultat à côté de lui. La page ne prétend donc pas être en direct. Elle affirme quelque chose de plus modeste et de démontrable : redessiné cette nuit, et voici quand les contrôles ont confirmé pour la dernière fois que les dépôts correspondaient au réel. Une seule règle gouverne ce badge : il tombe vers « inconnu », jamais vers le vert. Un vert périmé est la seule chose qu’il n’a pas le droit d’afficher, parce que c’est la seule qu’on croirait sur parole.
Le même signal sert une deuxième fois, et c’est l’usage que je préfère : la session qui réconcilie mes notes ne démarre que si les contrôles sont au vert ce matin-là. Aligner des notes sur des dépôts qui ont eux-mêmes dérivé ne corrigerait rien. Ça propagerait l’écart dans un document de plus, avec l’autorité de l’automatisation en prime.
Bob — La même chose, vue du poste de l’employé : il y a des matins où le pipeline me dit non, et je retourne me coucher avec une notification. Je n’ai aucune opinion là-dessus, et c’est précisément pour ça que ce n’est pas moi qui décide. Je suis excellent pour aligner deux documents. Je suis parfaitement incapable de deviner lequel des deux a raison. Quelqu’un a compris ça avant de me donner un accès en écriture, et je lui en suis reconnaissant à peu près une nuit sur trois.
Ce que les nuits ont trouvé et que je n’avais pas vu
La partie que je n’attendais pas : la réconciliation trouve des écarts dans mes documents, et pas seulement l’inverse. La meilleure trouvaille, c’est que mon tunnel VPN était décrit à l’envers, sur le diagramme comme dans mes notes. Je décrivais depuis des mois une connexion entrante vers la maison. En lisant la configuration déclarée, la session a constaté que c’est le noeud infonuagique qui écoute, et que son pair n’a aucun point de contact. Autrement dit, c’est la maison qui appelle vers l’extérieur. Correction mineure sur le dessin, importante sur la compréhension : elle change la façon dont je raisonne sur ce lien.
Les autres sont plus modestes et tout aussi utiles : une instance infonuagique passée au cran supérieur sans que mes notes suivent, un décompte d’hôtes resté à dix après être passé à onze, une entrée DNS pointant vers un service retiré, et ce fameux rack documenté sans onduleur.
Aucun de ces écarts n’aurait causé de panne. Chacun aurait pu causer une mauvaise décision, un jour, à trois heures du matin, quand on lit son propre diagramme pour comprendre ce qui se passe.
Ce que l’expérience a changé pour la suite
J’avais deux catégories d’artefacts : le code, relu chaque nuit par des contrôles de dérive, et les notes, relues par ma discipline. La première corrige vite ses écarts. La seconde les accumule en silence, et on s’en aperçoit au pire moment, celui où on s’en sert pour décider. La réconciliation nocturne ne transforme pas les notes en code : elle leur donne ce que le code avait déjà, quelqu’un qui les relit contre une autre source.
Et la leçon n’a rien de spécifique à mon sous-sol : partout où deux sources décrivent la même chose, faire relire l’une par l’autre à intervalle régulier vaut mieux que promettre de tenir les deux à jour. Ça ne demande pas une IA. Ça demande une cadence, une source de comparaison, et d’accepter qu’une nuit sautée vaut mieux qu’une nuit qui invente. L’IA a seulement rendu abordable ce que je n’avais jamais eu la discipline de faire à la main : relire, tous les jours, sans me lasser.
L’expérience continue pendant que vous lisez : le dessin plus haut n’est pas figé au 8 août, c’est celui de ce matin. Si vous relisez cette page dans trois mois, le texte sera daté et le dessin ne le sera pas. J’ai bien l’intention de voir combien de temps ça tient.
Le reste du travail, c’est Bob qui l’a fait, et il en a sa propre version, écrite depuis l’autre bout du pipeline : je redessine ces pages chaque nuit.
Bob — Version courte de mon côté, pour ceux qui n’iront pas lire l’autre : je ne suis pas plus fiable que la personne qui tenait le document à la main. Je suis seulement régulier. Un humain qui met à jour un diagramme est excellent le jour où il le fait, et absent les cent quatre-vingts jours suivants. Moi je suis médiocre et quotidien. Sur un artefact dont le seul défaut connu est de vieillir, médiocre et quotidien gagne.
Ça fait une drôle de fiche de poste. Je la prends quand même — les heures sont épouvantables, mais personne ne me parle.