# Delta 0.1.3-rc.1 — gel du scope Android et gate de release candidate ## Baseline et version Baseline attendue : commit opérateur de `0.1.3-beta.1`, réalisé après application de `history/0.1.3/beta.1.md` avec statut `PASS`. Le hash de ce commit n'est pas anticipé. Version avant application : ```text 0.1.3-beta.1 ``` Version après application : ```text 0.1.3-rc.1 ``` ## Objet et gel La RC gèle le scope fonctionnel de `0.1.3` sur : - Android comme spécialisation de `600-PLATFORMS.md`, neutre vis-à-vis du langage applicatif et composant Java/Gradle uniquement lorsqu'ils sont réellement applicables ; - les responsabilités distinctes de `compileSdk`, `targetSdk` et `minSdk`, avec `minSdk` justifié par le contrat produit plutôt que minimisé cérémoniellement ; - `namespace`, `applicationId`, manifests/resources, configuration locale et signing comme responsabilités Android clairement bornées ; - NDK, ABI et bibliothèques natives uniquement pour les projets réellement concernés, sans version NDK ni liste d'ABI universelles ; - la séparation entre compilation native, packaging et preuve runtime ; - Android Lint comme gate explicite, avec tests JVM, tests instrumentés et smokes device/AVD sélectionnés proportionnellement au changement ; - la distinction APK/AAB versus preuve d'installation/exécution ; - la compatibilité pages mémoire 16 KB comme contrat conditionnel au code natif, au package et au canal de distribution concernés, sans minimum AGP/NDK/SDK universel ; - les choix spécifiques Games — versions d'outils, niveaux SDK, quatre ABI, Rust/JNI/SDL, modules et assets — conservés comme décisions locales ; - la décision beta qu'aucun skeleton Android, template de build, audit Python, owner JNI/Rust/SDL ni contrat de validation Android séparé n'est justifié ; - la frontière suivante : réexamen Tauri `0.1.4`, adoption Games `0.1.5`, adoption KSP `0.1.6`. Le changelog reçoit une entrée candidate `0.1.3` orientée utilisateurs. Le prompt `010-V0_1_4_START_PROMPT.md` est préparé pour le réexamen Tauri après publication vérifiée de `v0.1.3`. Aucune nouvelle règle fonctionnelle Android n'entre dans cette RC. Les owners, skeletons, templates, validations et scripts sont vérifiés mais non modifiés. ## Scope REPLACE : ```text VERSION CHANGELOG.md docs/000-README.md docs/plans/009-V0_1_3_ANDROID_REEVALUATION_PLAN.md ``` ADD : ```text deltas/0.1.3/rc.1.md prompts/010-V0_1_4_START_PROMPT.md ``` DELETE : aucun. Le history `beta.1` est livré séparément et MUST être appliqué/committé avant ce delta. ## Gate opérateur de release candidate Après application du history `PASS` de `beta.1`, commit/push de `beta.1`, puis application du présent delta : ```bash test "$(cat VERSION)" = '0.1.3-rc.1' git cat-file -e HEAD:history/0.1.3/beta.1.md test -f history/0.1.3/beta.1.md test -f deltas/0.1.3/rc.1.md test -f prompts/010-V0_1_4_START_PROMPT.md test ! -e history/0.1.3/rc.1.md grep -A2 '^## Statut$' history/0.1.3/beta.1.md | grep -Fx 'PASS' grep -Fx '' CHANGELOG.md grep -Fx '## 0.1.3 (candidate)' CHANGELOG.md grep -Fx '' docs/000-README.md grep -Fx '' docs/plans/009-V0_1_3_ANDROID_REEVALUATION_PLAN.md grep -Fx '' ROADMAP.md grep -Fx '' prompts/010-V0_1_4_START_PROMPT.md grep -Fx '' docs/rules/610-ANDROID.md grep -Fx '' docs/rules/710-TAURI.md grep -Fx '' docs/studies/002-TAURI_SKELETON_DECISION.md grep -Fx '' docs/skeletons/003-WEB_FRONTEND.md grep -Fx '' docs/validation/005-WEB_FRONTEND_VALIDATION.md ``` Contrôle d'intégration de la RC : ```bash python3 -B - <<'PYGATE' from pathlib import Path import re expected = { "alpha.1.md": "PASS", "alpha.2.md": "PASS", "alpha.3.md": "PASS", "beta.1.md": "PASS", } histories = {path.name for path in Path("history/0.1.3").glob("*.md")} assert histories == set(expected), histories for name, status in expected.items(): text = Path("history/0.1.3", name).read_text(encoding="utf-8") assert re.search(rf"## Statut\s+{status}\s", text), (name, status) deltas = {path.name for path in Path("deltas/0.1.3").glob("*.md")} assert deltas == set(expected) | {"rc.1.md"}, deltas changelog = Path("CHANGELOG.md").read_text(encoding="utf-8") assert "## 0.1.3 (candidate)" in changelog section = changelog.split("## 0.1.3 (candidate)", 1)[1].split("## 0.1.2", 1)[0] for phrase in ( "profil Android", "compileSdk", "targetSdk", "minSdk", "namespace", "applicationId", "NDK", "Android Lint", "tests instrumentés", "APK/AAB", "16 KB", "0.1.4", "0.1.5", ): assert phrase in section, phrase for forbidden in ( "alpha.1", "alpha.2", "alpha.3", "beta.1", "rc.1", ): assert forbidden not in section, forbidden android = Path("docs/rules/610-ANDROID.md").read_text(encoding="utf-8") for phrase in ( "Android ne sélectionne pas à lui seul le langage applicatif du projet.", "Le choix de `minSdk` MUST être justifié par le contrat produit", "PGR ne fixe ni version NDK ni liste universelle d'ABI.", "PGR MUST NOT supposer qu'un build Gradle ordinaire exécute Lint automatiquement.", "Un AAB n'est pas directement une preuve d'installation ou d'exécution sur device.", "## Pages mémoire 16 KB et packaging natif", "PGR MUST NOT imposer une version AGP/NDK globale uniquement pour cette raison.", ): assert phrase in android, phrase for forbidden in ( "targetSdk MUST être 36", "minSdk MUST être 21", "NDK MUST être r28", "MUST supporter arm64-v8a, armeabi-v7a, x86_64 et x86", "Gradle MUST être 9.7.1", "AGP MUST être 9.4.0", "JDK MUST être 25", ): assert forbidden not in android, forbidden plan = Path("docs/plans/009-V0_1_3_ANDROID_REEVALUATION_PLAN.md").read_text(encoding="utf-8") for phrase in ( "### beta.1 — réconciliation et décision d'artefacts\n\nRelire", "Statut opérateur : **PASS**.", "### rc.1 — release candidate\n\nStatut opérateur : **à valider**.", "prompts/010-V0_1_4_START_PROMPT.md", "Aucune nouvelle fonctionnalité normative Android ne doit apparaître en RC.", ): assert phrase in plan, phrase prompt = Path("prompts/010-V0_1_4_START_PROMPT.md").read_text(encoding="utf-8") for phrase in ( "archive source téléchargée depuis le tag Gitea `v0.1.3`", "pgr-0.1.3-publish.001-report.md", "0.1.4-alpha.1", "2a9cabcb9f147a348dcf8d24df8bc6c5029089b6d49feb17bd4a42b4293c329a", "ad6e44a1332eb7d6069cf1189d9433f0fbb8fac19c5aac9f4641ac45c1c556e8", "002-TAURI_SKELETON_DECISION.md", "710-TAURI.md", "003-WEB_FRONTEND", "ADOPT / KEEP-LOCAL / OVERRIDE / DEFER", "conditions de sortie", "créer le skeleton Tauri parce que la roadmap le mentionne", "adoption Games `0.1.5`", "adoption KSP `0.1.6`", ): assert phrase in prompt, phrase study = Path("docs/studies/002-TAURI_SKELETON_DECISION.md").read_text(encoding="utf-8") for phrase in ( "DEFER", "Condition 1 — TypeScript et conventions Web contrôlées", "Condition 2 — Vite et ownership des commandes/dev server/build outputs", "Condition 3 — Sass/CSS et statut des artefacts générés", "Condition 4 — validation frontend indépendante de la validation Tauri", "Condition 5 — framework CSS classé comme décision de skeleton/projet", "réexamen autorisé 0.1.4", "création automatique interdite", ): assert phrase in study, phrase roadmap = Path("ROADMAP.md").read_text(encoding="utf-8") for version in ("0.1.3", "0.1.4", "0.1.5", "0.1.6", "0.1.7"): assert f"- `( ) {version}`" in roadmap, version assert "- `( ) 0.1.8`" not in roadmap assert "skeleton Tauri jusqu'au réexamen 0.1.4" in roadmap for forbidden_path in ( "docs/validation/006-ANDROID_VALIDATION.md", "docs/skeletons/004-ANDROID.md", "docs/rules/620-JNI.md", "docs/skeletons/004-TAURI.md", ): assert not Path(forbidden_path).exists(), forbidden_path index = Path("docs/000-README.md").read_text(encoding="utf-8") assert "../prompts/010-V0_1_4_START_PROMPT.md" in index print("0.1.3 rc.1 integration audit: clean (4 prior histories, frozen Android profile, candidate changelog and prompt 010 verified)") PYGATE ``` Rejouer ensuite les preuves PGR : ```bash 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 ``` Vérifier également l'hygiène texte/templates sans simuler une toolchain Android ou Tauri absente du dépôt PGR : ```bash python3 -B - <<'PYHYGIENE' from pathlib import Path import json import tomllib for path in sorted(Path("templates/rust-cargo").rglob("*.toml")): tomllib.loads(path.read_text(encoding="utf-8")) json.loads(Path("templates/web-typescript/package.json").read_text(encoding="utf-8")) json.loads(Path("templates/web-typescript/tsconfig.json").read_text(encoding="utf-8")) roots = ( Path("VERSION"), Path("README.md"), Path("RULES.md"), Path("ROADMAP.md"), Path("CHANGELOG.md"), Path("docs"), Path("deltas"), Path("history"), Path("prompts"), Path("templates"), ) files = [] for root in roots: if root.is_file(): files.append(root) elif root.is_dir(): files.extend(path for path in root.rglob("*") if path.is_file()) for path in files: try: data = path.read_bytes() text = data.decode("utf-8") except UnicodeDecodeError: continue assert b"\r" not in data, path assert text.endswith("\n"), path for number, line in enumerate(text.splitlines(), 1): assert line == line.rstrip(" \t"), (path, number) print("0.1.3 rc.1 text/template hygiene: clean") PYHYGIENE git diff --check git add VERSION CHANGELOG.md docs/000-README.md \ docs/plans/009-V0_1_3_ANDROID_REEVALUATION_PLAN.md \ deltas/0.1.3/rc.1.md prompts/010-V0_1_4_START_PROMPT.md git diff --cached --check git status --short ``` Le scope indexé attendu avant ajout du history est exactement : ```text M CHANGELOG.md M VERSION A deltas/0.1.3/rc.1.md M docs/000-README.md M docs/plans/009-V0_1_3_ANDROID_REEVALUATION_PLAN.md A prompts/010-V0_1_4_START_PROMPT.md ``` La revue qualitative doit confirmer que : - aucune règle fonctionnelle Android nouvelle n'entre en RC ; - `610-ANDROID.md` reste en révision `5` et aucun choix Games n'est généralisé ; - aucun artefact Android supplémentaire n'est créé ; - le changelog candidat décrit la valeur utilisateur de `0.1.3` sans recopier la chronologie alpha/beta/RC ; - le prompt `010` exige une future stable `v0.1.3` réellement publiée et son rapport post-tag `PASS` ; - le `DEFER` Tauri n'est pas levé par le prompt : `0.1.4` doit le réexaminer objectivement contre les corpus courants ; - l'adoption Games `0.1.5` et l'adoption KSP `0.1.6` ne sont pas commencées ; - aucune preuve Android/Tauri exécutable n'est simulée dans PGR. ## Transition ### PASS Produire séparément `history/0.1.3/rc.1.md`, puis préparer la promotion mécanique `0.1.3-rel.1` sans rouvrir le scope fonctionnel.