8.1 KiB
Delta 0.0.5-alpha.7 — profil Rust strict, chemins et nomenclature explicite
Baseline et version
Baseline attendue : commit opérateur complet de 0.0.5-alpha.6.fix.3, réalisé après application de history/0.0.5/alpha.6.fix.3.md avec statut PASS.
Version après application :
0.0.5-alpha.7
Motif
La réconciliation Tauri a confirmé qu'un host contrôlé hérite du profil Rust au lieu de redéfinir ses conventions. La relecture des règles autoritaires KSP/Games révèle alors un écart PGR plus ancien : la conception initiale avait retenu un profil de forte explicité, mais 510-RUST_CARGO.md matérialisé conservait encore une politique permissive sur les use non-traits et ne formalisait pas la nomenclature des crates.
KSP RULES_RUST.md version 10 fournit la référence stricte : Rust 2024, use réservé aux traits, chemins externes publics explicites et courts, réexports internes self::, façade crate-root, crate::Item, absence d'alias/globs et contrôle de flux explicite. Games RULES_RUST.md version 7 confirme le noyau Rust 2024/façade/erreurs mais reste plus léger sur certains imports et règles de forme. alpha.7 retient donc le profil strict comme défaut des nouvelles baselines contrôlées tout en conservant des overrides explicites pour les projets externes ou historiques.
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/templates/002-CARGO_MANIFESTS.md
ADD :
deltas/0.0.5/alpha.7.md
DELETE : aucun.
Décisions
Pour une nouvelle baseline Rust contrôlée :
- Rust 2024 devient la baseline normative actuelle ; une contrainte externe doit être documentée explicitement ;
useest réservé aux traits qui doivent réellement être mis en scope ; les autres symboles sont appelés par chemins explicites ;- un symbole externe utilise le chemin public le plus court exposé par sa crate ;
- les réexports internes utilisent
self::, restent explicites ligne par ligne et ne masquent pas les collisions par alias ; - les glob imports, regroupements par accolades de façade et imports non-traits de commodité sont interdits ;
- les modules d'implémentation restent privés ; les items partagés passent par la façade crate-root et
crate::Item, y compris dans leur module propriétaire ; pub(super)/pub(in ...)ne remplacent pas cette façade dans une baseline contrôlée ;- tout
pub/pub(crate)et tout réexport crate-root porte une rustdoc utile ; unwrap,expectet?sont interdits en production dans le profil strict ; la propagation d'erreur et les retours restent explicites.
Le marqueur historique KSP rust-rules: trait-import n'est pas généralisé : il appartient à l'enforcement local, pas à la règle sémantique.
Pour la nomenclature des crates d'un nouveau projet contrôlé :
<project>-<responsibility>-<role-or-target>
est la forme recommandée. Le préfixe projet/abréviation est obligatoire ; le classificateur (lib, api, worker, job, cli, desk, desktop, tauri, wasm, server, etc.) est utilisé lorsqu'il apporte une information réelle. Le vocabulaire exact reste local, aucun suffixe n'est ajouté par symétrie et aucun projet historique n'est renommé rétroactivement uniquement pour adopter cette grammaire.
Le skeleton Rust/Cargo et le guide des manifests adoptent ces choix pour les futures baselines contrôlées. L'audit de façade déjà livré devient une sélection recommandée du skeleton strict ; l'adoption d'un projet existant commence toujours en --report-only.
Hors scope
Cette tranche ne modifie pas les règles de blocs homogènes, ordre alphabétique, espacement, regroupement par visibilité ou organisation structurelle des items : elles restent réservées à alpha.8 avec leurs audits monotâches.
Elle n'importe pas audit_rust_general_rules.py depuis KSP/Games, ne crée aucun parser Rust général et ne modifie pas le skeleton Tauri prévu en alpha.9.
Validation opérateur
Après application du history PASS de alpha.6.fix.3, commit/push de cette tranche, puis application du présent delta :
test "$(cat VERSION)" = '0.0.5-alpha.7'
test -f history/0.0.5/alpha.6.fix.3.md
test -f deltas/0.0.5/alpha.7.md
test ! -e history/0.0.5/alpha.7.md
grep -A2 '^## Statut$' history/0.0.5/alpha.6.fix.3.md | grep -Fx 'PASS'
grep -Fx '<!-- version: 5 -->' docs/rules/510-RUST_CARGO.md
grep -Fx '<!-- version: 3 -->' docs/skeletons/002-RUST_CARGO_WORKSPACE.md
grep -Fx '<!-- version: 2 -->' docs/templates/002-CARGO_MANIFESTS.md
grep -Fx '<!-- version: 8 -->' docs/studies/001-KSP_GAMES_RECONCILIATION.md
grep -Fx '<!-- version: 9 -->' 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.6.fix.3.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 (
"nouveau projet Rust contrôlé MUST utiliser l'édition Rust 2024",
"### Nomenclature des crates dans un projet contrôlé",
"<project>-<responsibility>-<role-or-target>",
"### `use` réservé aux traits",
"le code utilise directement le **chemin public le plus court**",
"Les réexports d'éléments internes commencent par `self::`",
"toute référence dans la même crate MUST utiliser `crate::Item`",
"`unwrap()` et `expect()` MUST NOT être utilisés",
"l'opérateur `?` MUST NOT être utilisé",
):
assert phrase in rules, phrase
for forbidden in (
"PGR ne généralise pas l'interdiction KSP plus stricte de tous les `use` non-traits",
"le profil de façade crate-root est seulement facultatif pour une nouvelle baseline contrôlée",
):
assert forbidden not in rules, forbidden
skeleton = Path("docs/skeletons/002-RUST_CARGO_WORKSPACE.md").read_text(encoding="utf-8")
for phrase in (
"nom court/abréviation canonique du projet",
"édition Rust 2024",
"façade crate-root et les chemins explicites sont sélectionnés par défaut",
"audit_rust_export_completeness.py",
):
assert phrase in skeleton, phrase
study = Path("docs/studies/001-KSP_GAMES_RECONCILIATION.md").read_text(encoding="utf-8")
assert "#### Décision `alpha.7` — profil Rust strict et nomenclature" in study
assert "KSP `RULES_RUST.md` version `10`" in study
assert "Games `RULES_RUST.md` version `7`" in study
assert "Les règles de blocs homogènes" in study
plan = Path("docs/plans/005-V0_0_5_RECONCILIATION_PLAN.md").read_text(encoding="utf-8")
assert "La réconciliation des règles versionnées KSP/Games retient KSP comme référence stricte" in plan
assert "### alpha.8 — formatage Rust structurel et audits monotâches" in plan
assert "### alpha.9 — décision de skeleton Tauri pour projets contrôlés" in plan
print("0.0.5 alpha.7 strict Rust profile audit: clean (explicit paths, crate-root facade, controlled naming, alpha.8 formatting deferred)")
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/templates/002-CARGO_MANIFESTS.md \
deltas/0.0.5/alpha.7.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.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/templates/002-CARGO_MANIFESTS.md