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

Registre des ADR d’Air

ADR — Architecture Decision Record. Document court et daté qui consigne une décision structurante : son contexte, la décision prise, et ses conséquences. Les ADR sont numérotés, immuables une fois acceptés (sauf RFC — cf. ADR-015), et font autorité.

Chaque ADR vit dans son propre fichier, en français et en anglais. Ce registre est l’index intégral, trié par numéro.

Ce que dit la colonne « Mise en œuvre »

Le champ **Statut :** que porte chaque ADR décrit sa décision (Accepté, Proposé). La colonne ci-dessous décrit sa mise en œuvre — dimension distincte : une décision peut être acceptée depuis longtemps et n’être implémentée que bien plus tard, ou n’avoir aucune implémentation à produire.

MarqueSens
✅ Faitmise en œuvre terminée
🔨 En coursimplémentation entamée, non close
⏳ À fairedécision actée, rien de commencé
♾️ Permanentpolitique en vigueur continue, sans « mise en œuvre » à produire
❓ À qualifierà trancher — ne doit pas subsister durablement

182 ADR — ✅ Fait 99 · 🔨 En cours 18 · ⏳ À faire 42 · ♾️ Permanent 23

Index

ObjetFRENMise en œuvre
001IPC AirCom, refus de D-Bus comme transport principalFREN🔨 En cours
002Modèle d’objet hybride asymétrique, C-ABI pour le périmètre CoreFoundation/AppKitFREN🔨 En cours
003Air compositeur WaylandFREN⏳ À faire
004Linux tier-1 exclusif, FreeBSD et Windows tier-3 documentésFREN♾️ Permanent
005Intégration systemd comme socle système, D-Bus optionnelFREN🔨 En cours
006Profils de déploiement air-base (console) et air-desktop (graphique)FREN⏳ À faire
007Compositeur de console air-console, symétrie avec air-wmFREN⏳ À faire
008Framework TUI air-tui avec trois backends de transportFREN⏳ À faire
009Framework de vues d’Air : tronc déclaratif air-view, bindings air-ui (graphique) et air-tui (texte)FREN⏳ À faire
010Format .airapp et .airservice, entitlements déclaratifs signés, sandbox capability-basedFREN🔨 En cours
011Phasage bottom-up piloté par jalons démontrablesFREN♾️ Permanent
012Stratégie de versionnement et stabilité ABIFREN♾️ Permanent
012-bisPolitique de télémétrie AirFREN♾️ Permanent
013Distribution Air, posture stratégique de troisième voie qualitativeFREN♾️ Permanent
014Catalogue de matériel « Air long-term »FREN♾️ Permanent
015Licence MPL 2.0, contribution DCO, gouvernance évolutive, marque modèle LinuxFREN♾️ Permanent
016Internationalisation native et localisation progressiveFREN⏳ À faire
017Accessibilité citoyen de première classe, fondée sur le modèle d’objet C-ABIFREN⏳ À faire
018Modèle d’imagerie d’Air : vectoriel pour le mode graphique, cellulaire pour le mode consoleFREN⏳ À faire
019Modèle d’erreurs hybride à deux niveauxFREN✅ Fait
020Stratégie signaux : signalfd par défaut, sigaction restreintFREN✅ Fait
021Conventions transverses de la couche 0FREN✅ Fait
022Architecture du module io_uringFREN✅ Fait
023Runtime asynchrone Air construit sur io_uringFREN✅ Fait
024Workflow de gestion des dépendancesFREN♾️ Permanent
025Stratégie de builds reproductiblesFREN♾️ Permanent
026Contrat 1.0 d’air-tui : UI texte riche, cellulaire, capability-gatedFREN⏳ À faire
027Stratégie de documentation polyglotte (ABI C et bindings multi-langages)FREN♾️ Permanent
028Soundness et téardown du module io_uring (S1/S2/S3)FREN✅ Fait
029Nommage de la surface publique : explicite, sans abréviation ; noms d’autorité conservés à l’interfaceFREN♾️ Permanent
030Périmètre de la règle des 80 % : dépendances de production vs test-onlyFREN♾️ Permanent
031Mesure de couverture en root sur les runners self-hostedFREN✅ Fait
032Préservation des données confiées : zéro discard silencieuxFREN♾️ Permanent
033Modèle de configuration : source typée, compilation validée, artefact binaireFREN🔨 En cours
034Discipline des dépendances cryptographiquesFREN♾️ Permanent
035Taxonomie des exceptions de couvertureFREN♾️ Permanent
036Filtrage par chemin de la re-vérification d’une couche scelléeFREN✅ Fait
037CI ARM seule (raspi-srv-2) + validation x86 par barrière pré-mergeFREN✅ Fait
038Modèle d’exécution : runtime async natif io_uring (sans tokio), couches basses synchrones, io_uring seul moteur de readinessFREN✅ Fait
039Nommage et placement : runtime async air-runtime (couche 1), modèle d’objet air-object (couche 2), et modèle d’ordonnancementFREN✅ Fait
040Format de l’artefact binaire de configuration : Cap’n ProtoFREN✅ Fait
041Coexistence /etc : projection générée, lecture seule sélective, air-config seul écrivainFREN✅ Fait
042Pile TLS : rustls + aws-lc-rs (exception C nommée, étroite), TLS 1.3, air-tls maison en contingenceFREN⏳ À faire
043Pile SSH : OpenSSH système en incubation, air-ssh maison à termeFREN🔨 En cours
044Extension de la couche 0 : famille poll (ppoll) pour l’attente synchrone bornée et interruptible (re-sceau couche-0-v1.5)FREN✅ Fait
045Modèle d’erreurs de l’ABI C : AirStatus in-band, sans errno, panic = abortFREN✅ Fait
046La libc Air (Rust pur) : périmètre, layering couche-1-only, et doctrine d’exécutionFREN♾️ Permanent
047Principes de construction de la libc AirFREN♾️ Permanent
048Descellement unique de la couche 0 : std-free certifié + famille futex(2) (re-sceau couche-0-v1.6)FREN✅ Fait
049Runtime Air : TCB, TLS, démarrage (crt0), errno, environ — fondation *-linux-airFREN✅ Fait
050Spécification de la cible *-linux-air (phase 1 du programme runtime)FREN✅ Fait
051Descellement couche-0-v1.7 : 7 syscalls pour le runtime et la libcFREN✅ Fait
052air-rt est un objet couche 1 (AirRuntime), jamais un consommateur direct de la couche 0FREN✅ Fait
053La libc Air s’appuie sur icu4x pour ctype/locale/i18n (caractères, casse, collation, normalisation, segmentation)FREN✅ Fait
054Scission d’air-base-lib : un cœur air-base-core sans i18n pour la fermeture runtimeFREN✅ Fait
055air-thread/air-process en #![no_std] : crate air-env + spawn ergonomique gardé per-cibleFREN✅ Fait
056Allocateur global Air (air-alloc) : inspiré de dlmalloc, simple, possédéFREN✅ Fait
057libm Air (air-libm) : vendoring de libm (rust-lang) en surface math couche 1FREN✅ Fait
058loom : activation du modèle de concurrence (outil de vérification test-only)FREN✅ Fait
059Stratégie i18n : Air utilise icu4x (pas de réimplémentation), possède l’API + les donnéesFREN✅ Fait
060Descellement couche-0-vX : famille termios/tty (pour la libc et air-terminal)FREN✅ Fait
061Architecture AirTerminal : modèle canonique + codecs (vision)FREN✅ Fait
062Sceau couche-1-v1.0 : gel de l’API Rust de la couche 1FREN✅ Fait
063Instrumentation IO couche 1 (mode debug) : registre de handles cross-langage & cohérence forkFREN✅ Fait
064Doctrine des signaux couche 1 : signalfd primaire, fautes → action par défaut (zéro unsafe), helper « bloquer partout + drainer »FREN✅ Fait
065Descellement additif couche-1-v1.1 : AirRuntime::errno_locationFREN✅ Fait
066Descellement additif couche-0 : rt_sigaction non-faute (async réel) + rt_sigpending + trampoline rt_sigreturn ; brique d’install de handler en couche 1FREN✅ Fait
067air-account (couche 1) : gestion des comptes (/etc/passwd + /etc/shadow + /etc/group), bindée par la libcFREN✅ Fait
068Surface fine credentials (uid/gid) en couche 1 (air-process), bindée par la libcFREN✅ Fait
069Registre de handles fd-général (couche 1, air-handle) + moteur socket, façades PAL & libcFREN✅ Fait
070Descellement additif couche-0 : codec sockaddr public pour la face libc (socket_addr_from_bytes / socket_addr_to_bytes)FREN✅ Fait
071Descellement additif couche-0 : setsockopt/getsockopt à valeur entière publics pour la face libcFREN✅ Fait
072CI : x86_64 (speedy) runner primaire ; aarch64 en cross-check + natif sur main (révise ADR-037)FREN✅ Fait
073Doctrine de configuration binaire : pas de conf en texte clair, CLI dédié exigeant le mot de passe administrateurFREN♾️ Permanent
074Vision air-sshd : démon SSH natif d’Air, wire-compatible OpenSSH mais pas opensshd (async io_uring, conf binaire, profil algorithmique moderne)FREN✅ Fait
075Fourniture du PAL : std::sys::pal::air via rust-src patché + build-std, puis upstream Tier-3FREN✅ Fait
076std Rust natif sur la libc d’Air : cible env = 'musl' + vendor = 'air' (chantier B, option A)FREN✅ Fait
077Managers de domaine en couche 1 (FileManager/NetworkManager/TerminalManager…) : surface objet médiatrice des toits (libc + PAL)FREN✅ Fait
078Descellement additif couche-1-v1.7 : additifs crypto pour air-tls (AES-128-GCM, ECDSA/ECDH P-256/P-384, RSA-PSS vérif., ML-KEM-768 hybride)FREN⏳ À faire
079air-netlink (couche 1) : transport netlink générique, crate indépendante + descellement additif couche-0-v1.11 (AF_NETLINK + sockaddr_nl)FREN⏳ À faire
080Additifs air-socket : multicast UDP typé + codec DNS étendu (SRV/TXT/PTR) — descellement additif couche-1-v1.x + couche-0-v1.12 (setsockopt structuré)FREN⏳ À faire
081Additifs crypto pour air-quic et air-ssh : primitives bas niveau (bloc AES, keystream ChaCha20, Poly1305) + RSA PKCS#1 v1.5 vérif. — descellement additif couche-1-v1.xFREN⏳ À faire
082Additifs crypto : AEAD à nonce explicite (record/packet), BLAKE2s (WireGuard), PBKDF2 (SASL/SCRAM) — descellement additif couche-1-v1.xFREN⏳ À faire
083Additifs couche 0 pour la plomberie réseau : TUN (TUNSETIFF) + adjtimex/clock_adjtime — descellement additif couche-0-v1.xFREN⏳ À faire
084Ratification air-url : couche 4 élargie (« frameworks développeur : UI + fondation ») + nom air-urlFREN⏳ À faire
085Descellement additif couche-0 cumulé : primitives manquantes pour la face libc (chantier B — std + OpenSSH)FREN✅ Fait
086Introspection thread cible pour la face libc : TLS dynamique, bornes de pile, auxv (chantier B — M5, Lot C)FREN✅ Fait
087syscall générique (raw_syscall) : escape hatch temporaire pour le pal std (M5, Lot D) — À RETIRERFREN✅ Fait
088std Rust sur Air safe : PAL custom sur la couche 1, sans libc CFREN✅ Fait
089Réservation du SecurityManager : sécurité active per-process (couche 1)FREN🔨 En cours
090Binding de la couche 1 dans std par rustc-dep-of-std : découplage plutôt que fork, sans descellement de la couche 0FREN✅ Fait
091Motif d’architecture réseau sans-IO : anatomie canonique à 9 composants, obligatoireFREN♾️ Permanent
092air-async : découpage réacteur (couche 1) / exécuteur (couche 2) de la runloop io_uringFREN✅ Fait
093Couche transport SSH-2 d’air-sshd : cœur sans-IO air-ssh-proto, topologie de crates v1/v2, jeu d’algorithmes moderne, wire-compat OpenSSHFREN✅ Fait
094air-sshd phase 2 : ssh-userauth (authentification publickey Ed25519, conf par-utilisateur binaire, politique de login, events AirCom, durcissement Terrapin)FREN✅ Fait
095Packaging des exécutables air-ssh : deux binaires séparés (air-ssh client / air-sshd serveur), client à verbes style git, pas de binaire « config-only »FREN✅ Fait
096air-sshd U.3b : magasin authorized_keys binaire par-utilisateur (schéma bespoke air-sshd-schema + lecteur dédié)FREN✅ Fait
097air-sshd phase 3 : ssh-connection (canaux multiplexés, session pty/shell/exec, port-forwarding) + client air-sshFREN✅ Fait
098air-async : combinateurs de concurrence structurée (join/join_all + ensemble dynamique + Notify) et doctrine de multiplexageFREN✅ Fait
099air-ssh/air-sshd : ergonomie client (user@host, DNS, clé fichier, shell interactif) + sous-système de configuration binaire (/etc/air & XDG, édition CLI, export/import JSON)FREN✅ Fait
100Base comptes/credentials binaire (/etc/air/{passwd,shadow,group}) : source de vérité Air, projection /etc pour le monde C, CLI d’administration uniqueFREN✅ Fait
101Gate mot de passe administrateur pour les mutations de la base comptes (mécanisme)FREN✅ Fait
102Crates C-ABI rlib-only : aligner air-value/air-base-capi/air-object sur ADR-029, débloquer les builds releaseFREN✅ Fait
103Discipline de build linux-air : tout exécutable Air est lié à la std linux-air, jamais à la std gnuFREN♾️ Permanent
104air-sshd phase 4 : SFTP v3 (subsystem, cœur sans-IO, worker privsep) + administration des authorized_keys binairesFREN✅ Fait
105Campagne de tests de sécurité d’air-sshd : confrontation aux attaques SSH connuesFREN🔨 En cours
106Air est un target_os distinct et non-POSIX sur substrat noyau Linux (et son nommage upstream)FREN♾️ Permanent
107Pipeline CI/CD linux-air : gate sur notre std, cross-build x86 → exécution native aarch64, et stratégie de cacheFREN⏳ À faire
108air-keystore : manager du cycle de vie des clés et secrets (couche 1), face privilégiée air-keysign, interop OpenSSHFREN✅ Fait
109Certificats SSH (utilisateur + hôte) et autorité de certification : format wire couche 2, CA orchestrée, révocationFREN✅ Fait
110KEX post-quantique : ML-KEM-768 via ml-kem (RustCrypto) re-validé, combineur hybride mlkem768x25519 maison, câblage air-ssh-protoFREN✅ Fait
111air-log (AirLogManager) : sink de logs opérationnels (couche 1), journald natif sans C, anti-injection, distinct d’AirComFREN✅ Fait
112air-sandbox (AirSandboxManager) : confinement seccomp/Landlock sûr, compilateur BPF maison, profils fail-closed, fin de la fuite couche 0FREN✅ Fait
113Doctrine de sourcing cryptographique : pur Rust os-free d’abord, ne pas porter de C, DIY sérieux sinon, fiable > performantFREN♾️ Permanent
114air-json : promotion du JSON minimal maison en crate couche 1 partagée (fuzzée, sans serde, os-free)FREN✅ Fait
115CLI air-keystore : outil d’administration des clés (équivalent ssh-keygen élargi) + mode JSON agent-safe, dogfooding de l’API keystoreFREN✅ Fait
116air-agent : agent SSH maison (keystore-backed) d’abord, interop protocole ssh-agent ensuite, agent forwarding opt-inFREN✅ Fait
117Redirections & multiplexing SSH : -L/-R, ProxyJump/ProxyCommand, direct-streamlocal (Unix) ; -D/ControlMaster différésFREN🔨 En cours
118Config binaire SSH : capacités étendues (Match, options serveur, IdentitiesOnly/ForwardAgent, keepalive) — en binaire, pas de grammaire texteFREN✅ Fait
119Extensions SFTP OpenSSH (posix-rename, hardlink, fsync, statvfs, limits@) + surface statvfs couche 1FREN⏳ À faire
120Authentification hostbased : grappes en confiance mutuelle, signature via air-keysign (sans setuid), confiance transitive assuméeFREN⏳ À faire
121Provisioning air-desktop-host : image first-boot anonyme, publication de la clé d’hôte, amorçage par clé/cert jetable (pas hostbased)FREN⏳ À faire
122air-sshd : séparation de privilèges (privsep) — monitor par connexion, enfant pré-auth confiné, transition post-auth par proxyFREN✅ Fait
123Descellement breaking couche-1-v3.0 : AirPrivilegeDrop prend une cage air-sandboxFREN✅ Fait
124Conception du privsep pré-auth d’air-sshd : topologie monitor / enfant / worker, canal RPC, transition proxyFREN✅ Fait
125Descellement additif couche-1-v3.1 : les primitives de topologie privsepFREN✅ Fait
126Descellement additif couche-0-v1.14 : complétion de l’énumération Capability (41 capabilities noyau)FREN✅ Fait
127Descellement additif couche-1-v3.2 : l’identité effective temporaire (AirTemporaryIdentity)FREN✅ Fait
128Options authorized_keys : périmètre, schéma v2, et placement de l’enforcementFREN✅ Fait
129Conception de V2.5 : transition post-auth (worker + proxy chiffré, options, from=)FREN✅ Fait
130Descellement additif couche-1-v3.3 : le socle de la transition post-auth (tuyau clair, SCM_RIGHTS sous cage, cascade de mort qui survit au largage)FREN✅ Fait
131Descellement additif couche-1-v3.4 : le worker post-auth qui sert vraiment (I/O du proxy confiné, cage SFTP utilisable, registre de descripteurs qui ne ferme plus le neuf)FREN✅ Fait
132Descellement additif couche-0-v1.15 : les anneaux io_uring ne sont plus hérités au fork (MADV_DONTFORK)FREN✅ Fait
133Quota de signatures du monitor air-sshd : borner l’oracle de signature d’un enfant pré-auth compromisFREN✅ Fait
134CLI de migration de la clé d’hôte air-sshd vers le magasin hostkeys.aircfg (prérequis privsep)FREN✅ Fait
135Descellement additif couche-1-v3.5 : le duplicateur de descripteurs fermait, lui aussi, le descripteur neufFREN✅ Fait
136Descellement additif couche-1-v3.6 : air-json, le codec JSON possédé entre en couche 1FREN✅ Fait
137Identité machine stable comme principal de certificat : empreinte de la host key, CA-attestée, découplée du hostname/IPFREN✅ Fait
138Descellement additif couche-1-v3.7 : révocation par serial de certificat et interop du format KRL OpenSSH dans air-keystoreFREN✅ Fait
139Conception : authentification par certificat utilisateur sous privsep — le monitor vérifie, via un message RPC dédiéFREN✅ Fait
140Conception : émission de certificats + clé CA privée (descellement additif couche-1-v3.8) ; interop réel d’émissionFREN✅ Fait
141Registre de durcissement fast-follow post-clôture ADR-109FREN✅ Fait
142Versionnage lockstep des paquets livrables Air (une seule version de release)FREN✅ Fait
143Couverture CI par couche : ne mesurer/tester que les couches touchées ; couverture complète rareFREN✅ Fait
144Descellement couche 0 : fchmodat2 (durcissement anti-TOCTOU des perms des sockets streamlocal)FREN✅ Fait
145Documentation : un site, orientation par public ; Zola pour l’architecture, chaque langage à son outil natifFREN🔨 En cours
146Forwarding serveur en privsep par médiation du monitor (le worker confiné ne fait aucun syscall réseau ; le monitor ouvre les sockets et passe le fd)FREN✅ Fait
147Worker de session toujours confiné (cage sftp-worker) : le lancement de session (shell/exec) est médié par le monitor (option B) — le démux ne fait plus d’execveFREN🔨 En cours
148Isolation par namespaces (net/mnt, pid différé) des cages pré-auth et forward-only ; exige des additifs couche 0 (unshare/mount/pivot_root) + re-sceauFREN⏳ À faire
149Architecture de code : contrôleurs, managers de domaine, et contrat d’APIFREN🔨 En cours
150Manifeste, octroi et arbitrage de lancementFREN🔨 En cours
151Additifs couche 1 pour le lancement : passage explicite de descripteurs et masque de signauxFREN✅ Fait
152Outillage de l’architecture de code : déclaration role et gate check-controleursFREN✅ Fait
153Le programme de session est octroyé, pas hérité de la base des comptesFREN✅ Fait
154Le shell d’Air : un interprète interactif, pas un langage — et pas POSIXFREN⏳ À faire
155Le kernel d’Air se bâtit avec Clang/LLVM, et avec une seule chaîneFREN⏳ À faire
156air-sandbox cible l’ABI Landlock v7 : on expose tout ce que le noyau offreFREN⏳ À faire
157Le lanceur supervise ce qu’il trouve : plusieurs services, déclarés par leur bundleFREN🔨 En cours
158Versionnement des symboles des bibliothèques Air : voie A, mise en œuvre différée sous condition nomméeFREN🔨 En cours
159air-elf : un codec de couche 1, et le rôle codec qu’il inaugureFREN⏳ À faire
160La frontière variadique : écrire printf en Rust, et ne pas bâtir d’échafaudage CFREN⏳ À faire
161Dépendances, ordre et « prêt » dans air-launchd (temps 3b)FREN🔨 En cours
162Amorçage de l’autorité locale : la CA naît à l’installation, et l’utilisateur naît certifiéFREN⏳ À faire
163Les tests vivent dans un fichier à eux : ce que la métrique de couverture mesureFREN✅ Fait
164Les outils système qu’Air doit fournir : le catalogue, et la règle qui l’ouvreFREN⏳ À faire
165Les formats de fichiers système sont des codecs SANS I/O, 100 % couverts et fuzzésFREN🔨 En cours
166La libc Air rend ses échecs : on corrige les prototypes que POSIX a laissés muetsFREN⏳ À faire
167Descellement couche 1 : sleep/sleep_until quittent air-base-core pour AirThreadManagerFREN✅ Fait
168air-launchd remplace systemd : couverture fonctionnelle et jalons d’amorçageFREN⏳ À faire
169La dépendance de démarrage est un pouvoir octroyé — SEPTIÈME famille d’entitlements (le rang 6 est allé à io_uring, ADR-150 D19)FREN⏳ À faire
170La dépendance facultative : un axe, deux valeurs (prefers), jamais deux axesFREN⏳ À faire
171La chute d’une dépendance remet en attente, elle ne met pas à mortFREN⏳ À faire
172Un service système publie son nom — le sens fort de « prêt » n’a pas d’autre fondement observableFREN⏳ À faire
174Toute borne du lanceur porte son régime de justification ; les non fondées sont mesuréesFREN⏳ À faire
175Descellement additif couche-0-v1.17 : montage, namespaces et extinctionFREN⏳ À faire
176air-mount (couche 1) : les montages d’API, leur ordre et leur idempotenceFREN⏳ À faire
177La ligne de commande du noyau : un domaine borné, pas un parseur tolérantFREN⏳ À faire
178Le chargement de modules : la table d’alias est compilée, et le chargement est un serviceFREN⏳ À faire
179PID 1 est minimal et survit à son superviseur : récolte des orphelins, interdiction de paniqueFREN⏳ À faire
180Le répertoire personnel dans un plafond : le gabarit {home}FREN🔨 En cours
181La doctrine du bon citoyen : ce qu’on déclare, on l’obtient — ce qu’on tait, on ne l’a pasFREN♾️ Permanent
182L’identité de séparation de privilèges est résolue par le lanceur, pas lue par le serviceFREN⏳ À faire