0.3.15-pre.009-fix.003

This commit is contained in:
2026-09-14 21:06:32 +02:00
parent 8ae4d0effd
commit 9fd51c5a41
7 changed files with 383 additions and 8 deletions

View File

@@ -0,0 +1,244 @@
<!-- file: deltas/0.3.15/pre.009-fix.003.md -->
<!-- version: 1 -->
# 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
```