245 lines
8.1 KiB
Markdown
245 lines
8.1 KiB
Markdown
<!-- 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
|
|
```
|