# Delta 0.3.5-alpha.9 ## Base requise `0.3.5-alpha.8.fix.1`, validée par l'utilisateur le 2026-09-22. La gate finale confirme fmt, audits, `cargo check --workspace`, Clippy strict, les deux tests du launcher fallback et le smoke réel terminé par : ```text game-realtime-transport-fallback-smoke: PASS ``` La preuve est enregistrée dans `history/0.3.5/alpha.8.fix.1.md`. ## Objectif Challenger les datagrams WebTransport comme capacité backend-spécifique sans modifier le contrat fiable transport-neutral : - émission/réception native réelle ; - surface équivalente compilable côté navigateur/WASM ; - taille maximale de datagram obtenue depuis la session ; - rejet local des payloads trop grands ; - preuve runtime locale bornée ; - aucune garantie de livraison ou d'ordre ajoutée ; - aucune API datagram dans `game-realtime-transport-lib`. ## Version La version workspace passe à : ```text 0.3.5-alpha.9 ``` ## Capacité backend-spécifique `WebTransportSession` expose désormais sur les chemins natif et navigateur : ```text max_datagram_size() send_datagram(...) receive_datagram() ``` Cette surface reste propre à `game-realtime-webtransport-lib`. Les datagrams WebTransport sont non fiables et non ordonnés. Ils ne satisfont donc pas les invariants de `RealtimeConnection`, qui reste le chemin fiable ordonné commun à WebSocket et WebTransport. Le backend vérifie la taille avant émission et retourne `TransportErrorKind::MessageTooLarge` lorsque le payload dépasse `max_datagram_size()` pour la session courante. `receive_datagram()` n'introduit aucune deadline implicite. Une attente bornée relève du consommateur/POC, car la perte d'un datagram est un résultat valide et ne doit pas être transformée en erreur de protocole commune. ## Natif Le chemin natif utilise directement les primitives de `web-transport-quinn 0.12.1` : ```text Session::max_datagram_size Session::send_datagram Session::read_datagram ``` Un test d'intégration couvre : - session loopback avec pin SHA-256 exact ; - datagram client -> serveur ; - datagram serveur -> client ; - attente bornée côté test ; - rejet local d'un payload supérieur à la taille négociée. ## WASM Le chemin `wasm32-unknown-unknown` expose la même capacité via `web-transport-wasm 0.6.0` : ```text Session::max_datagram_size Session::send_datagram Session::recv_datagram ``` `send_datagram(...)` est asynchrone côté navigateur conformément à la surface du wrapper. La tranche ne réouvre pas le smoke navigateur interactif : `alpha.7.fix.2` reste la preuve navigateur du chemin fiable. La gate WASM de `alpha.9` vérifie que la nouvelle capacité compile sur la cible navigateur. ## Smoke datagram natif Nouveau launcher technique : ```text crates/apps/game-realtime-webtransport-datagram-smoke ``` Le smoke : 1. génère une identité P-256 loopback en mémoire ; 2. bind un serveur WebTransport sur port éphémère ; 3. établit client et serveur avec pin SHA-256 exact ; 4. lit les tailles maximales datagram des deux sessions ; 5. envoie un datagram client -> serveur ; 6. attend sa réception sous une deadline locale de 2 s ; 7. envoie un datagram serveur -> client ; 8. attend sa réception sous la même deadline ; 9. termine par un verdict déterministe. Résultat attendu : ```text game-realtime-webtransport-datagram-smoke: PASS ``` Le smoke ne teste pas l'ordre et ne prétend pas garantir la livraison. Un timeout de réception est reporté comme échec du smoke local, avec un message rappelant explicitement que la livraison datagram n'est pas garantie. ## Frontières Le delta ne modifie pas : - `game-realtime-transport-lib` ; - `RealtimeConnection` / `RealtimeSender` / `RealtimeReceiver` ; - `game-realtime-websocket-lib` ; - le fallback `alpha.8` ; - les engines ; - les crates gameplay. La décision de `alpha.9` est donc : **capacité WebTransport backend-spécifique utile à conserver pour expérimentation/mesure, sans promotion au contrat commun**. ## Fichiers principaux Nouveaux : ```text crates/apps/game-realtime-webtransport-datagram-smoke/Cargo.toml crates/apps/game-realtime-webtransport-datagram-smoke/src/main.rs crates/common/game-realtime-webtransport-lib/tests/datagrams.rs deltas/0.3.5/alpha.9.md history/0.3.5/alpha.8.fix.1.md ``` Modifiés : ```text Cargo.toml README.md crates/common/game-realtime-webtransport-lib/README.md crates/common/game-realtime-webtransport-lib/USAGE.md crates/common/game-realtime-webtransport-lib/src/webtransport.rs crates/common/game-realtime-webtransport-lib/src/webtransport_wasm.rs docs/plans/005-V0_3_5_WEBTRANSPORT_QUIC_POC_PLAN.md scripts/audit_distribution_layout.py ``` ## 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-webtransport-lib --all-targets --all-features cargo run -p game-realtime-webtransport-datagram-smoke cargo check -p game-realtime-webtransport-lib --target wasm32-unknown-unknown cargo clippy -p game-realtime-webtransport-lib --target wasm32-unknown-unknown --lib -- -D warnings cargo build -p game-realtime-webtransport-lib --target wasm32-unknown-unknown cargo tree -p game-realtime-webtransport-datagram-smoke --edges normal cargo tree -i game-realtime-webtransport-lib --workspace --edges normal ``` ## Après validation Créer `history/0.3.5/alpha.9.md` à partir des sorties réellement fournies puis ouvrir `0.3.5-alpha.10` pour les mesures comparatives bornées WebSocket / WebTransport fiable, avec datagram uniquement comme capacité WebTransport séparée.