ADR-164 — Les outils système qu’Air doit fournir : le catalogue, et la règle qui l’ouvre
Statut : Proposé (2026-08-23). Décide qu’Air tient un catalogue des outils système qu’un utilisateur de machine Linux est en droit d’attendre, et pose la règle qui interdit de renvoyer cet utilisateur vers un outil qu’Air ne fournit pas. Le catalogue lui-même est ouvert : il se remplit par amendements.
Catégorie : Outils d’administration, anneau 2. S’appuie sur ADR-004 (Linux tier-1), ADR-111 (journal natif) et ADR-033 (configuration, dont les paramètres du noyau).
Contexte
Air remplace un userland. Il ne remplace pas le noyau — ADR-004 en fait le socle assumé. Or un noyau Linux expose en permanence des faits que seul un outil d’espace utilisateur rend lisibles : erreurs matérielles, journal, périphériques, paramètres, tables de routage, systèmes de fichiers montés.
Ces outils ne sont pas un confort. Ils sont la condition pour que la machine soit interrogeable — et une machine qu’on ne peut pas interroger est une machine qu’on ne peut pas administrer, ni diagnostiquer, ni croire.
L’incident qui a révélé la lacune
Le 2026-08-23, une machine du parc (lithium, ThinkPad T550) est entrée en boucle de
redémarrage. Le noyau affichait un panic de Machine Check Exception et recommandait à
l’utilisateur, textuellement, de lancer :
mcelog --ascii
Trois constats en sont sortis, et chacun compte.
mcelogn’existe plus. Écrit par Andi Kleen — l’auteur du sous-système MCE du noyau —, il est obsolète depuis 2017 et son remplaçant estrasdaemon, de Mauro Carvalho Chehab, qui passe par les tracepoints RAS/EDAC et non plus par/dev/mcelog. Ubuntu 26.04 répond « pas de version susceptible d’être installée ».- Le noyau conseille donc un outil mort. Le message survit dans
arch/x86/kernel/cpu/mce/bien après la disparition de l’outil qu’il nomme. - Air n’avait rien à proposer, et surtout aucun endroit où constater qu’il n’avait
rien. Aucun ADR ne catalogue les outils système dus ; quatre CLI existent
(
air-account,air-bundle,air-keystore,air-agent), chacune décidée pour elle-même. Le manque ne s’est pas vu : il s’est rencontré.
C’est le défaut que cet ADR traite. Pas l’absence d’un outil — l’absence d’un inventaire qui rende les absences visibles avant qu’un incident ne les révèle.
Décisions
D1 — Air tient un catalogue des outils système dus
Le catalogue vit dans cet ADR, en une table par famille de faits du noyau. Chaque entrée dit ce que l’outil doit rendre lisible, l’équivalent du monde C-Unix pour situer le lecteur, et son état.
Un outil qui n’est pas au catalogue n’est pas « oublié » : il est absent d’une liste que l’on peut lire, ce qui est la seule façon de s’en apercevoir avant l’incident.
L’équivalent C-Unix est donné pour situer, jamais pour imiter : Air ne s’engage pas à reproduire des options ni des formats de sortie. Ce qu’il doit rendre, c’est le fait.
D2 — Air ne renvoie jamais vers un outil qu’il ne fournit pas
C’est la règle, et elle vise directement le défaut constaté.
Tout message d’Air — panic, diagnostic, erreur, page de manuel — qui nomme un outil doit nommer un outil qu’Air fournit.
Un système qui conseille un outil absent ne rend pas service : il donne à l’utilisateur
l’illusion d’une piste, et lui fait perdre le temps qu’il aurait employé à en chercher une
vraie. C’est la même faute que le NO GO n°1 de CLAUDE.md — un outil affirmé qui
n’existe pas —, appliquée à la surface que voit l’utilisateur plutôt qu’à celle que voit le
développeur.
Ce que cela n’interdit pas : nommer un outil tiers que la machine porte réellement. Ce qui est interdit, c’est de nommer un outil qui n’est ni fourni par Air, ni présent.
D3 — On reprend le mécanisme vivant, jamais le mécanisme mort
Là où le monde C-Unix a remplacé un outil, Air part du remplaçant.
Pour les erreurs matérielles, cela signifie partir des tracepoints RAS/EDAC — la voie de
rasdaemon — et non de /dev/mcelog, interface héritée que le noyau maintient par
compatibilité. Reprendre l’ancienne serait hériter d’une dette que son propre écosystème a
déjà soldée.
Le corollaire vaut pour la suite du catalogue : quand deux voies coexistent dans le noyau, Air prend celle que le noyau développe, pas celle qu’il tolère.
D4 — Ce qui est dû, c’est le fait, pas la ligne de commande
Air ne s’engage pas à fournir mcelog, ni ses options, ni son format. Il s’engage à ce
qu’un administrateur puisse savoir que le processeur a signalé une erreur, laquelle, et
sur quel composant.
Deux conséquences :
- la surface est libre — une commande, une sous-commande d’un outil plus large, ou une lecture par le journal d’ADR-111 ;
- la sortie suit le Principe 11 : lisible par défaut, structurée à la demande. C’est le second membre du principe — « en sortie, l’inverse : la lisibilité est un service rendu là où le système est la source ».
D5 — Le décodage est la substance, pas l’entrée/sortie
Pour les erreurs matérielles en particulier, lire l’événement est la partie facile. Ce qui fait l’outil, c’est de traduire un banc et un code d’erreur en une phrase qu’un humain peut agir — ce qui suppose des tables par famille de processeur, qui vieillissent et doivent se mettre à jour.
Cette décision existe pour éviter une sous-estimation classique : « c’est juste lire un descripteur ». Non — c’est porter et tenir à jour une connaissance matérielle.
Le catalogue
Ouvert par une seule famille. Il est destiné à être amendé : les autres familles viendront par décisions successives, et cette table est l’endroit où elles s’inscrivent.
| Famille | Ce qu’Air doit rendre lisible ou réglable | Repère C-Unix | Primitive Air | État |
|---|---|---|---|---|
| Erreurs matérielles (RAS) | Le processeur ou la mémoire a-t-il signalé une erreur ? Laquelle, corrigée ou non, sur quel composant ? | rasdaemon (vivant) — pas mcelog (mort en 2017) | — | à faire |
| Modules du noyau | Quels modules sont chargés, lesquels peuvent l’être, avec quels paramètres ; en charger un, en retirer un. | lsmod, modprobe, rmmod, modinfo, depmod | aucune — init_module/finit_module/delete_module ne sont pas en couche 0 | à faire |
| Paramètres du noyau | La valeur en vigueur d’un paramètre, et la changer. | sysctl | air-system::parameters + AirConfigManager | décidé par ADR-033 D-a→D-f |
| Fréquence et états d’inactivité du CPU | Le gouverneur en vigueur, les états C disponibles et actifs, les fréquences ; les régler. | cpupower, /sys/devices/system/cpu/cpufreq, cpuidle | — | à faire |
| Affinité et ordonnancement | Sur quels cœurs tourne une tâche, sous quelle politique et quelle priorité ; les changer. | taskset, chrt, nice, ionice | air-sys-syscall::process (set_cpu_affinity, sched_set*) | à faire |
| Limites de ressources | Les limites d’un processus vivant, et les ajuster. | prlimit, ulimit | air-sys-syscall::process::prlimit | à faire |
| Capacités | Les capacités d’un processus ou d’un exécutable ; les poser, les lire, les retirer. | capsh, getcap, setcap, getpcaps | air-sys-syscall::process (capget/capset) | à faire |
| Affinité des interruptions | Quel cœur sert quelle interruption, et la déplacer. | /proc/irq/*/smp_affinity, irqbalance | — | à faire |
| eBPF | Quels programmes et quelles cartes sont chargés ; en charger, en inspecter, en retirer. | bpftool | air-sys-syscall::ebpf | à faire |
| Périphériques et règles d’attachement | Quel périphérique existe, quel pilote le sert, quels attributs il expose ; déclencher un ré-examen. | udevadm | air-device (énumération, attributs, hotplug) | à faire |
| Capture de plantage | Un noyau qui panique laisse-t-il une trace exploitable, et où ? | kexec, kdump, pstore | air-sys-types (types kexec) | à faire |
Ce catalogue est ouvert et il le restera. Les familles ci-dessus partagent une même nature — elles configurent ou paramètrent le noyau. C’est le périmètre qu’il couvre aujourd’hui ; d’autres natures (observation, diagnostic, réseau, systèmes de fichiers) viendront par amendement, chacune avec sa décision.
La colonne Primitive Air dit ce que le dépôt porte déjà, et c’est elle qui rend le catalogue utile : pour la plupart des familles, le syscall est là et c’est l’outil qui manque. Deux exceptions se lisent d’un coup d’œil — les modules du noyau, dont aucune primitive n’existe en couche 0, et la fréquence/inactivité du CPU, qui vit en
sysfset n’a donc pas de syscall à porter.Les modules méritent d’être signalés à part. Charger un module, c’est exécuter du code dans l’espace noyau : c’est le vecteur d’élévation de privilège le plus direct qu’un système Linux expose. Qu’Air n’en ait aujourd’hui aucune primitive n’est pas un oubli à combler à la légère — c’est une surface dont l’ouverture devra être décidée, et gardée, avec le soin qu’ADR-089 réserve aux opérations qui affaiblissent.
Ce que cet ADR ne décide pas
- Quels outils, au-delà de la première famille. C’est l’objet des amendements à venir, et c’est délibérément laissé à l’auteur du projet.
- La forme des commandes — nom, découpage, sous-commandes. D4 le dit : ce qui est dû est le fait.
- Le calendrier. Aucune famille du catalogue n’est ordonnancée ici.
- Le sort des outils tiers déjà présents sur une machine Air. Cet ADR dit ce qu’Air doit fournir, pas ce qu’il doit interdire.
Conséquences
- Une absence devient constatable : le catalogue se lit, et ce qui n’y est pas se voit.
- D2 crée une obligation vérifiable sur les messages d’Air. Elle est outillable — un gate pourrait confronter les noms d’outils cités dans les sources aux exécutables empaquetés — mais aucun gate n’existe à ce jour, et cet ADR ne prétend pas le contraire.
- La première famille implique de porter des tables de décodage matériel (D5), donc une dette de maintenance à assumer, et à ne pas découvrir en route.
Alternatives rejetées
- Ne rien cataloguer, décider outil par outil. C’est l’état actuel, et c’est ce qui a produit l’incident : le manque ne se voyait nulle part.
- Cataloguer d’office tout le userland C-Unix. Ferait de cet ADR une liste de vœux, sans décision derrière. Une entrée au catalogue est un engagement, pas une idée.
- Porter
mcelog. Ce serait reprendre un outil mort et son interface héritée, alors que son propre écosystème a déjà migré (D3). - Renvoyer l’utilisateur vers les outils de la distribution hôte. Air est un système, pas une surcouche : sur une machine Air, il n’y a pas de distribution hôte à qui déléguer.
Licence du document : MPL 2.0