diff --git a/VERSION b/VERSION index d6711f8..1f3a604 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.1.0-alpha.1 +0.1.0-alpha.2 diff --git a/deltas/0.1.0/alpha.2.md b/deltas/0.1.0/alpha.2.md new file mode 100644 index 0000000..6103af1 --- /dev/null +++ b/deltas/0.1.0/alpha.2.md @@ -0,0 +1,201 @@ + + + +# Delta 0.1.0-alpha.2 — clôture stable et identité `rel.N` + +## Baseline + +Baseline attendue : `0.1.0-alpha.1` committée avec `history/0.1.0/alpha.1.md` en `PASS`. + +Cette tranche MUST être appliquée uniquement après le commit/push complet de `alpha.1` ; elle ne doit pas être superposée au workspace encore non committé de la gate précédente. + +Version avant application : + +```text +0.1.0-alpha.1 +``` + +Version après application : + +```text +0.1.0-alpha.2 +``` + +## Objet + +Corriger la convention normative de clôture stable avant diffusion plus large de PGR : + +- utiliser `rel.1`, `rel.2`, etc. sans padding pour les nouvelles releases ; +- conserver sans renommage tous les artefacts historiques `rel.001*` déjà publiés ; +- distinguer le nom de la tranche de clôture de l'identité du commit stable ; +- rendre explicite qu'une clôture `FAIL`, `PARTIAL` ou `BLOCKED` conserve le suffixe opérationnel dans son commit ; +- rendre explicite que la première tranche `rel.N[/fix.M]` qui obtient réellement le `PASS` stable est committée sous `X.Y.Z` avant création du tag `vX.Y.Z`. + +La tranche ne modifie aucun profil technologique, skeleton, template, script d'audit ou convention de publication post-tag `publish.001`. + +## Scope + +REPLACE : + +```text +VERSION +docs/rules/200-GOVERNANCE.md +docs/rules/210-WORKFLOW.md +docs/plans/006-V0_1_0_REUSABLE_BASELINE_PLAN.md +``` + +ADD : + +```text +deltas/0.1.0/alpha.2.md +``` + +DELETE : aucun. + +Le plan actif est révisé parce qu'il enregistre `alpha.1 PASS` et deux horizons différés explicitement décidés pendant la session — audit Python d'un sous-ensemble Clippy après Games/KSP et future famille deployment/operations — sans leur attribuer de numéro ni les absorber dans `0.1.0`. + +Aucun `history/0.1.0/alpha.2.md` n'est anticipé avant la gate opérateur. + +## Convention obtenue + +La représentation future canonique est : + +```text +rel.1 +rel.1.fix.1 +rel.2 +... +``` + +Pour le message du commit de clôture, le défaut PGR devient : + +```text +history rel.1 FAIL / PARTIAL / BLOCKED + -> X.Y.Z-rel.1 + +history rel.1.fix.1 FAIL / PARTIAL / BLOCKED + -> X.Y.Z-rel.1.fix.1 + +premier history rel.N[/fix.M] PASS établissant réellement la stable + -> X.Y.Z +``` + +`VERSION` MAY déjà être `X.Y.Z` pendant ces tranches de fermeture : `rel.N` n'est pas une prerelease SemVer. Le tag `vX.Y.Z` intervient uniquement après le commit final `X.Y.Z` contenant le history `PASS` stable. + +Les fichiers historiques comme : + +```text +deltas/0.0.5/rel.001.md +history/0.0.5/rel.001.md +deltas/0.0.5/rel.001.fix.1.md +history/0.0.5/rel.001.fix.1.md +``` + +restent intacts. + +## Validation opérateur + +Après application sur le commit de `0.1.0-alpha.1`, depuis la racine du dépôt : + +```bash +test "$(cat VERSION)" = '0.1.0-alpha.2' +test -f history/0.1.0/alpha.1.md +test -f deltas/0.1.0/alpha.2.md +test ! -e history/0.1.0/alpha.2.md + +grep -Fx '' docs/rules/200-GOVERNANCE.md +grep -Fx '' docs/rules/210-WORKFLOW.md +grep -Fx '' docs/plans/006-V0_1_0_REUSABLE_BASELINE_PLAN.md + +grep -F 'représentation canonique n'utilise pas de zéro de padding' docs/rules/200-GOVERNANCE.md +grep -F 'première tranche de clôture PASS' docs/rules/200-GOVERNANCE.md +grep -F 'history rel.1 FAIL / PARTIAL / BLOCKED' docs/rules/210-WORKFLOW.md +grep -F 'premier history rel.N[/fix.M] PASS qui établit réellement la stable' docs/rules/210-WORKFLOW.md +grep -F 'La présente règle ne renomme pas `publish.001`' docs/rules/210-WORKFLOW.md + +grep -F 'sous-ensemble des conventions Rust/Clippy' docs/plans/006-V0_1_0_REUSABLE_BASELINE_PLAN.md +grep -F 'série dédiée au déploiement et à l'exploitation' docs/plans/006-V0_1_0_REUSABLE_BASELINE_PLAN.md + +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 - <<'PY' +from pathlib import Path +import re + +history = Path('history/0.1.0/alpha.1.md').read_text(encoding='utf-8') +assert re.search(r'## Statut\s+PASS\s', history) + +governance = Path('docs/rules/200-GOVERNANCE.md').read_text(encoding='utf-8') +workflow = Path('docs/rules/210-WORKFLOW.md').read_text(encoding='utf-8') +plan = Path('docs/plans/006-V0_1_0_REUSABLE_BASELINE_PLAN.md').read_text(encoding='utf-8') + +for phrase in ( + 'rel.1', + 'rel.1.fix.1', + 'représentation canonique n\'utilise pas de zéro de padding', + 'première tranche de clôture PASS', + 'Le commit `X.Y.Z` MUST', +): + assert phrase in governance or phrase in workflow, phrase + +for path in ( + Path('deltas/0.0.5/rel.001.md'), + Path('history/0.0.5/rel.001.md'), + Path('deltas/0.0.5/rel.001.fix.1.md'), + Path('history/0.0.5/rel.001.fix.1.md'), +): + assert path.is_file(), path + +assert 'publish.001' in workflow +assert 'La présente règle ne renomme pas `publish.001`' in workflow +assert 'sous-ensemble des conventions Rust/Clippy' in plan +assert "série dédiée au déploiement et à l'exploitation" in plan +assert '- `( ) 0.1.1`' not in Path('ROADMAP.md').read_text(encoding='utf-8') + +print('0.1.0 alpha.2 rel identity audit: clean (rel.N unpadded, historical rel.001 preserved, stable commit identity explicit)') +PY + +git diff --check +git add VERSION docs/rules/200-GOVERNANCE.md docs/rules/210-WORKFLOW.md \ + docs/plans/006-V0_1_0_REUSABLE_BASELINE_PLAN.md \ + deltas/0.1.0/alpha.2.md +git diff --cached --check +git status --short +``` + +Le scope indexé attendu avant ajout du history est : + +```text +M VERSION +A deltas/0.1.0/alpha.2.md +M docs/plans/006-V0_1_0_REUSABLE_BASELINE_PLAN.md +M docs/rules/200-GOVERNANCE.md +M docs/rules/210-WORKFLOW.md +``` + +La revue opérateur doit également confirmer que : + +- aucune occurrence historique `rel.001*` n'a été renommée ; +- `publish.001` reste une convention indépendante et n'est pas modifiée par cette tranche ; +- aucune commande de handoff Git automatique n'est encore rendue normative ici — ce sujet appartient à `alpha.3` ; +- les horizons Clippy statique et deployment/operations restent de simples candidats différés dans le plan ; +- aucun profil Web, Java/Android, WASM, Tauri ou serveur n'est ajouté ou modifié. + +## Transition + +### PASS + +Produire `history/0.1.0/alpha.2.md` à partir des résultats réellement observés. Dans la même réponse, si aucune décision nouvelle n'est ouverte, préparer séparément `0.1.0-alpha.3` consacré au handoff automatique des commandes opérateur après history, au commit/push, au tag stable et aux preuves requises pour `publish.001`. + +Après remise du history, fournir déjà spontanément le bloc Git exact de fermeture de `alpha.2`, conformément à la décision acquise, même si `alpha.3` sera la tranche qui rendra ce comportement normatif. + +### FAIL + +Consigner le résultat réel dans le history puis ouvrir `0.1.0-alpha.2.fix.1` ou un REPLAN selon la cause. Aucun élément du handoff automatique prévu pour `alpha.3` ne doit être absorbé silencieusement dans le fix. diff --git a/docs/plans/006-V0_1_0_REUSABLE_BASELINE_PLAN.md b/docs/plans/006-V0_1_0_REUSABLE_BASELINE_PLAN.md index 25f0a28..dad3568 100644 --- a/docs/plans/006-V0_1_0_REUSABLE_BASELINE_PLAN.md +++ b/docs/plans/006-V0_1_0_REUSABLE_BASELINE_PLAN.md @@ -1,5 +1,5 @@ - + # Plan 0.1.0 — première baseline PGR réutilisable @@ -156,11 +156,20 @@ Les numéros exacts `0.1.1`, `0.1.2`, etc. ne sont pas réservés dans `alpha.1` Après cette vague d'adoption `0.1.x`, les axes plus larges — projets documentaires/spécifications tels que `saselang-bible`, généricité hors logiciel et autres familles technologiques — restent candidats pour une trajectoire `0.2.x`/`0.3.x` à décider ultérieurement, sans réservation artificielle aujourd'hui. +Deux horizons supplémentaires sont acquis comme **candidats différés**, sans numéro réservé : + +- après application réelle de PGR à Games puis KSP, une release `0.1.x` non prioritaire pourra introduire des audits Python read-only reproduisant uniquement le sous-ensemble des conventions Rust/Clippy vérifiable statiquement sans Cargo ni `rustc`; ces audits devront utiliser les options PGR existantes, documenter explicitement les lints `FULL / LIMITED / UNSUPPORTED` et MUST NOT être présentés comme équivalents à `cargo clippy`, qui reste la validation autoritaire ; +- à plus long terme, une série dédiée au déploiement et à l'exploitation devra être étudiée, potentiellement dans un horizon `0.4.x` ou `0.5.x` mais sans réservation actuelle : reverse proxies tels que Nginx/Apache, bases PostgreSQL/MySQL ou autres, conteneurs Docker/Compose, hébergement Linux/services, environnements et secrets, migrations/backup, health/observabilité et skeletons/audits de déploiement composables. + +Ces horizons ne modifient pas la mission de `0.1.0` et ne doivent pas être absorbés par les tranches courantes. + ## Trajectoire prévisionnelle de `0.1.0` ### alpha.1 — audit de stable et plan -Vérifier intégralement `v0.0.5`, son rapport post-tag, les owners normatifs, profils, templates, skeletons, audits, chaîne delta/history et décisions différées. Consigner le cadrage présent sans changement normatif ni migration externe. +Statut opérateur : **PASS**. + +La stable `v0.0.5`, son rapport post-tag, les owners normatifs, profils, templates, skeletons, audits, chaîne delta/history et décisions différées ont été vérifiés. Le cadrage a été consigné sans changement normatif ni migration externe. ### alpha.2 — clôture stable et identité `rel.N` diff --git a/docs/rules/200-GOVERNANCE.md b/docs/rules/200-GOVERNANCE.md index 8ea113f..345f5ae 100644 --- a/docs/rules/200-GOVERNANCE.md +++ b/docs/rules/200-GOVERNANCE.md @@ -1,5 +1,5 @@ - + # Governance rules @@ -77,6 +77,8 @@ vX.Y.Z `rel.N` MAY identifier une livraison ou un artefact de clôture, mais MUST NOT être traité comme une version produit SemVer. +Pour les nouvelles releases gouvernées par cette convention, `N` commence à `1` et sa représentation canonique n'utilise pas de zéro de padding : `rel.1`, `rel.2`, etc. Les formes historiques déjà publiées telles que `rel.001` restent des snapshots immuables et MUST NOT être renommées rétroactivement. + Avant `1.0.0`, PGR recommande la convention suivante lorsqu'elle correspond au projet : - `X = 0` indique que le contrat public durable n'est pas encore stabilisé ; @@ -126,6 +128,16 @@ La promotion stable MUST néanmoins exécuter son propre gate proportionné pour Le tag stable canonique est `vX.Y.Z`. +La clôture opérationnelle `rel.N[/fix.M]` n'est pas une prerelease SemVer et MAY intervenir alors que `VERSION` porte déjà `X.Y.Z`. En l'absence d'une convention locale explicitement documentée, PGR impose la distinction suivante pour le message du commit de clôture : + +```text +rel.1 FAIL / PARTIAL / BLOCKED -> X.Y.Z-rel.1 +rel.1.fix.1 FAIL / PARTIAL / BLOCKED -> X.Y.Z-rel.1.fix.1 +première tranche de clôture PASS -> X.Y.Z +``` + +Le commit nommé `X.Y.Z` MUST inclure le history qui établit effectivement le `PASS` stable. Le tag `vX.Y.Z` MUST être créé seulement après ce commit. Une clôture échouée MUST rester identifiable par son nom de tranche et MUST NOT être présentée comme le commit stable final. + La vérification d'une publication ou d'une archive produite après le tag est une preuve distincte de la validation pré-tag. ## Correctifs de tranche diff --git a/docs/rules/210-WORKFLOW.md b/docs/rules/210-WORKFLOW.md index 8980b1c..0604755 100644 --- a/docs/rules/210-WORKFLOW.md +++ b/docs/rules/210-WORKFLOW.md @@ -1,5 +1,5 @@ - + # Workflow artifact rules @@ -86,6 +86,8 @@ alpha.3.md alpha.3.fix.1.md beta.1.md rc.1.md +rel.1.md +rel.1.fix.1.md ``` Un delta MUST : @@ -174,9 +176,26 @@ current delta changes doivent être présents, alors que le delta suivant MUST rester absent. -Le message de commit MAY suivre les conventions du projet. PGR n'impose pas Conventional Commits, GitFlow ou une topologie universelle de branches. +Pour une tranche alpha, beta, RC ou autre tranche qui n'établit pas la stable, le message de commit MAY suivre les conventions du projet tant que l'état et la tranche restent identifiables. PGR n'impose pas Conventional Commits, GitFlow ou une topologie universelle de branches. -L'important est que l'état et la tranche restent identifiables et que le repository ne mélange pas deux tranches non clôturées. +La clôture stable `rel.N[/fix.M]` possède une règle plus stricte afin de distinguer une tentative de fermeture de l'identité stable réellement obtenue. En l'absence d'un mapping local explicitement documenté : + +```text +history rel.1 FAIL / PARTIAL / BLOCKED + -> commit X.Y.Z-rel.1 + +history rel.1.fix.1 FAIL / PARTIAL / BLOCKED + -> commit X.Y.Z-rel.1.fix.1 + +premier history rel.N[/fix.M] PASS qui établit réellement la stable + -> commit X.Y.Z +``` + +Le suffixe opérationnel n'est donc conservé dans le message du commit que tant que la clôture n'a pas obtenu le `PASS` stable. Le commit `X.Y.Z` MUST contenir le delta de clôture concerné et son history `PASS`; il MUST précéder le tag canonique `vX.Y.Z`. + +Un projet qui possède une convention de message différente MAY utiliser un mapping équivalent, mais il MUST conserver sans ambiguïté la distinction entre tentative de clôture échouée et commit stable final. + +Le repository ne doit jamais mélanger deux tranches non clôturées dans un même commit. ## Manifest de suppression @@ -327,9 +346,11 @@ published source archive post-tag verification ``` -Un identifiant opérationnel tel que `rel.001` ou `publish.001` MAY être utilisé pour distinguer une clôture ou une vérification de publication sans devenir une nouvelle version SemVer produit. +Un identifiant opérationnel tel que `rel.1` ou `publish.001` MAY être utilisé pour distinguer une clôture ou une vérification de publication sans devenir une nouvelle version SemVer produit. La famille `rel.N` utilise la représentation sans zéro de padding définie par la gouvernance ; les anciennes formes `rel.001*` déjà publiées restent historiques et immuables. -`rel.001` prouve l'état stable avant création du tag. Une preuve `publish.001`, lorsqu'elle existe, porte sur l'artefact réellement publié après le tag et reste donc extérieure au tag qu'elle vérifie. Elle ne revalide pas fonctionnellement la release. +`rel.1` est la première tranche de clôture stable pré-tag d'une nouvelle release utilisant cette convention. Si elle échoue, `rel.1.fix.N` corrige uniquement cette fermeture. La première de ces tranches qui obtient réellement `PASS` est incluse dans le commit stable `X.Y.Z`, puis seulement le tag `vX.Y.Z` est créé. + +Une preuve `publish.001`, lorsqu'elle existe, porte sur l'artefact réellement publié après le tag et reste donc extérieure au tag qu'elle vérifie. Elle ne revalide pas fonctionnellement la release. La présente règle ne renomme pas `publish.001`; son identité reste indépendante de la correction `rel.001` -> `rel.1`. Lorsqu'un rapport `publish.001` est un prérequis de la session suivante, la clôture post-tag MUST indiquer explicitement à l'opérateur qu'il doit fournir ce rapport avec l'archive taggée. Le démarrage suivant effectue toujours son propre audit d'intake de la baseline ; il ne traite pas pour autant la stable précédente comme une release encore en attente de validation. diff --git a/history/0.1.0/alpha.2.md b/history/0.1.0/alpha.2.md new file mode 100644 index 0000000..a758e7c --- /dev/null +++ b/history/0.1.0/alpha.2.md @@ -0,0 +1,130 @@ + + + +# History 0.1.0-alpha.2 — clôture stable et identité `rel.N` + +## Statut + +FAIL + +La gate opérateur de `0.1.0-alpha.2` exécutée le `2026-09-26` n'a pas atteint un PASS complet. Le contenu normatif de la tranche est présent et les suites Python ainsi que les audits Markdown ont réussi, mais plusieurs commandes `grep -F` prescrites par le delta ont été mal formées pour le shell en raison d'apostrophes littérales dans des motifs entourés de quotes simples. La preuve opérateur contient donc des erreurs de commande et la tranche doit rester `FAIL` jusqu'à correction de sa gate. + +Le défaut observé appartient à la validation livrée par `alpha.2`; aucun défaut du contenu `rel.N` n'est établi par les contrôles exécutés. + +## Baseline opérateur + +La tranche précédente `0.1.0-alpha.1` a été committée et poussée avant application de `alpha.2` : + +```text +commit c22cf39 +message 0.1.0-alpha.1 +push origin/master PASS +``` + +Après application de `alpha.2`, les contrôles initiaux ont confirmé : + +```text +VERSION 0.1.0-alpha.2 +history/0.1.0/alpha.1.md présent +deltas/0.1.0/alpha.2.md présent +history/0.1.0/alpha.2.md absent pendant la gate +docs/rules/200-GOVERNANCE.md version 5 +docs/rules/210-WORKFLOW.md version 6 +docs/plans/006-V0_1_0_REUSABLE_BASELINE_PLAN.md version 2 +``` + +## Défaut exact de la gate + +Le delta contenait notamment : + +```bash +grep -F 'représentation canonique n'utilise pas de zéro de padding' docs/rules/200-GOVERNANCE.md +``` + +L'apostrophe de `n'utilise` ferme la quote simple ouverte avant `représentation`. Le shell poursuit alors l'analyse des lignes suivantes avec un état de quoting incohérent. La transcription opérateur contient notamment : + +```text +bash: publish.001 : commande introuvable +grep: pas: Aucun fichier ou dossier de ce nom +grep: zéro: Aucun fichier ou dossier de ce nom +grep: clôture: Aucun fichier ou dossier de ce nom +grep: rel.1: Aucun fichier ou dossier de ce nom +``` + +Un second motif comportait également une apostrophe littérale : + +```bash +grep -F 'série dédiée au déploiement et à l'exploitation' docs/plans/006-V0_1_0_REUSABLE_BASELINE_PLAN.md +``` + +Ces erreurs ne peuvent pas être classées comme simples diagnostics attendus : elles proviennent de commandes de validation obligatoires livrées par la tranche. Conformément à la chaîne PGR, une gate prescrite qui n'est pas exécutable proprement rend la tranche `FAIL` même si une preuve ultérieure couvre correctement le fond. + +## Preuves de fond réussies + +La suite Python globale a exécuté `48` tests et tous ont réussi : + +```text +Ran 48 tests in 0.717s + +OK +``` + +Les audits Markdown ont affiché : + +```text +Markdown header audit: clean (175 file(s)) +Markdown table audit: clean (8 table(s), 175 file(s)) +Markdown link audit: clean (163 local link(s), 175 file(s)) +``` + +Le contrôle structurel spécifique de la tranche a également réussi : + +```text +0.1.0 alpha.2 rel identity audit: clean (rel.N unpadded, historical rel.001 preserved, stable commit identity explicit) +``` + +Cette preuve confirme notamment que : + +- la convention future `rel.N` sans padding est matérialisée ; +- les artefacts historiques `rel.001*` sont conservés ; +- l'identité du commit stable est explicitement distinguée de la tranche de clôture ; +- `publish.001` reste indépendant ; +- les horizons Clippy statique et deployment/operations restent différés dans le plan. + +Le scope Git observé avant ajout du présent history est exactement : + +```text +M VERSION +A deltas/0.1.0/alpha.2.md +M docs/plans/006-V0_1_0_REUSABLE_BASELINE_PLAN.md +M docs/rules/200-GOVERNANCE.md +M docs/rules/210-WORKFLOW.md +``` + +## Décision + +Aucun REPLAN n'est requis et aucun owner normatif ne doit être réécrit pour corriger cet incident. + +La correction reste strictement dans : + +```text +0.1.0-alpha.2.fix.1 +``` + +Le fix doit : + +- conserver intégralement le delta historique `alpha.2.md` ; +- conserver les contenus actuels de `200-GOVERNANCE.md` et `210-WORKFLOW.md` ; +- remplacer les assertions shell fragiles par une preuve Python syntaxiquement sûre ; +- rejouer les `48` tests et les trois audits Markdown ; +- confirmer à nouveau le scope et la vérité historique avant progression vers `alpha.3`. + +## Résultat + +`0.1.0-alpha.2` est enregistré `FAIL` pour défaut de gate opérateur, sans défaut normatif établi sur la convention `rel.N`. + +La seule transition autorisée est : + +```text +0.1.0-alpha.2.fix.1 +```