Files
pgr/deltas/0.1.3/rc.1.md
2026-09-28 13:00:04 +02:00

11 KiB

Delta 0.1.3-rc.1 — gel du scope Android et gate de release candidate

Baseline et version

Baseline attendue : commit opérateur de 0.1.3-beta.1, réalisé après application de history/0.1.3/beta.1.md avec statut PASS.

Le hash de ce commit n'est pas anticipé.

Version avant application :

0.1.3-beta.1

Version après application :

0.1.3-rc.1

Objet et gel

La RC gèle le scope fonctionnel de 0.1.3 sur :

  • Android comme spécialisation de 600-PLATFORMS.md, neutre vis-à-vis du langage applicatif et composant Java/Gradle uniquement lorsqu'ils sont réellement applicables ;
  • les responsabilités distinctes de compileSdk, targetSdk et minSdk, avec minSdk justifié par le contrat produit plutôt que minimisé cérémoniellement ;
  • namespace, applicationId, manifests/resources, configuration locale et signing comme responsabilités Android clairement bornées ;
  • NDK, ABI et bibliothèques natives uniquement pour les projets réellement concernés, sans version NDK ni liste d'ABI universelles ;
  • la séparation entre compilation native, packaging et preuve runtime ;
  • Android Lint comme gate explicite, avec tests JVM, tests instrumentés et smokes device/AVD sélectionnés proportionnellement au changement ;
  • la distinction APK/AAB versus preuve d'installation/exécution ;
  • la compatibilité pages mémoire 16 KB comme contrat conditionnel au code natif, au package et au canal de distribution concernés, sans minimum AGP/NDK/SDK universel ;
  • les choix spécifiques Games — versions d'outils, niveaux SDK, quatre ABI, Rust/JNI/SDL, modules et assets — conservés comme décisions locales ;
  • la décision beta qu'aucun skeleton Android, template de build, audit Python, owner JNI/Rust/SDL ni contrat de validation Android séparé n'est justifié ;
  • la frontière suivante : réexamen Tauri 0.1.4, adoption Games 0.1.5, adoption KSP 0.1.6.

Le changelog reçoit une entrée candidate 0.1.3 orientée utilisateurs. Le prompt 010-V0_1_4_START_PROMPT.md est préparé pour le réexamen Tauri après publication vérifiée de v0.1.3.

Aucune nouvelle règle fonctionnelle Android n'entre dans cette RC. Les owners, skeletons, templates, validations et scripts sont vérifiés mais non modifiés.

Scope

REPLACE :

VERSION
CHANGELOG.md
docs/000-README.md
docs/plans/009-V0_1_3_ANDROID_REEVALUATION_PLAN.md

ADD :

deltas/0.1.3/rc.1.md
prompts/010-V0_1_4_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.3-rc.1'
git cat-file -e HEAD:history/0.1.3/beta.1.md
test -f history/0.1.3/beta.1.md
test -f deltas/0.1.3/rc.1.md
test -f prompts/010-V0_1_4_START_PROMPT.md
test ! -e history/0.1.3/rc.1.md

grep -A2 '^## Statut$' history/0.1.3/beta.1.md | grep -Fx 'PASS'
grep -Fx '<!-- version: 16 -->' CHANGELOG.md
grep -Fx '## 0.1.3 (candidate)' CHANGELOG.md
grep -Fx '<!-- version: 39 -->' docs/000-README.md
grep -Fx '<!-- version: 5 -->' docs/plans/009-V0_1_3_ANDROID_REEVALUATION_PLAN.md
grep -Fx '<!-- version: 14 -->' ROADMAP.md
grep -Fx '<!-- version: 1 -->' prompts/010-V0_1_4_START_PROMPT.md

grep -Fx '<!-- version: 5 -->' docs/rules/610-ANDROID.md
grep -Fx '<!-- version: 6 -->' docs/rules/710-TAURI.md
grep -Fx '<!-- version: 2 -->' docs/studies/002-TAURI_SKELETON_DECISION.md
grep -Fx '<!-- version: 1 -->' docs/skeletons/003-WEB_FRONTEND.md
grep -Fx '<!-- version: 1 -->' docs/validation/005-WEB_FRONTEND_VALIDATION.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.3.md": "PASS",
    "beta.1.md": "PASS",
}

