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

249 lines
10 KiB
Markdown

<!-- file: deltas/0.0.5/alpha.8.md -->
<!-- version: 1 -->
# 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 '<!-- 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 :
```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
```