0.0.5-alpha.7.fix.1

This commit is contained in:
2026-09-25 17:22:10 +02:00
parent ac03b78708
commit ecd9de4d4e
9 changed files with 357 additions and 13 deletions

View File

@@ -0,0 +1,186 @@
<!-- file: deltas/0.0.5/alpha.7.fix.1.md -->
<!-- version: 1 -->
# 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-<domain>-api` et `ksp-<role>-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 '<!-- version: 6 -->' docs/rules/510-RUST_CARGO.md
grep -Fx '<!-- version: 5 -->' docs/rules/710-TAURI.md
grep -Fx '<!-- version: 4 -->' docs/skeletons/002-RUST_CARGO_WORKSPACE.md
grep -Fx '<!-- version: 3 -->' docs/templates/002-CARGO_MANIFESTS.md
grep -Fx '<!-- version: 9 -->' docs/studies/001-KSP_GAMES_RECONCILIATION.md
grep -Fx '<!-- version: 10 -->' 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
```