# Delta 0.1.2-alpha.3 — REPLAN et scission Java / Maven / Gradle ## Baseline et version Baseline attendue : commit opérateur de `0.1.2-alpha.2.fix.1`, réalisé après application de `history/0.1.2/alpha.2.fix.1.md` avec statut `PASS`. Le fix de récupération doit donc être publié avant application de la présente tranche. Le hash de ce commit n'est pas anticipé. L'ancien stash `pgr-0.1.2-alpha.3-before-alpha.2-recovery` est uniquement une sauvegarde de l'application effectuée sur le HEAD contaminé ; il ne constitue pas une source autoritaire et doit être abandonné après publication du fix. Version avant application : ```text 0.1.2-alpha.2.fix.1 ``` Version après application : ```text 0.1.2-alpha.3 ``` ## Motif du REPLAN La gate de `alpha.2` valide le contenu normatif ajouté à l'ancien profil combiné. La réconciliation préparatoire de `beta.1` révèle toutefois une ambiguïté d'ownership prévue comme déclencheur de REPLAN dans le plan actif. `500-LANGUAGES.md` autorise un langage et son build tool dans un même profil lorsque leur séparation serait artificielle, mais indique qu'ils SHOULD être séparés lorsque plusieurs build tools interchangeables possèdent chacun des règles propres significatives. Après `alpha.2`, Maven et Gradle possèdent chacun des contrats substantiels et indépendants : ownership du build, Wrapper, validation et outputs ; Gradle possède en plus sa politique de version système, DSL, propriétés et version catalog. Un profil unique `Java / Maven / Gradle` rend donc l'applicabilité ambiguë : un projet Java n'utilise pas nécessairement les deux build tools, et Gradle n'implique pas nécessairement Java. La scission devient une correction d'ownership, pas une préférence de taxonomie. ## Scope REPLACE : ```text VERSION RULES.md ROADMAP.md docs/000-README.md docs/architecture/003-RULE_PROFILE_MODEL.md docs/plans/008-V0_1_2_JAVA_GRADLE_REEVALUATION_PLAN.md docs/rules/000-README.md docs/rules/520-JAVA_MAVEN_GRADLE.md docs/rules/610-ANDROID.md ``` ADD : ```text docs/rules/520-JAVA.md docs/rules/521-MAVEN.md docs/rules/522-GRADLE.md deltas/0.1.2/alpha.3.md ``` DELETE : aucun. L'ancien chemin `docs/rules/520-JAVA_MAVEN_GRADLE.md` devient un bridge `SUPERSEDED` non normatif. Il est conservé uniquement parce que des prompts, plans, deltas, histories et études historiques le référencent encore ; ces snapshots ne doivent pas être réécrits a posteriori et les audits de liens doivent rester propres. Aucun `history/0.1.2/alpha.3.md` n'est anticipé. ## Owners après scission Le découpage courant devient : ```text 520 Java 521 Maven 522 Gradle ``` ### `520-JAVA.md` Possède uniquement les règles Java : - politique JDK et compatibilité source/bytecode/runtime ; - structure `src/main/java` / `src/test/java` ; - packages, modules, imports et visibilité ; - interfaces/API, annotations, nullabilité et exceptions ; - tests Java ; - composition explicite avec Maven ou Gradle selon le build réellement utilisé. Il ne possède plus les règles de Wrapper, reactor, Gradle DSL ou outputs des build tools. ### `521-MAVEN.md` Possède les responsabilités Maven : - POM parent/root et héritage multi-module ; - `dependencyManagement` / `pluginManagement` ; - miroir technique de `VERSION` lorsque Maven l'exige ; - Maven système versus Wrapper sans cérémonie ; - validation ciblée puis reactor/`verify` selon le scope ; - `target/`, état local et futurs audits réellement justifiés. Games n'exerce toujours aucun projet Maven : la scission ne prétend donc pas avoir validé une nouvelle convention Maven par corpus ; elle isole seulement les règles déjà existantes et cohérentes. ### `522-GRADLE.md` Possède les responsabilités Gradle validées et clarifiées en `alpha.2` : - ownership `settings` / root / module / propriétés partagées ; - contrainte Gradle système effectivement vérifiée ou Wrapper lorsque pertinent ; - neutralité Groovy/Kotlin DSL ; - version catalog optionnel ; - validation ciblée et `clean` non systématique ; - `.gradle/`, `build/`, état local et futurs audits réellement justifiés. Le niveau Java reste possédé par `520-JAVA.md` lorsqu'un build Gradle construit du Java. ## Bridge historique `520-JAVA_MAVEN_GRADLE.md` passe en révision `4` et ne contient plus de règles courantes. Il indique explicitement : ```text SUPERSEDED 520-JAVA.md owner Java courant 521-MAVEN.md spécialisation Maven courante 522-GRADLE.md spécialisation Gradle courante ``` Il n'est plus référencé par `RULES.md`, les index de règles ou les compositions courantes. Sa seule responsabilité est la compatibilité documentaire des références historiques. ## Frontière Android `610-ANDROID.md` change uniquement pour refléter la nouvelle composition : ```text Android + Gradle -> 600 + 610 + 522 Android + Java -> + 520 lorsque Java est réellement présent ``` Une application Android n'applique pas `520` uniquement parce qu'elle utilise Android ou Gradle. Aucune règle AGP, `compileSdk`, `targetSdk`, `minSdk`, NDK, ABI/JNI, manifests/resources, packaging/signing, device/AVD, 16 KB ou SDL3 n'est réévaluée dans cette tranche. Ce scope reste réservé à `0.1.3`. ## Décision d'artefacts La scission n'autorise aucun artefact technique supplémentaire. Restent non justifiés : ```text skeleton Java/Gradle générique template Maven ou Gradle générique audit Python Java/Maven/Gradle nouveau contrat de validation spécialisé artefact Maven issu de Games ``` Les trois profils sont des owners normatifs nécessaires à l'applicabilité ; ils ne constituent pas une duplication fonctionnelle du build tool officiel. ## Validation opérateur Après application du history `PASS`, commit/push de `alpha.2.fix.1`, abandon de l'ancien stash de sécurité, puis application du présent delta régénéré : ```bash test "$(cat VERSION)" = '0.1.2-alpha.3' git cat-file -e HEAD:history/0.1.2/alpha.2.fix.1.md test -f history/0.1.2/alpha.2.md test -f history/0.1.2/alpha.2.fix.1.md test -f deltas/0.1.2/alpha.3.md test ! -e history/0.1.2/alpha.3.md grep -A2 '^## Statut$' history/0.1.2/alpha.2.md | grep -Fx 'PASS' grep -A2 '^## Statut$' history/0.1.2/alpha.2.fix.1.md | grep -Fx 'PASS' test ! -e Cargo.toml test ! -e crates/knowledge-domain-lib/src/content_family.rs test ! -e deltas/0.0.1/alpha.3.fix.2.md test ! -e history/0.0.1/alpha.3.fix.1.md grep -Fx '' docs/rules/520-JAVA_MAVEN_GRADLE.md grep -Fx '`SUPERSEDED` depuis `0.1.2-alpha.3`.' docs/rules/520-JAVA_MAVEN_GRADLE.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/610-ANDROID.md grep -Fx '' docs/architecture/003-RULE_PROFILE_MODEL.md grep -Fx '' docs/plans/008-V0_1_2_JAVA_GRADLE_REEVALUATION_PLAN.md grep -Fx '' RULES.md grep -Fx '' docs/rules/000-README.md grep -Fx '' docs/000-README.md grep -Fx '' ROADMAP.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.2/alpha.2.md').read_text(encoding='utf-8') assert re.search(r'## Statut\s+PASS\s', history) recovery = Path('history/0.1.2/alpha.2.fix.1.md').read_text(encoding='utf-8') assert re.search(r'## Statut\s+PASS\s', recovery) family = Path('docs/rules/500-LANGUAGES.md').read_text(encoding='utf-8') for phrase in ( 'Un langage et son build tool MAY partager un profil', 'Ils SHOULD être séparés lorsque plusieurs build tools interchangeables possèdent chacun des règles propres significatives.', 'Une spécialisation de build tool ne devient pas une règle du langage entier.', ): assert phrase in family, phrase legacy = Path('docs/rules/520-JAVA_MAVEN_GRADLE.md').read_text(encoding='utf-8') for phrase in ( '`SUPERSEDED` depuis `0.1.2-alpha.3`.', 'Il ne constitue plus un profil sélectionnable', '520-JAVA.md', '521-MAVEN.md', '522-GRADLE.md', ): assert phrase in legacy, phrase java = Path('docs/rules/520-JAVA.md').read_text(encoding='utf-8') for phrase in ( '# Profil Java', 'JDK utilisé pour construire', 'niveau Java du code source', 'niveau de bytecode/runtime minimal supporté', 'Un projet Java construit avec Maven compose normalement', 'Un projet Java construit avec Gradle compose normalement', ): assert phrase in java, phrase assert '## Maven' not in java assert '## Gradle' not in java maven = Path('docs/rules/521-MAVEN.md').read_text(encoding='utf-8') for phrase in ( '# Profil Maven', 'POM parent/root', 'PGR MUST NOT ajouter un Maven Wrapper uniquement par cérémonie.', './mvnw -pl -am test', 'target/', ): assert phrase in maven, phrase gradle = Path('docs/rules/522-GRADLE.md').read_text(encoding='utf-8') for phrase in ( '# Profil Gradle', 'composition du build et inclusion des projets', 'effectivement vérifiée', 'Groovy DSL et Kotlin DSL sont tous deux reconnus.', 'gradle clean', ): assert phrase in gradle, phrase for forbidden in ( 'compileSdk', 'targetSdk', 'minSdk', 'NDK', 'ABI/JNI', 'APK/AAB', 'device/AVD', 'SDL3', ): assert forbidden not in maven, forbidden assert forbidden not in gradle, forbidden android = Path('docs/rules/610-ANDROID.md').read_text(encoding='utf-8') assert '520-JAVA.md' in android assert '522-GRADLE.md' in android assert '520-JAVA_MAVEN_GRADLE.md' not in android architecture = Path('docs/architecture/003-RULE_PROFILE_MODEL.md').read_text(encoding='utf-8') for phrase in ( '## Scission Java / Maven / Gradle en `0.1.2`', '520 — Java', '521 — Maven', '522 — Gradle', 'GENERAL + 500 + 520 + 522 + 600 + 610', 'bridge `SUPERSEDED` non normatif', ): assert phrase in architecture, phrase 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 plan = Path('docs/plans/008-V0_1_2_JAVA_GRADLE_REEVALUATION_PLAN.md').read_text(encoding='utf-8') for phrase in ( '## Décision après `alpha.2` et REPLAN', '`alpha.2.fix.1` restaure l\'état PGR attendu', 'alpha.3 scission des owners Java / Maven / Gradle', '520-JAVA.md', '521-MAVEN.md', '522-GRADLE.md', 'bridge documentaire non normatif', 'aucun template, skeleton, audit Java/Gradle ou nouvel artefact Maven n\'est justifié', ): assert phrase in plan, phrase for foreign 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(foreign).exists(), foreign print('0.1.2 alpha.3 owner split audit: clean (recovery baseline confirmed, Java/Maven/Gradle applicability separated, historical bridge preserved, Android boundary preserved)') PYGATE git diff --check git add -A git diff --cached --check git status --short ``` Le scope indexé attendu avant ajout du history est exactement : ```text M ROADMAP.md M RULES.md M VERSION A deltas/0.1.2/alpha.3.md M docs/000-README.md M docs/architecture/003-RULE_PROFILE_MODEL.md M docs/plans/008-V0_1_2_JAVA_GRADLE_REEVALUATION_PLAN.md M docs/rules/000-README.md M docs/rules/520-JAVA_MAVEN_GRADLE.md A docs/rules/520-JAVA.md A docs/rules/521-MAVEN.md A docs/rules/522-GRADLE.md M docs/rules/610-ANDROID.md ``` La revue qualitative doit confirmer que : - la scission suit une différence réelle d'applicabilité, pas une préférence de taille de fichier ; - l'ancien fichier est uniquement un bridge `SUPERSEDED` et n'apparaît plus dans les index ou compositions courantes ; - aucune règle Java n'est perdue et aucune règle Maven/Gradle n'est remontée dans `520-JAVA.md` ; - Maven et Gradle ne s'appliquent que lorsqu'ils sont réellement utilisés ; - la preuve Games reste principalement une preuve Gradle/Java et ne devient pas une preuve Maven fictive ; - aucun minimum JDK, Java ou Gradle propre à Games n'est généralisé ; - Android ne devient pas une condition d'applicabilité de `522-GRADLE.md` et `610` conserve ses responsabilités ; - les documents historiques ne sont pas réécrits pour masquer l'ancien owner combiné ; - aucun template, skeleton, audit ou contrat de validation supplémentaire n'est créé. ## Transition ### PASS Produire `history/0.1.2/alpha.3.md`, puis préparer `0.1.2-beta.1` pour la réconciliation intégrée des trois owners, la décision finale d'artefacts et les mises à jour documentaires durables nécessaires avant RC. ### FAIL Consigner le diagnostic réel dans `history/0.1.2/alpha.3.md`, puis produire `alpha.3.fix.N` ou effectuer un nouveau REPLAN si la scission révèle une responsabilité qui ne peut pas être possédée proprement par `520`, `521` ou `522`.