8.1 KiB
Delta 0.3.15-pre.009-fix.003
Base requise
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 deshutdown_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
Stoppinget exige que l'admission soit encore ouverte, puis que le Worker termineStoppedavecsource_failure_total == 0; - le canari
pre_010_production_module_inventory_is_exactinclut désormaisconstants.rs.
Non-claims
Ce correctif ne transforme pas les fautes Transport en succès et ne modifie pas :
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
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
deltas/0.3.15/pre.009-fix.003.md
Fichiers modifiés
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
aucun
Validations exécutées dans l'environnement d'assemblage
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 :
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
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 :
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
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
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