This commit is contained in:
2026-09-28 01:27:41 +02:00
parent 36b2b2162c
commit 585b508578
8 changed files with 461 additions and 20 deletions

288
deltas/0.1.2/rel.1.md Normal file
View File

@@ -0,0 +1,288 @@
<!-- file: deltas/0.1.2/rel.1.md -->
<!-- version: 1 -->
# Delta 0.1.2 rel.1 — promotion stable pré-tag
## Baseline et version
Baseline : `0.1.2-rc.1`, avec `history/0.1.2/rc.1.md` appliqué et committé. Ce delta MUST NOT être appliqué avant ce commit.
Version avant application :
```text
0.1.2-rc.1
```
Version après application :
```text
0.1.2
```
`rel.1` identifie la clôture opérationnelle ; il ne fait pas partie de la version SemVer du produit.
## Objet
Promouvoir mécaniquement la RC validée vers la stable `0.1.2` sans rouvrir le scope fonctionnel.
La tranche finalise uniquement la présentation et les métadonnées de release : version stable, roadmap terminée, changelog sans marqueur `candidate`, README/index en état stable et plan `008` historique. Aucun owner Java/Maven/Gradle, bridge historique, profil Android, template, skeleton, validation ou script d'audit n'est modifié.
La validation de cette tranche est **pré-tag**. Le tag `v0.1.2`, son archive source Gitea et le rapport `pgr-0.1.2-publish.001-report.md` ne sont pas déclarés existants par ce delta. Ils suivent uniquement un history `rel.1` `PASS`, le commit stable `0.1.2` et la publication réelle du tag.
## Scope
REPLACE :
```text
VERSION
README.md
ROADMAP.md
CHANGELOG.md
docs/000-README.md
docs/plans/008-V0_1_2_JAVA_GRADLE_REEVALUATION_PLAN.md
```
ADD :
```text
deltas/0.1.2/rel.1.md
```
DELETE : aucun.
Le history `rc.1` est livré séparément. Le history `rel.1` sera produit uniquement après la gate opérateur.
## Validation opérateur pré-tag
Après application sur le commit contenant `history/0.1.2/rc.1.md` :
```bash
test "$(cat VERSION)" = '0.1.2'
git cat-file -e HEAD:history/0.1.2/rc.1.md
test -f history/0.1.2/rc.1.md
test -f deltas/0.1.2/rel.1.md
test -f prompts/009-V0_1_3_START_PROMPT.md
test ! -e history/0.1.2/rel.1.md
grep -A2 '^## Statut$' history/0.1.2/rc.1.md | grep -Fx 'PASS'
grep -Fx '<!-- version: 22 -->' README.md
grep -Fx '<!-- version: 14 -->' ROADMAP.md
grep -Fx '<!-- version: 15 -->' CHANGELOG.md
grep -Fx '<!-- version: 36 -->' docs/000-README.md
grep -Fx '<!-- version: 6 -->' docs/plans/008-V0_1_2_JAVA_GRADLE_REEVALUATION_PLAN.md
grep -F -- '- `(x) 0.1.2`' ROADMAP.md
grep -Fx '## 0.1.2' CHANGELOG.md
grep -F 'avec `0.1.2` d’owners Java, Maven et Gradle séparés et composables' README.md
grep -F 'plan historique de la stable `0.1.2`' README.md docs/000-README.md
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",
"rc.1.md": "PASS",
}
for name, status in expected.items():
delta = Path("deltas/0.1.2", name)
history = Path("history/0.1.2", name)
assert delta.is_file(), name
assert history.is_file(), name
text = history.read_text(encoding="utf-8")
assert re.search(rf"## Statut\s+{status}\s", text), (name, status)
pending = {path.name for path in Path("deltas/0.1.2").glob("*.md")} - {
path.name for path in Path("history/0.1.2").glob("*.md")
}
assert pending == {"rel.1.md"}, pending
roadmap = Path("ROADMAP.md").read_text(encoding="utf-8")
assert "- `(x) 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
changelog = Path("CHANGELOG.md").read_text(encoding="utf-8")
assert "## 0.1.2" in changelog.splitlines()
assert "## 0.1.2 (candidate)" not in changelog
section = changelog.split("## 0.1.2", 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", "rel.1"):
assert forbidden not in section, forbidden
readme = Path("README.md").read_text(encoding="utf-8")
assert "avec `0.1.2` d’owners Java, Maven et Gradle séparés et composables" in readme
assert "plan historique de la stable `0.1.2`" in readme
index = Path("docs/000-README.md").read_text(encoding="utf-8")
assert "plan historique de la stable `0.1.2`" in index
assert "à exécuter uniquement après publication et vérification post-tag de `v0.1.2`" in index
plan = Path("docs/plans/008-V0_1_2_JAVA_GRADLE_REEVALUATION_PLAN.md").read_text(encoding="utf-8")
assert "Plan historique de la stable `0.1.2`" in plan
assert "### rc.1 — release candidate\n\nStatut opérateur : **PASS**." in plan
assert "history/0.1.2/rel.1.md" in plan
assert "pgr-0.1.2-publish.001-report.md" in plan
assert "commit `0.1.2` avant le tag `v0.1.2`" in plan
prompt = Path("prompts/009-V0_1_3_START_PROMPT.md").read_text(encoding="utf-8")
assert "tag Gitea `v0.1.2`" in prompt
assert "pgr-0.1.2-publish.001-report.md" in prompt
assert "0.1.3-alpha.1" in prompt
assert "réservé à `0.1.4`" in prompt
assert "adoption Games `0.1.5`" in prompt
for path, version in (
("docs/rules/520-JAVA.md", 4),
("docs/rules/521-MAVEN.md", 1),
("docs/rules/522-GRADLE.md", 1),
("docs/rules/520-JAVA_MAVEN_GRADLE.md", 4),
("docs/rules/610-ANDROID.md", 3),
):
lines = Path(path).read_text(encoding="utf-8").splitlines()
assert lines[1] == f"<!-- version: {version} -->", (path, lines[1])
legacy = Path("docs/rules/520-JAVA_MAVEN_GRADLE.md").read_text(encoding="utf-8")
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 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
workflow = Path("docs/rules/210-WORKFLOW.md").read_text(encoding="utf-8")
assert "history rel.1 FAIL / PARTIAL / BLOCKED" in workflow
assert "premier history rel.N[/fix.M] PASS qui établit réellement la stable" in workflow
assert "commit X.Y.Z" in workflow
print("0.1.2 rel.1 stable gate audit: clean (6 prior histories, rel.1 pending, stable Java/Maven/Gradle presentation and post-tag handoff coherent)")
PYGATE
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
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 rel.1 text/template hygiene: clean")
PYHYGIENE
git diff --check
git add VERSION README.md ROADMAP.md CHANGELOG.md docs/000-README.md \
docs/plans/008-V0_1_2_JAVA_GRADLE_REEVALUATION_PLAN.md \
deltas/0.1.2/rel.1.md
git diff --cached --check
git status --short
```
Le scope attendu avant ajout du history est exactement :
```text
M CHANGELOG.md
M README.md
M ROADMAP.md
M VERSION
A deltas/0.1.2/rel.1.md
M docs/000-README.md
M docs/plans/008-V0_1_2_JAVA_GRADLE_REEVALUATION_PLAN.md
```
La RC a déjà reconfirmé les owners gelés, la frontière Android, le contrat du prompt `009` et l'absence d'artefacts Java/Maven/Gradle supplémentaires. Comme `rel.1` ne modifie aucun artefact technique, la promotion stable rejoue les tests PGR, les audits documentaires et l'hygiène des templates sans simuler de toolchain Java/Maven/Gradle absente du dépôt.
## Revue opérateur complémentaire
Confirmer que :
- le scope fonctionnel de `rc.1` ne change pas ;
- `0.1.2` est présenté comme stable de manière cohérente dans VERSION/README/ROADMAP/CHANGELOG/index/plan ;
- les histories `alpha.1`, `alpha.2`, `alpha.2.fix.1`, `alpha.3`, `beta.1` et `rc.1` restent conservés avec leur statut réel `PASS` ;
- `520-JAVA`, `521-MAVEN` et `522-GRADLE` restent gelés et l'ancien owner combiné reste uniquement un bridge historique `SUPERSEDED` ;
- aucune version particulière de Games ne devient un minimum PGR ;
- le profil Android reste inchangé et `0.1.3` conserve seul sa réévaluation pratique ;
- le skeleton Tauri reste réservé au réexamen `0.1.4` et l'adoption Games à `0.1.5` ;
- la roadmap engagée `0.1.3` à `0.1.7` reste intacte sans `0.1.8` ;
- le prompt `009` reste conditionnel à une vraie publication de `v0.1.2` et à un rapport post-tag `PASS` réel ;
- aucune preuve post-tag n'est anticipée.
## Transition
### PASS
Produire séparément `history/0.1.2/rel.1.md`, l'appliquer, puis créer le commit stable sous le message exact :
```text
0.1.2
```
Après push de la branche canonique, créer et publier le tag annoté `v0.1.2`. Vérifier localement et à distance l'objet tag et son commit déréférencé. Télécharger ensuite l'archive source depuis le tag Gitea et la fournir au générateur avec les sorties Git de publication afin de produire `pgr-0.1.2-publish.001-report.md` à partir de preuves réelles.
Le prompt `009-V0_1_3_START_PROMPT.md` ne devient la reprise effective de `0.1.3` qu'après un rapport post-tag `PASS`.
### FAIL
Consigner le diagnostic réel dans `history/0.1.2/rel.1.md`, ne pas créer le tag et corriger uniquement la fermeture dans `rel.1.fix.1` avant toute publication.