# Delta v0.3.6-pre.009-fix.001 ## Base requise - `0.3.6-pre.9` / livraison `pre.009`. - Le gate opérateur de `pre.009` confirme `cargo check --workspace` et l'exécution intégrale des 47 tests unitaires + 10 canaries d'intégration. - Clippy reste non warning-free avec deux réexports `pub(crate)` inutilisés (`BackfillRuntimeControl`, `TerminalClaim`) et une canarie `public_api` dont le paramètre générique n'est pas effectivement utilisé. - L'inspection de la cause révèle un défaut plus fondamental : plusieurs items `pub`/`pub(crate)` partagés de `ksp-job-backfill-lib` sont encore référencés par nom local depuis leur module propriétaire, contrairement à `RUST-IMPORT-009`; deux helpers runtime n'ont en outre aucune justification de visibilité crate-wide selon `RUST-API-007`. ## Correctif de visibilité et de chemins crate-root Le correctif ne masque pas les warnings. Il réconcilie toute la crate `ksp-job-backfill-lib` avec les contrats Rust applicables : - tout item partagé `pub` ou `pub(crate)` réexporté à la racine est référencé via `crate::Item`, y compris depuis son module de déclaration ; - les implémentations des types partagés utilisent la façade crate-root (`impl crate::Type`, `impl Trait for crate::Type`) ; - aucun chemin `crate::module::Item` n'est conservé pour une surface partagée ; - les unit tests attachés à un module continuent d'utiliser `crate::Item` pour les items partagés et `super::Item` pour les items strictement privés. Cette réconciliation couvre les surfaces déjà présentes de la crate (`BackfillCheckpoint`, discovery, conversion, persistence, bounded execution) afin de ne pas laisser dans le même composant des violations identiques à celles révélées par `pre.009`. ## Visibilité runtime `BackfillRuntimeControl` et `TerminalClaim` sont utilisés uniquement par `runtime.rs` et ses unit tests attachés. Ils redeviennent donc privés : ```text BackfillRuntimeControl pub(crate) -> private TerminalClaim pub(crate) -> private ``` Leurs réexports crate-root sont supprimés. Les unit tests de `runtime.rs` les consomment via `super::BackfillRuntimeControl` et `super::TerminalClaim`, conformément à `RUST-IMPORT-012` et `RUST-API-007`. Les canaries discovery/execution n'élargissent plus artificiellement cette visibilité pour provoquer une annulation. Elles construisent directement : ```text JobCancellationToken watch crate::BackfillCancellationSignal ``` puis déclenchent à la fois le token runtime-neutral et le réveil `watch` privé. `BackfillCancellationSignal` et `BackfillRuntimePublisher` restent `pub(crate)` car ils sont réellement consommés par d'autres modules de production ; leurs implémentations et usages passent par `crate::...`. ## Canary Clippy publique La canarie `pre_009_concrete_runtime_snapshot_and_control_contracts_are_available_from_crate_root` conserve son assertion générique sur `JobSnapshotSource`, mais le type générique est désormais porté par un argument `PhantomData`. Le paramètre n'est donc plus considéré comme inutilisé par `clippy::extra_unused_type_parameters`. Aucun contrat public, état Job, sémantique d'annulation, comportement latest-value, frontier/checkpoint, dépendance ou feature ne change. ## Cargo et versions de fichiers - `workspace.package.version` : `0.3.6-pre.9` -> `0.3.6-pre.9.fix.1`. - `Cargo.toml` : version d'en-tête `408` -> `409`. - `src/checkpoint.rs` : `1` -> `2`. - `src/conversion.rs` : `3` -> `4`. - `src/discovery.rs` : `4` -> `5`. - `src/execution.rs` : `2` -> `3`. - `src/lib.rs` : `5` -> `6`. - `src/persistence.rs` : `2` -> `3`. - `src/request.rs` : `3` -> `4`. - `src/runtime.rs` : `2` -> `3`. - `tests/public_api.rs` : `6` -> `7`. - `unit_tests/discovery.rs` : `5` -> `6`. - `unit_tests/execution.rs` : `2` -> `3`. - `unit_tests/runtime.rs` : `2` -> `3`. - plan 027 : `16` -> `17`. - validation 023 : `16` -> `17`. ## Graphe de dépendances Aucune dépendance ni feature ne change dans ce fix. Les arbres Cargo ont déjà été inspectés au gate de `pre.009`, puisque cette tranche promouvait Tokio en dépendance normale privée. Ils ne sont donc pas à rejouer pour `pre.009-fix.001` sauf si l'opérateur effectue séparément un `cargo clean` et souhaite revalider le graphe après reconstruction propre. ## Payload Ajout : - `deltas/0.3.6/pre.009-fix.001.md` Modifications : - `Cargo.toml` - `crates/ksp-job-backfill-lib/src/checkpoint.rs` - `crates/ksp-job-backfill-lib/src/conversion.rs` - `crates/ksp-job-backfill-lib/src/discovery.rs` - `crates/ksp-job-backfill-lib/src/execution.rs` - `crates/ksp-job-backfill-lib/src/lib.rs` - `crates/ksp-job-backfill-lib/src/persistence.rs` - `crates/ksp-job-backfill-lib/src/request.rs` - `crates/ksp-job-backfill-lib/src/runtime.rs` - `crates/ksp-job-backfill-lib/tests/public_api.rs` - `crates/ksp-job-backfill-lib/unit_tests/discovery.rs` - `crates/ksp-job-backfill-lib/unit_tests/execution.rs` - `crates/ksp-job-backfill-lib/unit_tests/runtime.rs` - `docs/plans/027-V0_3_6_JOB_API_BACKFILL_PLAN.md` - `docs/validation/023-V0_3_6_JOB_API_BACKFILL.md` Aucune suppression. ## Validations exécutées à l'assemblage ```text python3 scripts/audit_rust_workspace_rules.py python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas/0.3.6 ``` Un contrôle ciblé supplémentaire vérifie dans `ksp-job-backfill-lib` qu'aucun item réexporté au crate-root n'est encore référencé localement par son nom nu dans son module propriétaire et qu'aucun `crate::module::Item` ne subsiste pour les surfaces partagées. L'environnement d'assemblage ne fournit ni Cargo, ni Rustc, ni Rustfmt ; le gate Rust du fix reste donc à exécuter par l'opérateur. ## Gate opérateur demandé ```bash cargo fmt --all python3 scripts/audit_rust_workspace_rules.py python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas/0.3.6 cargo check --workspace cargo clippy --workspace --all-targets cargo test -p ksp-job-backfill-lib ``` Attendu : 47 tests unitaires et 10 canaries d'intégration, sans warning Clippy. Aucun `cargo tree` n'est demandé pour ce fix sans changement de dépendances/features.