360 lines
12 KiB
Markdown
360 lines
12 KiB
Markdown
<!-- file: deltas/0.1.2/rc.1.md -->
|
|
<!-- version: 1 -->
|
|
|
|
# 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 '<!-- version: 14 -->' CHANGELOG.md
|
|
grep -Fx '## 0.1.2 (candidate)' CHANGELOG.md
|
|
grep -Fx '<!-- version: 35 -->' docs/000-README.md
|
|
grep -Fx '<!-- version: 5 -->' docs/plans/008-V0_1_2_JAVA_GRADLE_REEVALUATION_PLAN.md
|
|
grep -Fx '<!-- version: 13 -->' ROADMAP.md
|
|
grep -Fx '<!-- version: 1 -->' prompts/009-V0_1_3_START_PROMPT.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: 4 -->' docs/rules/520-JAVA_MAVEN_GRADLE.md
|
|
grep -Fx '<!-- version: 3 -->' 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`.
|