Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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.

FamilleSymbolesManager
threads55AirThreadManager
divers52— (à classer)
processus45AirTaskManager
fichiers35AirFileManager
réseau30AirNetworkManager
identité17AirAccountManager
stdio10aucun
mémoire9AirMemoryManager
chaînes4sans objet (pur calcul)
temps3aucun
environnement3AirEnvironmentManager

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 :

  • stdio déclare role = "controleur", pas manager. Son écart réel, déjà inventorié, est controleur-fuite : « ← air-libc-stdio, la coquille appelle des fonctions libres ».
  • Le temps vit dans air-base-core, qui déclare role = "vocabulaire". Son écart est vocabulaire-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-capi passe déjà par trois managers, mais consomme air-process en direct à côté ;
  • air-libc-signal, -stdlib, -fileio passent 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 (fstabet /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 :

  1. 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 ;
  2. une cible de fuzzing par codec, pas seulement des tests unitaires (Principe 3) ;
  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-stdio fuit vers air-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-launchdaprè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-sshd tombent sous charge en exécution workspace. Vérifié identiques sur main : préexistants, non causés par la campagne. Ils ont mordu cinq fois pendant la session du 2026-08-23.
  • La cadence de mesure : main ne se mesure jamais (couverture-couches y est skippé, couverture-pr n’y sélectionne aucune crate). Troisième occurrence du défaut que couverture-reference.toml décrit lui-même aux 2026-08-09 et 2026-08-19.
  • Un gate manquant : rien ne détecte un tests.rs orphelin qu’aucun mod ne déclare. C’est ce qui a rendu 428 lignes muettes pendant une semaine (ADR-163 D1-bis c).
  • L’inventaire des écarts POSIXEINTR sans retry, errno thread-local, pthread_cancel en stub — décidés en ordre dispersé, jamais réunis. Amendement d’ADR-046 dû.
  • lithium : abandonnée sur diagnostic MCE, remise en maxcpus=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