Files
pgr/deltas/0.0.5/alpha.8.md
2026-09-25 17:41:26 +02:00

10 KiB

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 :

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 :

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 :

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 :

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 :

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 :

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 :

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 '<!-- version: 7 -->' docs/rules/510-RUST_CARGO.md
grep -Fx '<!-- version: 5 -->' docs/skeletons/002-RUST_CARGO_WORKSPACE.md
grep -Fx '<!-- version: 10 -->' docs/studies/001-KSP_GAMES_RECONCILIATION.md
grep -Fx '<!-- version: 12 -->' docs/validation/001-VALIDATION_MATRIX.md
grep -Fx '<!-- version: 2 -->' docs/validation/002-RUST_STYLE_AUDITS.md
grep -Fx '<!-- version: 11 -->' 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 :

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