253 lines
9.2 KiB
Markdown
253 lines
9.2 KiB
Markdown
<!-- file: deltas/0.1.1/rel.1.md -->
|
|
<!-- version: 1 -->
|
|
|
|
# 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 :
|
|
|
|
```text
|
|
0.1.1-rc.1
|
|
```
|
|
|
|
Version après application :
|
|
|
|
```text
|
|
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 :
|
|
|
|
```text
|
|
VERSION
|
|
README.md
|
|
ROADMAP.md
|
|
CHANGELOG.md
|
|
docs/000-README.md
|
|
docs/plans/007-V0_1_1_WEB_FRONTEND_FOUNDATION_PLAN.md
|
|
```
|
|
|
|
ADD :
|
|
|
|
```text
|
|
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` :
|
|
|
|
```bash
|
|
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 :
|
|
|
|
```text
|
|
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 :
|
|
|
|
```text
|
|
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.
|