# Matrice de validation RC 0.3.3 ## Objectif `0.3.3-3-rc.1` est une candidate gelée. Elle ne modifie ni gameplay, ni moteur, ni JNI, ni Java, ni logique Gradle : elle revalide qu'un état reproductible du pipeline Android SDL3 natif peut être promu mécaniquement vers `0.3.3`. ## Gel fonctionnel Pendant `3-rc.*`, seules les corrections autorisées par `VER-RC-*` sont admises. Toute nouvelle ABI, nouvelle API Android, nouvelle capability réseau, nouvelle abstraction, refactor volontaire ou changement de comportement est hors scope. La future convention de versions `alpha.M / beta.M / rc.M` n'est pas appliquée à `0.3.3`; elle commencera avec la prochaine version et ne doit provoquer aucune réécriture de l'historique. ## Gate workspace Depuis la racine : ```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 --workspace --all-targets --all-features ``` La suite workspace complète est répétée en RC parce que la version Cargo passe à `0.3.3-3-rc.1`. ## Rebuild Android propre ```bash (cd Android && gradle :game-snake-poc:clean :game-reflex-poc:clean) (cd Android && gradle :game-snake-poc:assembleDebug) (cd Android && gradle :game-reflex-poc:assembleDebug) (cd Android && gradle :game-snake-poc:bundleRelease) (cd Android && gradle :game-reflex-poc:bundleRelease) ``` Le build doit utiliser le JDK normal de l'environnement et un Gradle système `>= 9.6.0`; aucun `JAVA_HOME` spécifique au projet et aucun wrapper Gradle natif ne sont requis. ## Contrôle quatre ABI ```bash for game in game-snake-poc game-reflex-poc; do APK="Android/${game}/build/outputs/apk/debug/${game}-debug.apk" AAB="Android/${game}/build/outputs/bundle/release/${game}-release.aab" test -f "$APK" test -f "$AAB" for abi in arm64-v8a armeabi-v7a x86_64 x86; do unzip -Z1 "$APK" | grep -Fx "lib/${abi}/libSDL3.so" unzip -Z1 "$APK" | grep -Fx "lib/${abi}/libgame_android_entrypoint.so" unzip -Z1 "$AAB" | grep -Fx "base/lib/${abi}/libSDL3.so" unzip -Z1 "$AAB" | grep -Fx "base/lib/${abi}/libgame_android_entrypoint.so" done done ``` ## Packaging 16 KB ```bash ZIPALIGN="$(find "$ANDROID_HOME/build-tools" -mindepth 2 -maxdepth 2 -type f -name zipalign -print | sort -V | tail -n 1)" test -x "$ZIPALIGN" "$ZIPALIGN" -c -P 16 -v 4 Android/game-snake-poc/build/outputs/apk/debug/game-snake-poc-debug.apk "$ZIPALIGN" -c -P 16 -v 4 Android/game-reflex-poc/build/outputs/apk/debug/game-reflex-poc-debug.apk ``` Recontrôler les segments ELF 64 bits Release : ```bash OBJDUMP="$ANDROID_HOME/ndk/28.2.13676358/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-objdump" test -x "$OBJDUMP" for game in game-snake-poc game-reflex-poc; do for abi in arm64-v8a x86_64; do for so in \ "Android/${game}/build/generated/sasedevNative/release/${abi}/jniLibs/${abi}/libSDL3.so" \ "Android/${game}/build/generated/sasedevNative/release/${abi}/jniLibs/${abi}/libgame_android_entrypoint.so"; do test -f "$so" "$OBJDUMP" -p "$so" | grep 'LOAD' done done done ``` Chaque ligne `LOAD` des ABI 64 bits doit rester au minimum à `align 2**14`. Les ABI 32 bits restent supportées mais ne sont pas soumises à ce critère Play 16 KB. ## Smoke AVD API 36 x86_64 Avec l'AVD de référence déjà disponible, utiliser son serial ADB, actuellement `emulator-5554` lorsqu'il est lancé. Pour chaque jeu : ```bash SERIAL=emulator-5554 APK=Android/game-snake-poc/build/outputs/apk/debug/game-snake-poc-debug.apk adb -s "$SERIAL" install -r "$APK" adb -s "$SERIAL" shell am force-stop com.sasedev.games.snake adb -s "$SERIAL" logcat -c adb -s "$SERIAL" shell am start -W -n com.sasedev.games.snake/.SnakeActivity sleep 3 adb -s "$SERIAL" shell pidof com.sasedev.games.snake adb -s "$SERIAL" logcat -d -b crash ``` Puis : ```bash SERIAL=emulator-5554 APK=Android/game-reflex-poc/build/outputs/apk/debug/game-reflex-poc-debug.apk adb -s "$SERIAL" install -r "$APK" adb -s "$SERIAL" shell am force-stop com.sasedev.games.reflex adb -s "$SERIAL" logcat -c adb -s "$SERIAL" shell am start -W -n com.sasedev.games.reflex/.ReflexActivity sleep 3 adb -s "$SERIAL" shell pidof com.sasedev.games.reflex adb -s "$SERIAL" logcat -d -b crash ``` Vérifier humainement : rendu visible, assets présents, Snake réagit au swipe, Reflex réagit au tap, puis absence de crash immédiat. ## Smoke ARM64 réel Sur le Samsung ou un autre appareil ARM64 disponible, remplacer `` : ```bash SERIAL= adb -s "$SERIAL" shell getprop ro.build.version.sdk adb -s "$SERIAL" shell getprop ro.product.cpu.abi ``` Rejouer les deux blocs Snake/Reflex précédents avec `SERIAL=`. Vérifier humainement rendu, tactile et sortie/Back. ## Frontières non rejouées par défaut Les smokes API 21/x86 et API 35/x86_64 `ps16k` ont été établis en `0-pre.5`, puis aucune logique native/Gradle n'a changé. Ils ne sont pas répétés en RC sauf si un correctif RC touche le pipeline Android, le NDK, SDL3, les ABI, `minSdk`, le packaging ou les bibliothèques natives. ## Promotion stable Si cette gate est propre et qu'aucun correctif n'est nécessaire, la promotion vers `0.3.3` est mécanique : version stable, entrée stable du changelog, historique RC, clôture du plan, delta de release et mise à jour mécanique du prompt `0.3.4` si la base stable doit être rendue certaine. Aucun code fonctionnel ne doit changer.