Mettre à jour un parc contraint sans le briquer
Les quatre questions que pose un acheteur industriel avant toute question sur le modèle : comment mettez-vous à jour deux cents machines, que se passe-t-il quand une mise à jour est mauvaise, qu'y a-t-il dans l'image, et savez-vous reconstruire la version qui tourne aujourd'hui.
Chiffres relevés le 21 août 2026 en exécutant les suites de tests, et non recopiés des fichiers README.
Les démonstrations portent sur l'inférence, les achats portent sur le reste
Toute conversation sur l'IA embarquée finit par atteindre les questions réelles de l'acheteur, et aucune ne porte sur le modèle. Comment met-on à jour deux cents machines. Que se passe-t-il quand une mise à jour est mauvaise. Qu'y a-t-il dans l'image. Sait-on reconstruire la version qui tourne aujourd'hui sur le terrain.
Ce dépôt est la moitié ingrate, construite comme un modèle qui fonctionne plutôt que comme une planche de présentation : bascule A/B avec retour arrière automatique, manifestes liés par empreinte, différentiel d'inventaire logiciel et builds reproductibles.
Le silence vaut retour arrière, et le parc s'arrête de lui-même
« L'état qui survit à une coupure de courant est en attente, et ce qui est en attente revient en arrière. »
L'activation ouvre une fenêtre de confirmation. Un nœud qui démarre une image neuve et ne se signale pas revient à ce qu'il exécutait avant, sur sa propre horloge, sans consulter personne, que l'image soit mauvaise, que le réseau soit tombé ou que quelqu'un ait coupé l'alimentation. Deuxième règle : une vague au-delà de son budget d'échec arrête le déploiement, et il n'existe aucun indicateur pour continuer, parce qu'un tel indicateur serait utilisé à trois heures du matin par celui qui veut en finir.
plan : inspection-agent -> 2.4.0
waves : canary, pilot, fleet
updated : 2
failed : 4
rolled back : 2 <- the number that matters
untouched : 6
✓ node-01 updated health probe passed
✓ node-02 updated health probe passed
✗ node-03 transport-failure link dropped during transfer
✗ node-04 digest-mismatch manifest says sha256:ceba2163…, bytes hash to sha256:c1735458…
✗ node-05 health-probe-failed health probe failed
✗ node-06 health-probe-failed no health probe supplied
still on 2.3.0: 10 node(s)
digest-mismatch
Le téléchargement a réussi et a livré les mauvais octets. Un contrôle qui demande si le transfert s'est bien passé répond oui.
no health probe supplied
Retour arrière prononcé pour l'absence de contrôle. Une machine à laquelle personne ne peut poser de question ne conserve pas une modification sur la foi de son silence.
Le déploiement s'est arrêté de lui-même dans la vague « pilot », quatre nœuds sur cinq ayant échoué pour un budget d'un seul. Six machines n'ont jamais été touchées et exécutent encore la version qui fonctionne, et dix restent en 2.3.0 : c'est le déploiement qui réussit, pas celui qui échoue.
Cinq paliers, cent trente-quatre tests
Exécutés le 21 août 2026 sur le dépôt public. Trente-deux contrôles sont rattachés chacun au test qui les démontre, ce qui rend la table de correspondance vérifiable plutôt que déclarative.
| Palier | Tests | Question à laquelle il répond |
|---|---|---|
smoke | 6 | Est-ce que cela démarre |
unit | 57 | Chaque partie se comporte-t-elle correctement à ses bornes |
functional | 27 | Le déploiement respecte-t-il sa spécification |
security | 22 | Que fait-il d'une image ou d'un manifeste qu'il n'a pas produits |
pentest | 22 | La revendication peut-elle être cassée |
| Total | 134 | 96 % |
La barrière d'intégration enchaîne l'analyse statique, le typage strict, la revue de sécurité du code, les avis de sécurité sur les dépendances et un plancher de couverture à 90 pour cent. Le dépôt n'a aucune dépendance d'exécution.
Les lacunes connues, telles que le dépôt les énonce
Le modèle de menace du dépôt énumère six risques résiduels. Les cinq qui comptent pour un lecteur extérieur sont ceux-ci.
- Aucune protection contre le retour à une version ancienne. Une image plus ancienne et correctement signée est acceptée, avec ses vulnérabilités.
- Le contrôle de santé est échantillonné une seule fois, au moment de la confirmation. Ce qui se dégrade ensuite n'est pas vu.
- Aucune attestation. La version qu'un nœud déclare est le récit qu'il fait de lui-même.
- Le vérificateur de signature appartient à l'appelant. Le dépôt modélise le quorum, il ne fournit pas de racine de confiance.
- Rien n'a rencontré d'interrupteur. Chaque nœud est un objet Python, et la coupure d'alimentation est simulée, pas subie.
Quatre documents, dans l'ordre où ils se lisent
- docs/GETTING_STARTED.mdNe suppose aucune expérience du terminal, et mène au premier déploiement simulé.
- docs/ARCHITECTURE.mdLes décisions de conception, et ce qu'elles écartent.
- docs/CONTROL_MAP.mdLes trente-deux contrôles, chacun rattaché au test qui le démontre.
- docs/THREAT_MODEL.mdLes six risques résiduels, énoncés sans atténuation.
Une revendication de gouvernance se vérifie ou ne vaut rien
Si l'un de ces maillons correspond à une question ouverte chez vous, la conversation commence par le code.