# Delta v0.3.15-pre.015-fix.001 — Stop Yellowstone post-half-close ## Base ```text ksp-general-0.3.15-pre.015.zip SHA-256: 3ab4b976ae612286b577aa003c10e6b9627be040a0a0fc51b2c9e45d6616893e ``` Le gate `pre.015` confirme la correction de la saturation locale : les audits, `cargo check`, Clippy, les suites ciblées et le workspace passent, le canari Transport de backpressure soutenue passe, et la trace live fournie ne contient plus de `grpc_backpressure_overflow` Yellowstone pendant le run. Le défaut restant appartient au même contrat `pre.015`, car le gate exige explicitement `Stop ciblé -> Stopped`. ## Défaut observé ```text 20:57:33.659 Stop Yellowstone demandé 20:57:33.778 PublicNode renvoie grpc Status Unknown pendant graceful shutdown 20:57:33.780 Worker classe la source source_failed / grpc_status 20:57:34.918 route terminale Faulted / Unhealthy ``` La fonction `finish_client_half_close()` est exécutée uniquement après déclenchement du shutdown local. Elle classait pourtant tout `Status` reçu après le half-close comme une nouvelle faute distante, ce qui remplaçait à tort la terminaison coopérative déjà engagée. ## Correction Pendant `finish_client_half_close()` : ```text Status reçu après shutdown local explicite -> log safe du code gRPC -> state = Closed -> terminal_error_code = None -> session.close() = Ok(()) ``` La branche active reste inchangée : un `Status` reçu par `run_subscribe_actor()` avant shutdown continue d'entrer dans la politique de reconnect bornée et reste terminal si cette politique ne peut pas récupérer la session. Le timeout de fermeture hostile reste également inchangé et borné par `close_timeout`. ## Canaris ```text yellowstone_explicit_close_accepts_remote_status_after_local_half_close yellowstone_stream_remote_status_is_safe_and_terminal yellowstone_hostile_server_shutdown_is_bounded_by_close_timeout release_v0_3_15_pre_015_fix_001_local_close_status_is_closed_without_weakening_active_status_failure ``` ## Frontières Aucun changement de Worker, Store, Config, Desk, schema, RAW, reconnect budget, capacités de queue ou API publique. Aucun status reçu en fonctionnement normal n'est reclassé en succès. ## Version ```text workspace.package.version : 0.3.15-pre.15.fix.1 root Cargo header counter : 633 ``` ## Validation attendue ```text 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/0.3.15 cargo check --workspace cargo clippy --workspace --all-targets --all-features -- -D warnings cargo test -p ksp-onchain-transport-lib --all-targets --all-features cargo test -p ksp-worker-raw-transaction-ingest-lib --all-targets --all-features cargo test -p ksp-app-raw-transaction-ingest-desk --all-targets --all-features cargo test --workspace --all-targets --all-features (cd crates/ksp-app-raw-transaction-ingest-desk && cargo tauri dev) ``` Live : Yellowstone Mainnet doit rester sain pendant le run puis terminer `Stopped` après Stop ciblé, y compris si le provider renvoie `Unknown` après le half-close. HTTP Block Polling doit conserver son comportement `Stopped/Healthy` indépendant. ## Inventaire exact du delta Ajout : ```text deltas/0.3.15/pre.015-fix.001.md ``` Modifications : ```text Cargo.toml crates/ksp-onchain-transport-lib/README.md crates/ksp-onchain-transport-lib/src/grpc_stream.rs crates/ksp-onchain-transport-lib/tests/release_completeness.rs crates/ksp-onchain-transport-lib/unit_tests/grpc_stream.rs docs/validation/032-V0_3_15_RAW_TRANSACTION_INGEST_DESK.md ``` Suppressions : aucune.