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

Air Desktop — Index des documents de conception

Document de référence — Version 1.4 (2026-07-10, passe post-M5 : ADRs jusqu’à 087, sceaux couche-0-v1.12 / couche-1-v1.9, jalon std-sur-Air atteint)

Ce document recense l’ensemble des documents de conception du projet Air Desktop, élaborés pendant les sessions préparatoires. Il sert de :

  • Index navigationnel pour retrouver rapidement un document.
  • Checklist de complétude pour vérifier que tout est en place.
  • Carte des travaux à reprendre pour les sessions futures.

Identité du projet

  • Nom du projet : Air
  • Identité publique : Air Desktop
  • Domaine : air-desktop.org
  • Organisation GitHub : air-desktop-project
  • Repo principal : github.com/air-desktop-project/air
  • Préfixe technique des crates : air-
  • Licence : Mozilla Public License 2.0

Convention de nommage des fichiers

  • ADRs (Architecture Decision Records) : ADR-NNN-titre-court-LL.md (préfixe ADR-, numéro à 3 chiffres, titre en kebab-case, suffixe de langue -fr ou -en).
  • Documents fondateurs (vision, charte, principes d’ingénierie) : nom thématique + suffixe de langue (vision-fr.md, charter-en.md, etc.).
  • Specs et documents internes : nom thématique en kebab-case, langue implicite par contenu et contexte.

Structure de la documentation

air/
├── README.md                                # Vue d'ensemble publique du projet
├── README-fr.md                             # Vue d'ensemble publique du projet (FR)
├── LICENSE                                  # MPL 2.0 (à copier)
├── CHANGELOG.md                             # À démarrer
├── CONTRIBUTING.md                          # À rédiger (TODO)
├── CODE_OF_CONDUCT.md                       # Contributor Covenant 2.1 (TODO)
├── SECURITY.md                              # À rédiger (TODO)
├── Cargo.toml                               # Workspace Rust privé (couche 0)
├── Cargo.lock                               # Lockfile committé
├── rust-toolchain.toml                      # Toolchain pinée
├── crates/
│   ├── air-sys-types/                       # Types fondamentaux de la couche 0
│   └── air-sys-syscall/                     # Wrappers Rust des syscalls Linux
└── docs/
    ├── INDEX.md                             # Ce document
    ├── EXCEPTIONS.md                        # Exceptions explicites au principe dépendances (ADR-024)
    ├── COVERAGE-EXCEPTIONS.md               # Branches/lignes couche 0 non couvertes (raison légitime)
    ├── UNSUPPORTED.md                       # Syscalls/opcodes legacy non wrappés + remplaçants (io_uring 3b)
    │
    ├── vision/
    │   ├── vision-fr.md                     # Vision du projet (FR)
    │   └── vision-en.md                     # Project Vision (EN)
    │
    ├── charte/
    │   ├── charte-fr.md                     # Charte (5 principes, FR)
    │   └── charter-en.md                    # Charter (EN)
    │
    ├── principes-ingenierie/
    │   ├── principes-ingenierie-fr.md       # 9 principes (FR)
    │   └── engineering-principles-en.md     # Engineering Principles (EN)
    │
    ├── adrs/
    │   ├── registre-adrs-fr.md              # Registre / index des ADRs (v3.36)
    │   ├── ADR-001-aircom-fr.md            # 17 ADRs fondateurs + ADR-018 imagerie
    │   ├── ADR-002-modele-objet-fr.md
    │   ├── ADR-003-compositeur-wayland-fr.md
    │   ├── ADR-004-linux-tier-1-fr.md
    │   ├── ADR-005-systemd-fr.md
    │   ├── ADR-006-profils-fr.md
    │   ├── ADR-007-air-console-fr.md
    │   ├── ADR-008-air-tui-fr.md
    │   ├── ADR-009-framework-vues-fr.md
    │   ├── ADR-010-airapp-fr.md
    │   ├── ADR-011-phasage-fr.md
    │   ├── ADR-012-versionnement-fr.md
    │   ├── ADR-012-bis-telemetrie-fr.md
    │   ├── ADR-013-distribution-fr.md
    │   ├── ADR-014-catalogue-materiel-fr.md
    │   ├── ADR-015-licence-gouvernance-fr.md
    │   ├── ADR-016-i18n-fr.md
    │   ├── ADR-017-accessibilite-fr.md
    │   ├── ADR-018-modele-imagerie-fr.md
    │   ├── ADR-019-modele-erreurs-fr.md     # ADRs phase 0 (renumérotés +1)
    │   ├── ADR-020-strategie-signaux-fr.md
    │   ├── ADR-021-conventions-couche-0-fr.md
    │   ├── ADR-022-architecture-io-uring-fr.md
    │   ├── ADR-023-runtime-air-fr.md
    │   ├── ADR-024-workflow-dependances-fr.md
    │   ├── ADR-025-builds-reproductibles-fr.md  # OK (clôt la série de design phase 0)
    │   ├── ADR-026-contrat-air-tui-fr.md        # OK (contrat 1.0 `air-tui`)
    │   └── ADR-027-doc-polyglotte-fr.md         # OK (doc polyglotte ABI C — diff. couche 2)
    │
    ├── architecture/
    │   └── macro-architecture-fr.md         # Macro-architecture des 6 couches
    │
    ├── notes/                               # Pistes / cadrages exploratoires (NON engageants)
    │   ├── libc-compat-exploration-fr.md
    │   ├── android-vendor-interface-exploration-fr.md
    │   ├── api-reseau-strategie-fr.md       # cadrage `air-network` (couche 2)
    │   ├── audit-dlmalloc-fr.md             # distillation dlmalloc → allocateur global Air (couche 1)
    │   └── audit-s2n-tls-fr.md              # relevé chiffré s2n-tls → contingence air-tls maison (couche 2)
    │
    ├── specs/
    │   ├── layer-0/
    │   │   ├── introduction-fr.md           # Intro développeur couche 0 (encart dev C/C++)
    │   │   ├── air-sys-types.md             # Partiel, avec TODO
    │   │   ├── family-process.md
    │   │   ├── family-fs.md
    │   │   ├── family-mem.md
    │   │   ├── family-signal.md
    │   │   ├── family-time.md
    │   │   ├── family-net.md
    │   │   ├── family-ipc.md
    │   │   ├── family-security.md
    │   │   ├── family-system.md
    │   │   ├── family-device.md             # uevent/evdev (sysfs → fs)
    │   │   ├── family-ebpf.md               # bpf() exhaustif + perf_event_open
    │   │   ├── family-fs-inotify.md         # extension inotify (prérequis AirFileSystemWatcher)
    │   │   ├── family-mem-mmap-region.md    # MmapRegion partageable refcounté (implémenté #31)
    │   │   ├── family-process-privsep.md    # setgroups/setres*id (prérequis drop_privileges)
    │   │   ├── io-uring-overview.md         # Synthèse, avec TODO
    │   │   ├── io-uring-1-core.md           # TODO
    │   │   ├── io-uring-2a-filesystem.md    # TODO
    │   │   ├── io-uring-2b-network.md       # TODO
    │   │   ├── io-uring-2c-async.md         # TODO
    │   │   ├── io-uring-3a-registration.md  # TODO
    │   │   ├── io-uring-3b-linked.md        # TODO
    │   │   ├── io-uring-3c-multishot.md     # TODO
    │   │   ├── io-uring-3d-shared.md        # TODO
    │   │   └── io-uring-4-raw.md            # TODO
    │   ├── layer-1/
    │   │   ├── air-base-lib-core.md         # erreurs, chaînes/chemins, temps
    │   │   ├── air-base-lib-services.md     # logging, identifiants, config
    │   │   ├── air-filesystem.md            # AirFileSystem + watcher
    │   │   ├── air-memory.md                # allocateurs arena/pool/slab + comptabilité
    │   │   ├── air-process.md               # processus, pidfd, drop_privileges
    │   │   ├── air-thread.md                # threads, mutex/rwlock/sémaphore, MPSC
    │   │   ├── air-socket.md                # sockets + résolution de noms enfichable
    │   │   ├── air-crypto.md                # primitives cryptographiques (RustCrypto)
    │   │   ├── air-device.md                # énumération/surveillance natives (sysfs+uevent)
    │   │   ├── air-config.md                # compilateur config + artefact Cap'n Proto (crate dédiée)
    │   │   ├── air-config-source-format.md  # grammaire du format de source air-config (design)
    │   │   └── air-config-schemas-v1.md     # schémas .capnp v1 + BNF gelée du format de source
    │   ├── layer-2/
    │   │   ├── air-object.md                # modèle d'objet C-ABI (clé de voûte couche 2)
    │   │   ├── air-com.md                    # IPC natif AirCom (sans-IO, capability=fd, pub-sub anneau shm)
    │   │   └── air-event.md                 # façade C-ABI de l'event loop async (sur air-runtime)
    │   └── layer-4/
    │       ├── air-tui-core.md              # Noyau 1.0 `Capabilities`/focus/commandes
    │       └── air-tui-runtime-api.md       # Surface d'API conceptuelle runtime
    │
    ├── setup/
    │   ├── phase-A-decisions.md
    │   ├── phase-B1-structure.md
    │   ├── phase-B2-operations.md
    │   ├── phase-C-infrastructure.md
    │   └── phase-D-community.md
    │
    ├── guides/                              # TODO
    │   ├── first-contribution.md
    │   └── getting-started/
    │
    └── maintainers/                         # TODO
        ├── release-process.md
        ├── moderation.md
        ├── onboarding-maintainers.md
        └── cve-handling.md

Inventaire des documents produits

Documents fondateurs

DocumentLocalisationStatut
Vision (FR)docs/vision/vision-fr.mdOK
Vision (EN)docs/vision/vision-en.mdOK
Charte (FR)docs/charte/charte-fr.mdOK
Charter (EN)docs/charte/charter-en.mdOK
Principes d’ingénierie (FR)docs/principes-ingenierie/principes-ingenierie-fr.mdOK
Engineering Principles (EN)docs/principes-ingenierie/engineering-principles-en.mdOK
Registre des ADRs (v3.36)docs/adrs/registre-adrs-fr.mdOK
Macro-architecture des 6 couchesdocs/architecture/macro-architecture-fr.mdPasse 1 (nettoyage) OK ; passe 2 (complétion sections couches 1-5) à faire plus tard, en parallèle de l’implémentation

