0.3.15-pre.016

This commit is contained in:
2026-09-19 05:08:05 +02:00
parent b1b0e91616
commit 5f19786ce9
4 changed files with 208 additions and 9 deletions

View File

@@ -1,5 +1,5 @@
<!-- file: docs/plans/036-V0_3_15_RAW_TRANSACTION_INGEST_DESK_PLAN.md -->
<!-- version: 24 -->
<!-- version: 25 -->
# Plan v0.3.15 — Raw Transaction Ingest Desk
@@ -869,19 +869,25 @@ Budget cible : une tranche de convergence/completeness cross-layer, sans modific
### `pre.015` — Yellowstone sustained gRPC backpressure
**État : en cours.** Le live prolongé de `pre.014-fix.001` a reproduit `Yellowstone subscribe update queue overflowed` à `22:09:54`, alors que le Stop opérateur n'est demandé qu'à `22:12:03`. `pre.013` a donc amélioré le débit sans fermer le défaut durable : lorsque les `256` slots pending Worker sont pleins, le Worker suspend `next_update()` ; la queue Transport bornée de `256` updates finit ensuite par se remplir et son ancien `try_send` transforme cette pression locale en faute terminale `grpc_backpressure_overflow`.
**État : implémenté et validé après `pre.015-fix.001`.** Le live prolongé de `pre.014-fix.001` avait reproduit `Yellowstone subscribe update queue overflowed` à `22:09:54`, alors que le Stop opérateur n'était demandé qu'à `22:12:03`. `pre.013` avait donc amélioré le débit sans fermer le défaut durable : lorsque les `256` slots pending Worker étaient pleins, le Worker suspendait `next_update()` ; la queue Transport bornée de `256` updates finissait ensuite par se remplir et son ancien `try_send` transformait cette pression locale en faute terminale `grpc_backpressure_overflow`.
La correction conserve toutes les bornes et n'augmente aucune queue. L'acteur Yellowstone Transport remplace uniquement l'envoi non bloquant de l'update décodée par un `send().await` sélectionné avec le signal de shutdown prioritaire. Une queue pleine suspend ainsi le polling du stream Tonic et propage la backpressure au flux gRPC/HTTP/2 ; lorsque le consumer libère une place, la livraison reprend. Aucun update n'est dropé et aucune allocation non bornée n'est introduite. `grpc_backpressure_overflow` reste un code public valide pour les queues de mutations de requête synchrones/fail-fast et les bornes de message ; seule la saturation de la queue d'updates reçues cesse d'être un terminal local.
Le gate live doit dépasser la durée de reproduction précédente : Yellowstone Mainnet seul puis Yellowstone + HTTP Block Polling doivent chacun rester actifs au moins 10 minutes, sans WARN `Yellowstone subscribe update queue overflowed`, sans `grpc_backpressure_overflow` et avec Stop ciblé terminant `Stopped`. Une vraie rupture distante reste traitée par le reconnect/replay borné existant.
Le gate de `pre.015` a ensuitecouvert une seconde anomalie appartenant au même contrat : après un Stop local explicite, PublicNode pouvait renvoyer un `Status::Unknown` pendant le half-close et remplacer à tort la terminaison coopérative par `source_failed`. `pre.015-fix.001` limite la correction à `finish_client_half_close()` : un status reçu après fermeture locale engagée produit `Closed`, tandis qu'un status reçu pendant une session active reste soumis au reconnect puis à `grpc_status` si la reprise échoue.
Budget cible : une tranche corrective Transport/acquisition, sans croissance d'API publique.
Le rejeu opérateur de `pre.015-fix.001` ferme le couloir : audits propres, Cargo/Clippy/tests sans échec, canaris Transport `396/396` et Worker `161/161`; Yellowstone Mainnet et HTTP Block Polling tournent ensemble environ 19 minutes sans `grpc_backpressure_overflow` ni état `Faulted`, puis terminent tous deux `Stopped/Healthy`.
Budget consommé : correction Transport/acquisition sans croissance d'API publique.
### `pre.016` — gate technique/live final
Exécuter le workspace complet, Clippy strict, suites ciblées, graphes/duplicates, smokes réellement accessibles et build frontend/Tauri final. Aucun nouveau scope métier.
**État : ouvert.** Aucun nouveau comportement métier ou runtime n'est introduit. La preuve live de `pre.015-fix.001` est la baseline autoritaire puisque `pre.016` ne modifie ni source, ni test fonctionnel, ni Config, ni manifest de crate, ni frontend.
Budget cible : une tranche technique.
Le gate final rejoue : format, audits, `cargo check`, Clippy strict, suites ciblées Store/Transport/Worker/Desk, workspace all-targets/all-features, graphes Cargo des trois composants critiques, duplicates et `cargo tauri build` de la Desk. Les smokes live déjà fournis restent valides tant qu'aucun fichier runtime n'est modifié dans cette tranche.
Tout défaut découvert ici ouvre `pre.016-fix.NNN`. Toute anomalie appartenant à un couloir antérieur ouvre une nouvelle prerelease dédiée conformément à `VER-LIFECYCLE-010`, puis les couloirs de clôture sont rejoués.
Budget cible : une tranche technique de clôture uniquement.
### `pre.017` — réconciliation documentaire finale