ADR-142 — Versionnage lockstep des paquets livrables Air (une seule version de release)
Statut : Accepté (2026-07-30, décision BDFL). RFC de mécanisme
(ADR-015). Complète ADR-012
(qui traite la stabilité ABI de la plateforme, pas le numéro des .deb livrables) et
ADR-095 (packaging).
Catégorie : politique de version + mécanisme (couche packaging / xtask).
Contexte
Les paquets Debian livrables d’Air (air-account, air-keystore, air-sshd, futurs
air-ssh/air-agent) portent chacun un numéro de version. En l’absence de règle, ces
numéros ont dérivé : air-sshd était passé à 0.6.0 (bumps successifs par des sessions
déléguées) pendant que le reste du workspace restait 0.1.0, et xtask/packaging.rs codait
la version en dur — d’où un risque de désynchronisation crate ↔ .deb (leçon #515).
[ADR-012] fixe le versionnage de la plateforme (ABI air-stable, majeur tous les 5–10 ans),
mais rien ne régissait le numéro des paquets livrables.
Directive BDFL (2026-07-30). « Vu qu’on livre de vraies versions de packages, il me faut une vraie gestion cohérente des numéros de version. » → décision : lockstep, prochaine release 0.7.0.
Décision
1. Lockstep : une seule version de release Air, partagée par tous les livrables
Tous les crates du workspace suivent version.workspace ([workspace.package] version du
Cargo.toml racine) — aucun override par crate. Les paquets Debian livrables portent la
même version. Un seul numéro à bumper par release. 0.7.0 est la première release lockstep
(≥ 0.6.0 déjà déployé ⇒ pas de régression de version).
2. Anti-dérive : la version du .deb est dérivée, jamais codée en dur
xtask::packaging::AIR_RELEASE_VERSION = env!("CARGO_PKG_VERSION") — xtask étant un membre du
workspace en version.workspace, cette constante est la version de release. Toutes les
entrées de PACKAGES l’utilisent (version: AIR_RELEASE_VERSION). Il devient impossible que
le .deb diverge de la version des crates (la cause de #515 est structurellement éliminée).
3. Bump : la version + les bornes de dépendances internes
Une release édite [workspace.package] version (racine) — qui pilote tous les package
versions (via version.workspace) et tous les .deb (via AIR_RELEASE_VERSION). Réserve
actuelle : les dépendances inter-crates déclarées { path = "…", version = "X" } (≈300
occurrences) portent une borne qui doit rester satisfiable ⇒ elles se mettent à jour au même
numéro. Tant que cette borne est présente, un bump touche deux familles d’éléments (la version
workspace + ces bornes) — appliquées atomiquement (un sed de release, ou un futur
cargo xtask bump — cf. §Suite). Le vrai « un seul endroit » s’obtient en rendant ces
dépendances path-only (sans borne de version), refactor différé (§Suite). Sémantique
major.minor.patch ([ADR-012]) : mineur = ajouts sans casse (cas courant Air), patch =
correctifs, majeur = rupture (rare, décision BDFL).
Alternatives rejetées
- Semver indépendant par paquet : plus granulaire mais exige un suivi par-paquet et rouvre la porte à la dérive ; Air est une plateforme intégrée livrée d’un bloc — le lockstep est plus simple et cohérent. Rejeté (BDFL).
- Version codée en dur dans
packaging.rs: c’est la cause de #515. Rejeté — dérivée deCARGO_PKG_VERSION. Depends:versionné (air-account (>= 0.7.0)) : en lockstep les livrables partagent la version et sont déployés ensemble ; borne non nécessaire aujourd’hui. Raffinement possible si l’on veut interdire au niveaudpkgde mêler deux releases — différé.
Conséquences
Positives. Numéros cohérents par construction ; zéro dérive crate ↔ .deb ; un seul
point de bump ; fin de l’incohérence air-sshd 0.6.0 vs reste 0.1.0.
Coûts. Un crate qui n’a rien changé « bumpe » quand même à chaque release (assumé : Air est
livré d’un bloc). Le passage 0.1.0 → 0.7.0 de plusieurs crates est un saut cosmétique (aligne
sur le plus haut déployé) — sans incidence ABI (couches non figées, [ADR-012] air-internal).
Suite
- Release 0.7.0 : reconstruire les
.deb(2 arches) et déployerair-account/air-keystore/air-sshd0.7.0sur carbon/speedy/raspi (ordre des dépendances). - Raffinements différés (non bloquants) pour tendre vers le « un seul endroit » : (a) un
cargo xtask bump <version>qui édite atomiquement[workspace.package] versionet les bornes de dépendances internes ; (b) mieux — rendre les dépendances internes path-only (sans borne de version) pour que seul[workspace.package] versionreste à toucher ; (c) un checkxtaskrefusant tout overrideversion = "…"de package par crate (garde-fou du lockstep). - Enregistrement :
SUMMARY.md,registre-adrs-fr.md.