# Delta 0.1.3-alpha.2 — contrats Android de base ## Baseline Ce delta s'applique après : ```text 0.1.3-alpha.1 + history/0.1.3/alpha.1.md PASS + commit/push complet de la tranche alpha.1 ``` Il ne doit pas être appliqué avant l'intégration du history `alpha.1`. ## Objet Réviser le profil Android uniquement sur les contrats de base démontrés par le corpus Games et confirmés par la documentation Android officielle courante : structure Android-only versus multi-plateforme, composition langage/build, matrice AGP/Gradle/JDK, niveaux SDK, identité applicative, versioning, configuration locale et signing. Cette tranche ne couvre pas encore NDK/ABI/native packaging, APK/AAB, Android Lint, tests instrumentés, installation/smokes device/AVD ni exigences 16 KB ; ces responsabilités restent réservées à `alpha.3`. ## Modifications ### Version `VERSION` devient : ```text 0.1.3-alpha.2 ``` ### Plan Android `docs/plans/009-V0_1_3_ANDROID_REEVALUATION_PLAN.md` passe en révision interne `2` et enregistre : - le `PASS` opérateur réel de `alpha.1` ; - l'absence de fix avant `alpha.2` ; - les sources Android officielles vérifiées le `2026-09-28` ; - la confirmation que les valeurs Games AGP `9.4.0`, Gradle `>= 9.6.0` et JDK observé restent des preuves locales et non des minima PGR ; - le scope exact de `alpha.2` ; - le maintien du détail 16 KB dans `alpha.3`. ### Profil Android `docs/rules/610-ANDROID.md` passe en révision interne `4`. La révision : - conserve `Android/` comme convention conditionnelle d'un dépôt multi-plateforme, mais retire `gradlew*` du layout d'exemple afin de ne plus présenter le Wrapper comme structure obligatoire ; - rend le profil Android neutre quant au langage applicatif et applique `520-JAVA.md` uniquement lorsque du Java est réellement présent ; - distingue le JDK qui exécute Gradle/AGP du niveau Java du code applicatif ; - conserve la matrice AGP/Gradle/JDK sans recopier les règles générales possédées par `522-GRADLE.md` ; - clarifie `compileSdk`, `targetSdk` et `minSdk` comme trois contrats distincts ; - remplace l'objectif implicite « `minSdk` aussi bas que possible » par une décision de compatibilité produit explicitement justifiée ; - introduit la séparation explicite entre `namespace` et `applicationId` ; - conserve `VERSION`, `versionName` et `versionCode` comme contrats distincts selon le release train réellement possédé ; - précise que `local.properties` est réservé à l'environnement local Android/AGP et ne doit pas devenir une source de configuration partagée ou un fourre-tout de propriétés produit ; - consolide le traitement des keystores, clés et mots de passe de signing sans recopier l'interdiction générale des secrets ; - clarifie que le manifest possède composants/permissions/capabilities tandis que les identités `namespace` / `applicationId` restent dans la configuration Android du module. Aucun template, skeleton, audit Python ou contrat de validation Android n'est créé. ## Vérification officielle utilisée La vérification courante effectuée avant préparation du delta couvre : ```text Android Gradle plugin 9.4.0 release notes Configure your build Java versions in Android builds Configure the app module Sign your app ``` Elle confirme notamment la matrice AGP/Gradle/JDK, la distinction du JDK de build et du niveau Java, les responsabilités `compileSdk` / `targetSdk` / `minSdk`, la séparation `namespace` / `applicationId`, le rôle local de `local.properties` et le caractère secret des clés de signing. Elle n'est pas utilisée pour normaliser encore la contrainte 16 KB. ## Validation opérateur Après application du history `PASS`, commit/push de `alpha.1`, puis application du présent delta : ```bash test "$(cat VERSION)" = '0.1.3-alpha.2' git cat-file -e HEAD:history/0.1.3/alpha.1.md test -f history/0.1.3/alpha.1.md test -f deltas/0.1.3/alpha.2.md test ! -e history/0.1.3/alpha.2.md grep -A2 '^## Statut$' history/0.1.3/alpha.1.md | grep -Fx 'PASS' grep -Fx '' docs/plans/009-V0_1_3_ANDROID_REEVALUATION_PLAN.md grep -Fx '' docs/rules/610-ANDROID.md python3 -B -m unittest discover -s tests -v python3 -B scripts/audit_markdown_headers.py \ README.md RULES.md ROADMAP.md CHANGELOG.md docs deltas history prompts python3 -B scripts/audit_markdown_tables.py \ README.md RULES.md ROADMAP.md CHANGELOG.md docs deltas history prompts python3 -B scripts/audit_markdown_links.py \ README.md RULES.md ROADMAP.md CHANGELOG.md docs deltas history prompts python3 -B - <<'PYGATE' from pathlib import Path import re history = Path('history/0.1.3/alpha.1.md').read_text(encoding='utf-8') assert re.search(r'## Statut\s+PASS\s', history) android = Path('docs/rules/610-ANDROID.md').read_text(encoding='utf-8') assert android.startswith('\n') for phrase in ( 'Android ne sélectionne pas à lui seul le langage applicatif du projet.', 'JDK qui exécute Gradle / AGP', 'Le choix de `minSdk` MUST être justifié par le contrat produit', '## Identité applicative et namespace', '`applicationId` identifie l\'application installée et distribuée.', '`local.properties` appartient à l\'environnement local du build Android/AGP', 'release / upload keystore', '`AndroidManifest.xml` MUST déclarer uniquement les composants', ): assert phrase in android, phrase structure = android.split('## Structure du projet', 1)[1].split('## Langage applicatif et logique de build', 1)[0] assert 'gradlew' not in structure assert 'settings.gradle(.kts)' in structure assert '/' in structure assert 'Java est le langage applicatif Android par défaut du profil PGR' not in android assert '`minSdk` SHOULD rester aussi bas que raisonnablement supportable' not in android plan = Path('docs/plans/009-V0_1_3_ANDROID_REEVALUATION_PLAN.md').read_text(encoding='utf-8') for phrase in ( '## Décision après `alpha.1`', 'La gate opérateur de `alpha.1` est `PASS`', '### Vérification Android officielle courante pour `alpha.2`', 'AGP `9.4.0` requiert actuellement au minimum Gradle `9.6.0` et JDK `17`', 'La vérification 16 KB n\'est pas absorbée ici', '### Scope arrêté pour `alpha.2`', ): assert phrase in plan, phrase assert not Path('docs/validation/006-ANDROID_VALIDATION.md').exists() assert not Path('history/0.1.3/alpha.2.md').exists() for path in ( 'docs/rules/520-JAVA.md', 'docs/rules/522-GRADLE.md', 'docs/rules/600-PLATFORMS.md', ): assert Path(path).is_file(), path print('0.1.3 alpha.2 Android base-contract audit: clean (language/build ownership, SDK contracts, app identity, local config and signing clarified)') PYGATE git diff --check git add VERSION \ docs/plans/009-V0_1_3_ANDROID_REEVALUATION_PLAN.md \ docs/rules/610-ANDROID.md \ deltas/0.1.3/alpha.2.md git diff --cached --check git status --short ``` Le scope indexé attendu avant ajout du history est : ```text M VERSION A deltas/0.1.3/alpha.2.md M docs/plans/009-V0_1_3_ANDROID_REEVALUATION_PLAN.md M docs/rules/610-ANDROID.md ``` La revue qualitative doit confirmer que : - aucun choix Games n'est devenu une règle Android générale par copie de valeur ; - Android n'impose plus Java par défaut et ne confond pas JDK de build avec niveau Java applicatif ; - l'exemple structurel ne rend ni Wrapper ni Gradle système obligatoire ; - `minSdk` est une décision de compatibilité produit et non un concours vers la valeur la plus basse ; - `namespace` et `applicationId` sont distingués sans imposer un schéma de nommage propriétaire ; - `local.properties` ne devient pas une configuration partagée et les secrets de signing restent hors Git ; - aucun contenu NDK/ABI/16 KB, Tauri ou adoption Games n'a été absorbé prématurément ; - aucun artefact supplémentaire n'a été créé uniquement pour remplir la release. ## Transition ### PASS Produire `history/0.1.3/alpha.2.md`, puis préparer `0.1.3-alpha.3` pour les responsabilités conditionnelles NDK/ABI/native packaging, APK/AAB, Android Lint, niveaux de tests, install/smokes device/AVD et contraintes de distribution modernes réellement applicables. Avant toute règle 16 KB, vérifier explicitement les exigences Android officielles courantes et borner le contrat au canal de distribution et aux artefacts natifs réellement concernés. ### FAIL Consigner le diagnostic réel dans `history/0.1.3/alpha.2.md` et rester dans `alpha.2.fix.N` sauf REPLAN justifié. Le fix MUST rester borné aux contrats Android de base et ne doit pas absorber le scope natif/distribution de `alpha.3`, Tauri `0.1.4` ou l'adoption Games `0.1.5`.