0.3.15-pre.009-fix.003
This commit is contained in:
244
deltas/0.3.15/pre.009-fix.003.md
Normal file
244
deltas/0.3.15/pre.009-fix.003.md
Normal 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
|
||||
```
|
||||
Reference in New Issue
Block a user