ADRs fondateurs (17) et ADR-018 (modèle d’imagerie)

Voir le registre des ADRs pour la liste consolidée. Tous les fichiers sont sous docs/adrs/.

ADRs phase 0

ADRTitreLocalisationStatut
019Modèle d’erreurs hybride à deux niveauxdocs/adrs/ADR-019-modele-erreurs-fr.mdOK
020Stratégie signaux signalfd par défautdocs/adrs/ADR-020-strategie-signaux-fr.mdOK
021Conventions transverses de la couche 0docs/adrs/ADR-021-conventions-couche-0-fr.mdOK
022Architecture du module io_uringdocs/adrs/ADR-022-architecture-io-uring-fr.mdOK
023Runtime asynchrone Air sur io_uringdocs/adrs/ADR-023-runtime-air-fr.mdOK
024Workflow de gestion des dépendancesdocs/adrs/ADR-024-workflow-dependances-fr.mdOK
025Stratégie de builds reproductiblesdocs/adrs/ADR-025-builds-reproductibles-fr.mdOK

ADRs post-phase 0

ADRTitreLocalisationStatut
026Contrat 1.0 d’air-tui : UI texte riche, cellulaire, capability-gateddocs/adrs/ADR-026-contrat-air-tui-fr.mdOK
027Stratégie de documentation polyglotte (ABI C et bindings multi-langages)docs/adrs/ADR-027-doc-polyglotte-fr.mdOK
028Soundness et téardown du module io_uring (S1/S2/S3), complète ADR-022docs/adrs/ADR-028-soundness-io-uring-fr.mdOK
029Nommage de la surface publique : explicite, sans abréviation ; noms d’autorité conservésdocs/adrs/ADR-029-nommage-surface-publique-fr.mdOK
030Périmètre de la règle des 80 % : production vs test-only (companion ADR-024)docs/adrs/ADR-030-dependances-test-only-fr.mdOK
031Mesure de couverture en root sur les runners self-hosted (ebpf, uinput)docs/adrs/ADR-031-couverture-root-ci-fr.mdOK
032Préservation des données confiées : zéro discard silencieux (Méthode)docs/adrs/ADR-032-zero-discard-donnees-fr.mdOK
033Modèle de configuration : source typée, compilation validée, artefact binaire (Architecture)docs/adrs/ADR-033-modele-configuration-fr.mdOK
034Discipline des dépendances cryptographiques (companion ADR-024)docs/adrs/ADR-034-discipline-dependances-crypto-fr.mdOK
035Taxonomie des exceptions de couverture (companion ADR-031)docs/adrs/ADR-035-taxonomie-exceptions-couverture-fr.mdOK
036Filtrage par chemin de la re-vérification d’une couche scellée (companion ADR-031/035)docs/adrs/ADR-036-filtrage-reverification-couche-scellee-fr.mdOK
037CI ARM seule (raspi-srv-2) + validation x86 par barrière pré-merge (companion ADR-031/036)docs/adrs/ADR-037-ci-arm-x86-premerge-fr.mdOK
038Modèle d’exécution : runtime async natif io_uring (sans tokio), couches basses synchrones, pas d’epoll (amende ADR-023)docs/adrs/ADR-038-modele-execution-async-io-uring-fr.mdOK
039Nommage & placement : runtime air-runtime (L1), modèle d’objet air-object (L2), ordonnancement single-thread/thread-per-core (amende ADR-002, précise ADR-023/038)docs/adrs/ADR-039-nommage-runtime-objet-ordonnancement-fr.mdOK
040Format de l’artefact binaire de configuration : Cap’n Proto (companion ADR-033)docs/adrs/ADR-040-format-artefact-config-capnproto-fr.mdOK
041Coexistence /etc : projection générée, lecture seule sélective, air-config seul écrivain (companion ADR-033)docs/adrs/ADR-041-coexistence-etc-fr.mdOK
042Pile TLS : rustls + aws-lc-rs (exception C nommée, étroite), TLS 1.3, air-tls maison en contingencedocs/adrs/ADR-042-pile-tls-rustls-awslc-fr.mdOK
043Pile SSH : OpenSSH système en incubation, air-ssh maison à terme (client avant serveur)docs/adrs/ADR-043-pile-ssh-fr.mdOK
044Famille couche 0 poll/ppoll (attente bornée interruptible)docs/adrs/ADR-044-extension-couche-0-famille-poll-fr.mdOK
045Modèle d’erreurs de l’ABI C (AirStatus in-band)docs/adrs/ADR-045-modele-erreurs-abi-c-fr.mdOK
046La libc Air (Rust pur) : périmètre, layering, doctrinedocs/adrs/ADR-046-libc-air-fr.mdOK
047Principes de construction de la libc Airdocs/adrs/ADR-047-principes-construction-libc-fr.mdOK
048Descellement couche 0 : std-free + futex(2)docs/adrs/ADR-048-descellement-couche0-std-free-futex-fr.mdOK
049Runtime Air : TCB/TLS/démarrage (fondation *-linux-air)docs/adrs/ADR-049-runtime-tcb-tls-fr.mdOK
050Spécification de la cible *-linux-air (phase 1)docs/adrs/ADR-050-cible-linux-air-spec-fr.mdOK
051Descellement couche-0-v1.7 : 7 syscalls runtime & libc (famille arch)docs/adrs/ADR-051-descellement-couche0-v1.7-libc-fr.mdOK
052air-rt = objet couche 1 (AirRuntime), jamais consommateur direct de la couche 0docs/adrs/ADR-052-air-rt-objet-couche1-fr.mdOK
053La libc Air s’appuie sur icu4x (ctype/locale/i18n)docs/adrs/ADR-053-libc-sur-icu4x-fr.mdOK
054Scission air-base-core (cœur sans i18n) hors d’air-base-libdocs/adrs/ADR-054-air-base-core-scission-i18n-fr.mdOK
055air-thread/air-process en no_std + crate air-envdocs/adrs/ADR-055-nostd-thread-process-air-env-fr.mdOK
056Allocateur global air-alloc (couche 1) : inspiré de dlmalloc, simple, possédé — remplace AbortOnAlloc, maillon libcdocs/adrs/ADR-056-allocateur-air-alloc-fr.mdOK
057libm Air (air-libm, couche 1) : vendoring de libm (rust-lang) en exception nommée — math flottante no_std (fondation libc/i18n, audit icu4x §3/§8), aucun consommateur encoredocs/adrs/ADR-057-libm-air-fr.mdOK
058loom : activation du modèle de concurrence (test-only)docs/adrs/ADR-058-loom-modele-concurrence-fr.mdOK
059Stratégie i18n : Air utilise icu4x (Option V)docs/adrs/ADR-059-i18n-strategie-option-v-icu4x-fr.mdOK
060Descellement couche 0 : famille termios/ttydocs/adrs/ADR-060-descellement-couche0-termios-tty-fr.mdOK
061Architecture AirTerminal : modèle canonique + codecsdocs/adrs/ADR-061-architecture-air-terminal-fr.mdOK
062Sceau couche-1-v1.0 : gel de l’API Rust de la couche 1docs/adrs/ADR-062-sceau-couche-1-fr.mdOK
063Instrumentation IO couche 1 (debug) : registre de handles & cohérence forkdocs/adrs/ADR-063-instrumentation-io-couche-1-fr.mdOK
064Doctrine des signaux couche 1 : signalfd primaire, fautes → défaut (zéro unsafe)docs/adrs/ADR-064-signaux-doctrine-couche-1-fr.mdOK
065Descellement additif couche-1-v1.1 : AirRuntime::errno_location (délégation de re-sceau)docs/adrs/ADR-065-descellement-couche1-v1.1-fr.mdOK
066Descellement additif couche 0 : rt_sigaction non-faute (async réel) + rt_sigpending + trampolinedocs/adrs/ADR-066-descellement-couche0-sigaction-async-fr.mdOK
067air-account (couche 1) : comptes /etc/passwd+/etc/shadow+/etc/group, bindée par la libcdocs/adrs/ADR-067-air-account-couche1-fr.mdOK
068Surface fine credentials (uid/gid) en couche 1 (air-process), bindée par la libcdocs/adrs/ADR-068-credentials-couche1-fr.mdOK
069Registre de handles fd-général (couche 1, air-handle) + moteur socket, façades PAL & libcdocs/adrs/ADR-069-registre-handles-fd-moteur-socket-fr.mdOK
070Descellement additif couche 0 : codec sockaddr public pour la face libcdocs/adrs/ADR-070-descellement-couche0-sockaddr-libc-fr.mdOK
071Descellement additif couche 0 : setsockopt/getsockopt entiers publics (face libc)docs/adrs/ADR-071-descellement-couche0-sockopt-libc-fr.mdOK
072CI : x86_64 runner primaire, aarch64 cross-check + natif sur main (révise ADR-037)docs/adrs/ADR-072-ci-x86-primaire-aarch64-crosscheck-fr.mdOK
073Doctrine de configuration binaire : pas de conf en texte clair, CLI + mot de passe admindocs/adrs/ADR-073-configuration-binaire-doctrine-fr.mdOK
074Vision air-sshd : démon SSH natif async, wire-compat OpenSSH, conf binaire, profil modernedocs/adrs/ADR-074-air-sshd-vision-fr.mdOK
075Fourniture du PAL : std::sys::pal::air via rust-src patché + build-std, upstream Tier-3docs/adrs/ADR-075-fourniture-pal-rust-src-patche-fr.mdOK
076std natif sur la libc d’Air : cible env=musl + vendor=air (chantier B, option A)docs/adrs/ADR-076-std-sur-air-libc-env-musl-fr.mdOK
077Managers de domaine couche 1 : surface objet médiatrice des toits libc + PALdocs/adrs/ADR-077-managers-domaine-couche1-fr.mdOK
078Descellement additif couche-1 : additifs crypto pour air-tls (ECDSA/RSA-PSS/ML-KEM/AES-128) — earmark v1.10docs/adrs/ADR-078-descellement-couche1-v1.7-crypto-air-tls-fr.mdOK
079air-netlink (couche 1) : transport netlink générique + descellement couche 0 (AF_NETLINK)docs/adrs/ADR-079-air-netlink-couche1-fr.mdOK
080Additifs air-socket : multicast UDP typé + codec DNS SRV/TXT/PTR + setsockopt structurédocs/adrs/ADR-080-additifs-air-socket-multicast-dns-fr.mdOK
081Additifs crypto air-quic/air-ssh : primitives lowlevel (AES bloc, ChaCha20, Poly1305) + RSA PKCS#1 v1.5docs/adrs/ADR-081-additifs-crypto-quic-ssh-fr.mdOK
082Additifs crypto : AEAD à nonce explicite + BLAKE2s (WireGuard) + PBKDF2 (SASL/SCRAM)docs/adrs/ADR-082-additifs-crypto-wireguard-mail-aead-nonce-fr.mdOK
083Additifs couche 0 : TUN (TUNSETIFF) + adjtimex (discipline horloge)docs/adrs/ADR-083-additifs-couche0-tun-adjtimex-fr.mdOK
084Ratification air-url : couche 4 élargie (UI + fondation)docs/adrs/ADR-084-ratification-air-url-couche4-elargie-fr.mdOK
085Descellement couche 0 cumulé : primitives manquantes pour la face libc (chantier B)docs/adrs/ADR-085-descellement-couche0-cumule-libc-std-fr.mdOK
086Introspection thread cible pour la face libc : TLS dynamique, bornes de pile, auxv (M5)docs/adrs/ADR-086-introspection-thread-cible-libc-fr.mdOK
087syscall générique (raw_syscall) : escape hatch temporaire pour le pal std (M5) — À RETIRERdocs/adrs/ADR-087-syscall-escape-hatch-a-retirer-fr.mdOK (dette ouverte)
088std Rust sur Air safe : PAL custom sur la couche 1, sans libc C (amende ADR-076 ; AirTaskManager ; résorbe raw_syscall)docs/adrs/ADR-088-std-pal-safe-couche1-sans-c-fr.mdOK
089Réservation du SecurityManager : sécurité active per-process embarquée par libair, consultée par les Managers sensibles (Allow/Deny+log) ; moteur différédocs/adrs/ADR-089-reservation-security-manager-fr.mdOK

