# Delta 0.3.3-0-pre.1 ## Base Base autoritaire : archive fournie `games-v0.3.1.zip`, téléchargée depuis le lien ZIP du tag Gitea `v0.3.1`. La version workspace de la base est `0.3.1`. L'archive taggée ne contient pas `.git`; aucun état Git absent n'est inventé et aucune autre branche/version n'est utilisée comme source. `0.3.2` reste différée conformément au prompt de reprise. ## Objet Ouvrir `0.3.3` par son gate obligatoire `0-pre.1` : audit complet de la baseline et des règles, audit du pipeline Android SDL3 natif historique, recherche officielle actuelle, choix ABI/API, cadrage APK/AAB, contrainte pages mémoire 16 KB, sizing, risques, validations et plan vivant. Cette tranche n'introduit volontairement aucune nouvelle tâche Gradle productive et ne modifie pas le comportement Android. La réécriture du chemin de build commence seulement en `0-pre.2`. ## Version La version workspace passe de : ```text 0.3.1 ``` à : ```text 0.3.3-0-pre.1 ``` Les versions npm/Tauri et `versionName` Android ne sont pas synchronisées dans cette tranche de cadrage. Les produits concernés n'ont pas encore reçu de changement de packaging et `VER-TAURI-003`/`VER-TAURI-004` interdisent une synchronisation npm cérémonielle. ## Audit de l'archive Avant modification, l'environnement de génération a obtenu : ```text unzip -t : no errors General Rust rule audit: clean Rust export completeness audit: 0 candidate(s) games.sasedev workspace audit: clean Markdown table audit: clean (5 table(s), 222 file(s)) Distribution layout audit: clean (48 required path(s), 1 forbidden path(s) absent) ``` Le ZIP contient 378 fichiers, aucun lien symbolique, aucun fichier vide et aucun `.git`, `target/`, `node_modules/` ou `gen/android/` généré. La sortie utilisateur initiale sur son arbre local est également propre pour les trois audits, avec 230 fichiers Markdown et un `cargo check --workspace` réussi. Elle montre ensuite un build Tauri Android Debug universal réussi pour ARM64 et x86_64. Le compte Markdown local supérieur au ZIP taggé est compatible avec un `gen/android/` Tauri déjà présent localement ; le ZIP fourni reste la source autoritaire et aucun fichier généré n'est ajouté au delta. ## Audit des règles La revue demandée par `prompts/004-V0_3_3_START_PROMPT.md` confirme notamment : - `0-pre.1` doit contenir le cadrage et le plan avant le développement lourd ; - une prerelease non-fix synchronise la version workspace ; - un nouveau chemin de build `0.3.x` ne doit pas être piloté par Python ; - Gradle doit posséder l'artefact Android final et les outputs générés doivent rester hors sources versionnées ; - toute modification Rust/Cargo déclenche fmt, audit, check workspace et Clippy strict ; - les builds, tests et smokes finaux sont attestés côté utilisateur ; - les tests workspace complets restent des gates rares et planifiées ; - aucun historique `history/0.3.3/0-pre.1.md` n'est créé avant validation effective de cette tranche. Aucune contradiction bloquante n'est trouvée entre le prompt, les règles et la baseline `v0.3.1`. L'audit documentaire relève toutefois un paragraphe obsolète dans `Android/README.md`, resté au vocabulaire `0.1.0-0-pre.9` et affirmant que le NDK n'était pas encore utilisé ; cette tranche le réaligne sur la réalité stable `0.3.1` sans changer le build. ## Pipeline Android hérité La baseline configure : ```text AGP 9.4.0 Gradle 9.6.0 attendu JDK 17 compileSdk 36 targetSdk 36 minSdk 21 NDK 28.2.13676358 / r28c SDL3 AAR 3.4.16 ``` `scripts/build_android_rust.py` réalise aujourd'hui l'extraction/linkage SDL3 par ABI, la résolution NDK, `cargo ndk`, la sélection d'une unique feature jeu, le staging dans `src/main/jniLibs` et la vérification de `libgame_android_entrypoint.so`. Ces responsabilités doivent être transposées dans la logique Gradle commune, avec outputs sous `build/generated/...`, avant suppression du script. ## Recherche et décisions 0-pre.1 Les sources officielles actuelles confirment : - AGP 9.4.0 : Gradle 9.6.0, JDK 17 et NDK par défaut `28.2.13676358` ; - SDL3 Android actuel : SDK 35+, NDK r28c+ et API minimale 21 ; - SDL3 3.4.16 : release stable actuelle de la baseline ; - Google Play : API 36+ requise depuis le 31 août 2026 pour nouvelles apps/mises à jour téléphone/tablette ; - application native ciblant API 35+ : compatibilité pages mémoire 16 KB à assurer ; NDK r28+ produit l'alignement 16 KB par défaut ; - AAB : format de distribution, dont le store dérive des APK optimisés, notamment par ABI. Les choix retenus sont donc : ```text minSdk candidat 21 ABI par défaut arm64-v8a + x86_64 armeabi-v7a différée APK local universal multi-ABI AAB distribution splits ABI non par défaut NDK natif r28c épinglé, distinct du NDK 30 observé dans le POC Tauri ``` Le détail, les sources et les risques sont consignés dans `docs/studies/025-V0_3_3_ANDROID_NATIVE_MULTI_ABI_AUDIT.md`. ## Plan créé `docs/plans/003-V0_3_3_ANDROID_NATIVE_MULTI_ABI_PLAN.md` devient le plan actif avec le forecast révisé : ```text 0-pre.1 audit / règles / ABI-API / minSdk / APK-AAB / 16 KB / plan 0-pre.2 ownership Gradle/Cargo Snake sur arm64-v8a + wrapper Gradle 0-pre.3 arm64-v8a + x86_64 + APK universal + Reflex si factorisation naturelle 0-pre.4 AAB + minSdk/smokes + 16 KB + fermeture du script Python historique 2-beta.1 validation large + packaging final 3-rc.1 gel + reproductibilité + consolidation documentaire 0.3.3 promotion mécanique stable ``` Le scope reste compatible avec une seule version/session tant qu'aucune incompatibilité structurante de Gradle/cargo-ndk/SDL3 n'est découverte. ## Fichiers Ajoutés : ```text docs/plans/003-V0_3_3_ANDROID_NATIVE_MULTI_ABI_PLAN.md docs/studies/025-V0_3_3_ANDROID_NATIVE_MULTI_ABI_AUDIT.md deltas/0.3.3/0-pre.1.md ``` Modifiés : ```text Android/README.md Cargo.toml README.md docs/000-README.md docs/plans/000-README.md docs/studies/000-README.md ``` Aucun fichier Gradle, Rust source, règle normative, roadmap, changelog ou historique n'est modifié dans ce cadrage. `Android/README.md` reçoit uniquement la correction documentaire de baseline décrite ci-dessus. ## Validations exécutées dans l'environnement de génération Après constitution de l'état livré, exécuter uniquement les audits statiques autorisés au générateur : ```bash 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 ``` Aucun build Cargo/Gradle, test ou smoke final n'est attribué au générateur. ## Validation utilisateur demandée Le manifest workspace change de version ; la gate minimale est donc : ```bash 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 fmt --all cargo fmt --all -- --check cargo check --workspace cargo clippy --workspace --all-targets --all-features -- -D warnings ``` Aucun test workspace complet n'est demandé : cette tranche ne change aucun code Rust, comportement, dépendance ou configuration Android productive. La première gate du prompt `004` demande également l'inventaire frais qui conditionne `0-pre.2` : ```bash rustc --version cargo --version cargo ndk --version rustup target list --installed java -version printf 'JAVA_HOME=%s\nANDROID_HOME=%s\n' "$JAVA_HOME" "$ANDROID_HOME" adb version adb devices -l emulator -list-avds (cd Android && gradle --version) printf 'configured NDK: '; sed -n 's/^androidNdkVersion=//p' Android/gradle.properties ls -ld "$ANDROID_HOME/ndk/28.2.13676358" test -f Android/libs/SDL3-3.4.16.aar && sha256sum Android/libs/SDL3-3.4.16.aar ``` La sortie déjà fournie confirme JDK 17 sélectionné via `JAVA_HOME`, les targets Tauri ARM64/x86_64 suffisamment opérationnelles pour produire un APK universal et un NDK 30 utilisé par Tauri. Elle ne remplace pas l'inventaire du pipeline Android natif ci-dessus. ## Suite après validation Si la gate est propre, la tranche suivante crée `history/0.3.3/0-pre.1.md` avec les sorties réellement obtenues puis ouvre `0.3.3-0-pre.2`. `0-pre.2` doit d'abord introduire le Gradle Wrapper et prouver sur Snake/ARM64 que `:game-snake-poc:assembleDebug` déclenche lui-même le build Rust/SDL3 sans `scripts/build_android_rust.py`. Une défaillance de la gate ou une erreur du cadrage produit d'abord `0-pre.1.fix.N`.