0.3.15-pre.013

This commit is contained in:
2026-09-17 09:34:11 +02:00
parent 1573273d27
commit 6ee4e3bdf4
9 changed files with 537 additions and 90 deletions

View File

@@ -1,5 +1,5 @@
<!-- file: docs/plans/036-V0_3_15_RAW_TRANSACTION_INGEST_DESK_PLAN.md -->
<!-- version: 20 -->
<!-- version: 21 -->
# Plan v0.3.15 — Raw Transaction Ingest Desk
@@ -342,7 +342,7 @@ La documentation Helius actuelle indique que `blockSubscribe` n'est pas support
| Store open / network / partage `Arc<Store>` | aucun gap | Store + app | `ksp-store-lib` suffit |
| Lifecycle / stop / snapshots Worker | aucun gap | Worker + app | handles publics existants |
| Backfill / historical repair | hors scope | Job Backfill | aucune orchestration automatique |
| Taille release | pas de split de release | plan | forecast étendu jusquà `pre.016` |
| Taille release | pas de split de release | plan | forecast étendu jusquà `pre.017` |
La release n'est pas rescindée. Le gap WS est petit, clairement propriétaire et testable. En revanche, le forecast doit être étendu pour ne pas fusionner Transport, Config, Worker et scaffold UI dans une même tranche.
@@ -668,7 +668,7 @@ Le build Tauri final reste un gate tardif et ne remplace pas les tests runtime.
## 20. Forecast recalibré — prereleases souples
Le forecast initial `pre.002 -> pre.013` est étendu jusqu'à `pre.016`. La cause n'est pas une inflation UI : c'est la découverte d'un contrat WS capability manquant qui doit être fermé proprement dans Transport, Config puis Worker avant consommation par la Desk.
Le forecast initial `pre.002 -> pre.013` est désormais étendu jusqu'à `pre.017`. La cause n'est pas une inflation UI : c'est la découverte d'un contrat WS capability manquant qui doit être fermé proprement dans Transport, Config puis Worker avant consommation par la Desk.
Le forecast reste volontairement souple. Chaque prerelease possède une sous-section directement éditable ; lorsqu'un correctif est nécessaire, il est ajouté sous la prerelease concernée avec un titre `#### pre.NNN-fix.MMM`. Les responsabilités de clôture `gate technique/live -> réconciliation documentaire -> préparation de publication` restent séparées.
@@ -847,25 +847,33 @@ Aucun module de production supplémentaire, aucune dépendance lower-layer et au
Budget cible : une tranche hardening.
### `pre.013` — completeness/security cross-layer
### `pre.013` — Yellowstone Block hydration backpressure
**État : implémenté, gate opérateur requis.** Le live de `pre.012-fix.004` a reproduit deux `grpc_backpressure_overflow` Mainnet environ 79 s puis 81 s après démarrage Yellowstone. Les WARN Transport précèdent les Stop opérateur de plusieurs secondes : la cause est donc le couplage historique `Block update -> getBlock HTTP -> admission de toutes les transactions -> lecture de l'update suivante`, et non la sémantique Stop. Conformément à `VER-LIFECYCLE-010`, ce défaut du couloir acquisition antérieur ouvre une nouvelle prerelease dédiée au lieu d'un `pre.012-fix.005`.
Le mode Yellowstone Block reçoit désormais une partition déterministe des budgets d'hydration déjà possédés par le Worker. Les slots gRPC sont placés dans un coordinateur privé borné ; plusieurs `getBlock` peuvent progresser concurremment jusqu'au quota `in-flight`, et chaque tâche porte aussi l'admission complète de son bloc avant settlement du slot. La boucle source continue de consommer `session.next_update()` tant qu'une capacité pending existe. Aucun changement de capacité Transport, aucune queue non bornée et aucun drop silencieux ne masquent une surcharge durable.
Budget cible : une tranche corrective acquisition/throughput, suivie d'un live Mainnet prolongé.
### `pre.014` — completeness/security cross-layer
Fermer les canaris Config/Transport/Worker/Common RAW/Store/Desk, dependency firewalls, API publique, redaction et absence de seconde pipeline ou d'orchestration Backfill.
Budget cible : une tranche de clôture fonctionnelle.
### `pre.014` — gate technique/live final
### `pre.015` — 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.
Budget cible : une tranche technique.
### `pre.015` — réconciliation documentaire finale
### `pre.016` — réconciliation documentaire finale
Réconcilier plan, validation, README/USAGE et documents durables réellement affectés. Ne pas modifier CHANGELOG, ROADMAP ni le prompt suivant.
Budget cible : une tranche documentaire.
### `pre.016` — préparation de publication
### `pre.017` — préparation de publication
Préparer le prompt suivant, CHANGELOG, ROADMAP et la mécanique minimale de version/delta. Aucun rattrapage fonctionnel ou documentaire durable.
@@ -908,7 +916,7 @@ aucun gap Store / HTTP / lifecycle Worker essentiel
capability WS fine = gap lower-layer réel à fermer avant UI
Helius standard WS != Helius transactionSubscribe
aucune route rendue disponible à partir d'un exemple Config ou du provider name
forecast recalibré jusqu'à pre.016
forecast recalibré jusqu'à pre.017
```
`pre.002` doit donc commencer par le contrat Transport de capabilities WS, et non par le scaffold Tauri.

View File

@@ -1,5 +1,5 @@
<!-- file: docs/validation/032-V0_3_15_RAW_TRANSACTION_INGEST_DESK.md -->
<!-- version: 26 -->
<!-- version: 27 -->
# Validation v0.3.15 — Raw Transaction Ingest Desk
@@ -461,19 +461,23 @@ Ce correctif ne modifie ni Config, ni Transport, ni Store, ni Worker, ni Common
Races, shutdown app, sécurité IPC, hardening hostile/stale inventory.
### `pre.013` — completeness
### `pre.013` — Yellowstone Block hydration backpressure
Découplage borné réception gRPC / `getBlock` / admission pour la route Yellowstone Block, conformément à `VER-LIFECYCLE-010`.
### `pre.014` — completeness
Cross-layer completeness + canaris système sans expansion de frontières.
### `pre.014` — gate technique/live
### `pre.015` — gate technique/live
Gate technique/live accessible + frontend/Tauri + build final de validation technique.
### `pre.015` — réconciliation documentaire
### `pre.016` — réconciliation documentaire
Plan/validation/README/USAGE uniquement selon les surfaces réellement affectées.
### `pre.016` — préparation publication
### `pre.017` — préparation publication
Prompt suivant + CHANGELOG + ROADMAP + mécanique minimale de publication.
@@ -793,7 +797,7 @@ pre_012_hostile_ipc_is_shape_strict_bounded_and_safely_projected
pre_012_race_shutdown_and_ipc_hardening_adds_no_production_module_or_lower_layer_growth
```
Non-claims : `pre.012` ne modifie ni Config, ni Transport, ni Store, ni `ksp-worker-raw-transaction-ingest-lib`, ni Common RAW. Il n'ajoute aucune orchestration Backfill, aucun scheduler, aucune route et aucune nouvelle donnée frontend. `pre.013` reste propriétaire de la fermeture completeness/security cross-layer.
Non-claims : `pre.012` ne modifie ni Config, ni Transport, ni Store, ni `ksp-worker-raw-transaction-ingest-lib`, ni Common RAW. Il n'ajoute aucune orchestration Backfill, aucun scheduler, aucune route et aucune nouvelle donnée frontend. `pre.014` reste propriétaire de la fermeture completeness/security cross-layer.
### `pre.012-fix.001` — future Tauri Start `Send`
Le gate opérateur de `pre.012` a arrêté la tranche sur un défaut de compilation déterministe dans `AppState::start_route` : le `std::sync::MutexGuard<u32>` de `inventory_generation` restait considéré vivant au franchissement du `await` final, malgré `std::mem::drop(generation)`. Le futur exposé par la commande Tauri `start_route` ne satisfaisait donc plus la borne `Send` imposée par `tauri::ipc::ResultFutureTag::future`. Les audits Rust/Markdown étaient propres et les suites Worker indépendantes restaient vertes, mais `cargo check`, Clippy, les tests Desk/workspace et `cargo tauri dev` ne pouvaient pas compiler le Desk.
@@ -850,4 +854,34 @@ Une seconde ligne de diagnostic lit au mieux l'observation durable la plus ancie
Ce fix n'altère ni l'identité canonique, ni la comparaison d'égalité, ni la politique de conflit, ni le Store schema, ni la stratégie d'acquisition. `serde_json` est utilisé uniquement dans le backend PostgreSQL pour classifier les composants du payload RAW v1 déjà canonique au moment d'un conflit.
Le prochain live Yellowstone + HTTP Block Polling doit permettre de distinguer immédiatement un désaccord de `slot`/`block_time`, de transaction wire, de transaction index, de version ou d'un sous-ensemble précis de `meta` (par exemple `logMessages` ou `rewards`).
### `pre.013` — découplage borné Yellowstone Block / HTTP `getBlock`
Le gate de `pre.012-fix.004` est propre sur les nouveaux canaris Store et Worker. Le live Mainnet ne reproduit aucun `content_conflict`, mais reproduit deux fois un terminal Yellowstone `source_failed / onchain_transport.grpc_backpressure_overflow`. Les WARN Transport apparaissent à `22:06:52.734796` puis `22:08:39.746262`, alors que les Stop Yellowstone n'arrivent qu'à `22:07:10.781900` puis `22:08:51.337483`. Le Stop ne crée donc pas l'overflow ; il révèle ensuite le terminal déjà produit par Transport.
La cause est le chemin Yellowstone Block historique entièrement séquentiel :
```text
Block update gRPC
-> await HTTP getBlock
-> await admission de toutes les transactions du bloc
-> seulement ensuite next_update gRPC
```
Cette source était en outre exclue de `uses_hydration()`, donc ne recevait aucun quota `pending/in-flight` du supervisor multi-source. Une queue Transport plus grande ne ferait que retarder le même défaut.
`pre.013` corrige le débit sans modifier Transport : Yellowstone Block est désormais une source hydratante pour le partitionnement des budgets existants. Un coordinateur privé de slots borne les pending ; jusqu'au quota `in-flight`, chaque tâche possédée exécute `getBlock` puis l'admission complète du bloc. La boucle source reste disponible pour `session.next_update()` tant qu'une place pending existe. Le slot n'est `settled` qu'après admission complète. Stop/abort joint toutes les tâches et purge les pending sans faux settlement.
La politique reste fail-closed : aucune hausse de `YellowstoneGrpcSessionSettings.update_channel_capacity`, aucune queue non bornée, aucun silent drop et aucun masquage de `grpc_backpressure_overflow`. Si le débit aval reste durablement inférieur à la chaîne malgré la concurrence bornée, une saturation terminale reste correcte et observable.
Canaris ajoutés :
```text
v0_3_15_pre_013_yellowstone_block_hydration_coordinator_is_bounded_before_http_work
v0_3_15_pre_013_yellowstone_block_hydration_is_bounded_concurrent_and_stop_preemptible
v0_3_15_pre_013_yellowstone_block_backpressure_fix_adds_no_public_surface
```
Aucun type du coordinateur n'est exporté publiquement.
Validation live requise : Yellowstone Mainnet seul pendant une durée supérieure aux ~80 s de reproduction, puis Yellowstone + HTTP Block Polling en parallèle. Le run doit rester `Healthy`, sans `grpc_backpressure_overflow`, et les Stop ciblés doivent finir `Stopped`. Le diagnostic `pre.012-fix.004` reste actif si un `content_conflict` réapparaît.