0.1.3-rc.1
This commit is contained in:
312
deltas/0.1.3/rc.1.md
Normal file
312
deltas/0.1.3/rc.1.md
Normal file
@@ -0,0 +1,312 @@
|
||||
<!-- 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.
|
||||
Reference in New Issue
Block a user