histories = {path.name for path in Path("history/0.1.3").glob("*.md")}
assert histories == set(expected), histories
for name, status in expected.items():
    text = Path("history/0.1.3", 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.3").glob("*.md")}
assert deltas == set(expected) | {"rc.1.md"}, deltas

changelog = Path("CHANGELOG.md").read_text(encoding="utf-8")
assert "## 0.1.3 (candidate)" in changelog
section = changelog.split("## 0.1.3 (candidate)", 1)[1].split("## 0.1.2", 1)[0]
for phrase in (
    "profil Android",
    "compileSdk",
    "targetSdk",
    "minSdk",
    "namespace",
    "applicationId",
    "NDK",
    "Android Lint",
    "tests instrumentés",
    "APK/AAB",
    "16 KB",
    "0.1.4",
    "0.1.5",
):
    assert phrase in section, phrase
for forbidden in (
    "alpha.1",
    "alpha.2",
    "alpha.3",
    "beta.1",
    "rc.1",
):
    assert forbidden not in section, forbidden

android = Path("docs/rules/610-ANDROID.md").read_text(encoding="utf-8")
for phrase in (
    "Android ne sélectionne pas à lui seul le langage applicatif du projet.",
    "Le choix de `minSdk` MUST être justifié par le contrat produit",
    "PGR ne fixe ni version NDK ni liste universelle d'ABI.",
    "PGR MUST NOT supposer qu'un build Gradle ordinaire exécute Lint automatiquement.",
    "Un AAB n'est pas directement une preuve d'installation ou d'exécution sur device.",
    "## Pages mémoire 16 KB et packaging natif",
    "PGR MUST NOT imposer une version AGP/NDK globale uniquement pour cette raison.",
):
    assert phrase in android, phrase
for forbidden in (
    "targetSdk MUST être 36",
    "minSdk MUST être 21",
    "NDK MUST être r28",
    "MUST supporter arm64-v8a, armeabi-v7a, x86_64 et x86",
    "Gradle MUST être 9.7.1",
    "AGP MUST être 9.4.0",
    "JDK MUST être 25",
):
    assert forbidden not in android, forbidden

plan = Path("docs/plans/009-V0_1_3_ANDROID_REEVALUATION_PLAN.md").read_text(encoding="utf-8")
for phrase in (
    "### beta.1 — réconciliation et décision d'artefacts\n\nRelire",
    "Statut opérateur : **PASS**.",
    "### rc.1 — release candidate\n\nStatut opérateur : **à valider**.",
    "prompts/010-V0_1_4_START_PROMPT.md",
    "Aucune nouvelle fonctionnalité normative Android ne doit apparaître en RC.",
):
    assert phrase in plan, phrase

prompt = Path("prompts/010-V0_1_4_START_PROMPT.md").read_text(encoding="utf-8")
for phrase in (
    "archive source téléchargée depuis le tag Gitea `v0.1.3`",
    "pgr-0.1.3-publish.001-report.md",
    "0.1.4-alpha.1",
    "2a9cabcb9f147a348dcf8d24df8bc6c5029089b6d49feb17bd4a42b4293c329a",
    "ad6e44a1332eb7d6069cf1189d9433f0fbb8fac19c5aac9f4641ac45c1c556e8",
    "002-TAURI_SKELETON_DECISION.md",
    "710-TAURI.md",
    "003-WEB_FRONTEND",
    "ADOPT / KEEP-LOCAL / OVERRIDE / DEFER",
    "conditions de sortie",
    "créer le skeleton Tauri parce que la roadmap le mentionne",
    "adoption Games `0.1.5`",
    "adoption KSP `0.1.6`",
):
    assert phrase in prompt, phrase

study = Path("docs/studies/002-TAURI_SKELETON_DECISION.md").read_text(encoding="utf-8")
for phrase in (
    "DEFER",
    "Condition 1 — TypeScript et conventions Web contrôlées",
    "Condition 2 — Vite et ownership des commandes/dev server/build outputs",
    "Condition 3 — Sass/CSS et statut des artefacts générés",
    "Condition 4 — validation frontend indépendante de la validation Tauri",
    "Condition 5 — framework CSS classé comme décision de skeleton/projet",
    "réexamen autorisé            0.1.4",
    "création automatique         interdite",
):
    assert phrase in study, phrase

roadmap = Path("ROADMAP.md").read_text(encoding="utf-8")
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

for forbidden_path in (
    "docs/validation/006-ANDROID_VALIDATION.md",
    "docs/skeletons/004-ANDROID.md",
    "docs/rules/620-JNI.md",
    "docs/skeletons/004-TAURI.md",
):
    assert not Path(forbidden_path).exists(), forbidden_path

index = Path("docs/000-README.md").read_text(encoding="utf-8")
assert "../prompts/010-V0_1_4_START_PROMPT.md" in index

print("0.1.3 rc.1 integration audit: clean (4 prior histories, frozen Android profile, candidate changelog and prompt 010 verified)")
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/templates sans simuler une toolchain Android ou Tauri absente du dépôt PGR :

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.3 rc.1 text/template hygiene: clean")
PYHYGIENE

git diff --check
git add VERSION CHANGELOG.md docs/000-README.md \
    docs/plans/009-V0_1_3_ANDROID_REEVALUATION_PLAN.md \
    deltas/0.1.3/rc.1.md prompts/010-V0_1_4_START_PROMPT.md
git diff --cached --check
git status --short

Le scope indexé attendu avant ajout du history est exactement :

M  CHANGELOG.md
M  VERSION
A  deltas/0.1.3/rc.1.md
M  docs/000-README.md
M  docs/plans/009-V0_1_3_ANDROID_REEVALUATION_PLAN.md
A  prompts/010-V0_1_4_START_PROMPT.md

La revue qualitative doit confirmer que :

  • aucune règle fonctionnelle Android nouvelle n'entre en RC ;
  • 610-ANDROID.md reste en révision 5 et aucun choix Games n'est généralisé ;
  • aucun artefact Android supplémentaire n'est créé ;
  • le changelog candidat décrit la valeur utilisateur de 0.1.3 sans recopier la chronologie alpha/beta/RC ;
  • le prompt 010 exige une future stable v0.1.3 réellement publiée et son rapport post-tag PASS ;
  • le DEFER Tauri n'est pas levé par le prompt : 0.1.4 doit le réexaminer objectivement contre les corpus courants ;
  • l'adoption Games 0.1.5 et l'adoption KSP 0.1.6 ne sont pas commencées ;
  • aucune preuve Android/Tauri exécutable n'est simulée dans PGR.

Transition

PASS

Produire séparément history/0.1.3/rc.1.md, puis préparer la promotion mécanique 0.1.3-rel.1 sans rouvrir le scope fonctionnel.