# Delta 0.0.5-alpha.8 — formatage Rust structurel et audits monotâches ## Baseline et version Baseline attendue : commit opérateur complet de `0.0.5-alpha.7.fix.1`, réalisé après application de `history/0.0.5/alpha.7.fix.1.md` avec statut `PASS`. Version après application : ```text 0.0.5-alpha.8 ``` ## Mission Fermer le chantier de réconciliation du formatage Rust structurel sans importer les anciens `audit_rust_general_rules.py` composites de KSP/Games. La tranche attribue chaque propriété à un owner identifiable : Rustfmt lorsqu'il sait réellement réécrire la forme, audits PGR monotâches lorsqu'une structure stable n'est pas possédée par l'outil officiel, et revue humaine lorsque l'ordre peut être métier/protocolaire. ## Scope REPLACE : ```text VERSION docs/plans/005-V0_0_5_RECONCILIATION_PLAN.md docs/rules/510-RUST_CARGO.md docs/skeletons/002-RUST_CARGO_WORKSPACE.md docs/studies/001-KSP_GAMES_RECONCILIATION.md docs/validation/001-VALIDATION_MATRIX.md docs/validation/002-RUST_STYLE_AUDITS.md tests/test_rust_audits.py ``` ADD : ```text deltas/0.0.5/alpha.8.md scripts/audit_rust_item_spacing.py scripts/audit_rust_module_order.py scripts/audit_rust_reexport_blocks.py scripts/audit_rust_trait_import_blocks.py ``` DELETE : aucun. ## Décisions de formatage Pour une nouvelle baseline Rust contrôlée sélectionnant le profil strict : - les lignes vides consécutives et les lignes vides dans fonctions/méthodes/`struct`/`enum` sont interdites ; - deux items Rust distincts voisins d'un même scope sont séparés par exactement une ligne vide lorsque rien d'intermédiaire ne possède lui-même l'espacement ; - les blocs compacts `const` restent sous un owner séparé et ne sont pas interprétés par l'audit d'espacement général ; - les modules de production précèdent les modules de tests et chaque groupe est alphabétique lorsque cet ordre est sans sémantique ; - les `use` non exportés autorisés par le profil strict restent dans un bloc module-level compact avant les déclarations métier ; - les `pub use` précèdent les `pub(crate) use`, sans ligne vide interne et avec exactement une ligne vide entre les deux visibilités lorsqu'elles coexistent ; - Rustfmt reste l'owner du tri intra-bloc des `use`, réexports et modules qu'il sait réécrire ; les audits PGR ne créent pas un tri concurrent. PGR conserve comme fortes conventions de lisibilité le rapprochement d'un `struct` et de ses `impl`, ainsi que la préférence des éléments visibles avant les helpers privés lorsque cela clarifie le fichier. Aucun audit lexical n'impose cependant un ordre global `enum → struct → impl → fn` ou un tri visible/privé susceptible d'écraser une organisation métier. ## Audits ajoutés Quatre contrôles read-only monotâches sont extraits : ```text audit_rust_item_spacing.py séparation exacte des items distincts voisins audit_rust_module_order.py ordre production/tests et ordre alphabétique des modules audit_rust_trait_import_blocks.py placement/contiguïté des use non exportés audit_rust_reexport_blocks.py ordre de visibilité et espacement des blocs de réexports ``` Ils utilisent `_rust_audit_common.py` pour la sélection et le masquage lexical. Ils ne tentent pas de remplacer un parser Rust ni de déterminer la nature sémantique d'un import. Les audits déjà existants gardent leurs responsabilités : ```text audit_rust_blank_lines.py blancs consécutifs / blancs dans certains corps audit_rust_const_blocks.py consts sélectionnées : visibilité, ordre, espacement audit_rust_export_completeness.py façade crate-root et chemins canoniques ``` ## Mesure croisée Les quatre nouveaux audits ont été exécutés pendant la préparation sur tous les fichiers Rust sous `crates/` des baselines autoritaires : ```text KSP 0.3.16 603 file(s) item/module/trait-import/reexport: clean Games 0.3.5 87 file(s) item/module/trait-import/reexport: clean ``` `audit_rust_blank_lines.py` est également propre sur ces `603` et `87` fichiers. En revanche, `audit_rust_const_blocks.py` exécuté aveuglément sur l'ensemble produit `18` signaux KSP et `0` Games. Certains signaux correspondent à des tables/schémas à ordre intentionnel. Il reste donc un audit à sélection explicite par fichier et ne devient pas une gate globale. Ces mesures servent à qualifier la réutilisabilité des règles PGR ; elles ne constituent pas une validation opérateur de KSP/Games. ## Horizon documenté sans engagement La revue d'horizon du plan conserve `0.1.0` comme seule prochaine release engagée, mais mémorise trois candidats sans numéro ni engagement : 1. profils techniques composables par langage/framework/target/plateforme et préoccupation transverse, notamment observability/logging ; 2. profil documentaire/spécification, avec `saselang-bible` comme corpus pilote possible ; 3. audit de généricité de PGR pour des projets hors développement logiciel. Ces candidats ne deviennent ni `Study`, ni `ROADMAP`, ni release plan tant qu'une décision explicite ne les promeut pas. ## Hors scope Cette tranche ne : - crée pas de parser Rust général ; - réimporte pas `audit_rust_general_rules.py` ; - impose pas un ordre alphabétique à une séquence sémantique ; - crée pas d'audit dédié `static/type` uniquement pour la symétrie ; - modifie pas les contrats de suffixes/packaging/tracing fermés par `alpha.7.fix.1` ; - commence pas le skeleton Tauri réservé à `alpha.9` ; - transforme pas les candidats d'horizon en versions promises. ## Validation opérateur Après application du history `PASS` de `alpha.7.fix.1`, commit/push de cette tranche, puis application du présent delta : ```bash test "$(cat VERSION)" = '0.0.5-alpha.8' test -f history/0.0.5/alpha.7.fix.1.md test -f deltas/0.0.5/alpha.8.md test -f scripts/audit_rust_item_spacing.py test -f scripts/audit_rust_module_order.py test -f scripts/audit_rust_reexport_blocks.py test -f scripts/audit_rust_trait_import_blocks.py test ! -e scripts/audit_rust_general_rules.py test ! -e history/0.0.5/alpha.8.md grep -A2 '^## Statut$' history/0.0.5/alpha.7.fix.1.md | grep -Fx 'PASS' grep -Fx '' docs/rules/510-RUST_CARGO.md grep -Fx '' docs/skeletons/002-RUST_CARGO_WORKSPACE.md grep -Fx '' docs/studies/001-KSP_GAMES_RECONCILIATION.md grep -Fx '' docs/validation/001-VALIDATION_MATRIX.md grep -Fx '' docs/validation/002-RUST_STYLE_AUDITS.md grep -Fx '' docs/plans/005-V0_0_5_RECONCILIATION_PLAN.md grep -Fx '# version: 2' tests/test_rust_audits.py grep -Fx '# version: 1' scripts/audit_rust_item_spacing.py grep -Fx '# version: 1' scripts/audit_rust_module_order.py grep -Fx '# version: 1' scripts/audit_rust_reexport_blocks.py grep -Fx '# version: 1' scripts/audit_rust_trait_import_blocks.py python3 -B -m unittest discover -s tests -p 'test_rust_audits.py' -v 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.fix.1.md").read_text(encoding="utf-8") assert re.search(r"## Statut\s+PASS\s", history) rules = Path("docs/rules/510-RUST_CARGO.md").read_text(encoding="utf-8") for phrase in ( "Le profil structurel strict fait partie du défaut des nouvelles baselines Rust contrôlées.", "audit_rust_item_spacing.py", "audit_rust_module_order.py", "audit_rust_trait_import_blocks.py", "audit_rust_reexport_blocks.py", "PGR n'impose toutefois pas un ordre global automatique `enum → struct → impl → fn`", ): assert phrase in rules, phrase validation = Path("docs/validation/002-RUST_STYLE_AUDITS.md").read_text(encoding="utf-8") for phrase in ( "603` fichiers KSP `0.3.16`", "87` fichiers Games `0.3.5`", "18` signaux KSP", "0` Games", "Rustfmt reste l'owner de l'ordre intra-bloc", ): assert phrase in validation, phrase plan = Path("docs/plans/005-V0_0_5_RECONCILIATION_PLAN.md").read_text(encoding="utf-8") for phrase in ( "quatre extractions monotâches complètent le profil", "maturation de profils techniques composables", "`saselang-bible` comme corpus pilote possible", "audit du noyau PGR hors développement logiciel", "### alpha.9 — décision de skeleton Tauri pour projets contrôlés", ): assert phrase in plan, phrase print("0.0.5 alpha.8 Rust structure audit: clean (owners split, four monotask audits, semantic order protected, horizon candidates recorded)") PY git diff --check git add VERSION \ docs/plans/005-V0_0_5_RECONCILIATION_PLAN.md \ docs/rules/510-RUST_CARGO.md \ docs/skeletons/002-RUST_CARGO_WORKSPACE.md \ docs/studies/001-KSP_GAMES_RECONCILIATION.md \ docs/validation/001-VALIDATION_MATRIX.md \ docs/validation/002-RUST_STYLE_AUDITS.md \ scripts/audit_rust_item_spacing.py \ scripts/audit_rust_module_order.py \ scripts/audit_rust_reexport_blocks.py \ scripts/audit_rust_trait_import_blocks.py \ tests/test_rust_audits.py \ deltas/0.0.5/alpha.8.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.8.md M docs/plans/005-V0_0_5_RECONCILIATION_PLAN.md M docs/rules/510-RUST_CARGO.md M docs/skeletons/002-RUST_CARGO_WORKSPACE.md M docs/studies/001-KSP_GAMES_RECONCILIATION.md M docs/validation/001-VALIDATION_MATRIX.md M docs/validation/002-RUST_STYLE_AUDITS.md A scripts/audit_rust_item_spacing.py A scripts/audit_rust_module_order.py A scripts/audit_rust_reexport_blocks.py A scripts/audit_rust_trait_import_blocks.py M tests/test_rust_audits.py ```