# Delta `0.3.15-pre.009-fix.003` ## Base requise ```text workspace state : 0.3.15-pre.009-fix.002 Cargo version : 0.3.15-pre.9.fix.2 base delta : deltas/0.3.15/pre.009-fix.002.md base delta zip : ksp-general-0.3.15-pre.009-fix.002.zip base zip SHA-256: aaf199604be3351eb2befbcf4903fe6c933895d71512a5fa6ab6a7476e31baa3 ``` `pre.009-fix.002` est un delta d'échange. L'état de base requis est donc le workspace `fix.001` après application exacte de ce delta, et non l'extraction isolée de l'archive delta dans un répertoire vide. ## Objectif Fermer le dernier échec de gate statique de `fix.002` et corriger la race de shutdown désormais qualifiée de manière identique sur Mainnet par Yellowstone et HTTP Block Polling : ```text worker_raw_transaction_ingest.runtime_invalid condition=source.admission_closed transport_domain=none transport_code=none ``` Le correctif doit conserver le drain borné, ne pas masquer les vraies fautes Transport et ne pas introduire de traitement spécifique par route lorsque la cause appartient au superviseur Worker commun. ## Résultat du gate `fix.002` pris en compte Le gate opérateur confirme : ```text Rust rule audit PASS Markdown table audit PASS (318 tables / 210 fichiers) cargo check --workspace PASS Clippy strict workspace PASS Worker unit tests PASS : 158 / 158 workspace_logging PASS Worker all-targets/all-features FAIL : 1 canari release_completeness workspace all-targets/all-features FAIL : même canari Worker cargo tauri dev lancé et application opérationnelle ``` L'échec statique est déterministe : ```text pre_010_production_module_inventory_is_exact réel : admission.rs, constants.rs, continuity.rs, ... attendu : admission.rs, continuity.rs, ... ``` `constants.rs`, ajouté volontairement par `fix.002` pour satisfaire le contrat de tracing workspace, doit appartenir à cet inventaire exact. ## Qualification live autoritaire Mainnet Yellowstone : ```text yellowstone-hydrated route productive via Yellowstone Block + HTTP getBlock Stop demandé ~5 s plus tard : runtime_invalid condition=source.admission_closed transport_domain=none transport_code=none terminal=Faulted ``` Mainnet HTTP polling : ```text http-block-polling route productive via getSlot/getBlocks/getBlock Stop demandé ~10 ms plus tard : runtime_invalid condition=source.admission_closed transport_domain=none transport_code=none terminal=Faulted ``` Le Yellowstone Devnet observé dans le même live est distinct : OrbitFlare retourne `onchain_transport.grpc_status` avec refus de permission lors de `SubscribeOpen`, avant Stop. Ce correctif ne reclasse pas cette faute provider/auth. ## Cause racine Le superviseur Worker externe suit actuellement l'ordre suivant après Stop : ```text source_stop_sender = true begin_stopping() drain_owned_work() -> drain_admission_and_persistence() -> admission.close() ``` Le child `run_live_sources` reçoit le Stop externe puis doit encore le relayer à ses sources internes. Si l'admission est fermée avant ce relais, un dernier `send()` interne peut observer : ```text admission receiver fermé source-local stop_receiver encore false ``` La source conclut alors à tort `source.admission_closed` et le shutdown coopératif devient `Faulted`. ## Corrections - le receiver d'admission n'est plus fermé au début du drain coopératif ; - l'ordre de shutdown continue à signaler le Stop aux sources avant le drain ; - le drain continue à consommer la file jusqu'à destruction naturelle des derniers senders après observation du Stop ; - `admission.close()` reste présent dans le chemin de `shutdown_drain_timeout`, juste avant abort/join forcé des tâches non coopératives ; - un test unitaire force une source coopérative à retarder l'observation du Stop jusqu'à l'état `Stopping` et exige que l'admission soit encore ouverte, puis que le Worker termine `Stopped` avec `source_failure_total == 0` ; - le canari `pre_010_production_module_inventory_is_exact` inclut désormais `constants.rs`. ## Non-claims Ce correctif ne transforme pas les fautes Transport en succès et ne modifie pas : ```text Devnet Yellowstone / OrbitFlare permission denied standard-logs-hydrated / rate-limit ou timeout provider standard-block-direct / rpc_application_error helius-transaction-hydrated / rpc_application_error ``` Ces fautes restent séparées du shutdown Mainnet qualifié ici. ## Version ```text header racine : 616 -> 617 workspace.package.version : 0.3.15-pre.9.fix.2 -> 0.3.15-pre.9.fix.3 livraison : 0.3.15-pre.009-fix.003 ``` ## Fichiers ajoutés ```text deltas/0.3.15/pre.009-fix.003.md ``` ## Fichiers modifiés ```text Cargo.toml crates/ksp-worker-raw-transaction-ingest-lib/src/runtime.rs crates/ksp-worker-raw-transaction-ingest-lib/tests/release_completeness.rs crates/ksp-worker-raw-transaction-ingest-lib/unit_tests/runtime.rs docs/plans/036-V0_3_15_RAW_TRANSACTION_INGEST_DESK_PLAN.md docs/validation/032-V0_3_15_RAW_TRANSACTION_INGEST_DESK.md ``` ## Fichiers supprimés ```text aucun ``` ## Validations exécutées dans l'environnement d'assemblage ```text python3 scripts/audit_rust_workspace_rules.py General Rust rule audit: clean Rust export completeness audit: 0 candidate(s) KSP workspace Rust rule audit: clean python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas/0.3.15 Markdown table audit: clean (318 tables / 211 fichiers) canari inventaire production Worker src/constants.rs présent dans l'inventaire exact attendu archive delta entrées : 7 unzip -t : PASS reconstruction depuis l'état fix.002 reconstructed files : 1938 work files : 1938 only reconstructed : 0 only work : 0 hash mismatches : 0 résultat : byte-exact ``` ## Validations non exécutées dans l'environnement d'assemblage `cargo` et `rustfmt` ne sont pas disponibles dans cet environnement. Les commandes suivantes ne sont donc pas déclarées PASS pour `fix.003` : ```text cargo fmt --all cargo fmt --all -- --check cargo check --workspace cargo clippy --workspace --all-targets --all-features -- -D warnings cargo test -p ksp-worker-raw-transaction-ingest-lib --all-targets --all-features cargo test -p ksp-core-lib --test workspace_logging cargo test --workspace --all-targets --all-features cargo tauri dev ``` ## Gate opérateur requis ```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/0.3.15 cargo check --workspace cargo clippy --workspace --all-targets --all-features -- -D warnings cargo test -p ksp-worker-raw-transaction-ingest-lib --all-targets --all-features cargo test -p ksp-core-lib --test workspace_logging cargo test --workspace --all-targets --all-features (cd crates/ksp-app-raw-transaction-ingest-desk && cargo tauri dev) ``` Pour le live Mainnet, tester au minimum : ```text yellowstone-hydrated -> Stop -> attendu Stopped http-block-polling -> Stop -> attendu Stopped ``` Une nouvelle ligne `RAW transaction ingest live source reached terminal failure` sur l'une de ces routes doit être copiée intégralement avec `condition`, `transport_domain` et `transport_code` ; elle ne doit pas être reclassée sans qualification. ## Décisions ```text corriger la race au niveau du drain Worker commun, pas par source laisser l'admission ouverte pendant la propagation coopérative du Stop réserver admission.close au cutoff forcé du shutdown timeout conserver shutdown_drain_timeout à 10 s ajouter constants.rs à l'inventaire de production exact ``` ## Questions ouvertes ```text validation live Mainnet Yellowstone -> Stopped après fix.003 validation live Mainnet HTTP Block Polling -> Stopped après fix.003 qualification/provider strategy des rpc_application_error Standard Block et Helius stratégie de débit Standard Logs face au rate-limit du RPC public ```