Feuille de route — managers, codecs, libc, puis le lanceur et le shell
Arrêtée le 2026-08-24 avec le BDFL. Ce document dit l’ordre et les raisons. L’état vivant reste
etat-avancement.md; la trace historique,JOURNAL.md.
Le principe d’ordonnancement
Un seul, et il commande tout le reste :
On ne construit pas sur ce qu’on va réécrire.
Trois chantiers sont en jeu — les managers, les codecs de formats, la libc — et ils ne sont pas indépendants : la libc s’appuiera sur les managers, et plusieurs managers portent aujourd’hui des lectures de formats qui rejoindront les codecs (ADR-165 D5). Les faire dans le mauvais ordre, c’est écrire deux fois.
Où l’on en est au 2026-08-24
Les managers — le chantier est clos
Les 19 crates qui déclarent role = "manager" en portent un. La campagne était partie de
11 sur 19.
Une constante s’en dégage, qui n’était pas prévue au départ : chaque manager ne garde qu’une chose, et c’est toujours le desserrage. Poser une cage ne se garde pas — c’est l’opt-out. Durcir un paramètre du noyau ne se garde pas — c’est le desserrage. Compiler ne se garde pas — c’est l’élargissement des bornes. Tirer du CSPRNG ne se garde pas — c’est l’entropie fournie par l’appelant.
Les routes parallèles — 351 appels, 63 paires
Mesuré le 2026-08-23, contre 3 marqueurs SECOND-PATH déclarés. C’est une borne
haute : certaines paires sont légitimes (ADR-149
D7 autorise l’intra-couche entre contrôleurs), d’autres sont déjà inventoriées au registre
sous d’autres motifs.
Le vrai enseignement n’est pas le nombre : il existe trois inventaires du même sujet — les marqueurs, les motifs du registre, cette mesure — et aucun n’est complet.
La libc — l’état des lieux
23 crates, 288 symboles extern "C", dont 264 dans air-libc-capi.
| Famille | Symboles | Manager |
|---|---|---|
| threads | 55 | AirThreadManager |
| divers | 52 | — (à classer) |
| processus | 45 | AirTaskManager |
| fichiers | 35 | AirFileManager |
| réseau | 30 | AirNetworkManager |
| identité | 17 | AirAccountManager |
| stdio | 10 | aucun |
| mémoire | 9 | AirMemoryManager |
| chaînes | 4 | sans objet (pur calcul) |
| temps | 3 | aucun |
| environnement | 3 | AirEnvironmentManager |
Neuf familles sur onze ont déjà leur manager, et les deux dernières n’en attendent pas — c’est une rectification du 2026-08-24, la première rédaction laissait croire le contraire :
stdiodéclarerole = "controleur", pasmanager. Son écart réel, déjà inventorié, estcontroleur-fuite: « ← air-libc-stdio, la coquille appelle des fonctions libres ».- Le temps vit dans
air-base-core, qui déclarerole = "vocabulaire". Son écart estvocabulaire-impur: « encode/decode/sleep/sleep_until » — un vocabulaire ne porte que des types, et celui-ci porte des opérations.
Aucun manager n’est donc à écrire pour la libc. Le travail est ailleurs : faire cesser la
fuite d’air-stdio et sortir les opérations d’air-base-core.
Le raccordement, lui, est très inégal :
air-libc-capipasse déjà par trois managers, mais consommeair-processen direct à côté ;air-libc-signal,-stdlib,-fileiopassent par un manager ;- six crates n’en empruntent aucun :
air-libc-grp,-id,-pwd,-shadow,-spawn,-thread.
Quatre de ces six ne font que lire des formats — elles fondront en grande partie dans les codecs d’ADR-165. C’est la raison décisive de faire les codecs avant la libc.
L’ordre retenu
1. Les codecs — en cours ; 10 formats sur 11 livrés
ADR-165, onze formats gelés. La crate
air-format-codecs porte les dix premiers, en trois tranches : les trois formats à
enregistrements de /etc (passwd, shadow, group), puis les quatre formats à champs
séparés par des blancs (fstab — et /proc/mounts, qui est le même codec —, hosts,
resolv.conf), puis les trois formats de /proc (scalaire sysctl, meminfo,
/proc/[pid]/stat). Reste le onzième, l’attribut sysfs.
Aucun appelant n’est encore migré : la dette de D5 reste entière et relève d’un chantier à part.
Une divergence est ouverte et attend un arbitrage : air-system::parameters::decoder
(PR #823) et le codec du scalaire sysctl s’accordent sur tout sauf b"+1", que le
premier accepte — par héritage de str::parse::<i64> — et que le second refuse. Elle est
documentée en tête de sysctl_scalar, et se solde d’une ligne au moment de la migration D5.
Pourquoi en premier, alors qu’ils semblent périphériques : air-account, air-config,
air-socket, air-device et air-system contiennent déjà ces lectures. Le décodeur de
scalaire /proc/sys écrit le 2026-08-23 en est un. Les finir après les managers, c’est les
réécrire.
Pourquoi en parallèle : un codec sans I/O n’a aucune dépendance sortante. Sa production n’entre en conflit avec aucun autre chantier — c’est le seul morceau réellement délégable.
Trois conditions, sans lesquelles la délégation produit du faux :
- la liste gelée et, pour chaque format, sa référence qui fait autorité — un codec qui invente sa grammaire est pire que pas de codec ;
- une cible de fuzzing par codec, pas seulement des tests unitaires (Principe 3) ;
- la posture de tolérance décidée format par format (ADR-165 D3) — l’implémenteur applique, il ne tranche pas.
2. Le compte régénérable des routes parallèles
Un seul inventaire, produit par l’outillage, à la place des trois actuels. Sans lui, la fermeture des routes parallèles se pilote à l’aveugle.
3. Les deux écarts de rang — air-stdio et air-base-core
Pas des managers à écrire (cf. l’état des lieux ci-dessus), mais deux écarts de rang à solder :
air-stdiofuit versair-libc-stdio, qui appelle ses fonctions libres au lieu de passer par un contrôleur ;air-base-core, déclaré vocabulaire, porte des opérations (sleep,sleep_until,encode/decode).
Le second est le plus structurant : un vocabulaire impur brouille la frontière que tout le reste de l’architecture suppose nette.
4. air-sshd — le raccordement
110 appels directs, dont air-terminal (19) et air-account (21). openpty est
précisément l’opération sensible qu’AirTerminalManager garde.
Ce n’est pas un redéploiement, c’est un raccordement. Le distinguer évite de sous-estimer le travail.
5. air-launchd — après discussion avec le BDFL
Explicitement réservé : rien ne se modifie sur air-launchd avant cet échange.
6. air-run, puis alize
Le protocole de demande air-run ↔ lanceur, qu’ADR-010 D-d
nomme et laisse à écrire, puis le shell — nommé et acté par
ADR-154, non POSIX.
Point de conception à ne pas perdre : sous ADR-150
D12, le shell ne lance pas, il demande. AirTaskManager seul donnerait un shell qui lance
hors cage — exactement ce que le modèle refuse.
7. La libc — révision intégrale
Faire passer les 287 symboles par les managers reste le gros du travail. Mais la seconde moitié de cette étape — appliquer ADR-166 fonction par fonction — a été mesurée le 2026-08-24, et elle est bien plus petite qu’annoncé.
Sept fonctions, pas 288 (ADR-166 D7). Une
fonction ne peut taire un échec que si son prototype ne rend rien : 280 des 287 rendent
déjà une valeur. Restent rewind, rewinddir, setbuf, clearerr — qui savent et
jettent (let _ = …) —, free — qui ne sait pas encore et demande une instrumentation de
l’allocateur —, et deux Conservé justifiés (freeaddrinfo, air_libc_stdio_flush_all).
Ce qui reste réellement lourd est donc le raccordement aux managers, pas la correction des prototypes. Et c’est bien lui qui profite le plus de tout ce qui précède — d’où sa place en dernier.
Ce que cette mesure enseigne : « 288 symboles » n’avait jamais été confronté. Le chiffre décrivait la surface, pas le travail.
Ce qui reste ouvert, et qu’on ne masque pas
- Quatre tests de forwarding d’
air-sshdtombent sous charge en exécution workspace. Vérifié identiques surmain: préexistants, non causés par la campagne. Ils ont mordu cinq fois pendant la session du 2026-08-23. - La cadence de mesure :
mainne se mesure jamais (couverture-couchesy est skippé,couverture-prn’y sélectionne aucune crate). Troisième occurrence du défaut quecouverture-reference.tomldécrit lui-même aux 2026-08-09 et 2026-08-19. - Un gate manquant : rien ne détecte un
tests.rsorphelin qu’aucunmodne déclare. C’est ce qui a rendu 428 lignes muettes pendant une semaine (ADR-163 D1-bis c). - L’inventaire des écarts POSIX —
EINTRsans retry,errnothread-local,pthread_cancelen stub — décidés en ordre dispersé, jamais réunis. Amendement d’ADR-046 dû. lithium: abandonnée sur diagnostic MCE, remise enmaxcpus=1, chien de garde matériel en place. Une machine qui lève des MCE ne peut pas valider Air — un runner dont on ne peut pas croire les résultats est pire qu’un runner absent.
Licence du document : MPL 2.0