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/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.