0.1.2-alpha.3

This commit is contained in:
2026-09-28 00:05:12 +02:00
parent 8de2daa716
commit 226d61b041
14 changed files with 1006 additions and 355 deletions

365
deltas/0.1.2/alpha.3.md Normal file
View File

@@ -0,0 +1,365 @@
<!-- file: deltas/0.1.2/alpha.3.md -->
<!-- version: 1 -->
# 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 '<!-- 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 :
```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`.