Files
pgr/deltas/0.1.1/rel.1.md
2026-09-27 12:27:09 +02:00

9.2 KiB

Delta 0.1.1 rel.1 — promotion stable pré-tag

Baseline et version

Baseline : 0.1.1-rc.1, avec history/0.1.1/rc.1.md appliqué et committé. Ce delta MUST NOT être appliqué avant ce commit.

Version avant application :

0.1.1-rc.1

Version après application :

0.1.1

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.1 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 007 historique. Aucun owner, profil, template, skeleton, validation, étude technique ou script d'audit n'est modifié.

La validation de cette tranche est pré-tag. Le tag v0.1.1, son archive source Gitea et le rapport pgr-0.1.1-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.1 et la publication réelle du tag.

Scope

REPLACE :

VERSION
README.md
ROADMAP.md
CHANGELOG.md
docs/000-README.md
docs/plans/007-V0_1_1_WEB_FRONTEND_FOUNDATION_PLAN.md

ADD :

deltas/0.1.1/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.1/rc.1.md :

test "$(cat VERSION)" = '0.1.1'
git cat-file -e HEAD:history/0.1.1/rc.1.md
test -f history/0.1.1/rc.1.md
test -f deltas/0.1.1/rel.1.md
test -f prompts/008-V0_1_2_START_PROMPT.md
test ! -e history/0.1.1/rel.1.md

grep -A2 '^## Statut$' history/0.1.1/rc.1.md | grep -Fx 'PASS'
grep -Fx '<!-- version: 19 -->' README.md
grep -Fx '<!-- version: 12 -->' ROADMAP.md
grep -Fx '<!-- version: 13 -->' CHANGELOG.md
grep -Fx '<!-- version: 31 -->' docs/000-README.md
grep -Fx '<!-- version: 11 -->' docs/plans/007-V0_1_1_WEB_FRONTEND_FOUNDATION_PLAN.md
grep -F -- '- `(x) 0.1.1`' ROADMAP.md
grep -Fx '## 0.1.1' CHANGELOG.md
grep -F 'fondation frontend Web stable' README.md
grep -F 'plan historique de la stable `0.1.1`' docs/000-README.md

python3 -B - <<'PYGATE'
from pathlib import Path
import re

expected = {
    "alpha.1.md": "PASS",
    "alpha.2.md": "FAIL",
    "alpha.2.fix.1.md": "PASS",
    "alpha.3.md": "PASS",
    "alpha.3.fix.1.md": "FAIL",
    "alpha.3.fix.2.md": "PASS",
    "alpha.4.md": "PASS",
    "alpha.5.md": "PASS",
    "beta.1.md": "PASS",
    "rc.1.md": "PASS",
}

for name, status in expected.items():
    delta = Path("deltas/0.1.1", name)
    history = Path("history/0.1.1", 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.1").glob("*.md")} - {
    path.name for path in Path("history/0.1.1").glob("*.md")
}
assert pending == {"rel.1.md"}, pending

roadmap = Path("ROADMAP.md").read_text(encoding="utf-8")
assert "- `(x) 0.1.1`" in roadmap
for version in ("0.1.2", "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.1" in changelog.splitlines()
assert "## 0.1.1 (candidate)" not in changelog
section = changelog.split("## 0.1.1", 1)[1].split("## 0.1.0", 1)[0]
for forbidden in ("alpha.2", "alpha.3", "alpha.4", "alpha.5", "beta.1", "rc.1", "rel.1"):
    assert forbidden not in section, forbidden

readme = Path("README.md").read_text(encoding="utf-8")
assert "fondation frontend Web stable" in readme
assert "plan historique de la fondation frontend Web stable `0.1.1`" in readme

index = Path("docs/000-README.md").read_text(encoding="utf-8")
assert "plan historique de la stable `0.1.1`" in index
assert "à utiliser seulement après publication et vérification post-tag de `0.1.1`" in index

plan = Path("docs/plans/007-V0_1_1_WEB_FRONTEND_FOUNDATION_PLAN.md").read_text(encoding="utf-8")
assert "### rc.1 — release candidate\n\nStatut opérateur : **PASS**." in plan
assert "history/0.1.1/rel.1.md" in plan
assert "pgr-0.1.1-publish.001-report.md" in plan
assert "commit `0.1.1` avant le tag `v0.1.1`" in plan

prompt = Path("prompts/008-V0_1_2_START_PROMPT.md").read_text(encoding="utf-8")
assert "tag Gitea `v0.1.1`" in prompt
assert "pgr-0.1.1-publish.001-report.md" in prompt
assert "0.1.2-alpha.1" in prompt

for path, version in (
    ("docs/rules/530-TYPESCRIPT.md", 3),
    ("docs/rules/540-JAVASCRIPT_PACKAGE_ECOSYSTEM.md", 3),
    ("docs/rules/550-VITE.md", 2),
    ("docs/rules/560-CSS_SASS.md", 2),
    ("docs/rules/710-TAURI.md", 6),
    ("docs/skeletons/003-WEB_FRONTEND.md", 1),
    ("docs/validation/005-WEB_FRONTEND_VALIDATION.md", 1),
    ("docs/studies/002-TAURI_SKELETON_DECISION.md", 2),
):
    lines = Path(path).read_text(encoding="utf-8").splitlines()
    assert lines[1] == f"<!-- version: {version} -->", (path, lines[1])

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.1 rel.1 stable gate audit: clean (10 prior histories, rel.1 pending, stable Web 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

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.1 rel.1 text/JSON hygiene: clean")
PYHYGIENE

git diff --check
git add VERSION README.md ROADMAP.md CHANGELOG.md docs/000-README.md \
    docs/plans/007-V0_1_1_WEB_FRONTEND_FOUNDATION_PLAN.md \
    deltas/0.1.1/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.1/rel.1.md
M  docs/000-README.md
M  docs/plans/007-V0_1_1_WEB_FRONTEND_FOUNDATION_PLAN.md

La RC a déjà reconfirmé le dry-run structurel Web, les owners gelés et le contrat du prompt 008. Comme rel.1 ne modifie aucun artefact technique frontend, la promotion stable ne simule pas de nouvelle exécution tsc/Vite/Sass sans projet concret ; elle rejoue les tests PGR, les audits documentaires et l'hygiène des artefacts.

Revue opérateur complémentaire

Confirmer que :

  • le scope fonctionnel de rc.1 ne change pas ;
  • 0.1.1 est présenté comme stable de manière cohérente dans VERSION/README/ROADMAP/CHANGELOG/index/plan ;
  • les FAIL historiques alpha.2 et alpha.3.fix.1 restent conservés avec leurs fixes PASS ;
  • les owners Web 530/540/550/560, le skeleton Web et la validation Web restent gelés ;
  • le skeleton Tauri reste DEFER jusqu'au réexamen 0.1.4 ;
  • la roadmap engagée 0.1.2 à 0.1.7 reste intacte sans 0.1.8 ;
  • le prompt 008 reste conditionnel à une vraie publication de v0.1.1 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.1/rel.1.md, l'appliquer, puis créer le commit stable sous le message exact :

0.1.1

Après push de la branche canonique, créer et publier le tag annoté v0.1.1. 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.1-publish.001-report.md à partir de preuves réelles.

Le prompt 008-V0_1_2_START_PROMPT.md ne devient la reprise effective de 0.1.2 qu'après un rapport post-tag PASS.

FAIL

Consigner le diagnostic réel dans history/0.1.1/rel.1.md, ne pas créer le tag et corriger uniquement la fermeture dans rel.1.fix.1 avant toute publication.