Files
pgr/deltas/0.0.5/alpha.7.fix.1.md

8.5 KiB

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 :

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 :

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 :

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 :

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 :

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