# Delta 0.3.5-alpha.5 ## Base requise `0.3.5-alpha.4.fix.1`, validée par l'utilisateur le 2026-09-21 avec fmt, audits, `cargo check`, Clippy strict, les sept tests du contrat realtime commun et les vingt tests WebTransport. La preuve est enregistrée dans `history/0.3.5/alpha.4.fix.1.md`. ## Objectif Fermer la preuve runtime native WebTransport hors harness de test sans ajouter de fonctionnalité à la bibliothèque. Cette tranche doit démontrer avec les APIs publiques réellement distribuées que le chemin localhost complet fonctionne depuis un exécutable normal : TLS local, pinning, session WebTransport, stream fiable principal, contrat realtime commun, round-trip bidirectionnel et fermeture propre. ## Version La version workspace passe à : ```text 0.3.5-alpha.5 ``` ## Launcher technique Nouvelle crate : ```text crates/apps/game-realtime-webtransport-smoke ``` Elle dépend uniquement de : ```text game-logging-lib game-realtime-transport-lib game-realtime-webtransport-lib tokio tracing ``` Aucune nouvelle dépendance externe n'est introduite. Le launcher : 1. initialise le tracing commun ; 2. génère une identité TLS loopback ECDSA P-256 courte durée en mémoire ; 3. dérive le hash SHA-256 exact exposé par cette identité ; 4. bind le listener WebTransport sur `127.0.0.1:0` ; 5. construit le client `https:///smoke` avec ce hash pin ; 6. établit simultanément les sessions client et serveur ; 7. ouvre/accepte le stream bidirectionnel primaire ; 8. échange un payload client puis un payload serveur via le contrat `RealtimeConnection` ; 9. ferme proprement le sender client et vérifie `Closed` côté serveur ; 10. ferme proprement le sender serveur et vérifie `Closed` côté client ; 11. imprime exactement : ```text game-realtime-webtransport-smoke: PASS ``` Une deadline globale de 10 secondes empêche le smoke de rester bloqué indéfiniment. ## Frontière de dépendances Le backend WebTransport est désormais consommé par un launcher technique public, ce qui est intentionnel. Il doit toujours rester absent des crates engine et gameplay. Le graphe inverse attendu peut donc contenir : ```text game-realtime-webtransport-lib game-realtime-webtransport-smoke ``` mais aucune crate `engine-v1-*`, `game-snake-poc` ou `game-reflex-poc`. ## Fichiers modifiés ```text Cargo.toml README.md docs/plans/005-V0_3_5_WEBTRANSPORT_QUIC_POC_PLAN.md ``` Nouveaux fichiers : ```text crates/apps/game-realtime-webtransport-smoke/Cargo.toml crates/apps/game-realtime-webtransport-smoke/src/main.rs deltas/0.3.5/alpha.5.md history/0.3.5/alpha.4.fix.1.md ``` ## Validation attendue ```bash cargo fmt --all cargo fmt --all -- --check python3 scripts/audit_rust_workspace_rules.py python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates Android Web deltas history python3 scripts/audit_distribution_layout.py cargo check --workspace cargo clippy --workspace --all-targets --all-features -- -D warnings cargo test -p game-realtime-transport-lib --all-targets --all-features cargo test -p game-realtime-webtransport-lib --all-targets --all-features cargo run -p game-realtime-webtransport-smoke cargo tree -p game-realtime-webtransport-smoke --edges normal cargo tree -i game-realtime-webtransport-lib --workspace --edges normal ``` Le smoke doit se terminer avec : ```text game-realtime-webtransport-smoke: PASS ``` ## Après validation Créer `history/0.3.5/alpha.5.md` à partir des sorties réellement fournies, puis ouvrir `0.3.5-alpha.6` pour le chemin WASM compilable. Le smoke navigateur/TLS réel reste réservé à `alpha.7`.