Files
pgr/deltas/0.1.2/rc.1.md
2026-09-28 01:21:44 +02:00

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

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.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.