Files
khadhroony-solana-project/deltas/0.3.15/pre.009-fix.003.md

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 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 :

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