Files
pgr/deltas/0.1.2/alpha.3.md
2026-09-28 00:05:12 +02:00

13 KiB

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 :

0.1.2-alpha.2.fix.1

Version après application :

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 :

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 :

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 :

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 :

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 :

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 :

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é :

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 '<!-- version: 4 -->' 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 '<!-- version: 4 -->' docs/rules/520-JAVA.md
grep -Fx '<!-- version: 1 -->' docs/rules/521-MAVEN.md
grep -Fx '<!-- version: 1 -->' docs/rules/522-GRADLE.md
grep -Fx '<!-- version: 3 -->' docs/rules/610-ANDROID.md
grep -Fx '<!-- version: 7 -->' docs/architecture/003-RULE_PROFILE_MODEL.md
grep -Fx '<!-- version: 3 -->' docs/plans/008-V0_1_2_JAVA_GRADLE_REEVALUATION_PLAN.md
grep -Fx '<!-- version: 14 -->' RULES.md
grep -Fx '<!-- version: 16 -->' docs/rules/000-README.md
grep -Fx '<!-- version: 33 -->' docs/000-README.md
grep -Fx '<!-- version: 13 -->' 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 <module> -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 :

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.