diff --git a/VERSION b/VERSION index f1805e0..47875e8 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.0.4-alpha.4.fix.1 +0.0.4-beta.1 diff --git a/deltas/0.0.4/beta.1.md b/deltas/0.0.4/beta.1.md new file mode 100644 index 0000000..5e2ccb0 --- /dev/null +++ b/deltas/0.0.4/beta.1.md @@ -0,0 +1,225 @@ + + + +# Delta 0.0.4-beta.1 — réconciliation interne des skeletons + +## Baseline + +Version attendue avant application : + +```text +0.0.4-alpha.4.fix.1 +``` + +Le history `history/0.0.4/alpha.4.fix.1.md` avec statut `PASS` MUST avoir été appliqué, committé et poussé avant ce delta. Le `FAIL` de `history/0.0.4/alpha.4.md` reste un snapshot historique et MUST NOT être réécrit. + +Version après application : + +```text +0.0.4-beta.1 +``` + +## Objet + +Exécuter la réconciliation interne prévue par `docs/plans/004-V0_0_4_SKELETONS_PLAN.md` après la fondation gouvernée, le skeleton Rust/Cargo et la correction de sa gate d'instanciation. + +La revue porte sur : + +```text +ownership normatif +navigation et index +absence de duplication normative +composition 001 -> 002 +valeurs d'exemple non universalisées +limites des audits et de la validation +spécialisations technologiques différées +continuité delta/history de 0.0.4 +``` + +Cette tranche n'ajoute aucune fonctionnalité, aucun profil, aucun skeleton, aucun template et aucun audit. + +## Résultat de la réconciliation préparatoire + +Aucune correction de document vivant n'est nécessaire pour entrer en beta. + +Le contrat transversal reste possédé par `docs/rules/220-SKELETONS.md`. La fondation `001-PROJECT_GOVERNANCE_FOUNDATION.md` orchestre les owners généraux sans les redéfinir. La specialization `002-RUST_CARGO_WORKSPACE.md` ajoute uniquement `500 + 510`, les guides/templates Rust/Cargo et les décisions de son scope. + +La navigation courante expose les deux specifications depuis `README.md`, `docs/000-README.md` et `docs/skeletons/000-README.md`. Aucun troisième skeleton ou placeholder de skeleton n'existe. + +Les valeurs Rust/Cargo telles que `0.1.0`, `2024`, `project-name`, `project-core-lib`, les seuils Clippy et les chemins de build restent explicitement décrites comme exemples, baselines ou décisions destinataire à revoir. `Cargo.lock` reste une décision propre au type de produit et au besoin de reproductibilité. + +Les limites des audits restent séparées : headers, tableaux et liens Markdown sont des contrôles monotâches ; les audits de style Rust sont facultatifs, read-only et ne remplacent ni Rustfmt, ni Clippy, ni la toolchain Cargo. La validation d'instanciation appartient au skeleton qui prétend matérialiser une baseline utilisable et n'est pas transformée en build global permanent de PGR. + +Java/Maven/Gradle et Android possèdent des profils normatifs mais pas encore les templates/corpus nécessaires à un skeleton concret. Web, JNI, Tauri et les autres domaines insuffisamment cadrés restent également différés. Aucun fichier placeholder n'est créé pour réserver ces futurs scopes. + +Le `FAIL` de `alpha.4` et le `PASS` attendu de `alpha.4.fix.1` forment une chaîne historique explicite ; le fix ne réécrit pas le delta ou le history échoué. + +## Scope + +REPLACE : + +```text +VERSION +``` + +ADD : + +```text +deltas/0.0.4/beta.1.md +``` + +DELETE : aucun. + +Les documents vivants, règles, skeletons, templates, scripts, tests et histories antérieurs restent inchangés. Cette absence de modification supplémentaire est intentionnelle : la réconciliation n'a pas identifié de correction réelle qui justifierait une révision artificielle. + +## Validation opérateur + +Après commit et push de `0.0.4-alpha.4.fix.1`, appliquer ce delta puis exécuter à la racine : + +```bash +test "$(cat VERSION)" = '0.0.4-beta.1' +git cat-file -e HEAD:history/0.0.4/alpha.4.fix.1.md +test -f history/0.0.4/alpha.4.fix.1.md +test -f deltas/0.0.4/beta.1.md +test ! -e history/0.0.4/beta.1.md + +test -f docs/skeletons/001-PROJECT_GOVERNANCE_FOUNDATION.md +test -f docs/skeletons/002-RUST_CARGO_WORKSPACE.md +test ! -e docs/skeletons/003-JAVA_MAVEN_GRADLE.md +test ! -e docs/skeletons/003-ANDROID.md + +grep -A2 '^## Statut$' history/0.0.4/alpha.4.md | grep -Fx 'FAIL' +grep -A2 '^## Statut$' history/0.0.4/alpha.4.fix.1.md | grep -Fx 'PASS' + +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 +import tomllib + +expected_histories = { + 'alpha.1.md': 'PASS', + 'alpha.2.md': 'PASS', + 'alpha.3.md': 'PASS', + 'alpha.4.md': 'FAIL', + 'alpha.4.fix.1.md': 'PASS', +} +histories = {path.name for path in Path('history/0.0.4').glob('*.md')} +assert histories == set(expected_histories), histories +for name, status in expected_histories.items(): + text = Path('history/0.0.4', name).read_text(encoding='utf-8') + assert re.search(rf'## Statut\s+{status}\s', text), (name, status) + +deltas = {path.name for path in Path('deltas/0.0.4').glob('*.md')} +assert deltas == set(expected_histories) | {'beta.1.md'}, deltas + +skeletons = sorted(path.name for path in Path('docs/skeletons').glob('*.md')) +assert skeletons == [ + '000-README.md', + '001-PROJECT_GOVERNANCE_FOUNDATION.md', + '002-RUST_CARGO_WORKSPACE.md', +], skeletons + +root_index = Path('README.md').read_text(encoding='utf-8') +docs_index = Path('docs/000-README.md').read_text(encoding='utf-8') +skel_index = Path('docs/skeletons/000-README.md').read_text(encoding='utf-8') +for name in ( + '001-PROJECT_GOVERNANCE_FOUNDATION.md', + '002-RUST_CARGO_WORKSPACE.md', +): + assert name in root_index, name + assert name in docs_index, name + assert name in skel_index, name + +foundation = Path('docs/skeletons/001-PROJECT_GOVERNANCE_FOUNDATION.md').read_text(encoding='utf-8') +for owner in ( + '200-GOVERNANCE.md', + '210-WORKFLOW.md', + '300-DOCUMENTATION.md', + '400-VALIDATION.md', +): + assert owner in foundation, owner + +rust = Path('docs/skeletons/002-RUST_CARGO_WORKSPACE.md').read_text(encoding='utf-8') +for owner in ('500-LANGUAGES.md', '510-RUST_CARGO.md'): + assert owner in rust, owner +for value in ('0.1.0', '2024', 'project-name', 'project-core-lib'): + assert value in rust, value +assert 'Ils ne deviennent jamais des valeurs universelles par simple copie.' in rust +assert 'Cargo.lock' in rust + +rule = Path('docs/rules/220-SKELETONS.md').read_text(encoding='utf-8') +assert 'Un skeleton sélectionne les owners normatifs applicables ; il ne redéfinit pas leur contenu.' in rule +assert 'MUST NOT devenir une valeur universelle par simple copie' in rule + +validation = Path('docs/validation/001-VALIDATION_MATRIX.md').read_text(encoding='utf-8') +for audit_id in ('PGR-MD-HEADER-001', 'PGR-MD-TABLE-001', 'PGR-NAV-001'): + assert audit_id in validation, audit_id +assert 'vérifie uniquement l\'existence des cibles de liens Markdown locaux inline' in validation + +rust_audits = Path('docs/validation/002-RUST_STYLE_AUDITS.md').read_text(encoding='utf-8') +assert 'facultatif' in rust_audits.lower() +assert 'Les audits ne modifient ni les fichiers inspectés ni l'arborescence de build.' in rust_audits + +plan = Path('docs/plans/004-V0_0_4_SKELETONS_PLAN.md').read_text(encoding='utf-8') +for deferred in ('Java / Maven / Gradle — différé', 'Android — différé', 'Web, JNI, Tauri et autres familles absentes — différés'): + assert deferred in plan, deferred + +for path in ( + Path('templates/rust-cargo/rustfmt.toml'), + Path('templates/rust-cargo/clippy.toml'), + Path('templates/rust-cargo/.cargo/config.toml'), + Path('templates/rust-cargo/Cargo.toml'), + Path('templates/rust-cargo/crates/project-core-lib/Cargo.toml'), +): + with path.open('rb') as stream: + tomllib.load(stream) + +print('Skeleton beta reconciliation audit: clean (5 prior histories, 3 skeleton docs, 5 TOML parsed)') +PY + +git diff --check +git add VERSION deltas/0.0.4/beta.1.md +git diff --cached --check +git status --short +``` + +La sortie Git attendue avant ajout du history `beta.1` est exactement : + +```text +M VERSION +A deltas/0.0.4/beta.1.md +``` + +## Revue opérateur complémentaire + +Confirmer que : + +- `220` reste le propriétaire du contrat transversal et que `001`/`002` n'en dupliquent pas les obligations ; +- `001` reste sans spécialisation technologique et `002` n'élargit pas `510` vers Android, WASM, Tauri, FFI ou un framework ; +- les valeurs de templates restent des exemples adaptables et non des politiques globales ; +- les audits documentaires et Rust restent délimités par leur propriété réellement vérifiée ; +- Java/Android/Web/JNI/Tauri restent différés faute de pièces suffisantes, sans placeholder ni skeleton composite anticipé ; +- le `FAIL alpha.4` reste visible et la correction `alpha.4.fix.1` est enregistrée séparément. + +## Transition + +### PASS + +Créer et appliquer séparément `history/0.0.4/beta.1.md`, committer et pousser `beta.1`, puis préparer `0.0.4-rc.1`. + +La RC doit geler le scope, préparer l'entrée candidate `0.0.4` du changelog et `prompts/005-V0_0_5_START_PROMPT.md` si la trajectoire est confirmée, puis rejouer uniquement les validations réellement invalidées par la release. + +Le history `beta.1` et le delta `rc.1` MAY être livrés ensemble sous forme de deux archives séparées après observation de la gate opérateur. + +### FAIL + +Enregistrer le diagnostic réel dans `history/0.0.4/beta.1.md`, puis corriger uniquement la réconciliation dans `0.0.4-beta.1.fix.N` ou faire un REPLAN explicite si un défaut révèle un changement de scope. diff --git a/history/0.0.4/beta.1.md b/history/0.0.4/beta.1.md new file mode 100644 index 0000000..24f42e4 --- /dev/null +++ b/history/0.0.4/beta.1.md @@ -0,0 +1,97 @@ + + + +# History 0.0.4-beta.1 — réconciliation interne des skeletons + +## Statut + +FAIL + +La tranche `0.0.4-beta.1` n'est pas enregistrée `PASS` telle quelle. + +Les tests Python, les trois audits Markdown, les contrôles de présence et le scope Git ont réussi, mais le script Python de réconciliation embarqué dans la gate contient une erreur de syntaxe. Une commande obligatoire ayant échoué, la tranche doit rester `FAIL` même si le défaut appartient uniquement à la gate et non au contenu réconcilié. + +## Baseline et version + +La tranche précédente `0.0.4-alpha.4.fix.1` a été committée et poussée sous le commit observé : + +```text +ea80396 +``` + +Ce commit contient `history/0.0.4/alpha.4.fix.1.md` avec statut `PASS` et conserve `history/0.0.4/alpha.4.md` avec statut `FAIL`. + +La version contrôlée après application de `beta.1` est : + +```text +0.0.4-beta.1 +``` + +`deltas/0.0.4/beta.1.md` est présent et `history/0.0.4/beta.1.md` était absent pendant la gate. + +## Contrôles réussis observés + +Les contrôles initiaux ont confirmé la présence des deux skeletons concrets et l'absence des skeletons Java/Android différés. Les histories `alpha.4` et `alpha.4.fix.1` ont respectivement été observés en `FAIL` et `PASS`. + +La suite Python globale a exécuté `15` tests, tous réussis : + +```text +Ran 15 tests in 0.223s + +OK +``` + +Les trois audits Markdown ont réussi : + +```text +Markdown header audit: clean (115 file(s)) +Markdown table audit: clean (3 table(s), 115 file(s)) +Markdown link audit: clean (113 local link(s), 115 file(s)) +``` + +`git diff --check` et `git diff --cached --check` n'ont produit aucun diagnostic. Le scope Git observé avant le présent history est exactement : + +```text +M VERSION +A deltas/0.0.4/beta.1.md +``` + +La transcription du terminal contient des fragments de heredoc intercalés avec les sorties des tests ; les résultats finaux ci-dessus restent identifiables. + +## Défaut exact + +Le script Python de réconciliation contient l'assertion suivante : + +```python +assert 'Les audits ne modifient ni les fichiers inspectés ni l'arborescence de build.' in rust_audits +``` + +La chaîne Python est délimitée par des apostrophes simples et contient elle-même l'apostrophe de `l'arborescence`. Le parseur s'arrête donc avant l'exécution des assertions avec : + +```text +SyntaxError: unterminated string literal (detected at line 67) +``` + +Le défaut est purement syntaxique dans la gate `beta.1`. Aucun résultat de cette commande de réconciliation ne peut être considéré comme acquis, même si les contrôles précédents ont réussi. + +## Décision + +Aucun REPLAN n'est requis. + +Le delta `beta.1` et le présent history restent des snapshots historiques et ne doivent pas être réécrits. La correction doit être limitée à une tranche : + +```text +0.0.4-beta.1.fix.1 +``` + +Ce fix ne modifie aucun document vivant, skeleton, template, script ou test. Il rejoue la réconciliation avec une chaîne Python correctement délimitée, ainsi que les contrôles nécessaires pour confirmer que le contenu de `beta.1` était cohérent. + +## Résultat + +`0.0.4-beta.1` est enregistré `FAIL`. + +La seule transition autorisée est : + +```text +0.0.4-beta.1.fix.1 +```