# Delta 0.3.13-pre.007 — supervision et inventaire multi-source ## Base requise ```text livraison précédente : 0.3.13-pre.006-fix.001 Cargo base : 0.3.13-pre.6.fix.1 delta base : deltas/0.3.13/pre.006-fix.001.md archive delta base : ksp-general-0.3.13-pre.006-fix.001.zip ``` Le gate opérateur communiqué le 10 septembre 2026 est vert sur toutes les commandes exécutées : `cargo fmt`, `cargo fmt --check`, audits Rust/Markdown, `cargo check --workspace`, Clippy strict et toutes les suites de `ksp-worker-raw-transaction-ingest-lib` (`88` unit, `4` cross-layer, `13` dependency-boundary, `20` hardening, `14` public-api, `4` release-completeness, `0` doc-test). Le log reçu ne contient pas les sorties séparées `cargo test -p ksp-onchain-transport-lib` ni les trois commandes `cargo tree`; elles ne sont donc pas déclarées PASS dans ce delta. ## Objectif Activer réellement la collection `1..32` déjà composable depuis `pre.002` : ```text RawTransactionIngestRuntimeResources -> validation complète réseau / doublons / borne -> spawn de toutes les sources configurées -> inventaire privé source_key -> latest state/frontier -> projection frontier source-neutral agrégée -> terminalité conservatrice si une source disparaît ou échoue ``` Aucun provider n'est traité comme primaire, fallback ou standby. ## Version ```text livraison : 0.3.13-pre.007 workspace.package.version : 0.3.13-pre.7 archive : ksp-general-0.3.13-pre.007.zip ``` `Cargo.toml` passe de la version de fichier `551` à `552`. ## Supervisor multi-source `RawTransactionIngestWorker::start_with_runtime_resources` ne vérifie plus `validate_single_source_activation`. Après validation du réseau, le runtime délègue à `RawTransactionIngestRuntimeResources::run_live_sources`. Le supervisor privé : ```text crée un stop channel source-owned crée un JoinSet borné par la collection 1..32 spawn chaque source configurée exactement une fois clone uniquement les handles nécessaires rejoint toutes les tasks avant de rendre son résultat ``` La vieille erreur `runtime_resources.multi_source_activation_pending` disparaît du code production. ## Terminalité conservatrice La politique reste fail-closed : ```text stop Worker -> fanout stop vers toutes les sources -> join complet -> Ok seulement si les sources ferment sans erreur source Err -> stop immédiat des autres sources -> join complet -> faute source terminale source Ok avant stop Worker -> fermeture inattendue d'une source configurée -> stop des autres sources -> faute terminale JoinError -> faute terminale sûre ``` Le Worker ne suppose pas qu'une autre source couvre les mêmes filtres, le même provider universe ou la même complétude. ## Inventaire privé et processing frontier `RawTransactionIngestSourceInventory` et `RawTransactionIngestSourceInventoryPublisher` restent privés au module runtime resources. L'inventaire est initialisé depuis les `source_key` déjà validées et possède exactement une entrée latest-value par source du run. Chaque source conserve son propre publisher local. Un wrapper privé reporte ses projections dans l'inventaire puis publie une projection globale conservative : ```text hydration_pending : somme saturante temporaire des sources oldest_pending_slot : minimum global processing_frontier_slot : None si une source n'a pas encore de frontier sinon minimum de toutes les frontiers source_state : Failed > Reconnecting > Closing > Active > Closed/None reconnect/replay/gap : agrégation saturante, jamais wrap arithmétique ``` Le choix du minimum n'est pas une preuve de coverage blockchain. La frontier reste run-local et source-neutral. ## Propriété d'ownership Les sources physiques continuent d'appartenir à leurs façades Transport existantes. Le Worker ne crée ni client reqwest, ni socket alternatif, ni SDK provider. Le supervisor ajoute uniquement l'ownership des tasks source et de leur lifecycle commun. Une source qui termine avant le stop est explicitement marquée `Closed` ou `Failed` dans l'inventaire avant le résultat du supervisor. Les identités `source_key` restent privées et ne sont jamais projetées dans `RawTransactionIngestSnapshot` ou le crate root. ## Preuves ajoutées Unit tests déterministes : ```text inventaire 2 sources : pending/frontier/state/counters agrégés conservativement stop supervisor : trois tasks source actives reçoivent le stop et sont toutes jointes source failure : la source sœur reçoit le stop et est jointe avant retour de faute ``` Canaris externes : ```text dependency_boundary : run_live_sources, JoinSet, inventaire privé, vieille barrière absente hardening : stop/fault/join fail-closed, aucune policy primary/standby, aucun canal unbounded public_api : inventaire/live-source/source_key non exportés ``` Les canaris historiques `0.3.12` qui cherchaient `run_single_live_source` sont mis à jour vers le supervisor multi-source au lieu d'être supprimés. ## Frontière de tranche `pre.007` active la simultanéité, mais ne ferme pas encore la convergence transactionnelle cross-source : ```text pas de coalescence globale de la même signature entre plusieurs sources pas d'unique hydration cross-source garantie pas de fusion de plusieurs provenance/observation seeds vers une acquisition canonique unique pas encore de record_raw_transaction_observation pour les observations supplémentaires convergées pas encore de fairness durcie duplicate-storm pas encore de source_total/source_active/source_failed publics ``` Les coordinators d'hydration des sources reference-bearing restent donc source-local pendant cette tranche. La fermeture de la coalescence globale et des observations multiples appartient à `pre.008`, puis les bornes/fairness renforcées à `pre.009`. ## Documentation Le README du crate décrit désormais le supervisor 1..32, la terminalité conservative et la frontier agrégée. `USAGE.md` reste version-neutral et montre comment composer plusieurs sources via les `try_push_*` existants sans mentionner le numéro de prerelease. Le plan et la validation consignent le gate opérateur réellement reçu et distinguent explicitement ce qui reste reporté à `pre.008+`. ## Fichiers modifiés ```text Cargo.toml crates/ksp-worker-raw-transaction-ingest-lib/README.md crates/ksp-worker-raw-transaction-ingest-lib/USAGE.md crates/ksp-worker-raw-transaction-ingest-lib/src/runtime.rs crates/ksp-worker-raw-transaction-ingest-lib/src/runtime_resources.rs crates/ksp-worker-raw-transaction-ingest-lib/tests/dependency_boundary.rs crates/ksp-worker-raw-transaction-ingest-lib/tests/hardening.rs crates/ksp-worker-raw-transaction-ingest-lib/tests/public_api.rs crates/ksp-worker-raw-transaction-ingest-lib/tests/release_completeness.rs crates/ksp-worker-raw-transaction-ingest-lib/unit_tests/runtime_resources.rs docs/plans/034-V0_3_13_MULTI_SOURCE_LIVE_CONVERGENCE_PLAN.md docs/validation/030-V0_3_13_MULTI_SOURCE_LIVE_CONVERGENCE.md ``` ## Fichiers ajoutés ```text deltas/0.3.13/pre.007.md ``` ## Fichiers supprimés ```text aucun ``` ## Validation dans l'environnement d'assemblage Le toolchain Rust/Cargo/Rustfmt n'est pas disponible dans l'environnement d'assemblage. Les commandes Cargo post-`pre.007` restent donc `NON EXÉCUTÉ LOCAL`. Les audits statiques KSP, le scan normatif, les versions de fichiers et le diff exhaustif sont exécutés sur l'état exact avant packaging. ## Résultats statiques finaux de l'assemblage ```text General Rust rule audit: clean Rust export completeness audit: 0 candidate(s) KSP workspace Rust rule audit: clean Markdown table audit: clean (340 tables, 841 files) Normative rule definitions: 489 Unique normative IDs: 489 Duplicates: 0 ``` Contrôle ciblé du supervisor : ```text ancienne barrière validate_single_source_activation : absente runtime_resources.multi_source_activation_pending : absent du code production inventaire source public : absent source_key public : absent unbounded_channel : absent nouvelle dépendance : aucune ``` ## Gate opérateur requis avant pre.008 ```bash cargo fmt --all cargo fmt --all -- --check 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 cargo check --workspace cargo clippy --workspace --all-targets --all-features -- -D warnings cargo test -p ksp-onchain-transport-lib cargo test -p ksp-worker-raw-transaction-ingest-lib cargo tree -p ksp-worker-raw-transaction-ingest-lib --edges normal cargo tree -p ksp-worker-raw-transaction-ingest-lib -e features cargo tree --duplicates ```