# Delta `0.3.12-pre.009` — hardening races/retry/backpressure et no-orphan ## Base requise ```text 0.3.12-pre.008-fix.002 workspace.package.version = 0.3.12-pre.8.fix.2 ``` Le gate opérateur communiqué pour cette base est entièrement vert : audits Rust/Markdown, `cargo check --workspace`, Clippy strict, 388 tests unitaires Transport, 51 `public_api` Transport, 43 `release_completeness` Transport, 63 tests unitaires Worker, 9 `dependency_boundary`, 15 `hardening`, 9 `public_api` et 3 `release_completeness` Worker sans échec. ## Objectif Fermer les races terminales prévues pour `pre.009` sans élargir le pipeline : ```text stop/fault pendant hydration pending/coalescence abortée processing frontier conservative retry ownership Transport-only duplicate storm bornée counter exhaustion transactionnelle no-orphan final ``` ## Version ```text workspace.package.version = 0.3.12-pre.9 ``` ## No-orphan source/hydration `RawTransactionIngestHydrationCoordinator::abort_all` reçoit désormais le reporter de processing frontier. Le cleanup : ```text abort_all des tâches hydration join de toutes les tâches hydration clear de la map pending pending_signal_count = 0 discard_all_pending de la frontier ``` `discard_all_pending` ne convertit jamais un pending en settled. Toute slot qui contenait encore au moins un pending est retirée de la projection conservative, même si un autre signal de cette slot avait déjà été settled. Cela empêche une frontier terminale d'avancer à travers du travail abandonné lors d'un stop, d'un source fault, d'une erreur hydration ou d'un gap de continuité prouvé. ## Arithmetic transactionnelle Les mutations de `RawTransactionIngestProcessingFrontier` sont durcies : ```text observe_pending : overflow vérifié avant mutation de l'entrée observe_settled : overflow vérifié avant mutation de l'entrée settle_pending : settled.checked_add avant décrément pending ``` Un `source.frontier_slot_settled_counter_exhausted` laisse donc le pending et la projection inchangés ; aucun état partiellement muté n'est publié. ## Duplicate storm et backpressure Le canari source crée une petite borne déterministe et injecte plusieurs signaux identiques : ```text hydration in-flight -> abort/join puis 0 tâche et 0 pending 3 signaux identiques -> 1 clé coalescée, 3 pending 4e signal -> source.hydration_pending_saturated aucune tâche HTTP supplémentaire abort -> 0 pending, 0 tâche, frontier inchangée au dernier niveau sûr ``` La borne productive existante reste inchangée et aucun canal unbounded n'est ajouté. ## Retry ownership Le Worker conserve exactement un appel `get_transaction_observed` dans son chemin hydration et n'ajoute aucun `sleep`/`interval` de retry. Les retries réseau, backoff, rate-limit et reroutage restent exclusivement dans Transport. Les tests runtime existants continuent de qualifier Store lent, source failure, stop pendant drain, saturation centrale, drain timeout et counter exhaustion snapshot. ## Fichiers modifiés ```text Cargo.toml crates/ksp-worker-raw-transaction-ingest-lib/src/runtime_resources.rs crates/ksp-worker-raw-transaction-ingest-lib/tests/hardening.rs crates/ksp-worker-raw-transaction-ingest-lib/unit_tests/runtime_resources.rs docs/validation/029-V0_3_12_YELLOWSTONE_HYDRATION_CONTINUITY.md ``` ## Fichier ajouté ```text deltas/0.3.12/pre.009.md ``` ## Fichiers supprimés ```text aucun ``` ## Non-changements `pre.009` n'ajoute ni ne modifie : ```text API publique Worker snapshot public Store/Config/Backfill Common RAW Transport replay semantics from_slot / ReplayInfo repair/failover retry Worker checkpoint durable ``` ## Validations exécutées dans l'environnement d'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 canaris statiques pre.009 no-orphan/retry ownership contrôle des versions de fichiers modifiés contrôle diff exact contre pre.008-fix.002 unzip -t du delta final reproduction du delta sur la base exacte ``` `cargo`, `rustc` et `rustfmt` ne sont pas disponibles dans l'environnement d'assemblage. Aucun gate Cargo local n'est revendiqué. ## Gate opérateur requis ```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 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 ``` ## Suite `pre.010` reste consacré à la completeness/security cross-layer : fixtures Legacy/V0, dependency firewall, public API exact, redaction, release completeness et scanners, sans nouveau scope fonctionnel.