# Delta 0.3.13-pre.008 — convergence cross-source et observations multiples ## Base requise ```text livraison précédente : 0.3.13-pre.007 Cargo base : 0.3.13-pre.7 delta base : deltas/0.3.13/pre.007.md archive delta base : ksp-general-0.3.13-pre.007.zip ``` Le gate opérateur communiqué le 10 septembre 2026 est vert pour toutes les commandes exécutées : `cargo fmt`, `cargo fmt --check`, audits Rust/Markdown, `cargo check --workspace`, Clippy strict et toutes les suites `ksp-worker-raw-transaction-ingest-lib` (`90` unit, `4` cross-layer, `14` dependency-boundary, `21` hardening, `15` 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 ici. ## Objectif Fermer la convergence des sources live simultanées sans dupliquer l'identité `RawTransaction` : ```text plusieurs sources reference-bearing -> une hydration globale par (network, signature, commitment) -> acquisitions source-distinctes -> canonicalisation RAW commune -> convergence par (network, signature) + content hash -> une entity RAW -> plusieurs observations déterministes ``` ## Version ```text livraison : 0.3.13-pre.008 workspace.package.version : 0.3.13-pre.8 archive : ksp-general-0.3.13-pre.008.zip ``` `Cargo.toml` passe de la version de fichier `552` à `553`. ## Hydration globale cross-source `RawTransactionIngestRuntimeResources::run_live_sources` crée un `RawTransactionIngestGlobalHydrationRegistry` privé partagé par Yellowstone, Standard Logs et Helius Transaction. Standard Block et HTTP Block Polling restent RAW-direct et n'entrent pas dans ce registre. La clé reste exactement : ```text (network, signature, commitment) ``` Le premier demandeur devient leader et exécute le `getTransaction observed` existant. Les suivants s'abonnent au même résultat via un `watch` privé. La registry est bornée par `admission_queue_capacity`, publie soit le résultat observed soit un `ErrorCode` sûr, puis retire la clé. Les signaux source restent distincts : le même résultat d'hydration est finalisé séparément avec le contexte/provenance de chaque signal. ## Convergence persistence Le runtime possède un `RawTransactionIngestPersistenceConvergence` privé et run-local. Sa capacité productive est : ```text max(admission_queue_capacity, persistence_concurrency) ``` Chaque identité `(network, signature)` possède un verrou async local et mémorise le `RawContentHash` canonique après une première persistence réussie non purgée. ```text première acquisition -> persist_raw_transaction_acquisition -> Store atomique entity + observation même identity + même content hash -> record_raw_transaction_observation uniquement même identity + hash divergent -> content conflict terminal ``` Le cache évince uniquement une entrée inactive lorsqu'il atteint sa borne. Le runtime dimensionne cette borne pour couvrir toutes les tâches persistence simultanées valides. ## Observations multiples L'`observation_key` reste dérivée de la référence canonique et du `source_key` privé. Deux sources distinctes observant le même RAW produisent donc une seule référence/entity mais des observations déterministes distinctes. Un replay de la même observation retourne `AlreadyPresent` sans réécriture de l'entité. Une observation supplémentaire `NotRecorded` est incohérente pour une entité déjà durable et devient une faute runtime sûre. ## Preuves ajoutées Tests unitaires déterministes : ```text deux source_key -> même référence/hash canonique, observation_key distinctes registry globale -> un leader, un follower, publication partagée puis retrait première identity -> une persistence atomique seconde observation distincte -> record_observation seul replay même observation -> AlreadyPresent sans nouvelle persistence entity ``` Canaris externes : ```text dependency_boundary : Store/Transport facades uniquement, pas de backend/client direct hardening : caches bornés, hash conflict-checked, convergence privée, aucun canal unbounded public_api : registry/cache/hydration key/source_key non exposés release_completeness : présence obligatoire des trois canaris pre.008 ``` ## Frontière de tranche `pre.008` ne ferme pas encore : ```text fairness adversariale sous duplicate storm prolongé starvation entre sources matrice complète de disagreement provider/source stress des bornes globales nouveaux compteurs/health publics multi-source ``` Ces points restent `pre.009` et `pre.010` selon le plan. ## 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/lib.rs crates/ksp-worker-raw-transaction-ingest-lib/src/persistence.rs 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/admission.rs crates/ksp-worker-raw-transaction-ingest-lib/unit_tests/persistence.rs crates/ksp-worker-raw-transaction-ingest-lib/unit_tests/runtime.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.008.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.008` restent donc `NON EXÉCUTÉ LOCAL`. Les audits statiques KSP, le scan normatif, le contrôle exhaustif du diff, des headers et du ZIP sont exécutés avant livraison. Résultats statiques finaux : ```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, 842 files) Normative rule definitions: 489 Unique normative IDs: 489 Duplicates: 0 ``` Contrôle ciblé : ```text 17 fichiers existants modifiés 1 fichier ajouté 0 suppression 17/17 headers existants : +1 nouvelle dépendance : aucune backend Store physique direct : absent client HTTP/gRPC direct : absent unbounded_channel : absent convergence/registry publiques : absentes ``` ## Gate opérateur requis avant pre.009 ```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 ```