313 lines
11 KiB
Markdown
313 lines
11 KiB
Markdown
<!-- file: deltas/0.1.3/rc.1.md -->
|
|
<!-- version: 1 -->
|
|
|
|
# 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 :
|
|
|
|
```text
|
|
0.1.3-beta.1
|
|
```
|
|
|
|
Version après application :
|
|
|
|
```text
|
|
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 :
|
|
|
|
```text
|
|
VERSION
|
|
CHANGELOG.md
|
|
docs/000-README.md
|
|
docs/plans/009-V0_1_3_ANDROID_REEVALUATION_PLAN.md
|
|
```
|
|
|
|
ADD :
|
|
|
|
```text
|
|
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 :
|
|
|
|
```bash
|
|
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 :
|
|
|
|
```bash
|
|
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 :
|
|
|
|
```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/templates sans simuler une toolchain Android ou Tauri absente du dépôt PGR :
|
|
|
|
```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.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 :
|
|
|
|
```text
|
|
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.
|