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/enumsont 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
constrestent 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
usenon exportés autorisés par le profil strict restent dans un bloc module-level compact avant les déclarations métier ; - les
pub useprécèdent lespub(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 :
- profils techniques composables par langage/framework/target/plateforme et préoccupation transverse, notamment observability/logging ;
- profil documentaire/spécification, avec
saselang-biblecomme corpus pilote possible ; - 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/typeuniquement 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