Files
2026-09-10 17:33:02 +02:00

8.6 KiB

Delta 0.3.13-pre.007 — supervision et inventaire multi-source

Base requise

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 :

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

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é :

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 :

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 :

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 :

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 :

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 :

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

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

deltas/0.3.13/pre.007.md

Fichiers supprimés

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

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 :

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

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