Registre des ADRs d’Air
Document fondateur — Version 3.42 (2026-07-13 — ADR-093 couche transport SSH-2 d’air-sshd (phase 1 d’ADR-074, directive BDFL v1/v2 intégrée) : topologie de crates figée — cœur sans-IO air-ssh-proto ([ADR-091], invariant v1↔v2, réutilisé verbatim en v2) + pilote air-sshd scindé (pilote d’octets swappable SshByteStream sur air-async en v1 / stack « ssh » d’air-network en v2 ; couche service invariante) + facilité partagée air-service (trait ServiceHost). v1 lancé par systemd (socket-activation + sd_notify, a minima), v2 par air-launchd. air-sshd publie ses événements de session sur AirCom (pub-sub §7 + objet-service interrogeable list_sessions, inc.7) → air-com dépendance v1. Algos moderne only (curve25519-sha256/ssh-ed25519/chacha20-poly1305@openssh.com/aes256-gcm@openssh.com AEAD, pas de downgrade) ; crypto air-crypto ([ADR-034], aléa injecté) ; conf binaire air-config ([ADR-073], + conf par-utilisateur HomeDirectory en phase 2). Cible wire-compat OpenSSH. 2 ADR compagnons v2 (air-launchd ; stack « ssh » air-network). 4 incréments T.1–T.4. Précédent : ADR-092 air-async.)
Document fondateur — Version 3.41 (2026-07-11 — ADR-092 air-async : découpage réacteur/exécuteur : la runloop io_uring d’ADR-038 se scinde en réacteur air-uring (couche 1) + exécuteur air-async (couche 2) — contrainte check-layers (couche 2 ↛ couche 0) ; air-async remplace air-event (ADR-038 amendé) ; modèle owned-buffer déjà en couche 0 ; squelette prouvé host. Précédent : ADR-091 motif réseau sans-IO.)
Version 3.40 (2026-07-11 — ADR-091 motif réseau sans-IO obligatoire : rend normative la §2 de reseau-architecture-crates-fr.md — tout crate réseau maison = cœur pur sans-IO (anatomie canonique à 9 composants : Framer/Codec/StateMachine/Handshaker/Flow/Mux/Timer/Session/Ext, 8 purs, fuzzés/testés en isolation) + pilote I/O mince ; seul motif testant la pile indépendamment ; neutre sync/async, composable, zéro-C sauf exception TLS ADR-042. Précédent : ADR-090 binding couche 1→std.)
Version 3.39 (2026-07-11 — ADR-090 binding couche 1 dans std par rustc-dep-of-std : découplage plutôt que fork, sans descellement couche 0 (mesuré : build-config seul) ; discipline air-base-core jamais air-base-lib ; exceptions 80 % (icu4x/RustCrypto) hors fermeture std ; frontière no_std = relation à std ; industrialisation par vagues. Met en œuvre ADR-088. Précédent : ADR-089 réservation SecurityManager ; ADR-088 pivot std sur Air safe sans libc C ; jalon M5 [ADR-076/086/087] ; Managers [ADR-077].)
Rôle
ADR — Architecture Decision Record (enregistrement de décision d’architecture). Document court et daté qui consigne une décision structurante : son contexte, la décision prise, et ses conséquences. Les ADRs sont numérotés, immuables une fois acceptés (sauf RFC), et font autorité (cf.
CLAUDE.md).
Les ADRs (Architecture Decision Records) consignent les décisions structurantes prises pour Air. À partir de la version 2.0 du registre, chaque ADR vit dans son propre fichier afin de faciliter l’édition, la revue, et la future évolution via le mécanisme RFC public (cf. ADR-015). Ce document est l’index pointant vers ces fichiers.
Le registre se décompose en trois groupes :
- ADRs fondateurs (001 à 017) — instruits avant le démarrage de la phase 0. Constituent le socle architectural et organisationnel d’Air.
- ADR fondateur instruit en phase de design (018) — modèle d’imagerie, ajouté en phase pré-ouverture publique selon la politique d’édition directe.
- ADRs phase 0 (019 à 025) — instruits pendant les sessions de spécification de la couche 0, du runtime async, et de l’infrastructure (workflow dépendances, builds reproductibles). Acceptés et appliqués.
- ADRs post-phase 0 (à partir de 026) — instruits pour préciser les contrats structurants des couches hautes (couche 4
air-ui/air-tui, puis couche 5air-base), au-delà du périmètre phase 0.
Tous ces ADRs sont immuables après ouverture publique sauf erreur factuelle ou clarification mineure ; toute évolution structurante passera alors par un nouveau RFC amendant explicitement.
Index des ADRs
ADRs fondateurs et de design pré-phase 0
| N° | Titre | Catégorie | Fichier |
|---|---|---|---|
| 001 | IPC AirCom, refus de D-Bus comme transport principal | Architecture | ADR-001-aircom-fr.md |
| 002 | Modèle d’objet hybride asymétrique, C-ABI | Architecture | ADR-002-modele-objet-fr.md |
| 003 | Air compositeur Wayland | Architecture | ADR-003-compositeur-wayland-fr.md |
| 004 | Linux tier-1, FreeBSD/Windows tier-3 | Portabilité | ADR-004-linux-tier-1-fr.md |
| 005 | Intégration systemd, D-Bus optionnel | Architecture | ADR-005-systemd-fr.md |
| 006 | Profils air-base et air-desktop | Architecture | ADR-006-profils-fr.md |
| 007 | Compositeur de console air-console | Architecture | ADR-007-air-console-fr.md |
| 008 | Framework TUI air-tui trois backends | Architecture | ADR-008-air-tui-fr.md |
| 009 | Framework de vues air-view / air-ui / air-tui, API exclusivement déclarative | Architecture | ADR-009-framework-vues-fr.md |
| 010 | Format .airapp et .airservice, entitlements | Architecture | ADR-010-airapp-fr.md |
| 011 | Phasage bottom-up, premier livrable air-base 1.0 | Méthode | ADR-011-phasage-fr.md |
| 012 | Stratégie de versionnement et stabilité ABI | Méthode | ADR-012-versionnement-fr.md |
| 012-bis | Politique de télémétrie durcie | Politique | ADR-012-bis-telemetrie-fr.md |
| 013 | Distribution Modèle C → B, troisième voie qualitative | Distribution | ADR-013-distribution-fr.md |
| 014 | Catalogue de matériel « Air long-term » | Méthode | ADR-014-catalogue-materiel-fr.md |
| 015 | Licence MPL 2.0, DCO, gouvernance évolutive | Gouvernance | ADR-015-licence-gouvernance-fr.md |
| 016 | Internationalisation native, icu4x, Fluent | Architecture | ADR-016-i18n-fr.md |
| 017 | Accessibilité citoyen de première classe, WCAG 2.2 AA | Architecture | ADR-017-accessibilite-fr.md |
| 018 | Modèle d’imagerie : vectoriel pour mode graphique, cellulaire pour mode console | Architecture | ADR-018-modele-imagerie-fr.md |
ADRs phase 0 (sessions de spécification couche 0 et runtime async)
| N° | Titre | Catégorie | Fichier |
|---|---|---|---|
| 019 | Modèle d’erreurs hybride à deux niveaux | Architecture (couches 0/1) | ADR-019-modele-erreurs-fr.md |
| 020 | Stratégie signaux : signalfd par défaut, sigaction restreint | Architecture (couche 0) | ADR-020-strategie-signaux-fr.md |
| 021 | Conventions transverses de la couche 0 | Méthode | ADR-021-conventions-couche-0-fr.md |
| 022 | Architecture du module io_uring | Architecture (couche 0) | ADR-022-architecture-io-uring-fr.md |
| 023 | Runtime asynchrone Air construit sur io_uring | Architecture (couche 1) | ADR-023-runtime-air-fr.md |
| 024 | Workflow de gestion des dépendances | Méthode | ADR-024-workflow-dependances-fr.md |
| 025 | Stratégie de builds reproductibles | Méthode | ADR-025-builds-reproductibles-fr.md |
ADRs post-phase 0 (couches hautes)
| N° | Titre | Catégorie | Fichier |
|---|---|---|---|
| 026 | Contrat 1.0 d’air-tui : UI texte riche, cellulaire, capability-gated | Architecture (couche 4) | ADR-026-contrat-air-tui-fr.md |
| 027 | Stratégie de documentation polyglotte (ABI C et bindings multi-langages) | Documentation / Architecture (couche 2) | ADR-027-doc-polyglotte-fr.md |
| 028 | Soundness et téardown du module io_uring (S1 slab, S2 téardown, S3 sandbox) — complète ADR-022 | Architecture (couche 0) | ADR-028-soundness-io-uring-fr.md |
| 029 | Nommage de la surface publique : explicite, sans abréviation ; noms d’autorité conservés à l’interface | Méthode (transverse) | ADR-029-nommage-surface-publique-fr.md |
| 030 | Périmètre de la règle des 80 % : production vs test-only (companion ADR-024) | Méthode (gouvernance) | ADR-030-dependances-test-only-fr.md |
| 031 | Mesure de couverture en root sur les runners self-hosted (familles privilégiées : ebpf, uinput) | Méthode (gouvernance / CI) | ADR-031-couverture-root-ci-fr.md |
| 032 | Préservation des données confiées : zéro discard silencieux | Méthode (transverse) | ADR-032-zero-discard-donnees-fr.md |
| 033 | Modèle de configuration : source typée, compilation validée, artefact binaire | Architecture (transverse) | ADR-033-modele-configuration-fr.md |
| 034 | Discipline des dépendances cryptographiques (companion ADR-024) | Méthode (gouvernance) | ADR-034-discipline-dependances-crypto-fr.md |
| 035 | Taxonomie des exceptions de couverture (companion ADR-031) — amendée 2026-06-29 : +catégorie TARGET-ONLY (code sound seulement sur *-linux-air, validé par selftest, companion ADR-052) | Méthode (gouvernance / CI) | ADR-035-taxonomie-exceptions-couverture-fr.md |
| 036 | Filtrage par chemin de la re-vérification d’une couche scellée (companion ADR-031/035) | Méthode (gouvernance / CI) | ADR-036-filtrage-reverification-couche-scellee-fr.md |
| 037 | CI ARM seule (raspi-srv-2) + validation x86 par barrière pré-merge (companion ADR-031/036) | Méthode (gouvernance / CI) | ADR-037-ci-arm-x86-premerge-fr.md |
| 038 | Modèle d’exécution : runtime async natif io_uring (sans tokio), couches basses synchrones, pas d’epoll (amende ADR-023) | Architecture (couches 1/2) | ADR-038-modele-execution-async-io-uring-fr.md |
| 039 | Nommage & placement : runtime async air-runtime (L1), modèle d’objet air-object (L2), ordonnancement single-thread/thread-per-core (amende ADR-002, précise ADR-023/038) | Architecture / Nommage | ADR-039-nommage-runtime-objet-ordonnancement-fr.md |
| 040 | Format de l’artefact binaire de configuration : Cap’n Proto (companion ADR-033, cohérent ADR-001) | Architecture (air-config, L1) | ADR-040-format-artefact-config-capnproto-fr.md |
| 041 | Coexistence /etc : projection générée, lecture seule sélective, air-config seul écrivain (companion ADR-033) | Architecture (air-config L1 + intégration OS L5) | ADR-041-coexistence-etc-fr.md |
| 042 | Pile TLS : rustls + aws-lc-rs (exception C nommée, étroite), TLS 1.3, air-tls maison en contingence | Architecture (couche 2 / Sécurité) | ADR-042-pile-tls-rustls-awslc-fr.md |
| 043 | Pile SSH : OpenSSH système en incubation, air-ssh maison à terme (client avant serveur) | Architecture (couche 2 / Sécurité) | ADR-043-pile-ssh-fr.md |
| 044 | Extension couche 0 : famille poll (ppoll) pour l’attente synchrone bornée/interruptible (re-sceau couche-0-v1.5, RFC ADR-015) | Couche 0 (extension socle) | ADR-044-extension-couche-0-famille-poll-fr.md |
| 045 | Modèle d’erreurs de l’ABI C : AirStatus in-band, sans errno, panic = abort (companion ADR-019/027/012) | Architecture (ABI C / contrat) | ADR-045-modele-erreurs-abi-c-fr.md |
| 046 | La libc Air (Rust pur) : périmètre (~25-30 familles, cible OpenSSH), layering couche-1-only impératif, POSIX = objectif non conformité, doctrine d’exécution par provenance | Architecture (libc / fondateur) | ADR-046-libc-air-fr.md |
| 047 | Principes de construction de la libc Air : gabarit par famille, regard sécurité (4 modes de défaillance), sœurs SAFE air_*, errno thread-local (companion ADR-046) | Méthode (libc) | ADR-047-principes-construction-libc-fr.md |
| 048 | Descellement unique de la couche 0 : std-free certifié (#![no_std]) + famille futex(2) + types FD natifs + clone3 spawn de thread (re-sceau couche-0-v1.6, RFC ADR-015) | Couche 0 (descellement / re-sceau) | ADR-048-descellement-couche0-std-free-futex-fr.md |
| 049 | Runtime Air : TCB/TLS/démarrage (crt0), errno-in-TCB, environ, spawn std-free — fondation *-linux-air (option (a) : cible complète, programme cohérent) | Architecture (runtime / fondateur) | ADR-049-runtime-tcb-tls-fr.md |
| 050 | Spécification de la cible *-linux-air (phase 1) : triple env=air, llvm-target musl découplé, statique panic=abort, dév. hors-arbre (build-std/nightly, carve-out ADR-030), squelette air-rt (companion ADR-049) | Architecture (toolchain / cible) | ADR-050-cible-linux-air-spec-fr.md |
| 051 | Descellement couche-0-v1.7 : 7 syscalls pour le runtime et la libc — arch_prctl (SET_FS/GET_FS, x86_64, nouvelle famille arch) + set_tid_address/getcwd/umask/getppid/sched_yield/getrusage (RFC ADR-015 ; companion ADR-049/046) | Couche 0 (descellement / re-sceau) | ADR-051-descellement-couche0-v1.7-libc-fr.md |
| 052 | air-rt est un objet couche 1 (AirRuntime), jamais un consommateur direct de la couche 0 — briques couche 1 ThreadControlBlock/ThreadLocalStorage/relocation ; corrige ADR-049 D8 (« reposant sur couche 0 ») et reformule le cadrage « affaire d’air-rt » d’ADR-051 (RFC ADR-015) | Architecture (layering / fondateur) | ADR-052-air-rt-objet-couche1-fr.md |
| 053 | La libc Air s’appuie sur icu4x pour ctype/locale/i18n (caractères, casse, collation, normalisation, segmentation, calendriers) — i18n correcte par défaut, BCP-47, écarts POSIX documentés ; précise ADR-046 D7 (« libm exclu v1 » et « hors wide-char lourd » → OBSOLÈTES : libm requis, le wcs* i18n EST la surface icu4x) ; companion ADR-016 (RFC ADR-015) | Architecture (libc / i18n) | ADR-053-libc-sur-icu4x-fr.md |
| 054 | Scission d’air-base-lib : un cœur air-base-core sans i18n (erreurs/id/chemins-octets/temps-monotone/encodages/log) extrait pour débloquer la fermeture runtime *-linux-air (l’i18n d’icu4x tirait std) — air-base-lib garde l’i18n et ré-exporte le cœur (compat) ; runtime (air-memory/air-thread/air-process) bascule sur air-base-core ; air-process::Command passe args/env en octets (AirPath) ; rectifie l’en-tête erroné « icu sans std » ; companion ADR-052/053 (RFC ADR-015) | Architecture (layering / fondateur) | ADR-054-air-base-core-scission-i18n-fr.md |
| 055 | air-thread/air-process passent #![no_std] (2ᵉ mur de la fermeture runtime *-linux-air après ADR-054) : nouvelle crate air-env (couche 1, no_std, sans dépendance) porte l’environnement (set_environ/get/vars, octets) sous air-runtime ET air-process ⇒ cycle évité (air-runtime::env ré-exporte, air-process::build_envp lit air_env) ; air-process → core/alloc::ffi, plus de std::env/std::os::unix ; le spawn ergonomique std::thread d’air-thread (thread.rs) est gardé #[cfg(not(target_env="air"))] (hôte seulement — sound sous glibc ; le spawn Air-natif relève d’air-runtime + allocateur, différé) ; portée compile ≠ run (allocateur AbortOnAlloc) ; companion ADR-048/052/054 (RFC ADR-015) | Architecture (layering / no_std) | ADR-055-nostd-thread-process-air-env-fr.md |
| 056 | Allocateur global air-alloc (couche 1, #![no_std]) : inspiré de dlmalloc, simple, possédé — ni vendoring boîte-noire ni réinvention ; étiquettes de frontière + fusion O(1), smallbins + table de bits, liste triée des grands blocs (pas de treemap), dv/top, segments 64 Kio + cartographie dédiée ≥ 256 Kio ; verrou futex maison (pas AirMutex), GlobalAllocator, gardien post-fork ; remplace AbortOnAlloc, maillon de la libc Air ; companion ADR-049/052/046/047 (RFC ADR-015) | Architecture (couche 1, fondateur) | ADR-056-allocateur-air-alloc-fr.md |
| 057 | libm Air (air-libm, couche 1, #![no_std]) : vendoring de libm (rust-lang) en exception nommée (ADR-024, modèle icu4x) — math flottante no_std (le seul primitif système manquant, audit icu4x §3/§8 : calendrical_calculations + LSTM segmenter) ; crate qui ré-exporte la surface de libm (pur Rust, zéro dép transitive, fusionné dans compiler-builtins, qualité std) ; aucun consommateur encore (fondation libc/i18n) ; companion ADR-053/ADR-024/ADR-016 (RFC ADR-015) | Architecture (couche 1, fondateur) | ADR-057-libm-air-fr.md |
| 058 | loom — activation du modèle de concurrence (outil de vérification test-only, tiré sous --cfg loom seulement, jamais livré, ADR-030) : sous loom, exploration exhaustive des entrelacements pour prouver la SÛRETÉ (exclusion mutuelle) des primitives futex ; 1ᵉʳ modèle = AirMutex d’air-thread (protocole 3-états) via alias d’atomique core/loom + shim futex (yield/no-op) ; tests réguliers gardés cfg(all(test, not(loom))). Pas une exception 80 % (comme proptest). Garde-fou : loom prouve la sûreté, pas la vivacité (réveil futex validé on-target). Attaque la variance de couverture (#189) ; companion ADR-030/021/031 (RFC ADR-015) | Outillage de vérification (test-only) | ADR-058-loom-modele-concurrence-fr.md |
| 059 | Stratégie i18n — Option V : Air UTILISE icu4x (pas de réimplémentation du socle). Vérification empirique (2026-07-01) : la fermeture icu4x compile pour *-linux-air (--release + default-features = false ; LSTM inclus ; libm OK) — deux conditions triviales (feature std par défaut évitée ; repli logging debug-only d’icu_provider inactif en release). ⇒ réécrire le socle (~15 crates ULP-correctes) est inutile. Air utilise icu4x (extension exception ADR-016), possède l’API air-string dual-face + le pipeline de données ; réécriture réservée par composant si besoin doctrinal. Rétrécit la roadmap §2.A en chantier no_std (air-base-lib #![no_std] + default-features=false). Companion ADR-053 (affirmé)/016/024/050 (RFC ADR-015) | Architecture (couche 1, i18n) | ADR-059-i18n-strategie-option-v-icu4x-fr.md |
| 060 | Descellement couche-0-vX : famille termios/tty (comme ADR-051). Clore la libc exige termios (POSIX-1988, terminal-agnostique) + isatty (pour stdio) — absents du socle scellé. Ajoute toute la famille en fonctions dédiées typées (jamais d’ioctl générique, ADR-021 conv. 3), module air-sys-syscall/src/terminal.rs sur le type Termios (air-sys-types, #[repr(C)], x86/arm identiques) : attributs (tcgetattr/tcsetattr), contrôle-ligne (tcdrain/tcflush/tcflow/tcsendbreak), winsize (TIOCGWINSZ/S), PTY (/dev/ptmx+TIOCGPTN/TIOCSPTLCK/TIOCGPTPEER), session/job-control (tc[gs]etpgrp/TIOCSCTTY/TIOCNOTTY/TIOCGSID). Option<T>, EINTR remonté, RAII FD, 100 % couv. isatty/ttyname restent couche 1. Re-sceau à l’atterrissage. Companion ADR-051/021/046/047, prépare ADR-061 (RFC ADR-015) | Couche 0 (extension / re-sceau) | ADR-060-descellement-couche0-termios-tty-fr.md |
| 069 | Registre de handles fd-général (couche 1, air-handle) + moteur socket : registre process-global unique (clé = vrai fd kernel) qui possède l’OwnedFd (RAII central → détection de fuites/double-close) ; points de passage uniques create/duplicate/close/set_fd/set_status ; duplicateur unique (alias = description partagée refcomptée + éviction-sur-silent-close) résolvant la cohérence dup2/fcntl ; tous les objets fd de couche 1 re-domiciliés (API préservée) ; AirSocketEngine = couche de politique (couture de sécurité réseau + résolveur réutilisé) au-dessus ; une impl, deux façades (PAL Rust + libc C) ⇒ vue unique Rust/C dans un même process. Déclenché par M4 réseau ; descellement additif couche 1. Companion ADR-065/068/046/047 (RFC ADR-015) | Architecture (couche 1, fondateur / libc) | ADR-069-registre-handles-fd-moteur-socket-fr.md |
| 084 | Ratification air-url : couche 4 élargie (« frameworks développeur : UI + fondation ») + nom air-url. Tranche les deux points laissés ouverts par la spec air-url/la note api-reseau-strategie. air-url (≈ URLSession : sessions/tâches/cache/cookies/WebSocket sur air-http) est une commodité applicative de fondation, pas un mécanisme système — comme URLSession vit dans Foundation (≠ socle réseau). Décision : couche 4, dont le périmètre passe de « UI seulement » (air-ui/air-tui) à « UI + fondation » (amende la macro-archi) ; nom air-url (descriptif, vocabulaire Air, jamais « URLSession » ; alternatives air-web/air-fetch révisables sans rouvrir la couche). Alternative « haut de couche 2 » rejetée (mélange confort applicatif / frameworks système). Ratification BDFL. Companion note api-reseau-strategie, ADR-009/008 (RFC ADR-015) | Architecture (couche/nommage) / amendement macro-archi | ADR-084-ratification-air-url-couche4-elargie-fr.md |
| 087 | syscall générique (raw_syscall) : escape hatch TEMPORAIRE pour le pal std (M5, Lot D) — À RETIRER — Accepté (ratification BDFL 2026-07-09), explicitement temporaire. Dernier symbole indéfini de M5 = syscall : la libc DOIT fournir long syscall(long, ...) car le pal unix de std l’appelle EN DIRECT pour futex (aucune fonction libc n’a jamais existé ; base Mutex/Condvar/park) et gettid (pas de wrapper avant glibc 2.30). syscall(2) = trappe non typée par nature (numéro + 6 mots bruts). Décision BDFL : l’implémenter « comme std l’attend » = additif couche 0 raw_syscall (asm syscall/svc 0 brut, 2 arches) + shim libc air-libc-capi::syscall cible-only qui le binde EN DIRECT (convention __syscall_ret). ENTORSE ASSUMÉE à ADR-021 conv.3 (pas de générique) + « libc binde couche 1 jamais couche 0 » → EXCEPTION consignée (EXCEPTIONS.md). STATUT TEMPORAIRE : le BDFL refuse cet appel générique permanent → ACTION ITEM AMONT équipe Rust (pal std sans syscall générique sur *-linux-air → router futex/gettid typés) → raw_syscall + shim disparaissent. Périmètre M5 quasi nul (futex jamais appelé mono-thread). Alternatives rejetées : router numéros (fragile flags futex), ENOSYS partout (ne prépare pas OpenSSH). Re-sceau couche-0-v1.12 (délégation ADR-065). Companion ADR-076/021/077 (RFC ADR-015) | Additif couche 0 + exception (à retirer) | ADR-087-syscall-escape-hatch-a-retirer-fr.md |
| 086 | Introspection thread cible pour la face libc : TLS dynamique, bornes de pile, auxv (M5, Lot C) — Accepté (ratification BDFL 2026-07-09). Additif couche 1 débloquant 7 symboles std indéfinis sur la cible (pthread_key_create/key_delete/setspecific, pthread_self, pthread_getattr_np/attr_getstack/attr_getguardsize), gardés jusque-là #[cfg(not(target_vendor="air"))] (hôte, sur std), version cible « REMONTÉE » (ADR-055 D3). Additifs : AirProcessManager::resource_limit (binde prlimit couche 0) + module air-runtime::process_context (capture au bootstrap de l’auxv + bornes de pile principale via RLIMIT_STACK ; expose auxval=socle getauxval et main_thread_stack=socle détection de pile — fusionne l’ex-Lot E getauxval). TLS dynamique per-thread = #[thread_local] natif (modèle errno cible), PAS un slot TCB (rejeté : sur aarch64 Variant I les champs TCB ≥ 0x10 recouvrent le TLS). pthread_self=current_tid (zéro additif). Bornes approximatives assumées (std raffine via /proc/self/maps). Threads spawnés (destructeurs TLS à la sortie, pile per-thread) câblés mais validation différée (mono-thread hello-std, spawn aarch64 buggé). Re-sceau couche-1-v1.9 DIFFÉRÉ en fin de Lot C. Délégation additive (ADR-065). Companion ADR-076/077/052/055 (RFC ADR-015) | Additif couche 1 (neutre) | ADR-086-introspection-thread-cible-libc-fr.md |
| 085 | Descellement additif couche 0 CUMULÉ pour la face libc (chantier B — std+OpenSSH) — Accepté (ratification BDFL 2026-07-08, périmètre implémenté, re-sceau couche-0-v1.11 posé). Cumule en un ADR tout le manque couche 0 restant (directive BDFL : un ADR / un descellement / une production / un re-sceau), au lieu de descellements par-symbole (ADR-070/071). Additifs (conventions ADR-021, Result/Option/BorrowedFd/EINTR) : munmap_raw(addr,len) (mémoire — le C libère par addr/len, pas par l’objet RAII Mapping) ; fchmod/fchown/futimens (par fd) ; chroot ; sched_getaffinity/sched_setaffinity (CpuSet typé) ; pause (portable 2 arches, rt_sigsuspend aarch64) ; sigaltstack (AltStack typé, requis par std) ; sendfile. ioctl = dispatcher LIBC (route les request connus vers les ops typées, TIOCGWINSZ→termios/FIONBIO→fcntl ; inconnu→ENOTTY) — pas de couche-0 générique (ADR-021 conv. 3 préservé). Hors périmètre = couche 1 (descellée) : getauxval (auxv, TARGET-ONLY), sysconf, strerror_r, __tls_get_addr. Débloque le lot mémoire libc (critique pour lier std). Re-sceau couche-0-v1.11 DIFFÉRÉ jusqu’à impl complète 2 arches. Companion ADR-051/070/071/060/076/077 (RFC ADR-015) | Descellement additif couche 0 (cumulé) | ADR-085-descellement-couche0-cumule-libc-std-fr.md |
| 083 | Additifs couche 0 pour la plomberie réseau : TUN (TUNSETIFF) + adjtimex/clock_adjtime — descellement additif couche-0-v1.x. Vérification faite : la plupart des « additifs couche 0 » flagués par la plomberie existent déjà — clock_settime (step) présent, SocketType::Raw + socket générique (ICMPv6 brut) présents, sockopt entier (SO_BROADCAST) présent (ADR-071). Seuls deux manquent : adjtimex (slew, discipline fine que NTP préfère au step) et TUN (/dev/net/tun + TUNSETIFF, ioctl dédié typé ADR-021 conv. 3, pour WireGuard). Types #[repr(C)] 2 arches, Option<T>, EINTR remonté, RAII FD ; privilèges (CAP_SYS_TIME/CAP_NET_ADMIN) appliqués par le kernel. ICMPv6/SO_BROADCAST = wrappers couche 1 (air-socket), pas couche 0. Corrige air-dhcp/air-ntp/air-wireguard. Délégation additive neutre (ADR-065). Companion ADR-060/070/071 (RFC ADR-015) | Additif couche 0 (neutre) | ADR-083-additifs-couche0-tun-adjtimex-fr.md |
| 082 | Additifs crypto : AEAD à nonce explicite (record/packet) + BLAKE2s (WireGuard) + PBKDF2 (SASL/SCRAM) — descellement additif couche-1-v1.x, complète ADR-078/081. Point important : la façade AirAead v1 génère un nonce aléatoire interne, or toutes les piles de session (TLS record RFC 8446 §5.3, QUIC packet RFC 9001 §5.3, WireGuard, SSH aes-gcm) protègent avec un nonce déterministe IV⊕compteur, non préfixé → ajout de lowlevel::AirAeadExplicitNonce (backends aes-gcm/chacha20poly1305 déjà présents ; opt-in expert-only, contrat d’unicité de nonce ; façade à nonce géré reste le défaut). blake2 (BLAKE2s hash/MAC/HMAC, WireGuard Noise — pur Rust zéro-C ≠ blake3-tire-cc) + pbkdf2 (SCRAM-SHA-256, air-mail). Correction rétroactive : air-tls/air-quic/air-ssh/air-wireguard notent l’usage de l’AEAD à nonce explicite. Pur Rust, zéro-C. Ratification BDFL (surface crypto). KAT-gated (ADR-034). Companion ADR-078/081/034 (RFC ADR-015) | Descellement additif couche 1 / Sécurité | ADR-082-additifs-crypto-wireguard-mail-aead-nonce-fr.md |
| 081 | Additifs crypto air-quic/air-ssh : primitives bas niveau + RSA PKCS#1 v1.5 vérif. — descellement additif couche-1-v1.x, complète ADR-078. Révélés par air-quic (header protection RFC 9001 §5.4 = bloc AES brut + keystream ChaCha20, sous la couche AEAD) et air-ssh (rsa-sha2 = RSASSA-PKCS#1 v1.5 vérif., ≠ le PSS d’ADR-078 ; chacha20-poly1305@openssh = ChaCha20 + Poly1305 séparés). Décision : module air_crypto::lowlevel (bloc AES single-block, ChaCha20 keystream, Poly1305 one-shot — opt-in expert-only, façade AEAD reste le défaut ; crates aes/chacha20/poly1305 déjà transitives → promues directes) + AirRsaPkcs1VerifyingKey (vérif. seule, hors Marvin). Kex PQ SSH = ML-KEM-768 réutilisé (mlkem768x25519, ADR-078) ; sntrup761 différé. Construction (header protection/SSH-AEAD) reste en couche 2, pas dans air-crypto. Pur Rust, zéro-C. Ratification BDFL requise (surface crypto, hors délégation ADR-065). KAT-gated (ADR-034). Companion ADR-078/034/042/043 (RFC ADR-015) | Descellement additif couche 1 / Sécurité | ADR-081-additifs-crypto-quic-ssh-fr.md |
| 080 | Additifs air-socket : multicast UDP typé + codec DNS étendu (SRV/TXT/PTR) — descellement additif couche-1-v1.x + couche-0-v1.12 (setsockopt structuré). Révélé par air-mdns (L2) : mDNS exige (1) joindre un groupe multicast = setsockopt(IP_ADD_MEMBERSHIP, ip_mreq) — option à structure, hors du sockopt entier d’ADR-071 (limitation D-M4.1) → additif couche 0 setsockopt_bytes (aucun nouveau syscall) ; (2) le codec DNS (noms compressés bornés + SRV/TXT/PTR) — promu public sans-IO plutôt que dupliqué dans air-mdns (surface hostile décodée une fois, règle 80 %). Fonctions multicast dédiées typées (ADR-021 conv. 3). Zéro-C. Délégation additive neutre (ADR-065). Companion ADR-070/071/062 (RFC ADR-015) | Additifs couche 1 + couche 0 (neutres) | ADR-080-additifs-air-socket-multicast-dns-fr.md |
| 079 | air-netlink (couche 1) : transport netlink générique + descellement additif couche-0-v1.11 (AF_NETLINK/sockaddr_nl). Décision BDFL — option B, couche 1. Le path-monitor d’air-network (L2) exige rtnetlink (plan de contrôle : liens/adresses/routes). Deux options analysées : (A) étendre air-device — rejetée (conflate uevent-broadcast-texte vs rtnetlink-TLV, descellement lourd, disperse un transport multi-consommateurs) ; (B) crate air-netlink dédiée — responsabilité unique, transport réutilisable (path-monitor, WireGuard, DHCP, air-config routes, wifi nl80211), TLV hostile fuzzé une fois, patron sans-IO. Placée couche 1 (pair d’air-socket, révise la mention « L2 » d’air-socket). Additif couche 0 modéré : SocketDomain::Netlink=16 + SocketAddrNetlink (syscalls socket/bind/sendmsg/recvmsg génériques déjà présents → aucun nouveau syscall). air-device inchangé (migration future possible). Companion ADR-069/051/070/071 (RFC ADR-015) | Nouvelle crate couche 1 + descellement couche 0 | ADR-079-air-netlink-couche1-fr.md |
| 078 | Descellement additif couche-1-v1.7 : additifs crypto pour air-tls (AES-128-GCM, ECDSA/ECDH P-256/P-384, RSA-PSS vérif. seule, ML-KEM-768 hybride). Révélé par la contingence air-tls maison (ADR-042 §Contingence) + l’audit s2n-tls : le cœur v1 d’air-crypto (Ed25519/X25519/AES-256/ChaCha20) ne valide pas le WebPKI réel. Ajoute 5 primitives (crates p256/p384/rsa/ml-kem + variante aes-gcm), purement additives, pur Rust, zéro-C, KAT-gated (ADR-034). Sécurité gravée : RSA vérif. seule (aucune op. privée → hors Marvin RUSTSEC-2023-0071), ECDSA RFC 6979, ML-KEM hybride only. Hors délégation additive automatique (ADR-065) : surface crypto ⇒ ratification BDFL requise avant tag. Companion ADR-042/034/062/065 (RFC ADR-015) | Descellement additif couche 1 / Sécurité | ADR-078-descellement-couche1-v1.7-crypto-air-tls-fr.md |
| 061 | Architecture AirTerminal (vision) : objet couche 1 = tag (Legacy/Air) + codec + modèle canonique interne (lingua franca). Les codecs (ansi/termios, kitty, air-codec-1) traduisent tous ce modèle → nouveau terminal = un codec de plus, jamais une refonte ; codec legacy = adaptateur dégradant. Discipline unique « Annoncer → Sélectionner → dégrader-sur-inconnu » (registre à IDs stables + #[non_exhaustive] + variante Unknown + schéma capnp ADR-040). TermIn = enum 2 étages extensible ; AttachSurface (énumérer→sélectionner→lier) = la clé « vraie surface Air via compositeur » au lieu de smuggler du graphique en séquences ; termios = affaire du codec legacy seul, chemin natif termios-free ; passerelle legacy↔natif = composer 2 codecs. Vision, zéro impl. au-delà du trait : le sceau couche 1 n’exige que termios (L0) + mince air-terminal (L1, codec ansi) ; codecs riches/air-codec-1/AttachSurface = couche 2 différés. termcap hors libc (ncurses/L2, xterm-only). Companion ADR-060/046/001/003/007/008/040 (RFC ADR-015) | Architecture (vision terminal, couche 1→2) | ADR-061-architecture-air-terminal-fr.md |
| 062 | Sceau couche-1-v1.0 : gel de l’API Rust publique de la couche 1 (17 crates). Campagne de clôture (4 P0 AirFile/air-poll/termios-PTY/air-signal + remodel os_str env/args) ; évolution ultérieure par descellement additif v1.x uniquement (RFC). Companion ADR-051/054/055/063/064 (RFC ADR-015) | Sceau (couche 1) | ADR-062-sceau-couche-1-fr.md |
| 063 | Instrumentation IO couche 1 (debug) : registre de handles & cohérence post-fork, LIB_AIR_DEBUG (fd non fermés, doubles-close). Doctrine gravée au sceau ; implémentation en additif v1.x. Companion ADR-069/062 (RFC ADR-015) | Doctrine (couche 1) | ADR-063-instrumentation-io-couche-1-fr.md |
| 064 | Doctrine des signaux couche 1 : signalfd primaire ; les 4 fautes → disposition par défaut (zéro unsafe exposé) ; §7 barrière de poison / fault_state(). Companion ADR-020/066 (RFC ADR-015) | Doctrine (couche 1) | ADR-064-signaux-doctrine-couche-1-fr.md |
| 065 | Descellement additif couche-1-v1.1 + délégation de re-sceau : AirRuntime::errno_location (socle de __errno_location de la libc) ; instaure la délégation (le superviseur pose les tags de re-sceau additifs neutres sans rouvrir l’ADR-062). Companion ADR-062 (RFC ADR-015) | Descellement additif couche 1 / gouvernance | ADR-065-descellement-couche1-v1.1-fr.md |
| 066 | Descellement additif couche 0 : rt_sigaction non-faute (async réel) + trampoline rt_sigreturn (x86_64) + rt_sigpending. Fondation de l’install de handler async pour les signaux non-faute ; les 4 fautes restent inertes (ADR-064). Companion ADR-020/064 (RFC ADR-015) | Descellement additif couche 0 | ADR-066-descellement-couche0-sigaction-async-fr.md |
| 067 | air-account (couche 1) : codecs des comptes /etc/passwd + /etc/shadow + /etc/group, brique bindée par la libc (getpwnam_r/getgrnam_r/getspnam_r…). Une impl Rust, deux faces (libc + réutilisable Rust). Companion ADR-046/068 (RFC ADR-015) | Nouvelle crate couche 1 / libc | ADR-067-air-account-couche1-fr.md |
| 068 | Surface fine credentials (uid/gid) en couche 1 (air-process) : getuid/setuid/setresuid/setgroups/initgroups + convenance drop_to_user (résolveur AirPrivilegeDrop) ; sémantique POSIX setuid ratifiée. Bindée par la libc. Companion ADR-067 (RFC ADR-015) | Descellement additif couche 1 / libc | ADR-068-credentials-couche1-fr.md |
| 070 | Descellement additif couche 0 : codec sockaddr public pour la face libc (inet_pton/inet_ntop, sockaddr_in/in6/un, byteorder). Companion ADR-069/071 (RFC ADR-015) | Descellement additif couche 0 | ADR-070-descellement-couche0-sockaddr-libc-fr.md |
| 071 | Descellement additif couche 0 : setsockopt/getsockopt entiers publics pour la face libc (limitation D-M4.1 sur les options à structure → levée par ADR-080 setsockopt_bytes). Companion ADR-069/070/080 (RFC ADR-015) | Descellement additif couche 0 | ADR-071-descellement-couche0-sockopt-libc-fr.md |
| 072 | CI : x86_64 runner primaire + aarch64 en cross-check (compile, chaque PR) + aarch64-natif sur main/hebdo (révise ADR-037) → PR ~3-7 min au lieu de ~30. Companion ADR-031/037 (RFC ADR-015) | Infrastructure / CI | ADR-072-ci-x86-primaire-aarch64-crosscheck-fr.md |
| 073 | Doctrine de configuration binaire : confs Air binaires (pas de texte clair), CLI exigeant le mot de passe administrateur, sérialiseur/désérialiseur pour la compat. Modèle de menace = attaquant avec shell/sudo modifiant une conf texte. Companion ADR-033/040 (RFC ADR-015) | Doctrine (sécurité / configuration) | ADR-073-configuration-binaire-doctrine-fr.md |
| 074 | Vision air-sshd : démon SSH natif async io_uring, wire-compat OpenSSH, conf binaire, profil crypto moderne — la vraie cible produit (OpenSSH-compile n’était qu’une fonction de forçage de la libc/couche 1). air-crypto couvre déjà le profil SSH moderne. Companion ADR-043/073/076 (RFC ADR-015) | Architecture (vision / cible produit) | ADR-074-air-sshd-vision-fr.md |
| 075 | Fourniture du PAL : std::sys::pal::air fourni via rust-src patché + build-std, upstream Tier-3 visé à terme. Companion ADR-050/076 (RFC ADR-015) | Architecture (toolchain / PAL) | ADR-075-fourniture-pal-rust-src-patche-fr.md |
| 076 | std natif sur la libc d’Air : cible env=musl + vendor=air (chantier B, option A) — std réutilise le pal unix et lie libair en direct (zéro glibc, mais pas zéro libc : la nôtre). LA recette du jalon M5. Companion ADR-050/075/077 (RFC ADR-015) | Architecture (toolchain / PAL) | ADR-076-std-sur-air-libc-env-musl-fr.md |
| 077 | Managers de domaine couche 1 : surface objet médiatrice (AirFileManager/AirProcessManager/AirNetworkManager/AirSystemManager/AirSignalManager/AirEnvironmentManager/AirMemoryManager) consommée par les toits libc et PAL — jamais la couche 0 en direct (ADR-052). Companion ADR-069/052/046 (RFC ADR-015) | Architecture (couche 1 / toits) | ADR-077-managers-domaine-couche1-fr.md |
| 089 | Réservation du SecurityManager : sécurité active per-process (couche 1). ADR de réservation (moteur = ADR ultérieur). Air secure-first : les Managers sensibles consultent un SecurityManager avant une op sensible → Allow/Deny + log de la raison (ex. flood connexions → règle eBPF drop ; fork-bomb/huge-alloc → refus). PAS un daemon (goulot) : per-process, embarqué par libair, sollicité par les autres Managers ; décision locale, enforcement via kernel partagé (eBPF/cgroups/seccomp/Landlock) ; règles depuis la config binaire (ADR-073). Seam posé maintenant (interface + défaut permissif allow-all+log, câblé au fil de l’eau) ; moteur (règles/détection/rate-limiting) différé, aligné air-sshd. Companion ADR-032/077/073/074/088 (RFC ADR-015) | Architecture (sécurité, couche 1) — réservation | ADR-089-reservation-security-manager-fr.md |
| 088 | std Rust sur Air safe : PAL custom sur la couche 1, sans libc C. Amende ADR-076 (abandonne l’option A « std sur la libc C libair_c » comme état-cible) : std repose sur un PAL Air custom et safe (std::sys::pal::air + modules sys/<domaine>/air.rs) bindant les Managers couche 1 en Rust safe, zéro FFI — Air serait le premier backend std safe de bout en bout (l’unsafe confiné couche 0). Cible target_os="air" (Air reste Linux ; hermit/xous = précédents structurels non-Linux, pas un clone ; revient sur env="musl"). libair_c survit mais découplée de std (libc pour devs C, Linux-conforme). AirTaskManager (task + AirThreadGroup/tgid, fidèle au kernel, produit process/thread) remplace AirProcessManager (raffine ADR-077). Résorbe raw_syscall (ADR-087) + traite la dette GlobalAlloc-safe. Prototypage host-first (rust-src patché + build-std) ; RFC amont Tier-3 après preuve. Instruit par la note etude-std-pal-air-safe-fr.md. Companion ADR-050/075/076/077/087/046 (RFC ADR-015) | Décision de toolchain (toit std) + raffinement Manager couche 1 | ADR-088-std-pal-safe-couche1-sans-c-fr.md |
| 093 | Couche transport SSH-2 d’air-sshd : cœur sans-IO air-ssh-proto, topologie de crates v1/v2, algorithmes modernes, wire-compat OpenSSH. Instruit la phase 1 d’ADR-074 selon ADR-091 ; intègre la directive BDFL v1/v2. Topologie (fige tout air-sshd) : air-ssh-proto (couche 2, cœur PUR no_std+alloc, #![forbid(unsafe_code)], zéro fd/I/O — Framer [RFC 4253 §6]/Codec SSH_MSG_*/StateMachine transport+rekey/Handshaker/Timer ; Flow/Mux/Session réservés P3 ; invariant, réutilisé verbatim en v2) + air-sshd scindé : pilote d’octets swappable (trait SshByteStream, v1 air-async/air-socket, v2 stack « ssh » d’air-network enveloppant le même cœur) + couche service invariante (SessionRegistry, publication AirCom, air-config, hôte de service) + air-service (trait ServiceHost réutilisable, v1 systemd socket-activation+sd_notify a minima / v2 air-launchd). Observabilité (directive BDFL) : air-sshd publie les événements de session sur AirCom (pub-sub §7 : ConnectionRequested/Kex*/Auth*/SessionOpened/Closed) + objet-service interrogeable (list_sessions/session_info via call, inc.7) → air-com = dépendance v1 (supersede ADR-074 §4.3). Algos MODERNE uniquement (pas de downgrade) : curve25519-sha256 [RFC 8731], ssh-ed25519 [RFC 8709], AEAD chacha20-poly1305@openssh.com/aes256-gcm@openssh.com, compression none. Frontière crypto : cœur→air-crypto (2→1) mais aléa injecté (SshRng) → fuzzing déterministe. Conf binaire air-config (existe ; + conf par-utilisateur HomeDirectory en P2, ADR-073). Cible : un vrai client ssh OpenSSH traverse le transport. 4 incréments T.1 (3 crates+seams+schéma events+identification+Framer+fuzz) → T.2 (KEXINIT+négo+event) → T.3 (KEX X25519+H+sig Ed25519+dérivation) → T.4 (NEWKEYS+chiffré+rekey+wire-compat). 2 ADR compagnons v2 : air-launchd ; stack « ssh » air-network. Companion ADR-074/091/092/034/069/073/001/005/033/040 (RFC ADR-015) | Architecture (couche 2, premier service réseau) | ADR-093-air-sshd-transport-ssh2-fr.md |
| 092 | air-async : découpage réacteur (couche 1) / exécuteur (couche 2) de la runloop io_uring. Raffine et renomme ADR-038. Le runtime async, placé « couche 2 » par ADR-038 sous le nom air-event, se scinde (contrainte check-layers : couche 2 ↛ couche 0, car io_uring est couche 0) : air-uring (couche 1) = réacteur, rempart safe sur io_uring (comme air-poll/ppoll), possède tous les types io_uring + mappe token→Waker ; air-async (couche 2) = exécuteur (futures/block_on/timers), le pilote I/O async du motif sans-IO (ADR-091), zéro type io_uring nommé. air-async remplace air-event (ADR-038 amendé). Modèle owned-buffer déjà en couche 0 (rien à réinventer) ; v1 mono-thread, 1 CQE→1 Waker, timers IORING_OP_TIMEOUT. Squelette prouvé host (block_on(timeout) traverse L2→L1→L0→CQE→Ready), check-layers vert. Questions ouvertes : annulation-au-drop, token→tâche O(1), spawn, éveil inter-thread. Companion ADR-038/091/022/028/044 (RFC ADR-015) | Architecture (couche 2 / couche 1 — la runloop) | ADR-092-air-async-decoupage-reacteur-executeur-fr.md |
| 091 | Motif d’architecture réseau sans-IO : anatomie canonique à 9 composants, OBLIGATOIRE. Rend normative la §2 de la note reseau-architecture-crates-fr.md. Tout crate réseau maison = cœur sans-IO pur (machine à états octets → événements + octets, zéro socket/async/horloge/alloc cachée) + pilote I/O mince (seul à toucher air-socket/air-runtime). Anatomie uniforme à 9 composants (Framer/Codec/StateMachine/Handshaker/Flow Controller/Multiplexer/Timer Manager/Session Context/Extension hooks — 8 purs) : « on sait toujours où regarder », chaque composant testable en isolation ; composant absent = marqué explicitement, jamais un trou. Régime de test drastique : fuzz obligatoire par parseur, model-based sur StateMachine, virtual clock (jamais de sleep réel), zeroize secrets, 100 % couverture, interop. Neutre sync/async (ADR-038), composable (cœurs empilés, I/O au bas de la pile), zéro-C sauf exception TLS étroite (ADR-042). Portée : air-tls/air-quic/air-http/air-ssh/mDNS/WireGuard/DHCP/NTP ; air-socket+DNS = précurseurs conformes. Prérequis de la couche 2 (avant air-async/air-sshd). Companion ADR-019/024/038/042/043 (RFC ADR-015) | Architecture (réseau, couches 1–2, fondateur) | ADR-091-motif-reseau-sans-io-fr.md |
| 090 | Binding de la couche 1 dans std par rustc-dep-of-std : découplage plutôt que fork, sans descellement de la couche 0. Met en œuvre ADR-088. Mesuré (incréments 0→3) : un Manager entre dans la fermeture de std par une feature rustc-dep-of-std (build-config, reste no_std) — zéro source couche 0/1, zéro sémantique, pas de descellement. Discipline absolue : bras PAL & Managers de la fermeture std importent leurs types transverses depuis air-base-core (icu-free), JAMAIS air-base-lib (tire icu4x) ; interdiction de tirer une exception 80 % lourde (icu4x ADR-016/059, RustCrypto ADR-034) dans la fermeture de std — elles restent au niveau consommateur (couche 2/apps). AirRandom sur chemin sans crypto. Frontière no_std = relation à std (composant dont std est bâtie → no_std ; consommateur → std complet) ; String = type alloc déjà dispo couche 1. Politique de fork des deps externes (règle 80 %, ADR-024) : minimiser, préférer découplage/retrait au fork, ne PAS forker icu4x/RustCrypto. Industrialisation par vagues (0/1/2), jalon hello-std sur PAL safe 2 arches. S’appuie sur ADR-054 (scission air-base-core). Companion ADR-088/054/016/059/034/024 (RFC ADR-015) | Décision de toolchain (binding couche 1 → std) | ADR-090-binding-couche1-std-rustc-dep-of-std-fr.md |
Documents fondateurs apparentés
- Vision : ../vision/vision-fr.md (FR) / ../vision/vision-en.md (EN)
- Charte (5 principes de valeurs) : ../charte/charte-fr.md (FR) / ../charte/charter-en.md (EN)
- Principes d’ingénierie (9 principes méthodologiques) : ../principes-ingenierie/principes-ingenierie-fr.md (FR) / ../principes-ingenierie/engineering-principles-en.md (EN)
- Macro-architecture des 6 couches : ../architecture/macro-architecture-fr.md
- Vue d’ensemble du projet : ../../README.md
ADRs futurs identifiés (à instruire ultérieurement)
- Stratégie de logging et observabilité au-delà de
journald. - Stratégie de mise à jour atomique du système (vers Modèle B de distribution).
- App Store Air (présentation Flathub +
.airapp). - Protocole privé AirCom entre
air-wmet apps natives (rich content, animations, capture vectorielle scene-graph). - Politique d’accès des agents IA à l’arbre sémantique et aux captures vectorielles (dans la continuité de
air.accessibility.observerd’ADR-017 et des conséquences d’ADR-018). - Services système couche 5 (screencapture, appearance, share, firewalld, power, printd/bluetooth/nfc, prefs, keychain) — actuellement référencés à titre prospectif dans
../architecture/macro-architecture-fr.md; leurs numéros définitifs seront assignés au moment de leur instruction (numéros ≥ 029 ; 027 est pris par la documentation polyglotte, 028 par la soundness io_uring). - Cas spécifiques émergeant de l’implémentation.
Historique
-
v3.41 — Ajout d’ADR-092 («
air-async: découpage réacteur (couche 1) / exécuteur (couche 2) de la runloop io_uring »). Accepté (décision BDFL 2026-07-11). Raffine et renomme ADR-038 : la runloop se scinde enair-uring(couche 1, réacteur safe sur io_uring) +air-async(couche 2, exécuteur) — forcé parcheck-layers(couche 2 ↛ couche 0).air-asyncremplaceair-event. Modèle owned-buffer déjà en couche 0. Squelette prouvé host,check-layersvert. Companion ADR-038/091/022/028/044. Propagationair-event→air-async(specs/macro-archi) en suivi doc. -
v3.40 — Ajout d’ADR-091 (« Motif d’architecture réseau sans-IO : anatomie canonique à 9 composants, obligatoire »). Accepté (décision BDFL 2026-07-11). Rend normative la §2 de la note
reseau-architecture-crates-fr.md: tout crate réseau maison = cœur sans-IO pur (9 composants uniformes, 8 purs, fuzzés/testés en isolation) + pilote I/O mince. Seul motif testant la pile réseau indépendamment (surface hostile n°1 fuzzée sans réseau). Neutre sync/async (ADR-038), composable, zéro-C sauf exception TLS étroite (ADR-042). Prérequis de la couche 2 — gravé avantair-async/air-sshd. Le reste de la note (protocoles/priorités) reste exploratoire. Companion ADR-019/024/038/042/043. -
v3.39 — Ajout d’ADR-090 (« Binding de la couche 1 dans
stdparrustc-dep-of-std: découplage plutôt que fork, sans descellement de la couche 0 »). Accepté (décision BDFL 2026-07-11). Met en œuvre ADR-088. Mesuré (incréments 0→3, branchefeat/pal-safe-air-target) : binding par featurerustc-dep-of-std(build-config,no_std) — zéro source couche 0/1, pas de descellement ; le fardeau de fork (~71 naïf : 33 icu4x + 37 RustCrypto +bitflags) est accidentel, évité par découplage (imports →air-base-core, jamaisair-base-lib;AirRandomhors crypto), pas par fork. Exceptions 80 % hors fermeturestd(niveau consommateur). Frontièreno_std= relation àstd. Industrialisation par vagues (0/1/2). Companion ADR-088/054/016/059/034/024. -
v3.38 — Ajout d’ADR-089 (« Réservation du
SecurityManager: sécurité active per-process, couche 1 »). Accepté (décision BDFL 2026-07-10) — ADR de réservation (moteur = ADR ultérieur). Air secure-first : les Managers sensibles consultent unSecurityManageravant une op sensible →Allow/Deny+ log de la raison ; PAS un daemon (goulot) mais per-process embarqué parlibair; décision locale, enforcement via kernel partagé (eBPF/cgroups/seccomp/Landlock) ; règles depuis la config binaire (ADR-073). Seam posé (interface + défaut permissif, câblé au fil de l’eau) ; moteur différé, alignéair-sshd. Companion ADR-032/077/073/074/088. -
v3.37 — Ajout d’ADR-088 («
stdRust sur Air safe : PAL custom sur la couche 1, sans libc C »). Accepté (décision BDFL 2026-07-10). Pivot d’objectif premier : la toolchain Rust dont lastdrepose uniquement sur Air, par un backendstd::sysbindant la couche 1 Rust safe, sans lib C ni bindings C. Amende ADR-076 (abandonne l’option A «stdsur libc C » comme état-cible ; M5 devient un marchepied de faisabilité), re-amende ADR-050 (cibletarget_os="air", plus « déguisée » en unix), raffine ADR-077 (AirProcessManager→AirTaskManager: task + thread group, fidèle au kernel), résorbe ADR-087 (raw_syscalldisparaît).libair_csurvit mais découplée destd. Instruit par la note d’étudeetude-std-pal-air-safe-fr.md. Companion ADR-050/075/076/077/087/046. -
v3.36 — Jalon M5 atteint (2026-07-10) :
stdtourne sur la libc d’Air, zéro glibc, 2 arches. Ajout d’ADR-087 («syscallgénérique (raw_syscall) : escape hatch temporaire À RETIRER pour le palstd»). Accepté (ratification BDFL 2026-07-09), explicitement temporaire : dernier symbole indéfini de M5,syscall(2)brut requis par le palunixdestd(futex/gettid), impl. via additif couche 0raw_syscall+ shim libc cible-only. Entorse assumée (ADR-021 conv. 3 + « libc binde couche 1 ») ⇒ exception consignée + action item amont équipe Rust. Re-sceaucouche-0-v1.12(délégation ADR-065). Companion ADR-076/021/077. Backfill de l’index du registre : réintégration des lignes ADR-062→068 et ADR-070→077 (dérive admise à v3.26, jamais résorbée). En-tête porté à v3.36. -
v3.35 — Ajout d’ADR-086 (« Introspection thread cible pour la face libc : TLS dynamique, bornes de pile,
auxv»). Accepté (ratification BDFL 2026-07-09). Additif couche 1 débloquant 7 symbolesstdcible (pthread_key_*,pthread_self,pthread_getattr_np/attr_getstack/attr_getguardsize) :AirProcessManager::resource_limit(bindeprlimit) +air-runtime::process_context(captureauxv+ bornes de pile au bootstrap ; soclegetauxval+ détection de pile), TLS dynamique via#[thread_local]natif. Re-sceaucouche-1-v1.9. Companion ADR-076/077/052/055. -
v3.34 — Ajout d’ADR-085 (« Descellement additif couche 0 cumulé pour la face libc — chantier B »). Accepté (ratification BDFL 2026-07-08, périmètre implémenté). Cumule en un ADR tout le manque couche 0 restant de la campagne libc/
std:munmap_raw(mémoire),fchmod/fchown/futimens(fd),chroot,sched_[gs]etaffinity,pause,sigaltstack,sendfile;ioctlrésolu en dispatcher libc (ADR-021 préservé) ;getauxval/sysconf/strerror_r/__tls_get_addrrenvoyés à la couche 1 (descellée). Re-sceaucouche-0-v1.11posé. Companion ADR-051/070/071/076/077. -
v3.33 — Ajout d’ADR-084 (« Ratification
air-url: couche 4 élargie (UI + fondation) + nomair-url»). Ratification BDFL. Tranche les deux points ouverts de la specair-url(noteapi-reseau-strategie) :air-url(≈ URLSession — sessions/tâches/cache/cookies/WebSocket, surair-http) est une commodité applicative de fondation, pas un mécanisme système ⇒ couche 4, dont le périmètre est élargi de « frameworks UI » à « frameworks développeur : UI + fondation » (amende la macro-architecture, modèle Foundation ⊕ UIKit d’Apple). Nomair-url(descriptif, vocabulaire Air, jamais « URLSession » ;air-web/air-fetchrévisables sans rouvrir la couche). Alternatives rejetées : haut de couche 2 (mélange de registres), nouvelle couche dédiée (sur-ingénierie), nom copié d’Apple. Macro-archi (§couche 4) + specair-url+ INDEX/SUMMARY mis à jour. (Ratification pilotée par directive ; le nom reste ajustable par le BDFL.) -
v3.32 — Ajout d’ADR-083 (« Additifs couche 0 pour la plomberie réseau : TUN (
TUNSETIFF) +adjtimex/clock_adjtime»). Délégation additive (ADR-065, neutre). Vérification sur le socle réel : la plupart des additifs couche 0 flagués parair-dhcp/air-ntp/air-wireguardexistent déjà —clock_settime(step),SocketType::Raw+socket(domain, ty, protocol)générique (ICMPv6 brut), sockopt entierSO_BROADCAST(ADR-071). Seuls deux manquent réellement :adjtimex(slew — discipline fine que NTP préfère au saut brut) et TUN (/dev/net/tun+TUNSETIFF, ioctl dédié typé ADR-021 conv. 3, pour l’interface tunnel WireGuard). Types#[repr(C)]identiques 2 arches,Option<T>/EINTR/RAII FD ; privilèges (CAP_SYS_TIME/CAP_NET_ADMIN) appliqués par le kernel (wrapper neutre). ICMPv6 brut (SLAAC) +SO_BROADCAST= wrappers couche 1 (air-socket), pas de couche 0. Corrige les « Travail à reprendre » deair-dhcp/air-ntp/air-wireguard(sur-estimation). Tagscouche-0-v1.xaprès barrière 2 arches. SUMMARY à jour. -
v3.31 — Ajout d’ADR-082 (« Additifs crypto : AEAD à nonce explicite (record/packet) + BLAKE2s (WireGuard) + PBKDF2 (SASL/SCRAM) »). Proposé — ratification BDFL (surface crypto). Complète ADR-078/081. Révélé par
air-wireguard/air-mailet une relecture des piles TLS/QUIC/SSH : (1) le point important — la façadeAirAeadv1 génère un nonce aléatoire préfixé, mais tous les protocoles de session (TLS 1.3 record §5.3, QUIC packet RFC 9001 §5.3, WireGuard, SSH aes-gcm) chiffrent avec un nonce déterministeIV⊕compteur, non préfixé → ajout delowlevel::AirAeadExplicitNonce(backendsaes-gcm/chacha20poly1305déjà présents ; opt-in expert-only, contrat d’unicité de nonce documenté ; la façade à nonce géré reste le défaut applicatif). (2)blake2(BLAKE2s hash/MAC-keyed/HMAC pour le handshake Noise de WireGuard — pur Rust ZÉRO-C, contrairement àblake3qui tirecc). (3)pbkdf2(PBKDF2-HMAC-SHA256 pourSCRAM-SHA-256d’air-mail; optionnel —OAUTHBEARERl’évite). Correction rétroactive :air-tls/air-quic/air-ssh/air-wireguardnotent que la protection d’enregistrement/paquet passe par l’AEAD à nonce explicite. Pur Rust, zéro-C, KAT-gated. Section « Additifs planifiés » d’air-cryptoétendue. SUMMARY + INDEX + EXCEPTIONS à jour. -
v3.30 — Ajout d’ADR-081 (« Additifs crypto
air-quic/air-ssh: primitives bas niveau + RSA PKCS#1 v1.5 vérif. »). Proposé — ratification BDFL (surface crypto, comme ADR-078). Complète ADR-078 avec les additifs révélés par les specs QUIC/SSH (postérieures) : (1) moduleair_crypto::lowlevel— bloc AES single-block, keystream ChaCha20, Poly1305 one-shot (QUIC header protection RFC 9001 §5.4 + SSHchacha20-poly1305@openssh) ; cratesaes/chacha20/poly1305déjà transitives → promues directes ; opt-in expert-only, la façade AEAD à nonce géré reste le défaut (la construction reste en couche 2). (2)AirRsaPkcs1VerifyingKey— RSASSA-PKCS#1 v1.5 vérif. seule (SSHrsa-sha2-256/512), hors Marvin (opération publique ; chiffrement v1.5 toujours omis). (3) Kex PQ SSH = ML-KEM-768 réutilisé (mlkem768x25519-sha256, défaut OpenSSH ≥ 9.9) → aucun additif nouveau ;sntrup761différé (pas de crate pure-Rust vettée). Pur Rust, zéro-C, KAT-gated (ADR-034). Corrige la specair-ssh(PQ). Section « Additifs planifiés » ajoutée àair-crypto. SUMMARY + INDEX + EXCEPTIONS à jour. -
v3.29 — Ajout d’ADR-080 (« Additifs
air-socket: multicast UDP typé + codec DNS étendu SRV/TXT/PTR — descellement additifcouche-1-v1.x+couche-0-v1.12»). Délégation additive (ADR-065, neutre non-sécurité). Révélé par la specair-mdns(L2) : (1) multicast UDP — rejoindre un groupe =setsockopt(IP_ADD_MEMBERSHIP, ip_mreq), une option à structure que la couche 0 ne sait pas poser (ADR-071 = sockopts entiers seulement, limitation D-M4.1) → additifsetsockopt_bytes(aucun nouveau syscall, variante à buffer dusetsockoptdéjà appelé) ; fonctions multicast dédiées typées surAirUdpSocket(ADR-021 conv. 3). (2) Codec DNS — promu public sans-IO (codec de noms compressés borné/fuzzé existant) + types SRV/TXT/PTR (DNS-SD), plutôt que dupliqué dansair-mdns(surface de parsing hostile décodée une fois, règle 80 % ADR-024). Zéro-C, zérounsafe. Tagscouche-0-v1.12puiscouche-1-v1.xaprès barrière 2 arches. Section « Additifs planifiés » ajoutée à la specair-socket. SUMMARY + INDEX à jour. -
v3.28 — Ajout d’ADR-079 («
air-netlink(couche 1) : transport netlink générique + descellement additifcouche-0-v1.11(AF_NETLINK/sockaddr_nl) »). Décision BDFL (2026-07-07) — option B, couche 1. La conscience du chemin d’air-network(L2,AirNetworkPathMonitor) exige rtnetlink (plan de contrôle : liens/adresses/routes) ; la couche 0 n’a qu’un socketNETLINK_KOBJECT_UEVENTspécifique (air-device). Trade-off tranché : crateair-netlinkdédiée (responsabilité unique, transport réutilisable par path-monitor + WireGuard/DHCP +air-configroutes + wifi nl80211 ; surface TLV hostile fuzzée une fois ; patron sans-IO 9-composants) plutôt qu’étendreair-device(rejeté : conflate deux protocoles netlink très différents, descellement lourd, dispersion). Placée couche 1 (pair d’air-socket; révise la mention prospective « couche 2 » d’air-socket). Additif couche 0 modéré :SocketDomain::Netlink=16 +SocketAddrNetlink(sockaddr_nl), les syscalls génériquessocket/bind/sendmsg/recvmsgétant déjà présents ⇒ aucun nouveau syscall.air-deviceinchangé (migration future possible, non requise). Specdocs/specs/layer-1/air-netlink.md. Tagscouche-0-v1.11puiscouche-1-v1.xaprès barrière 2 arches. SUMMARY + INDEX à jour. -
v3.27 — Ajout d’ADR-078 (« Descellement additif
couche-1-v1.7: additifs crypto pourair-tls»). Proposé — ratification BDFL requise (surface crypto, hors délégation additive automatique d’ADR-065). Révélé par la contingenceair-tlsmaison (ADR-042 §Contingence, specdocs/specs/layer-2/air-tls.md) et l’audit s2n-tls (docs/notes/audit-s2n-tls-fr.md) : le cœur v1 d’air-crypto(Ed25519/X25519/AES-256-GCM/ChaCha20) ne valide pas le WebPKI réel. Ajoute 5 primitives àair-crypto(scellée) — AES-128-GCM (MTI TLS 1.3), ECDSA + ECDH P-256/P-384 (RFC 6979 déterministe), RSA-PSS vérification seule, ML-KEM-768 hybride — via crates RustCryptop256/p384/rsa/ml-kem(+ variante d’aes-gcmdéjà présent), purement additives, pur Rust, zéro-C,no_std-strict, KAT-gated (ADR-034). Décisions de sécurité gravées : RSA vérif. seule (aucune opération privée RSA ⇒ hors Marvin RUSTSEC-2023-0071 ; PKCS#1 v1.5 chiffrement omis), ECDSA à nonce déterministe RFC 6979, ML-KEM en hybrideX25519MLKEM768only (sécurité ≥ max des deux). N’impacte pas la pile de production rustls + aws-lc-rs (ADR-042). Exceptions 80 % à nommer (EXCEPTIONS.md— déjà instruites). Tagcouche-1-v1.7après ratification BDFL + implémentation KAT-gated + barrière 2 arches. SUMMARY + INDEX à jour. -
v3.26 — Ajout d’ADR-069 (« Registre de handles fd-général (couche 1,
air-handle) + moteur socket, façades PAL & libc »). Ratifié BDFL (2026-07-05). Déclenché par le jalon M4 réseau : la question « comment la libc socket se pose sur la couche 1 » a révélé un enjeu plus large — la cohérence de l’état des descripteurs entre Rust et C au sein d’un même processus (pas de « chemin Rust » vs « chemin C »). Décision : une crateair-handle(couche 1 basse, dont dépendent tous les producteurs de fd) porte un registre process-global unique (clé = vrai fd kernel, rendu au C pour l’interop) qui possède l’OwnedFd; points de passage uniques (create/duplicate/close/set_fd/set_status) ; duplicateur unique modélisant l’alias (description partagée refcomptée) + éviction-sur-silent-close → cohérencedup2/fcntl(F_DUPFD/F_SETFL). Tous les objets fd de couche 1 (AirFile/pipes/AirTcpSocket/AirUdp/AirUnix*) re-domiciliés (API préservée) ;AirSocketEngine= couche de politique (couture de sécurité réseau + résolveur réutilisé) au-dessus du registre ; une impl, deux façades (objets PAL Rust + libc C). Alternatives rejetées : libc→couche 0 direct (pas de couture), registre socket-only (2 régimes), handle synthétique (cassepoll/SCM_RIGHTS), libc sans état (= musl). Descellement additif couche 1 (re-sceau au lot 0). SUMMARY à jour. (Constat au passage : l’index du registre a dérivé — ADR-062→068 absents ; backfill à traiter hors périmètre de cette PR.) -
v3.25 — Ajout d’ADR-060 (« Descellement
couche-0-vX: familletermios/tty») et ADR-061 (« ArchitectureAirTerminal: modèle canonique + codecs — vision »). RFC de structure (ADR-015), par délégation d’autonomie BDFL (gravés pour revue a posteriori). ADR-060 : clore la libc exigetermios(interface POSIX-1988 de discipline de ligne, terminal-agnostique) +isatty(pourstdio), absents de la couche 0 scellée → descellement additif (mécanique ADR-051), toute la famille en une passe : attributs/contrôle-ligne/winsize/PTY/session, en fonctions dédiées typées (ADR-021 conv. 3, jamais d’ioctl générique), sur le typeTermiosexistant (branchefeat/termios-couche0) ;Option<T>/EINTR-remonté/RAII/100 %. ADR-061 (vision, sans impl.) : issu d’une réflexion de fond — le PTY est un canal d’octets non typé où mouse/négociation sont greffés en séquences (kitty & co. faute d’autre canal) ; Air, possédant le stack, sépare terminal-texte (termios + ansi, borné, compat) et interaction riche (device/compositeur,AttachSurface).AirTerminal= tag + codec + modèle canonique ; discipline « Annoncer→Sélectionner→dégrader-sur-inconnu » (#[non_exhaustive]+Unknown+capnp) pour évoluer sans casser ;termcap= ncurses/couche 2 (hors libc), xterm-only. Portée de sceau : couche 1 n’exige que termios (L0, ADR-060) + minceair-terminal(codecansi) ; le reste (codecs riches,air-codec-1, surfaces) = couche 2 différée. Registre/SUMMARY à jour. -
v3.24 — Ajout d’ADR-059 (« Stratégie i18n — Option V : Air utilise icu4x, pas de réimplémentation »). RFC de structure (ADR-015), ratifié BDFL en session sur décision data-backée, companion ADR-053 (affirmé : libc sur icu4x) + ADR-016 (exception i18n) + ADR-024 + ADR-050 (cible). Vérification empirique (sonde jetable, carbon) : la fermeture icu4x compile intégralement pour
x86_64-unknown-linux-air(--release, 33 s) — 6 composants (normalizer/casemap/segmenter avec LSTMauto/collator/locale_core/calendar) + socle +calendrical_calculations/core_maths/libm. 2 conditions triviales : (1)default-features = falsesur lesicu_*(évite la featurestdpar défaut — cause du « mur std ») ; (2) build--release(évite un repli loggingstd::eprintlndebug-only d’icu_provider). ⇒ réimplémenter le socle n’est PAS une nécessité (des mois pour reproduire ~15 crates ULP-correctes déjàno_std-cible). Décision Option V : Air utilise icu4x (extension exception ADR-016) + possède l’APIair-stringdual-face + le pipeline de données ; réécriture par composant seulement si justifiée. Rétrécit la roadmap §2.A (le « long pole » disparaît) en chantier no_std :air-base-lib#![no_std]+default-features=false, face C-ABI d’air-string, datagen différé. Abandonne le vendoring/port du socle.air-libm(ADR-057) reste surface math publique mais non requis par icu. Auditdocs/notes/audit-icu4x-rust-pur-fr.md§9 tranché. Roadmap/registre/SUMMARY à jour. -
v3.23 — Ajout d’ADR-058 («
loom: activation du modèle de concurrence, outil de vérification test-only »). RFC de structure (ADR-015), par délégation d’autonomie BDFL pour ce lot (gravé pour revue a posteriori), companion ADR-030 (dépendances test-only) + ADR-021 (EINTR/boucle) + ADR-031 (couverture). Tranche l’attente de gouvernance signalée dans leCargo.tomldu workspace (« décision Principe 6 / ADR-024 en attente »). Décision : activerloomcomme outil de modèle de concurrence, dépendance test-only tirée uniquement sous--cfg loom([target.'cfg(loom)'.dependencies], hors graphe normal, jamais livrée) — pas une exception 80 % (ADR-024 vise la production ;loomest un outil de vérification commeproptest, donc pas dansEXCEPTIONS.md), licenceMIT. Premier modèle : l’AirMutexd’air-thread(protocole futex à 3 états) via alias d’atomique commutécore/loom(même code exercé sous les deux) + shim de blocage (loom::thread::yield_now/no-op remplacefutex_wait/futex_wake— loom ne modélise pasfutex, mais la boucle relit l’état, ADR-021 §2). loom explore tous les entrelacements et prouve l’exclusion mutuelle (2 modèles :exclusion_mutuelle_deux_threads,try_lock_n_empiete_jamais— validés on carbon x86). Garde-fou : loom prouve la SÛRETÉ, pas la VIVACITÉ (réveil futex réel validé on-target). Tests réguliers gardéscfg(all(test, not(loom))). Attaque la source de la variance de couverture (#189, plancher 96→94). Invocation documentée ; job CI loom optionnel différé. Roadmap §3.1 (+ correction §2.B.1 : la migration futex d’air-threadétait déjà faite via le passage no_std #182). Registre/SUMMARY à jour. -
v3.22 — Ajout d’ADR-057 («
libmAir (air-libm) : vendoring delibm(rust-lang) en surface math couche 1 »). RFC de structure (ADR-015), par délégation d’autonomie BDFL pour ce lot (gravé pour revue a posteriori), companion ADR-053 (libc/i18n sur icu4x) + ADR-024/ADR-016 (règle des 80 % / exceptions nommées). Décision (auditdocs/notes/audit-icu4x-rust-pur-fr.md§3/§8) : le seul primitif système qui manque à la réimplémentation i18n/libc d’Air est une math flottanteno_std— unlibm(consommateurs incontournables :calendrical_calculationsviaicu_calendar, non contournable, + le modèle LSTM d’icu_segmenter, tous deux viacore_maths→libm). On vendore la cratelibm(rust-lang) comme exception nommée (modèleicu4x) — ni réécriture from-scratch (énorme, risque ULP) ni dépendance non nommée :libmest pur Rustno_std, zéro dépendance transitive, fusionné danscompiler-builtins(lelibmque lastdutilise pour wasm/no_std), licenceMIT. Exposé via une crate couche 1air-libm(#![no_std],pub use libm::*;) — frontière nommée, pinnée (=0.2.16), auditée. Aucun consommateur aujourd’hui : fondation posée pour la libc/i18n future (ADR-053). Couvertureair-libm= 100 % (ré-export sans logique propre + tests de fumée à valeurs connues, tolérance epsilon). Preuve de build*-linux-air(crate-sonde jetablert/). Back-fill : la rangée ADR-056 (absente du tableau d’index, omission de la PR air-alloc) est ajoutée par la même occasion. EXCEPTIONS/DEPENDENCIES/registre/SUMMARY/INDEX à jour. -
v3.21 — Ajout d’ADR-055 («
air-thread/air-processen#![no_std]: crateair-env+ spawn ergonomique gardé per-cible »). RFC de structure (ADR-015), ratifié BDFL, companion ADR-048 (no_std couche 1) + ADR-052 (D7.3) + ADR-054. Constat (re-sonde de build*-linux-airpost-ADR-054) : le 2ᵉ mur de la fermeture runtime est queair-thread/air-processne sont pas#![no_std]et fuientstd(air-process:std::ffi/std::os::unix/std::env::vars_osdansbuild_envp;air-thread:thread.rsenrobestd::thread, délibérément — une closure arbitraire sur un thread Air sans TCB glibc seraitunsound). Deux obstacles :air-processa besoin de l’environnement mais ne peut pas dépendre d’air-runtime(cycleair-runtime → air-processviaexit_process) ; le spawn ergonomique Air-natif relève d’air-runtime(TCB/TLS) et d’un allocateur réel (boxer la closure), indisponible. Décision : (D1) nouvelle crateair-env(couche 1, no_std, zéro dépendance) porte l’environnement sous les deux ⇒ cycle évité ; (D2)air-process→# ; (D3)air-thread→#![no_std],thread.rs(spawn std) gardé#[cfg(not(target_env="air"))]— hôte seulement ; (D4) portée « compile ≠ run » : la fermeture compile no_std pour la cible (re-sonde), mais exécuterCommand/spawn reste bloqué par l’allocateurAbortOnAlloc(chantier suivant). Couvertureair-env= 100 %. Registre/SUMMARY/INDEX/DEPENDENCIES à jour. -
v3.20 — Ajout d’ADR-054 (« Scission d’
air-base-lib: un cœurair-base-coresans i18n pour la fermeture runtime »). RFC de correction d’architecture (ADR-015), ratifié BDFL, companion ADR-052 (layering air-runtime) + ADR-053 (libc/icu4x). Constat empirique (sonde de build*-linux-air, étape 6) :air-memory/air-thread/air-processne consomment d’air-base-libqu’AirError(+ horloge monotone etAirPathpour deux d’entre eux) mais compilent tout l’i18n (icu_*), et ledefaultd’icu tirestd→ le build no_std meurt surextern crate stdd’icu_provider, avant d’atteindrelibm(donclibmhors du chemin critique de l’étape 6). Décision : extraire un cœur sans icuair-base-core(erreurs/id/chemins-octets/temps-monotone/encodages/log) ;air-base-libgarde l’i18n (AirString/AirLocale,AirDateTime/AirCalendar) + ré-exporte tout le cœur (compat — 7 consommateurs non-runtime + ABI C inchangés) ; le runtime bascule surair-base-core(fermeture sans icu ni libm pour l’étape 6) ;air-process::Commandprend args/env en octets (AirPath,execve=octets non garantis UTF-8, Principe 3). Rectifie l’en-tête erroné d’air-base-lib(« icu4x sans featurestd» — faux : ledefaultd’icu tirestd). La mise enno_stdd’icu4x lui-même (+libm) est déférée au chantier libc/i18n (ADR-053). Registre/SUMMARY/INDEX/DEPENDENCIES à jour. -
v3.19 — Ajout d’ADR-053 (« La libc Air s’appuie sur icu4x pour ctype/locale/i18n »). RFC (ADR-015), ratifié BDFL, companion ADR-046 (libc) + ADR-016 (i18n). Doctrine : la surface C de traitement de caractères/locales/i18n (
isX/towX/strcoll/strxfrm/wcs*+ extensions) repose sur icu4x (couche 1) → i18n correcte par défaut, le développeur C n’embarque plus icu4x, et là où POSIX est faible Air donne le standard Unicode (cf. ADR-046 D3/D5 : POSIX fonctionnel non conforme, kernel=bible). Mapping POSIX↔icu4x (mono-char/locale-globale ↔ chaîne/locale-explicite/sans-état :isX→icu_properties, casse simple 1→1 vs pleine niveau-chaîne, locale courante thread-local réconciliant le « zéro globale »), byte-level gardé rapide (icu4x seulement pour la correction i18n), écarts POSIX documentés (transparence). Précise/rend obsolète ADR-046 D7 : « libm exclu v1 » (icu4x exige libm : calendriers + LSTM) et « hors wide-char lourd » (lewcs*i18n EST la surface icu4x). Un socle icu4x couche 1, 3 consommateurs (libc C, futurstd*-linux-air, pal). Constat (notedocs/notes/audit-icu4x-rust-pur-fr.md) : Ruststdne repose **pas** non plus sur icu4x (mini-tables propres) → même bolt-on que C ; icu4x runtime = no_std calcul-pur (zéro syscall/horloge/thread) → seul manque Air =libm` no_std + petites crates utilitaires + pipeline de données CLDR/UCD. Renvois posés (bannières « obsolète ») dans ADR-046 (D7) + ADR-016 (extension) + macro-architecture (icu4x dès couche 1). Questions ouvertes : libm (réécrit vs vendoré), LSTM (oui/dico), datagen (réutiliser vs refaire). -
v3.18 — Amendement d’ADR-035 : 5ᵉ catégorie de couverture « TARGET-ONLY » (RFC ADR-015, companion ADR-052/049). Code dont la sémantique n’est correcte que sur
*-linux-air(programmer le registre TLS, threadCLONE_SETTLS, relocations static-PIE, self-pointer TCB) → ni exécuté ni mesuré par le gate (*-linux-gnu, glibc — unsound, #151), prouvé par le selftestrt/on-target (exit code, 2 arches : carbon x86 + raspi aarch64). Granularité fichier (--ignore-filename-regex, précédent_capnp.rs) : on retire--exclude air-runtime(mesure des modules host-testables env/args/reloc-parser/fork à 100 %) et on ignore les fichiers target-only (thread_control_block/thread_local_storage/thread/start+ primitives air-thread + applier reloc). Distincte de STRUCTURAL/CHILD-EXIT/DEFERRED-TOOLING ; réversible (toolchain Air-native mesurant on-target). Anti-complaisance : réservé à l’insondable-sur-cible-du-gate, pas au « dur à tester ». -
v3.17 — Ajout d’ADR-052 («
air-rtest un objet couche 1 (AirRuntime), jamais un consommateur direct de la couche 0 »). RFC de correction d’architecture (ADR-015), ratifié BDFL. Constat : le cratert/crates/air-rt(phase 2) appelle la couche 0 en direct (arch::set_fs,mem::mmap,process::clone_thread,futex,exit_group) — violation du layering (seule la couche 1 consomme la couche 0). Doctrine gravée :air-rtest un objet couche 1 (AirRuntime) composé de nouvelles briques couche 1 à créer —ThreadControlBlock,ThreadLocalStorage, outils de relocation (cible PIE/static-PIE, ADR-050) — et s’appuyant surair-thread/air-mem/air-proc; il ne dépend jamais deair-sys-syscall(la surface kernel) —air-sys-types(types transverses :AirError/Errno/Pid/Tid…, D6) reste autorisé à toutes les couches. Les wrappers de syscalls (dontset_fsd’ADR-051) restent en couche 0, mais leur consommateur devient un objet couche 1. Le cratert/ne garde que le point d’entrée ELF_start+ la plomberie cible. Corrige ADR-049 D8 (tag obsolète + bannière) et reformule le « affaire d’air-rt » d’ADR-051 (note layering). Conséquence : la logique de runtime, devenue couche 1, retombe sous le 100 % couverture + barrière 2-arches (gain de rigueur vs carve-outrt/). macro-architecture (§Section 3 + tableau d’artefacts),rt/README.md/rt/DECISIONS.md, SUMMARY/INDEX à jour. Code à refactorer (suivi séparé). -
v3.16 — Ajout d’ADR-051 (« Descellement
couche-0-v1.7: 7 syscalls pour le runtime et la libc »). RFC d’extension d’une couche scellée (ADR-015), ratifié BDFL, livré en une seule PR (CI ARM longue → on minimise les cycles de gate). Ajoute, en un re-sceau unique (éviter les cycles répétés), 7 wrappers typés :arch_prctl(set_fs/get_fs, x86_64-only, nouvelle famillearch— débloque le TLS du thread principal x86 de la phase 2*-linux-air; aarch64 =tpidr_el0en asm côté air-rt) + processset_tid_address/getcwd(octets)/umask/getppid(→Option<Pid>)/sched_yield/getrusage(+ typesRusage/RusageWho/Timeval). Conventions ADR-021 (fns dédiées,Option/newtypes).check-syscallsPASS vs uapi (2 arches), couvrable VIDE (2 exceptions STRUCTURAL/EFAULT-SAFE : brasErrdeget_fs/getrusage),audit-exceptionscohérent (77). Reporté encouche-0-v1.8(phase 5, OpenSSH) : termios/PTY/rt_sigaction/sigaltstack(+ décision ADR-020). SUMMARY/INDEX/specs (family-arch.md,family-process.md§7) à jour. -
v3.15 — Ajout d’ADR-050 (« Spécification de la cible
*-linux-air(phase 1) ») et réconciliation du tableau avec les ADR-046→049 (acceptés/mergés mais jamais portés au registre). ADR-050 ouvre l’exécution du programme*-linux-air(ADR-049) : triple{x86_64,aarch64}-unknown-linux-air(env=air, 3ᵉ saveur de libc à côté de gnu/musl),llvm-targetmusl découplé du nom Rust (LLVM ignoreair), cible statiquepanic=abort+has-thread-local, champs codegen repris verbatim de la base musl ; développement hors-arbre (rt/: workspace+toolchain nightly séparés,-Z build-std core,alloc,-Z json-target-spec) exclu de la barrière stable (ADR-037) et de la couverture — carve-out de même nature quefuzz/(esprit ADR-030) ; squeletteair-rt(modulestcb/tls/start/env/spawnmappés sur D1–D9). Faisabilité prouvée 2 arches (core+alloc+air-rt compilent pour x86_64 ET aarch64). Stratégie ratifiée (ADR-049) : hors-arbre jusqu’à la démo phase 4, upstream Tier-3 après. Cible PIE/static-PIE affirmée (codegen PIC dès la phase 1, vérifié 2 arches ; ASLR préservé) ; seul l’_startauto-relocalisant (relocationsR_*_RELATIVE) reste un livrable de phase 2 (avec asm TLS/spawn, 2 arches,// SAFETY:). Les rangées 046→049 sont ajoutées au tableau (back-fill) : ADR-046 (libc Air : périmètre/layering/provenance), ADR-047 (principes de construction libc), ADR-048 (descellement couche 0 std-free + futex, re-sceau v1.6), ADR-049 (runtime TCB/TLS, fondation*-linux-air). -
v3.14 — Ajout d’ADR-045 (« Modèle d’erreurs de l’ABI C »). Première passe ABI C (
air-base-capi→libair-base.so) : erreurs in-band viaAirStatus(#[repr(C)],AIR_OK=0, sur-ensemble d’AirErrorKind+NULL_ARGUMENT/BUFFER_TOO_SMALL), sanserrnoni globale (fidèle au kernel, doctrine libc) ; message viaair_status_messagestatique ;panic = "abort"(panic = bug Air → fail-fast, pas decatch_unwind/AIR_PANIC). Réalise « pas de globale libc / dit ce qu’elle fait » au niveau C. Spec :air-base-capi.md. Alternatives écartées :errno-style, objetAirErroropaque dès T1,catch_unwind→AIR_PANIC. -
v3.13 — Ajout d’ADR-044 (« Extension couche 0 : famille
poll/ppoll»). RFC d’extension d’une couche scellée (ADR-015) — ≠ complément additifErrno. Ajoute le wrapperppoll(variante moderne : ns,timeoutnon muté, sigmask) +PollFd(emprunté +0,reventsrestitués, ADR-032) + promotion dePollEventshors d’io_uring(ré-export, zéro rupture) ; conversionDuration→timespecdéfensive (clampi64::MAX, jamaisas). Débloque l’attente synchrone bornée/interruptible deair-process(wait_timeout/wait_until/wait_forever) sans io_uring (footgun de hang de l’incident fork #128). Re-sceaucouche-0-v1.5;check-syscallsppoll(271/73, 2 arches) ; gate barrière + CI ARM. Spec :family-poll.md; consommateur :air-process.md§4. -
v3.12 — Amendement d’ADR-027 (addendum « doc ABI C »). Clôt le « Doxygen ou équivalent » : rendu = Doxygen (HTML + pages
man) sur le headercbindgencommitté (contrat ABI diffé en CI), versions pinnées (ADR-025), intégré au mdBook FR+EN. Grave l’exigence de contenu orientée dev C : guides obligatoires sur les obligations de l’appelant — mise en route/lien, modèle d’erreursAirError, et surtout la propriété mémoire & cycle de vie (pour chaque type complexe : qui alloue/libère et avec quelle fonction ; retour possédé→libérer / emprunté→ne pas libérer ; arguments empruntés +0 ; chaînes/buffers/out-params ; refcompté retain/release ; secrets zeroize) + thread-safety par type + exemples C. Chaquepub extern "C"porte sa clause de propriété dans son commentaire///(source unique → cbindgen → Doxygen). Mise en œuvre à la 1ʳᵉ passe ABI C (air-base-lib). -
v3.11 — Ajout d’ADR-043 (« Pile SSH »). Pendant d’ADR-042 mais calcul différent : pas d’option Rust mature (russh ≪ rustls), surface SSH bien plus grande (
sshd= surface distante critique, classe regreSSHion), SSH hors chemin critique (applicatif couche 2+). Décision : court termeair-sshdifféré, OpenSSH système en incubation (ADR-013) ; à termeair-sshmaison (memory-safe Rust, anatomie 9-composants, strict-kex anti-Terrapin, moderne-only, RustCrypto, homologation interop OpenSSH+RFCs, audit externe du sshd), PAS russh (immature pour un daemon distant ; gardé comme référence/base auditée possible) ; client (ssh/scp/sftp) avant serveur (sshd). Zéro exception C (maison+RustCrypto). Implémentation au cadrage réseau couche 2. -
v3.10 — Ajout d’ADR-042 (« Pile TLS : rustls + aws-lc-rs »). Après analyse explicite (frontière primitives/protocole ; classes de CVE TLS, sûreté mémoire dominante ; comparaison piles dont s2n-tls) : la pile TLS = rustls (protocole pur Rust, memory-safe, TLS 1.3) + aws-lc-rs (provider crypto AWS-LC : asm formellement vérifié, FIPS, maintenu) + rustls-webpki (X.509 pur Rust). Exception C NOMMÉE et ÉTROITE : le C ne concerne que les primitives (
aws-lc-sys), jamais le protocole ni le parseur X.509 (memory-safe) ;ringreste banni. = la combinaison la plus sûre disponible (memory-safety + vérif formelle + 1.3 + maintenance financée).air-tlsmaison gardé en contingence (si rustls devient une faille/un passif de maintenance). deny.toml/EXCEPTIONS.md/check-c-surface + pinning toolchain C (ADR-025) appliqués à l’implémentation (pas avant). Corrige la note réseau (ligneair-tls). -
v3.9 — Ajout d’ADR-041 (« Coexistence
/etc», companion d’ADR-033, détaille la règle 7 au-delà de systemd). Les fichiers/etcpossédés par Air sont des projections générées parair-config, en lecture seule sélective (jamais globale — casseraitpasswd/ldconfig/installs ; même Silverblue/MicroOS gardent/etcinscriptible),air-configseul écrivain (swap atomique) ; mutables-runtime (resolv.conf,machine-id) redirigés vers/run;/etc/systemd/systempossédé par le backend systemd d’air-config(systemd lit, n’écrit pas ;start/stop/restartintacts). Garde-fou (root peut remonter rw), pas frontière de sécurité — celle-ci viendra avec air-launchd/Landlock. Génération =air-config(L1) ; protection (montage RO sélectif) = intégration OS (L5), réalisable avant air-launchd. Périmètre progressif ; bootstrap bidirectionnel (import/etc→ source). Détail → specair-config. -
v3.8 — Ajout d’ADR-040 (« Format de l’artefact binaire de configuration : Cap’n Proto », companion d’ADR-033). Tranche le format de l’artefact
air-config: Cap’n Proto — pour la cohérence projet (AirCom encode déjà en Cap’n Proto, ADR-001 → un seul langage de schéma / codegen / dépendance à auditer, exception règle-des-80 % partagée) et le zéro-copie/mmap (ADR-033 §4, Principe 9, boot Pi). protobuf écarté (pas zéro-copie), FlatBuffers écarté (second écosystème superflu). ExceptionEXCEPTIONS.mdpourcapnpà acter avec AirCom ; placementair-configen crate dédiée (vsair-base-lib) à trancher au cadrage. Hors périmètre : backends d’émission/etc(coexistence libc/Unix, ADR-033 §7) → specair-config. Amendé 2026-06-25 (addendum) :capnpruntime = zéro dépendance / pur Rust (propre), maiscapnpcexige le binaire C++capnpau build (vérifié empiriquement ; pas propre à Cap’n Proto —flatc/protocaussi). Politique gravée : code généré committé (schémas.capnpversionnés ; mainteneur régénère le.rsau changement de schéma, le commite ; builds/CI pur-Rust + reproductibles sans tool C++). Vaut aussi pour AirCom (ADR-001). -
v3.7 — Ajout d’ADR-039 (« Nommage & placement du runtime et du modèle d’objet + ordonnancement », amende ADR-002, précise ADR-023/038). Le modèle d’objet C-ABI est renommé
air-object(couche 2 ;libair-object.so) ; le runtime async gardeair-runtime(couche 1, consomme io_uring directement), multi-crateair-runtime-core/io/time/signal/sync+ façade ;air-event(couche 2) est la façade C-ABI par-dessus le runtime L1. Ordonnancement : exécuteur single-thread comme unité (empreinte minimale Pi 4B), scalable en thread-per-core shared-nothing (réutilise io_uring Temps 3e :RingPool/msg_ring/LockedIoUring/SqpollIoUring), sans work-stealing v1 ; CPU-bound déporté versair-thread. Deux familles de synchro (bloquantestd::sync/ async runtime). Sweep macro-architecture (air-runtime→air-objectdu modèle d’objet) appliqué. -
v3.6 — Ajout d’ADR-038 (« Modèle d’exécution : runtime async natif io_uring, sans tokio, couches basses synchrones, pas d’epoll », amende ADR-023). Plus aucune dépendance tokio :
air-event(couche 2) est le runloop async natif sur io_uring. Posture synchrone-first (couches 0/1 : wrappers bloquants + API sync avec seamas_fd()) + async opt-in (couche 2). Le synchrone est de première classe pour : init/sécurité (drop_privileges/seccomp/Landlock), outils one-shot/CLI, compute-bound (crypto/memory), embarqueurs avec leur propre boucle, RAII, poignées systemd. io_uring est le seul moteur de readiness+complétion — pas d’epoll (porte laissée ouverte par RFC si besoin réel mesuré ;ppollplutôt qu’epoll pour un éventuel multiplex sync). Met à jour la macro-architecture (mentions « au-dessus de tokio » corrigées). -
v3.5 — Ajout d’ADR-037 (« CI ARM seule + validation x86 par barrière pré-merge », companion d’ADR-031/036). La CI GitHub ne tourne plus que sur le runner ARM (raspi-srv-2) ; l’x86 est validé hors CI par
cargo xtask barriersur speedy ET carbon avant chaque merge (mêmes contrôles et planchers 96/78 que l’ancien runner x86). speedy reste enregistré mais retiré des workflows (réactivation à l’ouverture publique) ; raspi-srv-2, lent, est réservé au seul rôle CI ARM. Invariant ADR-014 (x86_64 ET aarch64) préservé : ARM par CI, x86 par barrière pré-merge. Conséquences assumées : raspi-srv-2 devient le SPOF de la CI ; le gate x86 n’est plus imposé par GitHub (acceptable mono-mainteneur, ADR-031). Câblé dans.github/workflows/ci.yml+docs/CI.md. -
v3.4 — Ajout d’ADR-036 (« Filtrage par chemin de la re-vérification d’une couche scellée », companion d’ADR-031/035). La mesure de couverture (et le fuzz) de la couche 0 scellée ne se relance pas sur les PR qui ne la touchent pas ; re-vérification complète toujours garantie : (a) PR touchant couche 0 / toolchain / CI / politique, (b) merge vers
main(mainjamais non vérifié — dérive de toolchain bloquée au merge), (c) planifié hebdomadaire. Câblé dans.github/workflows/ci.yml(jobchangespargit diff, variableFULL). N’amende pas le standard 100 % de la couche 0 ; le tagcouche-0-v1reste la référence. -
v3.3 — Ajout d’ADR-035 (« Taxonomie des exceptions de couverture », companion d’ADR-031). Grave 4 catégories + 1 étiquette de dette pour
docs/COVERAGE-EXCEPTIONS.md: STRUCTURAL (inatteignable par construction — absorbeEFAULT-SAFEetVALUE-UNREACHABLEpermanente), PRIVILEGE, FEATURE-KERNEL, CHILD-EXIT (code exécuté dans un enfant forké mais profil LLVM non flushable — preuve par le code de sortie viawaitid), et DEFERRED-TOOLING (branche réellement atteignable non encore outillée → à couvrir, jamais exemption permanente). Règle : les bras de code de test ne figurent pas au registre production (annexe). Invariant « couvrable VIDE ». N’amende pas ADR-031 ni le Principe 1. Appliqué immédiatement (055) : 3 candidates atteignables couvertes ⇒DEFERRED-TOOLINGvide. -
v3.2 — Ajout d’ADR-034 (« Discipline des dépendances cryptographiques », companion d’ADR-024). Grave la discipline des crates crypto auditées d’Air (exceptions structurantes à la règle des 80 %, comme
icu4x) : exemption de vendoring (cohérence cryptographique + sécurité par adoption massive primant sur l’auto-hébergement), veille des trois upstreams (RustCrypto, dalek-cryptography, équipe BLAKE3), fast-lane sécurité (un bump correctif de sécurité passe malgré le pinning des builds reproductibles ADR-025), KAT-gating des montées de version (vecteurs de test connus rejouéss avant tout bump), et option Apache pourblake3(dualCC0-1.0 OR Apache-2.0) dansdeny.toml.air-crypto(couche 1) renvoie à cet ADR pour sa discipline de dépendances. Aucun amendement aux autres ADRs. -
v3.1 — Ajout d’ADR-033 (« Modèle de configuration : source typée, compilation validée, artefact binaire »). Source typée canonique → compilateur validant (barre couches 0/1, fuzzé) → artefact binaire reproductible schema-first (version + checksum) consommé par le runtime ; projections texte JSON/YAML/TOML en import/export ; sûreté par générations + switch atomique + rollback ; backends de compilation enfichables (joint d’indépendance — unit files systemd générés et validés pour V1). L’intégrité des binaires est explicitement renvoyée à un futur ADR. Aucun amendement aux autres ADRs. (NB : ADR-032 figure déjà au tableau ci-dessus — rattrapage du prompt non nécessaire.)
-
v3.0 — Ajout d’ADR-032 (« Préservation des données confiées : zéro discard silencieux »). Règle transverse : une API Air ne discarde jamais une donnée confiée — restitution intégrale (tous les buffers), ressources reçues matérialisées (
OwnedFd) et troncatures signalées, chemins d’erreur compris ; la consommation explicite par contrat (submit_close(OwnedFd)) reste permise. Émergé du Temps 2b io_uring (into_zero_copy_buffers). Aucun amendement aux autres ADRs. -
v1.0 — Registre consolidé initial regroupant les 17 ADRs fondateurs en un seul fichier.
-
v2.0 — Restructuration en un fichier par ADR. Ce document devient un index. ADR-018 ajouté en phase de design. ADR-009 révisé (intégration de l’amendement déclaratif, anciennement envisagé sous le nom ADR-009-bis ; intégration directe conforme à la politique d’édition design-phase).
-
v2.1 — Intégration des 6 ADRs phase 0 (ADR-019 à ADR-024). Renumérotation : la série phase 0 telle qu’instruite (018-erreurs, 019-signaux, 020-conventions, 021-io_uring, 022-runtime, 023-workflow-deps) est décalée de +1 pour résoudre le conflit avec l’ADR-018 fondateur « Modèle d’imagerie » déjà acté en v2.0. Réorganisation physique : tous les ADRs vivent désormais dans
docs/adrs/, et l’ensemble de la documentation est restructurée selon le plan consigné dans../INDEX.md. -
v2.2 — Ajout d’ADR-025 (« Stratégie de builds reproductibles »). Clôt la série de design phase 0. Aucun amendement aux ADRs antérieurs.
-
v2.3 — Enrichissement substantiel d’ADR-001 (« IPC AirCom, refus de D-Bus comme transport principal »). Passage de 12 lignes à 197 lignes pour rendre la décision défendable face à des contributeurs venant de l’écosystème D-Bus traditionnel. La décision elle-même est inchangée ; seuls la pédagogie, la documentation des sources, et l’articulation avec les autres ADRs et principes Air sont développées. Aucun amendement aux autres ADRs.
-
v2.4 — Ajout d’ADR-026 (« Contrat 1.0 d’
air-tui») pour cadrer le modèle d’interaction, les capacités, les dégradations acceptées, et le noyau de primitives de l’interface texte riche d’Air. -
v2.5 — Ajout d’ADR-027 (« Stratégie de documentation polyglotte — ABI C et bindings multi-langages »). Décide de générer la doc C/polyglotte depuis le code Rust (source unique de vérité), mise en œuvre différée à la couche 2. Ajout en tête d’une définition canonique du sigle ADR. Aucun amendement aux ADRs antérieurs.
-
v2.6 — Ajout d’ADR-028 (« Soundness et téardown du module io_uring »). Grave les trois décisions S1 (slab pré-alloué, zéro alloc happy path), S2 (
Dropquiescent +shutdown()), S3 (confinement par restrictions) émergées de la spécification détaillée du module io_uring. Complète ADR-022 sans modifier ses 10 décisions. Aucun amendement aux autres ADRs. -
v2.9 — Ajout d’ADR-031 (« Mesure de couverture en root sur les runners self-hosted »). Le job CI
test-coveragemesure la couverture en root (sudo -n) pour que les tests d’intégration privilégiés (bpf()/CAP_BPF,uinput, perf, cgroup, bpffs) s’exécutent réellement sous instrumentation —ebpf, quasi-tout-privilégiée, est sinon plafonnée ~74 % non-root. Plancher inchangé (96 % lignes / 78 % branches). Prérequis :NOPASSWDsur les deux runners ; modèle de confiance dépôt privé / mono-mainteneur à revisiter avant l’ouverture publique. Aucun amendement aux autres ADRs. -
v2.8 — Ajout d’ADR-030 (« Périmètre de la règle des 80 % : production vs test-only »), companion d’ADR-024. Précise (sans amender ADR-024) que la règle des 80 % et le vendoring du Principe 6 visent les dépendances de production (
[dependencies]) ; les deps dev/test-only,cfg-gated (loom), et la cratefuzz/séparée en sont exemptées, mais restent soumises àdeny.toml(licences, arbre transitif complet) etcargo audit. Débloque proptest/loom/cargo-fuzz pour les tests du module io_uring sans violer le Principe 6. -
v2.7 — Ajout d’ADR-029 (« Nommage de la surface publique »). Érige en règle, pour le nommage de l’API, la déclinaison du Principe 7 : surface conçue par Air = noms explicites sans abréviation (Zone 1) ; noms hérités d’une autorité consultable — ABI kernel,
stdRust, termes POSIX — conservés verbatim (Zone 2). Test de décision et nuance des types miroir. Transverse à tout le framework. Aucun amendement aux autres ADRs.
Licence du document : MPL 2.0 Statut : Document fondateur. Édition directe autorisée en phase de design pré-ouverture publique ; après ouverture publique, l’ajout ou la modification d’un ADR passe par RFC.