# Delta 0.1.3-alpha.1 — audit de stable et cadrage Android ## Baseline et sources Baseline PGR autoritaire : archive source téléchargée depuis le tag Gitea `v0.1.2`, accompagnée du rapport externe `pgr-0.1.2-publish.001-report.md` avec statut `PASS`. SHA-256 vérifiés sur les fichiers réellement fournis : ```text pgr-v0.1.2(1).zip 0ef8facab0c6f92ca427f5f13d38d6c4a4c1cc16174a20ecdab48991bd88d0e6 pgr-0.1.2-publish.001-report.md 0f6b4e2a685a957fa647a7db009320ada0fc67948737d8344cc3773bcaeb6a9c games-v0.3.6(2).zip ad6e44a1332eb7d6069cf1189d9433f0fbb8fac19c5aac9f4641ac45c1c556e8 ``` Les archives locales PGR et Games comportent respectivement `(1)` et `(2)` dans leur nom, mais leurs empreintes correspondent exactement aux baselines canoniques `pgr-v0.1.2.zip` et `games-v0.3.6.zip` attendues par le rapport/prompt. Version avant application : ```text 0.1.2 ``` Version après application : ```text 0.1.3-alpha.1 ``` ## Objet Exécuter `prompts/009-V0_1_3_START_PROMPT.md` : vérifier intégralement la stable `v0.1.2` et son rapport post-tag, auditer le corpus Games autoritaire sur Android et ses preuves historiques, relire `610-ANDROID.md`, `520-JAVA.md`, `522-GRADLE.md`, `600-PLATFORMS.md`, la validation générale et la revue d'horizon, puis créer le plan `0.1.3` avant toute normalisation Android importante. `alpha.1` reste un gate de cadrage. Aucune règle Android, règle Java/Gradle, validation spécialisée, template, skeleton ou audit nouveau n'est encore créé ou modifié. ## Résultat de l'audit d'intake La stable PGR et son rapport post-tag concordent : SHA-256 attendu, CRC propre, racine unique `pgr/`, `316` entrées, `276` fichiers, `40` répertoires, aucun symlink, absence normale de `.git` et `VERSION=0.1.2`. Le rapport `publish.001` est `PASS` et confirme le commit stable `585b508578aae337f6940110d4ca47c694a052d5`, l'objet tag annoté `cea2c7a06cde844ffa7411f73bb22685a3214414` et la déréférence de `v0.1.2` vers le commit stable. La suite PGR donne `48/48` tests `PASS`. Les audits Markdown sont propres : `250` fichiers pour les headers, `10` tables sur `250` fichiers et `307` liens locaux sur `250` fichiers. Les templates TOML Rust/Cargo et JSON Web contrôlés sont parsables. Les `90` couples delta/history de `0.0.1` à `0.1.2` sont complets. Les sept histories `0.1.2` sont tous `PASS`, y compris `alpha.2.fix.1` qui conserve la récupération historique de contamination inter-projet. Le corpus Games fourni possède exactement le SHA canonique attendu, `652` entrées, `502` fichiers, `150` répertoires et aucun symlink. Ses audits statiques principaux sont propres : règles Rust, exports, workspace, tableaux Markdown et layout de distribution. Le sous-projet Android natif exerce un build Gradle multi-module sous `Android/` avec `common`, `game-reflex-poc` et `game-snake-poc`, quatre sources Java, manifests/resources, namespaces/application IDs, configuration locale ignorée et scripts Gradle communs. La baseline Games utilise AGP `9.4.0`, Gradle système `>= 9.6.0`, JDK de build compatible `>= 17`, niveau Java source/target `17`, `compileSdk 36`, `targetSdk 36`, `minSdk 21`, NDK `28.2.13676358` et SDL3 `3.4.16`. Ces valeurs restent des décisions et preuves Games, pas des minima PGR. Les histories Games démontrent le passage d'une preuve initiale Wrapper/JDK 17 vers un Gradle système avec minimum exécutable et JDK courant, puis des builds réels avec Temurin `25.0.4.1 LTS` + Gradle `9.7.1` tout en conservant Java `17` comme niveau source/target. Le pipeline natif Games exerce `cargo ndk`, JNI, SDL3 et quatre ABI (`arm64-v8a`, `armeabi-v7a`, `x86_64`, `x86`). Les histories prouvent APK Debug, AAB Release, contenu natif packagé, smokes AVD x86_64 et appareil ARM64 réel, runtime API 21 ainsi qu'une preuve `PAGE_SIZE=16384` sur Android 15/API 35 x86_64. Ces responsabilités spécialisées ne sont pas copiées dans PGR. Le plan classe les décisions avec `ADOPT / KEEP-LOCAL / OVERRIDE / DEFER`, conserve Tauri en `DEFER` jusqu'à `0.1.4`, l'adoption Games jusqu'à `0.1.5` et prévoit une vérification des exigences Android officielles courantes avant toute normalisation de contraintes évolutives telles que 16 KB. ## Scope REPLACE : ```text VERSION README.md docs/000-README.md ``` ADD : ```text docs/plans/009-V0_1_3_ANDROID_REEVALUATION_PLAN.md deltas/0.1.3/alpha.1.md ``` DELETE : aucun. `RULES.md`, `ROADMAP.md`, `CHANGELOG.md`, `docs/rules/610-ANDROID.md`, `docs/rules/520-JAVA.md`, `docs/rules/522-GRADLE.md`, `docs/rules/600-PLATFORMS.md`, les autres règles, templates, skeletons, validations, scripts, studies, prompts et histories existants restent inchangés dans `alpha.1`. Aucun `history/0.1.3/alpha.1.md` n'est anticipé avant la gate opérateur. ## Validation opérateur Après application sur la stable `0.1.2`, depuis la racine du dépôt : ```bash test "$(cat VERSION)" = '0.1.3-alpha.1' test -f docs/plans/009-V0_1_3_ANDROID_REEVALUATION_PLAN.md test -f deltas/0.1.3/alpha.1.md test ! -e history/0.1.3/alpha.1.md grep -Fx '' README.md grep -Fx '' docs/000-README.md grep -F '009-V0_1_3_ANDROID_REEVALUATION_PLAN.md' README.md docs/000-README.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 - <<'PY' from pathlib import Path import re expected = { '0.0.1': 12, '0.0.2': 12, '0.0.3': 10, '0.0.4': 9, '0.0.5': 19, '0.1.0': 10, '0.1.1': 11, '0.1.2': 7, } for release, count in expected.items(): deltas = {path.name for path in Path('deltas', release).glob('*.md')} histories = {path.name for path in Path('history', release).glob('*.md')} assert len(deltas) == count, (release, len(deltas)) assert deltas == histories, (release, sorted(deltas ^ histories)) statuses = {} for path in Path('history/0.1.2').glob('*.md'): text = path.read_text(encoding='utf-8') match = re.search(r'## Statut\s+(?:`?)(PASS|FAIL|PARTIAL|BLOCKED)', text) assert match is not None, path statuses[path.name] = match.group(1) assert len(statuses) == 7, statuses assert set(statuses.values()) == {'PASS'}, statuses assert statuses['alpha.2.fix.1.md'] == 'PASS' assert statuses['rel.1.md'] == 'PASS' roadmap = Path('ROADMAP.md').read_text(encoding='utf-8') assert '- `(x) 0.1.2`' in roadmap for release in range(3, 8): assert f'- `( ) 0.1.{release}`' in roadmap, release assert '0.1.8' not in roadmap assert 'skeleton Tauri jusqu\'au réexamen 0.1.4' in roadmap prompt = Path('prompts/009-V0_1_3_START_PROMPT.md').read_text(encoding='utf-8') for phrase in ( 'Version cible : `0.1.3`', 'Première tranche attendue : `0.1.3-alpha.1`', 'ad6e44a1332eb7d6069cf1189d9433f0fbb8fac19c5aac9f4641ac45c1c556e8', 'ADOPT / KEEP-LOCAL / OVERRIDE / DEFER', 'structure `Android/`', 'compileSdk`, `targetSdk` et `minSdk', 'alignement mémoire/16 KB', 'skeleton Tauri, réservé à `0.1.4`', "démarrer l'adoption Games `0.1.5`", ): assert phrase in prompt, phrase android = Path('docs/rules/610-ANDROID.md').read_text(encoding='utf-8') assert android.startswith('\n') for phrase in ( 'Android n\'implique pas à lui seul l\'applicabilité du profil Java.', 'Matrice AGP / Gradle / JDK', '`compileSdk`, `targetSdk` et `minSdk`', 'ABI et code natif', 'Niveaux de tests Android', 'APK, AAB et artefacts de distribution', ): assert phrase in android, phrase assert Path('docs/rules/520-JAVA.md').read_text(encoding='utf-8').startswith( '\n' ) assert Path('docs/rules/522-GRADLE.md').read_text(encoding='utf-8').startswith( '\n' ) assert Path('docs/rules/600-PLATFORMS.md').read_text(encoding='utf-8').startswith( '\n' ) plan = Path('docs/plans/009-V0_1_3_ANDROID_REEVALUATION_PLAN.md').read_text(encoding='utf-8') for phrase in ( 'Classification initiale des décisions Games', '`ADOPT`', '`KEEP-LOCAL`', '`OVERRIDE`', '`DEFER`', 'alpha.2 — structure, composition et contrats Android de base', 'alpha.3 — natif, packaging, distribution et validation', 'beta.1 — réconciliation et décision d\'artefacts', 'AGP `9.4.0`', 'Gradle système `>= 9.6.0`', 'NDK `r28c`', 'PAGE_SIZE=16384', 'documentation Android officielle courante', '0.1.4 — domaine Tauri', '0.1.5', ): assert phrase in plan, phrase assert not Path('docs/validation/006-ANDROID_VALIDATION.md').exists() assert not Path('history/0.1.3/alpha.1.md').exists() print('0.1.3 alpha.1 structural audit: clean (90 prior pairs, Games Android classified, Tauri/adoption boundaries preserved)') PY git diff --check git add VERSION README.md docs/000-README.md \ docs/plans/009-V0_1_3_ANDROID_REEVALUATION_PLAN.md \ deltas/0.1.3/alpha.1.md git diff --cached --check git status --short ``` Le scope indexé attendu avant ajout du history est : ```text M README.md M VERSION A deltas/0.1.3/alpha.1.md M docs/000-README.md A docs/plans/009-V0_1_3_ANDROID_REEVALUATION_PLAN.md ``` La revue opérateur doit également confirmer que : - `alpha.1` n'a pas modifié `610-ANDROID.md` avant validation du cadrage ; - les versions exactes Games (AGP/Gradle/JDK/SDK/NDK/SDL3) restent des preuves ou choix locaux, pas des contraintes PGR universelles ; - `Android/` reste une convention de séparation multi-plateforme et n'est pas imposé artificiellement à un dépôt Android-only ; - Java reste un owner composé seulement lorsqu'il existe réellement du code Java ; - les quatre ABI, JNI, `cargo ndk`, SDL3, Activities et assets Games restent des responsabilités produit/framework/spécialisation ; - aucune exigence 16 KB n'est normalisée sans vérification des sources Android officielles courantes ; - aucun nouveau template, audit, skeleton ou contrat de validation Android n'est créé par symétrie ; - Games reste un corpus externe non modifié et son adoption reste réservée à `0.1.5` ; - le skeleton Tauri reste `DEFER` jusqu'à `0.1.4` ; - aucun nouveau numéro au-delà de `0.1.7` n'est réservé. ## Transition ### PASS Produire `history/0.1.3/alpha.1.md` à partir des résultats réellement observés. Dans la même réponse, si aucune décision nouvelle n'est ouverte, préparer séparément le delta `0.1.3-alpha.2` consacré à la structure, la composition et aux contrats Android de base définis par le plan, sans absorber encore les détails natifs/packaging de `alpha.3`. Après remise du history, fournir automatiquement le bloc opérateur exact pour appliquer le history, committer/pusher `0.1.3-alpha.1`, puis seulement appliquer le delta suivant conformément à `docs/templates/006-OPERATOR_COMMAND_HANDOFF.md`. ### FAIL Consigner le résultat réel dans le history, puis ouvrir `0.1.3-alpha.1.fix.1` ou un REPLAN selon la cause. Aucun changement prévu pour `alpha.2` ne doit être absorbé silencieusement dans le fix.