Spécifications techniques de la couche 0

🔒 COUCHE 0 — SCELLÉE le 2026-06-14 (tag couche-0-v1), re-scellée couche-0-v1.1 (errno additif, PR #77), couche-0-v1.2 (extension exec/redirection execve/execveat/dup3/fchdir/chdir/exit_group, PR #100), couche-0-v1.3 (execve_prepared — exec sans alloc pour air-process, PR #104), puis couche-0-v1.4 le 2026-06-25 (faccessat honore réellement ses flags via faccessat2 SYS 439 — , couche-0-v1.5 (famille poll/ppoll — attente synchrone bornée interruptible, ADR-044, PR #129), puis couche-0-v1.6 le 2026-06-28 : la couche 0 devient std-free (#![cfg_attr(not(test), no_std)], prouvé par le compilateur, Principe 4) via types FD natifs d’Air (OwnedFd/BorrowedFd/RawFd + close(2) interne, PR #148), famille futex(2) (PR #147), std-free (ffi→alloc/core, OsString→octets, FutexMutex, PR #149) et clone3 spawn de thread (clone_thread + trampoline asm 2-arches, join CHILD_CLEARTID, PR #150) — ADR-048 + Amendement 1 ; jalons antérieurs conservés) ; puis couche-0-v1.7 (famille archarch_prctl set_fs/get_fs TLS x86_64, ADR-051/052) ; puis couche-0-v1.8 le 2026-07-02 (famille terminaltermios/tty complète : 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) ; fonctions dédiées typées ADR-021 conv. 3, Option<Pid>, EINTR remonté, RAII FD ; tests sur PTY réel /dev/ptmx + cycle session en enfant setsid ; ADR-060, PRs #200–#204 ; 1 exception CHILD-EXIT) ; puis couche-0-v1.9 (signaux async, ADR-066), couche-0-v1.10 (sockaddr/sockopt libc, ADR-070/071), couche-0-v1.11 le 2026-07-09 (additifs cumulés libc/std — chroot/killpg/sigaltstack+AltStack/sendfile/fchmod/fchown/futimens/munmap_raw, ADR-085), puis couche-0-v1.12 le 2026-07-10 (raw_syscall** — escape hatch syscall générique, EXCEPTION assumée temporaire à retirer avec l’équipe Rust, ADR-087, jalon M5).** CODE complet (11 familles + io_uring 12 Temps + extensions MmapRegion/privsep/fs::inotify/ affinité CPU/exec/faccessat2), barrière complète verte sur 2 arches (x86_64 speedy, aarch64 raspi-srv-2), 100 % de couverture hors exceptions documentées (couvrable VIDE au sens strict, ADR-035 ; lignes 97,74 % / branches 82,73 % brutes), // SAFETY: sur chaque bloc unsafe, doc développeur FR + EN. Le socle syscall n’évolue plus que par RFC (ADR-015) ; les constantes Errno peuvent être complétées additivement par les besoins des contrats couche 1 landés (re-sceau vX.Y, jalons antérieurs conservés). Couche 1 — 8/8 CRATES CŒUR IMPLÉMENTÉ : air-base-lib cœur (PR #73) + air-crypto (PR #80) + air-socket (PR #86) + air-filesystem (PR #87) + air-memory (PR #88) + air-device (PR #94) + air-thread (PR #97) + air-process (PR #105). Reste pour clore la couche 1 : air-base-lib services (logging/identifiants ; air-config → crate dédiée, Cap’n Proto, ADR-040/041) et l’ABI C (libair-base.so, différée).

🔒 COUCHE 1 — SCELLÉE couche-1-v1.0 (2026-07-03, ADR-062) ; re-scellée v1.1 (ADR-065), v1.2 (ADR-066), couche-1-v1.3 (2026-07-05, ADR-067 — crate air-account) ; v1.4/v1.5 (credentials + drop_to_user, ADR-068), couche-1-v1.6 (air-handle + moteur socket, ADR-069), couche-1-v1.7 le 2026-07-09 (Managers de domaine ADR-077 + AirSignalManager, chantier B), couche-1-v1.8 le 2026-07-09 (air-process::spawn_process, socle posix_spawn, chantier B), couche-1-v1.9 le 2026-07-10 (introspection thread cible — air-runtime::process_context [auxv+bornes de pile] + AirProcessManager::resource_limit, socle de getauxval/pthread_getattr_np de la libc, ADR-086, jalon M5 ; earmark ADR-078 crypto → couche-1-v1.10). API Rust publique figée sur 17 crates (air-base-core/air-base-lib, air-crypto, air-socket, air-filesystem, air-memory, air-alloc, air-device, air-env, air-stdio, air-terminal, air-poll, air-signal, air-thread, air-process, air-runtime async inclus, air-config*, air-libm). Précédée des audits pré-sceau (#212/#213), des 4 P0 (AirFile #214, air-poll #215, termios/PTY #216, air-signal #217) et du remodel os_str env/args (#218). HORS sceau : C-ABI (air-base-capi + libc, régime air-stable) · PAL std::sys · toolchain C/C++. Évolution ensuite par descellement additif v1.x (RFC, modèle ADR-051). Toit libc — jalon M0 (fondations) posé : split code / artefact (ADR-029) — crates/air-libc-capi (rlib pur, le code : buildable pour *-linux-air) + crates/air-libc-c (cdylib host-only, l’artefact libair_c.so). M1-b — split « logique / shims C-ABI » (couverture) : la LOGIQUE mesurable vit dans des crates sœurs SANS symbole libc #[no_mangle]crates/air-libc-fmt (moteur de format printf, couvert à 100 %, surface format-string N°1) et crates/air-libc-alloc (logique malloc/free/…, couvert à 100 %) ; les primitives mem*/str* (#![no_builtins]) dans crates/air-libc-strmem. Seul air-libc-capi porte les shims #[no_mangle] extern "C" (qui délèguent), exclu du gate de couverture (comme air-libc-strmem) car ces symboles surchargent le runtime de couverture LLVM. Régime air-stable — errno C-ABI (__errno_location + E*) + crt (__libc_start_main/air_main) câblé sur air_runtime::start::bootstrap ; registre libc-conformance.md ; harnais on-target rt/crates/airlibc-return42 (return 42). 1er additif v1.x révélé : AirRuntime::errno_location() -> *mut i32 (RFC de descellement à ratifier). Caveats de sceau résorbés post-sceau (PR #66, merge 380d389) : gates qualité gravés en cargo xtask (barrier/couvrable-vide/check-syscalls/ audit-exceptions/repro, cf. outillage-xtask.md). La reproductibilité ADR-025 est outillée (repro, 4 rlibs bit-pour-bit) ; le re-sync des fichier:ligne du registre est outillé (audit-exceptions), qui a corrigé une dérive du décompte → registre à 69 entrées production (STRUCTURAL 38, FEATURE-KERNEL 13, PRIVILEGE 10, CHILD-EXIT 8, DEFERRED-TOOLING 0). check-syscalls certifie 161 numéros conformes (2 arches, 0 écart).

DocumentLocalisationStatut
Introduction (développeurs) — présentation de la couche 0, où trouver quoi, encart « dev C/C++ »docs/specs/layer-0/introduction-fr.mdOK
Crate air-sys-types (partiel)docs/specs/layer-0/air-sys-types.mdOK (avec TODO)
Famille processdocs/specs/layer-0/family-process.mdOK
Famille archdocs/specs/layer-0/family-arch.mdImplémenté (ADR-051, re-sceau couche-0-v1.7)arch_prctl set_fs/get_fs (x86_64) ; TLS du thread principal x86, appelé par l’objet ThreadLocalStorage couche 1 (ADR-052, pas par le runtime en direct). Prouvé on-target (étape 6 phase A) : rt/air-rt recâblé en shim sur air_runtime::start::bootstrap ; errno #[thread_local] réel (cfg target_env="air") ; selftest airrt-selftest exit 42 sur x86_64, cross-build aarch64 OK (run raspi à suivre). Étape 6 phase B : air-runtime bascule en couverture per-fichier (retrait --exclude air-runtime, ADR-035 § amendement) — façade AirRuntime réalisée (errno/set_errno/current_tid) + args/env/reloc-parser/fork/lib mesurés à 100 % ; 4 fichiers TARGET-ONLY (TCB/TLS/spawn/bootstrap) ignorés par fichier + 5 lignes TARGET-ONLY résiduelles (reloc/fork) au registre COVERAGE-EXCEPTIONS
Famille fsdocs/specs/layer-0/family-fs.mdOK
Famille memdocs/specs/layer-0/family-mem.mdOK
Famille signaldocs/specs/layer-0/family-signal.mdOK
Famille timedocs/specs/layer-0/family-time.mdOK
Famille netdocs/specs/layer-0/family-net.mdOK
Famille ipcdocs/specs/layer-0/family-ipc.mdOK
Famille securitydocs/specs/layer-0/family-security.mdOK
Famille systemdocs/specs/layer-0/family-system.mdOK
Famille terminaldocs/specs/layer-0/family-terminal.mdImplémenté (ADR-060, re-sceau couche-0-v1.8)termios/tty : types Termios/Winsize/PtyNumber (air-sys-types) + wrappers ioctl dédiés typés (air-sys-syscall/src/terminal.rs, ADR-021 conv. 3) — attributs/contrôle-ligne/winsize/PTY/session-job-control ; Option<Pid> (tcgetpgrp, sentinelle 0→None), EINTR remonté, RAII FD ; tests PTY réel /dev/ptmx + cycle session en enfant setsid (1 exception CHILD-EXIT justifiée) ; 100 % hors exception. isatty/ttyname = couche 1 (dérivés)
Famille devicedocs/specs/layer-0/family-device.mdOK — uevent/evdev, parsers zéro-alloc (sysfs → fs)
Famille ebpfdocs/specs/layer-0/family-ebpf.mdOK — bpf() exhaustif (37 cmd) + perf_event_open
Famille fs — extension inotifydocs/specs/layer-0/family-fs-inotify.mdImplémenté (PR #55) — RAII Inotify (IN_CLOEXEC défaut) + décodeur emprunté zéro-alloc / zéro-perte (queue tronquée signalée) ; fuzz 3 M runs ; décodeur 100 %/100 %
Famille process — affinité CPUdocs/specs/layer-0/family-process-affinity.mdImplémenté (PR #55)set/get_cpu_affinity(Option<Tid>, &CpuSet) (CpuSet réutilisé de system) ; débloque air-thread::cpu_affinity (couche 1)
Famille mem — MmapRegiondocs/specs/layer-0/family-mem-mmap-region.mdImplémenté (PR #31) — a débloqué madvise (2a) + futex (2c)
Famille process — extension privsepdocs/specs/layer-0/family-process-privsep.mdOK (spec) — setgroups/setresgid/setresuid à implémenter (prérequis air-process::drop_privileges, sécurité-critique)
Module io_uring (vue d’ensemble)docs/specs/layer-0/io-uring-overview.mdRedirection (contenu repris par le document maître + specs par Temps)
Module io_uring (inventaire maître, cible 6.12)docs/specs/layer-0/io-uring-0-inventaire.mdOK — validé
Module io_uring — Temps 1 (cœur)docs/specs/layer-0/io-uring-1-core.mdOK — validé
Module io_uring — Temps 2a (filesystem)docs/specs/layer-0/io-uring-2a-filesystem.mdOK — validé
Module io_uring — Temps 2b (réseau)docs/specs/layer-0/io-uring-2b-network.mdOK — validé
Module io_uring — Temps 2c (async-spécifiques)docs/specs/layer-0/io-uring-2c-async.mdOK — validé
Module io_uring — Temps 2d (URING_CMD)docs/specs/layer-0/io-uring-2d-cmd.mdImplémenté (PR #37) — 4 cmd socket + générique UringCommand ; SQE128 soumission corrigée
Module io_uring — Temps 3a (registration)docs/specs/layer-0/io-uring-3a-registration.mdImplémenté (PR #40) — 21 register opcodes + variantes direct + read/write fixed + fixed_fd_install ; CpuSet créé (air-sys-types) ; 4 écarts kernel documentés (§13 bis)
Module io_uring — Temps 3b (buffers fournis ring)docs/specs/layer-0/io-uring-3b-provided.mdImplémenté (PR #42)ProvidedBufferRing (PBUF_RING/UNREGISTER/STATUS) + sélection auto + guard RAII + incrémental + modes app/kernel_mmap ; docs/UNSUPPORTED.md créé
Module io_uring — Temps 3c (opérations liées)docs/specs/layer-0/io-uring-3c-linked.mdImplémenté (PR #44)LinkedChainBuilder soft/hard + with_link_timeout + staging/réservation atomique ; sémantique soft/hard correcte confirmée (short-read piège)
Module io_uring — Temps 3d (multishot)docs/specs/layer-0/io-uring-3d-multishot.mdImplémenté (PR #46) — accept/recv/read/poll/timeout multishot + cancel_multishot ; cycle de vie S1 (CQE_F_MORE) prouvé Miri ; -ENOBUFS terminant distinct
Module io_uring — Temps 3e (multi-thread)docs/specs/layer-0/io-uring-3e-shared.mdImplémenté (PR #49) — thread-per-core (msg_ring) + LockedIoUring (Send+Sync, verrou unique, sans poisoning) + RingPool (ATTACH_WQ workers bornés) + SqpollIoUring (réveil NEED_WAKEUP) ; unsafe impl Send for IoUring (ADR-022 D6) ; !Sync compile-fail + loom ; shared.rs branches 100 % / couvrable vide
Module io_uring — Temps 3f (confinement)docs/specs/layer-0/io-uring-3f-sandbox.mdImplémenté (PR #51)RestrictionSet (default-deny) + RegisterOp/SqeFlagSet + flux immuable R_DISABLED → REGISTER_RESTRICTIONS → ENABLE_RINGS (soundness S3) ; preuve de sécurité verte (openat2 refusé -EACCES sur ring « réseau seul ») ; sandbox.rs 100 % / couvrable vide
Module io_uring — Temps 4 (accès brut)docs/specs/layer-0/io-uring-4-raw.mdImplémenté (PR #53)RawSubmissionQueueEntry/RawCompletionQueueEntry/RawOpcode (#[repr(C)], asserts de layout) + soumission/complétion brutes + tag user_data bit 63 (slab génération 31 bits ⇒ coexistence sans collision) + # Safety exhaustif ; Miri + fuzz (2 M runs) ; raw.rs 100 % / couvrable vide. ➜ Module io_uring COMPLET (12 Temps)
Module io_uring — versions anglaises (15 docs)docs/specs/layer-0/io-uring-*-en.md + docs/adrs/ADR-022/028-...-en.mdOK — traduction globale des 13 specs + ADR-022 + ADR-028 (suffixe -en.md)
Couche 0 — référence développeur en anglais (18 docs)docs/specs/layer-0/{introduction,air-sys-types,family-*,io-uring-overview}-en.mdOK — traduction fidèle de l’intro développeur, air-sys-types, des 11 familles + 4 extensions et de la vue d’ensemble io_uring (suffixe -en.md) ; ADRs et QUESTIONS-implementation.md hors périmètre

Spécifications techniques de la couche 1

DocumentLocalisationStatut
air-base-core — cœur sans i18n (erreurs, id, chemins-octets, temps monotone, encodages, log)(scission d’air-base-lib-core.md)Implémenté (ADR-054) — crate extraite d’air-base-lib : AirError/AirResult, AirId128/AirUuid/AirMonotonicId, AirPath, AirOsStr/AirOsString (chaîne-OS opaque : env, argv… ; pendant std::ffi::OsStr/OsString, #[repr(transparent)], aucune fn unsafe exposée — remodel pré-sceau env/args), AirInstant/AirDuration (monotone), encoding (base64/hex), AirLog ; zéro dépendance icu4x, no_std ⇒ socle de la fermeture runtime *-linux-air (sans std/libm). Tests déplacés avec ; couvrable VIDE.
air-env — porteuse de l’environnement de processus (octets)(scission d’air-runtime::env)Implémenté (ADR-055 D1 ; remodel pré-sceau env/args) — crate couche 1, no_std (unique dép interne air-base-core pour la chaîne-OS) : set_environ (publié au démarrage), get(&AirOsStr) -> Option<AirOsString> (copie possédée race-safe, façon std::env::var_os)/vars() en paires possédées (octets, ADR-049 D6). Vit sous air-runtime ET air-processcasse le cycle air-runtime → air-process (air-runtime::env ré-exporte ; air-process::build_envp lit air_env). 100 % lignes+branches.
air-base-lib — i18n + ré-export du cœur (chaînes/locale, temps calendaire)docs/specs/layer-1/air-base-lib-core.mdImplémenté (PR #73, merge cb480ac ; scindé ADR-054) — garde l’Unicode (AirString/AirLocale, segmentation/normalisation/casing/collation) + temps calendaire (AirDateTime/AirCalendar), icu4x 2.2 (compiled_data), et ré-exporte tout air-base-core (compat : air_base_lib::AirError/AirPath/… inchangés). Pont AirPathAirString = extension AirPathStringExt. 100 % couvrable VIDE ; fuzz×4 + property-based.
air-base-lib — services (logging, identifiants)docs/specs/layer-1/air-base-lib-services.mdImplémenté (PR #110)AirLog (journald socket natif, zéro dép systemd, repli memfd+SCM_RIGHTS, non-fatal) + identifiants (AirUuid/AirId128/AirMonotonicId) ; zéro dép externe, zéro C ; 2 cibles fuzz ; 100 % hors exceptions STRUCTURAL. §3 Config SUPERSEDED → crate air-config dédiée (Cap’n Proto, ADR-040/041). air-base-lib complet (cœur + services).
air-filesystemdocs/specs/layer-1/air-filesystem.mdImplémenté (PR #87, par carbon) — 6 sections sur la couche 0 (fs + fs::inotify), zéro dépendance externe, zéro C ; confinement resolve_within (RESOLVE_BENEATH), écriture atomique (fsync fichier+parent), AirTempDir RAII, copie (copy_file_range+repli), watchers (Overflow dédié, debounce, récursif) ; glob maison + property-based + fuzz (glob/watcher) ; couvrable VIDE (gardes défensives ADR-035 in-code). find_regex différé (80 % regex). Couche 1 : 3/8 crates cœur. #![no_std] (ADR-048/ADR-055) : alloc/core (cartes du watcher = BTreeMap/BTreeSet), $TMPDIR lu en octets via air_env, fenêtre de debounce = clock_nanosleep couche 0 (plus de std::thread::sleep) ; prouvé par cargo build --lib, 100 % maintenu.
air-alloc (allocateur global — arène + global allocator)docs/adrs/ADR-056-allocateur-air-alloc-fr.md ; docs/notes/audit-dlmalloc-fr.mdPhases 1 & 2 implémentées (ADR-056) — crate couche 1, #![no_std] (deps air-sys-types+air-sys-syscall, zéro externe). Phase 1 — cœur de l’arène host-testable inspiré de dlmalloc : étiquettes de frontière + fusion O(1), smallbins exacts + table de bits, liste triée des grands blocs (pas de treemap, D5), reliquat dv + frontière top, free-lists intrusives ; segments 64 Kio sous-alloués + cartographie dédiée ≥ 256 Kio (munmap). Trait Backing injectable (prod MmapBacking mmap réel sans MAP_NORESERVE, D7) ⇒ arène mono-thread (Send non Sync) ; property-based (proptest, modèle fantôme) + cargo-fuzz fuzz_air_alloc_arena. Phase 2 — global allocator réel : verrou futex maison (lock::Mutex à 3 états sur air-sys-syscall::futex, pas d’AirMutex, D3) enveloppant une arène globale unique ; GlobalAllocator (impl core::alloc::GlobalAlloc, échec ⇒ null déterministe, D10) ; reset_after_fork (D8). Host-testé à 100 % lignes+branches (arena/chunk/backing/lock/global, zéro exception ; contention déterministe 2 threads + stress N threads). Branché : #[global_allocator] dans rt/air-rt (remplace AbortOnAlloc) + gardien fork air-runtime → air-alloc. « Run réel » débloqué : airrt-selftest exit 42 x86_64 en allouant pour de vrai (thread principal + worker), build aarch64 OK (run raspi à suivre).
air-libm (surface math flottante no_std)docs/adrs/ADR-057-libm-air-fr.mdPosé (ADR-057) — crate couche 1, #![no_std] qui ré-exporte la surface de libm (rust-lang) (pub use libm::*;) : sqrt/cos/pow/hypot/tgamma/lgamma_r/… + Libm<T>. Vendoring en exception nommée à la règle des 80 % (ADR-024, modèle icu4x ; docs/EXCEPTIONS.md) — libm est pur Rust no_std, zéro dépendance transitive, fusionné dans compiler-builtins (le libm de la std pour wasm/no_std), licence MIT, pin =0.2.16. Comble le seul primitif système manquant de l’i18n/libc (audit icu4x §3/§8 : calendrical_calculations + LSTM segmenter via core_mathslibm). Aucun consommateur encore : fondation pour la libc/i18n future (ADR-053). Tests de fumée à valeurs connues (tolérance epsilon) → couverture 100 % (la crate n’a pas de logique propre : un pub use ne génère aucune ligne à manquer ; libm non mesuré, externe). Build *-linux-air prouvé (crate-sonde jetable rt/). Zéro unsafe/as/surface C.
air-memory (allocateurs arena/pool/slab + comptabilité)docs/specs/layer-1/air-memory.mdImplémenté (PR #88, par carbon) — 5 sections : AirMemoryTracker (comptabilité atomique, peak monotone), AirArena (bump, alignement checked_*, contrat reset/Drop non exécuté, unique unsafe // SAFETY:), AirObjectPool (Rc/RefCell, respecte Drop), AirSlab (anti-ABA, génération wrapping_add), AirBacking (heap ; mmap différé) ; zéro dépendance externe, zéro C ; property-based + Miri (test concurrent inclus) ; 100 % lignes+branches hors 1 exception STRUCTURAL (bras None du Drop d’AirPooled, doc in-code). Couche 1 : 5/8 crates cœur.
air-process (processus, pidfd, privsep)docs/specs/layer-1/air-process.mdImplémenté (PR #105)AirCommand/AirProcess (clone3+CLONE_PIDFD, redirections dup3, chdir, execve_prepared, wait synchrone waitid-pidfd, signal/kill), AirPipe, AirExitStatus ; drop_privileges + drop_privileges_to (drop dans l’enfant avant exec, chemin alloc-free async-signal-safe, ordre sûr, regain irréversible prouvé root) ; aucune fn unsafe exposée ; tests réels + 4 tests root + Miri ; 100 % hors exceptions ADR-035 (CHILD-EXIT/STRUCTURAL). A nécessité l’extension couche 0 execve_prepared (re-sceau v1.3). Couche 1 : 8/8 crates cœur. #![no_std] (ADR-055 D2) : core/alloc::ffi, build_envp lit air_env (plus de std::env/std::os::unix) — entre dans la fermeture runtime *-linux-air.
air-poll (multiplexeur d’événements générique)docs/specs/layer-1/air-poll.mdImplémenté (roadmap §5.3 P0.2 ; audit face-libc #14) — crate couche 1 dédiée (le multiplexage n’est ni process- ni socket-spécifique) exposant fidèlement ppoll sur &mut [PollFd] arbitraire : poll(poll_fds, Option<AirDuration>, Option<&SignalMask>) -> AirResult<usize> (écrit les revents en place, rend le nombre de prêts) + ready() (itère les prêts, sans indexation paniquante) + ré-export PollFd/PollEvents/SignalMask. Timeout typé (None = infini, Some(ZERO)/≤0 = sondage), EINTR remonté sans retry (ADR-021), masque de signaux atomique optionnel. Découple le seul affleurement existant (air-process::wait_until, couplé au pidfd). Zéro unsafe exposé, zéro alloc, zéro dépendance externe, #![no_std] ; tests pipes réels ; 100 % hors 1 exception STRUCTURAL in-code (passthrough échec ppoll). Note fuzz : aucune surface de données externes (documenté). select(2) legacy = face-C au-dessus.
air-signal (face signal générique : signalfd, masque, envoi, attente)docs/specs/layer-1/air-signal.mdImplémenté (roadmap §5.3 P0.4 ; doctrine ADR-064) — crate couche 1 dédiée re-exposant fidèlement la face signal couche 0, cadrée par ADR-064. signalfd = face primaire : AirSignalFd (RAII) — create/create_nonblocking/block_and_drain (helper clé-en-main « bloquer + drainer », ADR-064 §3, discipline documentée), as_fd() (→ air-poll), read()/next_pending() (drainage décodé), update_mask, into_fd. Masque per-thread : block/unblock/replace_mask/current_mask + SignalMaskGuard (RAII restaure au Drop). Envoi : send_signal_to_process/_to_thread (kill/tgkill, None = signal 0), raise_signal (thread courant), queue_signal (rt_sigqueueinfo + SignalValue). Attente : wait_for_signal (bloquant) + wait_for_signal_until (borné via air-poll, comble l’EINVAL couche 0). Handler async NON-faute (additif couche-1-v1.2, ADR-066) : install_handler/restore_disposition (seul unsafe exposé — précondition async-signal-safe portée par l’appelant ; brique dual-face que la libc sigaction et le PAL consomment) + pending() (sigpending). Fautes synchrones : action par défaut du noyau — la couche 1 Rust n’installe AUCUN handler de FAUTE (SIGSEGV/SIGFPE/SIGBUS/SIGILL → terminate + core dump, décision BDFL ADR-064) ; install_handler ne les vise jamais. EINTR remonté sans SA_RESTART (ADR-064 §4), aucun état de signal maintenu (ADR-064 §6). Ré-export Signal/SignalMask/SignalFdInfo/SignalFdFlags/SignalValue/SigActionFlags/Pid/Tid. Zéro dépendance externe, #![no_std] ; tests signaux réels sans fork (thread appelant, install de handler déterministe via auto-raise) ; 100 % lignes hors 1 exception in-code (STRUCTURAL next_pending), aucune exception CHILD-EXIT. Note fuzz : décodage kernel en couche 0, aucune surface ici (documenté). Face libc C sigaction/signal = au-dessus (dual-face).
air-thread (threads, mutex/rwlock/sémaphore, MPSC)docs/specs/layer-1/air-thread.mdImplémenté (PR #97)AirThreadBuilder (nom/stack/affinité CPU via couche 0) + AirThreadHandle, AirMutex/RwLock/Semaphore (futex maison, no-poisoning), AirChannel MPSC, atomics ré-exportés ; raw_futex (additif couche-1-v1.2, ADR-066) — primitives futex(2) typées (futex_wait/futex_wake, AirResult) sur un &AtomicU32 externe, brique de pthread_mutex_t/cond_t de la libc et de std::sys du PAL (distinct de runtime_primitives, façade Errno-brute TARGET-ONLY du join runtime) ; aucune fn unsafe exposée ; Miri (35 tests) ; 100 % lignes+branches hors 1 exception STRUCTURAL (usize::try_from(cpu), impossible 64 bits). Couche 1 : 7/8 crates cœur. #![no_std] (ADR-055 D3) : surface livrée pour *-linux-air = sync/channel/runtime_primitives (futex couche 0) ; le spawn ergonomique std::thread (thread.rs) est gardé #[cfg(not(target_env="air"))] (hôte seulement — le spawn Air-natif viendra d’air-runtime + allocateur).
air-socket (sockets + résolution de noms enfichable)docs/specs/layer-1/air-socket.mdImplémenté (PASSE 2, PR #86) — TCP/UDP/Unix (+ passage de FD SCM_RIGHTS), résolution enfichable IPv6-first, client DNS maison RFC 1035 (UDP + repli TCP), sans libc ; parseur DNS fuzzé (fuzz_dns_parse) ; netlink retiré (→ crate air-netlink, couche 1, ADR-079). Zéro dépendance externe, zéro surface C. Couche 1 : 3/8 crates cœur. Déjà #![no_std] (core::net/alloc, std seulement sous #[cfg(test)]) — ADR-048.
air-crypto (primitives cryptographiques)docs/specs/layer-1/air-crypto.mdImplémenté (PR #80, merge f7057dd) — 7 sections sur RustCrypto/dalek, purs Rust, zéro C ; XChaCha20Poly1305 défaut, BLAKE3 différé (enum #[non_exhaustive]) ; KAT de conformité officiels + property-based + zeroize vérifié + fuzz ; couvrable VIDE. Exception crypto nommée (EXCEPTIONS.md, ADR-034). Couche 1 : 2/8 crates cœur.
air-device (énumération/surveillance natives)docs/specs/layer-1/air-device.mdImplémenté (PR #94) — natif sysfs + netlink uevent (groupe KERNEL) + evdev §5 (AirInputDevice), sans libudev/libc ; typés net/block/usb ; next_event couvert par test root réel (uevent synthétique) ; aucune fn unsafe exposée ; 3 cibles fuzz (uevent/sysfs/input) ; production 100 % lignes+branches hors 1 exception STRUCTURAL (write_attribute partiel) + résidus test (ADR-035). Couche 1 : 6/8 crates cœur. Déjà #![no_std] (alloc/core ; test_fixtures.rs #![cfg(test)], std test-only) — ADR-048.
air-netlink (transport netlink générique, sans-IO)docs/specs/layer-1/air-netlink.mdProposition v0.1 (tranché ADR-079, option B couche 1)transport netlink générique (pair d’air-socket) : message framing nlmsghdr, codec d’attributs TLV (rtattr/nlattr, la surface hostile — fuzzée une fois, réutilisée partout), corrélation requête/réponse/dump/ACK. Cœur générique, familles au-dessus (rtnetlink intégré ; nl80211/nftables futurs). Maison, pur Rust, zéro-C, zéro unsafe, zéro tierce ; RAII fd, Send/!Sync. Patron sans-IO 9-composants (Handshaker/Flow absents, Mux/Timer minimaux — marqués). ~15 objets (9 surface + 4 cœur + module rtnetlink). Premier consommateur : air-network::AirNetworkPathMonitor (L2) ; autres : WireGuard/DHCP (L5), air-config (routes), wifi. Additif couche 0 couche-0-v1.11 requis (SocketDomain::Netlink=16 + SocketAddrNetlink, syscalls génériques déjà présents → aucun nouveau syscall). air-device inchangé (migration future possible). Implémentation à suivre
air-runtime (runtime async natif io_uring)docs/specs/layer-1/air-runtime.mdOK (spec v1.0, décisions BDFL validées) — runtime async sans tokio (ADR-023/038/039), modèle buffers possédés + reclaim différé (ADR-028), single-thread → thread-per-core sans work-stealing, multi-crate air-runtime-core/io/time/signal/sync + façade ; air-event (couche 2) en sera la façade C-ABI. Implémentation à suivre
air-config (compilateur config + artefact Cap’n Proto)docs/specs/layer-1/air-config.mdImplémenté — chaîne verticale complète (PR #116/#118/#120, tranches 1-3)3 crates : air-config-compile (parseur source maison fuzzé → bind schema-directed → encodage Cap’n Proto déterministe, conversions checked, secrets zeroizés), air-config-schema (4 domaines .capnp + code généré committé ADR-040, build sans tool C++), air-config (façade : lecteur mmap zéro-copie + vérif magic/checksum/version ; XDG ; générations/switch atomique/rollback ; 5 backends /etc : resolv.conf/hosts, systemd, fstab, passwd/group/shadow — émission swap-atomique + import inverse, PR #120/#122/#125). shadow 0600 dès la création, hashes zeroizés, jamais loggés (tranche 5). Validation cas-réels (PR #126) : corpus de fixtures + comparaison sémantique + harnais advisory /air/etc (fidélité prouvée sur le vrai /etc, zéro secret). Zéro unsafe/as/dép externe/surface C ; fuzz×6 ; 100 % hors exceptions STRUCTURAL. air-config COMPLET. #![no_std] (ADR-048/ADR-055) : air-config-compile (alloc/core, IP littérales via core::net, BTreeSet) ET air-config (cartes shadow/systemd = BTreeMap, IP resolv.conf via core::net, env XDG lu en octets via air_env) prouvés #![no_std] par cargo build --lib ; air-config-schema déjà sans std en code lib. 100 % maintenu.

Spécifications techniques de la couche 2

DocumentLocalisationStatut
air-object (modèle d’objet C-ABI — clé de voûte)docs/specs/layer-2/air-object.mdOK (spec v1.0, décisions BDFL validées)AirObject/AirClass, API C-ABI universelle air_object_* (zéro glue par classe), AirValue (union taguée ; propriété +1 retours / +0 arguments), #[air_class] + AirHandle, propriétés observables, politiques de thread déclarées (Immutable / MainThreadOnly debug-only / ThreadSafe), introspection en prod, libair-object.so (ABI 10 ans). Exception proc-macro (syn/quote/proc-macro2) actée. Chantier découpé (BDFL) AO.1→AO.5 puis AirCom inc.7. ✅ AO.1 IMPLÉMENTÉ : crate crates/air-value/ (couche 2, libair-value.so, header committé include/air_value.h) — AirValue union taguée #[repr(C)] layout figé (24 o : AirValueKind+AirValuePayload ; AIR_STRING/AIR_BYTES refcountés en-tête caché ; AIR_OBJECT opaque délégué à un hook de vtable installé par AO.2) + AirStatus in-band (ADR-045) + règle +1/+0 (AirValueOwned Drop=release/Clone=retain). Conformité ABI C + fuzz + couverture 98,5 %/100 % fn. ✅ AO.2 IMPLÉMENTÉ : crate crates/air-object/ (couche 2, libair-object.so, header committé include/air_object.h) — en-tête figé AirObject (#[repr(C)], 24 o, align 8 : isa/refcount=AtomicU32/flags/reserved), méta-classe opaque AirClass auto-référente (bootstrap métaclasse static, immortelle via AIR_OBJECT_FLAG_STATIC), API air_object_* (alloc refcount 1 + payload zéro-initialisé / retain/release finalize+dealloc / class / is_kind_of chaîne de parenté / root_class / runtime_init), refcount AtomicU32 protocole Arc saturant, smart-pointer Rust AirHandle<T> (Drop=release/Clone=retain). Hook AO.1 branché : runtime_init installe les ops objet dans air-value (preuve bout-en-bout : AIR_OBJECT AirValue retient/relâche réellement l’AirObject). Durcissement conformité ABI (AIR_ABI_CONFORMANCE_REQUIRED=1 en CI, dual gcc+clang) rétro-appliqué à air-value. Couverture 97,7 %/100 % fn (4 lignes = gardes OOM/saturation STRUCTURAL). ✅ AO.3 IMPLÉMENTÉ** : AirClass étendue (opaque côté C) — politique de thread obligatoire AirThreadPolicy (Immutable/MainThreadOnly/ThreadSafe), tables de propriétés (AirPropertyDescriptor/AirPropertyInfo, accesseurs typés get+1/set+0) et de méthodes (AirMethodDescriptor, sélecteur→imp). Surface : air_object_get_property(+1)/set_property(AirStatus)/send_message(+1, dispatch héritée parent)/observe/unobserve ; builder C-ABI air_class_new/_free/_thread_policy ; air_object_set_main_thread (enforcement MainThreadOnly debug-only). Observation (data binding) : registre par objet (tête dans reserved), verrou tournant core pur, notification ancienne/nouvelle sur instantané par valeur (ré-entrance/retrait sûrs) ; wrappers Rust AirObservable<T> + AirNotificationCenter (pub-sub par nom, intra-processus) + centre C-ABI global air_notification_*. Dép ajoutée air-thread (couche 1). Couverture 98,2 % lignes / 98,4 % fn. ✅ AO.4 IMPLÉMENTÉ : premier crate proc-macro d’Air crates/air-object-macros/ (couche 2, [lib] proc-macro = true, build-time only) — attribut #[air_class(thread = …)] générant (à partir d’une struct) le static AirClassCell (via with_members), un AirPropertyDescriptor par champ #[observable] (get +1 / set +0 typés, notification héritée d’air_object_set_property), la politique de thread obligatoire (absente ⇒ erreur de compilation) et Self::air_class() — « zéro glue par classe » (dispatch via les air_object_* génériques). Types de champ gérés v1 : bool/i64/f64 (String/bytes/objet différés : stockage possédé + finaliseur ; méthodes différées : table vide). Macro ré-exportée par air-object (pub use air_object_macros::air_class) ; header committé inchangé (proc-macro n’expose aucun type C ; parse_deps=false). Exception 80 % proc-macro actée (syn/quote/proc-macro2, docs/EXCEPTIONS.mdpolitique proc-macro d’Air). Tests : trybuild compile-fail (.stderr committés) + unités sur expand + e2e air-object/tests/macro_class.rs (classe générée traversant alloc/get/set/observe/send_message/is_kind_of/release + AirHandle). ✅ AO.5 IMPLÉMENTÉ — chantier air-object COMPLET : introspection (spec §7) — registre global de classes (enregistrement paresseux à la 1ʳᵉ air_object_alloc, liste intrusive via registered/next_registered ajoutés à AirClass [opaque côté C ⇒ header inchangé], verrou tournant, zéro alloc heap, désenregistrement par air_class_free). Surface C-ABI : air_class_list_all(tableau possédé, libéré par air_object_free_class_list)/air_class_properties(zéro-copie table AO.3)/air_class_parent/air_class_name/air_class_registered_count/air_object_describe(chaîne possédée bornée sans NUL, libérée par air_object_free_stringallocateur d’Air, pas free(3)). Invariant documenté : classe allouée-depuis = immortelle ou air_class_free. Preuve « zéro glue » Pattern A : conformance.c étendu (hiérarchie C ShapeSquare énumérée/introspectée/décrite par nom découvert, parenté vérifiée, sans code par classe, gcc+clang REQUIRED) + #[air_class] (Widget) sur la même surface. Couverture 97,8 %/98,5 % fn (restant STRUCTURAL). Outillage lourd d’ABI-stabilité (symboles versionnés GNU, air-symver/air-abi-check) hors périmètre (chantier transverse). 🎉 Chantier air-object (AO.1→AO.5) COMPLET ; suite = AirCom inc.7 (call sur AirObject + air-notifyd)
AirCom (IPC natif d’Air — spec couche 2)docs/specs/layer-2/air-com.mdOK (spec v1.0, décisions BDFL validées 2026-07-12) — décline ADR-001 (immuable) sur le motif sans-IO ADR-091. Fige : jeu de crates air-com/air-com-proto/air-com-schema/air-com-codegen/air-registry (nommage acté ADR-029, macro-arch air-aircom* réconciliée) ; wire Cap’n Proto (ADR-040) ; control plane SEQPACKET + data plane memfd/air-shm zero-copy ; capability = fd (SCM_RIGHTS, ADR-010, pas de crypto) ; anatomie 9 composants spécifiée ; deux surfaces sync et async de 1ʳᵉ classe (cœur partagé, test croisé) ; pub-sub par anneau shm (1 producteur/N lecteurs, overwrite best-effort) ; bootstrap air-registry = 1 fd par service + lookup nommé. Fondation implémentée (PR #333, couche-1-v2.1). 7 incréments (§12) IMPLÉMENTÉS : inc.1 (Codec Cap’n Proto + schéma v1), inc.2 (StateMachine multi-états + Multiplexer channelId + Handshaker), inc.3 (transport SEQPACKET bout-en-bout, 2 surfaces sync+async + test croisé), inc.4 (data plane zero-copy + Flow Controller), inc.5 (pub-sub anneau shm), inc.6 (contrat air-registry mock couche 2), ✅ inc.7 — intégration modèle d’objet (call sur AirObject) + 1er service réel air-notifyd : corps d’invocation dédié air-com-schema/invoke.capnp (Call/Return/Error, ajout compatible ADR-012, methodId=sélecteur Text) ; cœur PUR air-com-proto/invoke.rs (no_std, zéro unsafe/panic, objectId/selector opaques §1.1 ; unit+property+fuzz fuzz_air_com_invoke 1,1 M runs 0 crash) ; pilote air-com/object.rs (registre d’export objectId→*mut AirObject retain/release équilibrés, marshalling AirValue↔capnp scalaires v1, dispatch call→send_message→returnMsg/error, Connection::call_object/serve_objects 2 surfaces + test croisé sync↔async) ; arête 2→2 air-com→air-object/air-value ; nouveau crate crates/air-notifyd/ (couche 2, 1er service ADR-001 : classe AirNotifyd méthode notify(title,body)→status + observable count, 2 exécutables aircom_notifyd_{server,client} on-target exit 0). Cible aval air-sshd (ADR-074)
air-event (façade C-ABI de l’event loop async)docs/specs/layer-2/air-event.mdOK (spec v1.0, décisions BDFL validées) — façade C-ABI du runtime air-runtime (L1) : AirEventLoop (single-thread, run/run_once/wakeup), AirFuture (modèle callbacks de complétion — le C ne fait pas await —, refcompté via air-object, annulation sound héritée des buffers possédés), timers/signaux/channels exposés, intégration AirCom + pont sd-event. Implémentation à suivre
air-network (substrat de connexion ≈ Network.framework)docs/specs/layer-2/air-network.mdProposition v0.1substrat de connexion couche 2 visant la couverture fonctionnelle de Network.framework en vocabulaire Air (jamais de copie d’API ; note api-reseau-strategie). Compose air-socket (L1) + air-tls (L2) + air-runtime (L1) ; substrat où se branchent air-http/air-ssh (note réseau §2.5). N’est PAS un protocole filaire (pas de Framer/Codec/StateMachine propres — ceux-ci vivent dans air-tls/air-quic) : il orchestre + pilote l’I/O. ~20 objets : AirConnection (≈NWConnection, async), AirListener, AirBrowser (mDNS), AirParameters/AirProtocolStack (pile déclarative), AirEndpoint, AirNetworkPath/AirNetworkPathMonitor (path-awareness). Sécurité par défaut (secure()=TLS, clair explicite) ; async 1ʳᵉ classe (ADR-038, connexion Send/!Sync). expensive/constrained dérivés (type d’interface + politique — Linux n’a pas de bit noyau, dérivation honnête/testable). Path-monitor tranché (ADR-079) : consomme air-netlink (L1, RtnetlinkClient). Implémentation à suivre
air-quic (QUIC v1 pur Rust, patron sans-IO)docs/specs/layer-2/air-quic.mdProposition v0.1QUIC v1 (RFC 9000/9001/9002) maison, pur Rust, zéro-C, zéro unsafe ; transport d’air-http (h3). Premier protocole Air à exercer les 9 composants sans-IO (flow control + mux natifs). Handshake TLS 1.3 via air-tls (frames CRYPTO), AEAD paquet via air-cryptojamais le record layer TLS (⇒ exige air-tls d’exposer son cœur handshake découplé). ~32 objets (13 surface + 14 cœur + 5 enums). Congestion NewReno (RFC 9002) v1. Chemin d’implémentation à trancher (maison intégral vs distillation quinn-proto) après audit (modèle audit s2n-tls). Connexion Send/!Sync, endpoint démux par Connection ID, thread-per-core (ADR-038/039). Implémentation à suivre
air-mdns (mDNS + DNS-SD pur Rust, patron sans-IO)docs/specs/layer-2/air-mdns.mdProposition v0.1mDNS (RFC 6762) + DNS-SD (RFC 6763) maison, pur Rust, zéro-C/unsafe/tierce ; consommé par air-network::AirBrowser/advertise. Réutilise le codec DNS RFC 1035 fuzzé d’air-socket (zéro duplication de parseur hostile). ~14 objets (8 surface : MdnsBrowser/MdnsResponder/ServiceRegistration/DiscoveredService… + 6 cœur) ; 4 composants absents/triviaux marqués (Handshaker/Flow/Mux absents, Framer trivial). Sécurité = parsing borné + cache plafonné + rate-limit (surface hostile = LAN) ; mDNS n’authentifie rien (par conception) → confiance via air-network/TLS. Async 1ʳᵉ classe. Additifs air-socket requis (codec noms/SRV/TXT/PTR exposés + multicast UDP typé). Implémentation à suivre
air-http (HTTP/1.1 + HTTP/2 + HTTP/3, sans-IO)docs/specs/layer-2/air-http.mdProposition v0.1HTTP/1.1 (RFC 9112) + HTTP/2 (RFC 9113) + HTTP/3 (RFC 9114), h1/h2/h3 = modules internes d’un crate unique (note §4) + WebSocket (RFC 6455/8441). Maison, pur Rust, zéro-C/unsafe ; compose air-tls (h1/h2) + air-quic (h3) + air-network. Surface unifiée Request/Response/Body (version par ALPN). ~33 objets (14 surface + 15 cœurs sans-IO + 4 enums). Sécurité : anti-smuggling (h1), HPACK/QPACK bornés (anti-bomb), anti rapid-reset (CVE-2023-44487), TLS obligatoire h2/h3. Async 1ʳᵉ classe. Ordre : h1 → h2 → h3. Implémentation à suivre
air-ssh (SSH maison, moderne-only, sans-IO)docs/specs/layer-2/air-ssh.mdProposition v0.1 (cadrée ADR-043)SSH maison, memory-safe, zéro-C (pas russh ; crypto via air-crypto). RFC 4250-4254/4256 + certificats. Strict kex anti-Terrapin (CVE-2023-48795) dès le départ, moderne uniquement (legacy omis : SHA-1/CBC/RC4/3DES/ssh-rsa/ssh-dss). Kex X25519 + sntrup761 hybride PQ ; AEAD chacha20-poly1305/aes-gcm ; auth publickey (Ed25519/ECDSA/cert)/keyboard-interactive. ~30 objets (12 surface + 13 cœur + 5 enums), SFTP en subsystem. Memory-safety ⇒ classe regreSSHion éliminée. Client (ssh/scp/sftp) avant serveur ; sshd différé (audit externe requis). Additif air-crypto sntrup761 à instruire. Async 1ʳᵉ classe, session Send/!Sync, secrets zeroize. Implémentation à suivre
air-wireguard (VPN WireGuard, sans-IO)docs/specs/layer-2/air-wireguard.mdProposition v0.1WireGuard (Noise IKpsk2) maison, pur Rust, zéro-C/unsafe ; crate-lib (cœur sans-IO) + daemon L5. Moderne par conception (un seul jeu d’algos → pas de downgrade). Crypto via air-crypto : X25519 ✓, ChaCha20Poly1305 ✓, + additif BLAKE2s requis (hash/MAC/KDF ; air-crypto v1 a blake3, pas blake2 — à instruire). ~15 objets (cryptokey routing PeerTable, NoiseIk, ReplayWindow anti-rejeu, cookie anti-DoS, secrets zeroize). Dépend d’une interface TUN (couche 0/air-device, additif). Interop kernel WireGuard/wireguard-go. Implémentation à suivre
air-mail (SMTP + POP3 + IMAP4 client, sans-IO)docs/specs/layer-2/air-mail.mdProposition v0.1 — client mail : SMTP (soumission RFC 5321/6409), POP3 (RFC 1939), IMAP4rev2 (RFC 9051) en 3 modules internes d’un crate unique (codec-ligne + SASL + TLS partagés, comme air-http). Maison, pur Rust, zéro-C ; compose air-tls/air-network. ~20 objets. Sécurité : TLS d’abord (jamais d’AUTH en clair ; anti STARTTLS-stripping → TLS implicite 465/993/995 préféré), SASL moderne (SCRAM-SHA-256/OAUTHBEARER ; PLAIN sous TLS only) ; en-têtes RFC 5322 parsés bornés (anti CRLF-injection). Additif air-crypto possible : PBKDF2 (si SCRAM ; sinon OAUTHBEARER token sans PBKDF2). Implémentation à suivre
air-tls (contingence maison — TLS 1.3 pur Rust)docs/specs/layer-2/air-tls.mdProposition v0.1 (spec de contingence) — instruit l’option air-tls maison gardée ouverte par ADR-042 §Contingence (la production reste rustls + aws-lc-rs, non remplacée ; bascule = RFC). TLS 1.3 uniquement (RFC 8446), legacy vulnérable omis par conception ; zéro crate tierce, zéro C, zéro unsafe (seules std + crates Air ≤ L1 ; primitives via air-crypto, jamais réimplémentées). Patron sans-IO 9-composants (note réseau §2.2) : Framer/Codecs (record, handshake, extensions, alertes, X.509/ASN.1 borné)/StateMachine/KeySchedule/Timers/Secrets zeroizés/Extensions. Machine à états mono-propriétaire multi-thread (connexion Send/!Sync sans verrou ; Config Arc Send/Sync, thread-per-core ADR-038). ~61 objets inventoriés (25 surface publique reprenant les familles s2n + 8 traits + 13 cœur + 6 traits crypto + 6 enums). Conformance = RFC 8448/BoGo/tlsfuzzer/interop/fuzz (registre docs/tls-conformance.md à créer). Additifs air-crypto requis (AES-128-GCM, ECDSA, RSA-PSS vérif., ML-KEM-768). Implémentation à suivre

Spécifications techniques de la couche 4

DocumentLocalisationStatut
Noyau air-tui 1.0docs/specs/layer-4/air-tui-core.mdOK
API conceptuelle air-tui-runtimedocs/specs/layer-4/air-tui-runtime-api.mdOK
air-url (chargement d’URL haut niveau ≈ URLSession)docs/specs/layer-4/air-url.mdProposition v0.1 — équivalent URLSession (couverture fonctionnelle, vocabulaire Air, jamais de copie d’API) : sessions + tâches (data/download/upload/WebSocket), cache HTTP (RFC 9111), cookies (RFC 6265 SameSite/Secure), défis d’auth + cert pinning, transferts en arrière-plan. Bâti sur air-http + air-network ; pas un protocole (orchestration applicative). ~16 objets. Sécurité : TLS défaut, cookies sûrs, cache correct, redirections validées (credential-stripping). Couche 4 (fondation) + nom air-url RATIFIÉS (ADR-084 — couche 4 élargie « UI + fondation », amende la macro-archi). Implémentation à suivre

Spécifications techniques de la couche 5 (services système réseau)

DocumentLocalisationStatut
air-dhcp (client DHCPv4/DHCPv6 + SLAAC)docs/specs/layer-5/air-dhcp.mdProposition v0.1 — client de config réseau auto (DHCPv4 RFC 2131, DHCPv6 RFC 8415, RA/SLAAC), crate-lib sans-IO + daemon .airservice. Applique le bail via air-netlink (adresses/routes) + air-config (DNS). ~12 objets. Options bornées + fuzzées (LAN hostile). Additifs : socket ICMPv6 brut (SLAAC), SO_BROADCAST typé. Implémentation à suivre
air-ntp (client NTP/SNTP + NTS)docs/specs/layer-5/air-ntp.mdProposition v0.1 — client de synchronisation d’horloge (SNTP RFC 5905 + NTS RFC 8915, temps authentifié via air-tls). Discipline d’horloge bornée (anti-saut). ~10 objets. Additif couche 0 : réglage horloge privilégié (clock_settime/adjtimex). Implémentation à suivre

Documents de setup phase 0

DocumentLocalisationStatut
Phase A : Décisions techniquesdocs/setup/phase-A-decisions.mdOK
Phase B1 : Structure et styledocs/setup/phase-B1-structure.mdOK
Phase B2 : Conventions opérationnellesdocs/setup/phase-B2-operations.mdOK
Phase C : Infrastructuredocs/setup/phase-C-infrastructure.mdOK
Phase D : Communautédocs/setup/phase-D-community.mdOK

Point d’attention — Statut de la macro-architecture

La macro-architecture a fait l’objet d’une passe 1 de nettoyage (2026-05-20) qui a :

  • Aligné la section 2 (couche 0) sur les ADRs phase 0 (ADR-019 modèle d’erreurs, ADR-020 stratégie signaux, ADR-021 conventions transverses, ADR-022 architecture io_uring) et sur le découpage acté en deux crates air-sys-types + air-sys-syscall.
  • Neutralisé toutes les références prospectives ADR-018 à ADR-026 en marqueurs neutres (« ADR à produire — service [X] »). Les ADRs services système couche 5 recevront leur numéro définitif au moment de leur instruction (numéros ≥ ADR-028 ; ADR-027 est pris par la stratégie de documentation polyglotte).

Une passe 2 de complétion reste à mener plus tard, en parallèle de l’implémentation : enrichir les sections couches 1 à 5 avec les détails issus des ADRs et specs récents (notamment les conventions transverses dans le code couche 1, l’articulation détaillée AirCom/io_uring/runtime async, etc.).

Travaux à reprendre

Travaux prioritaires (à reprendre en premier)

  1. CONTRIBUTING.md détaillé
    • Localisation : CONTRIBUTING.md à la racine du repo.
    • Périmètre : guide complet de contribution avec workflow Git, conventions, DCO, processus RFC.

Spec détaillée du module io_uring (9 documents)

À produire au niveau de détail des autres specs de familles :

  1. docs/specs/layer-0/io-uring-1-core.md (Temps 1 : cœur API)
  2. docs/specs/layer-0/io-uring-2a-filesystem.md (Temps 2a : 21 opérations FS)
  3. docs/specs/layer-0/io-uring-2b-network.md (Temps 2b : 8 opérations réseau)
  4. docs/specs/layer-0/io-uring-2c-async.md (Temps 2c : 9 opérations async)
  5. docs/specs/layer-0/io-uring-3a-registration.md (Temps 3a : registration)
  6. docs/specs/layer-0/io-uring-3b-linked.md (Temps 3b : linked)
  7. docs/specs/layer-0/io-uring-3c-multishot.md (Temps 3c : multishot)
  8. docs/specs/layer-0/io-uring-3d-shared.md (Temps 3d : shared)
  9. docs/specs/layer-0/io-uring-4-raw.md (Temps 4 : raw)

Référence : ADR-022 + io-uring-overview.md.

Documents de conventions formels (mise en forme depuis Phases B et C)

  1. STYLE_GUIDE.md à la racine (depuis Phase B1).
  2. TESTING_GUIDE.md à la racine (depuis Phase B2 section 1).
  3. ERROR_HANDLING.md à la racine (depuis Phase B2 section 2 + ADR-019).
  4. COMMIT_CONVENTIONS.md à la racine (depuis Phase B2 section 3).
  5. PR_REVIEW_GUIDE.md à la racine (depuis Phase B2 section 3).
  6. RELEASE_PROCESS.md à la racine (depuis Phase C section 3).
  7. INFRASTRUCTURE.md à la racine (depuis Phase C section 2).

Spec exhaustive de air-sys-types

  1. Compléter docs/specs/layer-0/air-sys-types.md avec spec type par type (méthodes, invariants, tests). Probablement à produire en parallèle de l’implémentation effective de la crate.

Documents de la communauté

  1. docs/guides/first-contribution.md : guide pas-à-pas du premier patch.
  2. docs/guides/getting-started/ : guides de démarrage pour différents profils.
  3. SECURITY.md à la racine : politique de divulgation des vulnérabilités.
  4. CODE_OF_CONDUCT.md à la racine : Contributor Covenant 2.1 (texte officiel).
  5. CHANGELOG.md à la racine : démarrage avec section [Unreleased].

Documents internes mainteneurs

  1. docs/maintainers/release-process.md : procédure de release détaillée.
  2. docs/maintainers/moderation.md : procédure de modération.
  3. docs/maintainers/onboarding-maintainers.md : onboarding nouveau mainteneur.
  4. docs/maintainers/cve-handling.md : gestion des CVEs.

Statistiques globales

CatégorieNombre
Documents fondateurs existants8 (vision FR/EN, charte FR/EN, principes FR/EN, registre, macro-architecture)
ADRs fondateurs + ADR-018 imagerie18 (+ ADR-012-bis)
ADRs phase 0 instruits7 (ADR-019 à ADR-025)
ADRs post-phase 0 instruits64 (ADR-026 → ADR-089, série continue)
ADRs proposés à rédigerADRs services système couche 5 (numérotation à assigner ≥ 090) + ADRs ouverts identifiés au registre
Specs couche 0 produites13 familles (process, fs, mem, signal, time, net, ipc, security, system, device, ebpf) + io_uring (maître + 13 Temps)
Specs couche 0 à compléterair-sys-types exhaustif (type par type). Toutes les familles sont désormais spécifiées.
Documents de setup phase 05
Documents à produire~27

Statistiques techniques (estimées)

ÉlémentEstimation
ADRs au total (état actuel)90 (017 fondateurs + 012-bis + 018 imagerie + 019-025 phase 0 + 026-089 post-phase 0, série continue). ADRs services système couche 5 à instruire ultérieurement (numéros ≥ 090, non pré-réservés)
Fonctions wrapper en couche 0~213
Types publics dans air-sys-types~187
Syscalls Linux wrappés~180-200 sur 460 disponibles
Crates Air planifiées~30-40 selon les phases

Pour les conversations futures

Quand tu démarres une nouvelle session sur Air, pointe Claude vers ce document docs/INDEX.md comme premier point de référence. Claude pourra ainsi rapidement :

  1. Comprendre ce qui existe déjà.
  2. Comprendre ce qui reste à produire.
  3. S’orienter dans la hiérarchie de documentation.

Suggestion de prompt initial :

« Bonjour, on continue le travail sur Air. Lis docs/INDEX.md pour comprendre l’état actuel du projet, puis on va travailler sur [sujet à préciser]. »

Ordre de priorité suggéré pour les travaux futurs

Court terme :

  1. README final + CONTRIBUTING — pour que le repo soit présentable.

Moyen terme (avant ouverture publique) :

  1. SECURITY.md, CODE_OF_CONDUCT.md, CHANGELOG.md.
  2. Documents de conventions formels (mise en forme).
  3. Configuration GitHub Actions de base.

Plus tard (en parallèle de l’implémentation) :

  1. Spec détaillée io_uring (9 documents).
  2. Spec exhaustive air-sys-types.
  3. Documents internes mainteneurs.

Licence du document : MPL 2.0 Statut : Document de référence et checklist. Version 1.4 — passe post-M5 (2026-07-10) : inventaire ADRs porté à 087, sceaux couche-0-v1.12 / couche-1-v1.9, jalon std-sur-Air atteint.