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.1ne change pas ; 0.1.1est présenté comme stable de manière cohérente dans VERSION/README/ROADMAP/CHANGELOG/index/plan ;- les
FAILhistoriquesalpha.2etalpha.3.fix.1restent conservés avec leurs fixesPASS; - les owners Web
530/540/550/560, le skeleton Web et la validation Web restent gelés ; - le skeleton Tauri reste
DEFERjusqu'au réexamen0.1.4; - la roadmap engagée
0.1.2à0.1.7reste intacte sans0.1.8; - le prompt
008reste conditionnel à une vraie publication dev0.1.1et à un rapport post-tagPASSré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.