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éfixeADR-, numéro à 3 chiffres, titre en kebab-case, suffixe de langue-frou-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
| Document | Localisation | Statut |
|---|---|---|
| Vision (FR) | docs/vision/vision-fr.md | OK |
| Vision (EN) | docs/vision/vision-en.md | OK |
| Charte (FR) | docs/charte/charte-fr.md | OK |
| Charter (EN) | docs/charte/charter-en.md | OK |
| Principes d’ingénierie (FR) | docs/principes-ingenierie/principes-ingenierie-fr.md | OK |
| Engineering Principles (EN) | docs/principes-ingenierie/engineering-principles-en.md | OK |
| Registre des ADRs (v3.36) | docs/adrs/registre-adrs-fr.md | OK |
| Macro-architecture des 6 couches | docs/architecture/macro-architecture-fr.md | Passe 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
| ADR | Titre | Localisation | Statut |
|---|---|---|---|
| 019 | Modèle d’erreurs hybride à deux niveaux | docs/adrs/ADR-019-modele-erreurs-fr.md | OK |
| 020 | Stratégie signaux signalfd par défaut | docs/adrs/ADR-020-strategie-signaux-fr.md | OK |
| 021 | Conventions transverses de la couche 0 | docs/adrs/ADR-021-conventions-couche-0-fr.md | OK |
| 022 | Architecture du module io_uring | docs/adrs/ADR-022-architecture-io-uring-fr.md | OK |
| 023 | Runtime asynchrone Air sur io_uring | docs/adrs/ADR-023-runtime-air-fr.md | OK |
| 024 | Workflow de gestion des dépendances | docs/adrs/ADR-024-workflow-dependances-fr.md | OK |
| 025 | Stratégie de builds reproductibles | docs/adrs/ADR-025-builds-reproductibles-fr.md | OK |
ADRs post-phase 0
| ADR | Titre | Localisation | Statut |
|---|---|---|---|
| 026 | Contrat 1.0 d’air-tui : UI texte riche, cellulaire, capability-gated | docs/adrs/ADR-026-contrat-air-tui-fr.md | OK |
| 027 | Stratégie de documentation polyglotte (ABI C et bindings multi-langages) | docs/adrs/ADR-027-doc-polyglotte-fr.md | OK |
| 028 | Soundness et téardown du module io_uring (S1/S2/S3), complète ADR-022 | docs/adrs/ADR-028-soundness-io-uring-fr.md | OK |
| 029 | Nommage de la surface publique : explicite, sans abréviation ; noms d’autorité conservés | docs/adrs/ADR-029-nommage-surface-publique-fr.md | OK |
| 030 | Périmètre de la règle des 80 % : production vs test-only (companion ADR-024) | docs/adrs/ADR-030-dependances-test-only-fr.md | OK |
| 031 | Mesure de couverture en root sur les runners self-hosted (ebpf, uinput) | docs/adrs/ADR-031-couverture-root-ci-fr.md | OK |
| 032 | Préservation des données confiées : zéro discard silencieux (Méthode) | docs/adrs/ADR-032-zero-discard-donnees-fr.md | OK |
| 033 | Modèle de configuration : source typée, compilation validée, artefact binaire (Architecture) | docs/adrs/ADR-033-modele-configuration-fr.md | OK |
| 034 | Discipline des dépendances cryptographiques (companion ADR-024) | docs/adrs/ADR-034-discipline-dependances-crypto-fr.md | OK |
| 035 | Taxonomie des exceptions de couverture (companion ADR-031) | docs/adrs/ADR-035-taxonomie-exceptions-couverture-fr.md | OK |
| 036 | Filtrage 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.md | OK |
| 037 | CI 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.md | OK |
| 038 | Modè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.md | OK |
| 039 | Nommage & 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.md | OK |
| 040 | Format de l’artefact binaire de configuration : Cap’n Proto (companion ADR-033) | docs/adrs/ADR-040-format-artefact-config-capnproto-fr.md | OK |
| 041 | Coexistence /etc : projection générée, lecture seule sélective, air-config seul écrivain (companion ADR-033) | docs/adrs/ADR-041-coexistence-etc-fr.md | OK |
| 042 | Pile TLS : rustls + aws-lc-rs (exception C nommée, étroite), TLS 1.3, air-tls maison en contingence | docs/adrs/ADR-042-pile-tls-rustls-awslc-fr.md | OK |
| 043 | Pile SSH : OpenSSH système en incubation, air-ssh maison à terme (client avant serveur) | docs/adrs/ADR-043-pile-ssh-fr.md | OK |
| 044 | Famille couche 0 poll/ppoll (attente bornée interruptible) | docs/adrs/ADR-044-extension-couche-0-famille-poll-fr.md | OK |
| 045 | Modèle d’erreurs de l’ABI C (AirStatus in-band) | docs/adrs/ADR-045-modele-erreurs-abi-c-fr.md | OK |
| 046 | La libc Air (Rust pur) : périmètre, layering, doctrine | docs/adrs/ADR-046-libc-air-fr.md | OK |
| 047 | Principes de construction de la libc Air | docs/adrs/ADR-047-principes-construction-libc-fr.md | OK |
| 048 | Descellement couche 0 : std-free + futex(2) | docs/adrs/ADR-048-descellement-couche0-std-free-futex-fr.md | OK |
| 049 | Runtime Air : TCB/TLS/démarrage (fondation *-linux-air) | docs/adrs/ADR-049-runtime-tcb-tls-fr.md | OK |
| 050 | Spécification de la cible *-linux-air (phase 1) | docs/adrs/ADR-050-cible-linux-air-spec-fr.md | OK |
| 051 | Descellement couche-0-v1.7 : 7 syscalls runtime & libc (famille arch) | docs/adrs/ADR-051-descellement-couche0-v1.7-libc-fr.md | OK |
| 052 | air-rt = objet couche 1 (AirRuntime), jamais consommateur direct de la couche 0 | docs/adrs/ADR-052-air-rt-objet-couche1-fr.md | OK |
| 053 | La libc Air s’appuie sur icu4x (ctype/locale/i18n) | docs/adrs/ADR-053-libc-sur-icu4x-fr.md | OK |
| 054 | Scission air-base-core (cœur sans i18n) hors d’air-base-lib | docs/adrs/ADR-054-air-base-core-scission-i18n-fr.md | OK |
| 055 | air-thread/air-process en no_std + crate air-env | docs/adrs/ADR-055-nostd-thread-process-air-env-fr.md | OK |
| 056 | Allocateur global air-alloc (couche 1) : inspiré de dlmalloc, simple, possédé — remplace AbortOnAlloc, maillon libc | docs/adrs/ADR-056-allocateur-air-alloc-fr.md | OK |
| 057 | libm 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 encore | docs/adrs/ADR-057-libm-air-fr.md | OK |
| 058 | loom : activation du modèle de concurrence (test-only) | docs/adrs/ADR-058-loom-modele-concurrence-fr.md | OK |
| 059 | Stratégie i18n : Air utilise icu4x (Option V) | docs/adrs/ADR-059-i18n-strategie-option-v-icu4x-fr.md | OK |
| 060 | Descellement couche 0 : famille termios/tty | docs/adrs/ADR-060-descellement-couche0-termios-tty-fr.md | OK |
| 061 | Architecture AirTerminal : modèle canonique + codecs | docs/adrs/ADR-061-architecture-air-terminal-fr.md | OK |
| 062 | Sceau couche-1-v1.0 : gel de l’API Rust de la couche 1 | docs/adrs/ADR-062-sceau-couche-1-fr.md | OK |
| 063 | Instrumentation IO couche 1 (debug) : registre de handles & cohérence fork | docs/adrs/ADR-063-instrumentation-io-couche-1-fr.md | OK |
| 064 | Doctrine des signaux couche 1 : signalfd primaire, fautes → défaut (zéro unsafe) | docs/adrs/ADR-064-signaux-doctrine-couche-1-fr.md | OK |
| 065 | Descellement additif couche-1-v1.1 : AirRuntime::errno_location (délégation de re-sceau) | docs/adrs/ADR-065-descellement-couche1-v1.1-fr.md | OK |
| 066 | Descellement additif couche 0 : rt_sigaction non-faute (async réel) + rt_sigpending + trampoline | docs/adrs/ADR-066-descellement-couche0-sigaction-async-fr.md | OK |
| 067 | air-account (couche 1) : comptes /etc/passwd+/etc/shadow+/etc/group, bindée par la libc | docs/adrs/ADR-067-air-account-couche1-fr.md | OK |
| 068 | Surface fine credentials (uid/gid) en couche 1 (air-process), bindée par la libc | docs/adrs/ADR-068-credentials-couche1-fr.md | OK |
| 069 | Registre de handles fd-général (couche 1, air-handle) + moteur socket, façades PAL & libc | docs/adrs/ADR-069-registre-handles-fd-moteur-socket-fr.md | OK |
| 070 | Descellement additif couche 0 : codec sockaddr public pour la face libc | docs/adrs/ADR-070-descellement-couche0-sockaddr-libc-fr.md | OK |
| 071 | Descellement additif couche 0 : setsockopt/getsockopt entiers publics (face libc) | docs/adrs/ADR-071-descellement-couche0-sockopt-libc-fr.md | OK |
| 072 | CI : x86_64 runner primaire, aarch64 cross-check + natif sur main (révise ADR-037) | docs/adrs/ADR-072-ci-x86-primaire-aarch64-crosscheck-fr.md | OK |
| 073 | Doctrine de configuration binaire : pas de conf en texte clair, CLI + mot de passe admin | docs/adrs/ADR-073-configuration-binaire-doctrine-fr.md | OK |
| 074 | Vision air-sshd : démon SSH natif async, wire-compat OpenSSH, conf binaire, profil moderne | docs/adrs/ADR-074-air-sshd-vision-fr.md | OK |
| 075 | Fourniture du PAL : std::sys::pal::air via rust-src patché + build-std, upstream Tier-3 | docs/adrs/ADR-075-fourniture-pal-rust-src-patche-fr.md | OK |
| 076 | std 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.md | OK |
| 077 | Managers de domaine couche 1 : surface objet médiatrice des toits libc + PAL | docs/adrs/ADR-077-managers-domaine-couche1-fr.md | OK |
| 078 | Descellement additif couche-1 : additifs crypto pour air-tls (ECDSA/RSA-PSS/ML-KEM/AES-128) — earmark v1.10 | docs/adrs/ADR-078-descellement-couche1-v1.7-crypto-air-tls-fr.md | OK |
| 079 | air-netlink (couche 1) : transport netlink générique + descellement couche 0 (AF_NETLINK) | docs/adrs/ADR-079-air-netlink-couche1-fr.md | OK |
| 080 | Additifs air-socket : multicast UDP typé + codec DNS SRV/TXT/PTR + setsockopt structuré | docs/adrs/ADR-080-additifs-air-socket-multicast-dns-fr.md | OK |
| 081 | Additifs crypto air-quic/air-ssh : primitives lowlevel (AES bloc, ChaCha20, Poly1305) + RSA PKCS#1 v1.5 | docs/adrs/ADR-081-additifs-crypto-quic-ssh-fr.md | OK |
| 082 | Additifs crypto : AEAD à nonce explicite + BLAKE2s (WireGuard) + PBKDF2 (SASL/SCRAM) | docs/adrs/ADR-082-additifs-crypto-wireguard-mail-aead-nonce-fr.md | OK |
| 083 | Additifs couche 0 : TUN (TUNSETIFF) + adjtimex (discipline horloge) | docs/adrs/ADR-083-additifs-couche0-tun-adjtimex-fr.md | OK |
| 084 | Ratification air-url : couche 4 élargie (UI + fondation) | docs/adrs/ADR-084-ratification-air-url-couche4-elargie-fr.md | OK |
| 085 | Descellement couche 0 cumulé : primitives manquantes pour la face libc (chantier B) | docs/adrs/ADR-085-descellement-couche0-cumule-libc-std-fr.md | OK |
| 086 | Introspection thread cible pour la face libc : TLS dynamique, bornes de pile, auxv (M5) | docs/adrs/ADR-086-introspection-thread-cible-libc-fr.md | OK |
| 087 | syscall générique (raw_syscall) : escape hatch temporaire pour le pal std (M5) — À RETIRER | docs/adrs/ADR-087-syscall-escape-hatch-a-retirer-fr.md | OK (dette ouverte) |
| 088 | std 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.md | OK |
| 089 | Ré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.md | OK |
Spécifications techniques de la couche 0
🔒 COUCHE 0 — SCELLÉE le 2026-06-14 (tag
couche-0-v1), re-scelléecouche-0-v1.1(errno additif, PR #77),couche-0-v1.2(extension exec/redirectionexecve/execveat/dup3/fchdir/chdir/exit_group, PR #100),couche-0-v1.3(execve_prepared— exec sans alloc pour air-process, PR #104), puiscouche-0-v1.4le 2026-06-25 (faccessathonore réellement ses flags viafaccessat2SYS 439 — ,couche-0-v1.5(famillepoll/ppoll— attente synchrone bornée interruptible, ADR-044, PR #129), puiscouche-0-v1.6le 2026-06-28 : la couche 0 devientstd-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), famillefutex(2)(PR #147),std-free (ffi→alloc/core,OsString→octets,FutexMutex, PR #149) etclone3spawn de thread (clone_thread+ trampoline asm 2-arches, joinCHILD_CLEARTID, PR #150) — ADR-048 + Amendement 1 ; jalons antérieurs conservés) ; puiscouche-0-v1.7(famillearch—arch_prctlset_fs/get_fsTLS x86_64, ADR-051/052) ; puiscouche-0-v1.8le 2026-07-02 (familleterminal—termios/ttycomplète : attributstcgetattr/tcsetattr, contrôle-lignetcdrain/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 enfantsetsid; ADR-060, PRs #200–#204 ; 1 exception CHILD-EXIT) ; puiscouche-0-v1.9(signaux async, ADR-066),couche-0-v1.10(sockaddr/sockopt libc, ADR-070/071),couche-0-v1.11le 2026-07-09 (additifs cumulés libc/std —chroot/killpg/sigaltstack+AltStack/sendfile/fchmod/fchown/futimens/munmap_raw, ADR-085), puiscouche-0-v1.12le 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 + extensionsMmapRegion/privsep/fs::inotify/ affinité CPU/exec/faccessat2), barrière complète verte sur 2 arches (x86_64speedy, aarch64raspi-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 blocunsafe, doc développeur FR + EN. Le socle syscall n’évolue plus que par RFC (ADR-015) ; les constantesErrnopeuvent être complétées additivement par les besoins des contrats couche 1 landés (re-sceauvX.Y, jalons antérieurs conservés). Couche 1 — 8/8 CRATES CŒUR IMPLÉMENTÉ :air-base-libcœ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-libservices (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 — crateair-account) ; v1.4/v1.5 (credentials + drop_to_user, ADR-068),couche-1-v1.6(air-handle + moteur socket, ADR-069),couche-1-v1.7le 2026-07-09 (Managers de domaine ADR-077 +AirSignalManager, chantier B),couche-1-v1.8le 2026-07-09 (air-process::spawn_process, socleposix_spawn, chantier B),couche-1-v1.9le 2026-07-10 (introspection thread cible —air-runtime::process_context[auxv+bornes de pile] +AirProcessManager::resource_limit, socle degetauxval/pthread_getattr_npde 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-runtimeasync 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 remodelos_strenv/args (#218). HORS sceau : C-ABI (air-base-capi+ libc, régime air-stable) · PALstd::sys· toolchain C/C++. Évolution ensuite par descellement additifv1.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(cdylibhost-only, l’artefactlibair_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 deformatprintf, couvert à 100 %, surface format-string N°1) etcrates/air-libc-alloc(logiquemalloc/free/…, couvert à 100 %) ; les primitivesmem*/str*(#![no_builtins]) danscrates/air-libc-strmem. Seulair-libc-capiporte les shims#[no_mangle] extern "C"(qui délèguent), exclu du gate de couverture (commeair-libc-strmem) car ces symboles surchargent le runtime de couverture LLVM. Régime air-stable —errnoC-ABI (__errno_location+E*) +crt(__libc_start_main/air_main) câblé surair_runtime::start::bootstrap; registrelibc-conformance.md; harnais on-targetrt/crates/airlibc-return42(return 42). 1er additifv1.xrévélé :AirRuntime::errno_location() -> *mut i32(RFC de descellement à ratifier). Caveats de sceau résorbés post-sceau (PR #66, merge380d389) : gates qualité gravés encargo 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 desfichier:lignedu 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-syscallscertifie 161 numéros conformes (2 arches, 0 écart).
| Document | Localisation | Statut |
|---|---|---|
| Introduction (développeurs) — présentation de la couche 0, où trouver quoi, encart « dev C/C++ » | docs/specs/layer-0/introduction-fr.md | OK |
Crate air-sys-types (partiel) | docs/specs/layer-0/air-sys-types.md | OK (avec TODO) |
Famille process | docs/specs/layer-0/family-process.md | OK |
Famille arch | docs/specs/layer-0/family-arch.md | Implé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 fs | docs/specs/layer-0/family-fs.md | OK |
Famille mem | docs/specs/layer-0/family-mem.md | OK |
Famille signal | docs/specs/layer-0/family-signal.md | OK |
Famille time | docs/specs/layer-0/family-time.md | OK |
Famille net | docs/specs/layer-0/family-net.md | OK |
Famille ipc | docs/specs/layer-0/family-ipc.md | OK |
Famille security | docs/specs/layer-0/family-security.md | OK |
Famille system | docs/specs/layer-0/family-system.md | OK |
Famille terminal | docs/specs/layer-0/family-terminal.md | Implé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 device | docs/specs/layer-0/family-device.md | OK — uevent/evdev, parsers zéro-alloc (sysfs → fs) |
Famille ebpf | docs/specs/layer-0/family-ebpf.md | OK — bpf() exhaustif (37 cmd) + perf_event_open |
Famille fs — extension inotify | docs/specs/layer-0/family-fs-inotify.md | Implé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é CPU | docs/specs/layer-0/family-process-affinity.md | Implé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 — MmapRegion | docs/specs/layer-0/family-mem-mmap-region.md | Implémenté (PR #31) — a débloqué madvise (2a) + futex (2c) |
Famille process — extension privsep | docs/specs/layer-0/family-process-privsep.md | OK (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.md | Redirection (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.md | OK — validé |
| Module io_uring — Temps 1 (cœur) | docs/specs/layer-0/io-uring-1-core.md | OK — validé |
| Module io_uring — Temps 2a (filesystem) | docs/specs/layer-0/io-uring-2a-filesystem.md | OK — validé |
| Module io_uring — Temps 2b (réseau) | docs/specs/layer-0/io-uring-2b-network.md | OK — validé |
| Module io_uring — Temps 2c (async-spécifiques) | docs/specs/layer-0/io-uring-2c-async.md | OK — validé |
| Module io_uring — Temps 2d (URING_CMD) | docs/specs/layer-0/io-uring-2d-cmd.md | Implé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.md | Implé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.md | Implé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.md | Implé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.md | Implé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.md | Implé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.md | Implé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.md | Implé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.md | OK — 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.md | OK — 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
| Document | Localisation | Statut |
|---|---|---|
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-process ⇒ casse 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.md | Implé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 AirPath ↔ AirString = extension AirPathStringExt. 100 % couvrable VIDE ; fuzz×4 + property-based. |
air-base-lib — services (logging, identifiants) | docs/specs/layer-1/air-base-lib-services.md | Implé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-filesystem | docs/specs/layer-1/air-filesystem.md | Implé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.md | Phases 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.md | Posé (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_maths→libm). 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.md | Implé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.md | Implé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.md | Implé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.md | Implé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.md | Implé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.md | Implé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.md | Implé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.md | Implé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.md | Proposition 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.md | OK (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.md | Implé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
| Document | Localisation | Statut |
|---|---|---|
air-object (modèle d’objet C-ABI — clé de voûte) | docs/specs/layer-2/air-object.md | OK (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.md — politique 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_string — allocateur 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 Shape←Square é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.md | OK (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.md | OK (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.md | Proposition v0.1 — substrat 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.md | Proposition v0.1 — QUIC 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-crypto — jamais 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.md | Proposition v0.1 — mDNS (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.md | Proposition v0.1 — HTTP/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.md | Proposition 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.md | Proposition v0.1 — WireGuard (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.md | Proposition 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.md | Proposition 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
| Document | Localisation | Statut |
|---|---|---|
Noyau air-tui 1.0 | docs/specs/layer-4/air-tui-core.md | OK |
API conceptuelle air-tui-runtime | docs/specs/layer-4/air-tui-runtime-api.md | OK |
air-url (chargement d’URL haut niveau ≈ URLSession) | docs/specs/layer-4/air-url.md | Proposition 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)
| Document | Localisation | Statut |
|---|---|---|
air-dhcp (client DHCPv4/DHCPv6 + SLAAC) | docs/specs/layer-5/air-dhcp.md | Proposition 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.md | Proposition 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
| Document | Localisation | Statut |
|---|---|---|
| Phase A : Décisions techniques | docs/setup/phase-A-decisions.md | OK |
| Phase B1 : Structure et style | docs/setup/phase-B1-structure.md | OK |
| Phase B2 : Conventions opérationnelles | docs/setup/phase-B2-operations.md | OK |
| Phase C : Infrastructure | docs/setup/phase-C-infrastructure.md | OK |
| Phase D : Communauté | docs/setup/phase-D-community.md | OK |
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)
CONTRIBUTING.mddétaillé- Localisation :
CONTRIBUTING.mdà la racine du repo. - Périmètre : guide complet de contribution avec workflow Git, conventions, DCO, processus RFC.
- Localisation :
Spec détaillée du module io_uring (9 documents)
À produire au niveau de détail des autres specs de familles :
docs/specs/layer-0/io-uring-1-core.md(Temps 1 : cœur API)docs/specs/layer-0/io-uring-2a-filesystem.md(Temps 2a : 21 opérations FS)docs/specs/layer-0/io-uring-2b-network.md(Temps 2b : 8 opérations réseau)docs/specs/layer-0/io-uring-2c-async.md(Temps 2c : 9 opérations async)docs/specs/layer-0/io-uring-3a-registration.md(Temps 3a : registration)docs/specs/layer-0/io-uring-3b-linked.md(Temps 3b : linked)docs/specs/layer-0/io-uring-3c-multishot.md(Temps 3c : multishot)docs/specs/layer-0/io-uring-3d-shared.md(Temps 3d : shared)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)
STYLE_GUIDE.mdà la racine (depuis Phase B1).TESTING_GUIDE.mdà la racine (depuis Phase B2 section 1).ERROR_HANDLING.mdà la racine (depuis Phase B2 section 2 + ADR-019).COMMIT_CONVENTIONS.mdà la racine (depuis Phase B2 section 3).PR_REVIEW_GUIDE.mdà la racine (depuis Phase B2 section 3).RELEASE_PROCESS.mdà la racine (depuis Phase C section 3).INFRASTRUCTURE.mdà la racine (depuis Phase C section 2).
Spec exhaustive de air-sys-types
- Compléter
docs/specs/layer-0/air-sys-types.mdavec 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é
docs/guides/first-contribution.md: guide pas-à-pas du premier patch.docs/guides/getting-started/: guides de démarrage pour différents profils.SECURITY.mdà la racine : politique de divulgation des vulnérabilités.CODE_OF_CONDUCT.mdà la racine : Contributor Covenant 2.1 (texte officiel).CHANGELOG.mdà la racine : démarrage avec section[Unreleased].
Documents internes mainteneurs
docs/maintainers/release-process.md: procédure de release détaillée.docs/maintainers/moderation.md: procédure de modération.docs/maintainers/onboarding-maintainers.md: onboarding nouveau mainteneur.docs/maintainers/cve-handling.md: gestion des CVEs.
Statistiques globales
| Catégorie | Nombre |
|---|---|
| Documents fondateurs existants | 8 (vision FR/EN, charte FR/EN, principes FR/EN, registre, macro-architecture) |
| ADRs fondateurs + ADR-018 imagerie | 18 (+ ADR-012-bis) |
| ADRs phase 0 instruits | 7 (ADR-019 à ADR-025) |
| ADRs post-phase 0 instruits | 64 (ADR-026 → ADR-089, série continue) |
| ADRs proposés à rédiger | ADRs services système couche 5 (numérotation à assigner ≥ 090) + ADRs ouverts identifiés au registre |
| Specs couche 0 produites | 13 familles (process, fs, mem, signal, time, net, ipc, security, system, device, ebpf) + io_uring (maître + 13 Temps) |
| Specs couche 0 à compléter | air-sys-types exhaustif (type par type). Toutes les familles sont désormais spécifiées. |
| Documents de setup phase 0 | 5 |
| Documents à produire | ~27 |
Statistiques techniques (estimées)
| Élément | Estimation |
|---|---|
| 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 :
- Comprendre ce qui existe déjà.
- Comprendre ce qui reste à produire.
- S’orienter dans la hiérarchie de documentation.
Suggestion de prompt initial :
« Bonjour, on continue le travail sur Air. Lis
docs/INDEX.mdpour 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 :
- README final + CONTRIBUTING — pour que le repo soit présentable.
Moyen terme (avant ouverture publique) :
- SECURITY.md, CODE_OF_CONDUCT.md, CHANGELOG.md.
- Documents de conventions formels (mise en forme).
- Configuration GitHub Actions de base.
Plus tard (en parallèle de l’implémentation) :
- Spec détaillée io_uring (9 documents).
- Spec exhaustive air-sys-types.
- 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.