12 KiB
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 :
0.1.2-beta.1
Version après application :
0.1.2-rc.1
Objet et gel
La RC gèle le scope fonctionnel de 0.1.2 sur :
520-JAVA.mdcomme owner du langage Java, de la compatibilité JDK/source/bytecode-runtime, de la structure, de l'API et des tests Java ;521-MAVEN.mdcomme spécialisation Maven uniquement lorsqu'un projet utilise réellement Maven ;522-GRADLE.mdcomme 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.mdcomme bridgeSUPERSEDEDnon 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 :
VERSION
CHANGELOG.md
docs/000-README.md
docs/plans/008-V0_1_2_JAVA_GRADLE_REEVALUATION_PLAN.md
ADD :
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 :
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 :
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 :
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 :
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 :
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.2sans 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.2et le prompt009ne devient exécutable qu'après publication vérifiée dev0.1.2; - le prompt
009ne transforme pas SDL3, les jeux ou Tauri Android en règles Android générales ; - le skeleton Tauri reste réservé à
0.1.4et l'adoption Games à0.1.5; 0.1.8n'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.