Files
pgr/deltas/0.1.2/rel.1.md
2026-09-28 01:27:41 +02:00

11 KiB
Raw Permalink Blame History

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 :

0.1.2-rc.1

Version après application :

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 :

VERSION
README.md
ROADMAP.md
CHANGELOG.md
docs/000-README.md
docs/plans/008-V0_1_2_JAVA_GRADLE_REEVALUATION_PLAN.md

ADD :

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 :

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 :

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 :

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.