# Delta 0.0.5-alpha.7.fix.1 — contrats de suffixes, packaging Rust et tracing ## Baseline et version Baseline attendue : commit opérateur complet de `0.0.5-alpha.7`, réalisé après application de `history/0.0.5/alpha.7.md` avec statut `FAIL`. Version après application : ```text 0.0.5-alpha.7.fix.1 ``` ## Motif La gate mécanique de `alpha.7` est propre, mais la revue fonctionnelle opérateur révèle que la nomenclature livrée reste trop descriptive. Dans les projets contrôlés, les suffixes doivent également porter un contrat architectural : `-api` désigne une frontière de contrats réellement justifiée, `-lib` une implémentation/fonctionnalité réutilisable, tandis que les exécutables restent normalement des packages distincts et minces. La relecture ciblée des corpus confirme plusieurs éléments réutilisables : - KSP distingue explicitement `ksp--api` et `ksp--lib`, interdit une crate `*-api` créée uniquement par symétrie et garde les APIs purement déclaratives sans logging runtime ; - Games sépare explicitement la crate lib de jeu et ses launchers ; - KSP et Games convergent sur `tracing`, la composition du subscriber et une crate transverse de logging ; - les six hosts Tauri KSP et les deux hosts Tauri Games observés utilisent tous un package mixte lib/bin avec des noms de targets distincts. Une ancienne règle KSP préférait un package worker mixte lib/bin. Cette préférence n'est pas généralisée : la décision PGR actuelle est la séparation par défaut, Tauri restant l'exception framework explicitement reconnue. ## Scope REPLACE : ```text VERSION docs/plans/005-V0_0_5_RECONCILIATION_PLAN.md docs/rules/510-RUST_CARGO.md docs/rules/710-TAURI.md docs/skeletons/002-RUST_CARGO_WORKSPACE.md docs/studies/001-KSP_GAMES_RECONCILIATION.md docs/templates/002-CARGO_MANIFESTS.md ``` ADD : ```text deltas/0.0.5/alpha.7.fix.1.md ``` DELETE : aucun. ## Décisions Pour une nouvelle baseline Rust contrôlée : - `-api` signifie contrat extensible/passif ; une crate `-api` n'est créée que si une séparation réelle est justifiée par extension, backend, lifecycle, implémentations multiples ou implémentation externe ; - une crate `-api` purement déclarative reste normalement sans logging/tracing runtime ; - lorsqu'une seule implémentation est utile et qu'aucune frontière séparée n'apporte de valeur, une seule crate `-lib` est préférée ; - `-lib` signifie implémentation ou fonctionnalité réutilisable et ne contient normalement pas de cible binaire ; - hors exception explicite de framework/plateforme, une bibliothèque réutilisable et son exécutable sont des packages Cargo distincts ; - l'exécutable porte un rôle lisible lorsqu'il existe (`cli`, `desk`, `worker`, `job`, `server`, etc.), dépend des libs nécessaires et conserve `main.rs` comme couche de bootstrap/composition mince ; - Tauri reste l'exception framework actuelle au package séparé lib/bin ; son profil impose alors des noms de targets réellement distincts, y compris après normalisation Cargo `-` -> `_`. Pour les diagnostics : - `tracing` est le mécanisme recommandé pour les nouveaux projets Rust contrôlés ; - `log` reste acceptable comme bridge de compatibilité mais n'est pas la façade par défaut sans contrainte externe ; - lorsqu'un workspace possède plusieurs runtimes partageant subscriber, filtres, sinks ou lifecycle, une crate transverse de logging/tracing SHOULD centraliser cette responsabilité ; - `tracing-subscriber` et `tracing-appender` appartiennent normalement à cet owner de composition ; - une bibliothèque métier/technique peut émettre des événements mais ne configure pas silencieusement le subscriber global. ## Hors scope Ce correctif ne traite toujours pas l'ordre des blocs, le regroupement par visibilité, l'espacement interne, l'ordre alphabétique des items ou les audits de forme : ces sujets restent réservés à `alpha.8`. Il ne crée aucun nouvel audit Python et ne transforme pas le profil Rust en catalogue exhaustif de suffixes. Les vocabulaires métier exacts restent locaux. ## Validation opérateur Après application du history `FAIL` de `alpha.7`, commit/push de cette tranche, puis application du présent delta : ```bash test "$(cat VERSION)" = '0.0.5-alpha.7.fix.1' test -f history/0.0.5/alpha.7.md test -f deltas/0.0.5/alpha.7.fix.1.md test ! -e history/0.0.5/alpha.7.fix.1.md grep -A2 '^## Statut$' history/0.0.5/alpha.7.md | grep -Fx 'FAIL' grep -Fx '' docs/rules/510-RUST_CARGO.md grep -Fx '' docs/rules/710-TAURI.md grep -Fx '' docs/skeletons/002-RUST_CARGO_WORKSPACE.md grep -Fx '' docs/templates/002-CARGO_MANIFESTS.md grep -Fx '' docs/studies/001-KSP_GAMES_RECONCILIATION.md grep -Fx '' docs/plans/005-V0_0_5_RECONCILIATION_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.0.5/alpha.7.md").read_text(encoding="utf-8") assert re.search(r"## Statut\s+FAIL\s", history) rules = Path("docs/rules/510-RUST_CARGO.md").read_text(encoding="utf-8") for phrase in ( "### Les suffixes portent un contrat architectural", "Une crate `-api` MUST NOT être créée uniquement pour obtenir une paire de noms symétrique.", "Lorsqu'une seule implémentation est réellement prévue", "### Séparation bibliothèques / exécutables", "Tauri constitue l'exception framework actuellement reconnue par PGR", "## Diagnostics structurés et ownership du logging", "`tracing` est le mécanisme recommandé", "SHOULD NOT installer silencieusement un subscriber global", ): assert phrase in rules, phrase tauri = Path("docs/rules/710-TAURI.md").read_text(encoding="utf-8") for phrase in ( "le package mixte `lib + bin` constitue l'exception framework explicite", "leurs noms MUST être distincts même après la normalisation Cargo usuelle des tirets en underscores", "project_feature_desk_lib", "Un plugin Tauri de tracing sert alors d'adapter", ): assert phrase in tauri, phrase skeleton = Path("docs/skeletons/002-RUST_CARGO_WORKSPACE.md").read_text(encoding="utf-8") for phrase in ( "les frontières `-api` / `-lib` réellement justifiées", "Les exécutables sont des packages distincts des bibliothèques", "crate transverse de logging/tracing", ): assert phrase in skeleton, phrase template = Path("docs/templates/002-CARGO_MANIFESTS.md").read_text(encoding="utf-8") assert "une bibliothèque réutilisable et son exécutable sont normalement deux packages Cargo distincts" in template assert "Tauri est une exception framework" in template study = Path("docs/studies/001-KSP_GAMES_RECONCILIATION.md").read_text(encoding="utf-8") for phrase in ( "#### Correction `alpha.7.fix.1` — suffixes, packaging et tracing", "KSP-WORKER-014", "les `6` hosts Tauri KSP `0.3.16` et les `2` hosts Tauri Games `0.3.5`", "PGR retient donc `tracing` par défaut", ): assert phrase in study, phrase plan = Path("docs/plans/005-V0_0_5_RECONCILIATION_PLAN.md").read_text(encoding="utf-8") assert "`alpha.7.fix.1` complète donc la tranche" in plan assert "### alpha.8 — formatage Rust structurel et audits monotâches" in plan print("0.0.5 alpha.7.fix.1 crate contract audit: clean (api/lib semantics, binary split, tracing owner, Tauri exception)") PY git diff --check git add VERSION \ docs/plans/005-V0_0_5_RECONCILIATION_PLAN.md \ docs/rules/510-RUST_CARGO.md docs/rules/710-TAURI.md \ docs/skeletons/002-RUST_CARGO_WORKSPACE.md \ docs/studies/001-KSP_GAMES_RECONCILIATION.md \ docs/templates/002-CARGO_MANIFESTS.md \ deltas/0.0.5/alpha.7.fix.1.md git diff --cached --check git status --short ``` La sortie Git attendue avant ajout du history est exactement : ```text M VERSION A deltas/0.0.5/alpha.7.fix.1.md M docs/plans/005-V0_0_5_RECONCILIATION_PLAN.md M docs/rules/510-RUST_CARGO.md M docs/rules/710-TAURI.md M docs/skeletons/002-RUST_CARGO_WORKSPACE.md M docs/studies/001-KSP_GAMES_RECONCILIATION.md M docs/templates/002-CARGO_MANIFESTS.md ```