Files
pgr/deltas/0.0.5/alpha.5.md
2026-09-25 00:36:24 +02:00

7.2 KiB

Delta 0.0.5-alpha.5 — audit Rust de façade/export completeness

Baseline et version

Baseline attendue : commit opérateur complet de 0.0.5-alpha.4, réalisé après application de history/0.0.5/alpha.4.md avec statut PASS.

Le hash de ce futur commit n'est pas anticipé.

Version avant application :

0.0.5-alpha.4

Version après application :

0.0.5-alpha.5

Rôle de la tranche

alpha.5 extrait un audit Rust facultatif réellement réutilisable à partir du corpus KSP/Games, mais corrige avant généralisation une limite découverte dans le script historique : Games organise ses crates sous plusieurs niveaux et n'était pas réellement couvert par le glob crates/*/Cargo.toml.

La tranche reste limitée à la façade crate-root et aux chemins same-crate canoniques. Elle ne copie pas audit_rust_general_rules.py, ne commence pas Tauri et ne transforme pas PGR en workspace Rust.

Scope

REPLACE :

VERSION
docs/000-README.md
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

ADD :

docs/validation/003-RUST_EXPORT_COMPLETENESS.md
scripts/audit_rust_export_completeness.py
tests/test_rust_export_completeness.py
deltas/0.0.5/alpha.5.md

DELETE : aucun.

Le history alpha.4 appartient au commit baseline et n'est pas inclus dans l'archive du présent delta.

Décisions matérialisées

Audit monotâche

Le nouveau script possède exactement deux responsabilités :

RUST-API-201
    façade crate-root absente pour un élément public, ou crate-public clairement partagé

RUST-IMPORT-201
    chemin `crate::module::Item` alors qu'un réexport explicite fournit déjà `crate::Item`

Les conventions des tests unitaires séparés du script historique ne sont pas reprises. Le contrôle d'un symbole crate::X inexistant n'est pas repris non plus, car le compilateur Rust possède déjà la résolution de noms.

Découverte des crates

La découverte des Cargo.toml devient récursive et accepte les crates imbriquées. Les arbres générés usuels (target, build, builds, dist, node_modules, etc.) restent ignorés.

Le module fichier foo/mod.rs est interprété comme foo, et les réexports crate-root simples, groupés ou aliasés couverts par les tests sont reconnus.

Adoption facultative

Le contrat général Rust reste un SHOULD. Un projet existant peut commencer avec --report-only, traiter les écarts ou exceptions locales, puis rendre l'audit bloquant seulement après décision explicite.

L'audit est documenté dans docs/validation/003-RUST_EXPORT_COMPLETENESS.md et référencé par le skeleton Rust/Cargo sans devenir obligatoire.

Mesure de réconciliation

La prévalidation générateur sur les baselines autoritaires de alpha.1 observe :

KSP 0.3.16   22 crate(s)   0 candidate(s)
Games 0.3.5  23 crate(s)   2 candidate(s)

Le résultat Games antérieur 0 candidate(s) provenait d'une découverte de crates incomplète. Les deux candidats actuels ne sont pas traités comme des défauts historiques, car Games n'est pas encore gouverné par PGR.

Validation opérateur

Après application du history PASS de alpha.4, commit/push de cette tranche, puis application du présent delta :

test "$(cat VERSION)" = '0.0.5-alpha.5'
test -f history/0.0.5/alpha.4.md
test -f deltas/0.0.5/alpha.5.md
test -f scripts/audit_rust_export_completeness.py
test -f tests/test_rust_export_completeness.py
test -f docs/validation/003-RUST_EXPORT_COMPLETENESS.md
test ! -e history/0.0.5/alpha.5.md

grep -A2 '^## Statut$' history/0.0.5/alpha.4.md | grep -Fx 'PASS'
grep -Fx '# version: 1' scripts/audit_rust_export_completeness.py
grep -Fx '# version: 1' tests/test_rust_export_completeness.py
grep -Fx '<!-- version: 1 -->' docs/validation/003-RUST_EXPORT_COMPLETENESS.md
grep -Fx '<!-- version: 3 -->' docs/rules/510-RUST_CARGO.md
grep -Fx '<!-- version: 2 -->' docs/skeletons/002-RUST_CARGO_WORKSPACE.md
grep -Fx '<!-- version: 11 -->' docs/validation/001-VALIDATION_MATRIX.md

python3 -B -m unittest discover -s tests -p 'test_rust_export_completeness.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.4.md').read_text(encoding='utf-8')
assert re.search(r'## Statut\s+PASS\s', history)

script = Path('scripts/audit_rust_export_completeness.py').read_text(encoding='utf-8')
for phrase in (
    'def crate_roots(',
    'root.rglob("Cargo.toml")',
    'RUST-API-201',
    'RUST-IMPORT-201',
    '--report-only',
    '--summary-only',
):
    assert phrase in script, phrase
for forbidden in ('RUST-IMPORT-202', 'RUST-IMPORT-203', 'RUST-IMPORT-204', 'RUST-IMPORT-205'):
    assert forbidden not in script, forbidden

validation = Path('docs/validation/003-RUST_EXPORT_COMPLETENESS.md').read_text(encoding='utf-8')
for phrase in (
    '22` crates KSP',
    '23` crates Games',
    '0 candidate(s)',
    '2 candidate(s)',
    'ne sont pas qualifiés de défauts rétroactifs',
):
    assert phrase in validation, phrase

plan = Path('docs/plans/005-V0_0_5_RECONCILIATION_PLAN.md').read_text(encoding='utf-8')
assert 'KSP = 0 candidate(s) / 22 crates' in plan
assert 'Games = 2 candidate(s) / 23 crates' in plan

print('0.0.5 alpha.5 Rust façade audit: clean (recursive crate discovery, narrow ownership, regression coverage)')
PY

git diff --check

git add VERSION docs/000-README.md \
    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/003-RUST_EXPORT_COMPLETENESS.md \
    scripts/audit_rust_export_completeness.py \
    tests/test_rust_export_completeness.py \
    deltas/0.0.5/alpha.5.md

git diff --cached --check
git status --short

La sortie Git attendue avant ajout du history alpha.5 est exactement :

M  VERSION
A  deltas/0.0.5/alpha.5.md
M  docs/000-README.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
A  docs/validation/003-RUST_EXPORT_COMPLETENESS.md
A  scripts/audit_rust_export_completeness.py
A  tests/test_rust_export_completeness.py

Transition

PASS

Créer/appliquer history/0.0.5/alpha.5.md, committer/pousser 0.0.5-alpha.5, puis poursuivre à 0.0.5-alpha.6 pour le premier profil framework Tauri.

FAIL

Rester dans 0.0.5-alpha.5.fix.M si le défaut concerne l'audit, ses tests, sa documentation ou l'intégration Rust/Cargo. Ne pas absorber le profil Tauri dans un fix.