Files
pgr/deltas/0.0.5/alpha.7.md
2026-09-25 11:45:10 +02:00

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 ;
  • use est 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, expect et ? 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