# Delta 0.1.2-rc.1 — gel du scope et gate de release candidate ## Baseline et version Baseline attendue : commit opérateur de `0.1.2-beta.1`, réalisé après application de `history/0.1.2/beta.1.md` avec statut `PASS`. Le hash de ce commit n'est pas anticipé. Version avant application : ```text 0.1.2-beta.1 ``` Version après application : ```text 0.1.2-rc.1 ``` ## Objet et gel La RC gèle le scope fonctionnel de `0.1.2` sur : - `520-JAVA.md` comme owner du langage Java, de la compatibilité JDK/source/bytecode-runtime, de la structure, de l'API et des tests Java ; - `521-MAVEN.md` comme spécialisation Maven uniquement lorsqu'un projet utilise réellement Maven ; - `522-GRADLE.md` comme spécialisation Gradle uniquement lorsqu'un projet utilise réellement Gradle ; - la distinction JDK de build / niveau Java source / niveau de bytecode-runtime sans généraliser les versions particulières de Games ; - l'ownership Gradle `settings` / root / modules / propriétés partagées, avec séparation de l'état local ; - le Wrapper comme mécanisme conditionnel de reproductibilité et Gradle système comme politique valide seulement lorsque sa contrainte est effectivement vérifiée ; - l'ancien `520-JAVA_MAVEN_GRADLE.md` comme bridge `SUPERSEDED` non normatif afin de préserver les liens historiques ; - la décision beta qu'aucun template, skeleton, audit Python, contrat de validation ou artefact Maven supplémentaire n'est justifié par le corpus disponible ; - la frontière Android : AGP, SDK/NDK, ABI/JNI, manifests/resources, packaging/signing, devices/AVD, contraintes 16 KB et SDL3 restent hors des owners Java/Maven/Gradle et sont réévalués séparément en `0.1.3`. Le changelog reçoit une entrée candidate `0.1.2` orientée utilisateurs. Le prompt `009-V0_1_3_START_PROMPT.md` est préparé pour la prochaine cible engagée Android à partir de Games. Aucune nouvelle règle fonctionnelle n'entre dans cette RC. Les owners `520/521/522`, le bridge historique, `610-ANDROID.md`, les templates, skeletons, validations et scripts d'audit sont vérifiés mais non modifiés. ## Scope REPLACE : ```text VERSION CHANGELOG.md docs/000-README.md docs/plans/008-V0_1_2_JAVA_GRADLE_REEVALUATION_PLAN.md ``` ADD : ```text deltas/0.1.2/rc.1.md prompts/009-V0_1_3_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.2-rc.1' git cat-file -e HEAD:history/0.1.2/beta.1.md test -f history/0.1.2/beta.1.md test -f deltas/0.1.2/rc.1.md test -f prompts/009-V0_1_3_START_PROMPT.md test ! -e history/0.1.2/rc.1.md grep -A2 '^## Statut$' history/0.1.2/beta.1.md | grep -Fx 'PASS' grep -Fx '' CHANGELOG.md grep -Fx '## 0.1.2 (candidate)' CHANGELOG.md grep -Fx '' docs/000-README.md grep -Fx '' docs/plans/008-V0_1_2_JAVA_GRADLE_REEVALUATION_PLAN.md grep -Fx '' ROADMAP.md grep -Fx '' prompts/009-V0_1_3_START_PROMPT.md grep -Fx '' docs/rules/520-JAVA.md grep -Fx '' docs/rules/521-MAVEN.md grep -Fx '' docs/rules/522-GRADLE.md grep -Fx '' docs/rules/520-JAVA_MAVEN_GRADLE.md grep -Fx '' docs/rules/610-ANDROID.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.2.fix.1.md": "PASS", "alpha.3.md": "PASS", "beta.1.md": "PASS", } histories = {path.name for path in Path("history/0.1.2").glob("*.md")} assert histories == set(expected), histories for name, status in expected.items(): text = Path("history/0.1.2", 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.2").glob("*.md")} assert deltas == set(expected) | {"rc.1.md"}, deltas changelog = Path("CHANGELOG.md").read_text(encoding="utf-8") assert "## 0.1.2 (candidate)" in changelog section = changelog.split("## 0.1.2 (candidate)", 1)[1].split("## 0.1.1", 1)[0] for phrase in ( "trois owners indépendants", "520-JAVA", "521-MAVEN", "522-GRADLE", "JDK utilisé pour construire", "Wrapper", "Gradle système", "SUPERSEDED", "réévaluation pratique reste la cible distincte `0.1.3`", ): assert phrase in section, phrase for forbidden in ( "alpha.1", "alpha.2", "alpha.3", "beta.1", "rc.1", ): assert forbidden not in section, forbidden java = Path("docs/rules/520-JAVA.md").read_text(encoding="utf-8") maven = Path("docs/rules/521-MAVEN.md").read_text(encoding="utf-8") gradle = Path("docs/rules/522-GRADLE.md").read_text(encoding="utf-8") legacy = Path("docs/rules/520-JAVA_MAVEN_GRADLE.md").read_text(encoding="utf-8") android = Path("docs/rules/610-ANDROID.md").read_text(encoding="utf-8") assert "# Profil Java" in java assert "# Profil Maven" in maven assert "# Profil Gradle" in gradle assert "`SUPERSEDED` depuis `0.1.2-alpha.3`." in legacy assert "Il ne constitue plus un profil sélectionnable" in legacy for current in ( "RULES.md", "docs/000-README.md", "docs/rules/000-README.md", "docs/rules/610-ANDROID.md", ): assert "520-JAVA_MAVEN_GRADLE.md" not in Path(current).read_text(encoding="utf-8"), current for local_choice in ( "JDK 25", "source/target 17", "Gradle 9.6.0", "Gradle 9.7.1", "AGP 9.4.0", ): assert local_choice not in java, local_choice assert local_choice not in maven, local_choice assert local_choice not in gradle, local_choice for android_term in ( "compileSdk", "targetSdk", "minSdk", "NDK", "ABI/JNI", "APK/AAB", "device/AVD", "SDL3", ): assert android_term not in maven, android_term assert android_term not in gradle, android_term for phrase in ( "Matrice AGP / Gradle / JDK", "`compileSdk`, `targetSdk` et `minSdk`", "ABI et code natif", "Signing et secrets", ): assert phrase in android, phrase roadmap = Path("ROADMAP.md").read_text(encoding="utf-8") assert "- `( ) 0.1.2`" in roadmap 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 plan = Path("docs/plans/008-V0_1_2_JAVA_GRADLE_REEVALUATION_PLAN.md").read_text(encoding="utf-8") for phrase in ( "### beta.1 — réconciliation et décision d'artefacts", "Statut opérateur : **PASS**.", "### rc.1 — release candidate", "Statut opérateur : **à valider**.", "prompts/009-V0_1_3_START_PROMPT.md", "Aucune nouvelle règle fonctionnelle n'entre en RC", ): assert phrase in plan, phrase prompt = Path("prompts/009-V0_1_3_START_PROMPT.md").read_text(encoding="utf-8") for phrase in ( "archive source téléchargée depuis le tag Gitea `v0.1.2`", "pgr-0.1.2-publish.001-report.md", "0.1.3-alpha.1", "ad6e44a1332eb7d6069cf1189d9433f0fbb8fac19c5aac9f4641ac45c1c556e8", "610-ANDROID.md", "520-JAVA.md", "522-GRADLE.md", "ADOPT / KEEP-LOCAL / OVERRIDE / DEFER", "Android Gradle Plugin / Gradle / JDK", "compileSdk", "targetSdk", "minSdk", "NDK", "ABI", "JNI", "signing", "16 KB", "réservé à `0.1.4`", "adoption Games `0.1.5`", ): assert phrase in prompt, phrase for forbidden in ( "Cargo.toml", "crates/knowledge-domain-lib/src/content_family.rs", "deltas/0.0.1/alpha.3.fix.2.md", "history/0.0.1/alpha.3.fix.1.md", ): assert not Path(forbidden).exists(), forbidden java_related = sorted( str(path) for root in (Path("docs/templates"), Path("docs/skeletons"), Path("docs/validation"), Path("scripts")) for path in root.rglob("*") if path.is_file() and any(word in path.name.lower() for word in ("java", "maven", "gradle")) ) assert java_related == [], java_related print("0.1.2 rc.1 integration audit: clean (5 prior histories, frozen Java/Maven/Gradle owners, candidate changelog and prompt 009 verified, Android boundary preserved)") 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 et la parsabilité des templates de baseline sans prétendre simuler une toolchain Java/Maven/Gradle absente : ```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.2 rc.1 text/template hygiene: clean") PYHYGIENE git diff --check git add VERSION CHANGELOG.md docs/000-README.md \ docs/plans/008-V0_1_2_JAVA_GRADLE_REEVALUATION_PLAN.md \ prompts/009-V0_1_3_START_PROMPT.md \ deltas/0.1.2/rc.1.md git diff --cached --check git status --short ``` Le scope indexé attendu avant ajout du history de `rc.1` est exactement : ```text M CHANGELOG.md M VERSION A deltas/0.1.2/rc.1.md M docs/000-README.md M docs/plans/008-V0_1_2_JAVA_GRADLE_REEVALUATION_PLAN.md A prompts/009-V0_1_3_START_PROMPT.md ``` ## Revue opérateur complémentaire Confirmer que : - le scope normatif Java/Maven/Gradle est gelé ; - aucun owner `520/521/522`, bridge historique, profil Android, template, skeleton, contrat de validation ou script d'audit n'est modifié par la RC ; - le changelog candidat décrit les capacités utiles de `0.1.2` sans recopier les tranches internes ni l'incident de chaîne de commit ; - aucun choix local Games n'est promu comme minimum Java/Maven/Gradle générique ; - Maven n'est pas présenté comme éprouvé par Games ; - l'absence d'artefacts Java/Maven/Gradle supplémentaires reste une décision positive fondée sur le corpus, pas un oubli ; - Android reste hors du scope fonctionnel de `0.1.2` et le prompt `009` ne devient exécutable qu'après publication vérifiée de `v0.1.2` ; - le prompt `009` ne transforme pas SDL3, les jeux ou Tauri Android en règles Android générales ; - le skeleton Tauri reste réservé à `0.1.4` et l'adoption Games à `0.1.5` ; - `0.1.8` n'est pas réservé ; - aucune preuve `javac`, Maven, Gradle ou Android n'est revendiquée localement alors que PGR ne contient pas d'artefact exécutable correspondant dans cette RC. ## Transition ### PASS Produire `history/0.1.2/rc.1.md`, l'appliquer puis committer/pousser `rc.1`. Continuer avec `0.1.2-rel.1` pour la promotion mécanique vers la stable, la clôture roadmap/plan/changelog et la gate pré-tag. ### FAIL Consigner le diagnostic réel dans `history/0.1.2/rc.1.md`. Corriger uniquement la release candidate dans `rc.1.fix.N` tant qu'aucun défaut normatif plus large ne justifie un REPLAN. Ne pas préparer `rel.1` tant que la RC n'a pas obtenu `PASS`.